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