Code Review最佳實踐
我一直認為Code Review(程式碼審查)是軟體開發中的最佳實踐之一,可以有效提高整體程式碼質量,及時發現程式碼中可能存在的問題。包括像Google、微軟這些公司,Code Review都是基本要求,程式碼合併之前必須要有人審查透過才行。
然而對於我觀察到的大部分軟體開發團隊來說,認真做Code Review的很少,有的流於形式,有的可能根本就沒有Code Review的環節,程式碼質量只依賴於事後的測試。也有些團隊想做好程式碼審查,但不知道怎麼做比較好。
網上關於如何做Code Review的文章已經有很多了,這裡我結合自己的一些經驗,也總結整理了一下Code Review的最佳實踐,希望能對大家做好Code Review有所幫助。
Code Review有什麼好處?
很多團隊或個人不做Code Review,根源還是不覺得這是一件有意義的事情,不覺得有什麼好處。這個問題要從幾個角度來看。
•首先是團隊知識共享的角度
一個開發團隊中,水平有高有低,每個人側重的領域也有不同。怎麼讓高水平的幫助新人成長?怎麼讓大家都對自己側重領域之外的知識保持瞭解?怎麼能有人離職後其他人能快速接手?這些都是團隊管理者關心的問題。
而程式碼審查,就是一個很好的知識共享的方式。透過程式碼審查,高手可以直接指出新手程式碼中的問題,新手可以馬上從高手的反饋中學習到好的實踐,得到更快的成長;透過程式碼審查,前端也可以去學習後端的程式碼,做功能模組A的可以去了解功能模組B的。
可能有些高手覺得給新手程式碼審查浪費時間,自己也沒收穫。其實不然,新人成長了,就可以更多的幫高手分擔繁重的任務;程式碼審查中花時間,就少一些幫新人填坑擦屁股的時間;良好的溝通能力、發現問題的能力、幫助其他人成長,都是技術轉管理或技術上更上一層樓必不可少的能力,而透過程式碼審查可以有效的去練習這些方面的能力。
•然後是程式碼質量的角度
現實中的專案總是人手缺進度緊,所以被壓縮的往往就是自動化測試和程式碼審查,結果影響程式碼質量,欠下技術債務,最後還是要加倍償還。
也有人寄希望於開發後的人工測試,然而對於程式碼質量來說,很多問題透過測試是測試不出來的,只能透過程式碼審查。比如說程式碼的可讀性可維護性,比如程式碼的結構,比如一些特定條件才觸發的死迴圈、邏輯演算法錯誤,還有一些安全上的漏洞也更容易透過程式碼審查發現和預防。
也有人覺得自己水平高就不需要程式碼審查了。對於高手來說,讓別人審查自己的程式碼,可以讓其他人學習到好的實踐;在讓其他人審查的同時,在給別人說明自己程式碼的時候,也等於自己對自己的程式碼進行了一次審查。這其實就跟我們上學時做數學題一樣,真正能拿高分的往往是那些做完後還會認真檢查的。
•還有團隊規範的角度
每個團隊都有自己的程式碼規範,有自己的基於架構設計的開發規範,然而時間一長,就會發現程式碼中出現很多不遵守程式碼規範的情況,有很多繞過架構設計的程式碼。比如難以理解和不規範的命名,比如三層架構裡面UI層繞過業務邏輯層直接呼叫資料訪問層程式碼。
如果這些違反規範的程式碼被糾正的晚了,後面再要修改就成本很高了,而且團隊的規範也會慢慢的形同虛設。
透過程式碼審查,就可以及時的去發現和糾正這些問題,保證團隊規範的執行。
關於程式碼審查的好處,還有很多,也不一一列舉。還是希望能認識到Code Review和寫自動化測試一樣,都是屬於磨刀不誤砍柴工的工作,在上面投入一點點時間,未來會收穫程式碼質量,會節約整體的開發時間。
該怎麼做?
現在很多人都已經有意識到Code Review的重要性了,只是苦於不知道如何去實踐,不知道怎麼樣算是好的Code Review實踐。
把Code Review作為開發流程的必選項而不是可選項
在很早以前,我就嘗試過將程式碼審查作為程式碼流程的一部分,但只是一個可選項,沒有Code Review也可以把程式碼合併到master。這樣的結果就是想起來才會去做Code Review,去檢查的時候已經有了太多的程式碼變更,審查起來非常困難,另外就算審查出問題,也很難得以修改。
我們現在對程式碼的審查則是作為開發流程的一個必選項,每次開發新功能或者修復Bug,開一個新的分支,分支要合併到master有兩個必要條件:
•所有的自動化測試透過•有至少一個人Code Review透過,如果是新手的PR,還必須有資深程式設計師Code Review透過
圖片來源:How to Do Code Reviews Like a Human
這樣把Code Review作為開發流程的一個必選項後,就很好的保證了程式碼在合併之前有過Code Review。而且這樣合併前要求程式碼審查的流程,好處也很明顯:
•由於每一次合併前都要做程式碼審查,這樣一般一次審查的程式碼量也不會太大,對於審查者來說壓力也不會太大•如果在Code Review時發現問題,被審查者希望程式碼能儘快合併,也會積極的對審查出來的問題進行修改,不至於對審查結果太過牴觸
如果你覺得Code Review難以推行,不妨先嚐試著把Code Review變成你開發流程的一個必選項。
把Code Review變成一種開發文化而不僅僅是一種制度
把Code Review 作為開發流程的必選項後,不代表Code Review這件事就可以執行的很好,因為Code Review 的執行,很大部分程度上依賴於審查者的認真審查,以及被審查者的積極配合,兩者缺一不可!
如果僅僅只是當作一個流程制度,那麼就可能會流於形式。最終結果就是看起來有Code Review,但沒有人認真審查,隨便看下就透過了,或者發現問題也不願意修改。
真要把Code Review這件事做好,必須讓Code Review變成團隊的一種文化,開發人員從心底接受這件事,並認真執行這件事。
要形成這樣的文化,不那麼容易,也沒有想象的那麼難,比如這些方面可以參考:
•首先,得讓開發人員認識到Code Review這件事為自己、為團隊帶來的好處•然後,得要有幾個人做好表率作用,榜樣的力量很重要•還有,對於管理者來說,你激勵什麼,往往就會得到什麼•最後,像寫自動化測試一樣,把Code Review要作為開發任務的一部分,給審查者和被審查者都留出專門的時間去做這件事,不能光想著馬兒跑得快又捨不得給馬兒吃草
如何形成這樣的文化,有心的話,還有很多方法可以嘗試。只有真正讓大家都認同和踐行,才可能去做好Code Review這件事。
一些Code Review的經驗技巧
在做好Code Review這件事上,還有一些經驗技巧可以參考。
選什麼工具輔助做CODE REVIEW?
現在很多原始碼管理工具都自帶Code Review工具,典型的像Github、Gitlab、微軟的Azure DevOps,尤其是像Gitlab,還可以自己在本地搭建環境,根據自己的需要靈活配置。
配合什麼樣的開發流程比較好?
像Github Flow[1]這樣基於分支開發的流程是特別適合搭配Code Review的。其實不管什麼樣的開發流程,關鍵點在於程式碼合併到master(主幹)之前,要先做Code Review。
真遇到緊急情況,來不及程式碼審查怎麼辦?
雖然原則上,必須要Code Review才能合併,但有時候確實會存在一些緊急情況,比如說線上故障補丁,而又沒有其他人線上,那麼這種情況下,最好是在任務管理系統中,建立一個Ticket,用來後續跟蹤,確保後續補上Code Review,並對Code Review結果有後續的程式碼更新。
先設計再編碼
有些新人發現自己的程式碼提交PR(Pull Request)後,會收到一堆的Code Review意見,必須要做大量的改動。這多半是因為在開始做之前,沒有做好設計,做出來後才發現問題很多。
建議在做一個新功能之前,寫一個簡單的設計文件,表達清楚自己的設計思路,找資深的先幫你做一下設計的審查,發現設計上的問題。設計上沒問題了,再著手開發,那麼到Review的時候,相對問題就會少很多。
程式碼在提交CODE REVIEW之前,作者要自己先REVIEW和測試一遍
我在做程式碼審查的時候,有時候會發現一些非常明顯的問題,有些甚至自己都沒有測試過,就等著別人Code Review和測試幫助發現問題。這種依賴心理無論是對自己還是對團隊都是很不負責任的。
一個好的開發人員,程式碼在提交Code Review之前,肯定是要自己先Review一遍,把該寫的自動化測試程式碼寫上,自己把基本的測試用例跑一遍的。
我對於團隊提交的PR,有個要求就是要在PR的描述中增加截圖或者錄屏,就是為了透過截圖或者錄屏,確保提交PR的人自己是先測試過的。這也是一個有效的輔助手段。
PR要小
在做Code Review的時候,如果有大量的檔案修改,那麼Review起來是很困難的,但如果PR比較小,相對就比較容易Review,也容易發現程式碼中可能存在的問題。
所以在提交PR時,PR要小,如果是比較大的改動,那麼最好分批提交,以減輕審查者的壓力。
對評論進行分級
在做Code Review時,需要針對審查出有問題的程式碼行新增評論,如果只是評論,有時候對於被審查者比較難甄別評論所代表的含義,是不是必須要修改。
建議可以對Review的評論進行分級,不同級別的結果可以打上不同的Tag,比如說:
[blocker]: 在評論前面加上一個blocker標記,表示這個程式碼行的問題必須要修改[optional]:在評論前面加上一個[optional]標記,表示這個程式碼行的問題可改可不改
[question]:在評論前面加上一個[question]標記,表示對這個程式碼行不理解,有問題需要問,被審查者需要針對問題進行回覆澄清
類似這樣的分級可以幫助被審查者直觀瞭解Review結果,提高Review效率。
評論要友好,避免負面詞彙;有說不清楚的問題當面溝通
雖然評論是主要的Code Review溝通方式,但也不要過於依賴,有時候面對面的溝通效率更高,也容易消除誤解。
另外文明用語,不要用一些負面的詞彙。
總結
Code Review是一種非常好的開發實踐,如果你還沒開始,不妨逐步實踐起來;如果已經做了效果不好,不妨對照一下,看有沒有把Code Review作為開發流程的必選項而不是可選項?有沒有把Code Review變成一種開發文化而不僅僅是一種制度?
作者:寶玉
原文:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69940568/viewspace-2654635/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Code Review 在丁香醫生前端團隊的實踐View前端
- code ReviewView
- WHY review code?View
- Show me the code,babel 7 最佳實踐!Babel
- 打包最佳化實踐(如何Code Spliting)
- 簡單實用的CODE REVIEW工具View
- 關於code reviewView
- Git Gerrit Code ReviewGitView
- BUU CODE REVIEW 1 1View
- 如何做好Code ReviewView
- BUUCTF 基礎CODE REVIEWView
- code review的意義View
- 為什麼要code reviewView
- 如何在團隊中做好 Code ReviewView
- iOS 工程開發中的 Code ReviewiOSView
- OCLint 實現 Code Review - 給你的程式碼提提質量View
- 關於Code Review的文章讀後感View
- 如何在團隊中推動Code ReviewView
- Code Review 常見的5個錯誤模式View模式
- iOS 持續整合系列 - 自動化 Code ReviewiOSView
- gitlab將merge request(pr)拉到本地做code reviewGitlabView
- JavaScript 最佳實踐JavaScript
- JDBC 最佳實踐JDBC
- Kafka最佳實踐Kafka
- Java最佳實踐Java
- Serilog 最佳實踐
- Flutter 最佳實踐Flutter
- springDataJpa 最佳實踐Spring
- Gradle最佳實踐Gradle
- MongoDB 最佳實踐MongoDB
- Iptables 最佳實踐 !
- AutoMapper 最佳實踐APP
- 《.NET最佳實踐》
- Django 最佳實踐Django
- metaq最佳實踐
- KeyPath 最佳實踐
- Pika最佳實踐
- SnapKit 最佳實踐APK