1. 程式人生 > >淺談軟體工程中的程式碼評審

淺談軟體工程中的程式碼評審

程式碼評審這個詞相信很多做開發的同學一定不會陌生,線上故障回顧總結有程式碼評審和單元測試總能夠被高頻率的提及並作為主要的整改意見,可見程式碼評審對於軟體工程質量保證的重要性。相對於單元測試,程式碼評審的普及率是相對較少,相信主要原因是程式碼評審的執行難度高,靈活性大,評審的方法和規則難於標準化等原因,要做好程式碼評審往往也困難許多,這裡除了涉及到具體的技術知識和業務知識,還需要評審雙方的溝通能力,表達能力,個人態度以及團隊氛圍等多種個人軟體技能或者團隊開放度。

什麼是程式碼評審

根據維基百科的定義,程式碼評審是軟體質量保證一種活動,由一個或者多個人對一個程式的部分或者全部原始碼進閱讀理解。一般來說分為作者和評審者兩種角色,作者方提供程式碼邏輯的介紹和程式碼,評審者則對提供的程式碼基於設計,功能性和非功能性等方面認知進行閱讀並提出問題。常見的評審組織形式是有同行評審(Peer Review)和小組檢查 (Team Inspection)兩種方式。

程式碼評審目的

維基百科中提到通過程式碼的評審發現潛在的問題是程式碼評審主要的目的。這是不可否認的當時提出程式碼審查的初衷,但從我個人的實踐中發現,分享和表達是程式碼評審過程最主要的收穫。通過程式碼評審可能無法發現更多的明顯的問題,但是一定可以通過評審過程學習和交流發現程式碼中存在的優點和缺點,讓新同學瞭解業務,讓老同學知道可能有更優的設計和用法。同時讓同事們在評審中交流表達自己的觀點,讓同學們有更多的開口機會。
image

根據Google 工程團隊執行程式碼評審活動後發現,除了捕捉bug外,還對5大無形收益。

  • 程式碼評審促進團隊和個人開放度
  • 程式碼評審提升團隊交付標準
  • 程式碼評審激勵團隊協作
  • 程式碼評審保持安全至上
  • 程式碼評審構建社會認可
什麼時候做程式碼評審

程式碼評審最重要的一點是非常靈活,無固定形式,隨時隨地都可以發起。根據Github和Apache一些開源專案的程式碼評審實踐,往往是將PR合併到主幹時進行評審並作為是否合併到Master分支的一個准入條件。對於團隊辦公集中且人員比較固定的組織,可以基於commit進行評審,那麼對於每次需要評審的工作不會太高,時效性也容易把握。

如何執行程式碼評審
作者 (Author)
  • 確定待評審的程式碼範圍

根據SamrtBear在思科的一個系統小組的研究,一個開發人員一次評審的程式碼在200-400之間,審查超過400行程式碼後效率和發現均呈下降趨勢。如下圖:
image

同時,一個小時審查的程式碼行數應該少於500行,超過500行後效率呈下降趨勢。
image

  • 簡單的描述程式碼業務邏輯以及主要的業務流程
  • 開放的心態接受評審的問題或者建議
評審者(Reviewer)
  • 準備一個檢查列表
  • 瞭解業務邏輯和主要流程
  • 準備好一些問題,對於不確定或者不明白,儘量以問題形式跟作者溝通,而非質疑。
  • 準備一些解決方案。在提出問題時候,同時思考更好的方法或者解決方案是什麼?你的方法好在什麼地方?
程式碼評審的關注點
  • 功能性 - 功能完整,是否嚴格按照產品說明書實現產品的所需的功能點
  • 可讀性 - 程式碼易讀易懂,其它人能夠輕鬆從程式碼中讀邏輯和設計思想,命名是一個學問。
  • 可測性 - 程式碼能夠輕鬆被單元測試覆蓋,一般來說無法被單元測試覆蓋的程式碼不是一個好程式碼
  • 可維護性 - 程式碼執行期間日誌輸出完整,運維人員或者其它人員可以從日誌中瞭解應用的執行邏輯和狀態。
  • 效能 - 天下武功唯快不破,確保程式碼在可度量的資料量級下面保持一個穩定的效能表現。程式碼是否存在效能問題,預計峰值流量能到多少。
  • 多執行緒,併發和鎖 - 在併發或者多執行緒情況下,程式碼執行結果是否有問題。過去幾個月中我們有一個應用是以Shell的方式啟動任務,每一個作業一個程序。由於這種方式帶來的資源利用率較低,打算改成多個作業執行在一個程序中(容器)以節省系統資源, 上線後發在存在多處執行緒不安全的問題,例項變數被汙染導致線上問題。
  • 安全性 目前雖然有很多的掃描工具可以幫助發現程式碼安全的問題,但更專業的開發人員在寫程式碼就已經注意這個問題,避免基本的SQL注入,XSS跨域等問題。有興趣的同學可以參考OWASP CODE REVIEW GUIDE
