淺談 Code Review 之事前準(zhǔn)備

image from pixabay

隨著業(yè)務(wù)規(guī)模擴(kuò)大、團(tuán)隊(duì)組成變復(fù)雜,如何降低項(xiàng)目實(shí)施風(fēng)險(xiǎn)乾闰,降低軟件復(fù)雜度變得尤為關(guān)鍵。 我從 Martin Flower盈滴、Joel Spolsky(軟件隨想錄 作者) 等巨匠智慧中尋找解決復(fù)雜工程之道涯肩,其中 Code Review 是行之有效手段。 我認(rèn)同 Code Review 價(jià)值也是忠實(shí)執(zhí)行者巢钓。

加入螞蟻以后病苗,我在所接觸項(xiàng)目中都大力推廣 Code Review。 感謝團(tuán)隊(duì)信任和支持症汹,目前 CR 協(xié)作進(jìn)展順利硫朦, 項(xiàng)目 CR 從最早不主動(dòng),到現(xiàn)在形成基于模塊 Owner 制度 CR 和 Peer Review背镇。 我也曾經(jīng)在 3 個(gè)月內(nèi)處理完成 700 多個(gè) Pull Request咬展,并在 PR 討論中中都留下一些有價(jià)值討論。 這里我將自己對(duì) Code Review 一些理解記錄下來(lái)瞒斩。

這一篇先講講進(jìn)入 Code Review 之前需要做準(zhǔn)備工作破婆。

評(píng)估團(tuán)隊(duì)成熟度

image from pixabay

不管是在一個(gè)遺留系統(tǒng)上推廣 Code Review,還是在一個(gè)新團(tuán)隊(duì)推廣 Code Review胸囱, 起手式不是立馬挽起袖子猛干祷舀,而是應(yīng)當(dāng)觀察一下當(dāng)前所處情況是否允許自己推動(dòng)這個(gè)「艱巨」任務(wù)。 最需要觀察的是團(tuán)隊(duì)成熟度烹笔。

我將團(tuán)隊(duì)成熟度粗略分為草臺(tái)班子裳扯、成長(zhǎng)型團(tuán)隊(duì)、成熟團(tuán)隊(duì)箕宙。 具體衡量指標(biāo)可以有成員技術(shù)儲(chǔ)備嚎朽、團(tuán)隊(duì)成員信任度、團(tuán)隊(duì)負(fù)責(zé)人對(duì)工程管控力度柬帕。 相信集團(tuán)內(nèi)大部分團(tuán)隊(duì)處于成長(zhǎng)型哟忍、成熟型團(tuán)隊(duì)。 但如果考慮到生態(tài)同學(xué)一起協(xié)作陷寝,或者臨時(shí)因?yàn)榫o急項(xiàng)目湊在一起锅很,就比較容易成為「草臺(tái)班子」。

如果還停留在草臺(tái)班子凤跑,那就得先在團(tuán)隊(duì)內(nèi)形成一定共識(shí): 包括技術(shù)共識(shí)和合作模式的共識(shí)爆安。 技術(shù)共識(shí)需要包括:技術(shù)棧共識(shí)、好代碼定義仔引、研發(fā)流程共識(shí)等扔仓。 合作模式共識(shí)需要包括:沖突解決機(jī)制褐奥、職責(zé)范圍邊界、決策機(jī)制等翘簇。 如果基本共識(shí)還沒(méi)有形成就倉(cāng)促進(jìn)入 Code Review撬码,那就容易將一件好事變成工程師戰(zhàn)爭(zhēng)。

并不是所有團(tuán)隊(duì)版保、項(xiàng)目都適合無(wú)差別引入 Code Review呜笑。這么幾種情況建議暫緩 Code Review 推廣:

  • 老板和同事都不支持甚至反對(duì)
  • 業(yè)務(wù)重要性低,或者團(tuán)隊(duì)都是特立獨(dú)行高手
  • 創(chuàng)新業(yè)務(wù)需要快速上線彻犁,這時(shí)候適合將這類(lèi)任務(wù)分發(fā)給配合度高老團(tuán)隊(duì)叫胁,或者給高手單兵作戰(zhàn)

