從《人月神(shen)話》看AIGC是(shi)否是(shi)軟件開發的銀彈
大家好,我是Edison。
最近閱讀了鐘敬老師的特別策劃系列文章《AI時(shi)代程序(xu)員(yuan)生(sheng)存之(zhi)(zhi)道(dao)(dao)》,里面從《人月神話》的(de)視角來討論AIGC對于輔助軟件(jian)開發的(de)能力邊界(jie) 和 程序(xu)員(yuan)的(de)生(sheng)存之(zhi)(zhi)道(dao)(dao),特別(bie)有意思,我將其核心(xin)內(nei)容整理了一下分(fen)享與你!
《人月神話》中銀彈到底是什么意思?

作為一個軟件開發從業者,我想大多數都應該聽說過《人月神話》(作者:Brooks)這本書,里面的“沒有銀彈”的觀點更是深入人心。不過,這里我們還是再溫習一下“沒有銀彈”是什么意思。“沒有銀彈”在原書中指“無論在技術還是管理方法上,都看不出任何突破性的進步,能夠獨自保證在十年內大幅度地提高軟件生產率、可靠性和簡潔性”。
Brooks在這兒說的大幅度是相對于硬件發展來說的。換句話說,是像摩爾定律那樣的硬件能力的指數級增長,而這種發展在軟件開發中并沒有發生。Brooks用(yong)“銀彈”來(lai)比喻軟件開發,是來(lai)源于(yu)歐洲(zhou)狼(lang)人的(de)(de)傳(chuan)說,它指的(de)(de)是軟件開發有時候具有狼(lang)人的(de)(de)特點。例(li)如,一(yi)(yi)個(ge)軟件項目(mu),看(kan)起(qi)來(lai)需求已經被充(chong)分理解了(le),進度也(ye)滿足預期(qi)(qi),但是可能忽(hu)然(ran)間(jian)變得錯誤百出(chu),Bug越改越多,進而大大超出(chu)工(gong)期(qi)(qi)和成本(ben),就好像一(yi)(yi)個(ge)看(kan)起(qi)來(lai)正常的(de)(de)人,突然(ran)就變成了(le)狼(lang)一(yi)(yi)樣。
這種現象(xiang)也造成(cheng)了當(dang)時業(ye)界所謂(wei)的“軟件危機”,而這也是軟件工程產生的背(bei)景(jing)或原因。在狼人(ren)的傳說(shuo)中,只(zhi)有銀質的子彈(dan)才(cai)能打死狼人(ren)。
因此,Brooks才將突破性的軟件開發技術比喻為“銀彈”。
軟件開發的本質困難和非本質困難
Brooks將軟件開發面臨的困難劃分為了 本質困難(Essence)和 非本質困難(Accident)。那(nei)么,本(ben)質(zhi)(zhi) 和 非本(ben)質(zhi)(zhi) 到底是什么意思?
Brooks說(shuo)這(zhe)一(yi)對術語來源于亞里士多德的(de)(de)哲學,用通俗易懂的(de)(de)話來舉個(ge)例子吧(ba),例如(ru),人(ren)類是胎(tai)生的(de)(de),是有智慧的(de)(de),這(zhe)些(xie)就是人(ren)的(de)(de)本質屬(shu)(shu)性,它(ta)們是必然存(cun)在(zai)的(de)(de),如(ru)果(guo)沒有這(zhe)些(xie)屬(shu)(shu)性,人(ren)類就不是人(ren)類了。另一(yi)方面,人(ren)的(de)(de)年齡、體重(zhong)、健康狀況等則是會發生改(gai)變的(de)(de),比如(ru)說(shuo)疾病,是可以消除的(de)(de),因此它(ta)們是非本質屬(shu)(shu)性。
基于(yu)對本質屬性(xing)和非本質屬性(xing)的(de)理解,Brooks認(ren)為(wei):
(1)即使技術進步了,也不能消除的困難 就是 本質困難,這是軟件開發的本質所決定的。
軟件開發的本(ben)質困難被總結為了(le)5點:復雜性(xing)、一致性(xing)、可變性(xing)、不可見(jian)性(xing) 以及 社會性(xing)。
所謂復雜性(xing)(xing),指軟(ruan)件(jian)幾乎是最(zui)復雜的(de)人類產品。一方面(mian)是業(ye)務需求(qiu)本身(shen)的(de)復雜性(xing)(xing),另一方面(mian)則是技術實現的(de)復雜性(xing)(xing),最(zui)終軟(ruan)件(jian)系統(tong)的(de)復雜性(xing)(xing)則是兩者的(de)疊加。
所(suo)(suo)謂一(yi)致(zhi)性(xing),指為了軟件正常運(yun)行,軟件開發人員必(bi)須和各(ge)種人為的(de)(de)不(bu)(bu)(bu)(bu)一(yi)致(zhi)性(xing)做(zuo)斗爭,這(zhe)些(xie)不(bu)(bu)(bu)(bu)一(yi)致(zhi)的(de)(de)產生僅(jin)僅(jin)是(shi)(shi)因為不(bu)(bu)(bu)(bu)同(tong)(tong)的(de)(de)人、不(bu)(bu)(bu)(bu)同(tong)(tong)時間、基于不(bu)(bu)(bu)(bu)同(tong)(tong)的(de)(de)理解所(suo)(suo)造成的(de)(de)。一(yi)方面是(shi)(shi)保持業務概念(nian)的(de)(de)一(yi)致(zhi)性(xing),另(ling)一(yi)方面則(ze)是(shi)(shi)技術實(shi)現的(de)(de)一(yi)致(zhi)性(xing)。
所謂(wei)可變性,指軟件(jian)常(chang)常(chang)會面臨(lin)頻繁(fan)的需求變化。這一(yi)點和建筑蓋樓完全不同(tong),蓋樓是永恒是主題(ti),而軟件(jian)是變化是主題(ti)。
所謂不(bu)可(ke)見性,指(zhi)盡管可(ke)以(yi)通(tong)過一些技術將部分設(she)計內容可(ke)視(shi)化,但軟件內部在(zai)本質上是不(bu)可(ke)見的。也(ye)就是說(shuo),即使你(ni)把(ba)電腦拆了,也(ye)不(bu)可(ke)能看到軟件的結(jie)構。
綜述(shu),Brooks認為無(wu)論(lun)技(ji)術怎樣發展(zhan),這4點困(kun)難在軟件開(kai)發中是不可(ke)能(neng)完全消除(chu)的,因此屬于(yu)本質困(kun)難。
除了以上4點,鐘敬老師補(bu)充了一個 社會(hui)性(xing)。
所謂社(she)(she)會性,是指(zhi)軟(ruan)件(jian)開(kai)發實際上(shang)是一個社(she)(she)會工程(cheng),是一種(zhong)群體行為,涉及到(dao)人的(de)組織、溝通、協作 以及 心理問題。過去,這(zhe)種(zhong)群體行為還只局(ju)限在開(kai)發人員和業務人員,而(er)(er)隨著數字化(hua)轉型的(de)發展(zhan),IT逐(zhu)漸(jian)變成企業的(de)核心競爭力(li),這(zhe)種(zhong)群體行為就(jiu)擴(kuo)展(zhan)到(dao)了整個企業甚至企業之外(wai)。然而(er)(er),這(zhe)種(zhong)社(she)(she)會性,并沒有隨著技術的(de)發展(zhan)而(er)(er)消失,它也算是一個軟(ruan)件(jian)開(kai)發的(de)本質困難。
(2)可以通過技術的進步而消除的困難 就是 非本質困難。
軟件開發(fa)的非本質困難主(zhu)要是關于開發(fa)語言、開發(fa)工具、基礎(chu)設(she)施等方(fang)面的困難。
比(bi)如,計(ji)(ji)算機語(yu)(yu)言(yan)從機器語(yu)(yu)言(yan)到匯編語(yu)(yu)言(yan)到高(gao)級語(yu)(yu)言(yan),再到目前流行起來的低代碼(ma),它們(men)都是(shi)(shi)計(ji)(ji)算機語(yu)(yu)言(yan)的進展,在形式(shi)和(he)深(shen)度上(shang)有所不同,但解(jie)決(jue)的仍然是(shi)(shi)非本質困(kun)難。又(you)如,云計(ji)(ji)算的進展,將應用放到云上(shang),開發和(he)運維(wei)人員(yuan)在維(wei)護(hu)機房、申請設(she)備等繁瑣工作(zuo)上(shang)的投入就(jiu)會大大減輕甚(shen)至消失,因此解(jie)決(jue)的也是(shi)(shi)非本質困(kun)難。但是,雖然這(zhe)些(xie)技(ji)術(shu)不能解決本(ben)質(zhi)困難(nan),但也不是一無是處,它們在(zai)推動著軟件生產(chan)率(lv)平緩地逐年增(zeng)高,因此Brooks將(jiang)這(zhe)些(xie)技(ji)術(shu)稱為(wei)“銅質(zhi)子彈(dan)”或“銅彈(dan)”。
畫外音> 從某個角度來看,軟件開發的歷史,就是代碼越來越“低”的歷史。C語言比匯編語言“低”,Java/C#比C語言“低”,現在的低代碼如Mendix, PowerPlatform 又比 Java/C# “低”。而ChatGPT寫程序,則是從另一個層面,使得軟件開發的難度更低。
在《人月神話(hua)》中(zhong)Brooks發(fa)現(xian):當時軟件開發(fa)技(ji)術的(de)(de)進步,主(zhu)要解決(jue)的(de)(de)都是非(fei)本(ben)質困難。他(ta)說“除非(fei)非(fei)本(ben)質任(ren)務占了(le)所有(you)工作(zuo)的(de)(de)9/10,否則即使全(quan)部非(fei)本(ben)質任(ren)務的(de)(de)時間(jian)縮(suo)減到0,也不會帶來生產(chan)率數量級上的(de)(de)提高。”
那么(me),你(ni)可能會(hui)問,現在都2025年了(le),AIGC/LLM已(yi)經(jing)發展的很(hen)成熟(shu)了(le),AIGC是否已(yi)經(jing)可以說是軟件開發的“銀彈”了(le)?別急,下面我們來看看。
AIGC是軟件開發的“銀彈”嗎?
要論證這個問(wen)題,我們需要結合之前的軟件開發的本質(zhi)困難來(lai)看。
(1)復(fu)雜性從(cong)需(xu)求(qiu)的角度來看(kan),目(mu)前AI還(huan)無法降(jiang)低需(xu)求(qiu)本身的復雜度。相反,AI軟(ruan)件(jian)本身所依賴的技術(shu)如(ru)機器(qi)學習、神(shen)經(jing)網(wang)絡等,還(huan)增加了技術(shu)上的復雜性(xing)。因此,AI還(huan)無法降(jiang)低軟(ruan)件(jian)的復雜性(xing)。
(2)一致性相對于(yu)技術上的(de)(de)不一致性(xing),真(zhen)正難解決的(de)(de)是軟件中包含的(de)(de)業務概念的(de)(de)不一致性(xing)。這種(zhong)不一致,要么引起隱(yin)含的(de)(de)邏輯錯誤,要么導致程序(xu)復雜,難以維護。目前,我們還看不到AI在這方面的(de)(de)作用。
(3)可(ke)變性AI輔助軟件開發(fa)并(bing)不會(hui)減少業務需求本身(shen)的(de)頻繁變(bian)(bian)化(hua)(hua)。變(bian)(bian)化(hua)(hua)是軟件的(de)主題,永恒(heng)是建筑的(de)主題。
(4)不可見性其實AI本身就有一個固有問題,那就是AI的“不可解釋性”。當ChatGPT或Copilot回答問題時,我們無法找到這種意義上的確鑿的因果關系,因此無法對AI的行為作出準確的解釋。當 AI 廣泛應用于軟(ruan)(ruan)件后,這種不(bu)可解釋性(xing)會加劇軟(ruan)(ruan)件的不(bu)可見性(xing)。
(5)社(she)會性(xing)目前AI還是無法代替人與人之間的溝通,因此無法消除(chu)社會(hui)性(xing)。
(6)結果正確性除了以(yi)上針對軟件開發本(ben)質困難的(de)(de)分析以(yi)外,AI自身還有(you)一(yi)個(ge)固有(you)的(de)(de)局限性(xing),即AI產(chan)生的(de)(de)內容,既不(bu)(bu)能(neng)保證(zheng)是(shi)正確的(de)(de),也(ye)不(bu)(bu)能(neng)保證(zheng)是(shi)最(zui)優的(de)(de),有(you)時候常常“一(yi)本(ben)正經的(de)(de)胡說八道”。綜上所述,目前的(de)AI還(huan)不(bu)大可能是(shi)“銀彈(dan)”,但是(shi)不(bu)代(dai)表AI沒(mei)用,事實上已經在下面多個方面幫助(zhu)我們(men)更加高(gao)效地開發軟件了,可以(yi)稱得(de)上是(shi)一枚“銅彈(dan)”!
- 幫助(zhu)開發人員完成重復性和套路性的(de)工作
- 幫助開發(fa)人員完(wan)成那些了解原理但是忘(wang)記(ji)了技(ji)術細節的代碼
- 幫助開發人員(yuan)提(ti)高(gao)學習新知識(比(bi)如某個JavaScript框架)的速(su)度
- 幫助(zhu)開發人員快速獲(huo)取他人的經驗(畢(bi)竟AI學習了大量他人的代碼)
如何對抗軟件開發的本質困難?
在軟件開發業界的發展歷程中,已經有了兩個重要的對抗軟件開發本質困難的方法論,它們是:敏(min)捷軟件開(kai)發 和 領域驅動設(she)計(ji)。
(1)敏捷軟件(jian)開發
敏捷軟件(jian)開發(fa)針對的(de)主(zhu)要是(shi)本質困(kun)難中(zhong)的(de)復雜性、可變(bian)性和(he)社(she)會性。一方(fang)(fang)(fang)面(mian),通(tong)過迭(die)代的(de)方(fang)(fang)(fang)式,讓軟件(jian)能(neng)夠演進式地(di)“生(sheng)長”,將(jiang)軟件(jian)的(de)復雜性和(he)可變(bian)性帶(dai)來的(de)困(kun)難和(he)風(feng)險分散(san)在整個(ge)軟件(jian)生(sheng)命周期中(zhong)。另一方(fang)(fang)(fang)面(mian),通(tong)過強(qiang)調軟件(jian)開發(fa)過程中(zhong)“人(ren)”的(de)方(fang)(fang)(fang)面(mian),提(ti)供一系(xi)列方(fang)(fang)(fang)法和(he)技(ji)術提(ti)高溝通(tong)效(xiao)率,改善人(ren)員(yuan)組織,還強(qiang)調培養卓(zhuo)越技(ji)術的(de)開發(fa)人(ren)員(yuan)。
(2)領(ling)域驅(qu)動(dong)設計(ji)
領(ling)域驅(qu)動設計,俗稱DDD,它是面向對(dui)象方(fang)(fang)法論的(de)一(yi)(yi)種(zhong)優化,針對(dui)的(de)主要是本質困難中的(de)復雜性、一(yi)(yi)致(zhi)性 和 不可見性。一(yi)(yi)方(fang)(fang)面,通過建立領(ling)域模型,準確、深刻地(di)反映業務(wu)概念。另一(yi)(yi)方(fang)(fang)面,圍繞領(ling)域模型圖,業務(wu)專家和開發人員逐漸(jian)建立統一(yi)(yi)語言(yan),然后再進行開發,還提(ti)供了一(yi)(yi)系(xi)列的(de)概念和方(fang)(fang)法輔助更加貼近業務(wu)概念的(de)開發。
AIGC時代,程序員應該如何發展?
在AIGC時(shi)代,程序員應(ying)該如何發(fa)展,保住自己(ji)的飯(fan)碗,提升(sheng)自己(ji)的核心(xin)競(jing)爭力,這是一個值得思考的話題。
要(yao)回答這個問題,需要(yao)總(zong)結下(xia)目(mu)前AI能做什么 以及 還(huan)做不好什么。

