天天看點

讓代碼審查扮演更好的角色

讓代碼審查扮演更好的角色

代碼審查(code

review)是很多大公司裡面都有的一個流程。它指的是一個人編碼,另有幾個人負責審查,并提出修改意見。代碼審查在大多數情況下對公司整體的工程品質是有提高的,但是如果使用不當的話,很可能反倒會降低工程品質。代碼審查究竟在一個組織裡面是有正面效應或者是負面效應取決于很多因素,而我認為其中最重要的是代碼審查在開發過程中扮演的角色。

首先,我們先看看在代碼審查中所需要找出的問題類型。它們可以是:

文法及代碼風格問題:一般有靜态檢查工具可以解決,但難免有疏漏。

效率問題:需要有一定經驗的人來辨識低效的部分。

命名問題:這其實是一個很經常出現也很重要的問題。對于一個人來講說得通的命名不見得對于團隊而言說得通,是以很多時候較難的命名要由團隊通過代碼審查協同解決。

設計問題:小到接口的設計,大到服務間通信的協定,都屬于設計問題,根據情況可以由小部分人或者整個團隊解決。設計問題是代碼審查中最常見的問題。

對于前三種問題,相對來講都很好解決。其中相對棘手的莫過效率問題,但實際上基本上知道效率問題的人都知道優化方案。然而,如果一個審查的人突然提出一個很合理的設計問題,需要你重新修改源代碼,你會發現你需要花大量地時間重新編寫。

例如,在編寫一個javascript庫packagea的時候,你送出了代碼審查。有人可能會提醒你:packagea是用于桌面端網站的庫,相對應的還有一個移動端的庫packageb。為了保持工程上的一緻性,建議把packagea改成盒packageb一樣的api。一緻性一直以來是一個讓人無法反駁的設計追求,是以你隻好把辛辛苦苦自己設計好的api全部重改…

是以,若你的代碼裡面被提出存在設計問題,消耗的工程時間會增加。而工程時間對公司來講就是金錢。

造成存在需要大改的設計問題的原因其實無非三個:

設計能力不足

對開發的系統不熟悉,缺乏上下文(context)

過晚送出代碼審查

前兩個原因都很直白,但是第三個原因有點匪夷所思。什麼叫做過晚送出代碼審查?

我想是代碼審查英文單詞中的”review”給予人的誤導,很多人是在代碼幾乎完成或者已經完成後才送出代碼審查的。就好像在做一盤菜,做到最後一步的時候才想起來要嘗一小口看看味道對不對,結果發現沒加鹽。

在最後一步進行代碼審查,還會因為審查者一下子接收太多資訊,而造成他可能無法發現一些應該發現的問題。

讓代碼審查扮演更好的角色

顯然“審查”扮演的角色在這裡出現了問題,它不應該是傳統意義上的到最後一步進行把關,而應該是貫穿整個編碼過程的一個輔助過程。用比較老式的軟體工程“土話”說,它應該是一個umbrella activity(雨傘活動),全程保護編碼過程的品質。

現在,我的代碼審查流程是這樣的:首先完成一個基本的設計,加上基本的注釋,達到一個完成度——最可能出現大設計問題的完成度。接着

commit,并推入到代碼審查中,邀請其他人來審查。這基本上就是對他們說,“看,這是我寫的,很簡單,可能爛得跟一坨屎一樣,麻煩你們幫我看看有沒有什麼大問題”。

讓代碼審查扮演更好的角色

稍微有點開發經驗的人,都可以大概估計出自己手頭的工作進行到哪一步可能出現大的設計問題。例如,當你在設計一個新的子產品,那麼可能出現大的設計問題的時候可能就是設計api的時候。再緊接着,下一個可能出現大的設計問題的就是類之間的抽象關系,等等。

我甚至還會自己給自己的代碼進行審查。這并不是在做驗算,而是在通過代碼審查告訴團隊自己的疑問,提出自己的想法,這樣大家就能更好地與你溝通。相信我,把有疑問、猶豫不決的地方提出來;有自己獨特想法的地方,也要指出來,因為你的獨特想法有時候對團隊來講就是不好的想法。

每當遇到心裡覺得可能出現大的設計問題的時候,盡量利用代碼審查,讓團隊和你一起解決。對于工程經驗少的人來說(比如我),更應該多做一點這樣的事。一開始這樣做可能反倒會開銷更多人的時間,但是過一陣子之後,你就更有把握做好的設計決策。換句話說,發生大設計問題的機率就會降低。因為你總能在和别人溝通的時候學到新東西。

然而,如果每次都在編碼完成之後再進行代碼審查,雖說最後經過代碼審查可能也會産出高品質的代碼,可你将花大部分時間在煩悶上,而花很少的時間真正體會他人提出的意見的真正價值。

長此以往,整個工程團隊的工程時間可以得到顯著的下降。首先是因為每個人的經驗都能通過代碼審查增長得更快,是以總體工程效率會提高;第二是因為全程保護的代碼審查很好地解決(或緩解)各種層面的設計問題,讓工程無論從短期還是長期來講,需要花費的工程時間降低,并且技術債務(technical

debt)也會減少。

幸運的是,雖說這裡提到的是比較宏觀的流程問題,卻是一件落實到每個工程師自身的事情。也就是說,代碼審查如何執行最終還是歸結于編碼的工程師個人。整個流程的轉換無需有新的工具加入,也不需要有很多複雜的文檔。所需要的隻不過是對團隊的一次教育訓練——這篇文章或許就是一個不錯的素材。

作者:佚名

來源:51cto

繼續閱讀