3 個工作上用 GitHub Copilot 寫 Python 時能利人利己的 coding 習慣

Keith Yang
iCHEF
Published in
5 min readJun 28, 2024

前情提要:會選用 GitHub Copilot(以下 Copilot 簡稱都是指 GitHub Copilot)一方面是公司的程式庫就是放在 GitHub 上,一方面是同事之前研究後覺得有幫助,公司就開放大家都可以選用這個服務。而認真用起來的契機,是因為後來的 Copilot 官方 Vim plugin 用一般的安裝方式就可以簡單設置完成,不再非得轉用 NeoVim 不可;以前試過並沒有那麼順暢。

如何用 GitHub Copilot 寫 Python 來利人利己呢?

好的寫 code 習慣,本身就會有助於 Copilot 的產出,就好像能幫助未來接手的同事與自己一樣。可以猜到了嗎?

1. 好的變數命名

即使常被笑說是軟體界最困難的問題,它還是如此重要。從檔名到相關的 import,都可能會影響 Copilot 的產出。

function 命名為 create_user 還是 a_function,可以想像產出的內容有很大的差距。 變數 data vs created_user 也很自然地會因為語意而影響 Copilot 的判斷,特別是 Python 的語法常常寫起來像在書寫自然語言。

目前在這邊看來,英文似乎還是要學好一點,畢竟把一切的一切命名成 i、x、data 或 result,想必 Copilot 與未來的同事與自己都會感到困擾吧。

2. Typing Hint

寫好了回傳的型別提示,很自然地,Copilot 會幫忙寫出對應的預期回傳值,特別是上文都準備好了要回傳的變數了,2024 年還要自己手 key 回傳的 dict?

例:按一下 Tab,Copilot 幫忙把 response 內容填好填滿

3. 程式碼文件 __doc__

即使平常習慣把 code 盡量寫得簡明易懂,但總是有複雜情境超越適當變數名稱長度可以解釋的,這時寫一些寫給未來的自己與同事看的說明,也會幫助 Copilot 的產出,例如:

def handle_special_input(input: str) -> int:
"""
Due to 3rd party API behavior, we need to transform the input to integer.
"""

hmmm … 它有時也蠻幽默的?

直接給了《生命、宇宙及萬事萬物》的終極答案 XD

Plus: 提升開發速度與完成度的小技巧

雖說 TDD 有點老生常談,不過在 AI 寫程式的年代,從預期要想的規格開始寫程式與測試,還是一個蠻實用的技巧。在本文最後列的參考書裡的範例,開發軟體時,從最後想完成的功能寫回來的示意圖:

其它覺得 Copilot 好用的地方

.寫 test 會幫你補完 assert 自己可能懶得寫的好多行,而好的測試名稱與變數一樣能讓 Copilot 幫上許多忙。
.視情境可以省打字 25~85%,然後有時可以幫忙發現寫得不夠好或為什麼它那麼想的問題。

覺得不好用的地方

.有時它就是寫得不夠好,或著就是會寫錯,就算給了幾次機會;而有時愈給它機會,就愈想找出辦法讓它懂,結果進入了另一個花費時間的育成遊戲。😅
.有時要多打開幾個相關的檔案或寫好 import,它才會預測得比較準,產出比較接近期待的程式。

心智模式的轉變

開著 Copilot 寫程式,有點像以前敏捷開發中看到的 eXtreme Programming 裡的起手式:Pair programming,只是這次跟我們 pairing 的是 AI(綜合而平均值的人格?)而非各式各樣的人格喜好。相較於以前寫程式就是自己要手寫所有的 code,現在可以在動手前想一下,哪些是它可以幫忙做掉的,甚至先在 ChatGPT 上跟 AI 討論過軟體架構設計的 design review

另外即使沒有用 Copilot,PyCharm 也有 Full Line Code Completion plugin,會自動建議那一行可能要做什麼,用起來也有感受到它的小聰明,例如下圖中灰色字的提示,可以看到它知道 model 的其它 attributes 有在下面被 for loop 過了。

參考書

Learn AI-Assisted Python Programming 雖說比較從不要求有程式經驗開始的導引書,但內容看來蠻完整豐富的。有 15 年程式經驗也寫過 Python 教科書的作者表示:

Skills like problem decomposition, code specification, code reading, and code testing have become even more important than they were in the past; skills like knowing library semantics and syntax become less important.

--

--