像用實習生一樣用 AI 輔助你編程

0 評論 3281 瀏覽 14 收藏 12 分鐘

不少人認為大模型現(xiàn)在已經(jīng)這么強了,做點事怎么感覺這么弱智。其實,政治的使用方法,是像帶實習生一樣使用AI工具——就像作者在正文中分享的經(jīng)驗一樣。

我是不敢讓 ai 幫我寫程序的,每回問它的問題,十次倒有八次是錯的,問完之后還要自己去網(wǎng)上搜一遍,然后反復(fù)測試,才敢寫進代碼。不知道大家怎么甩手給它的。
——響馬

響馬毫無疑問是編程高手,幾十年的開發(fā)經(jīng)驗,另外他寫的代碼都屬于一些底層代碼,被訓練過的比例極少,AI 大概率寫不出來高質(zhì)量代碼,不放心讓 AI 幫忙寫程序正常。但對于普通程序員來說,不一定要像響馬那樣,拒絕 AI 的幫助。

比如我就是個普通程序員,寫的都是一些簡單的前端 UI 代碼,或者后端增刪改查代碼,并沒有太高技術(shù)含量,就經(jīng)常讓 AI 給我?guī)兔?,還是讓我效率提升不少的。我總結(jié)下來經(jīng)驗就是:像用實習生一樣用 AI 輔助你編程。

在科技公司或者開發(fā)團隊經(jīng)常能看到這樣的場景:某些資深程序員,寫代碼特別牛,效率特別高,但是很多活都壓在他們身上,成為了團隊瓶頸,于是老板說,這樣不行,給你幾個實習生或者新手程序員幫你分擔一些吧。

大多數(shù)時候這種提議是被拒絕的,倒不是他們藏私不愿意帶人,而是在他們看來,把活交給實習生,一個簡單的任務(wù)都要花幾天時間,自己一小時就做完了,中間還要溝通,做完質(zhì)量不行還要幫忙擦屁股,花的時間超過自己寫的時間,一點都不合算,另可自己做。

這些確實是事實,但是可能忽略了一些問題:

  1. 實習生是會成長的,很多事情教了一遍就不需要再教第二遍了。
  2. 再復(fù)雜的程序也是有些“體力活”的,比如說搭個腳手架,新增個模塊,簡單的重命名/重構(gòu),等等。對于資深程序員來說,老是干體力活會倦怠的,但是對實習生來說正好是一個學習的好機會。
  3. 能從實習生身上學習到新的東西。當我們對一門技術(shù)太熟悉,會有路徑的依賴,不太容易發(fā)現(xiàn)或者接受新的技術(shù),同樣的任務(wù)讓實習生做,雖然大多數(shù)時候不如你做的,但是也會有眼前一亮的時候,能學到一點新的東西或者開闊一下眼界:原來還可以這樣!
  4. 如果你的任務(wù)不能交給實習生做,也許架構(gòu)上存在一些不足,無法合理的將功能拆分。有些程序員的活不能拆分出來,一個原因可能是架構(gòu)還不夠好,模塊都在一起,無法拆分。當然即使拆分后肯定還是有些復(fù)雜模塊是無法進一步拆分的,這不在此列。

我在帶實習生上有一些經(jīng)驗,所以在使用 Cursor 或者 GitHub Copilot 的時候,就是把 AI 當成一個實習生用,效果是很好的。

01 首先體力活都交給 AI 來做

體力活指的是那種重復(fù)的、要求不高的、繁瑣的工作。比如說:

  • 新建一個頁面、一個 API
  • 一個數(shù)據(jù)庫增刪改查的模塊
  • 單元測試

這些活說難也不難,但是自己寫有點麻煩,所以我每次都是 Cursor 里面用 CMD+i 喚出 Composer,把相關(guān)代碼文件都添加上作為上下文,然后提出要求,一個初始的功能就有了。

比如我要為自己的博客網(wǎng)站增加一個 Sitemap 的功能,我當然可以自己寫,但光文件都得創(chuàng)建好幾個,還得寫一些基本的讀取數(shù)據(jù)庫和輸出 Sitemap 代碼,甚至我還得去查詢一下 Sitemap 規(guī)范。正因為如此,所以我一直懶得加上這功能。

很快就幫我把相關(guān)文件都創(chuàng)建好了,雖然說 robots.txt 都給我做成動態(tài)的有點業(yè)余,但是也還好,至少我知道了內(nèi)容應(yīng)該是什么,懶一點就讓它重新生成個靜態(tài)文件,勤快一點就手動創(chuàng)建一個。剩下的就是調(diào)試一下,沒什么問題就可以發(fā)布了。

理論上基于這個結(jié)果,還可以一直提要求,知道滿意為止,或者差不多了自己接管手動修改一下。

我個人是覺得,讓 AI 幫忙先實現(xiàn)一個基本的模塊,意義不僅僅在于減少了體力活,而是幫你開了個頭!萬事開頭難,很多時候真的就是因為沒有一個開頭就沒繼續(xù),當有個初始的結(jié)果,哪怕爛一點,再基于它上面修改要簡單很多,更容易交付。

02 給“實習生”一個葫蘆,讓他們學著畫瓢

