譯者 | 劉濤
審校 | 重樓
作為一個編程社區,freeCodeCamp為眾多對自身所寫代碼存在疑問的編程愛好者提供了強而有力的幫助。然而,盡管直接給出答案然后繼續推進這種方式看起來頗具吸引力,但實際上,這種做法對編程愛好者的學習進程是有害的。這其中的主要原因在于:
當直接給出答案時,編程愛好者會失去那種“恍然大悟”的瞬間。這剝奪了他們通過獨立思考得出結論的機會,使得他們以最小的努力甚至無需過多思考就能取得進步。
那么,如何用最合適的方法幫助編程愛好者解決代碼問題呢?
什么是蘇格拉底式問答法
古希臘著名哲學家柏拉圖的老師是蘇格拉底,在柏拉圖的諸多作品中,他時常描繪蘇格拉底與同事以及學生之間的辯論場景。
蘇格拉底會通過這些辯論,指出人們普遍秉持的信念,并對其予以仔細審查,質疑這些信念與其他信念是否和諧一致,從而引導人們深入探索真理的本質。
然而在數字時代,這種方法又該如何應用于我們當下的交流互動當中呢?
讓我們從一個社區的真實案例中來思考這個問題:
你可能很想給上述問題一個直接的答案,例如以下代碼所示:
const sum = nums.reduce((acc, el) => acc + el, 0);
但是,如此行事實際上是你替學習者完成了邏輯推理的過程。
相反,你應當專注于提出具有針對性的問題,以此引導他們尋得答案。例如,你能夠從以下問題著手進行提問:
如果不使用代碼,你如何用紙筆計算出一系列數字的總和?
要求學習者脫離代碼來回答這個問題,看似有悖于直覺,但實際上你是在引導他們思考問題背后的邏輯。
讓我們假設學習者給出了如下的回答:
我會逐個瀏覽每個數字,并將其累加到之前數字的總和上。
隨著學習者開始回應你的問題,對話應當以這種一問一答的形式展開,并且隨著學習者逐漸趨近解決方案,你的問題也應愈發具體且具有針對性。
舉例來說,一系列問題如下展開:
導師:“很好,那么什么是數字數組?”
學生:“一個列表?”
導師:“不錯!你將如何遍歷這個列表?”
學生:“用一個for循環?!?/span>
導師:“那么在每次迭代中,你的循環需要做什么?”
學生:“將當前數字加到總和中?!?/span>
導師:“你在哪里可以找到總和?”
學生:“我可以把它放在一個循環外部的變量中。”
導師:“很好,現在你可以嘗試編寫代碼了?!?/span>
——此示例為本文原創
此時,學習者很可能會將各個要點聯系起來,并得出最終的解決方案。
蘇格拉底式問答法在現代文化中的應用
學習蘇格拉底式問答法(Socratic method)并非易事。實際上,許多人往往要到上大學時才會接觸到它。不過,在現代流行文化當中,存在著不少能夠幫助你理解蘇格拉底式問答法如何運作的實例。
在電視劇《豪斯醫生》(House, M.D.)里就充斥著此類例子。以名為“三個故事”(Three Stories)的一集為例,請看下面的對話:
豪斯:“腎結石會導致什么?”
學生:“尿中帶血。”
豪斯:“你的尿是什么顏色?”
學生:“黃色?!?
豪斯:“你的血是什么顏色?”
學生:“紅色?!?
豪斯:“我用了哪些顏色?”
學生:“紅色、黃色和棕色?!?
豪斯:“還有棕色。棕色是由什么導致的?”
學生:“廢物?!?——(Frapier,2008)1
你會留意到這段對話的展開方式。豪斯的目的并非直接給出答案,而是通過提出演繹性的問題,引導學習者自行得出結論。
再來瞧瞧熱門電影《黑客帝國》(The Matrix):
墨菲斯:“尼奧,你有沒有做過一個夢,如此真實,讓你深信不疑?”
尼奧:“這不可能是……”
墨菲斯:“不可能是什么?不可能是真的嗎?”
墨菲斯:“如果你無法從那個夢中醒來,尼奧,你怎么知道夢境和現實世界之間的區別呢?” ——(沃卓斯基姐妹,1999 年)2
在這個場景里,墨菲斯運用蘇格拉底式問答法引導尼奧讓他對現實的感知產生質疑。這是一個頗為戲劇化的例子,但其前提是相同的:并非告知學習者他們應當如何思考,而是引導他們憑借自身的意愿得出結論。
最后,我們來看一個出自《律政俏佳人》(Legally Blonde)的例子:
Elle:“你父親被槍殺的時候,你正在洗澡?”
……
Chutney:“是的。我正在洗頭?!?/span>
Elle:“Windham小姐,你能跟我們講講你當天早些時候在做什么嗎?”
Chutney:“我起床后去了星巴克,然后去了健身房,燙了頭發,就回家了?!?/span>
Elle:“然后你洗了澡。”
Chutney:“是的?!?/span>
……
Elle:“……Windham 小姐,你以前燙過頭發嗎?”
Chutney:“燙過。”
Elle:“那你能說說大概燙了多少次嗎?”
Chutney:“從十二歲開始,每年兩次。你自己算算吧?!?/span>
……
Elle:“Chutney,為什么 Tracy Marcinko 的卷發被水沖過后就毀了?”
Chutney:“因為卷發濕了?!?/span>
Elle:“沒錯。因為燙發保養的首要規則不就是,燙完頭發后至少二十四小時內不能弄濕頭發,否則可能會使硫代乙酸銨失效嗎?而一個一生中燙過——三十次發?——的人,不應該很清楚這條規則嗎?而且,如果你事實上并沒有在洗頭,就像我所懷疑的那樣,因為你的卷發還完好無損,那你難道沒有聽到槍聲嗎?”
——(Luketic,2001)3
蘇格拉底式問答法在法律領域頗為常見,而這段對話便是一個極為出色的范例。在此段對話中,Elle 并非試圖引導 Chutney 得出結論,而是在引導觀眾(在這種情形下是陪審團)得出結論。這對于像我們這樣的社區而言是一個重要的區別:與一位成員展開蘇格拉底式的討論,實際上能夠讓當前以及未來可能觀察到或回顧這段對話的成員從中受益。
蘇格拉底式問答法的目標
認識到蘇格拉底式教學法(Socratic method)的目標并非是迅速地交換信息,這一點極為關鍵。恰恰相反,其首要目標在于讓學習者認識到自身所知曉的內容比他們自認為的要少,而后通過引發特定思考過程的問題來引導他們探尋到答案。
當把這一方法運用到學習編程當中時,銘記“挑戰你的假設”這一說法是十分重要的。我們常常覺得自己清楚所編寫的代碼在做什么,所以當代碼無法正常運行時,我們的第一步應當是檢驗這些假設。
在引導學習者進行調試的過程里,我們期望提出的問題也能夠發揮同樣的作用。你的常用問題當中應當涵蓋“這行代碼的作用是什么?”。當學習者給出的信息不準確時,要用能夠深入到代碼更小組成部分的問題來予以回應——也就是說,要將問題拆解成小塊。
以這個例子為例:
學習者:“但也許那樣不行,因為我需要找到書,而不是書中的 ID。”
導師:“正確。好消息是,我們有一個函數表面上能夠做到這一點。壞消息是,這個函數實際上做不到。那么,這個函數真正是做什么的呢?”
學習者:“返回 bookId”
——摘自Discord 社區
通過提問“這個函數實際上是做什么的?”,導師為學習者指明了得出正確結論的方向,而無需提供任何具體的信息。學習者已經知曉該函數未按預期執行,而導師提出的問題則是為了挑戰學習者關于該函數確實按預期執行的假設。
再舉一個例子:
導師:“這是來自Chalenge(原文拼寫錯誤)一個例子。你理解他們給出的這個例子了嗎?”
學習者:“是的,但是我沒懂 for-in循環,我不明白‘(const food in refrigerator)’這句,要用const或let來聲明字符串屬性名讓我感到困惑(現在我已經懂了)”。
導師:“好的,那我們就從這里開始講起,而不是直接講Challenge的全部解決方案?!?
導師:“運行這段代碼時會發生什么?”
……
學習者:“對象的每個鍵都被設置為在for-in循環中創建的變量 food,然后它遍歷對象,并輸出鍵和分配給鍵的值?”
——來源于Discord社區
同樣,我們能夠看到導師是如何通過提出具有針對性的問題,引導學習者憑借自身的推理找到解決方案的。
這便是蘇格拉底教學法的最終目標:借助學習者自身的推理,引導他們得出合乎邏輯的結論。
蘇格拉底式問答法的長期益處
蘇格拉底式問答法的意義并不僅僅局限于當下問題的即刻解決。在這種方法中所運用的演繹推理過程,同樣能夠為學習者帶來長遠的好處。
通過向學習者提問來挑戰他們原來的假設和知識,并引導他們找尋解決方案的這一過程,同樣也能夠被學習者內化。這對于解決調試問題、隔離假設,甚至是學習如何清晰地闡述問題而言,都是一個強有力的工具。
也就是說,通過引導學習者進行這種一問一答式的對話,學習者也能夠學會自行向自己提出這些問題。他們能夠將這種不斷提出愈發具體問題的過程視作一條邏輯路徑,并在以后遭遇代碼問題(甚至生活中的其他方面問題)時,在腦海中運行這一路徑!
結論
直接為學習者提供解決方案,會抑制他們的智力發展,并且剝奪他們通過自身得出邏輯結論所獲得的有益體驗。通過使用蘇格拉底式問答法等技術手段,我們能夠營造出一個更強大、更高效的教育環境,讓學習者得以持續成長。
這種方法或許看起來既繁瑣又冗長,事實也的確如此。直接給他人提供解決問題的代碼要迅速得多(并且可以說更為容易)。
但那種方法往往最終會對學習者造成損害。如果作者要分享一個親身經歷作為例證,我曾目睹人們在成為蘇格拉底式問答法的對象時感到沮喪,或者對這種一來一回的對話失去耐心。但我從未見過他們對自己通過推理得出問題解決方案的那一刻感到不滿或失望——在那一刻,他們恍然大悟。
原文標題:How to Help Someone with Their Code Using the Socratic Method,作者:Naomi Carrigan