本文內容為Will保哥 GitHub Copilot 協作開發實戰課程筆記[^2]
GitHub Copilot 是一個編輯器的外掛,可用於VS Code、Visual Studio
## 目錄
[2024.01.29 簡介GitHub Copilot](https://hackmd.io/@Eudicotz/BJVuG93i6)
[2024.02.05 安裝和設定 GitHub Copilot](https://hackmd.io/@Eudicotz/rkVeQ5hip)
[2024.02.05 GitHub Copilot實際操作](https://hackmd.io/@Eudicotz/HkIj793oT)
[2024.02.16 GitHub Copilot advance usage其他妙用](https://hackmd.io/@Eudicotz/SyGvHkAsT)
[2024.02.16 GitHub Copilot Chat](https://hackmd.io/@Eudicotz/BkfOVkCiT)
## 什麼是GitHub Copilot
- 基於AI/LLM的開發助手,用於改善開發者體驗(DX: Developer Experience)
- 核心技術來自GPT-3.5 Turbo模型,但**已更新至GPT-4** [^1]
- 基於自然語言文本資料集進行訓練,具備一定的**推理能力**
- 初階者常遇盲區:只使用註解來產生資料
- 主要能力
- 運用輸入的**部分程式碼**與描述(**註解**)來產生相應的程式碼
- 可以**解釋程式碼**的邏輯與行為,任何複雜的邏輯都可以解釋
- 注意事項:GitHub Copilot不是萬能
- 可以透過精練的提示(**Prompt**)告訴他該如何行動(**Action**)
- 必須**與使用者協作**,它不是一個可以單獨憑空產生出完整程式碼的工具
- 如何讓GitHub Copilot可以發揮到極致?
- Prompt 非常重要
- 「說人話」,如果人可以理解,那GitHub Copilot就可以理解
## 大幅提升開發者體驗(DX)
### 幾乎支援「任何」程式語言
- 其訓練資料來自於GitHub的Public Repo
- **能找到的Source Code越多,則其能理解語言的能力越強**,例如廣泛使用的Python、JavaScript等
- 越少公開的程式語言範例,則產生的代碼則越爛,因訓練資料受限,例如:COBOL(訓練資料不多)
- 寫最好的語言是**JavaScript**,因為訓練資料最多,而Python、Java、C#、Golang同樣也有很好的表現
### 專注於解決問題
- 開發人員經常容易「**切換畫面**」到Stack Overflow或其他網站尋找資料
- GitHub Copilot完美解決這個問題,減少需要切出IDE外查詢的時間
- 大多數簡單、重複、單調的問題可以藉由其自動產生解決
- 產出的Code**取決於專案內的Code品質**:目前專案的Code品質越好,GitHub Copilot能產生的Code就更好,也因此對於越Senior的工程師幫助越大
- 能夠產生多重範本(且為多執行續Call多次API),速度極快,可選到需要的使用
- Flow
- 強調寫 Code 的「心流」模式不被破壞!
## GitHub Copilot運作機制

1. 送出Context
- GitHub Copilot送出選取範圍的Code
- 同時送出上下文
2. Context送入GitHub Server,同時產生出一份專業的Prompt
3. 將Prompt送入GPT模型,現在為GPT-4,回傳可能為文字也可能為Code
4. GitHub Server會整理為程式碼建議
5. 將建議(Suggestion)寫入原選取Code範圍之後
## GitHub Copilot 特色
- 精準的**判斷上下文**,並**自動完成**程式碼
- 檔名、路徑名、類別名、已開啟的檔案內容、現有程式碼的上下文內容
- 沒有足夠的上下文,也可以透過「**註解**」提供更完整的上下文資訊
- 可透過**妥善命名**的**類別**、**方法**、**參數**即可自動產生適合的程式碼
- 擅長撰寫**重複的程式碼**,可幫助開發人員節省時間和精力,提高開發效率
- 可以學習並模仿自己的Code,在另外的檔案產生Code
- Code的品質取決於自己撰寫的能力:**範本越好產生Code越好**
- 可以幫助新手開發者快速上手一門技術,如 HTML, CSS, JS, C#, ...
- 可自動建立與撰寫**單元測試**程式碼
- 可促進程式碼的**標準化**和**可讀性**
## GitHub Copilot 優點
- 可以**快速生成程式碼**,節省開發人員的時間與精力
- 可在不熟悉的領域提高寫Code的自信度
- 可以**根據上下文**提供**建議**與**提示**,幫助開發人員更好地理解程式與問題
- 上下文如何判斷而轉為Prompt是黑箱,目前只知道會擷取上下文,但不告知是如何做的
- 可以**提高程式碼品質**和**開發效率**,減少錯誤和瑕疵(但不保證)
- 可以**學習**和**進化**,不斷提高其生成程式碼的**品質**與**準確性**
## GitHub Copilot的限制與潛在問題
- 可能存在**版權**和**隱私**問題
- 因為訓練來源來自大量的GitHub的開源(Open Source)程式庫
- 有可能有開源授權與公司衝突,或是該開源並不給予修改
- 設定:GitHub > Settings > Copilot
- Suggestions matching public code
- Allowed:檢查與開源庫有無重疊地方 ,也就是拿**產生的Code**來比對有無抄襲嫌疑
- 結論:建議勾選,取消反而不會去比對
- Allow GitHub to use my code snippets for product improvements
- 自己的程式碼是否允許**給GitHub Copilot進行訓練**
- 可能產生不合理或不安全程式碼
- 因為他不見得可以理解給出的上下文
- 可能會對開發人員的技能產生影響
[^1]: [嘴一下,就能寫出程式?GitHub升級Copilot、導入GPT-4,提高10倍生產力](https://www.bnext.com.tw/article/74557/github-copilot-chatbot-openai-gpt-4)
[^2]:[GitHub-Copilot-協作開發實戰](https://www.accupass.com/event/2311170145205340711850)