作者 | 蓋邁達(dá)
高效地進(jìn)行 Code Review 一直是我們想要做的事情,如何持續(xù)保持高效 Review 也是我們?nèi)粘i_發(fā)中所亟需解決的問題。
在疫情爆發(fā)之前,團(tuán)隊(duì)大多是線下一起辦公。大家會(huì)聚在一起 Code Review,把討論出的反饋記錄在便利貼并貼在白板上。而當(dāng)遠(yuǎn)程、線上的同事越來越多后,我們選擇將 Code Review 的反饋記錄在 Trello 等電子看板上。
今天我們總結(jié)了一種比較高效的 Code Review 方案,并帶來了一個(gè)比較好用的工具。下面來和大家分享一下我們團(tuán)隊(duì) Code Review 實(shí)踐的歷程。
Code Review的好處
一直以來,人們都說 Code Reivew 作為敏捷開發(fā)中重要的一環(huán),實(shí)踐 Code Review 有很多益處,那么到底 Code Review 有什么益處呢? 到底是因?yàn)槭裁茨ЯΓ覀冞@么篤定每天去做 Code Review?
我們認(rèn)真地思考了 Code Review 的益處,認(rèn)為以下幾點(diǎn)在整個(gè)敏捷開發(fā)流程中起到了至關(guān)重要的作用。
互相學(xué)習(xí),知識(shí)共享
我們無(wú)法保證項(xiàng)目中每個(gè)人都擁有相同的知識(shí)儲(chǔ)備,而且對(duì)于同一個(gè)問題,不同的人有不同的解決方案。通過 Code Review 我們可以快速地、有重點(diǎn)地將自己的知識(shí)傳遞給其他人。其他人也可以將代碼上下文、知識(shí)以及更好的解決方案提供給我們,讓我們做出更優(yōu)的實(shí)現(xiàn)。
Code Review 可以讓業(yè)務(wù)上下文在團(tuán)隊(duì)中共享。日常工作中,開發(fā)人員只會(huì)對(duì)自己負(fù)責(zé)的這塊業(yè)務(wù)比較熟悉。通過 Code Review 的方式,我們可以快速了解到其他業(yè)務(wù)上下文,更好地了解業(yè)務(wù)知識(shí),讓每位同學(xué)對(duì)系統(tǒng)都有更全面的認(rèn)識(shí)。
統(tǒng)一風(fēng)格,提高代碼質(zhì)量
團(tuán)隊(duì)一般會(huì)有統(tǒng)一的代碼規(guī)范。有些規(guī)范可以借助工具掃描來實(shí)現(xiàn)統(tǒng)一,工具掃描不到的就要靠 Code Review 來統(tǒng)一規(guī)范。
莎士比亞說過:“一千個(gè)人眼里有一千個(gè)哈姆雷特”,針對(duì)同一段代碼可能多種實(shí)現(xiàn)都是可行的。如果沒有統(tǒng)一的風(fēng)格,不便于后續(xù)對(duì)代碼的維護(hù)。通過 Code Review 的方式,我們可以在團(tuán)隊(duì)內(nèi)達(dá)成共識(shí),形成統(tǒng)一的代碼規(guī)范,為后續(xù)開發(fā)提供標(biāo)準(zhǔn),讓代碼看起來是同一個(gè)人寫的。
盡早暴露問題,降低修復(fù)成本
代碼開發(fā)過程中,我們很容易陷入到自己所預(yù)定的 Happy Path 中,反復(fù)驗(yàn)證卻無(wú)法發(fā)現(xiàn)問題。通過 Code Review 我們可以借助他人的視角來審查自己的代碼。是復(fù)制的時(shí)候變量名忘記了修改,還是忘記了測(cè)試異常情況,或是理解錯(cuò)業(yè)務(wù)含義等等。代碼從寫完到 Review 的時(shí)間間隔越短,解決問題的成本越低。和測(cè)試左移類似,Code Review 也可以將問題左移,從而盡早暴露,盡早修復(fù)。
我們團(tuán)隊(duì)的 Code Review 實(shí)踐經(jīng)歷
談了 Code Review 這么多好處,那么如何實(shí)踐 Code Review 呢?下面我們將自己團(tuán)隊(duì) Code Review 的經(jīng)驗(yàn)分享出來,與大家共同思考 Code Review 的最佳實(shí)踐:
團(tuán)隊(duì)最初采用的 Code Review 方式是,每位開發(fā)分別講解自己的代碼。這種方式的好處是同一個(gè)功能的代碼能夠集中講解。但實(shí)施一段時(shí)間后發(fā)現(xiàn)超時(shí)嚴(yán)重,主要原因如下:
- 講代碼的節(jié)奏不好把控。有人講得慢,導(dǎo)致嚴(yán)重超時(shí)。
- 遠(yuǎn)程辦公,不同講解人切換成本高??赡軙?huì)遇到屏幕共享、聲音等設(shè)備問題。
由此引發(fā)下面的問題:
- 每天只能 review 2、3個(gè)人的代碼
- 有的開發(fā)人員不夠主動(dòng),很久才會(huì)輪到TA
- Review 的代碼有遺漏
為了解決上面的問題,我們將 Code Review 改為如下形式:
- 每天一位主持人帶團(tuán)隊(duì) Code Review
- 選擇當(dāng)天所有的提交記錄,一起 Review
- 主持人驅(qū)動(dòng) Code Review,做簡(jiǎn)單講解
- 復(fù)雜代碼,提交人講解
- 主持人通過工具記錄 Code Review 的問題
這種方式主持人把控節(jié)奏,并且沒有了切換成本,大大加快了 Code Review 的速度。而且每天每個(gè)人的提交都能被 review 到。此外,借助 Code Review 問題記錄工具,效率大幅提升。
我們認(rèn)為通過主持人驅(qū)動(dòng)的方式能夠更加高效地進(jìn)行 Code Review,所以將其采納為我們團(tuán)隊(duì)的 Code Review 最佳實(shí)踐。
但 Code Review 中手動(dòng)記錄問題的過程非常煩瑣:發(fā)現(xiàn)問題 -> 切換Trello -> 手動(dòng)建卡 -> 手動(dòng)記錄問題代碼的位置。在此期間,我們開發(fā)了一款基于 JetBrains 平臺(tái) (比如 Intellij IDEA、WebStorm) 的 Code Review 插件(在IDE的插件市場(chǎng)搜索 Thoughtworks Code Review Tools 即可體驗(yàn))。我們?cè)诤笪闹袑?huì)詳細(xì)介紹此插件。
Thoughtworks Code Review Tools 介紹
這個(gè) Code Review 工具可以幫我們:
- 創(chuàng)建 Code Review 反饋 卡片并指定 owner
- 卡片會(huì)自動(dòng)記錄代碼位置
- 添加反饋卡片的類型(標(biāo)簽)
- 增加卡片截止時(shí)間
- 支持 JetBrains 下的所有 IDE
- 支持問題分類,方便利用 Trello board 儀表盤統(tǒng)計(jì)
安裝及配置
(1) 準(zhǔn)備電子看板
插件需要配合 trello(在線看板管理工具) 使用。我們需要先注冊(cè)trello,并新建 Code Review 看板。
(2) 安裝插件
在 IDEA 插件市場(chǎng)搜索 Thoughtworks code review tools 并進(jìn)行安裝
Github:??https://github.com/MTWGA/thoughtworks-code-review-tools??
下載頁(yè)面
(3) 配置插件
進(jìn)入偏好設(shè)置 -> TW Code Review Tools 菜單進(jìn)行配置插件信息
Trello Token 申請(qǐng)地址:https://trello.com/app-key
配置頁(yè)面
Trello Board 信息從Trello Board 地址欄可以找到,如下圖
修改完成后可以直接點(diǎn)擊 “Test Connection” 進(jìn)行測(cè)試 或者直接點(diǎn)擊右下角 Apply 進(jìn)行保存配置
記錄反饋
在 IDE 中選擇相應(yīng)的代碼,而后使用快捷鍵 command+option+i 呼出 “code review feedback” 提示框。首先輸入或者選擇人名,按 Tab鍵切換輸入框,依次輸入類型、反饋。最后按 Enter 鍵提交。
Code review Feedback 頁(yè)面
提交成功后就有相應(yīng)的提交成功的提示信息,如下圖
提交成功信息
我們也可以在 Trello上查看到信息,如下圖:
Trello 看板圖片
查看 Code Review 狀況
在 Trello 的 Code Review 看板上點(diǎn)擊標(biāo)題左側(cè)的“看板”,轉(zhuǎn)換視圖到儀表盤即可查看統(tǒng)計(jì)的信息。具體操作如下圖:
轉(zhuǎn)換視圖
按照標(biāo)簽選擇,查看code review分類信息
至此,Code Review 工具的配置及使用介紹完成。
Code Review 插件可以幫助我們快速記錄 Code Review 的反饋信息(代碼位置、反饋類型、截止時(shí)間,涉及的人員)。這些信息可以幫助開發(fā)者精確找到需要優(yōu)化的代碼位置以及優(yōu)化建議,方便開發(fā)者更快速、準(zhǔn)確地優(yōu)化代碼。
在開展Code Review一段時(shí)間之后,逐漸積累起了一定量的數(shù)據(jù)。此時(shí)我們可以通過統(tǒng)計(jì)工具分析數(shù)據(jù)。比如按照問題類型進(jìn)行統(tǒng)計(jì),對(duì)于出現(xiàn)次數(shù)多的問題分類,可以針對(duì)性展開培訓(xùn),提升團(tuán)隊(duì)成員技能。
培訓(xùn)完成后,我們可以根據(jù)新一輪統(tǒng)計(jì)結(jié)果分析培訓(xùn)效果,觀察團(tuán)隊(duì)是否確實(shí)得到了提升,從而形成閉環(huán)。
總結(jié)
Code Review 的好處雖然被廣泛認(rèn)可,但想做好 Code Review 并不容易。首先團(tuán)隊(duì)需要對(duì)開展 Code Review 達(dá)成共識(shí),然后針對(duì)自己團(tuán)隊(duì)的特性,采用相匹配的實(shí)踐方式。關(guān)于工具,可以嘗試文中提到的 Code Review 插件以及電子看板。在提升自動(dòng)化程度的同時(shí),積累 Code Review 數(shù)據(jù),指導(dǎo)團(tuán)隊(duì)針對(duì)性地提升技能。
使用插件過程中有任何問題或建議,請(qǐng)聯(lián)系插件開發(fā)團(tuán)隊(duì):
LiHui(??hui.li@thoughtworks.com??)
PengJie(??jie.peng@thoughtworks.com??)
GeMaida(??maida.ge@thoughtworks.com??)
LiYiming(??yiming.li@thoughtworks.com??)
?LiQiang(????qiangli@thoughtworks.com???)