作為一個編程社群,freeCodeCamp幫助許多對他們的程式碼有疑問的人。簡單地提供學習者答案然後繼續往下走,雖然很有誘惑力,但這其實對學習過程是有害的。這就是原因:

當你給某人答案時,你剝奪了他們那個“啊哈”瞬間。你移除了讓他們通過自己的思考來達到結論的機會,而是讓他們以最小的努力或思考來進步。

那麼你如何能最好地幫助某人解決他們的程式碼問題?

什麼是蘇格拉底法?

希臘哲學家柏拉圖是另一位哲學家蘇格拉底的學生。在柏拉圖的著作中,他經常寫到蘇格拉底與他的同事和學生進行的辯論。

蘇格拉底會通過提出常見的信念並仔細審查它們是否與其他信念兼容,來引導人們達到真理。

但這如何轉化到我們數字時代的現代互動中?

讓我們考慮一個來自我們社群的真實例子:

你可能會想直接給他們答案,比如這個程式碼範例:

const sum = nums.reduce((acc, el) => acc + el, 0);

但這樣做,你已經替學習者完成了邏輯推理。

相反,你應該專注於提出有針對性的問題來引導他們找到答案。例如,你可以先問:

❓ 你會如何在紙上和筆下找到一串數字的總和,而不使用代碼?

雖然讓學習者回答一個需要他們暫時離開代碼的問題似乎不合常理,但實際上你是在指引他們了解問題背後的基本邏輯。

假設學習者的回答類似於:

我會逐個遍歷每個數字,並將其加到之前數字的總和中。

當學習者開始回答你的問題時,對話應該以這種問答方式進行。隨著學習者接近解決方案,你的問題應該變得越來越具體和尖銳。

例如,一系列問題可能如下所示:

講師:「很好,現在什麼是數字的陣列?」
學生:「一個列表?」
講師:「很好!你會如何遍歷那個列表?」
學生:「用一個 for 循環。」
講師:「你的循環需要在每次迭代中做什麼?」
學生:「將當前的數字加到總和中。」
講師:「你在哪裡可以找到總和?」
學生:「我可以把它放在循環外的一個變量中。」
講師:「很好,現在你準備好嘗試編寫代碼了。」
— 本文例子原創於此

此時,學習者可能會將點連接起來,達到最終的解決方案。

現代文化中的蘇格拉底

學習蘇格拉底方法很難。事實上,許多人直到大學才接觸到它。但在現代流行文化中有一些例子可以幫助你理解蘇格拉底方法的運作方式。

電視劇《豪斯醫生》中充滿了這樣的例子。以這段來自“Three Stories”一集中對話為例:

豪斯:“腎結石會引起什麼?”
學生:“尿中帶血。”
豪斯:“你的尿液是什麼顏色?”
學生:“黃色。”
豪斯:“你的血是什麼顏色?”
學生:“紅色。”
豪斯:“我用了什麼顏色?”
學生:“紅色、黃色和棕色。”
豪斯:“還有棕色。是什麼引起棕色?”
學生:“廢物。”
— (Frapier, 2008)¹

你會注意到這段對話是如何進行的。豪斯的目標不是要學習者答案,而是問出推理問題以引導學習者自己得出答案。

考慮一下熱門電影《黑客帝國》:

墨菲斯:“尼奧,你是否曾經做過一個夢,堅信它是真實的?”
尼奧:“這不可能……”
墨菲斯:“是什麼?是真實的嗎?”
墨菲斯:“如果你無法從那個夢中醒來呢,尼奧?你如何知道夢境和現實世界之間的差別?”
— (Wachowski & Wachowski, 1999)²

在這一幕中,墨菲斯運用了蘇格拉底的方法,引導尼奧質疑他對現實的感知。這是一個相當戲劇化的例子,但前提仍然相同:與其告訴學習者他們應該怎麼想,不如引導他們通過自己的意願得出結論。

最後,讓我們看一個來自《律政俏佳人》的例子:

Elle:「你父親是在你洗澡的時候被槍殺的嗎?」

Chutney:「是的。我在洗頭髮。」
Elle:「溫德姆小姐,你能告訴我們你那天早些時候在做什麼嗎?」
Chutney:「我起床,去星巴克,然後去健身房,做了個燙髮,然後回家。」
Elle:「然後你就去洗澡了。」
Chutney:「是的。」

Elle:「…溫德姆小姐,你以前燙過頭髮嗎?」
Chutney:「是的。」
Elle:「你覺得燙過多少次?」
Chutney:「從我十二歲起每年兩次。你自己算算吧。」

Elle:「Chutney,為什麼Tracy Marcinko的捲髮在被水濺到時就毀了?」
Chutney:「因為她的頭髮弄濕了。」
Elle:「沒錯。因為燙髮護理的第一條基本規則就是在燙髮後至少二十四小時內禁止弄濕頭髮,否則會失去硫代乙醇酸銨的效果。而一個一生中燙過——三十次?——的人應該非常清楚這條規則吧?而如果你其實沒有在洗頭髮,如我懷疑的那樣,因為你的捲髮還完好無損,那麼你豈不是應該聽到槍聲嗎?」
—(Luketic, 2001)³

