發(fā)布于:2020-12-31 09:36:09
0
67
0
十多年來,我一直在進(jìn)行日常代碼審查。代碼審查的好處是很多的:有人抽查您的工作是否有錯(cuò)誤,他們可以從您的解決方案中學(xué)習(xí),而協(xié)作有助于改善組織的整體工具和自動(dòng)化方法。如果您當(dāng)前不在組織中進(jìn)行代碼審查,請(qǐng)立即開始。這將使每個(gè)人都成為更好的工程師。
許多人和組織已經(jīng)分享了他們的代碼審查最佳實(shí)踐,以及好的代碼審查的定義對(duì)他們意味著什么。指南 由谷歌, 該SmartBear團(tuán)隊(duì),和工程師菲利普·豪爾都是很棒的讀物。下面是我個(gè)人對(duì)好的代碼審查的外觀以及如何使它們?cè)趫F(tuán)隊(duì)和組織層面上變得更好的個(gè)人看法。這是在我一直在工作的技術(shù)環(huán)境的背景下進(jìn)行的-目前在Uber,在此之前在Skype / Microsoft和Skyscanner。
良好的代碼審查是我們所有人應(yīng)努力追求的標(biāo)準(zhǔn)。它們涵蓋了任何團(tuán)隊(duì)都可以開始使用的常見且易于遵循的最佳實(shí)踐,同時(shí)確保了長期的高質(zhì)量和有用的審核。
更好的代碼審查工程師不斷改進(jìn)代碼審查的方式。這些代碼回顧著眼于代碼庫上下文中的代碼更改,誰在請(qǐng)求它以及在什么情況下。這些審查會(huì)根據(jù)情況和情況調(diào)整其方法。目標(biāo)不僅是高質(zhì)量的審查,而且還幫助要求審查的開發(fā)人員和團(tuán)隊(duì)提高生產(chǎn)力。
守則審查涵蓋的領(lǐng)域
好的代碼審查人員應(yīng)著眼于更改本身及其如何適應(yīng)代碼庫。他們將通過標(biāo)題和描述的清晰性以及更改的“原因”來進(jìn)行了解。它們涵蓋了代碼的正確性,測試范圍,功能更改,并確認(rèn)它們遵循了編碼指南和最佳實(shí)踐。他們將指出明顯的改進(jìn),例如難以理解的代碼,不清楚的名稱,注釋掉的代碼,未經(jīng)測試的代碼或未處理的邊緣情況。他們還將指出何時(shí)將太多更改擠入了一次審閱,并建議保持代碼更改為單一用途或?qū)⒏姆譃楦械牟糠帧?/span>
更好的代碼審查查看大型系統(tǒng)中的更改,并檢查更改是否易于維護(hù)。他們可能會(huì)問有關(guān)更改必要性或它如何影響系統(tǒng)其他部分的問題。他們研究引入的抽象以及它們?nèi)绾芜m合現(xiàn)有的軟件體系結(jié)構(gòu)。他們注意到可維護(hù)性的觀察,例如可以簡化的復(fù)雜邏輯,改進(jìn)測試結(jié)構(gòu),消除重復(fù)以及其他可能的改進(jìn)。工程師Joel Kemp將出色的代碼審查描述為在初次輕度通過之后進(jìn)行的上下文傳遞。
評(píng)論的語氣
代碼審查的語氣可以極大地影響團(tuán)隊(duì)內(nèi)部的士氣。苛刻的評(píng)論會(huì)因其微攻擊性而給人以敵對(duì)環(huán)境的感覺。固執(zhí)己見的語言可以使人們產(chǎn)生防御性,引發(fā)激烈的討論。同時(shí),專業(yè)而積極的基調(diào)可以為更具包容性的環(huán)境做出貢獻(xiàn)。在這些環(huán)境中,人們?cè)敢饨邮芙ㄔO(shè)性的反饋意見,而代碼審查則可以引發(fā)健康,活潑的討論。
好的代碼評(píng)論提出開放性問題,而不要發(fā)表有力或過分的陳述。他們提供了替代方案和可能的解決方法,它們可能會(huì)針對(duì)情況更好地工作,而無需堅(jiān)持認(rèn)為這些解決方案是最佳或唯一的解決方法。這些評(píng)論假定審稿人可能遺漏了一些東西,要求澄清而不是更正。
更好的代碼審查也很有同感。他們知道編寫代碼的人在此更改上花費(fèi)了很多時(shí)間和精力。這些代碼審查是友善和張揚(yáng)的。他們贊揚(yáng)好的解決方案,并且是全面積極的。
批準(zhǔn)與請(qǐng)求更改
審閱者完成審閱后,可以將其標(biāo)記為已批準(zhǔn),可以通過更改請(qǐng)求阻止審閱,也可以不設(shè)置特定狀態(tài),而將其置于“尚未批準(zhǔn)”狀態(tài)。審閱者如何使用批準(zhǔn)并請(qǐng)求更改狀態(tài)說明了代碼審閱。有開放式問題時(shí),
良好的代碼審閱不會(huì)批準(zhǔn)更改。但是,它們可以清楚地指出哪些問題或評(píng)論沒有阻礙性或不重要,從而將它們區(qū)別對(duì)待。批準(zhǔn)更改時(shí),它們是明確的,例如,添加諸如“看起來不錯(cuò)!”之類的贊許評(píng)論。有些地方使用首字母縮寫詞,例如LGTM-這些也可以,但是要注意,新來者可能會(huì)誤解這些內(nèi)部縮寫詞,以作其他用途。良好的代碼審查要求通過代碼審查工具或團(tuán)隊(duì)?wèi)T例對(duì)此進(jìn)行跟進(jìn)時(shí),他們要求采取后續(xù)措施。
更好的代碼審查原則上是堅(jiān)定的,但實(shí)踐上是靈活的:有時(shí),某些注釋由作者提出,并單獨(dú)進(jìn)行了后續(xù)代碼更改。對(duì)于比其他人更緊迫的更改,審閱者嘗試使自己可以更快地進(jìn)行審閱。
從代碼審查到彼此交談
代碼審查通常是異步進(jìn)行的,并通過代碼審查工具以書面形式進(jìn)行。這通常出于方便目的,以實(shí)現(xiàn)遠(yuǎn)程代碼審查,并允許多個(gè)人審查同一代碼更改。但是何時(shí)該停止使用該工具(可能有多棒)并開始面對(duì)面討論代碼了?
良好的代碼審閱會(huì)根據(jù)需要留下盡可能多的注釋和問題。如果修訂版本未解決所有問題,他們也會(huì)予以注意。當(dāng)對(duì)話來回漫長時(shí),審閱者將嘗試切換為與作者面對(duì)面交談,而不是使用代碼審閱工具浪費(fèi)更多時(shí)間。
更好的代碼審查在他們第一次對(duì)代碼進(jìn)行傳遞并提出很多評(píng)論和問題后,將主動(dòng)與進(jìn)行更改的人員聯(lián)系。這些人已經(jīng)知道,他們通過這種方式節(jié)省了很多時(shí)間,誤解和痛苦。在代碼上有很多注釋的事實(shí)表明,雙方可能都存在一些誤解。通過交談,這些誤解更容易識(shí)別和解決。
刺針
Nitpicks是無關(guān)緊要的注釋,其中的代碼可以合并甚至不解決這些問題。這些可能是諸如變量聲明按字母順序排列,遵循某種結(jié)構(gòu)的單元測試或方括號(hào)在同一行。
良好的代碼審查可以清楚地知道何時(shí)更改不重要。他們通常會(huì)在這些注釋上添加明顯的標(biāo)記,并在它們的前面加上“ nit:”前綴。這些中的太多內(nèi)容可能會(huì)令人沮喪,并使注意力從評(píng)論的更重要部分轉(zhuǎn)移開來,因此審閱者的目標(biāo)是不要太過重視這些評(píng)論。
更好的代碼審查意識(shí)到太多的挑剔是缺乏工具或缺乏標(biāo)準(zhǔn)的標(biāo)志。經(jīng)常遇到這些問題的審閱者將在代碼審閱過程之外尋求解決此問題的方法。例如,許多常見的nitpick注釋都可以通過自動(dòng)掉毛解決。那些通常無法解決的問題可以由團(tuán)隊(duì)同意某些標(biāo)準(zhǔn)并遵循它們來解決,甚至可能最終使它們自動(dòng)化。
新加入者的代碼審查
對(duì)于大多數(shù)人來說,從一家新公司入手是不知所措的。代碼庫是新的,編程風(fēng)格與以前不同,人們對(duì)您的代碼的查看也大不相同。因此,對(duì)于新手來說,代碼審查應(yīng)該更溫和一些,以使它們適應(yīng)新的環(huán)境,還是應(yīng)該像其他所有人一樣,對(duì)代碼進(jìn)行嚴(yán)格的審查?
良好的代碼審閱對(duì)每個(gè)人都使用相同的質(zhì)量標(biāo)準(zhǔn)和方法,無論他們的職稱,級(jí)別或加入公司的時(shí)間如何。遵循以上內(nèi)容,代碼審閱會(huì)以一種友好的語氣,在需要時(shí)請(qǐng)求更改,并在審閱者有很多評(píng)論時(shí)與他們進(jìn)行交談。
更好的代碼審查還要特別注意使新加入者的前幾條評(píng)論變得很棒。審閱者對(duì)新加入者可能不了解所有編碼準(zhǔn)則并且可能不熟悉部分代碼這一事實(shí)感到同情。這些審查付出了更多的努力來解釋替代方法并指出指南。它們的語氣也非常積極,慶祝作者建議的對(duì)代碼庫的前幾處更改。
跨辦公室,跨時(shí)區(qū)評(píng)論
當(dāng)審閱者不在同一位置時(shí),代碼審閱會(huì)變得更加困難。當(dāng)審閱者坐在非常不同的時(shí)區(qū)時(shí),它們尤其具有挑戰(zhàn)性。多年來,我在這些評(píng)論中占有相當(dāng)?shù)姆蓊~,修改了美國和亞洲團(tuán)隊(duì)(同時(shí)位于歐洲)擁有的代碼。
良好的代碼審查會(huì)考慮時(shí)區(qū)差異。審核員旨在在辦公室之間重疊的工作時(shí)間中審核代碼。對(duì)于評(píng)論很多的評(píng)論,評(píng)論者將提供直接聊天或進(jìn)行視頻通話以討論更改的信息。
更好的代碼審查請(qǐng)注意,當(dāng)代碼審查反復(fù)遇到時(shí)區(qū)問題并在代碼審查框架之外尋找系統(tǒng)解決方案時(shí)。假設(shè)來自歐洲的團(tuán)隊(duì)經(jīng)常更改一項(xiàng)服務(wù),該服務(wù)會(huì)觸發(fā)來自該服務(wù)的美國所有者的代碼審核。系統(tǒng)級(jí)的問題是為什么這些更改如此頻繁地發(fā)生。更改是在正確的代碼庫中完成的,還是應(yīng)該更改另一個(gè)系統(tǒng)?更改的頻率是相同的還是隨著時(shí)間推移而降低?假設(shè)更改是在正確的代碼庫中完成的,并且頻率不會(huì)降低,跨辦公室的依賴關(guān)系能否以某種方式被打破?解決這類問題的方法通常并不簡單,可能涉及重構(gòu),創(chuàng)建新服務(wù)/接口或改進(jìn)工具。
組織支持
公司及其工程組織處理代碼審查的方式是提高效率的重要因素。認(rèn)為它們不重要和瑣碎的組織最終很少投入資金來簡化審核。在這種文化中,完全放棄代碼審查可能很誘人。提倡進(jìn)行更好的代碼審查的工程師可能會(huì)感到孤立,沒有上級(jí)的支持,最終放棄了。結(jié)果是組織不斷出現(xiàn)問題并不斷加劇。
具有良好代碼審查的組織確保所有工程師都參與代碼審查過程,甚至可能參與單獨(dú)項(xiàng)目的那些人。他們鼓勵(lì)提高質(zhì)量標(biāo)準(zhǔn),并且團(tuán)隊(duì)促進(jìn)團(tuán)隊(duì)和組織級(jí)就代碼審查方法進(jìn)行健康的討論。這些公司通常具有工程師發(fā)起和編寫的針對(duì)較大代碼庫的代碼審查指南。這樣的組織認(rèn)識(shí)到代碼審查占用了工程師大量的時(shí)間。這些公司中的許多公司都將代碼審查作為對(duì)開發(fā)人員工作能力的期望,期望高級(jí)工程師將大部分時(shí)間用于審查其他人的代碼。
具有更好代碼審查的組織在沒有代碼審查的情況下,沒有代碼的情況下就很難制定嚴(yán)格的規(guī)則-就像業(yè)務(wù)邏輯更改在沒有自動(dòng)化測試的情況下就不能使其投入生產(chǎn)一樣。這些組織已經(jīng)知道,偷工減料的代價(jià)是不值得的。相反,他們有緊急情況下的快速審查程序。這些組織投資于開發(fā)人員的生產(chǎn)力,包括不斷努力開發(fā)更有效的代碼審查和工具改進(jìn)。樂于助人的工程主管無需說服代碼審查和其他工程最佳實(shí)踐的好處。相反,他們支持團(tuán)隊(duì)提出的有關(guān)更好工具或更有效代碼審查流程的計(jì)劃。
當(dāng)人們遇到令人懷有敵意的評(píng)論時(shí),他們會(huì)說自己可以發(fā)表意見并獲得全面支持以解決問題。高級(jí)工程師和經(jīng)理認(rèn)為,代碼審查不像草率的代碼或不良的行為那樣嚴(yán)重。工程師和工程經(jīng)理都感到有權(quán)改善代碼審查的方式。
從良好開始,變得更好
好的代碼評(píng)審已經(jīng)投入了很多心血。他們對(duì)更改本身進(jìn)行了徹底的審查,避免被評(píng)論的語氣所束縛,并明確表示。無論誰要求進(jìn)行審查,他們都保持一致的標(biāo)準(zhǔn),并通過更加注意跨時(shí)區(qū)審查來減輕痛苦。具有良好評(píng)價(jià)的組織確保每個(gè)開發(fā)人員都定期收到并進(jìn)行代碼評(píng)價(jià)。這已經(jīng)是一個(gè)很高的標(biāo)準(zhǔn),但是如果您到達(dá)這里,請(qǐng)不要停止。代碼審查是提高技能,指導(dǎo)他人并學(xué)習(xí)如何成為更有效的溝通者的最佳方法之一。
獲得更好的代碼評(píng)論通過不斷改進(jìn)細(xì)節(jié),同時(shí)也開始著眼于高層次的變化。對(duì)注釋的語氣保持同情心,并思考代碼審查過程之外的方法以消除頻繁出現(xiàn)的挑剔。使代碼審查特別歡迎新手使用,并為痛苦的跨時(shí)區(qū)審查尋找系統(tǒng)的解決方案。具有前瞻性的組織鼓勵(lì)在工具和流程改進(jìn)方面進(jìn)行投資,以使代碼審查更好,從而獲得更多收益。
作者介紹