論代碼審查的重要性

【編者按】本文作者為 Hugo Giraudel沙咏,主要從各個(gè)角度論證了代碼審查的重要性以及實(shí)現(xiàn)方法污筷。文章系國內(nèi) ITOM 管理平臺 OneAPM 編譯呈現(xiàn)帘睦。以下為正文疾党。

最近档泽,筆者在Twitter上看到這樣一句話:

可悲的是俊戳,對于很多學(xué)生、自由職業(yè)者以及機(jī)構(gòu)來說馆匿,代碼審查似乎相當(dāng)陌生抑胎。

很明顯,代碼審查的重要性并不為每個(gè)人所熟知渐北。你可以說我很天真阿逃,但是筆者確實(shí)認(rèn)為所有的IT公司都離不開該過程。顯然實(shí)際并非如此赃蛛,真是讓我大吃一驚恃锉。

在本文中,筆者想給出關(guān)于代碼審查的想法呕臂,以及為什么我認(rèn)為這是代碼遷移過程中非常重要的組成部分破托,怎樣進(jìn)行審查等。如果你目前不進(jìn)行代碼審查歧蒋,或者想要做得更好炼团,希望本文能有助于你!

什么是代碼審查疏尿?

我們生活在維基百科的時(shí)代瘟芝,所以開始之前,先引用一下其中關(guān)于代碼審查的定義:

代碼審查是計(jì)算機(jī)源代碼的系統(tǒng)性檢驗(yàn)(有時(shí)被稱為同行評審)褥琐。其目的在于找到開發(fā)初期所忽略的錯(cuò)誤锌俱,從而提高軟件的整體質(zhì)量。審查的形式多種多樣敌呈,如結(jié)對編程贸宏,非正式走查,正式檢查等磕洪。

顧名思義吭练,代碼審查就是審查一些代碼,以確保其能夠正常工作析显,并盡可能改善其性能鲫咽。

代碼審查的方法

正如維基百科中的定義,代碼審查有多種方法。然而分尸,目前太多的代碼都存在于GitHub上锦聊,代碼審查也就經(jīng)常伴隨著所謂的“pull request”出現(xiàn)。

Pull request是一個(gè)請求箩绍,使用分布式版本控制系統(tǒng)(Git孔庭、SVN、Mercurial等)對代碼庫作出修改材蛛。它通過“牽引”原代碼圆到、寫入更改,然后提交請求以便將更改合并卑吭。

得益于GitHub友好的用戶界面芽淡,這個(gè)過程變得非常簡單高效,GitHub也概括了大部分Git知識需求陨簇。

論代碼審查的重要性

為什么代碼審查非常重要

那么,既然我們可以不經(jīng)過任何審查與監(jiān)督迹淌,直接進(jìn)行代碼遷移河绽,為什么代碼審查還這么重要呢?畢竟唉窃,我們都能勝任該工作耙饰。

從理論上說是這樣。但在實(shí)踐中纹份,有很多原因可以表明代碼審查的重要性苟跪。讓我們來看看其中的幾個(gè)。

降低風(fēng)險(xiǎn)

這可能是最重要的原因蔓涧。有專人復(fù)核我們的工作并不是無關(guān)痛癢的件已,這能降低被忽視的錯(cuò)誤所帶來的風(fēng)險(xiǎn)。畢竟即使再好的開發(fā)人員也有可能一時(shí)失察元暴。

并且篷扩,確保沒有忘記任何事情總是有必要的。舉例來說茉盏,前端開發(fā)中經(jīng)常會(huì)忽略適當(dāng)?shù)逆I盤導(dǎo)航鉴未,屏幕閱讀器的可用性,適應(yīng)國際化的靈活性鸠姨,以及友好的非JavaScript行為等問題铜秆,在這里僅列出這四項(xiàng)。

顯著提高代碼質(zhì)量

清楚點(diǎn)說讶迁,這不是單純的代碼標(biāo)準(zhǔn)和代碼檢查(至少不全是)连茧,而是使代碼更高效。