蘇格拉底法經常在法律中被看到,這是一個很好的例子。通過這段對話,Elle並不是試圖引導Chutney得出結論,而是觀眾(在這種情況下,是陪審團)。對於像我們這樣的社群來說,這是一個重要的區別:與一位成員進行蘇格拉底討論實際上可以讓當前和未來的成員觀察或重溫你的對話而受益。

蘇格拉底法的目標

了解蘇格拉底方法的目標是非常重要的,不是為了快速交換信息。相反,其目的是先讓學習者意識到他們知道的比他們相信的少,然後通過提出引發特定思考過程的問題來引導他們找到答案。⁴

當將這一點應用於學習程式設計時,重要的是要記住“挑戰你的假設”這句話。我們常常假設自己知道所寫代碼的作用,所以當它不起作用時,我們的第一步就是檢查這些假設。

在指導學習者進行除錯的過程中,我們希望提出能產生相同效果的問題。你的問題庫中應該有一個常見的問題是“這行代碼的作用是什麼?”。當學習者給出不準確的信息時,用問題來深入代碼的較小組件——即將問題分解成部分。

考慮這個例子:

學習者:“但也許那不會起作用,因為我需要找到書而不是書中的編號”
指導者:“正確。不過好消息是我們有一個表面上可以做到這一點的函數。壞消息是那個函數並沒有做到這一點。那個函數實際上做了什麼?”
學習者:“返回書籍編號”
— 來自我們的Discord社群⁵

通過提出“那個函數到底做了什麼?”這個問題,講師為學習者提供了指導,使其能夠在不提供任何具體信息的情況下得出正確的結論。學習者已經知道該函數的執行結果不如預期,講師提出這個問題是為了挑戰學習者對該函數是否起作用的假設。

這裡是另一個例子:

講師:“這是來自挑戰的例子。你有跟隨他們給的例子嗎?”
學習者:“有,但我不明白 for-in 循環,我不明白“(const food in refrigerator)”,需要用 const 或 let 聲明字符串屬性名稱讓人困惑(現在不困惑了)”
講師:“好的,那麼我們從這裡開始,而不是挑戰的完整解決方案”
講師:“當你運行那段代碼時,它會做什麼?”

學習者:“對象的每個鍵都被賦值給在 for-in 循環中創建的變量 food,然後它遍歷對象並記錄鍵和分配給鍵的值?”
— 來源於我們的 Discord 社區⁶

我們再次看到講師如何專注於提出指向性的問題,指導用戶通過自己的推理找到解決方案

❗ 這是蘇格拉底教學法的終極目標:通過學習者自己的推理,引導其達到合乎邏輯的結論。

蘇格拉底教學法的長期益處

蘇格拉底方法不僅僅有助於解決當下的問題。這種方法中所應用的演繹推理過程也能在長期內對學習者有所裨益。

這種通過向學習者提問來挑戰他們的假設和知識,並引導他們找到解決方案的過程,也是可以內化的。這是一個強大的工具,可以用來調試問題、隔離假設,甚至學習如何清晰表達問題。

也就是說,通過這種問答式的對話,學習者也能獲得自行提問的能力。他們可以將這種逐步縮小範圍提問的過程作為邏輯路徑,並在遇到未來的代碼問題(甚至是生活中的其他方面)時,心中進行演練。

結論

直接提供解決方案給學習者會抑制他們的智力成長,並剝奪他們通過自己得出邏輯結論所獲得的成就感。通過運用像蘇格拉底方法這樣的技術,我們可以促進一個更強大且更有效的教育環境,讓學習者得以成長和茁壯。

💡 如果您是在回應一個論壇帖子、Reddit評論、Discord消息或其他交流中,向一位學習者提供了一個可行的解決方案時收到這篇文章,請考慮此方法的優點。

這種方法可能看起來繁瑣且冗長,有時確實如此。將解決問題的代碼直接交給某人是更快(且可以說更簡單)的方式。

但這種方法往往最終會傷害學習者。而且,如果你能原諒這位作者的個人經歷,我曾看到有人在成為蘇格拉底式方法的主題時感到沮喪,或者對來回的對話失去耐心。但我從未見過他們對最終結果感到不滿或失望——那個“啊哈”時刻,他們通過自己的推理得出問題的解決方案。

來源:

  1. ¹ Frapier, M. (2008). Being Nice is Overrated: House and Socrates on the Necessity of Conflict. In House and Philosophy (pp. 100–101). John Wiley & Sons, Inc.

  2. ² Wachowski, L., & Wachowski, L. (Directors). (1999, March 24). The Matrix (Z. Staenberg, Ed.). Warner Bros.

  3. ³ Luketic, R. (Director). (2001, July 13). Legally Blonde (A. Brandt-Burgoyne, Ed.). MGM Distribution Co.

  4. ⁴ Frapier, M. (2008). Being Nice is Overrated: House and Socrates on the Necessity of Conflict. In House and Philosophy (p. 103). John Wiley & Sons, Inc.

  5. ⁵ lightskingeneral 和 plamoni(2024年1月4日)。(Discord 對話)。Discord。檢索於2025年1月6日,自https://discord.com/channels/692816967895220344/718214639669870683/1192488621043888198

  6. ⁶ lightskingeneral 和 jeremylt(2023年11月13日)。(Discord 對話)。Discord。檢索於2025年1月6日,自https://discord.com/channels/692816967895220344/718214639669870683/1173733715109761065

特別感謝 ArielLeslie 和 JeremyLT 對本文的幫助。