從上面的表格中我(wo)們可以知道,那些只會(hui)完成基(ji)礎(chu)功能(neng),但結構混亂,難(nan)以理(li)解和維護代碼的初級程序員(yuan)可能(neng)會(hui)沒有(you)多少生存空間了。
作(zuo)為(wei)想要(yao)保住(zhu)飯碗又持(chi)續(xu)精進的(de)程(cheng)序員,需要(yao)加強以下的(de)能(neng)力:
(1)加強業務需求理解的能力
比如使用DDD方法論(lun),貼近業務(wu),建立領域模型表達業務(wu),和(he)業務(wu)用戶(hu)建立統一語言,然(ran)后(hou)基于模型驅動開發。
畫外音>DDD是技術,也是藝術!DDD解決的就是軟件開發的本質問題,通過可視化、抽象化、嚴格化的方法構建領域模型的藝術,現在還沒有被AI所取代。But,未來AI能夠掌握這項“藝術”嗎?我們都不確定,或許將來某天它能掌握,不過那時候可能失業的就不只是開發人員了!
(2)熟練使用AI工具高效工作 和 快速學習
比如持(chi)續(xu)實踐提示詞工(gong)程,提高AIGC答案(an)的貼合度。又如善用AI加快自(zi)己學習(xi)新框架(jia)或新技術的效率,完(wan)成(cheng)項目任(ren)務(wu)。
(3)加強評審和驗證AI生成代碼的能力
AI生成(cheng)的(de)代碼不一定(ding)(ding)是正確的(de),也不一定(ding)(ding)是最優的(de),這(zhe)還(huan)是需要(yao)開(kai)發(fa)人員(yuan)具備評審能力(li)(li)(li),以及(ji)進一步優化(hua)代碼的(de)能力(li)(li)(li)。而這(zhe)些能力(li)(li)(li),其(qi)實(shi)還(huan)是開(kai)發(fa)人員(yuan)的(de)手藝活兒,比如(ru)面向對象、設計模式、整潔代碼、重(zhong)構等(deng)等(deng)。
(4)夯實開發技術的基本原理(而不是技術細節)
比如你已經(jing)了(le)(le)解(jie)(jie)了(le)(le)某(mou)個JavaScript框架(jia)(如VueJS)的(de)基本原理(li),只是忘記了(le)(le)具(ju)體的(de)語法(fa)細(xi)節,那么就非(fei)常適(shi)合在(zai)AI輔(fu)助下(xia)開發(fa)VueJS的(de)應用程序。但是,如果你一點都(dou)不(bu)了(le)(le)解(jie)(jie)其原理(li),甚至JavaScript也不(bu)會(hui),那么即使有AI的(de)幫助,也難以達成目的(de),容易寫(xie)出難以理(li)解(jie)(jie)和(he)維護的(de)“屎山”。
畫外音>這也提示我們,將來學習一門新技術的時候,可以將重點放在對原理的理解,而不是花較多時間記憶技術細節。
綜上所述,開發人員要有緊迫感,但也不必過于緊張,這里借用毛主席的一句話“戰略上藐視敵人,戰術上重視敵人”。
一方面不用太緊張,我(wo)(wo)們(men)需要看到(dao)AI的(de)影響是漸(jian)進的(de),我(wo)(wo)們(men)有時間去掌握。另一方面我(wo)(wo)們(men)需要現在就開始行動(dong),主(zhu)動(dong)關(guan)注AI技術的(de)發展,最好盡快進行嘗試,動(dong)起來,在路(lu)上(shang)!
參考內容
鐘(zhong)敬,《AI是銀彈么?》
鐘(zhong)敬,《AI時代(dai)程序員生(sheng)存(cun)之道》
鐘(zhong)敬,《DDD,是技(ji)術也是藝(yi)術》
推(tui)薦學(xue)習
歡迎和我一起學習《手把手教你落地DDD》!


作者:
出處:
本(ben)文版權(quan)歸作(zuo)者和博客(ke)園共有,歡迎轉載,但未經作(zuo)者同(tong)意必須保留(liu)此段(duan)聲明(ming),且在(zai)文章頁面明(ming)顯位置給出原文鏈(lian)接。

最近閱讀了鐘敬老師的特別策劃系列文章《AI時代程序員生存之道》,里面從《人月神話》的視角來討論AIGC對于輔助軟件開發的能力邊界 和 程序員的生存之道,特別有意思,我將其核心內容整理了一下分享與你!