審沉淀為可復(fù)用知識(shí)資產(chǎn))
1. 為什么“open-code-review”值得單獨(dú)拿出來(lái)聊第一次聽到“open-code-review”這個(gè)詞很多人會(huì)下意識(shí)把它理解成“把代碼評(píng)審過(guò)程公開”或者“開源項(xiàng)目的代碼評(píng)審”。這兩種理解都不算錯(cuò)但都只碰到了表層。我做了十多年研發(fā)帶過(guò)十幾個(gè)不同規(guī)模的團(tuán)隊(duì)真正讓我意識(shí)到這件事值得系統(tǒng)化去做的是在一次跨部門協(xié)作里三個(gè)團(tuán)隊(duì)共用一個(gè)核心倉(cāng)庫(kù)提交頻率高、人員流動(dòng)快評(píng)審意見散落在各種渠道里最后沒(méi)人說(shuō)得清某個(gè)設(shè)計(jì)決策到底是誰(shuí)拍的板、依據(jù)是什么。那次之后我開始認(rèn)真思考代碼評(píng)審這件事能不能像代碼本身一樣被“打開”——過(guò)程可追溯、結(jié)論可檢索、經(jīng)驗(yàn)可沉淀。open-code-review 的核心就是讓代碼評(píng)審從“一次性對(duì)話”變成“可積累的資產(chǎn)”。它解決的不是“怎么審代碼”這個(gè)老問(wèn)題而是“審?fù)曛罅粝铝耸裁础边@個(gè)新問(wèn)題。傳統(tǒng)評(píng)審里一條評(píng)論被合并請(qǐng)求關(guān)閉后就消失了下次遇到同類問(wèn)題新人還是得重新踩一遍。而 open-code-review 的思路是把評(píng)審過(guò)程中的判斷、爭(zhēng)議、取舍全部結(jié)構(gòu)化地保留下來(lái)形成團(tuán)隊(duì)自己的知識(shí)庫(kù)。這套東西適合誰(shuí)我的判斷是三類人最需要一是團(tuán)隊(duì)的技術(shù)負(fù)責(zé)人需要讓評(píng)審質(zhì)量不依賴于某幾個(gè)資深員工二是剛接手陌生代碼庫(kù)的開發(fā)者需要快速理解歷史決策三是開源項(xiàng)目的維護(hù)者面對(duì)大量外部貢獻(xiàn)時(shí)需要一套可復(fù)用的評(píng)審標(biāo)準(zhǔn)。哪怕你只是一個(gè)人寫代碼把評(píng)審記錄整理清楚三個(gè)月后的自己也會(huì)感謝現(xiàn)在的你。2. 整體設(shè)計(jì)思路把評(píng)審當(dāng)成一次可復(fù)現(xiàn)的實(shí)驗(yàn)2.1 核心矛盾評(píng)審的即時(shí)性和知識(shí)的長(zhǎng)期性代碼評(píng)審天然是即時(shí)性的——提交來(lái)了就得看看完就得給意見給完就得決定合不合。但知識(shí)沉淀是長(zhǎng)期性的——一個(gè)決策的價(jià)值往往在幾個(gè)月后才顯現(xiàn)。這兩者之間存在結(jié)構(gòu)性矛盾越追求評(píng)審速度留下的記錄就越潦草越追求記錄完整評(píng)審效率就越低。open-code-review 的設(shè)計(jì)出發(fā)點(diǎn)就是在這兩者之間找一個(gè)可持續(xù)的平衡點(diǎn)。我的做法是把評(píng)審拆成兩層一層是“快評(píng)”只關(guān)注能不能合、有沒(méi)有明顯問(wèn)題另一層是“深評(píng)”針對(duì)有爭(zhēng)議或影響面大的改動(dòng)做完整的背景記錄和決策說(shuō)明??煸u(píng)走輕量流程深評(píng)走結(jié)構(gòu)化模板。這樣既不會(huì)讓所有提交都背上沉重的記錄負(fù)擔(dān)又能保證關(guān)鍵決策有據(jù)可查。提示不要試圖讓每一條評(píng)審都變成文檔。我試過(guò)全員強(qiáng)制寫詳細(xì)評(píng)審記錄結(jié)果兩周內(nèi)大家就開始復(fù)制粘貼套話反而污染了知識(shí)庫(kù)。分層處理才是可持續(xù)的。2.2 方案選型為什么是“開放”而不是“集中”市面上有不少代碼評(píng)審工具功能都很強(qiáng)但它們大多假設(shè)評(píng)審是一個(gè)“集中管理”的過(guò)程——由平臺(tái)記錄、由管理員維護(hù)、由系統(tǒng)推送。open-code-review 的“open”體現(xiàn)在兩個(gè)地方一是評(píng)審標(biāo)準(zhǔn)對(duì)全員可見誰(shuí)都可以提出修改二是評(píng)審記錄以純文本形式存放在代碼倉(cāng)庫(kù)里跟代碼同生命周期。為什么堅(jiān)持放在倉(cāng)庫(kù)里而不是外部系統(tǒng)因?yàn)橥獠肯到y(tǒng)會(huì)過(guò)期、會(huì)遷移、會(huì)因?yàn)橘~號(hào)權(quán)限問(wèn)題變得不可訪問(wèn)。而放在倉(cāng)庫(kù)里的評(píng)審記錄只要代碼還在記錄就在。我經(jīng)歷過(guò)一次工具遷移三年積累的評(píng)審評(píng)論全部丟失從那以后我就認(rèn)準(zhǔn)了一個(gè)原則跟代碼強(qiáng)相關(guān)的信息盡量跟代碼放在一起。具體實(shí)現(xiàn)上我推薦用 Markdown 文件加目錄約定的方式。在倉(cāng)庫(kù)根目錄建一個(gè)reviews/文件夾每次深評(píng)生成一個(gè)獨(dú)立文件命名規(guī)則是日期-模塊-簡(jiǎn)短描述.md。文件內(nèi)部用固定的小節(jié)結(jié)構(gòu)背景、改動(dòng)范圍、爭(zhēng)議點(diǎn)、最終決策、后續(xù)影響。這個(gè)結(jié)構(gòu)看起來(lái)簡(jiǎn)單但堅(jiān)持半年后它就成了團(tuán)隊(duì)最常被搜索的目錄。2.3 優(yōu)勢(shì)與代價(jià)說(shuō)清楚這套方案的邊界任何方案都有代價(jià)open-code-review 也不例外。它的優(yōu)勢(shì)很明顯記錄永久可查、不依賴外部工具、新人上手快、決策鏈路清晰。但代價(jià)同樣存在需要人工維護(hù)沒(méi)有自動(dòng)提醒搜索靠文件系統(tǒng)而不是數(shù)據(jù)庫(kù)。我的經(jīng)驗(yàn)是這套方案最適合二十人以內(nèi)、提交頻率中等、對(duì)知識(shí)沉淀有真實(shí)需求的團(tuán)隊(duì)。如果團(tuán)隊(duì)超過(guò)五十人或者每天有上百次提交純文件方案會(huì)變得難以維護(hù)這時(shí)候需要引入索引工具或者輕量數(shù)據(jù)庫(kù)。但即便如此評(píng)審記錄本身仍然建議保留純文本格式工具只是加速檢索不能替代內(nèi)容本身。3. 核心細(xì)節(jié)解析評(píng)審記錄到底該寫什么3.1 背景小節(jié)讓三個(gè)月后的人能看懂很多評(píng)審記錄寫不好問(wèn)題都出在背景部分。寫的人覺(jué)得“大家都知道為什么要改”看的人三個(gè)月后完全摸不著頭腦。我的標(biāo)準(zhǔn)是背景部分必須能讓一個(gè)完全不了解上下文的人在讀完三句話后明白這次改動(dòng)要解決什么問(wèn)題。具體寫法上我要求包含三個(gè)要素觸發(fā)事件、影響范圍、不處理的后果。觸發(fā)事件可以是線上問(wèn)題、需求變更、性能瓶頸影響范圍要說(shuō)清楚涉及哪些模塊、哪些用戶不處理的后果要具體不能寫“會(huì)有問(wèn)題”要寫“會(huì)導(dǎo)致某接口在高峰期超時(shí)”。這三句話寫清楚后面的決策才有討論的基礎(chǔ)。注意背景部分嚴(yán)禁寫“根據(jù)領(lǐng)導(dǎo)要求”或“按照計(jì)劃”這類無(wú)法驗(yàn)證的表述。評(píng)審記錄的價(jià)值在于可追溯不可驗(yàn)證的表述等于沒(méi)寫。3.2 爭(zhēng)議點(diǎn)記錄把分歧變成資產(chǎn)評(píng)審最有價(jià)值的部分不是最終結(jié)論而是得出結(jié)論過(guò)程中的分歧。一個(gè)沒(méi)有爭(zhēng)議的評(píng)審?fù)馕吨锤膭?dòng)太小要么評(píng)審太敷衍。真正值得記錄的是那些“兩種方案各有道理”的時(shí)刻。我的做法是在爭(zhēng)議點(diǎn)小節(jié)里并列寫出至少兩個(gè)方案每個(gè)方案列出支持理由和反對(duì)理由最后寫明為什么選了其中一個(gè)。這個(gè)格式看起來(lái)像論文但實(shí)際用起來(lái)非常高效。因?yàn)橄麓斡龅筋愃茊?wèn)題時(shí)你不需要重新推演直接看當(dāng)時(shí)的理由是否仍然成立即可。舉個(gè)例子之前有個(gè)團(tuán)隊(duì)在“是否引入緩存”上爭(zhēng)論了很久。評(píng)審記錄里寫清楚了方案A引入本地緩存優(yōu)點(diǎn)是快缺點(diǎn)是數(shù)據(jù)一致性難保證方案B不引入緩存優(yōu)點(diǎn)是簡(jiǎn)單缺點(diǎn)是數(shù)據(jù)庫(kù)壓力大。最終選了方案B理由是當(dāng)前數(shù)據(jù)量下數(shù)據(jù)庫(kù)扛得住而一致性問(wèn)題的排查成本更高。半年后數(shù)據(jù)量上來(lái)了團(tuán)隊(duì)直接翻出這條記錄發(fā)現(xiàn)當(dāng)初的假設(shè)已經(jīng)改變于是順利切換到方案A。如果沒(méi)有這條記錄這半年的決策過(guò)程就完全丟失了。3.3 決策與后續(xù)影響閉環(huán)才算完成評(píng)審記錄最容易缺失的部分是“后續(xù)影響”。很多人寫完決策就結(jié)束了但決策之后的實(shí)際效果才是最有價(jià)值的信息。我的要求是在改動(dòng)上線兩周后由提交者補(bǔ)充一條“實(shí)際影響”記錄說(shuō)明當(dāng)初的預(yù)期是否達(dá)成、有沒(méi)有出現(xiàn)意外情況。這個(gè)補(bǔ)充記錄不需要很長(zhǎng)兩三句話即可。但它的存在讓整個(gè)評(píng)審形成了閉環(huán)背景、爭(zhēng)議、決策、結(jié)果。一個(gè)完整的閉環(huán)記錄價(jià)值遠(yuǎn)高于十篇只有決策沒(méi)有結(jié)果的文檔。我統(tǒng)計(jì)過(guò)自己團(tuán)隊(duì)的評(píng)審記錄那些有后續(xù)影響的條目被引用次數(shù)是普通條目的五倍以上。4. 實(shí)操過(guò)程從零搭建一套可用的評(píng)審記錄體系4.1 目錄結(jié)構(gòu)與命名約定第一步是確定目錄結(jié)構(gòu)。我的建議是在倉(cāng)庫(kù)根目錄建reviews/下面按年份建子目錄再下面按月份建子目錄。文件名格式為YYYYMMDD-模塊名-簡(jiǎn)短描述.md。這個(gè)結(jié)構(gòu)的好處是按時(shí)間排序天然有序按模塊搜索也方便。reviews/ ├── 2024/ │ ├── 01/ │ │ ├── 20240115-auth-登錄超時(shí)處理.md │ │ └── 20240122-order-訂單狀態(tài)機(jī)調(diào)整.md │ └── 02/ │ └── 20240203-payment-支付重試策略.md └── 2025/ └── 01/ └── 20250110-auth-令牌刷新邏輯.md命名約定要提前定好一旦定好就不要輕易改。我見過(guò)團(tuán)隊(duì)中途改命名規(guī)則結(jié)果舊文件和新文件混在一起搜索時(shí)非常痛苦。如果確實(shí)需要調(diào)整建議寫一個(gè)遷移腳本批量重命名而不是新舊并存。4.2 評(píng)審模板的字段設(shè)計(jì)模板不需要復(fù)雜但字段必須固定。我用的模板包含以下字段字段說(shuō)明是否必填背景觸發(fā)事件、影響范圍、不處理的后果必填改動(dòng)范圍涉及模塊、接口、數(shù)據(jù)表必填爭(zhēng)議點(diǎn)至少兩個(gè)方案及各自理由有爭(zhēng)議時(shí)必填最終決策選了哪個(gè)方案、為什么必填后續(xù)影響上線兩周后補(bǔ)充必填相關(guān)鏈接關(guān)聯(lián)的提交、問(wèn)題單選填這個(gè)表格看起來(lái)簡(jiǎn)單但每個(gè)字段都有明確的填寫要求。比如“改動(dòng)范圍”必須寫到接口級(jí)別不能只寫“用戶模塊”。因?yàn)槿齻€(gè)月后你搜索時(shí)記得的往往是具體接口名而不是模塊名。4.3 評(píng)審流程的嵌入方式評(píng)審記錄不能獨(dú)立于開發(fā)流程之外否則沒(méi)人會(huì)主動(dòng)寫。我的做法是把它嵌入到合并請(qǐng)求的檢查清單里任何標(biāo)記為“深評(píng)”的合并請(qǐng)求必須在reviews/目錄下有對(duì)應(yīng)的記錄文件否則不允許合并。這個(gè)規(guī)則通過(guò)自動(dòng)化檢查來(lái)實(shí)現(xiàn)。在持續(xù)集成配置里加一條腳本檢查合并請(qǐng)求是否關(guān)聯(lián)了評(píng)審文件。腳本邏輯很簡(jiǎn)單如果合并請(qǐng)求的標(biāo)簽包含“deep-review”則檢查reviews/目錄下是否有對(duì)應(yīng)日期的文件。沒(méi)有就報(bào)錯(cuò)阻止合并。import os import sys from datetime import datetime def check_review_file(module_name): today datetime.now().strftime(%Y%m%d) review_dir os.path.join(reviews, datetime.now().strftime(%Y), datetime.now().strftime(%m)) if not os.path.exists(review_dir): return False for filename in os.listdir(review_dir): if filename.startswith(today) and module_name in filename: return True return False if __name__ __main__: module sys.argv[1] if not check_review_file(module): print(缺少評(píng)審記錄文件請(qǐng)先創(chuàng)建) sys.exit(1) print(評(píng)審記錄檢查通過(guò))這個(gè)腳本我用了兩年多最大的好處是它把“寫評(píng)審記錄”從一個(gè)自覺(jué)行為變成了流程的硬性環(huán)節(jié)。人都是有惰性的沒(méi)有檢查機(jī)制再好的規(guī)范也會(huì)慢慢荒廢。4.4 評(píng)審記錄的檢索與復(fù)用記錄寫多了之后檢索就成了新問(wèn)題。純文件系統(tǒng)的搜索能力有限我的做法是定期生成一個(gè)索引文件。每個(gè)月月底用腳本掃描reviews/目錄提取每個(gè)文件的標(biāo)題、模塊、日期生成一個(gè)INDEX.md文件。這個(gè)索引文件放在倉(cāng)庫(kù)根目錄方便快速瀏覽。索引文件的格式很簡(jiǎn)單就是一個(gè)表格日期模塊標(biāo)題鏈接20240115auth登錄超時(shí)處理查看20240122order訂單狀態(tài)機(jī)調(diào)整查看這個(gè)索引文件不需要手動(dòng)維護(hù)用腳本自動(dòng)生成即可。生成腳本可以放在持續(xù)集成里每次有新的評(píng)審文件合并時(shí)自動(dòng)更新。這樣既保證了索引的及時(shí)性又避免了人工維護(hù)的遺漏。5. 常見問(wèn)題與排查技巧實(shí)錄5.1 評(píng)審記錄寫成流水賬怎么辦這是最常見的問(wèn)題。很多人把評(píng)審記錄寫成了“今天改了A明天改了B”的流水賬讀起來(lái)毫無(wú)價(jià)值。根本原因是沒(méi)有抓住“決策”這個(gè)核心。我的糾正方法是寫完之后問(wèn)自己一句——如果三個(gè)月后有人想推翻這個(gè)決策他需要知道什么把那些信息寫進(jìn)去流水賬自然就變成了決策記錄。具體操作上我要求每條評(píng)審記錄必須包含至少一個(gè)“為什么”。為什么選這個(gè)方案而不是那個(gè)為什么現(xiàn)在做而不是以后做為什么影響范圍是這些而不是那些沒(méi)有“為什么”的記錄一律打回重寫。5.2 團(tuán)隊(duì)不配合怎么推動(dòng)推動(dòng)任何新流程都會(huì)遇到阻力我的經(jīng)驗(yàn)是不要一上來(lái)就全員強(qiáng)制。先找兩三個(gè)愿意嘗試的同事在小范圍內(nèi)跑通流程積累十幾條高質(zhì)量記錄。然后在團(tuán)隊(duì)分享會(huì)上拿這些記錄舉例看上次那個(gè)問(wèn)題我們翻出三個(gè)月前的記錄五分鐘就搞清楚了來(lái)龍去脈。用實(shí)際效果說(shuō)話比任何強(qiáng)制規(guī)定都有效。另外降低起步門檻也很重要。一開始不要要求寫得多完整哪怕只寫背景和決策兩段也行。等大家習(xí)慣了再逐步補(bǔ)充爭(zhēng)議點(diǎn)和后續(xù)影響。我見過(guò)太多團(tuán)隊(duì)一開始就追求完美模板結(jié)果三天后就沒(méi)人寫了。5.3 評(píng)審記錄和提交信息有什么區(qū)別這個(gè)問(wèn)題我被問(wèn)過(guò)很多次。提交信息是給代碼變更做注釋評(píng)審記錄是給決策過(guò)程做注釋。提交信息回答“改了什么”評(píng)審記錄回答“為什么這么改”。兩者互補(bǔ)但不能互相替代。我的做法是提交信息保持簡(jiǎn)潔一兩句話說(shuō)明改動(dòng)內(nèi)容評(píng)審記錄詳細(xì)展開背景和決策。在提交信息里加一行鏈接指向?qū)?yīng)的評(píng)審記錄文件。這樣看提交歷史時(shí)能快速了解改動(dòng)需要深入時(shí)再點(diǎn)進(jìn)評(píng)審記錄。5.4 常見問(wèn)題速查表問(wèn)題原因解決方法記錄沒(méi)人看索引缺失或搜索困難自動(dòng)生成索引文件按模塊和日期分類記錄質(zhì)量差模板太復(fù)雜或要求不明確簡(jiǎn)化模板明確每個(gè)字段的填寫標(biāo)準(zhǔn)團(tuán)隊(duì)不配合強(qiáng)制推行或起步門檻太高小范圍試點(diǎn)用效果說(shuō)服逐步推廣記錄過(guò)期沒(méi)有后續(xù)影響補(bǔ)充上線兩周后自動(dòng)提醒補(bǔ)充搜索效率低純文件系統(tǒng)限制定期生成索引必要時(shí)引入輕量搜索工具提示評(píng)審記錄的價(jià)值不在于寫得多漂亮而在于三個(gè)月后還能被找到、被看懂、被復(fù)用。所有優(yōu)化都應(yīng)該圍繞這三個(gè)目標(biāo)展開。5.5 一個(gè)容易被忽略的細(xì)節(jié)評(píng)審記錄的版本管理評(píng)審記錄本身也是文件也會(huì)被修改。我的建議是評(píng)審記錄一旦合并就不再修改正文內(nèi)容。如果需要補(bǔ)充或修正在文件末尾追加“更新記錄”小節(jié)寫明修改時(shí)間和修改原因。這樣既保留了歷史又允許信息更新。這個(gè)做法借鑒了代碼版本管理的思路不修改歷史只追加新版本。我試過(guò)直接修改評(píng)審記錄結(jié)果后來(lái)的人看到的內(nèi)容和當(dāng)初的決策不一致造成了誤解。從那以后我就堅(jiān)持追加式更新雖然看起來(lái)有點(diǎn)笨但信息完整性得到了保證。6. 從個(gè)人實(shí)踐到團(tuán)隊(duì)習(xí)慣的演進(jìn)路徑6.1 第一階段個(gè)人記錄解決自己的問(wèn)題如果你是一個(gè)人寫代碼或者團(tuán)隊(duì)里只有你想嘗試這套方法那就從自己開始。每次遇到需要做決策的改動(dòng)花十分鐘寫一條評(píng)審記錄。不用管別人怎么看先讓自己養(yǎng)成習(xí)慣。這個(gè)階段的目標(biāo)是積累二十條以上的記錄讓自己感受到“翻舊賬”的便利。我自己的經(jīng)驗(yàn)是前十條記錄寫起來(lái)很別扭總覺(jué)得浪費(fèi)時(shí)間。但寫到第十五條左右有一次排查一個(gè)半年前的問(wèn)題翻出當(dāng)時(shí)的記錄五分鐘就定位到了原因。那一刻的體驗(yàn)讓我徹底認(rèn)可了這件事的價(jià)值。6.2 第二階段小范圍推廣用效果說(shuō)話當(dāng)你自己有了積累就可以在團(tuán)隊(duì)里找一兩個(gè)愿意嘗試的同事。不要開會(huì)宣布不要發(fā)正式通知就在日常協(xié)作中自然地帶入。比如同事問(wèn)你某個(gè)歷史決策你直接甩一條評(píng)審記錄鏈接過(guò)去。幾次之后對(duì)方自然會(huì)問(wèn)“這個(gè)是怎么寫的”這時(shí)候再分享模板和流程。這個(gè)階段的關(guān)鍵是不要急于求成。我見過(guò)有人剛寫了幾條記錄就急著全員推廣結(jié)果遇到阻力后自己先放棄了。小范圍推廣的目標(biāo)不是覆蓋多少人而是驗(yàn)證這套方法在協(xié)作場(chǎng)景下是否仍然有效。6.3 第三階段形成習(xí)慣融入流程當(dāng)團(tuán)隊(duì)里有三五個(gè)人都在寫評(píng)審記錄時(shí)就可以考慮把它嵌入流程了。在合并請(qǐng)求模板里加一行檢查項(xiàng)在持續(xù)集成里加一個(gè)檢查腳本。這個(gè)階段的目標(biāo)是讓寫評(píng)審記錄變成默認(rèn)動(dòng)作而不是額外負(fù)擔(dān)。到了這個(gè)階段你會(huì)發(fā)現(xiàn)一個(gè)有趣的現(xiàn)象新人入職時(shí)你不再需要花大量時(shí)間口頭解釋歷史決策直接讓他讀評(píng)審記錄索引即可。老員工離職時(shí)他的決策思路也留在了記錄里不會(huì)隨著人走而消失。這才是 open-code-review 真正的價(jià)值——它讓團(tuán)隊(duì)的集體記憶不再依賴于個(gè)體的留存。6.4 第四階段持續(xù)優(yōu)化但不要過(guò)度工程化流程跑起來(lái)之后總有人想優(yōu)化。我的建議是優(yōu)化可以但不要過(guò)度工程化。我見過(guò)團(tuán)隊(duì)把評(píng)審記錄系統(tǒng)做成了帶數(shù)據(jù)庫(kù)、帶前端界面、帶權(quán)限管理的完整應(yīng)用結(jié)果維護(hù)成本太高半年后就沒(méi)人用了。評(píng)審記錄的核心是內(nèi)容不是工具。工具只要滿足“能寫、能存、能搜”三個(gè)基本功能就夠了。如果確實(shí)需要更好的搜索體驗(yàn)可以引入輕量的靜態(tài)站點(diǎn)生成工具把 Markdown 文件渲染成網(wǎng)頁(yè)。但數(shù)據(jù)庫(kù)和權(quán)限系統(tǒng)對(duì)于大多數(shù)團(tuán)隊(duì)來(lái)說(shuō)都是不必要的。保持簡(jiǎn)單才能持續(xù)。7. 一些踩過(guò)的坑和真實(shí)體會(huì)我在這件事上踩過(guò)最大的坑是早期追求“大而全”的模板。當(dāng)時(shí)設(shè)計(jì)了一個(gè)包含十幾個(gè)字段的評(píng)審模板結(jié)果大家填了兩周就受不了了開始大量留空。后來(lái)我把模板砍到五個(gè)必填字段填寫率立刻上來(lái)了。這件事讓我明白流程設(shè)計(jì)的第一原則是可持續(xù)而不是完備。另一個(gè)坑是忽略了評(píng)審記錄的“可發(fā)現(xiàn)性”。早期我把記錄放在一個(gè)很深的目錄里結(jié)果除了我自己沒(méi)人找得到。后來(lái)加了索引文件放在倉(cāng)庫(kù)根目錄訪問(wèn)量立刻上去了。信息放在哪里和寫了什么同樣重要。還有一個(gè)體會(huì)是關(guān)于時(shí)機(jī)的。評(píng)審記錄最好在合并請(qǐng)求創(chuàng)建時(shí)就開始寫而不是合并之后補(bǔ)。因?yàn)楹喜r(shí)你腦子里還有完整的上下文補(bǔ)寫時(shí)往往已經(jīng)忘了當(dāng)時(shí)的糾結(jié)。我現(xiàn)在的習(xí)慣是創(chuàng)建合并請(qǐng)求的同時(shí)就創(chuàng)建評(píng)審記錄文件邊評(píng)審邊補(bǔ)充合并時(shí)記錄也基本完成了。最后分享一個(gè)小技巧在評(píng)審記錄里加一個(gè)“如果重來(lái)”小節(jié)。每次決策之后寫一句“如果現(xiàn)在重新選我還會(huì)選這個(gè)方案嗎為什么”這個(gè)問(wèn)題看起來(lái)簡(jiǎn)單但能逼著你反思決策質(zhì)量。我翻看自己的記錄時(shí)發(fā)現(xiàn)那些“如果重來(lái)”寫得很篤定的條目往往是最經(jīng)得起時(shí)間考驗(yàn)的決策。