AI 程式碼工具可以在幾秒內寫出一個函式。更難的問題是,那個函式是否真的該存在於你的程式碼庫中。它有遵循既有架構嗎?有處理邊界情況嗎?測試還會通過嗎?而當三個檔案之後某處出錯時,AI 能幫忙找出真正原因,而不是只再產生一個補丁嗎?
為了回答這些問題,我花了一個月把 Cursor、GitHub Copilot 和 Claude Code 當作結對程式設計工具來使用,實際處理各種開發任務:寫程式、除錯、重構函式、建立測試,以及跨多個檔案進行修改。
我不是在測試哪個工具能產生最多程式碼。我是在測試哪一個能讓真正的程式開發更快,同時不會在事後製造更多工作。
在實際開發任務中使用這三個工具後,我不會說有哪一個是絕對冠軍。
它們各自在不同的程式設計環節表現較好:
最大的差異不在於它們產生程式碼的速度,而在於它們在產生程式碼之前,能利用多少有用的上下文。
這成了整個測試中最重要的心得。
我想避免常見的 AI 寫程式比較方式,也就是每個工具都給同一個簡單提示:
「做一個待辦事項應用程式。」
這樣並不能告訴你太多關於真實開發的事。
因此,我使用的是在既有專案中很像日常工作的任務。
我從既有程式碼開始,要求每個工具實作一個缺少的函式。
例如:
async function getUserById(id) {
// implementation needed
}
需求很直接:取得使用者、處理失敗的回應、驗證回傳資料,並回傳可預期的結果。
這測試了一件基礎但重要的事:
AI 能不能遵循既有專案的程式風格,而不是自己發明一套?
三個工具都能產生可運作的起始版本。
差異出現在整理收尾的階段。
Copilot 很擅長快速產生第一版實作。Cursor 讓我更容易參考相關檔案,並把函式調整成符合周遭專案的樣子。當我想先檢查其他地方類似函式是怎麼實作的,再做修改時,Claude Code 特別有用。
這種差異在既有應用程式中特別重要。
從零開始寫程式很容易。
寫出能融入既有程式碼庫的程式比較難。
程式碼生成並不是我看到最大差異的地方。
除錯才是。
我提供的是實際錯誤,而不是要它們憑空發明解法。
典型任務會像這樣:
TypeError: Cannot read properties of undefined at UserList.jsx:42
我不會直接問:
「修正這個錯誤。」
而是提供相關元件、API 函式與資料結構,並要求工具找出根本原因。
這樣得到的結果實用得多。
如果問題離我目前正在編輯的程式碼很近,Copilot 表現不錯。
如果錯誤是因為少了 null 檢查,或明顯用了錯誤變數,它可以很快建議修正方式。
但限制在於,當原因在別處時就不一定夠力。
我有時必須手動補充更多檔案和上下文。
如果相關程式碼已經在專案裡,Cursor 處理這類情況更好。
我可以請它檢查元件、API 呼叫以及相關型別,並解釋資料結構在哪裡開始和預期不符。
這讓除錯不再只是像自動完成,而更像多了一雙眼睛。
當除錯任務跨越好幾個檔案時,Claude Code 特別有用。
我可以不只聚焦在丟出錯誤的那一行,而是請它追蹤資料流。
這很有價值,因為很多真實錯誤並不發生在應用程式崩潰的地方。
崩潰通常只是最後的症狀。
重構也是一個很有用的測試。
我拿已經能運作、但變得難以維護的程式碼,要求每個工具在不改變行為的情況下改善它。
例如:
function calculateTotal(items) {
let total = 0;
for (let i = 0; i < items.length; i++) {
if (items[i].active) {
total += items[i].price * items[i].quantity;
}
}
return total;
}
簡單的重構很容易。
但真正的重構通常伴隨限制:
這就是工具開始表現出差異的地方。
Copilot 在小型重建置議方面很出色。
當我想在檢視受影響檔案的同時進行更大範圍修改時,Cursor 表現更好。
如果重構需要理解這個函式在整個儲存庫中是如何被使用的,Claude Code 就很有幫助。
這後來成了我的一條規則。
永遠不要在不讀 diff 的情況下,直接接受大量 AI 生成的重構。
看起來更整潔的實作,不代表更安全。
AI 可能移除了重複程式碼,卻不小心改變了行為。
它也可能把某些原本故意這樣寫的東西「改善」掉,而那其實是因為應用程式的另一部分需要如此。
測試是三個工具都幫我省下時間的一個面向。
我可以提供現有函式,請它撰寫涵蓋以下情況的單元測試:
第一批生成的測試通常還算合理。
但有個明顯問題。
AI 傾向根據它看到的實作來寫測試。
這會導致測試只是在確認目前程式碼的行為,而不是證明應用程式應該有什麼行為。
例如,如果實作裡有一個錯誤的預設值,AI 產生的測試可能會把這個行為寫死。
所以我後來不再問:
「幫我寫這個函式的測試。」
而是改成:
「根據下方描述的預期行為撰寫測試。包含邊界情況與失敗情境。不要假設目前實作是正確的。」
這個小改動讓測試實用得多。
當我不再只要求它們寫單一函式時,這些工具之間的最大差異就變得很明顯。
我給它們一個功能需求。
例如:
為現有的使用者列表加入分頁。保留目前的 API 回應格式,加入載入與錯誤狀態,更新 API 請求,保留既有篩選條件,並為新行為新增測試。
這時 AI 需要理解:
這就更接近真實的軟體開發了。
當我想留在編輯器內,並以互動方式引導修改時,Cursor 表現很好。
我可以檢視它建議的變更,並在過程中調整實作。
Copilot 仍然有用,但在較大的修改上,我發現自己需要提供更多方向。
當我已經知道要做什麼,並想要有人協助把它實作出來時,它很出色。
當任務需要先進行儲存庫層級的調查,再開始實作時,Claude Code 特別有幫助。
這讓它在較大的變更中很有價值,因為第一步不是寫程式,而是先找出該改哪裡。
這比起生成了多少行程式碼更難衡量。
我開始注意一個更實際的指標:
AI 做完之後,我還要花多少工作?
這包括:
這改變了我對生產力的看法。
一個工具一分鐘產生 200 行,不一定比另一個工具產生 80 行有用程式碼還快,如果我得再花 30 分鐘修第一個結果的話。
對我而言,有用的程式碼比產生出來的程式碼更重要。
| 程式設計任務 | 最佳選擇 | 原因 |
|---|---|---|
| 行內自動完成 | GitHub Copilot | 輸入時建議速度快 |
| 小型函式 | GitHub Copilot | 低摩擦、快速生成 |
| 互動式重構 | Cursor | 編輯器導向工作流程強 |
| 多檔案編輯 | Cursor | 較容易引導與檢視變更 |
| 簡單錯誤除錯 | GitHub Copilot | 快速的上下文建議 |
| 跨檔案除錯 | Claude Code | 更適合儲存庫層級調查 |
| 理解陌生的儲存庫 | Claude Code | 適合追蹤專案結構 |
| 撰寫單元測試 | 三者皆可 | 有不錯的起點,但仍需人工審查 |
| 大型實作任務 | Cursor / Claude Code | 更適合多步驟工作 |
| 最終程式碼審查 | 人類開發者 | AI 不該是最後裁決者 |
最大的生產力提升,不是我停止寫程式了。
而是我用不同方式寫程式。
在大量使用 AI 之前,很多時間都花在:
AI 減少了很多這類摩擦。
但另一類工作變得更重要:
所以 AI 並沒有移除工程工作。
它只是改變了我花時間的地方。
一個月後,我對幾個反覆出現的問題變得更小心。
如果需求不清楚,工具就會自己補空白。
這可能代表它會選一個不適合專案的 API 模式、函式庫、命名慣例或架構。
某些東西可以編譯、通過基本測試,但仍然過於複雜。
生成出來的測試套件不代表就有良好的覆蓋率。
當我把大任務拆成階段,而不是一次要求完整功能時,結果通常更好。
隨著 AI 做更多修改,檢視 commit 與 diff 變得不可或缺。
我想知道到底改了什麼,以及為什麼改。
最可靠的工作流程其實很簡單。
提供相關檔案,並要求 AI 先解釋目前行為,再做任何修改。
明確說出哪些要改、哪些必須保持不變。
對較大的任務,先讓 AI 指出需要修改哪些檔案,再開始寫程式。
不要不加判斷地接受一大段變更。
確認每一個有意義的修改。
不要因為生成的程式碼看起來正確,就把它當成完成品。
一個很有用的提示是:
「請檢查這個實作是否有邊界情況、回歸問題、不必要的複雜度,以及可能錯誤的假設。」
這常常能找出我沒注意到的問題。
如果我今天要開始一個專案,我不會只根據基準測試分數或功能列表來選。
我會根據我的工作流程來選。
但有一個重要前提。
我不會讓它們任何一個變成最後的決策者。
AI 可以建議實作。
但我仍然要決定這個實作是否正確。
這就是把 AI 當作結對程式設計夥伴,和把 AI 當作程式碼產生器之間的差別。
在一個月內使用三種不同的 AI 工具進行結對程式設計後,我得到了一個沒那麼刺激、但更實用的答案:AI 不會讓程式設計消失;它只是讓程式設計中的某些部分變得快得多。
當我需要在寫程式時快速獲得協助,GitHub Copilot 表現很好。當工作涉及互動式編輯與多檔案處理時,Cursor 更有用。當我需要調查儲存庫、追蹤問題,或透過終端機處理較大任務時,Claude Code 特別突出。
真正的生產力提升,來自 AI 生成與一般工程紀律的結合。
我還是會讀程式碼。
我還是會檢查 diff。
我還是會執行測試。
我還是會除錯。
我還是會做架構決策。
這才是今天看待 AI 結對程式設計最實際的方式。目標不是讓 AI 在你坐著不動時替你寫完整個應用程式。目標是移除重複性工作,縮短從想法到可運作實作之間的距離,並提供另一個思考困難程式設計問題的工具。
最好的 AI 結對程式設計工具,不是寫最多程式碼的那個,而是能幫你花更多時間解決工程問題、花更少時間對抗重複實作工作的那個。
原文出處:https://dev.to/elsie-rainee/i-tried-pair-programming-with-three-different-ai-tools-for-a-month-2nnc