程式碼評審中注意事項
  • 程式碼評審不僅是技術,也社會學。雙方溝通表達能力決定程式碼評審的效率和有效性。評審者需要注意問題的方式或者語氣,就事論事,不上升到精神和思想層面。而作者則需秉承一切問題都可探討或有更好的方案的想法吸收理解他人的想法,即使評審提出不合適的問題,那麼你讓隊友知道一個正確的方法仍然是團隊和組織的收穫。
  • 程式碼評審不應太過於關注程式碼風格,程式碼風格的檢查完全可以通過IDE或者掃描工具SONARCube整合CheckStyle, PMD,FINDBUG實現。
程式碼評審的參考書
參考文件
關於作者

王雲 - 唯品會財務研發微胖中年男,常年關注架構設計,高效能應用設計,軟體工程,團隊管理等領域。

相關推薦

軟體工程程式碼評審

程式碼評審這個詞相信很多做開發的同學一定不會陌生,線上故障回顧總結有程式碼評審和單元測試總能夠被高頻率的提及並作為主要的整改意見,可見程式碼評審對於軟體工程質量保證的重要性。相對於單元測試,程式碼評審的普及率是相對較少,相信主要原因是程式碼評審的執行難度高,靈活

web工程BeanUtils的封裝MyBeanUtils,populate方法使用 【接收前端form表單資料】

