如何使用GitHub Copilot成為更快樂、更高效的開發(fā)人員
Copilot 提供了多種 AI 工具,這些工具從根本上簡化了我作為軟件開發(fā)人員的體驗。我用它來生成代碼、測試,甚至是簡單的應用程序。它還非常適合調(diào)試、重構(gòu)和記錄現(xiàn)有代碼。
奇怪的是,使用 Copilot 使我開發(fā)功能的速度快于業(yè)務利益相關(guān)者審查它們的速度。
重要的是要注意,包括 Copilot 在內(nèi)的人工智能工具可能會公然犯錯,在糾正后道歉(或不道歉),然后自信地產(chǎn)生同樣的錯誤。但是,只要您意識到 AI 工具的缺點,并且有足夠的編碼知識來識別它們何時不正確,您就可以在顯著提高生產(chǎn)力的道路上減輕它們。
如何設置 GitHub Copilot
有關(guān) Copilot 的設置和基本用法,請查看文檔。您可以將 Copilot 添加到個人或企業(yè)帳戶,并且可以免費試用,試用后價格合理。
將 Copilot 添加到您的 GitHub 帳戶后,您需要為您的 IDE 安裝插件并登錄 GitHub 以訪問 Copilot。
在本文中,我們將使用這些Visual Studio Code 擴展:
GITHUB 擴展描述預覽副駕駛AI 配對程序員與 in-IDE 代碼建議不副駕駛每晚Copilot 的夜間構(gòu)建,包括最新更改不副駕駛實驗室側(cè)邊欄中的實驗性功能是的副駕駛聊天邊欄中的交互式聊天,Copilot X 的一部分是的副駕駛語音語音助手是的
筆記:
此信息在撰寫本文時是最新的,但可能會隨著 GitHub 開發(fā)這些產(chǎn)品而改變。
我還沒有收到 Copilot Voice 或 Copilot (X) for Pull Requests 的訪問權(quán),所以我對這些的看法是有限的,并且基于 GitHub 的預覽文檔。
隱私
在進入 Copilot 的一些關(guān)鍵用例之前,先簡要說明一下隱私:基本上,如果您信任 GitHub 來托管您的源代碼,您可能會相信他們對您的 Copilot 提示和代碼片段所做的工作。[查看他們的常見問題文檔和隱私聲明。]
GitHub Copilot 的用例
GitHub Copilot 的用例很多,尤其是當您添加實驗室、聊天和語音的預覽功能時。使用 Copilot 的功能可以真正簡化開發(fā)過程。
以下是一些利用 Copilot 擴展的好方法:
類別分機代碼生成副駕駛,副駕駛夜間,副駕駛語音解釋代碼副駕駛實驗室、副駕駛聊天、副駕駛語音語言翻譯副駕駛實驗室,副駕駛聊天調(diào)試副駕駛實驗室,副駕駛聊天重構(gòu)副駕駛實驗室,副駕駛聊天測試生成Copilot、Copilot Nightly、Copilot Labs、Copilot Chat代碼審查副駕駛聊天語音驅(qū)動開發(fā)副駕駛語音
代碼生成
Copilot 以其代碼完成功能而聞名。如果在代碼中給出了注釋或者您鍵入了一行代碼的開頭,Copilot 將建議您可以接受、忽略或探索替代方案的解決方案。它被稱為“幽靈文本”。
安裝 Copilot 擴展程序并登錄后,代碼完成就像輸入說明一樣簡單,并在建議出現(xiàn)后按 Tab 鍵。
Copilot 用于創(chuàng)建方法和調(diào)用的 Ruby 注釋提示
將代碼完成更進一步,Copilot Chat 可以接受一個提示并生成構(gòu)建整個應用程序的說明。
我要求它在 Node 中使用“產(chǎn)品”的 CRUD 函數(shù)創(chuàng)建一個 REST API,它生成了功能代碼。整體印象深刻。在同樣的提示下,ChatGPT 還為我提供了如何運行代碼的說明,這很好。
Copilot Voice 還可以根據(jù)語音命令編寫或編輯代碼。大多數(shù)時候,使用帶有 Copilot 代碼完成功能的鍵盤比使用語音口述代碼行更快。但是考慮使用 Copilot Voice 來創(chuàng)建和運行代碼而無需鍵入或盯著屏幕是很有說服力的。
解釋代碼
我經(jīng)常必須盯著屏幕才能弄清楚一段代碼在做什么。有時它是我不了解業(yè)務上下文的遺留代碼。有時它使用我不習慣的特定庫。有時我會詛咒寫它的人,即使是我。
下面是 Copilot Chat 從上面的“節(jié)點中的 REST API...”提示生成的一些代碼:
?app.get('/products/:id', (req, res) => {
? ?const id = req.params.id;
? ?const product = products.find((p) => p.id === id);
? ?if (product) {
? ? ?res.json(product);
? ?} else {
? ? ?res.status(404).json({ error: 'Product not found' });
? ?}
?});
我把這段代碼輸入 Copilot Labs 的“解釋”功能。這是回應...
下面是對上面代碼的解釋: ?
我們使用路由路徑 /products/:id 定義路由。路徑中的冒號 : 表示它是一個路由參數(shù)。路由參數(shù)的值將在 req.params 中可用。例如路由路徑是/products/:id,我們向/products/5發(fā)起請求,那么req.params的值就是{id:5}。
我們從 req.params 獲取 id 并從 products 數(shù)組中找到具有給定 id 的產(chǎn)品。如果存在具有給定 id 的產(chǎn)品,我們將其退回。否則,我們將發(fā)送一個 404 錯誤響應,其中包含錯誤消息“未找到產(chǎn)品”。
這是一段非常簡單的代碼,響應也清晰明了。在函數(shù)上方的代碼注釋中將其作為文檔添加很容易。
另一個很好的例子是正則表達式。我了解正則表達式的工作原理,但我通常沒有耐心弄清楚特定正則表達式的作用。我向 Copilot Chat 提供了這個用于電子郵件驗證的巨大正則表達式語句:
?(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
它在高層次上解釋了正則表達式,表明它被分解為本地和域部分,代表電子郵件地址中“@”符號的前后。然后它描述了每個部分中允許的字符。很有幫助。 ?
語言翻譯
開發(fā)人員通常需要快速學習新的語言和框架。Copilot Labs 和 Chat 讓這一切變得非常簡單。這是由 Copilot 轉(zhuǎn)換的一系列 JavaScript 和 Ruby 產(chǎn)品:
?let products = [
? ?{ id: '1', name: 'Product 1', price: 10.99 },
? ?{ id: '2', name: 'Product 2', price: 19.99 },
? ?{ id: '3', name: 'Product 3', price: 7.99 }
?];
?products = [
? ?{ id: '1', name: 'Product 1', price: 10.99 },
? ?{ id: '2', name: 'Product 2', price: 19.99 },
? ?{ id: '3', name: 'Product 3', price: 7.99 }
?]
這是一個非常簡單的例子,所以讓我們試著把它變成一個類,然后換個方向(從 Ruby 到 JavaScript):
?class Product
? ?attr_reader :name, :price
?
? ?def initialize(name, price)
? ? ?@name = name
? ? ?@price = price
? ?end
?end
?class Product {
? ?constructor(name, price) {
? ? ?this.name = name;
? ? ?this.price = price;
? ?}
?}
這檢查出來。為了更好地衡量,我也測試了 TypeScript,它也工作得很好。
調(diào)試
這是一個非常方便的功能。您可以向 Copilot Chat 或 Labs 提供有問題的代碼或錯誤消息,它會指出它認為的問題所在。
Copilot Labs“修復錯誤”刷功能
我不能告訴你我拔了多少根頭發(fā),因為我找不到語法錯誤。Copilot 修復錯誤的能力只會讓我更快樂,更毛茸茸。
您還可以向 Copilot Chat 提供一條沒有其他提示的錯誤消息,它可以告訴您問題所在。我從 Node REST API 代碼中任意刪除了一個點:
?products[productIndex] = { id, ..req.body };
我復制/粘貼了 Chat 中的錯誤消息,它的響應是...
查看您提供的代碼摘錄,問題似乎出在第 49 行,其中對象文字中存在語法錯誤。之前的“..”req.body導致了錯誤。它應該只是一個點而不是兩個。
這是正確的(錯誤的行和來源)和錯誤的(它應該只是一個點)。然后它給了我一個帶有三個點的代碼片段,這也是正確的。
正如我一開始提到的,你必須仔細檢查 AI 的工作。盡管如此,Copilot 解析錯誤消息、描述它認為錯誤的地方并提出修復建議的能力給我留下了深刻的印象。
重構(gòu)
另一個很好的用例是重構(gòu)??紤]下面的代碼:
?def price_with_discount
? ?price - (price * discount_rate)
?end
這種簡單的價格計算不考慮nil值、應為數(shù)字的字符串或 或price的合理值discount_rate。我們需要代碼來做到這一點:
確保price是整數(shù)或浮點數(shù)(不是零)
確保price不為負
確保discount_rate是一個浮點數(shù)(不是零)
Ensurediscount_rate不為負且小于或等于 1
Copilot Chat 輕松處理此問題...
?def price_with_discount(price, discount_rate)
? ?raise ArgumentError, "Price must be a positive number" unless price.is_a?(Numeric) && price >= 0
? ?raise ArgumentError, "Discount rate must be a float between 0 and 1" unless discount_rate.is_a?(Float) && discount_rate >= 0 && discount_rate <= 1
?
? ?price - (price * discount_rate)
?end
測試生成
使用 Copilot 生成測試在技術(shù)上是上面“代碼生成”的一個子集,但我覺得它非常有用,值得一提。
如果您試圖涵蓋快樂和悲傷的路徑、主要用例和邊緣情況,則為代碼生成單元測試可能會很乏味。我們上面的代碼需要測試用例,以確保在滿足或不滿足要求price_with_discount時引發(fā)錯誤。此外,我們可能想測試以下內(nèi)容:price``discount_rate
一個price沒有一個discount_rate
Aprice合理discount_rate(例如,10% 的折扣)
A price100% discount_rate(例如,如果我們想贈送產(chǎn)品)
對于這些和我們之前的錯誤案例,這是 Copilot Chat 在進行一些微調(diào)(重新提示)并從 Minitest 切換到 Rspec 之后生成的內(nèi)容。
?RSpec.describe Product do
? ?describe "#price_with_discount" do
? ? ?context "when given a valid price and discount rate" do
? ? ? ?it "returns the price with the discount applied" do
? ? ? ? ?product = Product.new("Test Product", 100, 0.2)
? ? ? ? ?expect(product.price_with_discount(product.price, product.discount_rate)).to eq(80)
? ? ? ?end
? ? ?end
?
? ? ?context "when given a nil price" do
? ? ? ?it "raises an ArgumentError with an appropriate message" do
? ? ? ? ?product = Product.new("Test Product", nil, 0.2)
? ? ? ? ?expect { product.price_with_discount(product.price, product.discount_rate) }.to raise_error(ArgumentError, "Price must be a positive number")
? ? ? ?end
? ? ?end
?
? ? ?context "when given a price less than 0" do
? ? ? ?it "raises an ArgumentError with an appropriate message" do
? ? ? ? ?product = Product.new("Test Product", -100, 0.2)
? ? ? ? ?expect { product.price_with_discount(product.price, product.discount_rate) }.to raise_error(ArgumentError, "Price must be a positive number")
? ? ? ?end
? ? ?end
?
? ? ?context "when given a nil discount rate" do
? ? ? ?it "raises an ArgumentError with an appropriate message" do
? ? ? ? ?product = Product.new("Test Product", 100, nil)
? ? ? ? ?expect { product.price_with_discount(product.price, product.discount_rate) }.to raise_error(ArgumentError, "Discount rate must be a float between 0 and 1")
? ? ? ?end
? ? ?end
?
? ? ?context "when given a discount rate less than 0" do
? ? ? ?it "raises an ArgumentError with an appropriate message" do
? ? ? ? ?product = Product.new("Test Product", 100, -0.2)
? ? ? ? ?expect { product.price_with_discount(product.price, product.discount_rate) }.to raise_error(ArgumentError, "Discount rate must be a float between 0 and 1")
? ? ? ?end
? ? ?end
?
? ? ?context "when given a discount rate greater than 1" do
? ? ? ?it "raises an ArgumentError with an appropriate message" do
? ? ? ? ?product = Product.new("Test Product", 100, 1.5)
? ? ? ? ?expect { product.price_with_discount(product.price, product.discount_rate) }.to raise_error(ArgumentError, "Discount rate must be a float between 0 and 1")
? ? ? ?end
? ? ?end
? ?end
?end
一次測試有效輸入,五次測試無效輸入。所有六個工作,我不必寫他們!
代碼審查
Copilot X 的一項功能是Copilot for Pull Requests。以下是一些主要功能:
模板擴展——利用 Copilot 填寫您的 PR 模板并解釋代碼
Gentest – 根據(jù) Copilot 的分析為您的代碼生成測試
幽靈文本——在您輸入 PR 時接收建議
語音驅(qū)動開發(fā)
Copilot Voice 以前稱為“嘿,Github!”,允許您使用自然語言提示與您的代碼進行交互。它看起來令人印象深刻,擁有以下功能:
編寫/編輯代碼——使用語音控制觸發(fā) Copilot 代碼建議
代碼導航——無需鍵盤或鼠標即可導航文件
控制 IDE——觸發(fā)任何 VS Code 命令
代碼摘要——獲取代碼塊的摘要
概括
GitHub 正在通過其 Copilot 擴展套件快速生成革命性的開發(fā)人員生產(chǎn)力工具。它增加了我在編程中的樂趣,減少了我花在令人麻木的任務上的時間。我鼓勵您跟蹤 Copilot 的改進,因為它們正在迅速發(fā)生。