寫程式碼從來不是瓶頸:LLM時代的軟體開發挑戰

寫程式碼從來不是瓶頸:LLM時代的軟體開發挑戰
Photo by Ilya Pavlov / Unsplash

多年來,我始終認為在軟體工程中,撰寫程式碼的行數從來都不是真正的瓶頸所在。

真正的瓶頸過去是,現在依然是程式碼審查、透過指導和配對進行的知識傳遞測試偵錯,以及協調與溝通的人為成本。所有這些都被包裹在工作票、規劃會議和敏捷儀式的迷宮中。

這些原本旨在提升品質的流程,往往比撰寫程式碼本身更能拖慢我們的速度,因為它們需要思考、共享理解和健全的判斷力。

如今,隨著大型語言模型(LLMs)使生成可運行程式碼變得比以往更快,一種新的說法出現了:撰寫程式碼曾經是瓶頸,而我們終於突破了它。

但這種說法並不完全正確

新增軟體的邊際成本正趨近於,尤其是有了LLMs的幫助。但理解測試信任該程式碼的代價是什麼?比以往更高

LLMs轉移了工作負載——而非消除它

Claude這樣的工具可以加快初始實現速度。但結果往往是更多的程式碼流入系統,以及對負責審查、整合和維護它的人員施加更大壓力。

這在以下情況尤為明顯:

  • 不清楚作者是否完全理解他們提交的內容。
  • 生成的程式碼引入了不熟悉的模式或違反了既定慣例。
  • 邊緣案例和非預期的副作用並不明顯。

我們最終陷入這樣一種情況:程式碼變得更容易生成,但更難驗證,這並不一定能讓團隊整體移動得更快。

這不是新挑戰。開發人員長期以來一直在調侃「複製貼上工程」,但LLMs所實現的速度和規模放大了這些複製貼上的習慣

理解程式碼仍然是最難的部分

「程式碼最大的成本是理解它——而非撰寫它。」

LLMs減少了生成程式碼所需的時間,但它們並未改變推理行為、識別細微錯誤或確保長期可維護性所需的努力。當審查者難以區分生成和手寫的程式碼,或理解為何選擇特定解決方案時,這項工作可能會更加困難。

團隊仍然依賴信任和共享背景

軟體工程一直是協作性的。它依賴於共享理解一致性指導。然而,當程式碼生成的速度快於討論或審查的速度時,團隊就有可能陷入一種假定品質而非確保品質的模式。這會給審查者和指導者帶來壓力,可能會以更微妙的方式減慢進度。

LLMs功能強大——但它們無法修復基本面

更快的原型設計、腳手架和自動化確實具有真正的價值。但是,LLMs並不能消除對清晰思考仔細審查深思熟慮的設計的需求。如果說有什麼區別的話,那就是隨著生成更多的程式碼,這些需求變得更加重要。

是的,編寫程式碼的成本確實下降了。但是,作為一個團隊共同理解它的成本並沒有下降。

那才是瓶頸所在。讓我們不要假裝它不存在。

人類協作:LLM時代的新挑戰

對於可能不太熟悉這個主題的讀者來說,讓我們進一步解釋為什麼這很重要。想像一下,您正在建造一棟房子。LLMs就像是一台能夠快速生產磚塊和材料的機器。過去,製作這些材料可能需要時間和努力,但實際建造房子的挑戰在於如何將它們放在一起,如何確保結構穩固,以及如何使各個部分協調工作。

在軟體世界中,程式碼行是我們的基本構建塊。當這些構建塊變得廉價且容易獲取時,我們面臨的真正問題是:

  • 品質控制:我們如何確保這些自動生成的構建塊符合我們的標準?
  • 系統理解:開發人員是否真正理解他們正在組合的部分?
  • 整合複雜性:程式碼數量增加會導致互動增加,從而增加複雜性。

當我們使用LLMs等工具,很容易認為我們的生產力激增,因為我們可以快速生成程式碼。但現實是,軟體開發的最大挑戰一直是,也將繼續是人際溝通和協作

在這個AI輔助開發的新時代,最成功的團隊不會只是那些生成最多程式碼的團隊。而是那些最善於:

  • 建立使AI合作夥伴能夠增強而非取代人類判斷的工作流程
  • 維持清晰的架構和命名規範,使生成的程式碼更容易理解
  • 投資於培訓開發人員在理解和整合生成的程式碼方面的技能
  • 認識到審查、討論和適當測試的價值超過了「馬上完成」的速度

換句話說,速度一直是一個誤導性的指標。真正的衡量標準應該是:我們能否生產出既可靠又可維護的軟體,能讓使用者滿意並有效解決問題?

隨著我們擁抱LLMs的強大能力,讓我們記住,編程的真正藝術不僅僅在於生成程式碼,而是在於創建有意義的解決方案,這些解決方案能夠隨著時間的推移而發展並被人類理解。

Read more

當輸入為空:探討技術開發中的空值處理與意義

當輸入為空:探討技術開發中的空值處理與意義

