幾個月前,我決定不再歡迎 AI 貢獻到我正在建置和維護的開源專案 LibreWeddingPlanner 中。並不是因為 AI 貢獻了很多,實際上我收到的所有貢獻都是翻譯和功能請求,但我希望避免未來的紛爭,並對 AI 表達我的立場。
然而,雖然我沒有在開源貢獻中使用 AI,我卻持續在工作中運用它。在我的工作場所,以及許多開發者朋友那裡,使用 AI 工作非常普遍。我帶著幾分羞愧,想和大家分享這段經歷,以及它如何讓我變得更笨、更懶惰,成為一個更差勁的開發者。
一位朋友告訴我:「嘿,你應該試試看,你會感覺無比強大。一旦開始使用,你就停不下來。過去需要幾天才能完成的任務,現在幾個小時就能搞定。」不,我們談論的不是古柯鹼,儘管在某種程度上我認為使用 AI 是一種成癮。我開始啟用 VS Code 中增強的自動完成功能(或者它是自動啟用的?),接著就下載並使用了其他程式碼生成模型。小時候,我記得父母說過:「小心那些在校門口發糖果的壞人,那不是糖果,那是毒品。」二十幾歲時,我會開玩笑說:「是啊,現在他們竟然免費發毒品了,嗯?」到了三十幾歲,我認為他們可能真的這麼做了。
一旦你開始使用 AI 程式碼助手,事情會很快失控。一開始,你要求 AI 為你實現一個功能,或為某段程式碼編寫測試。如果你長期以來都是 TDD(測試驅動開發)的信徒,你可能會傾向於先讓 AI 寫測試,然後再寫程式碼。但實際上,你不再寫程式碼了,你只是讓 AI 去做,而 TDD 的一半目的(避免測試受到程式碼實現方式的影響)就消失了。但你感覺自己進展神速,於是開始不在乎了。
有一天,我看到 AI 助手在簽署我提交的 commit,我趕緊去停用那個設定。好像我想要假裝程式碼是自己的。天啊。
如果事情就此打住,那還不算太糟,但大多數人腦並非如此運作。如果你喜歡某樣東西,而且能獲得兩倍的效益,你就會想要它。我開始貼上 Jira 任務的整個描述,讓 AI 為我實現它。太棒了!!太強大了!!在一個相對陌生的程式碼庫中工作,我開始失去對哪些變更真正需要來完成任務的控制。我心想,如果 AI 讀過專案中的每一行程式碼,說這是必需的,那就這樣吧。控制權是一種幻覺。我與其他討論過這件事的人交流過,他們也同意自己並不 100% 知道他們提交到生產環境的程式碼實際上做了什麼。我敢打賭,我們甚至不知道 20%。這他媽的太可怕了。
但它並沒有就此停止。當我有一個小任務時,我會交給 AI,大約 30 分鐘後我就有一個 PR(拉取請求)。這 30 分鐘我在做什麼?切換注意力。很快我意識到,我可以同時讓一個,甚至多個 AI 助手處理不同的任務,在多個 Git 工作樹中。全力以赴!最大化代幣使用!我透過 ACLI(命令列介面)將 AI 助手連接到 Jira,然後就問它們:「在單獨的工作樹中處理這個 Jira 任務。」它就會開始工作。我感到欣喜若狂。
當任務不是那麼小時,你可能會認為是我自己在處理對吧?才不。我當然會要求 AI 將其分解成更小的任務,然後讓它去處理。AI 會給我一個非常有說服力的 PR,包含一堆我不太理解的變更。我該如何請求對這些變更進行程式碼審查?我的同事會怎麼說?當他們(在該程式碼庫方面經驗更豐富)問我為什麼這樣做或那樣做時,我該怎麼說?我該如何承認這一切都是 AI 的功勞,而我只是一個 AI 牧羊人?所以我強迫自己去理解程式碼。並不是我想理解程式碼庫的架構,而是我想避免因為不知道自己在幹什麼而感到羞辱。
某個時候,我擁有的 AI 助手太多了,以至於注意力轉移對我來說太過頻繁。有些任務我本來可以在 20 分鐘內輕鬆完成,AI 助手花了 5 分鐘,然後我花了 2 天來審查。因為還有太多其他事情。也許 AI 和電腦擅長上下文切換,但我不行。我筋疲力盡。因為如果只是批准那些寫得完美的 PR,那還不錯。但對於每個 PR,我必須查看程式碼、測試、風格,給予回饋,切換到別的東西,再回來,推送,看看是否有任何 PR 評論,CI 是否通過,等待,現在 linter 又抱怨了。而你花了 2 天來完成一個本來可以單純專注 1 小時就能完成的事情。以我的個人經驗來看,倍增的 AI 效能只是幻覺。倍增的挫敗感和疲憊感則是確定的。
我認為沒有一個我交給 AI 的任務是可以直接合併的。當然,我不會自己寫 commit 或 PR 描述(這是什麼,2024 年嗎?),AI 會為我完成,並確保 PR 中有 7 段的描述,解釋它做了什麼。我不再閱讀那些描述,就像,我告訴它該做什麼,我假設它照做了。描述是給別人的。因為必須要有描述,對吧?AI 聽起來專業得令人難以置信,讓你放鬆並任由它擺佈。並不是我真的認為程式碼很好,但隨著時間推移,你會被說服,你會變得懶惰,你會變得自滿。你停止質疑,開始接受一些你從未接受過的程式碼,僅僅因為你無法分辨它為什麼不好。你失去了控制。大多數 AI 開發者都會否認這一點,但他們內心深處知道這是真的。只是不想面對它。
幾個月過去了,有一天我意識到,我已經好幾個月沒有自己寫一行程式碼了。我甚至沒有自己提交過。無數次我在 AI 助手的聊天中寫下「提交並推送」。這到底是什麼?如果這不是懶惰,我不知道那是什麼。AI 也無法解決我給它的所有任務。甚至連一半都解決不了。一次又一次,我不得不像照顧初級開發者一樣,對 AI 助手說:「現在,套用這個模式」或「在規格中,將測試設置分離到一個 before 區塊,並將斷言放在不同的區塊。」別誤會我的意思,我喜歡指導,我已經做了很多年,而且我認為這對導師和被指導者都有好處。但我不會他媽的去照顧一台機器,抱歉。
很多時候,我會發現 AI 寫的程式碼品質顯著下降。並不是一開始就很出色,但我有種感覺:「老兄,你以前做過這個,為什麼你現在做不到了?」所以我不得不再次提示它重新解釋如何做。或者將它連結到一個包含我偏好的檔案。「好的,我現在明白了,抱歉造成混淆。讓我為你重做。」然後它又會搞砸,做出來的不是我要求的。這讓我想起了 Google 降低搜尋結果品質的策略,迫使用戶多次搜尋,並看到更多廣告。如果這對 Google 有效,為什麼對 AI 無效?尤其是在 AI 公司面臨不確定的財務時期,你真的認為他們不會這麼做嗎?拜託。他們會這麼做,甚至更多。
其他日子裡,我會看到一個 AI 助手卡住了 30 分鐘沒有給我答案。該怎麼辦?你認為我會自己接手任務並處理嗎?絕對不是。我拿起鞭子,語氣權威地要求我的程式碼!AI 助手連聲道歉,並在 20 秒內給了我它 30 分鐘都沒給我的東西。我看了看代幣費用,它花了 30 美元在代幣上,卻一無所獲。如果是我付錢,我會非常憤怒。
一個月前,在我的一個 PR 的程式碼審查中,一位同事說了類似這樣的話:「你寫的這個測試並沒有真正測試你正在更改應用程式程式碼的場景。」我審查了一下,他說得對。但是……它太有說服力了……我感到羞愧。因為對我來說,一個使用 TDD 超過 10 年的開發者,在如此基本的事情上犯錯,有點令人難堪。我意識到我失去了控制,而且情況不會好轉。我認為只是更努力地嘗試,對 AI 更挑剔,要求你付費的品質!是沒有價值的!因為儘管你付出了努力,AI 最終還是會說服你,讓你再次變得自滿。
所以我決定停止使用 AI。即使這會讓我丟掉工作。
當你拿到 AI 生成的草稿 PR,然後必須自己動手修改時,你才會意識到自己對它在做什麼有多麼不了解。你開始質疑是否需要這個或那個,最終全部捨棄,重新開始。我感覺自己生疏了,好像很久沒有自己寫程式碼了。幸運的是,我一直在我的個人專案中斷斷續續地寫程式,所以這個過程雖然費力,但還不算太糟。
我回到了 TDD,回到了我的 PR 只修改 5 個檔案。回到了我的 2 行 PR 描述,直截了當。我回到了理解我所做的事情,有信心地部署,準備好接受詳細的程式碼審查,因為我知道變更的內容,並且我可以為每一行程式碼辯護。我重新享受了人類的程式碼審查(不是 AI 的,我仍然討厭那些。更討厭那些將 AI 生成的審查當作自己成果的人),並從中學習。我開始詢問架構決策,為什麼事情是這樣安排的。我本可以問 AI,但我更願意問我的同事。
我找回了寫程式的樂趣。而且我沒有回頭。我不會假裝程式碼行數或 PR 數量是有效的指標,尤其是在 AI 可以隨意冗長以贏得任何指標的情況下。但我可以說,我每天都在提交重要的變更,PR 被合併,並且一天結束時,工作完成了。因此,我不害怕被解僱。而且,我還保持著我的腦功能完好無損。
對毒品說不。有點像比喻,但也不完全是。第一步是意識到我們對 AI 的依賴程度有多深。一種你無法控制的技術,卻讓你的雇主(如果不是你)花費巨額資金。你會說,但我的經理期望我表現出色,我現在要如何表現不佳?我無法代表你發言,但這沒有發生在我身上。我不認為與兩個月前相比,我的表現有所下降。如果說有什麼不同,那就是我現在更清楚自己在做什麼,如果發生了事件,我更有能力應對(因為,嘿,是我寫了搞砸的程式碼),而且我(字面意義上,我本人)在程式碼庫上工作得越多,我就成為一個更好的開發者。這應該是你的經理想要的。
而且,當 AI 的預算削減開始時(它們會的,如果還沒開始的話),你將為他們節省一些開支。
如果你像我一樣是個開發者,讓你獲得這份工作的正是你作為開發者的經驗。如果你在市場上已經有幾年了,你就會知道,你在職業生涯中遇到的困難問題的難度,就代表了你的能力。如果你關閉大腦,放鬆地照顧 AI,你就無法進步。你正在失去價值,因為你所能交付的東西,你作為工程師(而不是 AI 牧羊人)的實際價值,隨著你的大腦變得自滿並將控制權交給 AI 而下降。