像用實(shí)習(xí)生一樣用 AI 輔助你編程
不少人認(rèn)為大模型現(xiàn)在已經(jīng)這么強(qiáng)了,做點(diǎn)事怎么感覺(jué)這么弱智。其實(shí),政治的使用方法,是像帶實(shí)習(xí)生一樣使用AI工具——就像作者在正文中分享的經(jīng)驗(yàn)一樣。
我是不敢讓 ai 幫我寫程序的,每回問(wèn)它的問(wèn)題,十次倒有八次是錯(cuò)的,問(wèn)完之后還要自己去網(wǎng)上搜一遍,然后反復(fù)測(cè)試,才敢寫進(jìn)代碼。不知道大家怎么甩手給它的。
——響馬
響馬毫無(wú)疑問(wèn)是編程高手,幾十年的開發(fā)經(jīng)驗(yàn),另外他寫的代碼都屬于一些底層代碼,被訓(xùn)練過(guò)的比例極少,AI 大概率寫不出來(lái)高質(zhì)量代碼,不放心讓 AI 幫忙寫程序正常。但對(duì)于普通程序員來(lái)說(shuō),不一定要像響馬那樣,拒絕 AI 的幫助。
比如我就是個(gè)普通程序員,寫的都是一些簡(jiǎn)單的前端 UI 代碼,或者后端增刪改查代碼,并沒(méi)有太高技術(shù)含量,就經(jīng)常讓 AI 給我?guī)兔Γ€是讓我效率提升不少的。我總結(jié)下來(lái)經(jīng)驗(yàn)就是:像用實(shí)習(xí)生一樣用 AI 輔助你編程。
在科技公司或者開發(fā)團(tuán)隊(duì)經(jīng)常能看到這樣的場(chǎng)景:某些資深程序員,寫代碼特別牛,效率特別高,但是很多活都?jí)涸谒麄兩砩希蔀榱藞F(tuán)隊(duì)瓶頸,于是老板說(shuō),這樣不行,給你幾個(gè)實(shí)習(xí)生或者新手程序員幫你分擔(dān)一些吧。
大多數(shù)時(shí)候這種提議是被拒絕的,倒不是他們藏私不愿意帶人,而是在他們看來(lái),把活交給實(shí)習(xí)生,一個(gè)簡(jiǎn)單的任務(wù)都要花幾天時(shí)間,自己一小時(shí)就做完了,中間還要溝通,做完質(zhì)量不行還要幫忙擦屁股,花的時(shí)間超過(guò)自己寫的時(shí)間,一點(diǎn)都不合算,另可自己做。
這些確實(shí)是事實(shí),但是可能忽略了一些問(wèn)題:
- 實(shí)習(xí)生是會(huì)成長(zhǎng)的,很多事情教了一遍就不需要再教第二遍了。
- 再?gòu)?fù)雜的程序也是有些“體力活”的,比如說(shuō)搭個(gè)腳手架,新增個(gè)模塊,簡(jiǎn)單的重命名/重構(gòu),等等。對(duì)于資深程序員來(lái)說(shuō),老是干體力活會(huì)倦怠的,但是對(duì)實(shí)習(xí)生來(lái)說(shuō)正好是一個(gè)學(xué)習(xí)的好機(jī)會(huì)。
- 能從實(shí)習(xí)生身上學(xué)習(xí)到新的東西。當(dāng)我們對(duì)一門技術(shù)太熟悉,會(huì)有路徑的依賴,不太容易發(fā)現(xiàn)或者接受新的技術(shù),同樣的任務(wù)讓實(shí)習(xí)生做,雖然大多數(shù)時(shí)候不如你做的,但是也會(huì)有眼前一亮的時(shí)候,能學(xué)到一點(diǎn)新的東西或者開闊一下眼界:原來(lái)還可以這樣!
- 如果你的任務(wù)不能交給實(shí)習(xí)生做,也許架構(gòu)上存在一些不足,無(wú)法合理的將功能拆分。有些程序員的活不能拆分出來(lái),一個(gè)原因可能是架構(gòu)還不夠好,模塊都在一起,無(wú)法拆分。當(dāng)然即使拆分后肯定還是有些復(fù)雜模塊是無(wú)法進(jìn)一步拆分的,這不在此列。
我在帶實(shí)習(xí)生上有一些經(jīng)驗(yàn),所以在使用 Cursor 或者 GitHub Copilot 的時(shí)候,就是把 AI 當(dāng)成一個(gè)實(shí)習(xí)生用,效果是很好的。
01 首先體力活都交給 AI 來(lái)做
體力活指的是那種重復(fù)的、要求不高的、繁瑣的工作。比如說(shuō):
- 新建一個(gè)頁(yè)面、一個(gè) API
- 一個(gè)數(shù)據(jù)庫(kù)增刪改查的模塊
- 單元測(cè)試
這些活說(shuō)難也不難,但是自己寫有點(diǎn)麻煩,所以我每次都是 Cursor 里面用 CMD+i 喚出 Composer,把相關(guān)代碼文件都添加上作為上下文,然后提出要求,一個(gè)初始的功能就有了。
比如我要為自己的博客網(wǎng)站增加一個(gè) Sitemap 的功能,我當(dāng)然可以自己寫,但光文件都得創(chuàng)建好幾個(gè),還得寫一些基本的讀取數(shù)據(jù)庫(kù)和輸出 Sitemap 代碼,甚至我還得去查詢一下 Sitemap 規(guī)范。正因?yàn)槿绱耍晕乙恢睉械眉由线@功能。
很快就幫我把相關(guān)文件都創(chuàng)建好了,雖然說(shuō) robots.txt 都給我做成動(dòng)態(tài)的有點(diǎn)業(yè)余,但是也還好,至少我知道了內(nèi)容應(yīng)該是什么,懶一點(diǎn)就讓它重新生成個(gè)靜態(tài)文件,勤快一點(diǎn)就手動(dòng)創(chuàng)建一個(gè)。剩下的就是調(diào)試一下,沒(méi)什么問(wèn)題就可以發(fā)布了。
理論上基于這個(gè)結(jié)果,還可以一直提要求,知道滿意為止,或者差不多了自己接管手動(dòng)修改一下。
我個(gè)人是覺(jué)得,讓 AI 幫忙先實(shí)現(xiàn)一個(gè)基本的模塊,意義不僅僅在于減少了體力活,而是幫你開了個(gè)頭!萬(wàn)事開頭難,很多時(shí)候真的就是因?yàn)闆](méi)有一個(gè)開頭就沒(méi)繼續(xù),當(dāng)有個(gè)初始的結(jié)果,哪怕爛一點(diǎn),再基于它上面修改要簡(jiǎn)單很多,更容易交付。
02 給“實(shí)習(xí)生”一個(gè)葫蘆,讓他們學(xué)著畫瓢
對(duì)于實(shí)習(xí)生來(lái)說(shuō),稍微復(fù)雜一點(diǎn)任務(wù)很難從無(wú)到有做出來(lái),但是如果給他們一個(gè)已經(jīng)做好的模塊作為參考,照著葫蘆畫瓢,那么也能做個(gè)差不離。
讓 AI 幫你編程也是一樣的,你不能指望 AI 能像你一樣厲害懂你的代碼庫(kù),但是你可以教它,把一個(gè)類似的實(shí)現(xiàn)代碼給它參考,甚至于寫一段偽代碼讓它實(shí)現(xiàn)。
就拿前面 sitemap 的例子,添加到上下文的 feed.xml/route.ts 就是“葫蘆”,有了這個(gè)“葫蘆”,它去“畫瓢”就容易多了,它可以從中去學(xué)習(xí)最佳實(shí)踐是什么。
03 設(shè)計(jì)架構(gòu)和技術(shù)選型的時(shí)候,選“實(shí)習(xí)生”熟悉容易上手的技術(shù)
技術(shù)選型是一個(gè)讓人糾結(jié)的事情,需要各種考量,現(xiàn)在更是多了一個(gè)維度,就是要考慮把 AI 當(dāng)成你的團(tuán)隊(duì)成員,想讓 AI 能更好的幫你干活,那么就少造一些輪子,少用一些偏僻的框架或類庫(kù),用那種最流行的,訓(xùn)練語(yǔ)料最多的框架和庫(kù)。
比如我在給自己搭建博客的時(shí)候,選的 Nextjs、Tailwindcss、ShadcnUI、D1(Sqlite),這些都是相當(dāng)流行和容易上手的框架和庫(kù),所以我讓 AI 幫我實(shí)現(xiàn)一個(gè) Sitemap,它能知道在什么創(chuàng)建文件,遵循什么規(guī)范,寫 UI 也知道如何幫我添加正確的 CSS。
04 將復(fù)雜任務(wù)分解成簡(jiǎn)單的任務(wù),讓“實(shí)習(xí)生”幫你完成小的模塊
資深程序員和新手程序員的一個(gè)分界,就是能不能將復(fù)雜模塊拆分成簡(jiǎn)單的小模塊。比如我要搭建一個(gè)自己的博客網(wǎng)站,就 AI 現(xiàn)在的能力,是沒(méi)辦法自動(dòng)完成這樣一個(gè)項(xiàng)目,但是我可以讓它幫我創(chuàng)建一個(gè)頁(yè)面,幫我實(shí)現(xiàn)一個(gè)數(shù)據(jù)庫(kù)讀寫的功能模塊,幫我基于數(shù)據(jù)庫(kù)讀寫模塊實(shí)現(xiàn)一個(gè) API,而我自己,則可以聚焦于數(shù)據(jù)庫(kù)的表設(shè)計(jì)、系統(tǒng)的架構(gòu)設(shè)計(jì)、UI 設(shè)計(jì)這些事情上。
05 向“實(shí)習(xí)生”學(xué)習(xí)
現(xiàn)在在實(shí)現(xiàn)功能的時(shí)候,哪怕我比較熟悉的,我會(huì)習(xí)慣性問(wèn)一下 AI,讓它幫我生成一段代碼,雖然大多數(shù)時(shí)候它不一定比我寫的更好,甚至是錯(cuò)誤的,但有時(shí)候它能提出一種全新的我沒(méi)考慮過(guò)的思路,那我就能從中學(xué)習(xí)到點(diǎn)什么,以后可能就用的上了。
就像大數(shù)學(xué)家陶哲軒,也在用 AI 幫忙解決數(shù)學(xué)問(wèn)題,并非 AI 數(shù)學(xué)比他厲害,而是給他提供了不一樣的思路。
我曾遇到過(guò)一個(gè)問(wèn)題,我嘗試了幾種方法,但都無(wú)法解決。于是,我嘗試詢問(wèn) GPT,你建議我使用什么其他方法來(lái)解決這個(gè)問(wèn)題?GPT 給我提供了 10 種可能的方法,其中有 5 種我已經(jīng)嘗試過(guò),或者明顯沒(méi)有幫助。的確,有幾種方法并不實(shí)用。但其中有一種我還沒(méi)嘗試過(guò)的方法,那就是針對(duì)這個(gè)問(wèn)題使用生成函數(shù)。當(dāng) GPT 建議我使用這種方法時(shí),我意識(shí)到這就是我漏掉的正確方法。所以,將 GPT 視為一個(gè)交流伙伴,它確實(shí)具有一定的用處。
——陶哲軒
06 對(duì)“實(shí)習(xí)生”產(chǎn)出的結(jié)果要驗(yàn)證
既然 AI 只是一個(gè)實(shí)習(xí)生,那么就說(shuō)明它生成的代碼是靠不住的,哪怕看起來(lái)很好,總是要像對(duì)待實(shí)習(xí)生一樣,去對(duì)代碼做審查,理解它實(shí)現(xiàn)的思路,對(duì)結(jié)果進(jìn)行測(cè)試驗(yàn)證,出現(xiàn)問(wèn)題讓 AI 改進(jìn)或者手動(dòng)修復(fù)。
如果有人去責(zé)怪產(chǎn)品的問(wèn)題是因?yàn)?AI 生成的質(zhì)量不行,那只能說(shuō)明是在甩鍋,就像你生產(chǎn)環(huán)境的故障不能怪這是實(shí)習(xí)生寫的,難道你們不做 Code Review,不做 QA 的嗎?
07 最后
這是我在日常使用 AI 輔助編程的一點(diǎn)經(jīng)驗(yàn)分享。如果你把 AI 當(dāng)成一個(gè)資深程序員,那么你大概是要失望的,但是如果你把 AI 當(dāng)作一個(gè)實(shí)習(xí)生,它真的可以做不少事情,讓你提升編程效率。
另外一些現(xiàn)在 AI 還不能完全替代專業(yè)程序員的地方:
- 基于業(yè)務(wù)需求進(jìn)行抽象和架構(gòu)設(shè)計(jì)的能力
- 對(duì)復(fù)雜問(wèn)題進(jìn)行分解和統(tǒng)籌規(guī)劃的能力
- 出現(xiàn)問(wèn)題定位和調(diào)試的能力
- 當(dāng)然還有出問(wèn)題背鍋的能力
歡迎分享你的經(jīng)驗(yàn)!
本文由人人都是產(chǎn)品經(jīng)理作者【賽博禪心】,微信公眾號(hào):【賽博禪心】,原創(chuàng)/授權(quán) 發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,禁止轉(zhuǎn)載。
題圖來(lái)自Unsplash,基于 CC0 協(xié)議。
- 目前還沒(méi)評(píng)論,等你發(fā)揮!