當(dāng)條件不滿(mǎn)足時(shí)也不用氣餒。先成為一個(gè)布道師吧汞幢,探索一下團(tuán)隊(duì)中有沒(méi)有相似想法的人驼鹅,了解一下他們擔(dān)心點(diǎn)和訴求點(diǎn)。 相信只要條件允許森篷,沒(méi)有人會(huì)拒絕提高工程質(zhì)量谤民。

構(gòu)建「好代碼」共識(shí)

image from pixabay

Code Review 核心產(chǎn)出物是代碼,如何界定代碼是好是壞就至關(guān)重要疾宏。 根據(jù) Bjarne(「C++ Programming Language」作者)、Grady Booch(「面向?qū)ο蠓治雠c設(shè)計(jì)」作者)等人定義触创, 總結(jié)下來(lái)好代碼有這么基本特征(via「Clean Code」):

  • 正確
  • 可測(cè)試
  • 不重復(fù)
  • 少且簡(jiǎn)單
  • 可讀

深思一下這些基本特征背后道理:代碼是人類(lèi)和機(jī)器溝通工具坎藐,好代碼也要利于人類(lèi)閱讀和再次書(shū)寫(xiě)。 人比機(jī)器更犯錯(cuò)哼绑,機(jī)器算力在成倍增長(zhǎng)岩馍,因此簡(jiǎn)單易維護(hù)重要度逐步增高。 這些樸素道理也正是語(yǔ)言從低級(jí)語(yǔ)言進(jìn)化到高級(jí)語(yǔ)言驅(qū)動(dòng)力抖韩, 也是近幾年高級(jí)語(yǔ)言語(yǔ)言特性主打點(diǎn)(類(lèi)型系統(tǒng)蛀恩、格式系統(tǒng)、面向人類(lèi)同步思想異步設(shè)計(jì))茂浮。

但上面這幾條原則太底層了双谆,無(wú)法成為實(shí)踐標(biāo)準(zhǔn)。 因此行業(yè)基于這些公理衍生了不少實(shí)踐定理席揽,我將其分為工程規(guī)約和設(shè)計(jì)范式兩類(lèi)顽馋。

工程規(guī)約包含語(yǔ)言風(fēng)格規(guī)約和應(yīng)用工程規(guī)約。 語(yǔ)言風(fēng)格規(guī)約比較容易理解幌羞,開(kāi)源世界提供了很多選擇寸谜。硅谷大廠 Google / Facebook / Uber 等都有不少規(guī)約提供。 國(guó)內(nèi)還有極具價(jià)值的「阿里巴巴 Java 開(kāi)發(fā)手冊(cè)」属桦,我稱(chēng)之為 50331 ;) (PS:「阿里巴巴 Java 開(kāi)發(fā)手冊(cè)」不僅有語(yǔ)言風(fēng)格規(guī)約熊痴、也有應(yīng)用工程規(guī)約和一部分設(shè)計(jì)規(guī)約)他爸。 這里羅列了一些常見(jiàn)面向語(yǔ)言的 Style Guide。

應(yīng)用工程規(guī)約關(guān)注點(diǎn)則更為落地:包括依賴(lài)管理果善、配置管理诊笤、應(yīng)用層次結(jié)構(gòu)、對(duì)外服務(wù)暴露約束岭埠,數(shù)據(jù)建模盏混,文檔注釋?zhuān)瑴y(cè)試管理, 甚至包含中間件使用規(guī)約惜论。 這些規(guī)約逐步從「如何表達(dá)代碼」延展到到「如何管理工程」许赃。 這塊發(fā)揮空間比較大,中大規(guī)模團(tuán)隊(duì)會(huì)有應(yīng)用框架組這樣團(tuán)隊(duì)馆类。 基于應(yīng)用框架對(duì)使用方式方法約束混聊。針對(duì)具體業(yè)務(wù)使用也會(huì)給出針對(duì)性建議。 這些定理總結(jié)出來(lái)往往以輕量 Best Practice 和重量級(jí)應(yīng)用框架對(duì)外輸出乾巧。