對于實習生來說,稍微復(fù)雜一點任務(wù)很難從無到有做出來,但是如果給他們一個已經(jīng)做好的模塊作為參考,照著葫蘆畫瓢,那么也能做個差不離。

讓 AI 幫你編程也是一樣的,你不能指望 AI 能像你一樣厲害懂你的代碼庫,但是你可以教它,把一個類似的實現(xiàn)代碼給它參考,甚至于寫一段偽代碼讓它實現(xiàn)。

就拿前面 sitemap 的例子,添加到上下文的 feed.xml/route.ts 就是“葫蘆”,有了這個“葫蘆”,它去“畫瓢”就容易多了,它可以從中去學習最佳實踐是什么。

03 設(shè)計架構(gòu)和技術(shù)選型的時候,選“實習生”熟悉容易上手的技術(shù)

技術(shù)選型是一個讓人糾結(jié)的事情,需要各種考量,現(xiàn)在更是多了一個維度,就是要考慮把 AI 當成你的團隊成員,想讓 AI 能更好的幫你干活,那么就少造一些輪子,少用一些偏僻的框架或類庫,用那種最流行的,訓練語料最多的框架和庫。

比如我在給自己搭建博客的時候,選的 Nextjs、Tailwindcss、ShadcnUI、D1(Sqlite),這些都是相當流行和容易上手的框架和庫,所以我讓 AI 幫我實現(xiàn)一個 Sitemap,它能知道在什么創(chuàng)建文件,遵循什么規(guī)范,寫 UI 也知道如何幫我添加正確的 CSS。

04 將復(fù)雜任務(wù)分解成簡單的任務(wù),讓“實習生”幫你完成小的模塊

資深程序員和新手程序員的一個分界,就是能不能將復(fù)雜模塊拆分成簡單的小模塊。比如我要搭建一個自己的博客網(wǎng)站,就 AI 現(xiàn)在的能力,是沒辦法自動完成這樣一個項目,但是我可以讓它幫我創(chuàng)建一個頁面,幫我實現(xiàn)一個數(shù)據(jù)庫讀寫的功能模塊,幫我基于數(shù)據(jù)庫讀寫模塊實現(xiàn)一個 API,而我自己,則可以聚焦于數(shù)據(jù)庫的表設(shè)計、系統(tǒng)的架構(gòu)設(shè)計、UI 設(shè)計這些事情上。

05 向“實習生”學習

現(xiàn)在在實現(xiàn)功能的時候,哪怕我比較熟悉的,我會習慣性問一下 AI,讓它幫我生成一段代碼,雖然大多數(shù)時候它不一定比我寫的更好,甚至是錯誤的,但有時候它能提出一種全新的我沒考慮過的思路,那我就能從中學習到點什么,以后可能就用的上了。

就像大數(shù)學家陶哲軒,也在用 AI 幫忙解決數(shù)學問題,并非 AI 數(shù)學比他厲害,而是給他提供了不一樣的思路。

我曾遇到過一個問題,我嘗試了幾種方法,但都無法解決。于是,我嘗試詢問 GPT,你建議我使用什么其他方法來解決這個問題?GPT 給我提供了 10 種可能的方法,其中有 5 種我已經(jīng)嘗試過,或者明顯沒有幫助。的確,有幾種方法并不實用。但其中有一種我還沒嘗試過的方法,那就是針對這個問題使用生成函數(shù)。當 GPT 建議我使用這種方法時,我意識到這就是我漏掉的正確方法。所以,將 GPT 視為一個交流伙伴,它確實具有一定的用處。
——陶哲軒

06 對“實習生”產(chǎn)出的結(jié)果要驗證

既然 AI 只是一個實習生,那么就說明它生成的代碼是靠不住的,哪怕看起來很好,總是要像對待實習生一樣,去對代碼做審查,理解它實現(xiàn)的思路,對結(jié)果進行測試驗證,出現(xiàn)問題讓 AI 改進或者手動修復(fù)。

如果有人去責怪產(chǎn)品的問題是因為 AI 生成的質(zhì)量不行,那只能說明是在甩鍋,就像你生產(chǎn)環(huán)境的故障不能怪這是實習生寫的,難道你們不做 Code Review,不做 QA 的嗎?

07 最后

這是我在日常使用 AI 輔助編程的一點經(jīng)驗分享。如果你把 AI 當成一個資深程序員,那么你大概是要失望的,但是如果你把 AI 當作一個實習生,它真的可以做不少事情,讓你提升編程效率。

另外一些現(xiàn)在 AI 還不能完全替代專業(yè)程序員的地方:

  • 基于業(yè)務(wù)需求進行抽象和架構(gòu)設(shè)計的能力
  • 對復(fù)雜問題進行分解和統(tǒng)籌規(guī)劃的能力
  • 出現(xiàn)問題定位和調(diào)試的能力
  • 當然還有出問題背鍋的能力

歡迎分享你的經(jīng)驗!

本文由人人都是產(chǎn)品經(jīng)理作者【賽博禪心】,微信公眾號:【賽博禪心】,原創(chuàng)/授權(quán) 發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,禁止轉(zhuǎn)載。

題圖來自Unsplash,基于 CC0 協(xié)議。

更多精彩內(nèi)容,請關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號或下載App
評論
評論請登錄
  1. 目前還沒評論,等你發(fā)揮!