宣告本測試使用JDK9,Tomcat9.0.10 ,IDEA2018.2  ; 淺談  BeanUtils 的封裝 , BeanUtils  類中方法  populate  (Object  be

軟體工程

對於一個沒有專案經驗的人來說,或許談軟體工程有點為之過早,不過在這裡我還是想表述下我對於軟體+工程的理解。 為什麼將軟體工程拆分為:軟體+工程,我覺得軟體是一個領域,而工程又是一個領域。現在我們把軟體和工程結合在一起,希望能夠開發出更好的軟體。在一開始學習C 語言的時候,認

軟體開發的防禦式程式設計

  在軟體開發中針對使用者的輸入往往不是我們所期待的那樣(不滿足前置條件),有時候軟體內部往往也會出現一些我們不易察覺的錯誤,針對這種情況,一些人持有樂觀的態度,而另外一些人則從一個其他的事情中得到了啟發:即由防禦式駕駛而想到的防禦式程式設計。   所謂防禦式程式設計,指的就是這樣一件事情:即我們假定使用者都

網路爬蟲深度優先演算法和簡單程式碼實現

學過網站設計的小夥伴們都知道網站通常都是分層進行設計的,最上層的是頂級域名,之後是子域名,子域名下又有子域名等等,同時,每個子域名可能還會擁有多個同級域名,而且URL之間可能還有相互連結,千姿百態,由此構成一個複雜的網路。 當一個網站的URL非常多的時候,我們務必要設計好URL,否則在後期的理解

網路爬蟲廣度優先演算法和程式碼實現

前幾天給大家分享了網路爬蟲中深度優先演算法的介紹及其程式碼實現過程,沒來得及上車的小夥伴們可以戳這篇文章——淺談網路爬蟲中深度優先演算法和簡單程式碼實現。今天小編給大家分享網路爬蟲中廣度優先演算法的介紹及其程式碼實現過程。 廣度優先演算法和深度優先演算法恰好相反,這裡繼續以上圖的二叉樹為例。

軟體許可權的問題

對於這個問題,只要有開發專案經驗的人都會涉及到,而且,根據不同的專案,許可權的要求也不一樣。本人根據自己做的一個專案,來談一談許可權在軟體專案或其他專案中的應用和體會。 這是個關於房地產銷售的軟體,屬於BS結構,由於裡面的結構和功能比較複雜,我不能一一列舉,在此我只談談系統中許可權的這塊。許可權

軟體效能測試關鍵指標的監控與分析

淺談軟體效能測試中關鍵指標的監控與分析 一、軟體效能測試需要監控哪些關鍵指標? 軟體效能測試的目的主要有以下三點: Ø  評價系統當前效能,判斷系統是否滿足預期的效能需求。 Ø  尋找軟體系統可能存在的效能問題,定位效能瓶頸並解決問題。 Ø  判定軟體系統的效能表現,預見系

軟體開發過程的專案管理

摘要:大量軟體開發例項表明,如果不能在軟體開發中加強專案管理,隨著國內軟體行業的不斷髮展與壯大,國內的軟體開發企業將面臨嚴峻的挑戰性與風險性。因此,為了確保軟體開發的效率與質量,必須認識到強化專案管理的必要性,並且堅持多管齊下的方針,積極採取有效的管理策略。   關鍵詞:軟體;開發;專案管理   軟體開發

【遊戲開發】遊戲開發常見的設計原則

依賴關系 unity 說過 srp des log gof https 類繼承   俗話說得好:“設計模式,常讀常新~”。的確,每讀一遍設計模式都會有些新的體會和收獲。馬三不才,才讀了兩遍設計模式(還有一遍是在學校學的),屬於菜鳥級別的。這次準備把閱

網絡的IP地址

網絡ip 思科 華為 IP地址是現在生活中不可或缺的,互聯網的運用,使我們的生活變得多元化,充滿樂趣。想了解這一切,需要先從根本了解,今天淺談以下IP地址,從以下幾個方面介紹; 一.IP地址的作用:在一定範圍,唯一的標示,一個上網的設備;(凡是需要上網的設備,必須得有IP地址)

JAVAEE企業級應用開發之MVC 的V-VIEW視圖

插入 第一次 開發 優點 就會 mil 是否 javaee 方便 Step1.情景概要 Hello,小夥伴們,好久不見,之前跟大家分享了三層架構與MVC思想,相信大家對於這兩塊內容有了相對清晰的個人認識了,既然我們講到了MVC,這裏我們接著這塊內容繼續往下深入,今天我們來看

前端知識 | 在React使用echarts

har family spa microsoft -- nbsp date text break 方法一:echarts-for-react 是一個非常簡單的針對於 React 的 Echarts 封裝插件。和使用所有其他插件一樣,首先,我們需要 install 它:第一步

C#語言的各種數據類型,與數據類型之間的轉換

優化配置 line com 歸類 浮點 初學者 結構 ali 順序 什麽是數據類型? 數據類型,百度百科是這樣解釋的:數據類型在數據結構中的定義是一個值的集合以及定義在這個值集上的一組操作。這樣的解釋對於一個初學者來說未必太過於深奧。 簡單點說,數據類型就是不同長度的數據的

Exchange 2010客戶端訪問服務器陣列ClientAccessArray

忽略 介紹 con 單獨 mark cit type cto 創建 除了 RPC 客戶端訪問服務之外,Exchange 2010 還向 Exchange 組織引入了一個新的邏輯結構:客戶端訪問服務器陣列(Client Access Server Array)。當在某個 Ac

關於java的深淺拷貝

long private 創建 .com ktr nal ride 相同 cto 一.淺拷貝(shallow copy) 1.如何實現淺拷貝? Object類 是所有類的直接或間接父類,Object中存在clone方法,如下 protected native O

移動端的視口(viewport)

手動 們的 http https 窗口 -h 換算 device 手冊 在 PC 端,視口指的是瀏覽器的可視區域,其寬度和瀏覽器窗口的寬度保持一致。在 CSS 標準文檔中,視口也被稱為初始包含塊,它是所有 CSS 百分比寬度推算的根源,給 CSS 布局限制了一個最大寬度。

C語言的兩種語句

我們都知道學習C語言都會遇到兩種常見的語句:選擇語句,迴圈語句。今天就讓我們一起來簡單看看這些語句的特點及功能吧! 選擇語句 if語句,用來實現兩個分支的選擇結構。 switch語句,用來實現多分支的選擇結構。 比如這裡有一個選擇語句: #include&

[轉]如何做到高效配合?專案管理的閉環思維

前言:騰訊的遊戲學院公眾號還是挺不錯的,經常有技術和運營、策劃等遊戲相關的乾貨分享,這篇講管理的我覺得挺不錯的,特來分享一下。 導語:談到閉環,想必大家都不陌生。本文將結合專案管理中一些實際的場景和模型,談談專案管理中的閉環思維。作者徐州系騰訊互動娛樂光子工作室群高階專案經理。 我所理解的閉

淺析軟體工程的UML建模技術

一.基本資訊 標題:淺析軟體工程中的UML建模技術 時間:2018 出版源:電子世界 領域分類:軟體工程;UML建模技術;需求分析 二.研究背景 問題定義:軟體工程中UML建模技術的研究 難點:明確軟體系統的架構與體系,多種圖例的分析,各個圖例的功能性。掌握軟體工程中UML的建模技術應用流程。