回想十年前,代碼審查這件事牢固地建立在一種幾乎對等的節奏之上:一個人慢悠悠地寫出一段差異,另一個人也同樣慢悠悠地讀它。一來一回,速度剛好匹配。審查者可以一行不落地看完每一次變更,自己也不會變成阻塞管線的那個人。這套流程能隨著團隊膨脹而不斷復用,正是因為它假定作者和審查者兩條流水線的產出速率,天然地不會出現太大錯位。
那時候,逐行閱讀每一位人類同事敲下的代碼,是件有著確定感的事。下一個字符背后的決策成本就擺在那兒——寫的人得想清楚才敢下手,因此幾乎每一行都攜帶著可判讀的意圖信號。審查者掃過一遍,既能順便撿出拼寫錯誤、察覺漏掉的邊界條件,也能摸清新模塊的思路,順便把命名一致性一并對了。這幾件事全都揉在同一次掃描里,不覺得費力。
然而,當代理開始參與提交后,那個微妙的平衡第一次失效了。作者那一側的速度被瞬間拉得極高,而審查者還在以原來的步調工作。兩股速率一旦脫節,擺在團隊面前的選項就很直接了:要么讓審查者成為瓶頸,代理的吞吐量被白白浪費;要么保持節奏,把“橡皮圖章”當成新常態。現實中,多數隊伍悄無聲息地選了第二條路,同時心照不宣地對外宣稱自己仍走第一條。
所幸,這件事并不是無解的。前提是愿意承認一個事實:審查實踐本身,必須跟著創作方式的改換而改變。剝掉層層習慣,代碼審查真正的骨架其實只擔著幾件明確的事情——捉出作者沒發現的缺陷,確認變更的確跑出了拉取請求描述所承諾的行為,把知識在團隊里攤開,守住那些自動化工具還插不上手的標準,并且讓每一位貢獻者始終抱著起碼的審慎去交出自己的成果。
人類作者的時代,這幾個目標之所以可以糊在一起處理,全因為逐行閱讀這一種動作就差不多把它們都覆蓋了。而代理完全不是以同樣的方式產出代碼的。它們能夠在很短的時間內傾瀉出大量看起來毫無破綻的結果,任何單獨一行的生成成本都低得近乎透明。面對一份代理寫就的拉取請求,繼續逐行閱讀,實際上不再意味著審查每一個決策;你只是在掃過一堆看似合理的樣板代碼,試圖從里面定位那屈指可數的、真正發生過自主判斷的角落。
更直白地講,差別在于:過去是閱讀一行,看見一個決定;現在是穿過一片規整的叢林,只為揪出那幾處可能并沒被真正思考過的默許。因此,審查流程必須從上層的顆粒度重新設計,不能再沉迷于“第47行有沒有做對事”這類顯微鏡式的問題。
擺在審查者面前的全新問題,應該被提得很高也很清晰。首先是范圍的警覺:這次變更有沒有只碰了它該碰的文件?代理經常會在一些令人沒想到的地方留下編輯痕跡——那些壓根不需要改動的文件,或者一句“既然來了就順手更新”帶來的配置變化。差異本身的波及面,本身就成了值得審視的信號。
其次,是測試的誠實度:這份測試到底證明了它嘴上說的事嗎?代理極其擅長炮制大量能夠通過的測試用例,但那些在代碼錯誤時確實會失敗的測試,卻遠沒有那么常見。一個只斷言函數“成功返回”卻不說返回了什么的用例,也許能替人添上一絲心安,卻沒能添上任何真正成立的證據。
再者,是模式的一致性:這次變更在多大程度上沿襲了已有代碼庫的慣用構造?有沒有無聲無息地引入一種此前從未被討論過的新模式?代理常常會眼空四海地自創新范式,因為它要么沒看見既有路線,要么選擇了不去遵從。這些未經商量的新套路,正是大量代理導致的代碼漂移的源頭。
最后,還要追問抽象的必要性:那個被新拉進來的抽象層,真的非有不可嗎?當代理試圖用看似精妙的解構來包裝一份改動時,審查者需要按住那種“看起來很對”的慣性,站遠一步,問一句這究竟是在減少復雜度,還是在轉嫁理解成本。
與其說這些變化給審查工作帶來麻煩,不如說它們逼著整個流程往更成熟的方向升了一次級。過去依賴人類緩慢思考所建立的審查秩序,并沒有被破壞,反而被推到一片更開闊的棋盤上。審查者的時間不再耗在逐行辨認上,而是投注到范圍判斷、意圖驗證與風格守護這些真正需要決策力的地方。那個“一半差異來自代理”的現實,正好給這一場靜默的改革按下了加速鍵。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.