怎麼把「源碼覆審」做得更專業點?
源碼覆審就像健檢,雖然心理知道「預防重於治療」,但身體還是會很誠實的逃避。預防,就是為了要在成本還能控制的時候盡早處理。這個過程其實還能附加其他的優勢上去,像是可以做為經驗的傳承,或是收集建設性的意見,腦力激盪也不錯。有的團隊重視源碼風格的,當然也可以在源碼覆審會議中檢視及要求。
一個成功的源碼覆審後,應該會收到什麼效益呢?我們可列出一個清單來逐一檢視,確保沒有遺漏的項目:
- 分支和送交的名字是正確的:確保大家都能在三週或更久的時間後,看到名字就知道意思。
- 源碼是可讀的:也就是說裡面沒有太多的奇技淫巧(最常舉例的就是三元運算子或是各式各樣的lambda/closure)。
- 符合源碼風格規範:既然團隊訂了風格的規範,也認同了這份規範如何善待大家的眼睛和大腦,這就得確實要求下去。
- 資料夾和檔案結構是合理的:沒有理由存在的檔案,文件應該在哪個資料夾,資源檔一定要在哪裡等這些問題,我想已經不只是源碼覆審的問題了。
- 源碼是具有良好結構的:所有的類別和函式,都已經達到原子(atomic)級別,沒有複製貼上的內容,沒有語意不清的實作。
- 被測試過:當然這不是完整的測試,但對於一小部分的源碼來說,在實作的意圖上算是被測試過了。
- 有文件產出:源碼覆審的過程,可能會產生一些應修正的問題/缺陷,也會有一些優化的建議,僅管這不是指導書等級的文件,但確實也有其價值。
上述的清單是一個源碼覆審預期應收到的效益,但大家一定會說,要做的事情那麼多,怎麼可能全部都滿足呢?是的,所以我們真正要進行人工的源碼覆審前,應該要先有一部分的機器覆審來分散負擔。也就是透過一些工具來幫我們確認一些規則比較簡單的檢查:
- 透過簡單的規則腳本,至少可先擋下明顯非法的名字。
- 用靜態源碼分析工具(linter),檢測出實作中的一些低效的演算法,非慣例的怪(Bad Smell)寫法,或是有明確錯誤(Ex.索引超出範圍)的部分。
- 用美化源碼排版工具(beautifier),在開發期就確保源碼風格是隨時合標的。
- 以自動化測試工具,進行基礎的單元測試。
文中最有價值的可能是「工具大補帖」了吧?像是「awesome-linters」列出了各種語言常用的linter,或是「awesome-code-formatters」列出了常見的beautifier。也推薦了「 SonarQube」這個專業的linter,和「Codacy」這個自動化源碼覆審的工具。
一個高品質的源碼覆審,你覺得最重要的是什麼?人很重要,工具很重要,但執行的策略是最重要的,因為這會極大程度的決定了覆審的所有品質。
如果我們要達到源碼覆審的那7個效益,保持產品的品質,剛剛提到那些工具都最好能夠在有源碼將被送交時就自動執行。以git為例,我們可透過git的「Pre-commit hook / pre-push Git hook」中,去叫起這些工具,先一步幫我們覆審源碼,揪出那些不符風格規範,或是有潛在危險的部分。如果有足夠的資源可搭建「持續整合流程(Continous Integration, CI)」,像是透過「Jenkins」或「Teamcity」這類的工具搭建起來的CI,都能提供在「拉取請求(Pull Request, PR)」前執行自動測試工具,並傳回結果。
如此費工投入(可想想我們需要導入多少工具…😅),我們最終的目標是什麼?就是讓這些流程成為第一線的覆審者。
接下來進入真正的「人工覆審」。以前聽過「結對程式設計(Pair Programming)」,我實在不曉得要怎麼實作。但可以的話和作者一起Pair Reviewing則是源碼覆審中很重要的一環。只有作者能告訴你,寫這份源碼時他腦中在想什麼。有什麼問題直接問,不管是線下坐在他旁邊,或是透過線上視訊會議進行,都是不錯的選擇。別透過非同步方式(例如信件/即時訊息)處理,這是個非常需要專注的過程,速戰速決才能讓這個程序發揮效益。
另一個很重要的是「範圍」。就像剛剛提過的,如果我們可讓第一線的覆審者,在每次PR前都能跑過一次全工具的檢查,其實那也是我們執行源碼覆審的最佳時間。因為一次PR所牽涉到的源碼變更,通常都是很有目的性的,最常見的就是工項追蹤系統(Issue Tracking System)中某個工項需求的實作。這有點像是「以終為始」,我們可從這個工項的需求,回頭對應來看源碼的改變,是否都有瞄準需求而實作(還是有偷偷夾帶一些其他問題的修正或新增功能…😜)。而且一樣是滿足功能需求,是否這位開發者有破框的狀況出現?軟體就是這樣,從表面是看不出問題的,破框一樣是解決問題了,但這往往會帶來更長遠或更大的問題。源碼覆審的過程中,找到這類的問題,所帶來的價值,可是遠超過風格規範或是非法命名的。
若是有幸能有足夠的資源,把剛剛提到源碼覆審的那些工具或流程都建置起來,基本上需要覆審的源碼,應該就會非常的簡單,小到像顆米一樣,轉轉眼珠子一下就看完了。這樣子的覆審才有品質。寧可天天花5分鐘專心覆審,也不要在週五花50分鐘”度估”。