在一個(gè)團(tuán)隊(duì)里,每個(gè)人都有自己的背景和特長梅屉,而團(tuán)隊(duì)始終需要進(jìn)步值纱。因此總有人可能提出更聰明的解決方案,更合適的設(shè)計(jì)模式坯汤,或者能降低復(fù)雜性或提高性能的方法虐唠。

使每個(gè)人都得到提高

通過合作,每個(gè)人都可以相互學(xué)習(xí)并取得進(jìn)步惰聂。提交代碼者很有可能從該工作中得到反饋疆偿,并意識到可能存在的問題和需要改進(jìn)的部分;而審查者也可以通過閱讀他人代碼學(xué)到新的東西搓幌,并找出適用于他們自己的工作方案杆故。

有助于熟悉項(xiàng)目

當(dāng)一個(gè)團(tuán)隊(duì)在做一個(gè)項(xiàng)目時(shí),想要每個(gè)開發(fā)人員致力于應(yīng)用的每個(gè)部分溉愁,這是極不可能的处铛。有時(shí)候,會(huì)出現(xiàn)這種情況:在某一段時(shí)間拐揭,一個(gè)開發(fā)人員正為項(xiàng)目的大部分模塊辛苦地工作撤蟆,而另一個(gè)人則完全在做別的東西。

因此堂污,代碼審查有助于人們了解其他人所寫家肯,但以后可能會(huì)需要自己來維護(hù)的那部分代碼。它促進(jìn)了代碼庫知識在團(tuán)隊(duì)中的傳播盟猖,也有可能加快未來的發(fā)展讨衣。

怎樣適當(dāng)?shù)剡M(jìn)行代碼審查

再次強(qiáng)調(diào),有固定的代碼審查過程非常有用式镐,非常重要反镇。不管用什么方法,每個(gè)團(tuán)隊(duì)創(chuàng)造的代碼都應(yīng)該進(jìn)行代碼審查娘汞。

話雖這么說愿险,但進(jìn)行有意義的代碼審查并不像看上去那么簡單明了。不過价说,別擔(dān)心辆亏,即使做得不好也不會(huì)有什么壞處,就是浪費(fèi)點(diǎn)時(shí)間鳖目。

最近扮叨,我的團(tuán)隊(duì)回顧了之前進(jìn)行的代碼審查。當(dāng)我們意識到12個(gè)開發(fā)人員中领迈,只有3個(gè)在做代碼審查時(shí)彻磁,我們就明白有些地方出了問題碍沐。

為了改變這種狀況,我們的一位 Scrum 專家組織了一次回顧分析衷蜓,以確定還可能改進(jìn)的空間累提,以及我們將怎樣改變。

提前規(guī)劃

代碼審查做得不夠磁浇,為了自圓其說斋陪,最常用的借口就是,它需要時(shí)間——其他人不能或不愿意在這上面花費(fèi)時(shí)間置吓。

我必須說无虚,筆者并不太理解這種說法,因?yàn)槲业挠^點(diǎn)是:如果一個(gè)同事直接來找我衍锚,讓我?guī)退拿τ烟猓揖筒粫?huì)說“我沒有時(shí)間,也不感興趣”戴质。反而度宦,我會(huì)抽空來幫忙,可能不是現(xiàn)在告匠,是一個(gè)小時(shí)之后——但是顯然戈抄,我會(huì)花時(shí)間幫助他們。為什么呢凫海? 因?yàn)椋?/p>

  • 這就是團(tuán)隊(duì)的意義呛凶;

  • 他們詢問我男娄,這是因?yàn)樗麄兛粗匚业囊庖娦刑埃@就值得我去幫助他們。

“為什么你不做代碼審查呢模闲?”
“我沒有時(shí)間建瘫。”

對筆者而言尸折,“pull request”和同事向我尋求幫助沒什么不同啰脚。有時(shí)候說你沒時(shí)間是可以接受的,但系統(tǒng)性地拒絕幫助別人实夹,就表明你正在積極地讓自己脫離團(tuán)隊(duì)橄浓。這種行為不友好,也不積極亮航。所以要肯花時(shí)間提供幫助荸实。

