某種程度上拍顷,我們這幾代的軟件工程師,都是馮諾依曼(Von Neumann)架構(gòu)的既得利益者塘幅。但紅利正在消失昔案。這個架構(gòu)被“隱藏”了,以大語言模型為“中央處理器”的“自然語言計算機(jī)”正在出現(xiàn)晌块,“古典”意義上的軟件工程師職業(yè)還將存在多久隔显?
本文轉(zhuǎn)發(fā)至 FinClip blog
現(xiàn)代軟件工程師的職業(yè)胰默,本質(zhì)上是靠吃著馮諾依曼(von Neumann)架構(gòu)的紅利而存在(感謝祖師爺賞飯吃)绿贞。我們不過是計算機(jī)指令與數(shù)據(jù)的搬運(yùn)工晴竞,通過寫代碼宛蚓,把字節(jié)從二級存儲搬到內(nèi)存,然后又搬到寄存器挎狸,再搬到中央處理器部翘,最后又把運(yùn)算結(jié)果搬回去。后來有了網(wǎng)絡(luò)珍促,于是又多了把字節(jié)從這臺計算機(jī)搬到那臺計算機(jī)的工作铃辖。
為什么只有少數(shù)人能干這搬運(yùn)工的活?因?yàn)榇蟛糠秩烁悴磺宄@些中央處理器猪叙、存儲器娇斩、寄存器。受過專業(yè)訓(xùn)練的碼農(nóng)才知道怎么搬穴翩。而其中水平比較高的犬第,則知道用堆、用棧芒帕、用多線程歉嗓、用隊(duì)列、用各種算法和工具去搬的比較快背蟆、比較可靠。
但是志珍,很多很多年前本砰,時代已經(jīng)來到一個階段 - 大部分的碼農(nóng)其實(shí)甚至不具備Mechanical Sympathy(“機(jī)械同理心”)碴裙,不知道基礎(chǔ)的計算機(jī)原理與算法,他們?nèi)諒?fù)一日的点额,只是在做代碼翻譯工作、數(shù)據(jù)格式轉(zhuǎn)換工作载慈,例如:一些寫JavaScript的人把數(shù)據(jù)轉(zhuǎn)換為XML或者JSON格式作網(wǎng)絡(luò)傳輸,到了服務(wù)器上珍手,一些寫Java或者Ruby的人把這些網(wǎng)絡(luò)數(shù)據(jù)轉(zhuǎn)換成DAO(Data Access Object)對象办铡,再到后面琳要,一些搞數(shù)據(jù)庫寫SQL的人得把這些“對象”通過ORM(Object-relational mapping)變成表結(jié)構(gòu)的數(shù)據(jù)存儲,然后反方向再來一遍...
如此機(jī)械童叠、重復(fù)的工作课幕,很多碼農(nóng)是身體力行的以鼠標(biāo)鍵盤“Cut-and-Paste”干著賴以為生五垮,充當(dāng)著著名符其實(shí)的搬運(yùn)工杜秸。這樣的工作有多少價值 - 尤其當(dāng)它的提供者拿著幾十萬年薪的時候撬碟?
隨著大語言模型的瘋狂發(fā)展,一個把馮諾依曼架構(gòu)徹底隱藏的新架構(gòu)已經(jīng)形成亭姥,而碼農(nóng)可以吃的“紅利”顾稀,是不是也走到盡頭?
生于計算機(jī)科學(xué)群星閃耀的50年代
軟件工程師這個職業(yè)粮揉,如果說誕生于50年代抚笔,應(yīng)該大體準(zhǔn)確吧。圖靈和馮諾依曼兩位現(xiàn)代計算機(jī)科學(xué)奠基人的基礎(chǔ)性工作已經(jīng)完成辐宾,馬文明斯基(Marvin Minsky)和麥卡錫(John McCarthy膨蛮,LISP語言發(fā)明者)已經(jīng)發(fā)起“達(dá)特茅斯會議”提出“人工智能”概念敞葛。專門從事軟件開發(fā)工作的人已經(jīng)出現(xiàn),雖然還沒有明確的“軟件工程師”職業(yè)稱呼持偏。幾種重要的編程語言在這個年代誕生了氨肌,例如:
- FORTRAN:1956年由IBM團(tuán)隊(duì)設(shè)計的科學(xué)計算的編程語言。它是第一門廣泛使用的高級語言卿叽,異常的長壽,一直使用到今天
- Lisp:1958年發(fā)明的函數(shù)式編程語言,后成為人工智能領(lǐng)域的主要語言之一
- COBOL:1959年面向商業(yè)數(shù)據(jù)處理領(lǐng)域設(shè)計的語言蕉扮,使用最為廣泛颗圣,尤其在銀行業(yè)
- Algol 60:1960年誕生在岂,意在統(tǒng)一算法描述語言,對后世影響深遠(yuǎn)易茬,成為面向過程編程語言的先驅(qū)
當(dāng)時極少數(shù)的精英掌握了這些語言及老,他們就是軟件工程師的先輩。之后的故事食铐,我們都知道了僧鲁,編程語言的發(fā)明一路開掛寞秃,從70年代的C、80年代的C++犁柜、90年代的Java到現(xiàn)在堂淡,全球現(xiàn)有的計算機(jī)編程語言總數(shù)量可以粗略估計約為1000-1500種。過去20年(2003年至2022年)平均每年誕生的編程語言數(shù)量統(tǒng)計:
- Tiobe編程語言指數(shù)追蹤的語言數(shù)量:平均每年新增3.7種語言萤悴。
- IEEE Spectrum排名的編程語言數(shù)量:平均每年新增4.3種語言覆履。
- Github上監(jiān)測的新語言數(shù)量:平均每年新增約16.5種語言。
但“編程語言”本身是“反人性”的 - 它們不是人類最自然的自我表達(dá)方式栖雾,它是為與機(jī)器溝通而設(shè)計的伟众,所以只是少數(shù)人能掌握 - 正如遠(yuǎn)古先民與“神”的溝通被壟斷在少數(shù)炮制了“神”并聲稱能講“神的語言”的巫師手里一樣凳厢。
碼農(nóng)一天有效產(chǎn)出只有1千個Token
掌握編程“特殊技能”的軟件工程師,尤其是在硅谷享受著高薪治泥、公司股權(quán)遮精、開著特斯拉那些,有人(哈佛大學(xué)教授Matt Welsh)給他們算了一筆賬:
- 平均年薪US$220,000
- 企業(yè)為每個人付出的隱性成本(福利吮播、稅意狠、免費(fèi)早午晚餐疮胖、免費(fèi)巴士、零食院塞、按摩服務(wù)性昭、醫(yī)療保健糜颠、娛樂...)US$92,000
總計人均成本每年US$312,000。
每年按260個工作天計算的話顶瞒,企業(yè)每天付出給每個人的成本為US$1,200元旬。那么這性價比如何?
這里又有一筆賬 - 每個工程師每天完成并提交的源代碼有多少行坑资?“完成”的意思是:測試過袱贮、評審過、確認(rèn)有效的代碼。Welsh的估計窑业,中位值是0枕屉! 你作為開發(fā)工程師每天有大量的時間不是在開會就是在等待別人的模塊提交。你說你整天在寫代碼西潘?但可能90%的代碼是試錯而無用哨颂、或者被同儕的評審給否決掉威恼。你可能在思考如何開發(fā)、你可能在設(shè)計重構(gòu)或者推倒重來... 你確實(shí)在工作但最終你提交到代碼庫的有效代碼腹备、也就是成為軟件成品里一部分的真正運(yùn)行代碼行數(shù)不多植酥。
考慮到你的“顱內(nèi)運(yùn)算”導(dǎo)致腦細(xì)胞死了不少弦牡、你的神經(jīng)元網(wǎng)絡(luò)算力全開,Welsh“慷慨”的把你的生產(chǎn)力提升為平均每天生產(chǎn)100行有效代碼(他認(rèn)為實(shí)際上是很難做到的)喊儡,那么這100行代碼等同于多少個GPT的token呢艾猜?按1行代碼10個token算,你每天生產(chǎn)大概1000個token淤毛,這是多少錢呢算柳?
- GPT-3.5 Turbo-16K的價錢是:US$0.004
- GPT-4 32K的價錢是:US$0.12
一個活人軟件工程師一天撐死輸出1000個有效token的成本瞬项,是GPT-4同等算力開銷的10,000倍!而且GPT們可能只需要0.001秒...
有人的地方就導(dǎo)致低效
業(yè)務(wù)需求方猪杭、項(xiàng)目經(jīng)理妥衣、產(chǎn)品經(jīng)理都知道税手,要讓一個軟件開發(fā)小組高效產(chǎn)出有多大的挑戰(zhàn)。
做幾個應(yīng)用頁面艺挪?7兵扬、8個人的團(tuán)隊(duì)規(guī)模周霉,開發(fā)小組先坐下來開幾次會,產(chǎn)品經(jīng)理搞個交互概念国瓮、UI整個“高保真”設(shè)計原型狞谱、前后端人員分個工跟衅、測試工程師搞個TDD/BDD。最終答復(fù):如果貪急圖快(Quick-n-dirty)的讓我們先出個東西掰读,3周蹈集;如果是隆而重之的生產(chǎn)環(huán)境發(fā)布并周到的考慮好向前兼容、保障可擴(kuò)展的靈活性减响,12周郭怪。
活人軟件工程師被GPT替代后鄙才,團(tuán)隊(duì)組成可能只剩下兩個活人:產(chǎn)品經(jīng)理和審核。產(chǎn)品經(jīng)理負(fù)責(zé)通過提示工程的手段向AI提出各種設(shè)想、要求并對成品作驗(yàn)收叙甸。審核者則好歹看一下AI生成的代碼(當(dāng)然位衩,這個時候他可能也沒有能力靠“肉眼”去看了糖驴,還得借力各種AI工具,但也算是有個人類把關(guān)一下吧)辙谜。
敏捷迭代感昼?什么敏捷迭代定嗓?
敏捷迭代還需要提嗎?這完全是針對人類工程師而產(chǎn)生的概念凌简。一個軟件開發(fā)團(tuán)隊(duì)里工程師水平各異恃逻、良莠不齊,再加上和項(xiàng)目經(jīng)理铅碍、產(chǎn)品經(jīng)理线椰、相對于團(tuán)隊(duì)而言算是外部的“需求”方等各種角色人員的交流溝通過程帶來的各種不確定性憨愉,類似Kanban、Scrum等等試圖解決這些問題的各種最佳實(shí)踐径密、方法躺孝、理論才應(yīng)運(yùn)而生植袍。
“有人的地方就有江湖”于个,人類的溝通與協(xié)同永遠(yuǎn)是一個軟件項(xiàng)目中風(fēng)險最高、最容易導(dǎo)致軟件功能走偏秀存、架構(gòu)設(shè)計走歪羽氮、交付標(biāo)準(zhǔn)坍塌的部分档押,也是低效的根源。于是大家制定了一個游戲規(guī)則 - 確定與認(rèn)領(lǐng)用戶故事洞就、每周定期做sprint planning和sprint review的儀式旬蟋,小版本密集發(fā)布等等革娄。
但是對于AI來說,敏捷 = 算力安寺。迭代一版軟件產(chǎn)品首尼,就看你有多少顆GPU/TPU/CPU了吧软能。而且AI沒有休息一說,可以無休止的工作凳枝,一天把軟件代碼迭代個十萬八千次岖瑰,不是問題砂代。
架構(gòu)設(shè)計模式泊藕?重構(gòu)难礼?不存在的事
因?yàn)楝F(xiàn)代軟件系統(tǒng)的復(fù)雜性蛾茉,在軟件技術(shù)演進(jìn)過程中,不得不持續(xù)總結(jié)悦屏、發(fā)明一些方法础爬,去解決軟件系統(tǒng)的性能擴(kuò)容問題吼鳞、長期可維護(hù)性問題赔桌、準(zhǔn)確性問題... 工程師在開發(fā)的過程中渴逻,隨著對一個業(yè)務(wù)領(lǐng)域的不斷深入理解惨奕,也需要不斷回顧復(fù)盤竭钝,從而歸納總結(jié)出更好的做法蜓氨,經(jīng)常性的為了讓系統(tǒng)更好的應(yīng)對未來需求而基于更深的認(rèn)識去進(jìn)行代碼重構(gòu)穴吹。
在這個過程中,我們采用各種面向?qū)ο蟮脑O(shè)計模式:Strategy啥容、Proxy咪惠、Delegate淋淀、Facade朵纷、Observer袍辞、Command... 我們采用各種架構(gòu)設(shè)計模式:MVC、Hub-and-Spoke威创、Bus肚豺、Pub-Sub界拦、EDA(Event-Driven Architecture)、CQRS(Command Query Responsibility Segregation)在跳、SOA(Service Oriented Architecture)... 我們采用各種開發(fā)方法:DDD(Domain Driven Development)猫妙、TDD(Test Driven Development)聚凹、BDD(Behavior Driven Development)妒牙、Design by Contract(契約式設(shè)計)等等...
但是,當(dāng)代碼都是由生成式AI去生產(chǎn)的話敢朱,這些設(shè)計模式拴签、方法還重要嗎蚓哩?AI生成的代碼會去遵循和沿用這些人類積累沉淀的知識嗎上渴?它是在自己生成的代碼中借鑒或者實(shí)現(xiàn)了這些架構(gòu)稠氮、框架還是是發(fā)展演變出新的“不為人知”的東西括袒?是否會像AlphaGo最終發(fā)現(xiàn)對圍棋的可計算空間遠(yuǎn)遠(yuǎn)大于人類積累兩千年的知識空間那樣稿茉,在軟件構(gòu)建方面發(fā)展出人類工程師從未想到過的架構(gòu)與方法漓库?
也許這些都不重要渺蒿。當(dāng)你告訴GPT,“幫我重寫這20,000行代碼”怠蹂,而這一切在5分鐘內(nèi)完成的話城侧,過去這些方法和技巧還有多少重要性呢嫌佑?
馮諾依曼架構(gòu)給碼農(nóng)的紅利終結(jié)
某種程度上,我們這幾代的軟件工程師揩魂,都是馮諾依曼(Von Neumann)架構(gòu)的既得利益者火脉。
約翰·馮·諾伊曼(1903-1957)是現(xiàn)代計算機(jī)的奠基人(與奧本海默同時忘分,并且是“曼哈頓計劃”的成員)妒峦。他在20世紀(jì)40年代提出的計算機(jī)的體系結(jié)構(gòu)兵睛、理論和設(shè)計原則,直到今天依然是現(xiàn)代計算機(jī)科學(xué)的基礎(chǔ)祖很。提供了理解計算機(jī)和編程的基本理論框架笛丙,對程序設(shè)計語言和算法的設(shè)計產(chǎn)生了深遠(yuǎn)影響,啟發(fā)了操作系統(tǒng)假颇、網(wǎng)絡(luò)胚鸯、數(shù)據(jù)庫等關(guān)鍵軟件技術(shù)的產(chǎn)生。什么CPU中央處理器笨鸡、RAM內(nèi)存姜钳、指令集、程序形耗、I/O設(shè)備、Cache緩存這些今天廣為人知的概念激涤,源出于此拟糕。即便是這些年出現(xiàn)了GPU、TPU等,仍然屬于馮諾依曼架構(gòu)及其衍生架構(gòu)的范疇送滞。
馮諾依曼架構(gòu)對現(xiàn)代軟件工程影響深遠(yuǎn)侠草,碼農(nóng)的所有技術(shù)知識,可以說都依托于這個架構(gòu)體系之上犁嗅,大家都是在這個體系下謀生梦抢。但是,現(xiàn)在有多少軟件工程師真的對自己所用于編程和運(yùn)行程序的底層軟硬件技術(shù)深究愧哟、有深入的理解呢奥吩?
賽車手Jackie Stewart最早在賽車界提出所謂Mechanical Sympathy這個概念,中文不好翻譯蕊梧,似乎沒有特別直觀的說法霞赫,在這里勉強(qiáng)譯為“機(jī)械同理心”,就是說賽車手對賽車的機(jī)械原理理解特別深肥矢,才能充分利用發(fā)揮其性能的意思吧端衰。后來被軟件大牛Martin Thompson引進(jìn)到軟件領(lǐng)域,強(qiáng)調(diào)開發(fā)者應(yīng)該類似地對計算機(jī)硬件和系統(tǒng)有深入的理解甘改,才能更好地編寫高性能的代碼旅东。這種態(tài)度強(qiáng)調(diào)了開發(fā)者需要關(guān)注底層硬件的工作原理,以便更好地利用硬件特性來優(yōu)化軟件的性能十艾。
但現(xiàn)在絕大部分的企業(yè)應(yīng)用軟件系統(tǒng)的開發(fā)工程師抵代,編程所面向的“計算機(jī)”,已經(jīng)是被層層封裝的黑盒子忘嫉,他們能看到的荤牍、僅在乎的,不過是一些“努力靠攏自然語言”的高級語言庆冕,經(jīng)常用這些語言去粘合一些別人提供的API接口康吵、組件接口,偶爾用這些語言去寫一些主要由For-Loop和If-Then語句組成的業(yè)務(wù)邏輯(而且很多時候這些代碼還被寫成了像“意大利面條”一樣访递,“松散耦合”晦嵌?“內(nèi)聚”?“設(shè)計模式”拷姿?不存在)惭载。Mechanical Sympathy?更加是沒影兒的事跌前。
大語言模型的出現(xiàn)和普及棕兼,讓本來就不再受大部分程序員關(guān)注的馮紐曼架構(gòu)體系變成透明陡舅。以大語言模型為中心的架構(gòu)抵乓,大語言模型取代了“中央處理器”,矢量數(shù)據(jù)庫(Vector DB)取代了“存儲器”,智能體(Agent)和外部調(diào)用函數(shù)(Function)取代了“I/O”和“中斷”灾炭,而互聯(lián)網(wǎng)上的各種服務(wù)API接口茎芋,就是“周邊”(Peripheral)。
一個所謂的“自然語言計算機(jī)”(Natural Language Computer)出現(xiàn)了蜈出。這個時候田弥,受過傳統(tǒng)軟件開發(fā)專業(yè)訓(xùn)練的程序員,還能否維持其“科班出身”的專業(yè)優(yōu)勢呢铡原?能夠聰明的理解人類指令和訴求偷厦、講人類語言的計算機(jī),還需要“巫師”般的行業(yè)黑話(編程語言)去指示其運(yùn)作嗎燕刻?還需要很多接受這種“行業(yè)黑話”專業(yè)訓(xùn)練的人去負(fù)責(zé)把業(yè)務(wù)應(yīng)用需求“翻譯”成機(jī)器指令嗎只泼?企業(yè)還愿意為這種專業(yè)技能買單嗎?
可能不再需要卵洗。這好比越來越智能的汽車请唱,最終它會以無人駕駛?cè)〈话愕乃緳C(jī)。當(dāng)然过蹂,深刻理解汽車機(jī)械的賽車手和他們的賽車十绑,還是會繼續(xù)存在的,但那只是非常非常少數(shù)的一個精英群體酷勺。
八十年之久的職業(yè)會消失嗎本橙?
人工智能甚至可以說誕生在現(xiàn)代計算機(jī)雛形出現(xiàn)之前,如果我們以圖靈和馮諾依曼兩個人的活躍時間以及各自學(xué)科的奠基時期來看的話:
圖靈(1912-1954年)主要活躍于30年代至40年代初期脆诉。他在這段時間里奠定了計算機(jī)算法原理方面的基礎(chǔ)理論勋功。他在50年提出“圖靈測試”,這是人工智能領(lǐng)域的里程碑库说。馮諾依曼(1903-1957年)則是在40年代中期至50年代前期最活躍狂鞋,主導(dǎo)了當(dāng)代計算機(jī)架構(gòu)的發(fā)明。兩人之間差了約10年的間隔潜的。圖靈理論偏前骚揍,馮諾依曼實(shí)踐偏后。圖靈50年代初去世較早啰挪,沒有見證馮諾依曼后期成就信不。但圖靈理論對馮諾依曼有啟發(fā)和影響。
某種意義上可以說亡呵,軟件工程師的宿命就是通過算法和軟件工程手段抽活,逐步實(shí)現(xiàn)人工智能,從而讓自己與“神”溝通的專利消失(這比遠(yuǎn)古巫師炮制出“神”并壟斷與其溝通的權(quán)利锰什,偉大太多了)下硕。
一旦人工智能掌握了自我學(xué)習(xí)的能力丁逝,技術(shù)發(fā)展就進(jìn)入了指數(shù)級加速的軌道。5年后會發(fā)生什么梭姓?Matt Welsh姑且用了一個大致的整數(shù)年份來圈定軟件工程師這份職業(yè)的始終:有了二戰(zhàn)期間以及戰(zhàn)后人工智能和現(xiàn)代計算機(jī)架構(gòu)的奠基霜幼,50年代出現(xiàn)各種早期計算機(jī)語言,出現(xiàn)掌握這些語言的程序員誉尖;到了2030年罪既,80年過去了,傳統(tǒng)意義上的“古典”軟件工程師職業(yè)還在嗎铡恕?
至少對于機(jī)械性粘貼代碼琢感、寫“意大利面條”、對底層計算機(jī)技術(shù)原理沒有興趣探熔、不理解算法猩谊、知識面窄、表達(dá)能力差祭刚、邏輯分析能力弱牌捷、對世界沒有好奇心、不求甚解的那幫開發(fā)人員涡驮,應(yīng)該是走到職業(yè)盡頭了暗甥。想一下你每天“吐”出來的的那些質(zhì)量不怎么樣的token,用GPT-4現(xiàn)在只需要花幾毛錢捉捅,不夠好使撤防、不夠滿意?多花個幾塊錢多試驗(yàn)幾個prompt如何棒口?
Copilot是救兵嗎寄月?
號稱AI賦能碼農(nóng)、增強(qiáng)其能力提升其效率的神器 - 各種Copilot无牵,來了漾肮。隨之而來的是各種“神預(yù)測”。
“未來的工程師只有兩種人茎毁,能利用AI的和不能利用AI的”克懊。Matt Welsh(以及很多人)如是說。這有點(diǎn)接近廢話七蜘,不能利用AI的應(yīng)該都干不了軟件工作了吧谭溉。
“英語是最好的編程語言”。OpenAI科學(xué)家Andrej Karpathy如是說橡卤。抬杠的人可以說憑什么是英語而不是漢語或者其他語扮念?但英語確實(shí)是軟件世界各種編程語言約定俗成的基礎(chǔ)語言,所以在可供訓(xùn)練的數(shù)據(jù)積累上是無與倫比的碧库。但至少目前看來柜与,用英語做提示讓大語言模型生成真正有效的代碼巧勤、實(shí)現(xiàn)一定的軟件功能,依然不是普通人能駕馭旅挤,它可能帶來另外的專業(yè)門檻踢关。
“AI是平庸工程師的復(fù)仇”伞鲫。有些技術(shù)視頻博主如是說粘茄。但恐怕難以茍同 - “平庸工程師”就是上述那些甘于做“搬運(yùn)工”的人吧,見識面窄秕脓、表達(dá)能力弱柒瓣、邏輯不行、基礎(chǔ)功底差吠架、沒好奇心不好學(xué)的那些芙贫,Copilot也拯救不了他們。
“產(chǎn)品經(jīng)理自己就可以生產(chǎn)軟件”傍药。以現(xiàn)在市場上“產(chǎn)品經(jīng)理”的閱歷和專業(yè)訓(xùn)練背景磺平,是不可能的。"AI產(chǎn)品經(jīng)理”可能是另一個物種拐辽,也許架構(gòu)師出身又有強(qiáng)大產(chǎn)品思維并且深入業(yè)務(wù)領(lǐng)域的人拣挪,有點(diǎn)機(jī)會。
無論如何俱诸,“古典”意義上的軟件工程師職業(yè)將一去不復(fù)回菠劝,但我們之中很多人得感謝計算機(jī)技術(shù)革命的這黃金八十年創(chuàng)造的就業(yè)機(jī)會。學(xué)習(xí)計算機(jī)科學(xué)睁搭、進(jìn)入這個領(lǐng)域赶诊,無疑是一種幸運(yùn),它給了我們嚴(yán)謹(jǐn)?shù)倪壿嬎季S和算法思想园骆。接下來舔痪,牢固掌握原理性知識、理解底層技術(shù)有Mechanical Sympathy的人锌唾,有機(jī)會“進(jìn)化”成AI世代的軟件工程師辙喂,而粘貼代碼、搞點(diǎn)字節(jié)搬運(yùn)鸠珠、做做增刪改查機(jī)械任務(wù)的那些巍耗,將消失于這個行業(yè)。