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