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