淺談 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)

留言

這個網誌中的熱門文章

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

占空間的Google Chrome暫存檔

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