使用Github Copilot心得

Evan Chen
Mar 30, 2023

--

Photo by Possessed Photography on Unsplash

Github Copilot 是微軟所出的一個程式碼輔助工具,在許多IDE都可以使用。在Jetbrain 系列產品可以直接安裝Plugin,所以Android Studio 當然也可以使用。它能夠根據你的程式碼前後文和註解來生成程式碼。例如當你寫一個方法叫做 calculateBMI,Copilot 就可以根據你的程式碼上下文生成相應的內容

你也可以先寫註解,它就會幫你把整個方法寫出來

Copilot 跟 ChatGPT的使用情境不太一樣,你不能像ChatGPT一樣問問題,也不能選取一段程式問它是否有問題(在Copilot X 可能就會可以)。Copilot 可以根據你程式碼的前後文提供建議來產生程式碼片段。意思是你不需要下指令叫它做什麼,它會根據你程式碼的前後文提供建議。

例如我有一個頁面叫影片資訊頁,可以傳入2個參數,影片id影片類型:電影或影集。我在Activity寫了如下的程式碼。表示我有兩個要透過Intent接收的參數。

companion object 裡接著按下Enter,Copilot會用灰色的問你是不是要寫一個newIntent的function,其實是還蠻準的。

不過這不是我要的,我想要的是兩個getIntent function,一個給要顯示電影的、一個給要顯示影集的。所以我們可以不採用它的建議,接著自已打function名稱。當打到intentBy的時候,Copilot 就會改建議你intentByMovieId,也就是根據前後文它已經知道你要的是2個function,其中一個是intentByMovie。產生完這個function,Copilot 就會再給你另一個function intentByServices了。

用起來超級方便的。

再來看另一個例子,我想要取得一個List<Int>的最大值,但我忘了怎麼寫,你可以怎麼讓AI來幫你。

其中一種方式就是寫註解// get max of list,它就會幫你產生如何取得list的最大值。

不過這種方式其實不好,因為你需要再手動刪除註解。不論你是否使用Copilot,如果需要註解,就應該加上註解;反之,如果不需要註解,也不應該因為使用Copilot而強制加上註解。

比較好的方式是我們先自已寫 val max,這個max變數,其實就表達出你的需求了,剩下的就由Copilot來完成。

寫程式的是你,Copiloto只是輔助。很多人會說可以叫AI寫程式,你負責Review就好。這種寫程式的方式其實是很慢的,你還要檢查哪裡寫錯。你應該用漸進的方式,你每寫一些程式碼,Copilot 就會建議接下來怎麼寫。他給的準就採用。給的不準,你就繼續寫。過程中,它會越來越知道你要做什麼。在每個決定的當下再看是否採用AI的建議。

當然還是有些地方是適合用註解的,例如我要加入dependency,我不會記得完整的名稱,這時用註解來表達你要做什麼就很方便,當然產生後記得把註解刪掉。

或是幫程式碼產生註解或文件,下面這個function,當我寫/*就。Copilot就會幫我寫完註解。

單元測試

來看寫單元測試有沒有幫助,我有個ShoppingCart可以買書跟計算總價,買2本8折,買3本以上7折。

ShoppingCart 寫@Test 後,Copilot就會先幫你寫好第1個測試案例:購物車裡如果沒有書,售價為0元。

按下enter,它會再幫你產生第2個測試案例,只買1本書時,價錢會是原價。

按下enter會再產生第3個測試案例,到這裡覺得它還蠻聰明的,會知道在你的production code中,買兩本書會打9折。不過實測其實也常常不太準,它不完全知道你的Production code。

到這裡我們都用Copilot產生的測試程式碼,其實應該會開始發現不太對:

  1. 你的測試案例沒有表達出需求,例如買1本是原價,買2本8折並沒有在測試方法的名稱表達出來。
  2. assert 寫法也不對,當測試失敗時,你不會知道expected及actual是什麼。

不過這不代表不能使用Copilot來協助寫測試,而是你應該在過程中讓它知道你想要怎麼寫。

我們重來一次自已寫測試方法buy one book should no discount,表達出買1本書是沒有折扣的,驗證的方式也改用assertEqual。

通過測試後,我再重構一下。

重構完,繼續寫下一個案例買2本書打9折,當我寫完方法名稱,Copilot 建議的方法內容,就完全符合我要的了,跟我重構完的寫法是一樣的。

總結一下使用心得,使用 Github Copilot 時,不建議將其視為「AI 助理」,因為使用指令讓它幫忙寫程式,並不一定能產生符合需求的程式碼,也會浪費後續時間在檢查及修改上。相反地,我們應該讓 Copilot 知道我們在寫什麼程式。所以好的程式習慣非常重要,例如在定義類別名稱、方法名稱、變數時,是否有清晰地表達出你的需求。當你的程式碼能夠正確描述需求,有時候類別名稱寫出來後, Copilot 就能準確的猜測你接下來的操作。相反地,如果方法名稱、變數名稱命名混亂,或者存在typo、奇怪的縮寫等,Copilot 可能就會給你錯誤的建議。

應該將 Copilot 視為「副駕駛」而非「助理」。不要浪費時間下指令讓它做事,專注於寫好程式及需求。只要你專注於寫程式,Copilot 就會在適當的時候提供輔助。當你的程式碼越好,Copilot 的建議也會越準確。

以上就是目前的使用心得,基於現在AI的發展速度非常快,幾個月後或者 Github Copilot X 推出後,Copilot 的使用方式可能已經有所不同。

在Android Studio或Jetbrain系列的產品要使用Copilot,只要在Plugin安裝Github Copilot即可。 費用是每月10美元,可以免費試用2個月,每月10美元可帶來工作效益的提升是非常值得的。

--

--