最近在考慮在公司建立代碼評(píng)審的機(jī)制,發(fā)現(xiàn)不像想象的那么簡(jiǎn)單:
代碼評(píng)審的好處是毋庸置疑的,但也要付出成本,
而且評(píng)審別人的代碼是一個(gè)比較敏感的事,所以具體操作的時(shí)候也有許多要注意的問(wèn)題。
下面是我整理的文檔準(zhǔn)備開(kāi)會(huì)討論:
什么是代碼評(píng)審:
代碼評(píng)審也稱代碼復(fù)查,是指通過(guò)閱讀代碼來(lái)檢查源代碼與編碼標(biāo)準(zhǔn)的符合性以及代碼質(zhì)量的活動(dòng)。
通過(guò)工具來(lái)進(jìn)行code review不在本次討論范圍內(nèi)。
評(píng)審的內(nèi)容:
編碼規(guī)范問(wèn)題:命名不規(guī)范、magic number、 System.out……
代碼結(jié)構(gòu)問(wèn)題:重復(fù)代碼、巨大的方法和類、分層不當(dāng)、緊耦合
工具、框架使用不當(dāng):Spring、Hibernate、AJAX
實(shí)現(xiàn)問(wèn)題:錯(cuò)誤驗(yàn)證、異常處理、事務(wù)劃分、線程、性能、安全、實(shí)現(xiàn)過(guò)于復(fù)雜、代碼可讀性不佳、擴(kuò)展性不好
測(cè)試問(wèn)題:測(cè)試覆蓋度不夠、可測(cè)試性不好
代碼評(píng)審不負(fù)責(zé)檢查功能、邏輯是否正確,這些要靠單元測(cè)試和QA工作來(lái)解決
代碼評(píng)審的好處:
提高代碼質(zhì)量
在項(xiàng)目的早期發(fā)現(xiàn)缺陷,將損失降至最低
評(píng)審的過(guò)程也是重新梳理思路的過(guò)程,雙方都加深了對(duì)系統(tǒng)的理解
促進(jìn)團(tuán)隊(duì)溝通、促進(jìn)知識(shí)共享、共同提高
交叉評(píng)審——代碼走查:團(tuán)隊(duì)成員互相檢查代碼
參與者可以是任意兩個(gè)組員,或開(kāi)發(fā)組長(zhǎng)分別與每個(gè)組員結(jié)對(duì)進(jìn)行
時(shí)機(jī)可以選擇在下班前半小時(shí),對(duì)當(dāng)天改動(dòng)的模塊進(jìn)行評(píng)審
代碼作者講解如何以及為何這樣實(shí)現(xiàn)、評(píng)審者提出問(wèn)題和建議
每次解決的問(wèn)題要記錄到SVN注釋或JIRA
每次評(píng)審不要貪多,如下圖所示:當(dāng)一次評(píng)審超過(guò)400行代碼時(shí),能發(fā)現(xiàn)缺陷數(shù)顯著降低——事倍功半
會(huì)審:以項(xiàng)目為單位,召開(kāi)專門(mén)的代碼評(píng)審會(huì)議
參與者:包括項(xiàng)目組全體成員,其它組的開(kāi)發(fā)組長(zhǎng)也應(yīng)盡量參加
時(shí)機(jī)選擇:開(kāi)發(fā)進(jìn)行到某一階段時(shí),對(duì)共性問(wèn)題進(jìn)行總結(jié),對(duì)好的做法進(jìn)行提煉和推廣
會(huì)前準(zhǔn)備工作:
組織者應(yīng)通知各參與者本次評(píng)審的范圍
參與者閱讀源代碼,列出發(fā)現(xiàn)的問(wèn)題、亮點(diǎn),匯總給組織者
準(zhǔn)備工作要細(xì)致,需要給出問(wèn)題詳細(xì)描述以及相關(guān)代碼在SVN上的URL地址等
評(píng)審代碼的選擇:
最近一次迭代開(kāi)發(fā)的代碼
系統(tǒng)關(guān)鍵模塊
業(yè)務(wù)較復(fù)雜的模塊
缺陷率較高的模塊
會(huì)議議程:
如果是第一次會(huì)議,先由該項(xiàng)目開(kāi)發(fā)組長(zhǎng)做整體介紹
參加者依次發(fā)言,結(jié)合代碼講解發(fā)現(xiàn)的問(wèn)題
每講完一個(gè)問(wèn)題,針對(duì)其展開(kāi)討論,每個(gè)問(wèn)題控制在10分鐘以內(nèi)
如果問(wèn)題不多,還可以安排該組成員對(duì)最近開(kāi)發(fā)的代碼進(jìn)行地毯式的講解和排查;或者針對(duì)某個(gè)方面對(duì)整個(gè)項(xiàng)目做評(píng)審,例如性能、安全性或測(cè)試
會(huì)后總結(jié):
把會(huì)上提出的所有問(wèn)題、亮點(diǎn)及最終結(jié)論詳細(xì)的記錄下來(lái),供其他團(tuán)隊(duì)借鑒
未能討論清楚的問(wèn)題,會(huì)后解決
實(shí)行代碼評(píng)審制度前的準(zhǔn)備工作:
架構(gòu)師提供開(kāi)發(fā)規(guī)范、指南,為代碼評(píng)審提供依據(jù)
建立起單元測(cè)試規(guī)范,否則無(wú)法達(dá)到測(cè)試覆蓋度的要求、難以修正發(fā)現(xiàn)的問(wèn)題
最好有樣例代碼庫(kù)作參照,以提高代碼評(píng)審的可操作性
提供評(píng)審案例:用評(píng)審前的代碼與評(píng)審后優(yōu)化的代碼做對(duì)比
問(wèn)題跟蹤:對(duì)評(píng)審中發(fā)現(xiàn)的問(wèn)題代碼應(yīng)加以跟蹤,確保問(wèn)題得以解決,防止復(fù)發(fā)
評(píng)審到什么程度:
進(jìn)行全面的代碼評(píng)審成本較高,也沒(méi)有必要
對(duì)發(fā)現(xiàn)的問(wèn)題要本著集體代碼所有制的觀點(diǎn)和就事論事的原則,因此建議把代碼質(zhì)量與團(tuán)隊(duì)績(jī)效(而不是個(gè)人績(jī)效)掛鉤。