什麼是代碼審查,什麼時候應該做?

代碼審查是軟件開發生命周期的重要組成部分。它能顯著提高開發人員的代碼質量。

這個過程就像寫一本書。作者寫好瞭內容,出版社編輯對其進行瞭校審,所以沒有出現任何錯誤,例如將“你”與“你的”混淆。這個案例中,代碼審查是閱讀和評估其他人的代碼的行為。目的是在早期階段找到可能需要改進的設計或錯誤,否則這些設計可能會被忽視。代碼審查過程通常是在與代碼主幹合並之前進行。

我們現在將討論代碼審查的好處以及如何正確地進行代碼審查。請記住,在編寫軟件時,無論是小型還是大型項目,進行代碼審查都很重要。


為什麼代碼審查很重要?

任何軟件產品、網站或移動應用程序,都是由代碼組成的。這些代碼越是一致,工作起來就越方便,比如說,項目的需求變更。

一個高質量的代碼應該是容易理解的,可擴展的,可讀的。但由於工作發展迅速,可能會忽略這些因素。這就是為什麼需要一個代碼審查程序來提高其質量。

因此,代碼審查加速並簡化瞭軟件開發的過程。

代碼審查的好處

1.確保瞭設計和實現的一致性

每個開發人員都有一個獨特的編碼風格。如果開發人員繼續使用他們的編碼風格,這就會阻礙團隊成員間的合作,甚至可能會導致項目進度延期。代碼審查迫使開發人員遵循特定的編碼實踐。使用這種方法,所有的開發人員(包括新的)會更容易理解源代碼。

從長遠來看,當團隊人員變動時,代碼審查也是有其價值的。保持一致的編碼風格,會讓團隊新人花更少的時間來分析現有的代碼,從而在此基礎上快速開發新功能。

2.優化代碼以提高性能

由於編程天然枯燥乏味的特點,即使是最有經驗的開發者也會忽略編程中的錯誤。通過邀請他人來審查代碼,將有助於項目繼續推進之前,最大限度的較少代碼錯誤。

3.合作和分享新技術

一般來說,開發人員獨自工作,很容易犯一些錯誤。通過代碼審查,團隊成員有機會學習更好的技術來編寫代碼,甚至學習如何做得更好。這樣,開發人員可以通過學習最新的技術來提升他們的技能。

4.跟蹤項目要求和質量

項目有明確定義的范圍和要求。但當一個項目涉及到多個開發人員時,團隊內部很容易發生一些不必要的事情。Imaginary Cloud(一款產品)與項目經理緊密合作,確保瞭流程與客戶需求一致。

代碼審查通過研發成果和產品預期的比較來管理情景。它驗證瞭開發的所有功能。這樣做可以迅速解決對產品需求的任何誤解。而且,還能確保不會遺漏任何關鍵功能。

盡管代碼審查看起來像是另一個例行檢查,但它們的作用遠不止於此。代碼審查改善瞭團隊協作、學習、及時驗證的方式方法,並且使開發流程更加高效。

什麼時候和誰做代碼審查

代碼審查發生在所有自動化檢查之後,工作分支與主分支(源代碼)合並之前。

在代碼審查過程中,至少有兩個角色存在。編寫代碼和創建Pull Request的人是 "作者",而檢查代碼質量的人是 "審查者"。 審查者和作者可以通過下圖更深入地闡述。

What is Code Review and when should you do it?

代碼審查應該在哪裡進行?

這個過程可以發生在很多地方,比如開發者的機器、在線平臺等。以下幾點解釋瞭在哪裡和如何進行代碼審查。

  • 肩扛式 肩上代碼審查發生在開發人員的辦公桌上,有經驗的團隊成員會過一遍代碼並提出建議。這種方法是最容易使用的,不需要預定義的結構。
  • 電子郵件傳遞 一旦代碼準備好瞭,就通過電子郵件發送。電子郵件雖然提供瞭一個被動的代碼審查方法,但是由於內容可能會嵌套在多個回復中,難以管理和搜索。此外,確定何時完成審查也變成瞭一種挑戰。
  • 結對編程 使用這種方法,許多開發人員可以出現在工作站上,但隻有一個人寫代碼,另一個人提供實時反饋和建議。

雖然它可以作為檢查代碼和培訓開發人員的有用工具,但由於其比較耗時,導致效率低下。這個過程導致其他審查員,在這期間,無法做任何其他生產性的工作。

  • 工具輔助。工具輔助的代碼審查過程使代碼審查更容易。它可以是開源的,也可以是付費的,如GitHub、BitBucket等。今天,大多數團隊更喜歡這種方式。它一般有助於:
  • 組織和顯示更新的文件。
  • 在審查者和開發者之間提供一個溝通渠道。
  • 衡量代碼審查過程的有效性。

什麼是代碼審查的最佳實踐?

1.創建一個代碼審查檢查表