在軟體開發的世界裡,我們經常會遇到一個看似簡單卻深具哲學意味的問題:當輸入為空時,我們該如何處理?這個問題不僅是技術層面的挑戰,更反映了我們對於「無」這個概念的理解。今天,讓我們深入探討這個在程式設計中無處不在,卻又常被忽視的重要議題。 空值的本質:從哲學到程式碼 當我們談論「空」時,我們究竟在談論什麼?在程式設計的領域中,空值可以有多種表現形式:null、undefined、空字串、空陣列、空物件等等。每一種形式都代表著不同的含義和使用情境。null 通常表示「有意的空缺」,代表我們知道這個位置應該有值,但目前沒有;而 undefined 則更像是「尚未定義」,暗示著這個變數可能還沒被初始化或賦值。這種微妙的差異在實際開發中至關重要,因為它們會影響我們如何設計 API、如何處理錯誤,以及如何與使用者溝通。在東方哲學中,「空」並非單純的虛無,而是一種充滿可能性的狀態,就像老子所說的「無為而無不為」。同樣地,在程式設計中,正確處理空值往往能為系統帶來更大的靈活性和健壯性。當我們面對一個空的輸入時,

By Eric Lau
AI 是否做得越來越少?從全自動到混合架構的演化之路

AI 是否做得越來越少?從全自動到混合架構的演化之路

當我們談論人工智慧的進步時,通常期待它能處理越來越多的任務。但在實際應用中,一個有趣的現象正在發生:許多開發者發現,隨著 AI 系統的成熟,真正需要 AI 介入的部分反而越來越少。這不是退步,而是一種更精明的進化。本文將深入探討這個看似矛盾的趨勢,以及它對未來 AI 應用開發的啟示。 從完全依賴 AI 到混合架構的轉變 六個月前,當開發者開始建構 AI 代理系統時,最直覺的做法是讓大型語言模型(LLM)處理所有事情。每一個任務、每一個決策點都交給 AI 來判斷和執行。這種做法看似充分利用了 AI 的能力,但實際運作後卻發現了許多問題。LLM 確實會自信地推進各項任務,但準確性並不總是令人滿意。更重要的是,這種全 AI 的架構在成本、速度和可預測性上都存在明顯的瓶頸。於是,一個重要的轉變開始發生:開發者逐漸意識到,不是所有任務都需要 AI 的「智慧」

By Eric Lau
代理商務守門問題:平台如何成為新時代的聚合者

代理商務守門問題:平台如何成為新時代的聚合者

在電商與人工智慧交織的新時代,我們正見證一個前所未有的變革:代理商務協議的崛起。但這場變革背後,隱藏著一個值得深思的問題——那些曾經標榜開放、賦能商家的平台,正悄然轉變為控制流量與數據的聚合者。這不是陰謀論,而是商業邏輯演進的必然結果。當 Shopify、Stripe 這些我們熟悉的平台開始在 AI 購物表面扮演中介角色時,商家們需要清醒地認識到:你要麼掌握自己的命運,要麼成為別人棋盤上的棋子。 代理商務協議的新遊戲規則:開放但我先行 讓我們先理解一個基本事實:今天的代理商務協議與過去的網際網路標準有著根本性的不同。回想 TCP/IP 這個支撐整個網際網路通訊的核心協議,它經歷了委員會討論、RFC 文件、多年的審議過程。那個年代的開放標準是真正「民主」的,在公開透明的環境中發展。但在當今的 AI 場景中,協議的演進方式已經完全改變了。 無論是 OpenAI 的代理商務協議(ACP)還是 Google 的通用商務協議(UCP),它們從一開始就帶著完整的合作夥伴生態系統登場。OpenAI 與

By Eric Lau
當輸入為空時:探討系統邊界條件處理的藝術

當輸入為空時:探討系統邊界條件處理的藝術

在軟體開發的世界裡,我們經常專注於處理正常的業務邏輯和功能需求,卻容易忽略一個至關重要的問題:當系統接收到空值或無效輸入時,應該如何反應?這個看似簡單的問題,實際上揭示了軟體設計中最基本卻也最容易被忽視的一個面向。今天,讓我們深入探討當輸入為空時,技術系統應該如何優雅地處理這種邊界條件,以及這對整體系統設計的深遠影響。 理解空值的本質與意義 空值並不僅僅是「什麼都沒有」這麼簡單。在不同的程式語言和系統架構中,空值可能代表著截然不同的意義。在某些情況下,它可能表示資料尚未被初始化;在另一些場景中,它可能意味著使用者刻意選擇不提供任何資訊;還有時候,它可能是系統錯誤或網路中斷的結果。這種多重性使得空值處理成為一門需要細緻思考的藝術。從技術角度來看,空值可能以多種形式出現:null、undefined、空字串、空陣列、空物件等等。每一種形式都有其特定的使用場景和處理方式。優秀的開發者需要能夠區分這些不同類型的空值,並根據具體情況採取適當的處理策略。更重要的是,我們需要理解空值在業務邏輯中的含義,而不僅僅是從技術層面來看待它。例如,在電子商務系統中,購物車為空可能意味著新用戶剛進入網站,

By Eric Lau