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