這里舉兩個(gè)例子說(shuō)明一下應(yīng)用工程規(guī)約應(yīng)該講清楚哪些問(wèn)題句喜。 第一個(gè)例子 alibaba/COLA 這個(gè)項(xiàng)目來(lái)說(shuō),它約束了整體工程結(jié)構(gòu)沟于,并且明確的通過(guò) Archetype 幫助(約束)用戶(hù)行為咳胃。 第二個(gè)例子是 RoR / Django 這類(lèi) RoR 框架,他們使用約定大于配置方式旷太,基于 ActiveRecord 這種模式約束了用戶(hù)如何使用框架展懈, 從 Model、Controller 到 Router供璧,對(duì)立面則是 Spring MVC / Flask 這類(lèi)框架存崖,幾乎只提供純技術(shù)特性,不約束開(kāi)發(fā)者行為睡毒。

除了阿里 Java 開(kāi)發(fā)手冊(cè)来惧,這里提供三個(gè)應(yīng)用工程規(guī)范供參考:

比工程規(guī)約更難定義的是設(shè)計(jì)范式,核心點(diǎn)是解決「如何做架構(gòu)決策」演顾。 設(shè)計(jì)范式?jīng)Q策過(guò)程在系統(tǒng)架構(gòu)設(shè)計(jì)和系分設(shè)計(jì)階段就應(yīng)當(dāng)完成了供搀。 如果設(shè)計(jì)范式差異性導(dǎo)致代碼在 Code Review 階段出現(xiàn)意見(jiàn)不一。 要么是這個(gè)團(tuán)隊(duì)過(guò)于草臺(tái)班子偶房,要么是這個(gè)項(xiàng)目架構(gòu)師/負(fù)責(zé)人在前期設(shè)計(jì)做的工作太少了趁曼。

當(dāng)一個(gè)團(tuán)隊(duì)遵循相近設(shè)計(jì)范式,意味著他們達(dá)到了同一級(jí)別技術(shù)儲(chǔ) 備棕洋,并形成了統(tǒng)一自頂向下設(shè)計(jì)打法挡闰。 在 Code Review 過(guò)程中,一些范式使用完全可以將 GoF23 / S.O.L.I.D. / DDD 這些術(shù)語(yǔ)概念拎出來(lái)。 相信 Commiter 和 Reviewer 可以基于業(yè)務(wù)場(chǎng)景快速達(dá)成一致摄悯。

方法論貼在墻上是無(wú)法解決開(kāi)發(fā)中中遇到設(shè)計(jì)問(wèn)題赞季,在代碼中真刀真槍干,Show me the fuck code奢驯。

Code Review 溝通協(xié)作機(jī)制

image from pixabay

除了工程規(guī)約申钩,還有一件事情往往會(huì)被忽略,如何解決沖突瘪阁? 這個(gè)沖突不是指代碼 Conflict撒遣,而是面對(duì)技術(shù)方案決策時(shí)候交流討論。

文無(wú)第一武無(wú)第二管跺,兩個(gè)秀才在一起能吵到天翻地覆面紅耳赤义黎。 技術(shù)層面 Augue 容易陷入我說(shuō)我有理你說(shuō)你有理局面。這種情況如何解決豁跑? 沒(méi)有一個(gè)好協(xié)作機(jī)制廉涕,會(huì)倒逼 Commiter 和 Reviewer 退縮,不能充分展開(kāi)討論艇拍。 這是我們不想看見(jiàn)狐蜕。

