淺談 Code-Review

淺談 Code-Review

前言

最近,有些朋友也在談論 Code-Review 以及 Code-Review 所遭遇到的困難等,今天我就來談談我自己對 Code-Review 的一些初淺的看法。

近年來我在各中小型企業執行顧問工作,有 API Framework 客製化的框架開發、也有 Redis 導入工作、也有日常維護(專案開發技術顧問角色/Trouble-Shooting/專案軟體架構設計角色/單元測試顧問/教育訓練.../etc),而不管我執行哪一種工作,協助解決 Bug 也好,很多時候的第一件事就是與該團隊成員一起 Code-Review,先來看看程式碼,了解出現問題的 Source Code,這是再稀鬆平常不過的事情了,今天,我就來分享我在各大企業,許多團隊實際進行顧問時的 Code-Review 所看到的一些現象,並分享給各位。

實務上 Code-Review 以我個人的經驗我覺得可以區分為以下兩種:

  1. 非正式的 Code-Review:

什麼叫做『非正式的 Code-Review』呢?以往,我在帶團隊做專案時,不管是我與同仁 pair-programming 時,或者相互討論需求時,我們會同時進行 Code-Review,這時你會說這也算?對!!! 我認為,當然算,當然有些決議會記錄下來在下一次正式討論時與團隊同步,但是我個人非常重視這個過程,而且這些討論一樣是在『有團隊開發共同規範的基礎下』進行的。這些通常在位子上就可以進行。

非正式的 Code-Review 其實也有己的進入點(其實非正式場合我不建議用 Code-Review 做為內容表達方式,一來讓人覺得它就是要來噹我的會議、二來就是有犯了什麼錯,所以準備被指正等。)

1). 當 Junior 工程師對需求有問題時 

2). 當 Commit 的 Source 或 Pull 下來的 Source 有問題時 

3). Merge 出錯時

以上 3). 點我統一說明,非正式場合不建議大費周章發會議通知 + 找所有人一起參與,一來花費過多時間也沒有效率,專案開發是分秒必爭的,本來就不建議有過多的浪費(敏捷也告訴我們要減少浪費)使用最少的資源,與該需求相關人等討論即可,甚至在位子上花 10-20 分即可進行,我個人是建議不要超過 30 分鐘。

Merge 出錯通常可能點出另一種問題,像是團隊成員沒有遵循每日簽入、一個需求做太久、或工作重疊等,這其實是團隊共同規範的問題,有些就需要正式的場合來讓團隊了解問題的嚴重性、範圍、影響範圍等,這我放在下方一起說明。

PS: 相較之下,我反而喜歡非正式的 Code-Review,因為它是一個較不嚴肅的場合,讓 Junior 比較沒有壓力,用比較輕鬆的方式傳達共通的思想、與交換意見 + 激盪新的火花。


  1. 正式的 Code-Review:

為什麼我用『正式的 Code-Review』這個標題,因為訪間書籍在談論 Code-Review 可能會告似你有許多前置作業,像是:

A. 規範團隊開發共同規範 關於規範,我覺得這幾乎可以另外開一個 Topic 來說明,因為從分析=>設計=>開發=>部署都應該有基本的規範,分析使用的語言、使用的 Modeling Language、甚至團隊之間使用的術語,撰寫的 Paper 等等,都應該是有共識下的產物,這部分在 DDD 裡的通用語言 (UBiquitous Language) 就解釋得非常好我覺得。很多人跟我說,包括最近外部演講也在討論 (工程師 == 藝術家)所以不要限制我?.. 但..我很抱歉地說,如果是團隊開發,很抱歉,它就應該有些限制,對!?你聽到的沒錯,很遺憾的,它就是必須要有些限制,根據經驗,軟體專案開發在使用平台與架構、甚至使用哪一種 Log 套件/SMTP/SMS 處理等,都有約定,在這個專案裡甚至程式碼 Coding Rule 到使用的 Patterns 都是有約束的,不是完全由 Members 自由發揮,如果你不希望技術債跟著使用技術一起發散的話,那麼最好在團隊開發共同規範裡制定好規則,遊戲規則講清楚,軟體專案開發才有可能順暢,才有可能 On-Schedule 的。

B. 開發人員可先使用工具進行基本(程式碼風格、命名規則) 等,的掃瞄 這是種工具上的落實,在相同 Coding Rule 下,團隊成員可使用掃描工具驗證自己符合團隊的 Naming Rule。

Code-Review 常見的幾個時機?

1). 當團隊有產出時 

2). 當 QA 或甚至客戶有回饋 Bug 時 

3). 程式碼有些瑕疵、或者是效能不佳時


Code-Review 開始前,需要什麼準備工作嗎?

如果這個需求還在 ToDo 階段,先針對 ToDo 說明,通常可透過(Use Case/User Story/Scenario…)來說明需求,開始說明工作如何進行,程式碼架構如何分層,Patterns 使用時機等。

一般來說,Code-Review 那些東西:

  • 程式碼是否滿足業務與營運需求?
  • 程式架構與系統設計是否滿足未來擴充性?
  • 程式碼的可讀性,或者存在那些常見的程式碼壞味道(Code Smell or Bad Smell)
  • 程式碼效能問題 (Performance Issues)
  • 程式碼安全問題 (Security Issues)
  • Error handling (基本的錯誤處裡是否有達標?)

只要深入企業的專案團隊,穀倉就特別嚴重,但唯一不變的是專案時程 + 產出一定要有基本的品質,這些都是利用 Code-Review 把事情做得更快更好的切入點。

最後:

其實 Code-Review 的本質,絕對不是增加彼此對立、這與導入敏捷的精神基本上是一致的,所謂的 Code-Review 鼓勵小組們彼此溝通、凝聚共識、提升小組合作精神、與默契的最佳方法與方式。進而降低軟體開發的技術債,最終提升工作效率、因為有了合作默契 + 團隊開發共同規範,軟體品質自然提升、也因為浪費減少,工作效率自然提升。


延伸閱讀:

1). 團隊開發共同規範 - 適當的約束會有助於軟體產出的品質 (持續更新)

2). 從整潔架構 Clean Architecture 角度談 NuGet Packages 套件的規劃與使用 

3). 先前、我曾建議團隊透過 Project Templates 來減低人為的錯誤率、開發更加一致化 

4). 常見的程式碼壞味道(Code Smell or Bad Smell)

留言

這個網誌中的熱門文章

什麼是 gRPC ?

什麼是 gRPC(二)- 來撰寫第一個 Hello World 吧!

常見的程式碼壞味道(Code Smell or Bad Smell)