生成式 AI 如何輔助軟件交付
作者 | Rachel Laycock
大約兩個(gè)月前,我成為了Thoughtworks的首席技術(shù)官。在那之前,我一直領(lǐng)導(dǎo)Thoughtworks的現(xiàn)代化平臺(tái)和云服務(wù),而數(shù)字化轉(zhuǎn)型的基礎(chǔ)就是現(xiàn)代化已經(jīng)存在于系統(tǒng)內(nèi)部的軟件。領(lǐng)導(dǎo)團(tuán)隊(duì)跟我說(shuō):“嘿,你即將成為T(mén)houghtworks的首席技術(shù)官。祝你好運(yùn)。在未來(lái)的10年、20年里,最具顛覆性的技術(shù)即將擺在你面前,你需要關(guān)注它。” 我在這個(gè)行業(yè)已經(jīng)有20年了,無(wú)數(shù)次看到一些技術(shù)達(dá)到炒作周期的高峰,元宇宙、區(qū)塊鏈、移動(dòng)技術(shù),任何你所能想到的,它們的確改變了很多東西。
但對(duì)我來(lái)說(shuō),這一次的不同之處在于,AI 對(duì)于Thoughtworks的業(yè)務(wù)模式多么具有顛覆性。我們通過(guò)技術(shù)來(lái)解決客戶(hù)的問(wèn)題,而使Thoughtworks如此偉大的秘密武器是我們交付軟件的方式。我們使用的原則、方法以及我們關(guān)于持續(xù)交付和微服務(wù)的書(shū)籍都源于我們構(gòu)建軟件的方法。所以當(dāng)一項(xiàng)技術(shù)出現(xiàn)并聲稱(chēng):“嘿,我可以寫(xiě)代碼,你不再需要人了。”作為首席技術(shù)官,我需要警覺(jué)并迅速制定技術(shù)戰(zhàn)略,這影響著我們向客戶(hù)交付軟件的方式以及我們所要提供的建議。
編碼并不是軟件的全部
世界上每家咨詢(xún)公司、每家軟件開(kāi)發(fā)公司都雇傭著數(shù)百名專(zhuān)注于這個(gè)領(lǐng)域的人,因?yàn)槲覀兌荚诨ハ喔?jìng)爭(zhēng)。我很快意識(shí)到,每個(gè)人的談?wù)摱技性诰幋a部分。但我在想,等等,這里好像不對(duì)勁。交付軟件遠(yuǎn)不止編碼。
多年來(lái),我一直在強(qiáng)調(diào),當(dāng)人們關(guān)注代碼時(shí),他們認(rèn)為構(gòu)建軟件就是坐在電腦前,面對(duì)IDE編寫(xiě)代碼,這似乎就是全部?jī)?nèi)容。這也是為什么Thoughtworks多年來(lái)一直在使用極限編程實(shí)踐包括結(jié)對(duì)編程。多年來(lái),我們的客戶(hù)一直在問(wèn),為什么我要支付兩名開(kāi)發(fā)人員的工資來(lái)編寫(xiě)相同的代碼?這很昂貴。我們不得不做很多解釋工作,實(shí)際上這是一個(gè)巨大的錯(cuò)誤假設(shè),因?yàn)檫@項(xiàng)工作是有設(shè)計(jì)部分的。同時(shí)由兩個(gè)大腦來(lái)開(kāi)發(fā)代碼,提出的設(shè)計(jì)方案最終會(huì)交付更高質(zhì)量的代碼,更少的缺陷和更低的成本。
技術(shù)的快速變遷需要重新構(gòu)建軟件
但真正的問(wèn)題是,編碼并不是全部工作。軟件在不斷變化。正如我所說(shuō),我曾經(jīng)負(fù)責(zé)現(xiàn)代化平臺(tái)和云服務(wù)。我認(rèn)為世界上大約有20%或更少的軟件是在云上運(yùn)行的,畢竟其中許多軟件已經(jīng)存在了很長(zhǎng)時(shí)間,遷移起來(lái)并不容易。現(xiàn)代化是非常昂貴的,因?yàn)槟悴⒉荒芎?jiǎn)單地重寫(xiě)這些軟件。
說(shuō)到底,你閱讀代碼的次數(shù)要比你編寫(xiě)代碼的次數(shù)多得多。大約20年前,我大學(xué)畢業(yè)后的第一份工作被稱(chēng)為系統(tǒng)分析師。那是他們稱(chēng)呼畢業(yè)生的方式,這份工作的實(shí)質(zhì)就是修復(fù)錯(cuò)誤和缺陷,這被看作是讓我們了解代碼庫(kù)的一種方式。但我學(xué)到的是,編寫(xiě)代碼的錯(cuò)誤方式和壞的代碼風(fēng)格要比正確方式和好的代碼風(fēng)格多得多。這激發(fā)了我的興趣,想知道如何編寫(xiě)良好的代碼,使其易于維護(hù),并允許在未來(lái)繼續(xù)發(fā)展業(yè)務(wù),而不會(huì)受到代碼的束縛。因?yàn)闃?gòu)建軟件不僅僅是關(guān)于能多快地構(gòu)建軟件,更是關(guān)于是否首次就構(gòu)建了正確的軟件。我們都聽(tīng)說(shuō)過(guò)技術(shù)債這個(gè)詞,技術(shù)債越多,改變軟件就越困難。
那么我們?cè)撛趺崔k?我們重新構(gòu)建它。你的組織中有多少系統(tǒng)已經(jīng)被重新構(gòu)建過(guò)?很多,對(duì)吧?否則世界上就不會(huì)有成千上萬(wàn)的技術(shù)顧問(wèn)和開(kāi)發(fā)人員不斷地重建和重寫(xiě)軟件。有時(shí)這是因?yàn)樗畛蹙帉?xiě)得很糟糕,或者它使用了無(wú)法遷移到云的技術(shù)棧編寫(xiě)的。但有時(shí)是因?yàn)槟愕臉I(yè)務(wù)正在變化,你需要新的產(chǎn)品和新的軟件。技術(shù)就在我們腳下不斷變化。
我們一直在借用建筑領(lǐng)域的術(shù)語(yǔ)。我的兄弟是一個(gè)真正的建筑師,他建造真正的建筑物。當(dāng)他們?cè)诮ㄖ矫孀鰶Q策時(shí),如果做得正確,它們可以立足百年。而軟件卻與此完全不同,它是一個(gè)不斷變化的領(lǐng)域。因?yàn)槟悴粩嘀亟ùa,而成功與否取決于代碼的狀態(tài)、最初編寫(xiě)時(shí)的質(zhì)量,以及不斷變化的業(yè)務(wù)環(huán)境。
關(guān)注Thoughtworks的人都知道,我們?cè)谶^(guò)去的10多年中一直在編寫(xiě)技術(shù)雷達(dá)。雷達(dá)的隱喻體現(xiàn)了我們應(yīng)該關(guān)注什么技術(shù)、平臺(tái)、技巧和工具。它是由我們的前任首席技術(shù)官出于內(nèi)部組織的目的而創(chuàng)建的,而伴隨著人員的增長(zhǎng),跟蹤所有這些變化變得非常困難,所以她創(chuàng)辦了一個(gè)技術(shù)咨詢(xún)委員會(huì)來(lái)幫助她理解這一切。
你會(huì)注意到每六個(gè)月就會(huì)有新技術(shù)、新平臺(tái)、新技巧出現(xiàn)。事實(shí)上,上一份技術(shù)雷達(dá)是在上周開(kāi)始制作的,通常會(huì)在一個(gè)月左右發(fā)布。考慮到目前基于大語(yǔ)言模型和生成式AI的工具太多,我們不得不單獨(dú)評(píng)估它們。與其逐個(gè)評(píng)估,我們甚至不得不把它們?nèi)糠旁谝黄饋?lái)進(jìn)行相對(duì)評(píng)估。這就像一個(gè)已經(jīng)非常瘋狂的領(lǐng)域,我們正在處理的復(fù)雜性令人難以置信。
生成式 AI 成為新的編碼伙伴
讓我們回到閱讀代碼比編寫(xiě)代碼更多的話(huà)題,回到結(jié)對(duì)編程以及我們使用這些方法的原因上。
這是Jean Bartik。她是最早的程序員之一。你們可能不知道,在編程的歷史上,大多數(shù)最早的程序員實(shí)際上是女性。她說(shuō)她們當(dāng)時(shí)總是成對(duì)編寫(xiě)代碼,因?yàn)樗齻儼l(fā)現(xiàn)這樣可以相互檢查對(duì)方的設(shè)計(jì),提出批評(píng)意見(jiàn)和更多的想法。我認(rèn)為這就是生成式AI最令人興奮的事情之一,因?yàn)樗部梢宰觥?/p>
在編寫(xiě)代碼時(shí),你要把它視為合作伙伴,因?yàn)檐浖こ虒?shí)踐真的很重要。如果你不合作或不進(jìn)行代碼審查,或者不花時(shí)間進(jìn)行設(shè)計(jì),而只是繼續(xù)重寫(xiě),繼續(xù)修復(fù)錯(cuò)誤,你會(huì)遇到更多的麻煩。
我們調(diào)查了許多主要客戶(hù),并將我們與他們的內(nèi)部軟件開(kāi)發(fā)人員以及供應(yīng)商進(jìn)行了比較,盡管他們可以更快地推出產(chǎn)品,但這其中也有更多的缺陷、更多的錯(cuò)誤、更多的問(wèn)題、更多的重復(fù)工作。
這就是為什么在開(kāi)發(fā)過(guò)程的早期你就要仔細(xì)地考慮設(shè)計(jì)的想法。因?yàn)樽罱K,當(dāng)我們到達(dá)部署階段,如果能夠持續(xù)地部署而沒(méi)有問(wèn)題或者問(wèn)題較少時(shí),我們的成本就會(huì)更低。你必須能夠全面看待整個(gè)開(kāi)發(fā)周期,因?yàn)檫@不僅僅關(guān)于編寫(xiě)代碼。其實(shí)我沒(méi)有告訴你任何新東西,這些事情早已存在,我們整個(gè)行業(yè)只是不斷地重建軟件。
因此,只是考慮生成式AI如何幫助你更快地編寫(xiě)代碼,是非常狹隘的。你需要思考整個(gè)交付周期,以及生成式 AI 如何成為整個(gè)交付周期的一部分。這樣,你就可以獲得可以工作的、高質(zhì)量的軟件。否則,你只能在小范圍內(nèi)獲得好處。
生成式 AI 幫助改進(jìn)軟件流程
一份來(lái)自Github的研究表明,人們實(shí)際上坐下來(lái)編寫(xiě)代碼的部分在日常工作中只占26%到27%。所以我們知道開(kāi)發(fā)軟件遠(yuǎn)不止于此。
關(guān)于生成式 AI,我們學(xué)到的另一件有趣的事情是,即使它可以讓人們更快地完成開(kāi)發(fā)軟件或刪除代碼等許多重復(fù)任務(wù),好處實(shí)際上只存在于中級(jí)工程師及以上的級(jí)別。因?yàn)檎f(shuō)到底,它不是Google,它不會(huì)給你答案。它只會(huì)提供以前已經(jīng)做過(guò)的事情的模式。如果你不是高級(jí)工程師,你無(wú)法判斷得到的信息是真是假,這樣反而會(huì)減慢開(kāi)發(fā)的速度,接收了太多的選擇和太多想法,卻不知道哪一個(gè)是正確的。
所以當(dāng)我們思考如何將生成式AI應(yīng)用于構(gòu)建軟件時(shí),它并不是為了讓開(kāi)發(fā)人員更快,而是為了改進(jìn)整個(gè)流程。這將帶來(lái)很多機(jī)會(huì),因?yàn)樯墒紸I可以在軟件開(kāi)發(fā)生命周期中為你的人員提供很多幫助。接下來(lái)我會(huì)快速地介紹一下。
我們擁有的大語(yǔ)言模型在不斷變化,目前它在哪些方面表現(xiàn)良好呢。讓我們從簡(jiǎn)單的模式匹配開(kāi)始。它可以接受自然語(yǔ)言,比如“為我做一些計(jì)算”,然后它可以生成代碼,對(duì)于重復(fù)性的任務(wù)來(lái)說(shuō),完成得也不錯(cuò)。正如我前面所說(shuō),它對(duì)已經(jīng)具有經(jīng)驗(yàn)的人來(lái)說(shuō)是一個(gè)很好的伙伴。
因?yàn)槲乙恢惫ぷ髟诂F(xiàn)代化改造領(lǐng)域,而在現(xiàn)代化改造中,一個(gè)很大的問(wèn)題是沒(méi)有人真正解決大型主機(jī)的問(wèn)題。有多少人嘗試過(guò)現(xiàn)代化改造他們的主機(jī)系統(tǒng),然后因?yàn)槌杀咎叨艞墸咳藗兺ǔV皇侵匦戮帉?xiě)它,或者只是在它周?chē)恍┌b器。
所以我們即將開(kāi)始進(jìn)行一些實(shí)驗(yàn),因?yàn)槿绻墒?AI 可以將自然語(yǔ)言轉(zhuǎn)化為代碼,將代碼轉(zhuǎn)化為自然語(yǔ)言,那么也許它可以解決這個(gè)問(wèn)題。我昨晚聽(tīng)說(shuō)IBM已經(jīng)發(fā)布了一些東西,他們聲稱(chēng)可以做到這一點(diǎn),但我相信這只是個(gè)開(kāi)始,這非常令人興奮。生成式 AI 還可以做一些瘋狂的怪事,比如用星球大戰(zhàn)的隱喻來(lái)解釋代碼,所以你可以玩得很開(kāi)心。
20年前,你可能是一名Java工程師,或者是一名C#工程師。但現(xiàn)在情況不同了,尤其是作為在我們這樣行業(yè)的一名顧問(wèn),你需要學(xué)習(xí)Ruby、Python的各種概念,你要能在IDE內(nèi)提供上下文。使用了 Copilot,它可以幫助你記起已經(jīng)模糊的東西。在使用生成式 AI 之前,你必須去 Google 自己搜索答案。如果你有一個(gè)異常消息,作為一名初級(jí)開(kāi)發(fā)人員,你會(huì)將它輸入到Google中,再放入Stack Overflow中尋找答案,最后選擇最受歡迎的那個(gè)答案。這樣做的好處是,如果你選擇了最受歡迎的答案,那么它可能只是一個(gè)好答案而已,但使用Copilot之類(lèi)的工具,你可以獲得具備上下文的答案,從而加快你的工作流程。
使軟件交付變慢的原因之一是對(duì)瀑布方法的抱怨,即各階段的交接問(wèn)題。在不同的階段之間,你只是在不斷地傳遞東西,有人提出需求或者是一個(gè)想法,然后依次進(jìn)入代碼、測(cè)試、部署階段,哦,出現(xiàn)了問(wèn)題,那我們把它全部回退吧。但這個(gè)問(wèn)題可能發(fā)生在兩年后,早期的程序員已經(jīng)離開(kāi)了,因?yàn)樗麄冎辉诮M織里待了兩年。所以現(xiàn)在如果你是一個(gè)初級(jí)程序員,你看著這個(gè)問(wèn)題,可能要花上三倍甚至四倍的時(shí)間來(lái)弄清楚發(fā)生了什么,以及如何解決它。但如果你創(chuàng)建這些想法、用戶(hù)需求、測(cè)試、部署的反饋循環(huán)越快,你就越能減少重復(fù)工作,并更快地實(shí)現(xiàn)你的目標(biāo)。
所以你可以開(kāi)始思考軟件開(kāi)發(fā)生命周期的所有這些不同部分,讓生成式 AI 扮演其中某部分的不同角色,以及可以做的事情和工具。這聽(tīng)起來(lái)真是既令人驚嘆,又令人恐懼,又令人興奮。
我們一直專(zhuān)注于構(gòu)建、編寫(xiě)好的軟件和代碼,即便有了生成式 AI,你仍然需要有好的方法和方法名稱(chēng),但 AI 可以為你生成文檔。想象一下,你離開(kāi)兩周后回來(lái)了,代碼庫(kù)發(fā)生了什么變化?你讓 AI 給我一個(gè)總結(jié),總結(jié)過(guò)去 190 次提交中代碼庫(kù)中的所有變化,它就可以幫助你來(lái)做一些研究和發(fā)現(xiàn)。
關(guān)于軟件架構(gòu)和設(shè)計(jì)的一個(gè)難點(diǎn)是考慮到所有的跨功能問(wèn)題,如安全性問(wèn)題、可訪(fǎng)問(wèn)性問(wèn)題和性能問(wèn)題。生成式 AI 可以告訴你,這里有大約 10 個(gè)問(wèn)題,如果你是一位經(jīng)驗(yàn)豐富的軟件架構(gòu)師,你就應(yīng)該考慮并關(guān)注這些問(wèn)題,你能辨別當(dāng)前的情境下有 8 個(gè)問(wèn)題與你無(wú)關(guān),但剩下的2個(gè)問(wèn)題很重要。但如果你不是一位經(jīng)驗(yàn)豐富的軟件架構(gòu)師,如果你為解決這 10 個(gè)問(wèn)題都修改了代碼,那么最終你將得到很難更改和使用的軟件。這就是為什么我會(huì)提到這一點(diǎn),即人們的專(zhuān)業(yè)知識(shí)仍然如此關(guān)鍵。
實(shí)際上,作為技術(shù)領(lǐng)導(dǎo)者,我的擔(dān)憂(yōu)之一是,我們?nèi)绾闻囵B(yǎng)員工的專(zhuān)業(yè)知識(shí)?有 AI 之前,當(dāng)我一開(kāi)始讀了某些人的代碼,我會(huì)想,這到底是怎么回事?這個(gè)人寫(xiě)代碼時(shí)吸食了什么瘋狂的迷幻藥嗎?有了生成式 AI,這種情況就不太會(huì)發(fā)生了,它會(huì)告訴你它做了什么。它給你一些實(shí)現(xiàn)的選項(xiàng),但如果你沒(méi)有經(jīng)驗(yàn)和專(zhuān)業(yè)知識(shí)來(lái)對(duì)這些選項(xiàng)做出判斷,那么可能會(huì)生成更多糟糕的軟件。這是我的預(yù)測(cè)之一,即在我們真正看到這項(xiàng)技術(shù)如何幫助創(chuàng)建更好的軟件之前,我們將首先生成更多糟糕的軟件。
在我早期評(píng)估所有 AI 這些不同技術(shù)及其對(duì)軟件生命周期的影響時(shí),我發(fā)現(xiàn)一切都回歸到了現(xiàn)代軟件的核心原則。任何真正在構(gòu)建現(xiàn)代軟件的人都知道,現(xiàn)代軟件的關(guān)鍵在于流程。它的關(guān)鍵在于從系統(tǒng)中消除浪費(fèi),并使開(kāi)發(fā)和交付團(tuán)隊(duì)進(jìn)入流程狀態(tài),以便盡快將最高質(zhì)量的產(chǎn)品交付給客戶(hù)。
亞馬遜的新 CEO Andy Jassy創(chuàng)建了一個(gè)工程效率開(kāi)發(fā)者體驗(yàn)團(tuán)隊(duì),因?yàn)樗J(rèn)識(shí)到在軟件開(kāi)發(fā)生命周期內(nèi)存在很多浪費(fèi)。生成式 AI 可以幫助減少某些浪費(fèi),比如查找一些信息。再次強(qiáng)調(diào),AI 還可以幫助減少認(rèn)知摩擦。它是否可以減少開(kāi)發(fā)者體驗(yàn)?zāi)Σ粒靠赡馨伞K欠窨梢詼p少運(yùn)營(yíng)模型的摩擦?可能不行。所以生成式 AI 還有很長(zhǎng)的路要走。
但生成式 AI 可以消除許多流程中的障礙,這就是為什么你必須觀(guān)察整個(gè)軟件開(kāi)發(fā)生命周期,包括思考我們?nèi)绾闻囵B(yǎng)未來(lái)的工程師成為優(yōu)秀的工程師。因?yàn)槲覀兇蠖鄶?shù)人都是通過(guò)從困難的事情中學(xué)習(xí)來(lái)取得進(jìn)步的,這是人類(lèi)不幸的真理之一。我們的父母學(xué)到了一個(gè)艱難的教訓(xùn),然后他們嘗試教給我們。但是,我并不聽(tīng)你的,我要自己學(xué)習(xí)這個(gè)艱難的教訓(xùn)。這幾乎是人類(lèi)天性:從困難的事情中學(xué)到東西。那么在沒(méi)有機(jī)會(huì)學(xué)習(xí)困難的事情的情況下,我們?nèi)绾闻囵B(yǎng)出優(yōu)秀的工程師呢?
因此,這將是我們必須解決的問(wèn)題。正如我所說(shuō),生成式 AI 可以幫助解決很多問(wèn)題,但也有一些問(wèn)題它不能解決,我們作為領(lǐng)導(dǎo)者仍然需要關(guān)注這些問(wèn)題,仍然需要思考如何使用精益原則以消除浪費(fèi),以使人們?cè)谒麄兊慕巧心軌蚋咝У匕l(fā)揮作用。
生成式 AI 會(huì)取代開(kāi)發(fā)人員嗎?
生成式 AI 會(huì)取代開(kāi)發(fā)人員嗎?我覺(jué)得不會(huì)很快,多年來(lái)與客戶(hù)合作的經(jīng)驗(yàn)告訴我,產(chǎn)品需求永遠(yuǎn)不會(huì)減少,它總是會(huì)變得越來(lái)越大。我們想要越來(lái)越多的東西,我們需要完成的事情越來(lái)越多,技術(shù)領(lǐng)域不斷變化,我們總是試圖進(jìn)行變革,這就是原因。
因此如果我們能夠讓團(tuán)隊(duì)效率提高 20% 到 30%,或者未來(lái)可能是 50%,那會(huì)意味著我們會(huì)減少 20%、30% 甚至 50% 的人員嗎?不,我們可能只會(huì)將 20%、30% 或者 50% 的軟件添加到系統(tǒng)中。而且如果沒(méi)有對(duì)其進(jìn)行嚴(yán)格審查,如果沒(méi)有工程師查看輸出,那么這些軟件可能會(huì)被編寫(xiě)得更加糟糕。因此,這可能會(huì)導(dǎo)致更多的遺留代碼,制造混亂。
這就是我個(gè)人的預(yù)測(cè),短期內(nèi),它可能會(huì)產(chǎn)生更多的挑戰(zhàn)和復(fù)雜性,但我們必須應(yīng)對(duì)這一挑戰(zhàn),找出讓事情變得更好的辦法。
我認(rèn)為使用精益原則確實(shí)是正確的方法。當(dāng)然,我也提醒了風(fēng)險(xiǎn)。但具體來(lái)說(shuō),在軟件交付生命周期內(nèi),風(fēng)險(xiǎn)通常只是一種幻覺(jué)。所以你必須從兩方面考慮它。最后,我想說(shuō)的是,AI 可以讓你更快地編寫(xiě)代碼,因?yàn)樗撕芏嘀貜?fù)性任務(wù),這的確很棒。但你必須考慮整個(gè)生命周期,以及它影響的不僅僅是編碼,而是真正高速生成的高質(zhì)量的軟件。這些工程實(shí)踐更加重要。
但等等,我們未來(lái)還需要軟件嗎?
未來(lái)我們還需要軟件嗎?
這是我在思考的問(wèn)題,因?yàn)樽鳛橐幻I(lǐng)導(dǎo)者,我必須思考,如果在我們的系統(tǒng)中構(gòu)建的軟件,特別是我們擁有的內(nèi)部業(yè)務(wù)軟件,真的只是用于暴露和回答我們的問(wèn)題,并添加新的信息,然后繼續(xù)暴露并回答問(wèn)題。我們還需要多少新的軟件?我不知道。當(dāng)然,這可能是明年或后年的一個(gè)話(huà)題。
但在短期內(nèi),我們可能會(huì)創(chuàng)建更多的軟件。因此,我認(rèn)為重要的是在不被落下的同時(shí),采取深思熟慮的方法。我可以保證,你組織中的每位軟件工程師都已經(jīng)在使用生成式 AI。我還可以保證,侵犯知識(shí)產(chǎn)權(quán)的情況已經(jīng)在發(fā)生。因此,了解整個(gè)軟件生命周期,知道如何治理這些問(wèn)題,在未來(lái)幾年對(duì)于我們所有的技術(shù)領(lǐng)導(dǎo)者都將非常重要。