代碼審查核對表是一種結構化的方法,用於在提交代碼之前確保代碼質量。主要方面有:

  • 功能性 代碼的行為是否符合PR/MR作者可能的意圖,代碼的行為是否符合用戶的期望。
  • 可讀性 代碼應該是不言自明的。對變量、函數和類使用適當的名稱。
  • 安全性 代碼是否將系統暴露在網絡攻擊之下?是否需要更多的測試?
  • 架構 代碼是否設計合理並與周圍的結構相適應?
  • 可重用性 代碼是否使用可重復使用的組件、功能和服務?對於一些事情,如結構和邏輯,你可以自動檢查(如靜態分析)。
  • 測試 PR/MR是否有正確的和精心設計的自動化測試?
  • 評論 評論是否清晰和有用?

其他,如設計和功能,需要人工審查。帶著問題審查代碼,用以確保我們這麼寫是正確的。例如,你可以通過測試運行代碼,並且提出如下問題:

  • 代碼的作用清楚嗎?
  • 它是否按照預期執行?
  • 這段代碼是否滿足監管要求?

當你批判性地看待代碼時,你要確保自己是帶著問題在驗證代碼編寫的正確性。這樣可以減少我們審查的時間。

2.引入代碼審查度量標準

沒有度量,你就無法糾正代碼質量。對客觀指標的測量可以改善你的審查效果。要評估流程變化的影響,並預測完成一項任務的時間。一些常用的審查指標包括。

  • 檢查率 你的團隊審查特定數量的代碼的比例,通過將代碼行數除以檢查時間來計算。如果審查代碼需要很長的時間,可能會有可讀性問題。
  • 缺陷率 發現缺陷的頻率除以檢查時間。這個指標可以幫助你確定你的測試程序的有效性。例如,如果你的開發人員發現缺陷的速度很慢,你可能需要更好的測試工具。
  • 缺陷密度 你可以通過用缺陷數除以數千行代碼來計算它。然後,你可以將更多的資源分配給最易受攻擊的組件。假設你的一個網絡應用的缺陷明顯多於項目中的其他缺陷。可能需要更多有經驗的開發人員來處理它。

3.將你的代碼審查保持在60分鐘以內。

不建議審查代碼的時間超過60分鐘。過瞭這個時間點,性能和對細節的關註就開始下降。最好是頻繁地進行代碼審查(在短時間內),這樣的休息時間可以讓你的大腦重新充電。然後,你可以用新的眼光再次審視它。頻繁的審查將幫助你提高代碼庫的質量。

4.將你的檢查限制在每天400行。

試圖一次審查大量的代碼會使你更難發現缺陷。將代碼審查保持在每次400行或更少。代碼行數限制與時間限制同樣重要。它可以幫助你維護一個更高質量的代碼庫。

5.提供有益的反饋

與其說是批評,不如說是建設性的。通過提出問題而不是發表聲明更容易做到這一點。確保給予建設性的反饋以及贊美。當面給予反饋(或甚至做你的審查)將有助於你以正確的語氣進行溝通。審查是一種學習經驗,對所有參與者都有好處。

如何進行代碼審查?

如果你決定自己或在內部進行一次代碼審查,你應該遵循以下步驟:

  • 知道你在代碼審查中要尋找什麼。
  • 瞭解進行代碼審查的不同方法。
  • 舉行定期的小組會議,參與者可以收到關於他們特定領域的反饋,同時也可以收到關於任何問題的說明。
  • 使評論清晰而具體。
  • 對改進持開放態度。
  • 可以進行討論。
  • 從小的改動開始,然後審查更復雜的改動。
  • 保持提交狀態的更新。

代碼審查的敏捷案例

在敏捷環境中,有可能無縫地進行代碼審查。

其前提是要適應不斷變化的需求,更快地響應用戶需求,簡化流程,縮短開發迭代,並實現更高的生產力。它涉及到持續關註技術上的卓越性和應對變化的能力,同時保持高水平的質量。

蘋果和谷歌是著名的敏捷公司,他們產品的質量反映瞭這種額外的努力是卓有成效的。

上面提到的代碼審查的方法是敏捷過程的一個例子。它們在減少錯誤和提高源代碼的質量方面成本較低,而且效果顯著。

代碼審查為你的公司節省資金

代碼審查允許你在完成之前修復錯誤,確保合規性,並確認應用程序符合規格–而此時進行這些修改的成本會更高。

要看到代碼審查的時間和成本的節省來自哪裡,你需要以不同的方式來看待這個過程。捕捉錯誤和漏洞並迅速修復它們,意味著它們不會在下一個開發階段出現問題。如果你不立即抓住它們,從而導致返工,那麼所涉及的時間和成本就會成倍增加。IBM的系統科學研究所報告說,在實施階段修復bug的成本是設計和架構階段的五倍。 此外,在集成測試階段修復bug的成本是測試階段的十倍,十五倍,發佈後是三十倍。

原文連接