不可能的 Vibe Coding
其一
大語言模型在解決編程問題時,往往傾向給出一個平凡、自然而然的答案,而非特殊化的答案。
舉一個實際的例子:假設我提出向大語言模型提出「使用 NodeJS 在屏幕上輸出『hello』」的要求,它給出的答案很可能是這樣的:
console.log("hello");
在一般意義上,這是「正確」的,這也是我們很自然就能想到的答案,但如果我們回到我們的要求,觀察要求本身,其實際上並不指向於一種唯一的解釋。「屏幕」是什麼?「輸出」指什麼?就這個要求本身而言,其可以被合理地解釋成在標準輸出中輸出「hello」,同理其似乎也能合理解釋為使用 Qt 控件顯示出「hello」,這裏完全沒有一個正確與否之分,所謂正確完全取決於你到底想要什麼1。
大語言模型無法讀取你的大腦,它會給出某種統計學規則認為正確的答案,並且抹殺其他答案,但這個答案很可能未必是你想要的——如果你想要些什麼,你就需要不斷說話,不斷說出你的要求。
其二
如果一個程序員不是因為工作而必須寫代碼,那麼它寫代碼很可能並不為了什麼,僅僅只是「Just for Fun」2,就像是某種自言自語——雖然我不知道誰在看着,但我想要不停地說,我要在這裏孕育出一些什麼東西,儘管我無法描述它,但我想要創作出些什麼。
在這個意義上,大語言模型是無法代勞這一工作的,甚至我還需要把大語言模型從這裏驅逐出去,因為重點不在那兒。
哦不!大語言模型!請不要阻止我說話!
即便是寫出屎山——恰恰是因為寫出屎山,以後才有些什麼可寫。
其三
就我而言,使用大語言模型寫程序的情況大概率是這樣的:我要求大語言模型實現某個模塊,它給出一個主幹是我想要的,但細節不太對的實現,然後我需要讀它寫的代碼,再自己動手改掉不想要的部分。整個過程堪比改別人寫的屎山代碼,視乎其腦死程度,可能會比自己寫代碼還累。
當然,這很可能是因為我沒有提供足夠的上下文來詳盡代碼細節,在細節充足的情況下,大語言模型確實很可能會一步到位輸出讓你滿意的代碼,但這種情況基本上就約等於我在寫偽代碼,然後讓大語言模型充當翻譯器,那我用大語言模型折騰個什麼勁?我直接寫不就好了嗎?
話雖如此,大語言模型確實在寫樣板代碼的時候表現良好,比如說某種重複性的 CURD 接口。在你示範第一個該怎麼寫後,利用大語言模型拓展出十個百個來是很簡單的,但這種需求在我看來是有點矛盾的,因為如果一些代碼遵循某種相同的模式,很可能抽象這個過程才是比較好的解決方案。
悄悄話
-
注意,這並不是一個用詞精確與否的問題,並不是說使用像「標準輸出」那樣的術語就不會產生如此問題,而是你提出的要求總是會有無法覆蓋的部分。即便使用精確的術語,如「實現一個類型簽名為
fib :: Integer -> Integer的函數計算 Fibonacci 數列的某項」,也無法完全說清楚你的要求——這個函數實現可以是定義式的fib n = fib (n - 1) + fib (n - 2),也可以是帶記憶的快速 Fibonacci。 ↩ -
《Just for Fun》 是 Linus Torvalds 的一本自傳。其實我沒有看過這本書,僅僅是寫到這裏的時候想到有這麼一本書,並覺得在這個場合引用這個書名是一個絕妙的雙關。 ↩