很多時(shí)候技術(shù)決策就是在 40% 正確性 和 60% 正確性中間選擇,看中長(zhǎng)期收益和短期收益就可能導(dǎo)致結(jié)論不一樣卸夕。 非黑既白反而不容易有爭(zhēng)論层释。想要促進(jìn)快速?zèng)Q策,一套沖突解決機(jī)制就不可缺少快集。 因此一定要在事前制定一套沖突解決機(jī)制湃累。大部分沖突解決都可以使用這么一套邏輯:數(shù)據(jù)、邏輯碍讨、民主、獨(dú)裁蒙秒。 當(dāng)需要進(jìn)行某個(gè)技術(shù)或者產(chǎn)品決策時(shí)候勃黍,最優(yōu)先方式是用數(shù)據(jù)來(lái)量化,證明自己觀點(diǎn)晕讲。 當(dāng)數(shù)據(jù)不充分時(shí)候覆获,可以進(jìn)行邏輯歸納推衍形成結(jié)論。 當(dāng)形成邏輯不能服眾眾說(shuō)紛紜時(shí)候瓢省,可以使用民主方式進(jìn)行裁決弄息。 當(dāng)民主也無(wú)法生效,就需要 Owner / 一號(hào)位力排眾議勤婚,進(jìn)行獨(dú)裁決策了摹量。

CodeReview 有這么幾種形式,同步離線、異步離線缨称、同步在線凝果。 處于同步形式 CodeReview 需要盡快處理掉 PR,這時(shí)候協(xié)作機(jī)制一定要干凈利索睦尽,避免大家在 PR 反反復(fù)復(fù)來(lái)來(lái)回回討論器净。 如果每個(gè) PR 都要消耗數(shù)次來(lái)回溝通,我建議將 CR 形式升級(jí)到同步在線当凡,拉個(gè)會(huì)議立刻將事情解決山害。

如果在一個(gè)實(shí)現(xiàn)方案上真無(wú)法決策,如果不涉及原則沿量,那我建議使用擱置爭(zhēng)議浪慌,使用 TODO @commiter what, how, when 方式先標(biāo)記意見(jiàn)和處理時(shí)間,先行將工程開(kāi)發(fā)往下推進(jìn)欧瘪。

一切準(zhǔn)備好了眷射,謝天謝地,終于可以進(jìn)入 Code Review 階段了佛掖。 我們下篇文章再來(lái)講進(jìn)入 Code Review 階段的事情妖碉。

原文鏈接: 淺談 Code Review 之事前準(zhǔn)備 - Log4D

3a1ff193cee606bd1e2ea554a16353ee

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市芥被,隨后出現(xiàn)的幾起案子欧宜,更是在濱河造成了極大的恐慌,老刑警劉巖拴魄,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冗茸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡匹中,警方通過(guò)查閱死者的電腦和手機(jī)夏漱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)顶捷,“玉大人挂绰,你說(shuō)我怎么就攤上這事》辏” “怎么了葵蒂?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)重虑。 經(jīng)常有香客問(wèn)我践付,道長(zhǎng),這世上最難降的妖魔是什么缺厉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任永高,我火速辦了婚禮隧土,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乏梁。我一直安慰自己次洼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布遇骑。 她就那樣靜靜地躺著卖毁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪落萎。 梳的紋絲不亂的頭發(fā)上亥啦,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音练链,去河邊找鬼翔脱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛媒鼓,可吹牛的內(nèi)容都是我干的届吁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼绿鸣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼疚沐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起潮模,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤亮蛔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后擎厢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體究流,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年动遭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芬探。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡厘惦,死狀恐怖灯节,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绵估,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布卡骂,位于F島的核電站国裳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏全跨。R本人自食惡果不足惜缝左,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧渺杉,春花似錦蛇数、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至倚评,卻和暖如春浦徊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背天梧。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工盔性, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人呢岗。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓冕香,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親后豫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悉尾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容