譯者 | 陳峻
審校 | 重樓
您聽說過“結(jié)對編程(Pair Programming)”的概念嗎?根據(jù)維基百科,它是由兩名程序員共同開展軟件開發(fā)的一種方式。其中的一名程序員(或稱“駕駛員”)負責(zé)編寫代碼,另一名程序員(或稱“觀察員”或“領(lǐng)航員”)需要在對方輸入每一行代碼時,對其進行審查。而且,兩名程序員經(jīng)常會互換角色。在審查的過程中,“觀察員”還會考慮工作的“戰(zhàn)略”方向,提出改進意見,以及有待未來解決的問題。此舉的目的在于基于“觀察員”的指導(dǎo),“駕駛員”能夠?qū)⒆⒁饬θ考性谕瓿僧斍叭蝿?wù)的“戰(zhàn)術(shù)”方面。
在過去的兩周里,我與人工智能(AI)一起,以結(jié)對編程的方式,在一個陌生的開發(fā)環(huán)境中,使用了對自己來說全新的語言和框架,重建了過往的博客。下面,我將分享該重建過程的一些與人工智能結(jié)對合作的經(jīng)歷。
背景介紹
為了確保人工智能在此次重建中發(fā)揮關(guān)鍵性作用,我制定了以下兩項規(guī)則:
- 使用傳統(tǒng)搜索引擎獲取信息的比例不超過20%。
- 不尋求其他開發(fā)人員的幫助。
換句話說,在這次開發(fā)和學(xué)習(xí)過程中,人工智能成為了我的主要信息來源、合作伙伴和助手。從某種意義上說,這種合作類似于我們在開篇提到的、通過讓人工智能在其中扮演伙伴的角色,與之開展“結(jié)對編程”。因此,在整個過程中,我使用到了GitHub Copilot、ChatGPT、Claude和Warp(一種人工智能助手)等服務(wù),并且將它們視為重要的編程“伙伴”。
選擇技術(shù)棧
在選擇技術(shù)棧的階段,我主要依靠的是ChatGPT和Claude。通過向他們提供我的技術(shù)背景和具體要求等詳細信息,我在多輪溝通中逐漸明確了自己需要的編程語言、框架和編輯器。
如您所知,與人工智能的對話可謂既自由又發(fā)散。每當人工智能給出建議或提示時,我都會深入研究其對應(yīng)的方向和細節(jié),并定期總結(jié)自己的理解,以便再次與人工智能進行確認。與幾個月前相比,GPT-4和Claude 2已不再一味地去迎合提問者,而是及時、禮貌地指出了我的理解總結(jié)中的錯誤,并有效地避免了我在錯誤的道路上越走越遠。最終,我選擇了TypeScript、Astro、TailWindCSS和VSCode作為博客重構(gòu)的必要技術(shù)。
在此階段,人工智能為我高效地提供了有價值的信息,而且?guī)椭铱焖俚刈龀隽藳Q策。究其原因,我歸結(jié)為如下方面:
- 明確的要求:清晰且通俗易懂的需求,能夠簡化與人工智能溝通的整個過程,并使之快速明白提問者的意圖。
- 成熟的技術(shù)選擇:我所選擇的技術(shù)堆棧是由成熟的項目組成。這些項目通常擁有活躍的在線社區(qū)和豐富的官方文檔。這些信息為人工智能提供了可靠的語義資源,并確保了人工智能夠?qū)ζ渖婕暗降募夹g(shù)有深入理解。
- 結(jié)合個人經(jīng)驗:利用自己在其他編程語言方面的經(jīng)驗,我在“結(jié)對”討論中,使用了熟悉的語言、框架、以及開發(fā)環(huán)境作為參考,以幫助人工智能更好地理解我的需求。
- 多個人工智能平臺的互補性:我同時在ChatGPT和Claude上開展了討論。雖然在大多數(shù)情況下,兩個平臺提供的信息整體相似,但是偶爾也出現(xiàn)不同的方向,這就相當于您的“結(jié)對”中多了一個伙伴。
- 人工判斷不可或缺:盡管與傳統(tǒng)搜索相比,人工智能提供的信息總量有所減少,但是如果用戶缺乏分析能力和決策能力的話,他們可能仍然會犯“選擇困難癥”。因此,提問者必須具備較強的分析和判斷能力。否則,過度的自由可能會阻礙我們獲得令人滿意的結(jié)果。
設(shè)置開發(fā)環(huán)境
雖然我曾用過VSCode,但是從未將其作為我的主要開發(fā)工具。同時,我在安裝Node.js和使用NPM方面的經(jīng)驗也相對有限。對此,AI詳盡地協(xié)助我構(gòu)建出了開發(fā)環(huán)境。
值得一提的是AI回答命令行操作的過程。鑒于由Warp提供的AI助手使用起來非常便捷,因此在遇到錯誤時,我只需點擊閃電(??)按鈕,AI助手便會自動將相關(guān)命令和輸出作為上下文,提交給人工智能。相比之下,在GitHub Copilot中,我得需要手動選擇有待解釋的輸出內(nèi)容,以確保上下文的完整性。雖然我可以使用右鍵菜單中的人工智能選項、或快捷命令@workspace /explain #terminalSelection來完成這項工作,但總歸不如Warp便捷。
與Xcode的集成測試環(huán)境不同,在VSCode中,開發(fā)人員需要根據(jù)所使用的語言和框架,來選擇合適的測試框架和插件。在此過程中,我曾遇到了一些困難。起初,我試圖根據(jù)人工智能的建議安裝Jest,但由于開發(fā)環(huán)境與Astro的兼容性問題,而未能成功。在與人工智能討論了幾次未果后,我轉(zhuǎn)而使用了搜索引擎,不過仍然找不到解決方案。最終,網(wǎng)上的一篇文章提及了一個我從未告知AI的知識點,及其有關(guān)配置的背景信息。據(jù)此,在人工智能的指導(dǎo)下,我成功實現(xiàn)了對Jest框架的配置。
不過,在隨后的單元測試中,我又發(fā)現(xiàn)Jest無法與Astro的運行環(huán)境協(xié)同工作。通過查閱Astro的官方文檔,我發(fā)現(xiàn)其實ViTest是更適合Astro的測試框架。而且,ViTest的安裝過程非常便利,可以完美地運行Astro代碼的測試。
因此,在該項目中,我最終配置了兩個測試框架,即:將ViTest用于Astro特定測試,并將Jest用于其他測試。
此外,不知道是否配置問題,GitHub Copilot通過快捷命令所生成的默認測試代碼是基于Jest的。而為了生成適合ViTest的測試代碼,我需要通過與AI對話,明確提出該請求方可。
通過上述經(jīng)歷,我意識到:即使有人工智能和搜索引擎的幫助,最權(quán)威的信息來源仍然是官方文件。也就是說,雖然人工智能對這些文件有相當?shù)牧私猓袝r也會遺漏一些關(guān)鍵信息。可見,官方文件具有無可替代的權(quán)威性,仍然是我們首選的信息來源。
通過代碼閱讀學(xué)習(xí)新的語言
通過閱讀由Astro提供的官方模板,我了解了Astro,也是學(xué)習(xí)TypeScript的最佳途徑。同樣,在此階段,人工智能起到了決定性的輔助作用。它大幅提高了我的學(xué)習(xí)效率。在Astro項目中,Astro文件可能包含諸如:TypeScript、JavaScript、HTML、CSS、以及特定的Astro標記與用法等各種元素。顯然,對于像我這樣沒有相關(guān)經(jīng)驗的人來說,如果沒有人工智能的幫助,將很難知曉該從何處開始。
雖然Astro相比其他框架來說更新,但是人工智能的知識庫已經(jīng)能夠?qū)ζ鋼碛凶銐虻牧私猓⒖梢郧宄刂赋龃a不同部分的含義。通過人工智能對于具體代碼的詳細解釋,我逐漸理解了代碼的結(jié)構(gòu)和邏輯。甚至,對于那些我不理解的地方,它也能按需給出進一步的解釋。
在與AI討論的過程中,我充分利用了自己對于其他編程語言和框架的了解,作為與人工智能對話的參考。同時,我還會定期總結(jié)自己的理解,并請人工智能幫助糾正其中的錯誤認識。此外,隨著討論的深入,我也會定期要求人工智能提供之前討論過的結(jié)論,以作記錄之用。
該階段有關(guān)的代碼解讀和討論,主要是在GitHub Copilot中進行的。雖然GitHub Copilot的總體表現(xiàn)良好,但我們在使用過程中仍有一些事項需要注意,例如:
- 如果沒有選擇特定的代碼,GitHub Copilot只會解釋當前編輯窗口中可見的代碼。
- 為了向GitHub Copilot提供更多的上下文,我們有必要手動選擇要提交的代碼,以作為當前問題的上下文。
- GitHub Copilot不支持跨多個文檔的討論,因此用戶需要自己整合不同文檔的內(nèi)容,才能形成完整的上下文。
- GitHub Copilot的答案有長度限制。如果答案太長,它可能會提示涵蓋掉了已提供的代碼。在這種情況下,我們可能需要ChatGPT或Claude的幫助。
- 在某些情況下,GitHub Copilot提供的答案質(zhì)量可能不如ChatGPT。
編程實踐
根據(jù)提示自動生成代碼,是開發(fā)人員體驗人工智能強大功能的最佳方式之一。最近在開發(fā)者社區(qū)中熱議的、前文已提到的GitHub Copilot,既有能力理解開發(fā)者的意圖,又能夠?qū)崟r生成高質(zhì)量的代碼。對于我的博客重構(gòu)項目而言,我不僅想創(chuàng)建一個新的博客,而且希望在此過程中學(xué)習(xí)和掌握新的語言和框架。對此,在啟用了GitHub Copilot后,只要我提供了足夠多的提示和注釋,Copilot就能夠快速地生成相應(yīng)的代碼。
起初我認為這樣挺好,但是隨著使用的深入,我發(fā)現(xiàn)自己在短時間內(nèi),居然養(yǎng)成了向人工智能索取程序代碼的習(xí)慣。它讓我更關(guān)注的是注釋對代碼生成的影響,而不是具體代碼的實現(xiàn)概念。這顯然與我想通過重構(gòu)來掌握一門新的語言的愿望是相矛盾的。面對人工智能給出的代碼結(jié)果,我甚至產(chǎn)生一種以為自己已經(jīng)掌握了這門語言的錯覺。
意識到這種情況后,我只有在無法獨立實現(xiàn)代碼的時候,才會啟用GitHub Copilot的實時代碼生成功能。也就是說,不管寫得好不好,我都會先嘗試著先自己寫,然后讓人工智能幫我發(fā)現(xiàn)問題,進而逐步提高代碼的可讀性和可用性。在這個過程中,我會向人工智能請教語法上的細節(jié),讓人工智能指導(dǎo)我使用更符合TypeScript的編程范式、以及更合適的代碼實現(xiàn)方法。
由于同一功能的代碼會被多次重復(fù)創(chuàng)建,因此提前創(chuàng)建單元測試是非常重要的。在VSCode中,無論是Jest還是ViTest,都可以啟用自動化測試,以便代碼在被修改后,立即運行測試。我希望Xcode也能提供類似的功能。畢竟在不斷修改代碼的過程中,經(jīng)常會出現(xiàn)需要優(yōu)化或糾正錯誤的情況。我們只有通過測試,才能及時發(fā)現(xiàn)問題。
小結(jié)
經(jīng)過這段時間與人工智能產(chǎn)品的密切合作,我逐漸認識到:在有效利用人工智能的同時,保持個人技術(shù)成長和獨立思考的重要性。面對勢不可擋的人工智能的飛速發(fā)展趨勢,它將毫無疑問地對我們未來的生活和工作等方方面面產(chǎn)生深遠的影響。
目前,人工智能已經(jīng)具備了快速編寫代碼的能力,許多開發(fā)人員或多或少地擔(dān)心會被它所取代。作為一名開發(fā)人員,我認為避免被取代的關(guān)鍵在于:不斷提高自身技能,展現(xiàn)人工智能無法取代的獨特價值。也就是說,過度地依賴人工智能確實可以在某些方面提高工作效率,或者實現(xiàn)以前不可能實現(xiàn)的結(jié)果。但是長此以往,開發(fā)者可能會逐漸喪失自身優(yōu)勢,最終從人工智能工具的使用者,很可能會轉(zhuǎn)變?yōu)槿斯ぶ悄芄ぞ叩闹郑喝祟愄崾旧善鳎℉uman Prompt Generators)。當然,總的來說,人工智能在幫助我的學(xué)習(xí)和重建過程中,確實給我?guī)砹司薮蟮捏@喜。將來,我計劃將人工智能更多地融入自己的工作。
譯者介紹
陳峻(Julian Chen),51CTO社區(qū)編輯,具有十多年的IT項目實施經(jīng)驗,善于對內(nèi)外部資源與風(fēng)險實施管控,專注傳播網(wǎng)絡(luò)與信息安全知識與經(jīng)驗。
原文標題:Pair Programming with AI,作者:fatbobman