代軟件開發(fā)學(xué)習(xí)指南:調(diào)試、評(píng)審與項(xiàng)目實(shí)戰(zhàn))
這兩年我身邊聊 AI 聊得最多的問題不是某個(gè)模型又發(fā)布了什么新功能而是“AI 時(shí)代軟件開發(fā)應(yīng)該如何學(xué)習(xí)”。程序員們發(fā)現(xiàn)曾經(jīng)引以為傲的“從零搭一個(gè)模塊”“手寫一套業(yè)務(wù)接口”正在快速貶值而新的能力要求好像又沒有一本現(xiàn)成的教材能講明白。這篇內(nèi)容不是趨勢預(yù)測也不是販賣焦慮而是我在不同規(guī)模的項(xiàng)目里觀察到的真實(shí)變化以及我重新整理出來的學(xué)習(xí)框架。想讀下去的朋友大概是這幾類剛?cè)腴T但不知道從哪里使勁的初學(xué)者有一定經(jīng)驗(yàn)但擔(dān)心基本功退化的工程師還有已經(jīng)在用 AI 寫代碼、卻總覺得少了點(diǎn)什么的人。1. 先看現(xiàn)實(shí)AI 到底動(dòng)了軟件的哪塊蛋糕1.1 初級(jí)開發(fā)崗位正在經(jīng)歷的第一輪變化我以前帶人最看重的學(xué)習(xí)指標(biāo)是“能不能獨(dú)立寫出一個(gè)功能模塊”。語法、框架、數(shù)據(jù)結(jié)構(gòu)、常見 API這些東西只要背得夠多、練得夠勤很快就能積累起來。但 AI 工具出現(xiàn)之后工作量最大的那部分——把功能描述翻譯成代碼——突然變得非常便宜。舉一個(gè)典型場景。過去團(tuán)隊(duì)里要加一個(gè)“批量導(dǎo)入用戶名單”的功能新人的第一反應(yīng)通常是查文檔搞清楚上傳格式、數(shù)據(jù)庫表結(jié)構(gòu)、校驗(yàn)規(guī)則然后一行行寫邏輯?,F(xiàn)在同樣的需求丟給 AI幾秒鐘就能生成一個(gè)看起來能跑的版本讀取文件、逐行解析、批量入庫連異常捕獲都給你寫好了。你會(huì)發(fā)現(xiàn)真正拉開差距的地方不在“寫出來”而在說清楚到底要什么樣的導(dǎo)入規(guī)則重復(fù)用戶怎么處理失敗到第幾條要不要回滾單次導(dǎo)入上限多少字段錯(cuò)誤是跳過還是終止這些需求澄清、邊界定義、異常兜底的工作AI 幫不了你因?yàn)檫@些問題的答案不在代碼里而在業(yè)務(wù)場景里。初級(jí)崗位被壓縮的恰恰是最容易被工具替代的“把已知方案寫成代碼”的部分而“搞清楚要解決什么問題”不僅沒變反而在函數(shù)里的比重越來越大。1.2 從“寫代碼”到“定方案”的能力遷移我接觸過的開發(fā)者里對(duì)變化反應(yīng)最大的不是寫不好代碼的人而是過去特別擅長寫代碼的人。原因很簡單他們最依賴的技能點(diǎn)正在變成默認(rèn)能力以前“我寫得比別人快”的優(yōu)勢不再成立?,F(xiàn)在真正值錢的是三種能力。第一個(gè)是需求拆解能力也就是把一個(gè)模糊的想法變成一個(gè)可驗(yàn)收的交付物。這里有個(gè)很實(shí)用的標(biāo)準(zhǔn)如果需求描述里出現(xiàn)“大概”“差不多”“盡量”這些詞說明拆解還沒做完。舉例說“做一個(gè)提醒功能”誰都會(huì)說但“用戶可以選擇提醒時(shí)間到期后彈通知若應(yīng)用不在前臺(tái)則發(fā)本地通知且對(duì)同一用戶五分鐘內(nèi)去重”才是可執(zhí)行的描述。第二個(gè)是系統(tǒng)判斷力知道哪些環(huán)節(jié)該交給 AI哪些環(huán)節(jié)必須保留人肉。AI 擅長生成局部代碼但整體的數(shù)據(jù)流向、模塊邊界、部署策略需要人來決策。這種判斷力不是直接從教程里學(xué)來的而是靠一次次比較“自己寫”和“AI 寫”之間的差異慢慢建立的。第三個(gè)是質(zhì)量兜底能力。AI 生成的代碼表面上很完整但線上崩的往往不是表面而是狀態(tài)沒管理好、邊界沒覆蓋、并發(fā)沒考慮。誰能更快定位、誰能提前發(fā)現(xiàn)這些問題誰才是團(tuán)隊(duì)里不可替代的人。下面這個(gè)表可以直觀看出學(xué)習(xí)重心的遷移舊重心新重心記住語法和常見 API提出正確的問題實(shí)現(xiàn)已知功能定義未知需求寫出代碼審查與驗(yàn)證代碼從頭搭建組合、取舍、重構(gòu)速度優(yōu)先可靠性與可維護(hù)性優(yōu)先說到底AI 不是把軟件開發(fā)這個(gè)行業(yè)消滅了而是把“實(shí)現(xiàn)”這個(gè)環(huán)節(jié)變得便宜把“決策”這個(gè)環(huán)節(jié)擺到了臺(tái)面上。軟件開發(fā)的學(xué)習(xí)本質(zhì)是在學(xué)怎么做好決策。2. 越用 AI 越覺得基本功不能丟調(diào)試、結(jié)構(gòu)、可讀性2.1 可運(yùn)行不等于正確調(diào)試意識(shí)為什么成了分水嶺這半年我面試人或者看團(tuán)隊(duì)同學(xué)提交的代碼發(fā)現(xiàn)一個(gè)很普遍的誤區(qū)代碼能跑起來大家就覺得任務(wù)完成了。AI 生成的代碼尤其容易給人這種錯(cuò)覺因?yàn)樗Z法正確、縮進(jìn)漂亮、注釋齊全看起來非?!罢?guī)”。但可運(yùn)行和正確是兩件完全不同的事。說個(gè)我實(shí)際遇到的例子。某團(tuán)隊(duì)做訂單模塊讓 AI 生成了一段庫存扣減代碼測試環(huán)境單獨(dú)跑也沒問題。結(jié)果壓測時(shí)一出現(xiàn)并發(fā)下單庫存就對(duì)不上了。問題出在生成代碼壓根沒有考慮并發(fā)場景——先查庫存、判斷充足、再更新數(shù)量這三個(gè)動(dòng)作之間沒有鎖也沒有事務(wù)約束。這種問題靠肉眼讀代碼很難發(fā)現(xiàn)通常要配合日志、斷點(diǎn)、甚至線上監(jiān)控才能定位。這時(shí)候真正有用的是你對(duì)“程序如何在運(yùn)行時(shí)流轉(zhuǎn)”的直覺。你去猜測哪一步出了錯(cuò)、把嫌疑范圍一步步縮小、在關(guān)鍵位置打印日志、觀察數(shù)據(jù)狀態(tài)這些都是工具替代不了的底層的調(diào)試意識(shí)。我甚至覺得AI 時(shí)代學(xué)調(diào)試比學(xué)語法更重要因?yàn)?AI 給你一張看起來完美的地圖只有會(huì)識(shí)圖的人才知道哪些地方標(biāo)錯(cuò)了。2.2 讀代碼、拆代碼、改代碼AI 給不了的結(jié)構(gòu)感有朋友問過我既然 AI 寫代碼又快又好是不是不用再花時(shí)間讀代碼了我的觀點(diǎn)恰恰相反AI 時(shí)代讀代碼變得更重要了。你將來要面對(duì)的局面是AI 一次性給你生成幾百行代碼你得有能力在五分鐘之內(nèi)搞懂它的大致結(jié)構(gòu)和潛在風(fēng)險(xiǎn)。這種能力沒有捷徑只能靠平時(shí)大量閱讀有效代碼喂出來。我給自己和團(tuán)隊(duì)同學(xué)推薦一個(gè)訓(xùn)練方法叫“三步讀代碼”先看輸入輸出這個(gè)函數(shù)或模塊拿到什么數(shù)據(jù)最后吐出來什么變化的只有這一層嗎再找狀態(tài)變化代碼執(zhí)行過程中哪些變量被修改了什么時(shí)候修改有沒有可能出現(xiàn)并發(fā)或者被外部共同引用的情況最后看邊界處理空值、超時(shí)、超量、重復(fù)請(qǐng)求這些分支有沒有被覆蓋覆蓋得對(duì)不對(duì)。日常練習(xí)的時(shí)候可以配合 AI 一起做。你拿到一段代碼先用自己的話說一遍它是干嘛的再讓 AI 解釋對(duì)比一下漏掉了什么。反復(fù)做上幾十次你對(duì)代碼結(jié)構(gòu)的敏感度會(huì)明顯提升。讀代碼和拆代碼的本質(zhì)是建立因果鏈工具給的是信息信息只有被你組織成因果鏈才變成真本事。3. 把 AI 當(dāng)陪練而不是代練一套能落地的學(xué)習(xí)方法3.1 提問方式?jīng)Q定了 AI 是助手還是老師同樣是打開一個(gè) AI 工具每個(gè)人得到的效果天差地別。有人讓 AI 直接寫完整功能拿到手就粘貼這叫“代練”有人把 AI 當(dāng)作“陪練”用它來逼自己思考和驗(yàn)證。同樣的工具用法不同學(xué)習(xí)速度差出好幾倍。我建議你在日常學(xué)習(xí)中多試這幾種提問姿勢。第一別急著要答案先要方案??梢园研枨笤瓨觼G給 AI然后追問一句“不要寫代碼先給我三種實(shí)現(xiàn)思路分別說清楚適用場景和取舍點(diǎn)?!边@樣一來你至少被迫面對(duì)“為什么選 A 不選 B”的權(quán)衡問題。這種權(quán)衡能力在項(xiàng)目里最值錢。第二讓 AI 解釋每段思路。它給出代碼之后你可以繼續(xù)問“這一段為什么用異步而不是同步這個(gè)條件判斷什么情況下會(huì)漏掉”AI 的解釋不一定全對(duì)但你只要帶著批判性接收就能培養(yǎng)出屬于自己的判斷力。第三試著角色反轉(zhuǎn)。比如你寫了一段邏輯把它貼在對(duì)話框里讓 AI “以資深評(píng)審者的身份從并發(fā)安全、邊界條件、可維護(hù)性三個(gè)角度指出問題”。我試過很多次這個(gè)做法能逼你對(duì)默認(rèn)寫出來的東西進(jìn)行第二次審視。核心邏輯是AI 不應(yīng)該替代你的思考而是把你的思考變成實(shí)驗(yàn)讓驗(yàn)證變得更加即時(shí)。3.2 拿到 AI 生成結(jié)果后的驗(yàn)收清單AI 生成代碼之后許多新人會(huì)誤以為工作結(jié)束但恰恰這時(shí)候工作才剛開始。我整理過一個(gè)簡單的驗(yàn)收清單每次拿到代碼都會(huì)過一遍邊界條件如果輸入是空值、超大值、重復(fù)值程序會(huì)怎樣失敗路徑數(shù)據(jù)庫連接不上、文件不存在、權(quán)限不足有處理嗎資源釋放文件流、網(wǎng)絡(luò)連接、線程池做完后釋放干凈了嗎并發(fā)安全多個(gè)人同時(shí)在跑結(jié)果會(huì)不會(huì)互相干擾可維護(hù)性換一個(gè)人來改這段代碼能快速看懂嗎舉一個(gè)實(shí)際例子。讓 AI 寫一個(gè)文件上傳模塊很多 AI 給出的版本都有模有樣接收文件、保存到本地、返回路徑。但你拿驗(yàn)收清單一查就會(huì)發(fā)現(xiàn)同名文件會(huì)直接覆蓋、磁盤滿了沒有任何提示、上傳大文件時(shí)沒有超時(shí)控制。這些缺失不會(huì)在“能跑”的體驗(yàn)里暴露但它們決定了你在真實(shí)項(xiàng)目里是省心還是踩坑。這里還想強(qiáng)調(diào)一句AI 給你代碼時(shí)通常不會(huì)自然告訴你它哪里不可靠。你在使用時(shí)必須默認(rèn)“它只是候選解不是標(biāo)準(zhǔn)答案”一切都以你的驗(yàn)收結(jié)果為準(zhǔn)。3.3 讓 AI 反向評(píng)審自己寫的代碼還有一個(gè)我特別推薦的學(xué)習(xí)動(dòng)作就是把自己手工寫的代碼拿給 AI 評(píng)審。很多人把這個(gè)順序搞反了總是讓 AI 寫第一版自己去優(yōu)化。但如果你的基本功還在建設(shè)期我更建議第一版盡量自己寫哪怕寫得很笨然后讓 AI 來找毛病。這樣做的價(jià)值在于你會(huì)清楚地看到自己的盲區(qū)。比如我讓一個(gè)剛開始學(xué)編程的朋友寫一個(gè)“倒計(jì)時(shí)器”他自己寫完覺得沒問題AI 卻指出了幾個(gè)小問題第一次渲染會(huì)有一秒延遲、時(shí)間到零之后沒有清理定時(shí)器、切到后臺(tái)再回來時(shí)間不準(zhǔn)。這樣的反饋比任何課程講“定時(shí)器該如何處理”都更具體因?yàn)樗苯釉以谀銊倢懲甑恼鎸?shí)代碼上。這個(gè)流程重復(fù)若干次之后你會(huì)慢慢內(nèi)化一種“先找毛病再看亮點(diǎn)”的讀取習(xí)慣。如果 AI 每次點(diǎn)出的問題你都記錄了并且在下一次寫作時(shí)有意識(shí)地避開那你的成長速度會(huì)遠(yuǎn)超只看教程的同期學(xué)習(xí)者。4. 別再做練習(xí)題了以項(xiàng)目為主線的學(xué)習(xí)路徑設(shè)計(jì)4.1 練習(xí)項(xiàng)目的四個(gè)選擇標(biāo)準(zhǔn)有人問我AI 時(shí)代還需要刷題和做教程練習(xí)嗎我的答案是傳統(tǒng)練習(xí)題可以做但絕不能作為主糧。教程練習(xí)的典型問題是它已經(jīng)有人替你定義好了問題和答案而 AI 時(shí)代最稀缺的恰恰是自己定義問題的能力。我建議你盡快切換到“以項(xiàng)目為主線”的學(xué)習(xí)路徑但選項(xiàng)目要有標(biāo)準(zhǔn)。我平時(shí)幫團(tuán)隊(duì)新人選題基本看四點(diǎn)你能說清楚它的輸入和輸出是什么。它包含至少一個(gè)你之前沒寫過的環(huán)節(jié)。它的規(guī)模小到能在一周內(nèi)完成閉環(huán)。它帶有現(xiàn)實(shí)約束比如數(shù)據(jù)量不能太大、響應(yīng)時(shí)間要夠快、多人使用不能出錯(cuò)。拿第四條舉例很多業(yè)余項(xiàng)目問題是場景太虛。你做一個(gè)“待辦事項(xiàng)應(yīng)用”從來沒有真實(shí)用戶就不會(huì)遇到性能、并發(fā)、權(quán)限這些工程問題。一旦加上“假設(shè)有一百個(gè)人同時(shí)用”的約束你立刻就發(fā)現(xiàn)自己對(duì)很多東西一無所知了。真實(shí)的約束才是學(xué)習(xí)最好的老師。4.2 模仿—改造—原創(chuàng)三階進(jìn)階曲線我拿一個(gè)完全虛構(gòu)的“會(huì)議紀(jì)要自動(dòng)整理工具”來演示這條路徑。第一階段是模仿。你可以讓 AI 給你一段“把錄音轉(zhuǎn)文字并按說話人分組”的參考代碼然后逐行讀、逐段問確保自己明白每一步做了什么。這里的關(guān)鍵是別滿足于“看懂大概”要能合上 AI 自己復(fù)述一遍設(shè)計(jì)思路。第二階段是改造。把需求換掉一個(gè)關(guān)鍵變量比如原來的工具只支持英文音頻現(xiàn)在要求支持中英文混排你動(dòng)手去改數(shù)據(jù)結(jié)構(gòu)、調(diào)整算法。改造的過程一定會(huì)碰壁而碰壁之后的排查過程才是最有效的學(xué)習(xí)。第三階段是原創(chuàng)。給自己定一個(gè)有挑戰(zhàn)但邊界明確的小題目完全不依賴現(xiàn)成教程。比如“做一個(gè)局域網(wǎng)里輕量的文件同步工具”需求很簡單但如果動(dòng)手做起來就會(huì)涉及文件監(jiān)聽、沖突解決、增量傳輸、斷點(diǎn)續(xù)傳等一系列沒有標(biāo)準(zhǔn)答案的問題。你不得不自己設(shè)計(jì)方案、權(quán)衡取舍然后借助 AI 驗(yàn)證思路。這個(gè)過程做完一遍比看十篇教程都有用。我見過不少學(xué)習(xí)效果好的人不是智商有多高而是很早就走上“模仿—改造—原創(chuàng)”這條串聯(lián)路徑并且每一個(gè)階段都刻意留出“做不出來”的緩沖時(shí)間。學(xué)習(xí)不是看會(huì)不會(huì)而是看你卡住之后有沒有一套解題和檢索的方法。5. 行業(yè)評(píng)價(jià)方式變了代碼評(píng)審成了新的能力標(biāo)尺5.1 代碼評(píng)審現(xiàn)場發(fā)生的真實(shí)變化以前評(píng)審代碼大家會(huì)看代碼風(fēng)格、有沒有注釋、邏輯是否清晰?,F(xiàn)在代碼風(fēng)格有 AI 幫你整理注釋也越來越像模板評(píng)審現(xiàn)場真正討論的話題已經(jīng)變成“你為什么采納這段 AI 生成代碼它有哪些前提條件出問題時(shí)怎么辦”我有一次旁聽某團(tuán)隊(duì)的評(píng)審開發(fā)者把一段 AI 生成的對(duì)外接口代碼貼出來第一輪就被人追問了一個(gè)問題這個(gè)接口在調(diào)用方超時(shí)重試的情況下會(huì)不會(huì)重復(fù)扣費(fèi)最后查到生成代碼里確實(shí)沒有做冪等處理。這個(gè)場景很有代表性。代碼生成工具把寫代碼的體力活消滅了需要人來承擔(dān)的“解釋責(zé)任”反而浮出水面。如果你想在團(tuán)隊(duì)里被認(rèn)可不再取決于你提交了多少行代碼而是取決于你能不能講清楚一段代碼的設(shè)計(jì)邏輯和邊界風(fēng)險(xiǎn)。這其實(shí)就是一種高級(jí)的學(xué)習(xí)方式因?yàn)槟汶S時(shí)要面對(duì)質(zhì)疑所以你必須對(duì)自己使用的代碼有更深層的理解。平時(shí)練習(xí)時(shí)我建議你也給自己加一個(gè)步驟——每寫完一個(gè)功能在代碼旁邊寫幾行“設(shè)計(jì)說明”和“風(fēng)險(xiǎn)點(diǎn)”這個(gè)習(xí)慣很快會(huì)鍛煉出工程判斷力。5.2 從同行那里觀察到的幾種高杠桿學(xué)習(xí)法我周圍有好幾個(gè)學(xué)習(xí)效率很高的開發(fā)者他們的做法并不神秘反而很樸素值得拿出來分享。有人堅(jiān)持“每周 AI 實(shí)驗(yàn)日”固定抽出一個(gè)下午用來做工具實(shí)驗(yàn)試著讓 AI 完成一個(gè)平時(shí)沒做過的小任務(wù)然后復(fù)盤它的不足。這個(gè)習(xí)慣不追求產(chǎn)出只追求探索長期積累下來對(duì)工具的邊界理解非常深。有人用“兩遍學(xué)習(xí)法”第一遍完全手工實(shí)現(xiàn)核心邏輯強(qiáng)迫自己理解每一步第二遍用 AI 重做同一功能然后逐段對(duì)比兩版代碼的差異。這個(gè)對(duì)比過程可以讓你清晰地看到“哪些地方我寫得啰嗦”“哪些地方 AI 做得更嚴(yán)謹(jǐn)”學(xué)習(xí)效果比我見過的任何單方面看教程都要扎實(shí)。還有人推動(dòng)一種內(nèi)部約定凡是 AI 生成的代碼必須附帶“驗(yàn)收備注”說明你審查過哪幾個(gè)風(fēng)險(xiǎn)點(diǎn)、為什么確認(rèn)可合并。這個(gè)約定最初被嫌麻煩但執(zhí)行一段時(shí)間后團(tuán)隊(duì)的線上事故明顯減少了。原因很簡單它強(qiáng)制每一位成員在提交之前真正過了一遍腦子。這些做法有一點(diǎn)是共通的它們都要求你把 AI 的使用過程轉(zhuǎn)化成可匯報(bào)、可復(fù)盤、可評(píng)審的對(duì)象而不是一個(gè)人偷偷生成一堆代碼然后祈禱它能跑。學(xué)習(xí)方式的改變最終會(huì)反映在協(xié)作方式的改變上。6. 持續(xù)學(xué)習(xí)中我反復(fù)用到的復(fù)盤習(xí)慣與避坑提醒6.1 一周復(fù)盤模板記錄 AI 幫不了你的地方學(xué)習(xí)軟件開發(fā)和學(xué)習(xí)任何復(fù)雜技能一樣最大的敵人不是學(xué)不會(huì)而是不知道自己哪里沒學(xué)會(huì)。AI 會(huì)放大這個(gè)問題因?yàn)樗赡軒湍惆巡粫?huì)的部分悄悄補(bǔ)全了讓你誤以為自己什么都會(huì)。我給自己定了一個(gè)很輕量的每周復(fù)盤模板一共三件事這周 AI 幫我完成了什么這周 AI 沒幫我完成什么這周我憑借自己的判斷發(fā)現(xiàn)了哪幾個(gè) AI 沒發(fā)現(xiàn)的問題第一個(gè)問題幫助你看到工具的杠桿第二個(gè)問題幫你看清工具的邊界第三個(gè)問題其實(shí)在衡量你自己的成長。如果連續(xù)幾周的答案里第三件事都是空白那說明學(xué)習(xí)沒有真正發(fā)生。復(fù)盤不需要寫長文幾句話就夠關(guān)鍵是長期堅(jiān)持。這種習(xí)慣比收藏一堆學(xué)習(xí)資料管用得多。6.2 幾條避坑建議別學(xué)偏了方向最后列幾條我見過很多次的學(xué)習(xí)彎路寫給正在摸索的朋友。別沉迷“提示詞大全”。提示詞技巧是快速入門的輔助工具但不是核心競爭力。同樣一段需求能理解業(yè)務(wù)本質(zhì)的人無論用什么提示詞都能拿到不錯(cuò)的候選方案不懂業(yè)務(wù)的人背再多模板也問不出關(guān)鍵問題。別跳過基礎(chǔ)知識(shí)。數(shù)據(jù)結(jié)構(gòu)、網(wǎng)絡(luò)協(xié)議、操作系統(tǒng)常識(shí)這些東西可能不會(huì)天天直接用到但在排查性能問題和設(shè)計(jì)系統(tǒng)時(shí)它們決定你的天花板。AI 能幫你查到零散的知識(shí)卻幫不了你建立底層模型。別只學(xué)“生成”不學(xué)“評(píng)審”?,F(xiàn)在很多課程都在教怎么用 AI 生成代碼但工程里更重要的其實(shí)是評(píng)審和驗(yàn)證的能力。你如果能指出別人代碼里的三個(gè)風(fēng)險(xiǎn)點(diǎn)比你能生成三個(gè)模塊更值錢。別怕做慢的小項(xiàng)目。我見過有人半年沒寫完一個(gè)完整功能但一直在研究各種工具技巧最后什么都沒有落地。恰恰是那些笨拙、有點(diǎn)幼稚的小項(xiàng)目逼你面對(duì)真實(shí)問題逼你把零散知識(shí)串成體系。AI 時(shí)代的學(xué)習(xí)節(jié)奏和過去確實(shí)很不一樣但有一點(diǎn)沒變軟件開發(fā)最終是關(guān)于判斷力的工作。代碼可以生成方案、取舍、審查、兜底這些判斷只能靠你自己練出來。我個(gè)人這兩年最深的體會(huì)是評(píng)估一個(gè)開發(fā)者有沒有成長不再看他寫了多少行代碼而是看他能不能在一段 AI 生成的代碼里指出三個(gè)風(fēng)險(xiǎn)點(diǎn)。學(xué)習(xí)方式變了值得學(xué)習(xí)的東西也變了但通往可靠工程師的路依然是踏實(shí)動(dòng)手、認(rèn)真復(fù)盤這兩條腿走出來的。