制到工具:打造高效代碼評(píng)審流程的完整實(shí)踐)
2. 寫(xiě)在前面為什么我盯上了代碼評(píng)審這件事做了這么多年開(kāi)發(fā)我越來(lái)越覺(jué)得代碼評(píng)審是團(tuán)隊(duì)里投入產(chǎn)出比最不穩(wěn)定的一環(huán)。你說(shuō)它不重要吧線上事故十次里有八次能在 review 階段被攔下來(lái)你說(shuō)它重要吧真到上線沖刺的時(shí)候評(píng)審又常常淪為“看一眼沒(méi)問(wèn)題合了吧”的形式主義。我做過(guò)的項(xiàng)目里因?yàn)樵u(píng)審觸發(fā)的返工、線上故障、甚至同事之間鬧別扭例子太多了。這兩年開(kāi)始帶團(tuán)隊(duì)我一直在想一個(gè)問(wèn)題能不能把代碼評(píng)審從“靠個(gè)人自覺(jué)”變成“靠制度和工具托底”后來(lái)我花了小半年時(shí)間在我們組里從零搭了一套開(kāi)放的評(píng)審機(jī)制配套做了一個(gè)內(nèi)部叫“open-code-review”的輔助工具集。它不復(fù)雜但確實(shí)把評(píng)審的參與率、反饋質(zhì)量和缺陷攔截率都拉上來(lái)了一個(gè)臺(tái)階。這篇文章就是把我整套思路、踩過(guò)的坑、以及工具里幾個(gè)核心模塊的實(shí)操玩法掰開(kāi)揉碎講一遍。無(wú)論你是剛帶團(tuán)隊(duì)的組長(zhǎng)還是想提升協(xié)作效率的資深開(kāi)發(fā)這里面的清單、流程和腳本思路都能直接抄走改改就能用。1. 先把評(píng)審拉下神壇核心痛點(diǎn)拆解很多團(tuán)隊(duì)都想過(guò)要做代碼評(píng)審但往往堅(jiān)持不下來(lái)。我不太喜歡一上來(lái)就談流程、談工具畢竟工具再好用不起來(lái)也是白搭。所以第一個(gè)章節(jié)我先把“評(píng)審為什么總做不好”這事兒拆透。1.1 傳統(tǒng)評(píng)審的四宗罪先看最典型的幾種失敗形態(tài)看看你們團(tuán)隊(duì)是不是也踩過(guò)評(píng)審即“通知”代碼寫(xiě)完了丟一個(gè)鏈接到群里一下所有人半天沒(méi)人理。最后自己等不及了直接合并所謂的評(píng)審記錄其實(shí)就是個(gè)存檔。評(píng)審即“批斗會(huì)”評(píng)審人角度刁鉆只盯著代碼風(fēng)格、命名這類(lèi)瑣碎問(wèn)題打轉(zhuǎn)反而把架構(gòu)設(shè)計(jì)、潛在缺陷這些大頭漏掉了。被評(píng)審的人覺(jué)得不被尊重幾次下來(lái)要么抗?fàn)幰刺善健Tu(píng)審即“瓶頸”評(píng)審人太少或者只依賴(lài)技術(shù)負(fù)責(zé)人一個(gè)人。所有合并請(qǐng)求都堵在他那兒他成了全組進(jìn)度的瓶頸。評(píng)審即“走過(guò)場(chǎng)”有流程、有工具、有統(tǒng)計(jì)但大家心理上都覺(jué)得評(píng)審只是“合規(guī)動(dòng)作”。評(píng)論永遠(yuǎn)是“LGTM”看起來(lái)不錯(cuò)從來(lái)沒(méi)有深度討論。這些形態(tài)的本質(zhì)是把評(píng)審當(dāng)成了一種“事后檢查”??纱a評(píng)審真正的價(jià)值根本不該是找茬而是在代碼進(jìn)入主干之前完成一次智力上的并行校驗(yàn)和信息同步。1.2 把評(píng)審當(dāng)成信息放大器我做 open-code-review 時(shí)第一個(gè)轉(zhuǎn)變就是把評(píng)審的重心從“找 bug”挪到“拉齊認(rèn)知”上。舉個(gè)例子有一次我們組里兩個(gè)后端同事各自開(kāi)發(fā)了兩塊功能一個(gè)改了訂單狀態(tài)的流轉(zhuǎn)邏輯另一個(gè)改了支付回調(diào)的處理。單獨(dú)看各自的 diff 都挺干凈但合并之后因?yàn)橛唵螤顟B(tài)機(jī)里多了一個(gè)中間態(tài)支付回調(diào)里有一段老代碼就永遠(yuǎn)匹配不上了。這種跨模塊的信息斷層靠單打獨(dú)斗的自測(cè)根本發(fā)現(xiàn)不了只有把 code review 當(dāng)成一個(gè)充分暴露上下文、同步設(shè)計(jì)意圖的場(chǎng)合才能暴露出來(lái)。所以我理解中的評(píng)審本質(zhì)上是一種低成本的知識(shí)傳遞機(jī)制。寫(xiě)代碼的人通過(guò)描述“我為什么要這么改、我動(dòng)了他人的什么假設(shè)”讓評(píng)審人在短時(shí)間內(nèi)獲得足夠的背景信息從而給出有價(jià)值的反饋。如果這個(gè)前提不建立后面做的所有流程設(shè)計(jì)都是空中樓閣。基于這個(gè)認(rèn)知我設(shè)計(jì)的整套評(píng)審方案里永遠(yuǎn)把“上下文表達(dá)”放在第一位代碼 diff 本身反而是第二位的。2. 從機(jī)制到落地把評(píng)審?fù)娉晒ぷ髁鞴庥姓J(rèn)知轉(zhuǎn)變還不夠得有抓手。這個(gè)章節(jié)我詳細(xì)講我落地的機(jī)制以及為什么這么設(shè)計(jì)。核心思路是把評(píng)審拆小、分級(jí)、設(shè)定時(shí)效并且讓每一個(gè)步驟都有跡可循。2.1 分級(jí)的評(píng)審策略小步快跑而不是憋大招很多團(tuán)隊(duì)評(píng)審做得痛苦是因?yàn)樗麄兞?xí)慣了一周才提一次 merge request一次提幾千行代碼。這種大 diff 神仙都審不動(dòng)后面審的人根本不知道從何看起只能草草了事。我在 open-code-review 里定了一條硬規(guī)矩單次提交的改動(dòng)量盡量控制在 400 行以內(nèi)涉及架構(gòu)變動(dòng)的功能也必須拆成多個(gè)可獨(dú)立評(píng)審的階段提交。為什么是 400 行不是我拍腦袋定的。按照我們團(tuán)隊(duì)的經(jīng)驗(yàn)一個(gè)人在連續(xù)工作間隙里能保持高度專(zhuān)注的代碼閱讀量大概就在 300~500 行之間。超過(guò)這個(gè)量注意力曲線會(huì)急劇下滑評(píng)審動(dòng)作就會(huì)變成“掃一眼”。具體怎么拆舉個(gè)我常用的辦法一個(gè)功能拆成“底層工具方法實(shí)現(xiàn) → 核心業(yè)務(wù)邏輯接入 → 外圍接口與文檔調(diào)整”三個(gè)遞進(jìn)的提交。每個(gè)提交都能獨(dú)立通過(guò)編譯、通過(guò)已有測(cè)試但合在一起才完成整個(gè)需求。這樣做的直接收益是評(píng)審人能像追劇一樣跟進(jìn)你的思路每一集都不長(zhǎng)反饋質(zhì)量自然就上去了。2.2 評(píng)審清單把隱性知識(shí)顯性化第二個(gè)抓手是“標(biāo)準(zhǔn)化評(píng)審清單”。我一直認(rèn)為所有能靠清單解決的問(wèn)題就不要靠人的記憶力去解決。我拉了一個(gè)我們團(tuán)隊(duì)的評(píng)審 checklist分三層層級(jí)關(guān)注點(diǎn)具體檢查項(xiàng)示例邏輯層正確性與邊界空指針/越界是否處理分支條件是否覆蓋了全部分支異常路徑是否有兜底架構(gòu)層職責(zé)與復(fù)用代碼是否放在了正確層是引入了新的抽象還是破壞了既有抽象依賴(lài)方向是否正確表達(dá)層可讀與可維護(hù)命名是否表意明確注釋是在解釋“為什么”而不是“是什么”是否存在重復(fù)代碼這里我不展開(kāi)描述所有清單項(xiàng)重點(diǎn)是清單的價(jià)值并不在于它有多全而在于它充當(dāng)了評(píng)審的“最低標(biāo)準(zhǔn)”。有了它新人也敢在評(píng)審時(shí)開(kāi)口說(shuō)話因?yàn)樗麄冎辽僦揽梢詮哪男┚S度提出疑問(wèn)。如果沒(méi)有人定這個(gè)底線評(píng)審就會(huì)變成比資歷、拼嗓門(mén)那就失去了意義。2.3 時(shí)效與閉環(huán)評(píng)審也要 SLA沒(méi)有時(shí)效限制的評(píng)審等于沒(méi)有評(píng)審。我們內(nèi)部的 SLA 是這樣約定的最遲不超過(guò) 8 個(gè)工作小時(shí)必須給出首輪反饋合并請(qǐng)求的發(fā)起人需要對(duì)每一條評(píng)論給出明確答復(fù)修改 / 解釋 / 忽略且說(shuō)明理由。為什么是 8 小時(shí)因?yàn)槲覀冏龅氖敲艚莸粋€(gè)迭代周期就兩周如果評(píng)審?fù)系降诙扉_(kāi)發(fā)人員手里的上下文就涼了一半切換回去再切出來(lái)的成本非常高。8 小時(shí)的窗口既能保證有人來(lái)得及看又不至于打斷評(píng)審人太長(zhǎng)時(shí)間?!昂雎浴币彩呛戏ù饛?fù)。這一點(diǎn)對(duì)于維持反饋積極性非常重要。如果要求每條評(píng)論都必須修改那被評(píng)審的人就會(huì)擁抱你提的每一個(gè)意見(jiàn)而評(píng)審人也會(huì)逐漸變成“不提白不提”的刷存在感模式。允許“忽略并給出理由”反而能倒逼雙方把話講清楚真正就事論事。3. 實(shí)操細(xì)節(jié)從提交到合并的完整走查有了機(jī)制接下來(lái)就是最枯燥也最重要的實(shí)操細(xì)節(jié)。這個(gè)章節(jié)我完整走一遍從提交代碼到合并代碼的流程并且針對(duì)每一步總結(jié)我自己的操作心得。3.1 第一步把提交本身“洗干凈”評(píng)審體驗(yàn)是從提交那一刻開(kāi)始的。如果提交說(shuō)明寫(xiě)得像天書(shū)diff 雜亂無(wú)章還得評(píng)審人去幫你梳理改動(dòng)脈絡(luò)那評(píng)審效果必然大打折扣。我給自己定了一個(gè)提交信息模板格式大概是這樣的模塊/影響范圍一句話說(shuō)明核心改動(dòng) 背景 - 為什么需要這次改動(dòng) - 本次改動(dòng)影響了哪些原有假設(shè) 驗(yàn)證 - 本地執(zhí)行過(guò)的測(cè)試命令 - 手動(dòng)驗(yàn)證的關(guān)鍵場(chǎng)景不要小看這幾行字。我實(shí)測(cè)過(guò)在提交說(shuō)明里寫(xiě)清楚“背景”和“驗(yàn)證”之后評(píng)審人問(wèn)的問(wèn)題數(shù)量直接下降三分之一因?yàn)榇蟛糠只A(chǔ)疑問(wèn)已經(jīng)在描述里被預(yù)先回答了。用大白話講這就是在幫評(píng)審人做閱讀理解題你把他需要搜索的信息都擺到桌面上他就能把精力花在真正需要判斷的地方。3.2 第二步diff 閱讀順序建議作為評(píng)審人我拿到一個(gè)合并請(qǐng)求后閱讀順序是有講究的不是直接從文件列表從上往下刷。我自己基本固定用這個(gè)順序先看測(cè)試改動(dòng)測(cè)試能最快反映這次改動(dòng)的意圖和邊界假設(shè)。如果作者連測(cè)試都沒(méi)改那后面也別談了直接打回。再看核心業(yè)務(wù)文件改動(dòng)量最大的、被調(diào)用關(guān)系最復(fù)雜的文件放前面。最后看配置和雜項(xiàng)改動(dòng)很多時(shí)候事故就出在這些不起眼的小改動(dòng)上比如一個(gè)超時(shí)時(shí)間被從 3 秒悄悄調(diào)成了 5 秒如果沒(méi)有上下文你根本注意不到。這個(gè)閱讀順序可以從根源上避免“只見(jiàn)樹(shù)木不見(jiàn)森林”的問(wèn)題。先建立預(yù)期再驗(yàn)證實(shí)現(xiàn)最后查漏補(bǔ)缺。3.3 第三步提問(wèn)與反饋的心法評(píng)審中的溝通方式是決定這個(gè)流程能不能長(zhǎng)期走下去的關(guān)鍵。我再怎么強(qiáng)調(diào)都不過(guò)分代碼評(píng)審不是用來(lái)展示智力優(yōu)越感的場(chǎng)合。我在團(tuán)隊(duì)里反復(fù)灌輸三個(gè)反饋原則對(duì)事不對(duì)人永遠(yuǎn)說(shuō)“這里的異常處理路徑似乎沒(méi)覆蓋網(wǎng)絡(luò)超時(shí)的情況”而不是“你怎么又沒(méi)處理超時(shí)”給建議不只給否定指出問(wèn)題的同時(shí)給出至少一種改進(jìn)方向。哪怕你說(shuō)“我暫時(shí)想不到方案大家討論一下”也行最怕的就是只留下一句“這不行”。分清主次把評(píng)論分成“必須修改 / 建議修改 / 可選優(yōu)化”三檔。不要拿雞毛蒜皮的事情去阻塞合并學(xué)會(huì)抓大放小。說(shuō)實(shí)話第三點(diǎn)最難做到。很多資深的評(píng)審人會(huì)本能地追求完美但團(tuán)隊(duì)協(xié)作里更重要的是保持節(jié)奏。一個(gè)規(guī)則我嚴(yán)格執(zhí)行風(fēng)格類(lèi)、命名類(lèi)的吹毛求疵不允許作為阻塞合并的理由但可以批量指出。3.4 第四步合并之后還要留痕很多人以為代碼合并了評(píng)審就結(jié)束了。我在 open-code-review 里加了一個(gè)環(huán)節(jié)合并后由機(jī)器人自動(dòng)提取這次評(píng)審中有價(jià)值的討論沉淀到團(tuán)隊(duì)的知識(shí)庫(kù)里。比如評(píng)審過(guò)程中如果有人討論出了“這個(gè)模塊的關(guān)鍵假設(shè)是訂單狀態(tài)流轉(zhuǎn)一定是單向的”這句話如果只留在 deleted threads 里三個(gè)月后就再也找不到了。但把它沉淀到項(xiàng)目 wiki 或者代碼根目錄的文檔里后面接手的同事就能少踩很多坑。這一步成本極低但長(zhǎng)期回報(bào)驚人。本質(zhì)上是在把每一次評(píng)審的隱性產(chǎn)出固化成了團(tuán)隊(duì)的顯性資產(chǎn)。3. 用工具把規(guī)則固化成肌肉記憶前面講的是流程和方法但沒(méi)有工具輔助純靠人肉執(zhí)行很難持久。open-code-review 項(xiàng)目的核心其實(shí)是我寫(xiě)的一套輕量自動(dòng)化輔助腳本和配置規(guī)則它能在最大程度上幫團(tuán)隊(duì)“不自覺(jué)地”遵守上面說(shuō)的那些約定。3.1 自動(dòng)化門(mén)禁讓分檢查得出來(lái)我在 CI 流程里接入了兩個(gè)最有價(jià)值的機(jī)器人檢查改動(dòng)量檢查如果單次合并請(qǐng)求的增量超過(guò) 400 行排除自動(dòng)生成代碼、lock 文件機(jī)器人會(huì)在合并請(qǐng)求下自動(dòng)留言提醒并且打上一個(gè)“需要人工復(fù)核”的標(biāo)簽。這個(gè)檢查不是為了卡人而是為了提醒大家“這個(gè)大塊頭可能需要拆一下再合”。提交信息規(guī)范檢查如果提交說(shuō)明沒(méi)有按照模板填寫(xiě)【背景】和【驗(yàn)證】?jī)刹糠謾C(jī)器人會(huì)直接給這個(gè)提交打上 fail 標(biāo)記。有同事一開(kāi)始覺(jué)得這機(jī)器人在找麻煩但后面習(xí)慣了反而離不開(kāi)因?yàn)?commit 信息規(guī)范之后幾個(gè)月后回看歷史記錄檢索效率高了不少。工具在這里沒(méi)有替代人去思考它只是把人從“盯著別人守規(guī)矩”這件事里解放了出來(lái)。3.2 統(tǒng)計(jì)維度用數(shù)據(jù)而不是感覺(jué)來(lái)判斷第二個(gè)比較實(shí)用的模塊是評(píng)審數(shù)據(jù)統(tǒng)計(jì)。這里的統(tǒng)計(jì)不是用來(lái)考核績(jī)效而是用來(lái)發(fā)現(xiàn)流程瓶頸。我會(huì)重點(diǎn)盯三個(gè)指標(biāo)指標(biāo)計(jì)算方式我們關(guān)注的信號(hào)評(píng)審覆蓋率實(shí)際有有效評(píng)論的 MR 數(shù) / 總 MR 數(shù)如果長(zhǎng)期低于 70%說(shuō)明評(píng)審流于形式首輪反饋中位數(shù)從提交 MR 到第一條評(píng)論的時(shí)間如果超過(guò) 8 小時(shí)說(shuō)明評(píng)審 SLA 出了問(wèn)題評(píng)審討論密度平均每個(gè) MR 的有效評(píng)論條數(shù)過(guò)少說(shuō)明沒(méi)人認(rèn)真看過(guò)多說(shuō)明需求描述可能不清晰我在上線這套統(tǒng)計(jì)的前兩周就發(fā)現(xiàn)有個(gè)模塊的評(píng)審覆蓋率長(zhǎng)期低得嚇人。查了下原因發(fā)現(xiàn)是這個(gè)模塊的代碼風(fēng)格和架構(gòu)太“年久失修”大家看了都覺(jué)得無(wú)從下口干脆就不看了。后來(lái)我們花了兩個(gè)迭代把那個(gè)模塊的重構(gòu)做了覆蓋率自己就漲上來(lái)了。所以統(tǒng)計(jì)工具的目的不是匯報(bào)而是定位團(tuán)隊(duì)的“評(píng)審盲區(qū)”。3.3 評(píng)審提醒機(jī)器人把時(shí)效 SLA 落地自動(dòng)提醒機(jī)器人也比較關(guān)鍵。它做的事情很無(wú)聊但很有效每當(dāng)有人提交合并請(qǐng)求機(jī)器人會(huì)把這個(gè)通知按項(xiàng)目成員角色分發(fā)到對(duì)應(yīng)的人同時(shí)附上評(píng)審清單的鏈接。如果 4 小時(shí)內(nèi)沒(méi)有人回復(fù)它會(huì)再發(fā)一條私信催促。如果 8 小時(shí)沒(méi)有人給首輪反饋它會(huì)直接把這個(gè) MR 標(biāo)記為“過(guò)期”同時(shí)抄送給技術(shù)負(fù)責(zé)人。有人可能會(huì)擔(dān)心這種機(jī)器人太機(jī)械、不近人情。但我實(shí)踐下來(lái)發(fā)現(xiàn)多數(shù)情況下大家不是不想做評(píng)審而是手上事太多真的忘了。工具在這里扮演的角色就是“一個(gè)不會(huì)忘事的項(xiàng)目助理”提醒本身并不帶任何指責(zé)意味。4. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄這套流程跑了大半年中間遇到過(guò)不少狀況。我挑幾個(gè)典型問(wèn)題連同處理辦法一并寫(xiě)出來(lái)給后面想嘗試的團(tuán)隊(duì)當(dāng)個(gè)參考。4.1 “沒(méi)人愿意評(píng)審怎么辦”這是被問(wèn)得最多的一個(gè)問(wèn)題。新機(jī)制剛上線時(shí)最難的往往不是流程而是氛圍。我的辦法比較落地分三步走把評(píng)審責(zé)任寫(xiě)進(jìn)開(kāi)發(fā)任務(wù)的定義里如果“完成開(kāi)發(fā)”的定義不包含“通過(guò)評(píng)審”那開(kāi)發(fā)人員天然會(huì)抗拒評(píng)審環(huán)節(jié)。我們調(diào)整了迭代完成標(biāo)準(zhǔn)沒(méi)有通過(guò)評(píng)審的任務(wù)不算完成。降低參與門(mén)檻剛開(kāi)始不要求每個(gè)人都提出高深的架構(gòu)見(jiàn)解哪怕只提一個(gè)關(guān)于測(cè)試覆蓋的問(wèn)題都在公開(kāi)場(chǎng)合肯定。領(lǐng)導(dǎo)帶頭示范評(píng)審技術(shù)負(fù)責(zé)人要率先認(rèn)認(rèn)真真寫(xiě)評(píng)論而不是當(dāng)甩手掌柜。如果管理層自己都不看代碼底下人很快就跟你學(xué)壞了。4.2 “評(píng)審意見(jiàn)太水怎么辦”還有段時(shí)間統(tǒng)計(jì)里顯示評(píng)審覆蓋率上去了但有效評(píng)論率卻下來(lái)了。一多半的評(píng)論都是“學(xué)習(xí)了”“1”這種禮貌性跟評(píng)對(duì)發(fā)現(xiàn)問(wèn)題毫無(wú)幫助。問(wèn)題出在評(píng)審人不清楚“該怎么看”而不是“不想看”。這時(shí)候我干了一件事組織了一次 30 分鐘的評(píng)審示范會(huì)。拿一個(gè)真實(shí)的歷史 MR我現(xiàn)場(chǎng)演示自己會(huì)如何在 15 分鐘內(nèi)讀 diff、如何在關(guān)鍵邏輯處下鉆追問(wèn)、如何判斷哪些問(wèn)題是阻塞性的。演示完大家馬上就跟上了。人的學(xué)習(xí)效率最高的時(shí)候就是在現(xiàn)場(chǎng)被帶一次你讓新員工看一百頁(yè)評(píng)審規(guī)范不如帶他實(shí)際操作半小時(shí)。4.3 “為了改而改評(píng)審反而引入風(fēng)險(xiǎn)”還有一個(gè)暗坑有時(shí)候被評(píng)審的人會(huì)因?yàn)橐貜?fù)每一條評(píng)論機(jī)械地修改代碼最后反而把原本穩(wěn)定的實(shí)現(xiàn)改出了 bug。我觀察到這個(gè)情況后在評(píng)審約定里明確寫(xiě)了任何建議修改都必須基于風(fēng)險(xiǎn)收益判斷而不是出于人情壓力。如果作者覺(jué)得某條評(píng)論的建議不適用于當(dāng)前場(chǎng)景他有權(quán)拒絕修改并在討論區(qū)說(shuō)明理由。我作為最終合并人會(huì)尊重這種判斷。有一次我們組里一個(gè)資深工程師寧折不彎地拒絕了一條修改意見(jiàn)原因是那條意見(jiàn)雖然能讓代碼更“優(yōu)雅”但會(huì)引入額外的并發(fā)復(fù)雜度。他給出了充分的定量分析大家討論完之后不但不怪他還都覺(jué)得學(xué)到了東西。4.4 “新人不敢在評(píng)審里說(shuō)話怎么辦”新人面對(duì)一堆陌生代碼很難找到自信心這也是團(tuán)隊(duì)評(píng)審參與度不均衡的重要原因。我給新人準(zhǔn)備了一個(gè)“新手評(píng)審視角”的標(biāo)簽。新人剛開(kāi)始不用去評(píng)價(jià)核心邏輯只需負(fù)責(zé)檢查測(cè)試用例命名是否清晰、文檔與實(shí)際行為是否一致、變量命名是否表意明確。這些角度不需要太深的代碼理解力但對(duì)團(tuán)隊(duì)價(jià)值依然是正向的。等新人積累了幾次成功經(jīng)驗(yàn)自信心建立起來(lái)再逐漸引導(dǎo)他們進(jìn)入更深層的架構(gòu)討論。這塊的訣竅是先讓新人在他自己能力圈內(nèi)產(chǎn)生有效貢獻(xiàn)再談擴(kuò)展能力圈。5. 效果度量與一點(diǎn)個(gè)人心得機(jī)制跑熟之后我在團(tuán)隊(duì)里看到了幾個(gè)切實(shí)的變化上線前評(píng)審攔截到的“真正會(huì)出事的缺陷”從每月個(gè)位數(shù)提高到了穩(wěn)定的每周 2~3 個(gè)。新同事上手一個(gè)陌生模塊的時(shí)間因?yàn)樵u(píng)審里的背景討論沉淀平均縮短了兩三天。跨模塊的架構(gòu)信息斷層問(wèn)題明顯減少因?yàn)榇蠹乙呀?jīng)習(xí)慣了在評(píng)審里主動(dòng)同步上下文。我個(gè)人最大的體會(huì)是代碼評(píng)審不是一個(gè)“質(zhì)量關(guān)卡”它本質(zhì)上是團(tuán)隊(duì)的認(rèn)知協(xié)作系統(tǒng)。寫(xiě)代碼的人在里面表達(dá)審代碼的人在里面校驗(yàn)機(jī)器人在里面負(fù)責(zé)維持秩序。如果只把它當(dāng)流程來(lái)做做出來(lái)的就是一紙空文如果把它當(dāng)成知識(shí)管理來(lái)做它就能持續(xù)沉淀出團(tuán)隊(duì)的協(xié)作能力。最后再分享一個(gè)小技巧如果你想在團(tuán)隊(duì)里推這套東西不要搞“運(yùn)動(dòng)式”的大宣貫找一個(gè)改動(dòng)量中等、風(fēng)險(xiǎn)可控的普通功能試點(diǎn)把完整的流程帶著團(tuán)隊(duì)走兩遍讓效果自己說(shuō)話。做開(kāi)發(fā)的人都信代碼不信口號(hào)你讓他親眼看到一次評(píng)審真的攔住了一個(gè)線上故障后面都不用你催他自己會(huì)主動(dòng)做評(píng)審。希望這套實(shí)踐能給你一些啟發(fā)。代碼評(píng)審這條路沒(méi)有什么銀彈但只要你愿意投入時(shí)間去打磨協(xié)作細(xì)節(jié)它回饋給團(tuán)隊(duì)的一定是穩(wěn)穩(wěn)的長(zhǎng)期收益。