
看完了 10 集 Python 基礎教程把視頻里的示例代碼一行行跟著敲完甚至還在筆記里抄了一遍然后關掉播放器面對一個空白文件突然不知道第一行該寫什么。這是我在技術社區和自學群里見過最多的求助帖也是“講授式教學”在編程學習中最典型的失敗現場。薩爾·汗創辦可汗學院讓全球數億人免費獲得了高質量的教學視頻這件事的教育價值不需要質疑。但如果把“把課講清楚”當成教學的全部尤其是在編程學習這個領域一定會遇到一個扎心的瓶頸學習者看得懂卻做不到。真正的原因不是視頻不夠清晰不是老師不夠幽默而是講授式教學天然缺少一個結構性的東西——反饋回路feedback loop。學習編程不是“聽懂一個概念”而是“在反復試錯中建立行為習慣”。本文就從“為什么薩爾·汗式教學行不通”這個問題切入拆解“講授式教學”與“做中學”在原理層面的差別并給出一套更符合編程學習規律的自學或團隊培訓路徑。如果你正在學編程卻總覺得“眼睛會了、手不會”或者你負責帶新人、做技術培訓但發現傳統“講師講、學生聽”的模式效率很低這篇文章值得你讀完并收藏。1. 為什么一個教育理念會在編程學習中失效可汗學院最初的成功建立在數學教學上。薩爾·汗早期給表妹錄數學輔導視頻每段視頻控制在十分鐘左右把一道題的解法一步步講清楚。學生可以暫停、回放、按自己的節奏看。這個模式在教育資源不均衡的場景下價值巨大它用極低的成本把“名師講解”復制到了全世界。但如果只看“講解”這一環很容易忽略一個事實可汗學院真正的教學模式是“視頻講授 在線練習系統”。學生在看完視頻后會被引導去做一組練習題系統當場判斷對錯并給出解析。這套設計比單純看視頻要先進得多因為它增加了一個基礎的反饋環節。問題在于這類練習系統里的題目大多數是“點選型”“填空型”的客觀題。學習者面對的是一道已經被定義好邊界的問題輸入答案后立刻得到對錯判斷。而編程學習中的真實任務完全不是這樣。真實編程任務里沒有人告訴你“這里該用 for 循環還是 while 循環”沒有人在你做錯時立刻彈出解析甚至沒有人告訴你“這個程序對不對”。你面對的是編譯器的報錯、運行時異常、奇怪的空指針、莫名不匹配的數據類型。你需要自己發現問題、定位問題、假設原因、修改代碼、再次運行驗證。這個過程是一個完整的“假設-檢驗-修正”循環。講授式教學擅長傳遞“已知的、結構化的知識”但它不擅長訓練“面對未知問題的應對能力”。把可汗學院的方法直接搬到編程學習里就會出現文章開頭那個場景視頻看完了練習也做了但真正上手寫項目時仍然手足無措。從更底層的角度看薩爾·汗的教育理念延續了“知識傳遞”這一傳統教學隱喻老師擁有知識學生缺少知識老師的任務是把知識從自己的頭腦搬運到學生的頭腦中。只要講解足夠清晰、練習安排足夠合理學生就能學會。這個隱喻對公式推導、歷史事件、語法規則這些“陳述性知識”有一定效果但對編程這種“程序性知識”占比極高的技能來說有一個致命缺陷技能不是被傳遞過去的而是在操作、反饋、修正的循環中長出來的。這也是本文的核心判斷薩爾·汗式教學之所以在編程學習中行不通不是因為他講得不好而是因為它把教學系統的重心放在了“傳播知識”上而不是“構建反饋”上。而做中學恰恰是圍繞反饋回路來設計學習體驗的。2. 講授式教學的核心假設與適用范圍2.1 講授式教學的基本邏輯講授式教學簡單說就是由老師或視頻課程把概念、原理、案例系統性地講解給學生聽學生通過聽講、記錄、理解再通過課后練習鞏固。它的基本邏輯是知識可以被分解成清晰的單元。優秀教師能把每個單元講得通俗易懂。學生只要理解了每個單元就能組合出完整的知識體系。作業與考試用來驗證理解程度。這個邏輯在教育史上根深蒂固。它適合信息密度高、結構嚴謹、答案明確的科目。比如數學公式的推導、物理定律的證明、編程語言的基本語法這些內容確實需要有人先做系統的講述否則學生自己摸索效率極低。2.2 可汗學院到底解決了什么問題可汗學院解決的問題是“優質講解的規模化分發”。在沒有互聯網教育的年代同一個教室里五十個學生聽同一個老師講課學得快的人被拖慢學得慢的人跟不上。視頻課程出現后學生可以暫停、回放、倍速理論上可以按自己的節奏學習。同時練習系統提供了即時對錯反饋并讓學生可以反復練習直到掌握。這套設計顯著改善了“教師資源不足”和“學生水平參差”的問題。在數學、物理、經濟學等基礎學科中它的有效性已經被大規模用戶驗證。這是薩爾·汗值得尊敬的地方。2.3 它做得好的領域與做不好的領域一種教學方式的有效性高度依賴學科的性質。我們可以把學習內容粗略分成兩類內容類型特征典型例子講授式教學的效果陳述性知識事實、概念、公式、規則變量是什么、HTTP 狀態碼含義效果好適合系統講解程序性知識技能、流程、操作、判斷寫函數、調 bug、設計接口效果差必須動手訓練策略性知識在復雜情境中做決策架構選型、性能優化、需求拆解講授只能提供啟發必須靠實踐積累講授式教學在陳述性知識的傳授上效率極高。但在程序性知識和策略性知識上它只能完成“鋪墊”的功能。你不可能通過看游泳教學視頻學會游泳不可能通過看拳擊比賽錄像學會出拳。編程也是一樣你能通過視頻理解“什么是函數”但“什么時候應該拆函數、怎么拆、拆到什么粒度”這種判斷力只能在持續寫代碼和改代碼的過程中形成。3. 講授式教學的三個結構性局限3.1 局限一學生只接收信息沒有構建知識教育學里有一個廣泛被接受的理念學習不是“接收信息”而是“構建意義”。同一段關于 Python 字典的講解有經驗的人聽到的是“鍵值對在哈希表中的組織方式”新手聽到的只是“字典就是大括號加冒號”。差異為什么這么大因為理解不是把老師的話原樣復制到大腦而是把新信息和自己已有的經驗、模型、知識結構連接起來。如果沒有相關的經驗基礎信息就只是懸浮在記憶表層的“死知識”。講授式教學默認“講清楚就等于學明白”但實際情況是講解只能確保學生“聽見了”不能確保學生“構建了”。只有當學生嘗試用自己的語言解釋這個概念或者用這個概念去解決一個具體問題時知識結構才算真正建立。這就是“生成效應”學習者在主動生成答案、解釋或解決方案時記憶和理解效果遠好于被動接收。3.2 局限二反饋回路缺失或嚴重延遲這是講授式教學在編程學習中最致命的短板。人能學會復雜技能依賴一個核心機制嘗試行動 → 獲得結果 → 對比預期 → 調整行動。這個循環循環得越快學習效率越高。孩子學走路跌倒了爬起來再試每一步都有即時反饋學騎自行車車身傾斜不穩定的感覺就是即時反饋學編程寫完代碼運行后的報錯和輸出就是即時反饋。但傳統的講授式課堂里一節課四十五分鐘學生沒有機會嘗試課后作業要等到第二天甚至下周才有批改結果。反饋周期太長學習者在“嘗試-反饋”的循環中無法形成有效的自我校正。更糟的是當反饋最終來臨時學習者往往已經忘記了自己當時的思考過程。講授式教學弱化了反饋環節相當于在訓練運動員時只讓他看錄像不讓他上場。看錄像當然有用但永遠替代不了上場后的真實觸球感。3.3 局限三教學節奏由講授者決定而不是由學生決定視頻課程提供了一種“偽個性化”學生可以暫停、回放、倍速。但本質上課程的推進節奏仍然由講師決定。講師覺得“列表推導式很簡單”可能只花兩分鐘而你可能需要在這里停留一小時。講師覺得“遞歸很難”用了二十分鐘講解而你可能在五分鐘內已經理解了核心剩下的十五分鐘只是陪跑。學習效率最高的狀態發生在學生剛好處于自己的能力邊界附近也就是所謂“最近發展區”。在這個區域里任務有挑戰性但又夠得著學生最投入、進步最快。講授式教學假設同一個班級里的學生處于近似水平這在現實里幾乎不成立。做中學則不一樣當學習者在真實任務中前進時他會自然地在自己的卡點停留、反復調試、嘗試不同方案直到突破。學習節奏真正由學習者自身的認知狀態決定而不是由課程大綱決定。4. 編程學習為什么依賴“反饋回路”4.1 編程首先是一種技能而不是一門知識如果把編程學習比作學開車那語法就是油門和剎車的位置API 是交通標志但不真正上路這些信息毫無意義。編程的核心能力是在面對一個模糊需求時能夠把問題拆解成可執行的步驟用代碼表達并在出錯時快速定位和修復。這些能力全部依賴大量實際操作來養成。4.2 反饋回路是技能習得的發動機我們來拆解一次完整的錯誤處理過程你寫了一段代碼想實現“讀取文件并統計單詞數”。運行后程序拋出異常FileNotFoundError。你查看報錯信息發現路徑不對。你修改路徑再次運行。這次程序跑通了但輸出結果比預期的少。你意識到自己只統計了小寫單詞問題出在大小寫沒有統一。你加上.lower()再次運行。輸出正確。這一步一步的過程就是你真正學到東西的瞬間。編譯器、運行時和調試器共同構成了一套極其強大的即時反饋系統。每一次報錯都是在告訴你“你的心智模型和現實世界之間存在偏差。”而修正偏差的過程就是學習發生的過程。4.3 如何快速得到反饋回路對于編程學習者來說建立反饋回路的最短路徑是不斷制造“可以運行的最小程序”。比如你現在想學習 Python 的列表推導式不要只看教程而是立刻打開一個 Python 文件寫一小段代碼# 文件路徑squares.py squares [x * x for x in range(10)] print(squares)運行它python squares.py觀察輸出。然后修改條件、修改表達式看看結果會怎樣變化。再故意制造一個錯誤看看會得到什么報錯信息。這就是一個完整的反饋循環五分鐘之內就能完成。4.4 最小反饋示例用錯誤信息驅動理解# 文件路徑broken_squares.py squares [x * x for x in range(10) print(squares)運行后會看到SyntaxError報錯。這是Python在告訴你方括號少了一個。你的任務不是“背住正確的寫法”而是“理解這個報錯為什么出現”。當你親手寫出這個錯誤并成功修復后你對面這條代碼的記憶深度會遠超只看十遍正確代碼。5. 同一個知識點兩種教法對比以“列表推導式”為例前面講了理論這一章用一個具體的編程知識點來做對比。這個知識點是 Python 的列表推導式。5.1 講授式路徑講授式教學會這樣設計講解列表推導式的語法結構[表達式 for 變量 in 可迭代對象 if 條件]。給出幾個例子逐步演示推導式如何展開成普通 for 循環。強調它比普通循環更簡潔、更 Pythonic。布置幾道練習題比如“生成 0 到 9 的平方數列表”。你跟著看下來每一步都聽得懂示例代碼也都能復現。但這不保證你下次遇到“要把列表里的偶數篩選出來并乘以 3”時能第一時間想到用列表推導式。5.2 做中學路徑做中學路徑會這樣設計第一步給你一個真實問題“我有一個整數列表想把每個數平方以后生成新列表請寫代碼實現。”第二步你可以先用笨辦法寫numbers [1, 2, 3, 4, 5] squares [] for n in numbers: squares.append(n * n) print(squares)這段代碼能跑通。這時再問自己一個問題這段代碼能不能更簡潔第三步帶著“更簡潔”這個動機去查閱資料或看教程中關于列表推導式的章節你找到了答案numbers [1, 2, 3, 4, 5] squares [n * n for n in numbers] print(squares)運行后結果一致你親身體驗到了列表推導式帶來的簡潔感。第四步做一個挑戰任務如果只想保留平方后大于 10 的數字怎么寫你嘗試加上 if 條件numbers [1, 2, 3, 4, 5, 6] squares [n * n for n in numbers if n * n 10] print(squares)運行、驗證、調整。整個過程大約二十分鐘但你經歷了“發現問題-尋找方案-應用方案-驗證結果”的完整閉環。5.3 兩種路徑的關鍵差異維度講授式路徑做中學路徑動機來源外部課程安排內在需求驅動概念接觸時機先聽概念后做練習先遇到問題再引入概念反饋來源練習題對錯判斷代碼運行結果與報錯信息記憶深度淺層理解情景化記憶更持久能力遷移依賴題目相似度更容易遷移到真實項目做中學不是一種“少了講解”的學習方式而是一種“講解出現在正確時機”的學習方式。概念仍然要學語法仍然要記但它們出現在學習者已經產生困惑、主動想要答案的時刻。這時的講解價值遠遠大于課程開頭五分鐘的鋪墊。6. 做中學不是不要講解而是重新安排講解的位置6.1 講解要放到“困惑之后”很多人在理解“做中學”時會把它簡化成“只做不學”。這是誤解。講解本身沒有錯錯的是把它放在學習旅程的最前面。當學習者還沒有產生困惑時大量講解只會變成低效的信息輸入。更合理的順序是先讓學習者嘗試一個有一定挑戰性的任務在嘗試中暴露問題然后針對暴露的問題做簡短講解最后讓學習者帶著新理解繼續修改。這個過程可以概括為嘗試 → 困惑 → 講解 → 再嘗試。6.2 一個可復用的學習流程模板這套流程不只適用于個人自學也適用于團隊培訓和技術訓練營。推薦一個通用的五個步驟定義任務選擇一個合適難度的真實任務比如“寫一個命令行版待辦事項管理程序”。自主嘗試不急著看教程先憑已有知識盡量完成記錄卡住的地方。針對性講解只講卡點不從頭講。把卡殼的語法、API、設計思路講清楚。二次實現在聽完講解后重新實現或優化代碼爭取獨立完成。復盤總結把“我一開始是怎樣想的”“錯在哪里”“最終如何解決”記錄下來。這五步中講解的比例不超過三分之一其余時間都在做、在錯、在改。6.3 時間配比三分之一講解三分之二動手給團隊做過技術培訓的工程師應該都有體會講兩小時不如讓新人自己折騰半小時來得有效。一個比較穩妥的時間配比是如果總共要學 10 個小時那講解類內容控制在 3 小時以內動手編碼不少于 6 小時最后再用 1 小時做總結復盤。當然這不是一個絕對公式而是一種傾向性引導。不同基礎的學習者可以調整比例但始終要記得編碼時間的占比不應該低于觀看或閱讀時間的占比。6.4 如何驗證自己的學習效果做中學的驗證方式不是再做一道課后題而是看你能否獨立完成一個從未見過的小任務。建議每學完一個階段給自己布置一個“綜合挑戰任務”。比如學完 Python 基礎語法后不急著看爬蟲教程先嘗試獨立寫一個簡單的文件批量重命名腳本學完 Flask 后不急著看項目實戰視頻先嘗試把官方文檔里的最小示例改造成自己的博客后端。如果全程不打開任何教程也能完成說明知識已經內化。如果中途卡住卡住的地方就是下一次學習的最佳起點。7. 自學者與團隊培訓中最容易踩的四個坑問題現象可能原因排查方式解決方案看完視頻就忘寫代碼時大腦空白學習時間基本花在被動接收上主動產出太少統計一周內“觀看時長”和“編碼時長”的比值把編碼時長提升到觀看時長的兩倍以上能看懂報錯但找不到自己代碼的問題缺少分解問題的訓練遇到錯誤就全局亂猜問問自己這個報錯發生在哪一行變量當時的值是什么學會分段注釋代碼用二分定位法縮小錯誤范圍練習題都能做對但做小項目時無從下手練習題目有明確的邊界真實任務沒有邊界觀察卡殼位置是不是在“拆解需求”這一步多練習把需求拆成小的子任務逐步完成團隊培訓效果差新人上手慢培訓以講師宣講為主新人缺少真實代碼任務的反饋統計培訓期間每個新人寫了多少行有效代碼、修了多少個 bug設計“小任務闖關”機制讓新人第一天就接觸真實代碼這四個坑有一個共同點問題的根源不是“講得不夠清楚”而是“學生練得不夠多、反饋不夠快”。8. 用工程化思維設計“做中學”體系對于個人自學者這里的“工程化”體現在把學習當成項目來管理對于團隊培訓則體現在制度建設。8.1 用任務清單替代課程表與其列一個“學習計劃第 1 周學變量第 2 周學函數”不如列一個“任務清單”# Python 學習項目命令行待辦事項管理工具 ## 階段一最小可用版 - [ ] 創建一個 Python 文件用列表存儲待辦事項 - [ ] 實現添加待辦的功能 - [ ] 實現查看所有待辦的功能 - [ ] 實現標記完成的待辦功能 ## 階段二持久化 - [ ] 將待辦事項保存到本地文本文件 - [ ] 程序啟動時從文件讀取已有數據 - [ ] 處理文件不存在的異常情況 ## 階段三增強 - [ ] 支持刪除待辦事項 - [ ] 支持按優先級排序 - [ ] 增加命令行參數支持 add、list、done 等子命令每完成一個勾就獲得一次正反饋。任務清單比課程表更符合做中學的邏輯因為它是按“能完成什么”來組織的不是按“看了什么”來組織的。8.2 用測試代碼替代“課后作業”傳統的練習題是給一個固定輸入期望一個固定輸出。而測試代碼的邏輯是先定義程序應該滿足的行為再寫實現。這在做中學中是一個極好的反饋工具。# 文件路徑test_calculator.py import calculator def test_add(): assert calculator.add(2, 3) 5 def test_subtract(): assert calculator.subtract(5, 2) 3當你運行pytest時所有未通過測試的用例會清晰告訴你“程序目前不滿足哪些行為”。你不用等老師批改就能立刻進入修復循環。pytest test_calculator.py -v看到綠色通過的一刻就是一次完整正反饋。團隊培訓中這個機制比“出題-判卷”高效得多。8.3 用代碼評審制造人工反饋對初學者而言最大問題往往是“不知道自己哪里寫得不夠好”。一種有效的做法是引入“人工反饋”把代碼給有經驗的人看請對方指出三個可以改進的點。不需要一次給十條意見每次給最重要的兩三條即可。對于團隊培訓可以設計固定節奏的代碼評審每周抽一次讓新人講解自己本周寫的代碼由導師和 peer 提出改進建議。評審不是打分而是“反饋系統”的一種人工擴展。8.4 一個最小項目訓練模板如果要為一名新入職的 Python 工程師設計一周的培訓計劃可以這樣天數訓練任務關鍵反饋第 1 天跑通項目本地環境修復 3 個故意制造的 bug錯誤信息與運行結果第 2 天為現有模塊補充單元測試pytest 測試結果第 3-4 天獨立實現一個小需求評審后修改代碼評審意見第 5 天復盤一周解決過的問題寫一篇技術筆記輸出倒逼總結這個模板的核心不是“教學大綱”而是“真實任務 即時/短期反饋”。新人不是在“準備做項目”而是“在項目中學習”。9. 結論講課沒有錯錯在把它當成學習系統的全部回到最初的問題為什么薩爾·汗行不通因為可汗學院式的講授教學本質上是一個“知識分發系統”。它擅長把結構良好的知識以最低成本、最好體驗送到學習者面前。在一個信息稀缺的時代這價值連城。但在編程這個需要高度動手、持續反饋的領域它的結構性短板非常明顯學生接收了大量輸入卻缺少足夠的輸出機會也缺少高密度的“試錯-修正”循環。做中學并不是要否定講解。恰恰相反做中學為講解找到了更合適的位置它把講解從學習的起點移到學習者產生困惑之后。這個位置上的講解才會被真正消化。對于正在自學編程的人最實際的建議是下一次準備打開一個新教程之前先給自己找一個“卡住你的問題”。帶著問題去學用代碼去驗證用錯誤去推動理解。這比刷完十集視頻更能讓你接近一個真正的程序員。對于正在設計技術培訓體系的團隊最值得思考的一件事是你的課程里學生每天真正動手寫代碼的時間有多少他們寫完代碼后能不能在一天內得到有效的反饋如果這兩個數字不夠高那再多再精彩的課程視頻也很難帶來技術能力的真實增長。