編譯 | 云昭
在成功使用 Claude Code 之后,我也很想嘗試其他非 IDE 的 agentic 編程工具。這類工具相較于傳統(tǒng)代碼文件界面,更擅長(zhǎng)與“開發(fā)計(jì)劃”互動(dòng)。因?yàn)樗^“開發(fā)計(jì)劃”可以用一組有序的編碼實(shí)踐來表達(dá),而大語(yǔ)言模型正擅長(zhǎng)做這種“代碼馴服者”的角色。
Google 的項(xiàng)目 Jules 將自己定義為“一個(gè)異步開發(fā)代理:Jules 負(fù)責(zé)修復(fù) bug、小型功能請(qǐng)求以及其他軟件工程任務(wù),并可直接導(dǎo)出至 GitHub。”我很欣賞他們清晰設(shè)定了工具的適用范圍。不過,我不太滿意的是它哪怕在 beta 階段也只能通過 GitHub 運(yùn)作 —— 這邏輯對(duì)微軟來說說得通,但對(duì) Google 就顯得奇怪了。
我之前在測(cè)試 Claude 時(shí)用的是一個(gè)早期的 Rails CRUD 項(xiàng)目,我想在里面引入 Bootstrap。這個(gè)任務(wù)對(duì) Claude 來說難度不大,因此這次我更關(guān)注的是使用 Jules 的整體體驗(yàn)流程。
使用 Jules
Jules 會(huì)把你的代碼倉(cāng)庫(kù)克隆到一個(gè)私有虛擬機(jī)中,并開始執(zhí)行任務(wù)。我首次使用 Jules(仍是 beta 版,就像 Google 出品的所有東西一樣)時(shí),看到了一份非?!罢健钡碾[私聲明 —— 跟上一個(gè)頁(yè)面那種俏皮的像素圖風(fēng)格形成了巨大反差。聲明里列了一些模棱兩可的說法,比如 Google 會(huì)讀取什么、不會(huì)讀取什么,但這些都無法驗(yàn)證。他們聲稱不會(huì)讀取私有倉(cāng)庫(kù)的代碼,但話里也留了后門。
頁(yè)面上有一個(gè) 90 秒的視頻,演示了如何連接 GitHub、選擇一個(gè)倉(cāng)庫(kù)、提交請(qǐng)求。我喜歡這個(gè)功能 —— “你平時(shí)會(huì)發(fā) PR 的任務(wù),它都能做?!?這個(gè)定位蠻合適的,雖然跟上面那個(gè)“主要做 bug 和小功能”的說法略有出入。它會(huì)上傳你的代碼,生成一個(gè)開發(fā)計(jì)劃,等你批準(zhǔn)。這對(duì)非開發(fā)者來說很友好,diff 會(huì)在側(cè)邊欄清晰展示。
Jules 也在強(qiáng)調(diào)“協(xié)作伙伴”這一定位,而不僅僅是工具 —— 這點(diǎn)和 Claude 很像。它甚至取了一個(gè)中性又親切的名字。當(dāng)它完成開發(fā)計(jì)劃后,會(huì)新建一個(gè)分支并把代碼提交上去。從工程角度看,這是很合理的做法,但它也迫使普通用戶必須了解 git 的基本語(yǔ)義 —— 有點(diǎn)“故意為難小白”的意思。
將代碼推送至 GitHub
我的項(xiàng)目代碼當(dāng)時(shí)還不在 GitHub 上,但我們可以手動(dòng)推上去。
圖片
就像之前用 Claude 時(shí)一樣,我先解壓了我的 Rails 項(xiàng)目的早期版本:
圖片
接下來,我們要把代碼推送到 GitHub。最好的方式是:先在 GitHub 上新建一個(gè)倉(cāng)庫(kù),然后添加 remote 并 push 代碼(順帶說一句,這也可以交給 AI 來做!)
登錄你的 GitHub 賬號(hào),創(chuàng)建新倉(cāng)庫(kù):
雖然 GitHub 提議的名字是“cautious-octo-succotash”,我很喜歡但這次沒用。記錄下遠(yuǎn)程地址,然后在命令行中初始化 git 倉(cāng)庫(kù)并推送代碼,可能還需要設(shè)置一個(gè)個(gè)人 token。
圖片
當(dāng)代碼成功上傳到 GitHub 后,你就可以使用 Jules 了。授權(quán)訪問倉(cāng)庫(kù)后,Jules 就可以開始執(zhí)行任務(wù):
圖片
我們要做的任務(wù)跟之前 Claude 做的是一樣的:
- 使用 Bootstrap 5 的定義美化 HTML;
- 應(yīng)用 Bootstrap 的顏色工具類改善頁(yè)面層次;
- 將按鈕升級(jí)為 Bootstrap 的按鈕組件。
我將這些內(nèi)容輸入了 Jules 的對(duì)話框。在它啟動(dòng)虛擬機(jī)、克隆倉(cāng)庫(kù)并讀取文件之后(大約耗時(shí)兩分鐘),它生成了一份開發(fā)計(jì)劃:
圖片
需要注意:如果你一分鐘內(nèi)不操作,它會(huì)自動(dòng)批準(zhǔn)計(jì)劃。但我手動(dòng)批準(zhǔn)了它。
需要補(bǔ)充的是:我并沒有寫出太多清晰的代碼示例,prompt 也不算特別一致,但它還是做出了回應(yīng)。
在執(zhí)行過程中,它展示了如何修改 applications.html.erb 中的主側(cè)邊欄 —— 效果跟 Claude 的處理很像。
大概等了一會(huì)兒(畢竟不在本地跑,時(shí)間長(zhǎng)點(diǎn)沒關(guān)系),它準(zhǔn)備好了代碼提交:
圖片
我可以選擇發(fā)布這個(gè)“improvements”分支,然后合并進(jìn)主分支。雖然這需要用戶理解 git 的基本工作流,但確實(shí)是工程上正確的方式。然后我去了 GitHub,確認(rèn)它確實(shí)創(chuàng)建了新分支:
圖片
如預(yù)期,它為變更添加了合適的提交記錄:
圖片
我發(fā)起 PR 并合并了它。雖然我平時(shí)在公司內(nèi)部倉(cāng)庫(kù)里并不習(xí)慣這種方式,但 Jules 的流程就是通過 PR 審查變更是否可以合并進(jìn)主分支。一旦合并完成,那個(gè)分支就可以刪除了。
圖片
最后我在本地 pull 下來,看看效果如何。
我不打算做 Jules 和 Claude 的嚴(yán)格對(duì)比,只對(duì)比了一下“側(cè)邊欄”的樣子。以下是升級(jí)前的版本:
圖片
升級(jí)后的效果:
除了側(cè)邊欄明顯變好外,Jules 沒有改動(dòng)頁(yè)面上的鏈接。不過其他地方的清理還不錯(cuò)。
我又給了它一個(gè)指令 —— 和 Claude 完全一樣,要求它把路徑鏈接也用 Bootstrap 的樣式美化一下。
圖片
它確實(shí)做出了改進(jìn),效果如下:
圖片
如果我給出的要求更明確一點(diǎn),應(yīng)該可以一次性修改所有鏈接。
總結(jié)
Jules 在理解我意圖方面不如 Claude 靈巧,但只要稍微加強(qiáng) prompt 工程,它也能完成任務(wù)。整個(gè)迭代流程因?yàn)橐?PR,確實(shí)比 Claude 慢一些,但這是更“工業(yè)級(jí)”的工作流。
當(dāng)然,我還是更喜歡不依賴 GitHub 的方式,但我也能理解 Google 想把所有內(nèi)容都運(yùn)行在自家硬件上的考慮。
和往常一樣,Google 的產(chǎn)品依然“內(nèi)部不一致”,讓人一邊困惑一邊忍不住欣賞。但他們確實(shí)看到了“休閑開發(fā)者”(casual coder)這個(gè)新市場(chǎng) —— 這個(gè)市場(chǎng)正是最近“vibe coding”興起的結(jié)果。我覺得 Jules 成功命中了這個(gè)目標(biāo)。
參考鏈接:https://thenewstack.io/agentic-coding-how-googles-jules-compares-to-claude-code/



