為了讓開發(fā)人員抽出時(shí)間,我們就開始考慮讓每個(gè)程序員每天花一點(diǎn)時(shí)間(也許30分鐘)審查代碼缴淋。我們完成每天半小時(shí)的代碼審查時(shí)也不會(huì)發(fā)現(xiàn)什么意外驚喜:這只是一天中的一部分准给。

我們以前還試著大幅度降低 “pull request”包含的代碼量泄朴。因?yàn)樵?jīng)的“pull request”非常多——幾十個(gè)文件中有數(shù)以千計(jì)的改動(dòng)。

我們現(xiàn)在盡量不那么做了露氮。通過創(chuàng)建較小的“pull request”祖灰,審查代碼變得更加容易,反饋也更加中肯畔规,開發(fā)人員也更愿意參與這個(gè)過程局扶。“代碼遷移量更小也更頻繁”油讯。

結(jié)合語境

我們發(fā)現(xiàn)的第二大問題是详民,我們通常缺乏對代碼背景的理解,如果你想要提供有用的反饋陌兑,這就很有必要沈跨。離開了代碼背景,我們通常也只能進(jìn)行語法檢查——這雖然在一定程度上也有用兔综,但遠(yuǎn)遠(yuǎn)不夠饿凛。這時(shí)候你就變成了我們所說的“人工審查器”。

幸好软驰,這個(gè)問題比較好解決:給pull request添加一個(gè)描述以解釋你的目的涧窒,如何達(dá)到目的。這不需要一大段文字锭亏,通常短短幾行足矣纠吴。將鏈接添加到and/or也會(huì)起作用。Liv Madsen是我們的一位開發(fā)者慧瘤,她甚至增加了截屏——或者相關(guān)的截屏視頻——來解釋她做的東西戴已,這令人稱奇。

論代碼審查的重要性

實(shí)際詢問

第三個(gè)問題就是我們有時(shí)干脆沒有意識到需要審查什么锅减。的確糖儡,我們每天都充斥著無數(shù)的電子郵件和通知 ——郵件太多了,因此很難保存怔匣。畢竟我們只是普通的人握联。

同樣,解決辦法很簡單:直接向別人詢問需要審查的代碼每瞒。這有很多方法金闽,比如在辦公室問一聲,或者直接在Slack上給你團(tuán)隊(duì)的同事發(fā)消息剿骨。

我們基于自己的活動(dòng)在GitHub上創(chuàng)建了群組代芜,當(dāng)提交pull request時(shí),總是ping一個(gè)群組懦砂。群組的成員都會(huì)收到通知蜒犯,并且只要有時(shí)間就可以自由地選擇如何解決组橄。有時(shí)候,當(dāng)請求特別針對某一個(gè)(或幾個(gè))人的工作時(shí)罚随,我們就直接ping相應(yīng)的開發(fā)人員玉工。

然后,收到ping消息的人就可以審查代碼并發(fā)表評論淘菩。即使沒有什么具體的事需要報(bào)告遵班,我們也會(huì)留言——表明代碼可以合并了。

因?yàn)槲覀兛赡軙?huì)不考慮已有的評論潮改,盲目合并一些pull request狭郑,所以就建立了嚴(yán)格的“回復(fù)或解決”制度。當(dāng)收到反饋時(shí)汇在,要么你把問題解決翰萨,要么在回復(fù)中解釋為什么不能解決。無論如何都不能留下懸而未決的評論糕殉,也當(dāng)然不能將其與pull request合并亩鬼。

總結(jié)

進(jìn)行定期和高效的代碼審查對于保持高質(zhì)量的代碼標(biāo)準(zhǔn)來說必不可少,還有利于開發(fā)者之間的知識共享阿蝶,以及團(tuán)隊(duì)的發(fā)展雳锋。

