
以下為譯文:
在本文中,我們將簡(jiǎn)要介紹13條代碼審查標(biāo)準(zhǔn),希望能夠通過(guò)這些標(biāo)準(zhǔn)極大地幫助改善軟件的質(zhì)量,同時(shí)讓開(kāi)發(fā)人員保持心情愉悅。
代碼審查是開(kāi)發(fā)過(guò)程中的一個(gè)環(huán)節(jié),顧名思義,代碼審查需要一位或多位開(kāi)發(fā)人員審查另一位開(kāi)發(fā)人員(即代碼的作者)編寫的代碼,以確保:
代碼沒(méi)有任何錯(cuò)誤,沒(méi)有bug,也沒(méi)有問(wèn)題;
代碼符合質(zhì)量與樣式指南的要求和標(biāo)準(zhǔn);
代碼完成了所有預(yù)期功能;
合并代碼后,代碼庫(kù)仍然能夠正常運(yùn)行,且達(dá)到更好的狀態(tài)。
這就是為什么代碼審查是軟件開(kāi)發(fā)的重要環(huán)節(jié)的原因。
代碼審查者擔(dān)當(dāng)著把關(guān)者的職責(zé),負(fù)責(zé)決定這些代碼是否能夠成為代碼庫(kù)的一部分并進(jìn)入生產(chǎn)環(huán)境。
Google以其卓越的技術(shù)而聞名世界,他們擁有高效的代碼審查標(biāo)準(zhǔn),這些標(biāo)準(zhǔn)突出了審查代碼時(shí)需要牢記的一些重點(diǎn)。
在Google,“代碼審查的主要目的是確保Google代碼庫(kù)內(nèi)整體的代碼運(yùn)行狀況能夠不斷提升?!?/strong>
—— Google工程實(shí)踐文檔
以下是審查代碼時(shí)你需要牢記的一些重點(diǎn)。
代碼審查標(biāo)準(zhǔn):
這些代碼能夠提升系統(tǒng)整體的運(yùn)行狀況
每次代碼變更(拉取請(qǐng)求)都能夠提升系統(tǒng)整體的運(yùn)行狀況。重點(diǎn)在于,即便是很小的改進(jìn),合并代碼后都會(huì)提升軟件或代碼庫(kù)的運(yùn)行狀況。
快速審查代碼,并給出積極地響應(yīng)和反饋首先也是最重要的一點(diǎn),不可延誤代碼的合并。
世上沒(méi)有完美的代碼。如果代碼可以提升系統(tǒng)的整體運(yùn)行狀況,則應(yīng)該立即交付這些代碼。
“關(guān)鍵在于,世上沒(méi)有完美的代碼,只有更好的代碼。”
—— Google工程實(shí)踐文檔
如果手頭沒(méi)有緊急任務(wù),那么請(qǐng)?jiān)诖a提交上來(lái)后立即進(jìn)行審查。響應(yīng)拉取請(qǐng)求的時(shí)間最長(zhǎng)不得超過(guò)一個(gè)工作日。一天之內(nèi),應(yīng)針對(duì)一次拉取請(qǐng)求完成多輪的部分或完整的代碼審查。
在代碼審查的過(guò)程中開(kāi)展教育和啟發(fā)
在代碼審查的過(guò)程中,應(yīng)盡可能通過(guò)共享知識(shí)和經(jīng)驗(yàn)提供指導(dǎo)。
審查代碼應(yīng)遵循標(biāo)準(zhǔn)
請(qǐng)始終牢記,樣式指南、編程標(biāo)準(zhǔn)以及相關(guān)的文檔應(yīng)該作為代碼審查的絕對(duì)權(quán)威。例如,制表符與空格的使用應(yīng)保持一致,此時(shí)你可以引用編程約定。
解決代碼審查沖突
解決代碼審查沖突時(shí),應(yīng)遵循樣式指南以及編程標(biāo)準(zhǔn)中商定的最佳實(shí)踐,并征求其他擁有更多產(chǎn)品領(lǐng)域知識(shí)和經(jīng)驗(yàn)的人的建議。
如果你的意見(jiàn)是可選或不怎么重要的,請(qǐng)?jiān)谧⑨屩姓f(shuō)明,然后由作者來(lái)決定是解決還是略過(guò)。作為代碼審查者,在沒(méi)有樣式指南或編程標(biāo)準(zhǔn)的情況下,你至少可以建議此次代碼變更與其余代碼庫(kù)保持一致。
演示UI變更是代碼審查的一部分。
如果代碼變更涉及用戶界面變化,則除了代碼審查外,還需要提供演示,確保界面符合預(yù)期且與界面設(shè)計(jì)一致。對(duì)于前端代碼變更,你需要進(jìn)行演示,或確保代碼變更包括必要的UI自動(dòng)化測(cè)試,以驗(yàn)證添加或更新的功能。確保代碼審查中包含了所有測(cè)試除非遇到緊急情況,否則拉取請(qǐng)求應(yīng)包含所有必要的測(cè)試,例如單元測(cè)試、集成測(cè)試以及端到端測(cè)試等。這里所說(shuō)的緊急情況指的是,某個(gè)需要盡快修復(fù)的bug或安全漏洞,而測(cè)試可以等到以后再添加。在這種情況下,請(qǐng)確保創(chuàng)建了適當(dāng)?shù)钠弊C/問(wèn)題,并確保有人負(fù)責(zé)在完成熱修復(fù)或部署后立即完成測(cè)試。
我們絕對(duì)不可以跳過(guò)測(cè)試。如果時(shí)間有限,某些目標(biāo)有無(wú)法實(shí)現(xiàn)的風(fēng)險(xiǎn),那么解決方案不是跳過(guò)測(cè)試,而是限定可交付成果的范圍。
不要為了代碼審查打斷手頭的工作
如果你正在專心致志地工作,那么請(qǐng)不要打斷自己,因?yàn)槟阈枰ㄙM(fèi)很長(zhǎng)時(shí)間才能重新投入工作。換句話說(shuō),打斷專心工作的開(kāi)發(fā)人員所付出的代價(jià)遠(yuǎn)遠(yuǎn)超過(guò)了讓開(kāi)發(fā)人員等待代碼審查。你可以在休息(午餐或咖啡等)過(guò)后,進(jìn)行代碼審查。
大多數(shù)時(shí)候,整個(gè)代碼審查以及代碼的合并無(wú)法在一天內(nèi)完成。重要的是迅速給作者一些反饋。例如,雖然可能無(wú)法完成完整的審查,但你可以快速指出一些有待探討的地方。這可以極大地降低代碼審查期間的挫敗感。
審查所有代碼,不要做任何假設(shè)
你需要審查提交上來(lái)的每一行代碼。不要對(duì)人工編寫的類和方法做任何假設(shè),而且應(yīng)該確保你理解代碼在做什么。
確保你理解正在審核的代碼。如果不理解,則請(qǐng)作者澄清或提供代碼演示和解釋。如果你不具備審核部分代碼的資格,則請(qǐng)其他有資格的開(kāi)發(fā)人員代為審查。
審查代碼時(shí)需要保持大局觀
從更廣闊的視野來(lái)看待代碼變更會(huì)更有幫助。例如,某個(gè)文件被修改,并添加了4行新代碼。請(qǐng)不要只看這4行代碼,你應(yīng)該考慮審查整個(gè)文件,并檢查新添加的內(nèi)容。它們是否會(huì)降低現(xiàn)有代碼的質(zhì)量?它們是否會(huì)導(dǎo)致現(xiàn)有功能成為重構(gòu)的候選對(duì)象?如果不在函數(shù)/方法或類的背景下審查添加的代碼,則隨著時(shí)間的流逝,你將會(huì)得到一個(gè)面臨無(wú)法維護(hù)、糾纏不清、不易于測(cè)試等問(wèn)題的類,而且這個(gè)類很難擴(kuò)展或重構(gòu)。請(qǐng)記住,即便是微不足道的改進(jìn),隨著時(shí)間的推移,也可能導(dǎo)致產(chǎn)品出現(xiàn)缺陷,同樣,即便是輕微的代碼降級(jí)或技術(shù)負(fù)債也可能在日積月累下導(dǎo)致產(chǎn)品難以維護(hù)和擴(kuò)展。
在代碼審查期間認(rèn)同和鼓勵(lì)出色的工作
如果看到出色的代碼變更,請(qǐng)別忘了大力表?yè)P(yáng)和鼓勵(lì)作者。代碼審查的目的不僅僅是發(fā)現(xiàn)錯(cuò)誤,而且還應(yīng)該鼓勵(lì)和指導(dǎo)開(kāi)發(fā)人員出色的工作。
在代碼審查期間應(yīng)保持謹(jǐn)慎、尊重、友善和思路清晰
在代碼審查期間,你應(yīng)該保持友善、思路清晰、有禮貌和尊重別人,這一點(diǎn)至關(guān)重要,同時(shí)也要給予作者清晰的反饋和積極的幫助。在審查代碼時(shí),你需要做到對(duì)事不對(duì)人,即對(duì)代碼做出評(píng)論,而非開(kāi)發(fā)人員。
詳細(xì)解釋代碼審查的意見(jiàn),并注意尺度
每當(dāng)代碼審查意見(jiàn)提出替代方案或指出某些問(wèn)題時(shí),重要的是你需要解釋其中的原因,并根據(jù)個(gè)人的知識(shí)和經(jīng)驗(yàn)提供示例,以幫助開(kāi)發(fā)人員理解為何你的建議能夠提升代碼質(zhì)量。在建議修改或變更代碼時(shí),你需要在如何指導(dǎo)作者修改代碼方面找到適當(dāng)?shù)钠胶狻@?,我更喜歡指導(dǎo)、解釋、提示或建議,而不是整個(gè)解決方案。
