如何高效的Code Review
原文地址:https://www.jianshu.com/p/55020a2a5266
公司內(nèi)部有Code Review,感覺不得要領(lǐng),在網(wǎng)上找了一份CheckList用來作為Review的標(biāo)準(zhǔn)。原文鏈接
0.Code Review的好處
0.1 知識(shí)傳播
相信很多人第一次提交Code Review都有類似的經(jīng)歷:短短幾百行代碼,卻被提了密密麻麻幾十條 comments,更新了十多次代碼,才最終被accept。其實(shí)當(dāng)代碼被accept,提交代碼的工程師通過這次review就學(xué)習(xí)到了代碼規(guī)范和很多好的實(shí)踐。同時(shí),通過review更資深工程師的代碼,年輕的工程師也更直觀地學(xué)習(xí)架構(gòu)和編碼;另外,工程師之間也可以通過review代碼來共享項(xiàng)目知識(shí),看代碼實(shí)現(xiàn)在絕大多數(shù)時(shí)候是了解項(xiàng)目的最好方式。
0.2 增進(jìn)代碼質(zhì)量
這點(diǎn)也很容易理解,有經(jīng)驗(yàn)的工程師可以在架構(gòu)設(shè)計(jì)、代碼細(xì)節(jié)等各個(gè)方面幫助到初學(xué)者。不同工程師也會(huì)有知識(shí)盲點(diǎn),互相review進(jìn)步也很快。另外,被review的代碼質(zhì)量更高還有一個(gè)很多人注意不到的心理因素:在狀態(tài)不佳的時(shí)候,工程師難免會(huì)匆忙寫些“潦草”的代碼,但是當(dāng)你知道自己的代碼會(huì)被review的工程師提交comment打回來,自然會(huì)更仔細(xì)些 : -)
0.3 找出潛在的 bug
這是大部分團(tuán)隊(duì)進(jìn)行Code Review的目的。就像上面提到的,Code Review在這方面效果不錯(cuò)。其實(shí)我認(rèn)為大部分代碼bug應(yīng)該由單元測(cè)試,功能測(cè)試,性能測(cè)試和回歸測(cè)試來保障。不過由于靜態(tài)分析不理解業(yè)務(wù),另外有些bug在測(cè)試中并不容易復(fù)現(xiàn),這兩種情況下,經(jīng)驗(yàn)豐富的工程師來review代碼就尤其重要了
1.Code Review的前提
進(jìn)入Code Review需要檢查的條件如下:
1.1 Code Review人員是否理解了Code Review的概念和Code Review將做什么。
如果做Code Review的人員不能理解Code Review對(duì)項(xiàng)目成敗和代碼質(zhì)量的重要程度,他們的做法可能就會(huì)是應(yīng)付了事。
1.2 代碼是否已經(jīng)正確的build,build的目的使得代碼已經(jīng)不存在基本語法錯(cuò)誤
我們總不希望高級(jí)開發(fā)人員或是主管將時(shí)間浪費(fèi)在檢查連編譯都通不過的代碼上吧。
1.3 代碼執(zhí)行時(shí)功能是否正確
Code Review人員也不負(fù)責(zé)檢查代碼的功能是否正確,也就是說,需要復(fù)查的代碼必須由開發(fā)人員或質(zhì)量人員負(fù)責(zé)該代碼的功能的正確性。
1.4 Review人員是否理解了代碼
做復(fù)查的人員需要對(duì)該代碼有一個(gè)基本的了解,其功能是什么,是哪一方面的代碼,涉及到數(shù)據(jù)庫或是通訊,這樣才能采取針對(duì)性的檢查
1.5 開發(fā)人員是否對(duì)代碼做了單元測(cè)試
這一點(diǎn)也是為了保證Code Review前一些語法和功能問題已經(jīng)得到解決,Code Review人員可以將精力集中在代碼的質(zhì)量上。
2.Code Review 需要做什么
Code Review主要檢查代碼中是否存在以下方面問題:
代碼的一致性、編碼風(fēng)格、代碼的安全問題、代碼冗余、是否正確設(shè)計(jì)以滿足需求(性能、功能)等等
2.1 完整性檢查(Completeness)
代碼是否完全實(shí)現(xiàn)了設(shè)計(jì)文檔中提出的功能需求
代碼是否已按照設(shè)計(jì)文檔進(jìn)行了集成和Debug
代碼是否已創(chuàng)建了需要的數(shù)據(jù)庫,包括正確的初始化數(shù)據(jù)
代碼中是否存在任何沒有定義或沒有引用到的變量、常數(shù)或數(shù)據(jù)類型
2.2 一致性檢查(Consistency)
代碼的邏輯是否符合設(shè)計(jì)文檔
代碼中使用的格式、符號(hào)、結(jié)構(gòu)等風(fēng)格是否保持一致
2.3 正確性檢查(Correctness)
代碼是否符合制定的標(biāo)準(zhǔn)
所有的變量都被正確定義和使用
所有的注釋都是準(zhǔn)確的
所有的程序調(diào)用都使用了正確的參數(shù)個(gè)數(shù)
2.4 可修改性檢查(Modifiability)
代碼涉及到的常量是否易于修改(如使用配置、定義為類常量、使用專門的常量類等)
代碼中是否包含了交叉說明或數(shù)據(jù)字典,以描述程序是如何對(duì)變量和常量進(jìn)行訪問的
代碼是否只有一個(gè)出口和一個(gè)入口(嚴(yán)重的異常處理除外)
2.5 可預(yù)測(cè)性檢查(Predictability)
代碼所用的開發(fā)語言是否具有定義良好的語法和語義
是否代碼避免了依賴于開發(fā)語言缺省提供的功能
代碼是否無意中陷入了死循環(huán)
代碼是否是否避免了無窮遞歸
2.6 健壯性檢查(Robustness)
代碼是否采取措施避免運(yùn)行時(shí)錯(cuò)誤(如數(shù)組邊界溢出、被零除、值越界、堆棧溢出等)
Error handling是否都處理完畢(例如空指針檢查、應(yīng)該catch哪些異常)
2.7 結(jié)構(gòu)性檢查(Structuredness)
程序的每個(gè)功能是否都作為一個(gè)可辯識(shí)的代碼塊存在
循環(huán)是否只有一個(gè)入口
2.8 可追溯性檢查(Traceability)
代碼是否對(duì)每個(gè)程序進(jìn)行了唯一標(biāo)識(shí)
是否有一個(gè)交叉引用的框架可以用來在代碼和開發(fā)文檔之間相互對(duì)應(yīng)
代碼是否包括一個(gè)修訂歷史記錄,記錄中對(duì)代碼的修改和原因都有記錄
是否所有的安全功能都有標(biāo)識(shí)
2.9 可理解性檢查(Understandability)
注釋是否足夠清晰的描述每個(gè)子程序
是否使用到不明確或不必要的復(fù)雜代碼,它們是否被清楚的注釋
使用一些統(tǒng)一的格式化技巧(如縮進(jìn)、空白等)用來增強(qiáng)代碼的清晰度
是否在定義命名規(guī)則時(shí)采用了便于記憶,反映類型等方法
每個(gè)變量都定義了合法的取值范圍
代碼中的算法是否符合開發(fā)文檔中描述的數(shù)學(xué)模型
2.10可驗(yàn)證性檢查(Verifiability)
代碼中的實(shí)現(xiàn)技術(shù)是否便于測(cè)試
2.11 效率
代碼效率包括讀代碼的效率與執(zhí)行代碼的效率,如何盡量減小算法復(fù)雜度、減少臨時(shí)對(duì)象等等。
番外1
##code review常規(guī)項(xiàng)目代碼是否符合公共的編程規(guī)范?包括變量名,函數(shù)名,縮進(jìn),格式和注釋。是否有被注釋掉的代碼或者調(diào)試代碼?代碼書寫是否簡(jiǎn)單明了?是否存在多余的或是重復(fù)的代碼?代碼是否盡可能的模塊化?循環(huán)是否設(shè)置了長度和正確的終止條件?是否有可以被庫函數(shù)替代的代碼?是否進(jìn)行異常處理?是否有更好的處理方法?有沒有遺漏任何corner case?文件組織,函數(shù)是不是應(yīng)該放到其他lib或庫中?是否應(yīng)該使用繼承保持風(fēng)格統(tǒng)一?##線程是否安全?是否可以使用更好的設(shè)計(jì)模式?擴(kuò)展性是否良好?番外2
鏈接
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/articles/11019396.html
總結(jié)
以上是生活随笔為你收集整理的如何高效的Code Review的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从flink-example分析flin
- 下一篇: 图解WebGLThree.js工作原理【