在開始之前簡短說明一下——我知道我最近有點偏離 iOS/Swift 系列了。我只是有太多想法,得先把它們從腦袋裡清出去。這個系列會在下一篇文章回來,我保證。好,現在開始。故事時間。
我本來想跟大家講講,某個下午我花時間刪程式碼,卻意外學到比我整整花一個月生成這些程式碼時還多的東西。
這不是我原本預期要講的故事。我一開始以為自己只是在做一次快速整理。結果我走出來時,已經成了另一個人。稍微謙卑了些、咖啡因攝取過量,而且某個檔案裡少了 200 行 Swift 程式碼,奇妙的是它現在反而運作得更好了。讓我解釋一下。
幾週前,我在一個專案上推進得很快。快得有點丟臉。生成、測試、接受、繼續往前。生成、測試、接受、繼續往前。AI 一直產出能編譯、也能完成我要求功能的東西,而我就只是……照單全收。沒有仔細閱讀,沒有多問問題。就這樣一路很放鬆地做完一個又一個功能,像那種絕對不會在之後後悔的人。
讀者們,我後來真的後悔了。
不是因為它壞掉了。真正惱人的是——程式碼其實沒問題。它能跑,功能也正常,沒有人抱怨。但每次我打開那個檔案,都會有一種說不上來的焦慮感,就像走進一個你只是把東西全塞進衣櫃裡、表面上整理過的房間。技術上是整潔的,精神上卻不對勁。
所以某個下午,我就只是……開始刪東西。沒有計畫。只有我、一個 Delete 鍵,還有越來越強烈的感覺:我接受了很多其實並不真正理解的程式碼。
這讓我很意外。我其實不太會被程式碼嚇到。但我一直把滑鼠懸在某些地方,心裡想著:「好吧,但萬一這個東西正是整個系統能運作的關鍵,而我還不知道呢?」
那種感覺?那正是我自己寫程式時從來不會有的感覺。當你是親手寫出來的人,你腦中會保留整張地圖。你記得那晚你加了那個防禦性的 nil 檢查,因為測試時某個東西炸掉了。你記得這個函式為什麼要這樣組織,因為你重構了兩次。你有上下文。
但對生成出來的程式碼來說,程式碼到了,上下文卻沒跟著來。AI 做了決策——其中有些其實是真的好決策——而我在不理解它們「為什麼」是那些決策的情況下就接受了。於是六週後,我站在這裡,像個陌生人一樣看著自己的專案,努力分辨哪些部分是承重牆,哪些只是裝飾。
這種不自在程度,完全跟你想像的一樣。
在刪任何東西之前,我開始問自己:好,如果我把這個拿掉,我覺得會壞掉什麼?不是理論上可能壞掉什麼,而是我「認為」具體會發生什麼。
有些預測是對的。刪掉之後證實它就是冗餘的。很好,簡單。
有些預測則以很有意思的方式錯了。有一個函式,我非常確定它完全沒在做什麼有用的事——看起來就像是模型裡順手加上去的——結果我把它刪掉之後,某個我幾乎忘了的流程裡,一個非常特定的邊界情況就悄悄地壞掉了。原來那個函式是在處理一個 nil,而這個 nil 只有在某個特定的使用者操作順序下才會出現,而我一時之間根本想不起來自己有寫過這種流程。
那個函式教了我一件我不知道自己不知道的事。這是最煩人的學習方式,但也是最有用的。
少了 200 行。有些是真的冗餘——重複的邏輯、針對根本不可能發生情況的防禦性檢查、那種只會被呼叫一次、其實用到的地方直接寫成一行就好的 helper 函式。這類東西是因為「周全」才加上去的,不是因為它真正了解你的專案需要什麼。
有些我則是從頭重寫。不是因為原本的寫法錯了,而是因為重寫讓我終於真正「擁有」它。管理一段程式碼,和理解一段程式碼,是兩件不同的事;在我能放心地繼續處理它之前,我需要先把這個落差補起來。
有些我則是原封不動地保留了。因為當我試著刪掉它,看到空出來的位置時,我才發現它其實在做某件我真的需要的事,而我只是一直沒認真注意到。老實說,那些才是最有價值的刪除——那些我想移除某個東西,結果專案反過來跟我說:「不,你需要它,讓我示範給你看為什麼。」
有件事沒人會告訴你:快速生成程式碼的速度是真的,但它有代價,而且這個代價不會在你發佈功能的那天顯現。它會在之後才出現。當你需要修改某些東西、除錯奇怪問題、向別人解釋這個功能、或者只是六週後打開檔案,感受到那種「衣櫃裡塞滿雜物」的焦慮時,它就出現了。
你每接受一行你不理解的程式碼,都是在借一筆小額貸款。利息會安靜地複利,直到你下次真的要碰它。
刪除程式碼——也就是認真讀它,讀到你能對它是否應該存在有意見——是償還這筆債最奇怪、也最有效的方法之一。你不可能刪掉某個東西,卻還不理解它到足以替它辯護或反對。這也表示,等你做完這件事,你會被迫真的去學你以為自己已經懂了的程式碼庫。
我原本是來整理的,結果上了堂課。雖然有點違背我的意願,但還是學到了。
我沒有停止用 AI 生成程式碼。那樣反應太過頭了,而且我還有交付期限。不過我開始把那些被我接受的建議,當成是我選擇承擔的債務,而不是我自己寫的程式碼。因為只要我之後還要碰它,我就需要理解它——如果我從來沒仔細讀過,那種理解不會因為我當時在場看著它被生成出來就自動出現。
所以現在,我偶爾會打開一個我快速生成、而且之後很久都沒仔細看過的檔案。我把它當成別人的程式碼來讀。我會試著刪東西。我會預測我覺得哪裡會壞掉,然後看我對不對。
有時候我對了。有時候我錯得剛剛好,而那些錯誤正好教會我一些東西。
不管怎樣,我最後對這個程式碼庫的理解,都比一開始更深了。
老實說,這點比我生成它的那個下午,學到的還多。
AI 工具曾用於協助文法與結構。