要求代碼審查并不意味著能力弱,請求他人的幫助也并不值得尷尬羡洁,代碼審查當(dāng)然也沒什么好羞愧的玷过。另一方面,接受你獲得的反饋筑煮,并給提交pull request的人提供建設(shè)性的(理想情況下辛蚊,積極的)的評論。

找到適合你的工作咆瘟。審查代碼應(yīng)該在代碼遷移過程中占很大比重嚼隘,所以你應(yīng)該在團(tuán)隊(duì)中適時(shí)調(diào)整诽里,以保證對每個(gè)人都有益袒餐。

最后祝各位能夠愉快地審查代碼!

本文系 OneAPM 工程師整理呈現(xiàn)谤狡。OneAPM 能為您提供端到端的應(yīng)用性能解決方案灸眼,我們支持所有常見的框架及應(yīng)用服務(wù)器,助您快速發(fā)現(xiàn)系統(tǒng)瓶頸墓懂,定位異常根本原因焰宣。分鐘級部署,即刻體驗(yàn)捕仔,性能監(jiān)控從來沒有如此簡單匕积。想閱讀更多技術(shù)文章盈罐,請?jiān)L問 OneAPM 官方技術(shù)博客

本文轉(zhuǎn)自 OneAPM 官方博客

原文鏈接:https://www.sitepoint.com/the-importance-of-code-reviews/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闪唆,一起剝皮案震驚了整個(gè)濱河市盅粪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悄蕾,老刑警劉巖票顾,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異帆调,居然都是意外死亡奠骄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門番刊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來含鳞,“玉大人,你說我怎么就攤上這事芹务∶裆梗” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵锄禽,是天一觀的道長潜必。 經(jīng)常有香客問我,道長沃但,這世上最難降的妖魔是什么磁滚? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮宵晚,結(jié)果婚禮上垂攘,老公的妹妹穿的比我還像新娘。我一直安慰自己淤刃,他們只是感情好晒他,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逸贾,像睡著了一般陨仅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铝侵,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天灼伤,我揣著相機(jī)與錄音,去河邊找鬼咪鲜。 笑死狐赡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疟丙。 我是一名探鬼主播颖侄,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼鸟雏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了览祖?” 一聲冷哼從身側(cè)響起崔慧,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎穴墅,沒想到半個(gè)月后惶室,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡玄货,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年皇钞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片松捉。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡夹界,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出隘世,到底是詐尸還是另有隱情可柿,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布丙者,位于F島的核電站复斥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏械媒。R本人自食惡果不足惜目锭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纷捞。 院中可真熱鬧痢虹,春花似錦、人聲如沸主儡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽糜值。三九已至丰捷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間臀玄,已是汗流浹背瓢阴。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工畅蹂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留健无,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓液斜,卻偏偏與公主長得像累贤,于是被迫代替她去往敵國和親叠穆。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評論 25 707
  • 多種多樣的工作流使得在項(xiàng)目中實(shí)施Git時(shí)變得難以選擇臼膏。這份教程提供了一個(gè)出發(fā)點(diǎn)硼被,調(diào)查企業(yè)團(tuán)隊(duì)最常見的Git工作流。...
    JSErik閱讀 4,372評論 2 8
  • 子曰:“君子周而不比渗磅,小人比而不周嚷硫。” 什么是小人始鱼?現(xiàn)在認(rèn)為小人是溜須拍馬仔掸,攀權(quán)附貴、兩面三刀医清,陽奉陰違起暮、挑撥離間...
    劉向雄_閱讀 995評論 0 0
  • 一大群身著墨黑色西服的人端正地坐在小教堂里负懦;他們跟遮掩住你的面容的雪白木材形成鮮明的對比。我無法得知你最后的表情柏腻;...
    NoticeLotus閱讀 164評論 0 0
  • 冬日暖陽纸厉,安靜溫和,陽光下一切都那么真實(shí)五嫂,久久注視身旁忙碌認(rèn)真的x峰...哪來的動(dòng)力残腌? 題不會(huì),我要考上. 考...
    苦瓜噗閱讀 220評論 0 0