客戶(hù)專(zhuān)線(xiàn):138-2888-3821
我們專(zhuān)注于高端品牌網(wǎng)站創(chuàng)意設(shè)計(jì)與開(kāi)發(fā)
當(dāng)開(kāi)始與其他工程師合作項(xiàng)目時(shí) code review 就變成了必做的功課之一,然而許多工程師大多走馬看花地瀏覽過(guò),不然就是大刀闊斧地把自己不順眼的地方大修特修。
而本文作者朱赟,現(xiàn)為美國(guó)硅谷 Airbnb 的資深工程師,向大家介紹了幾個(gè) code review 時(shí)應(yīng)該注意的細(xì)節(jié)與架構(gòu)。我認(rèn)為不管對(duì)初出茅廬,或是身經(jīng)百戰(zhàn)的工程師都有非常值得一看的價(jià)值。
之前寫(xiě)過(guò)一篇《寫(xiě)代碼的四個(gè)境界》,那個(gè)時(shí)候,大部分時(shí)候我還是愉快地寫(xiě)著自己的代碼。Code review 也是每天工作的一部分,但是相對(duì)而言花的時(shí)間還是有限的。
最近一是因?yàn)榻巧D(zhuǎn)換,二是突然來(lái)了很多新人?;ㄔ?code review 上的時(shí)間比寫(xiě)代碼多出了好多,也有一些心得和感觸,隨便寫(xiě)寫(xiě)吧。
總的說(shuō)來(lái),硅谷稍具規(guī)模的公司 code review 的流程都是比較規(guī)范的。模式也差不多。一來(lái)所有的 PR(見(jiàn)下批注)都必須有至少一個(gè)人 stamp,才能 merge。如果改的東西涉及到多個(gè)項(xiàng)目,則需要每個(gè)項(xiàng)目都有人 stamp 才行。還有一些特別關(guān)鍵的代碼,比如支付相關(guān)的,通常也會(huì)需要支付組的人 stamp 才行。
NOTE: PR (pull request, a set of changes someone tries to push to a GitHub repository. Once a PR is sent, interested parties (peer engineers) can review the set of changes, discuss potential modifications, and even push follow-up commits if necessary.
在 stamp 前,通常是 github page 上可以給出各種 comments,page 是共享的,所以誰(shuí)都能看到。有些 comments 是詢(xún)問(wèn),那么代碼作者直接回復(fù)或解釋就行。有些 comments 是指出代碼的問(wèn)題,這樣代碼作者可能會(huì)依此改動(dòng);也可能不同意,那就回復(fù) comments,有的時(shí)候關(guān)于一個(gè)實(shí)現(xiàn)細(xì)節(jié),討論的 comments thread 可以多達(dá)十幾條。這樣對(duì)于大家達(dá)成共識(shí)很有幫助。
以前遇到有朋友說(shuō):
「看到代碼寫(xiě)的太爛,覺(jué)得來(lái)回扯皮效率不高,干脆撲上去自己寫(xiě)?!?/p>
曾經(jīng)我也有過(guò)類(lèi)似的想法。不過(guò)最近遇到的一些事讓我慢慢地意識(shí)到這種想法很要不得。
首先就是從對(duì)方的角度來(lái)說(shuō)。對(duì)方寫(xiě)不好,可能是對(duì)業(yè)務(wù)不熟悉,可能是對(duì)語(yǔ)言不熟悉,也可能是對(duì)公司代碼的大架構(gòu)不熟悉。如果你是幫他/她「寫(xiě)」而不是耐心指出哪里有問(wèn)題,那么下一次,他/她可能還是不知道。不僅無(wú)益于別的人成長(zhǎng),有的時(shí)候甚至?xí)寗e人有挫敗感。
再然后就是這種方式的可擴(kuò)展性很差。即使 code review 會(huì)花掉哪怕十倍于你自己寫(xiě)的時(shí)間和精力,但它會(huì)讓人明白代碼應(yīng)該怎么寫(xiě),從長(zhǎng)遠(yuǎn)來(lái)看,這其實(shí)是在一定程度上「復(fù)制」你的生產(chǎn)力。你不能什么都自己寫(xiě)。尤其是你慢慢開(kāi)始帶項(xiàng)目、帶新人。每天 review 五個(gè)人的代碼,和寫(xiě)五個(gè)人的代碼,你覺(jué)得長(zhǎng)期而言哪個(gè)更合算?
此外,如果說(shuō)寫(xiě)代碼是一個(gè)學(xué)習(xí)過(guò)程,怎么做一個(gè)好的代碼審核人更是一個(gè)學(xué)習(xí)和成長(zhǎng)的過(guò)程。自己繞過(guò)一個(gè)坑不難,難的是看到別人那么走,遠(yuǎn)遠(yuǎn)地你就能告訴他/她那里有個(gè)坑。而他/她在經(jīng)你指出多次后,下一次他/她也會(huì)幫著指出別人的類(lèi)似的問(wèn)題。
這一點(diǎn)最近感觸尤為深刻。前一陣組里咔咔咔接二連三來(lái)了好多新人,老大說(shuō),你少寫(xiě)點(diǎn)代碼,多做點(diǎn) review。于是那幾天我?guī)缀豕ぷ鞯囊话霑r(shí)間都用來(lái)看代碼,寫(xiě) comments。可是最近就會(huì)發(fā)現(xiàn),他/她們相互之間大部分時(shí)候已經(jīng)可以很好的相互 review 了,于是我又騰出好一些時(shí)間來(lái)做別的工作。
Code review 做多了,發(fā)現(xiàn)其實(shí)也是有一定套路的,試著歸納如下:
代碼格式方面
很多公司都有 coding style guideline。大家的約定俗成,避免公司的代碼風(fēng)格不一致,也避免一些不不要的為了「要不要把閉括號(hào)另起一行」而無(wú)謂地爭(zhēng)論,除非是不小心,通常大家都不會(huì)弄錯(cuò)。但是新員工往往會(huì)在這方面還不太熟悉。這一類(lèi)問(wèn)題也比較容易指出。
代碼可讀性方面
這包括一個(gè)函數(shù)不要太長(zhǎng),太長(zhǎng)就 break down。所有的變量名盡量能夠說(shuō)明它的用意和類(lèi)型。比如 hosting_address_hash,一看就知道是房東地址,而且是個(gè) hash 類(lèi)型。不要有嵌套太多層的條件語(yǔ)句或者循環(huán)語(yǔ)句。不要有一個(gè)太長(zhǎng)的 boolean 判斷語(yǔ)句。如果一個(gè)函數(shù),別人需要看你的長(zhǎng)篇注釋才能明白,那這個(gè)函數(shù)就一定有重構(gòu)的空間。另外,如果不可避免有一些注釋?zhuān)瑒t一定要保證注釋準(zhǔn)確且與代碼完全一致。
幫代碼作者想想他/她有沒(méi)有漏掉任何 corner case
很多時(shí)候這是業(yè)務(wù)邏輯相關(guān)的,尤其需要比較老的工程師幫助指出需要處理的所有情況。
Error handling
這是最常見(jiàn)也是代碼審核最容易幫別人看出的問(wèn)題。舉個(gè)例子,下面一段簡(jiǎn)單到不能再簡(jiǎn)單的代碼就至少有三個(gè)潛在的問(wèn)題:params 里面需要 validate 是不是有 user_id 和 new_name 這兩個(gè) key;能不能找到這個(gè) user_id 對(duì)應(yīng)的 user;save 的時(shí)候會(huì)不會(huì)有 DB level 的 exception,應(yīng)該怎么處理。
測(cè)試?yán)头揽?/p>
測(cè)試?yán)挥谜f(shuō)了,每段代碼都應(yīng)該有測(cè)試?yán)?。但是?duì)于一些你能預(yù)見(jiàn)如果別人改動(dòng)代碼會(huì)引起可能問(wèn)題的情況,一定要額外的加測(cè)試?yán)乐惯@種事情的發(fā)生。這一點(diǎn)沒(méi)有例子參考也不太好說(shuō)。怎么寫(xiě)好測(cè)試?yán)旧砭椭档脤?xiě)一篇文章了。
小架構(gòu)
什么意思呢,就是一個(gè)文件或者類(lèi)內(nèi)部的代碼組織。比如如果有重復(fù)的代碼段,就應(yīng)該提取出來(lái)公用。不要在代碼里隨意設(shè)常數(shù),所有的常數(shù)都應(yīng)該文件頂部統(tǒng)一定義。哪些應(yīng)該是 private,等等
大架構(gòu)
這個(gè)就更廣了。包括文件組織,函數(shù)是不是應(yīng)該抽像到 lib 或者 helper 文件里;是不是應(yīng)該使用繼承類(lèi);是不是和整個(gè)代碼庫(kù)的風(fēng)格一致,等等。
當(dāng)然,視具體情況可能還有很多別的需要在 code review 中注意的。但是如果按照這個(gè) checklist 過(guò)一遍,一些明顯的問(wèn)題就可以避免個(gè)八九不離十了。
另外,代碼 review 和寫(xiě)代碼是我們每個(gè)工程師都應(yīng)該致力的兩個(gè)方面,缺一不可??赡茉诠ぷ髦械哪硞€(gè)階段或者某個(gè)項(xiàng)目里,你會(huì)花更多的時(shí)間在某一面,但長(zhǎng)久看來(lái),兩個(gè)技能缺一不可。
代碼審核是工作,不要抱有情緒化
我曾經(jīng)干過(guò)一件事,一個(gè)外組同事的代碼,別人已經(jīng) stamp 了,可是我覺(jué)得有問(wèn)題,于是把 stamp revert 掉了,在 comments 里寫(xiě)了為什么有問(wèn)題,和建議的改法。當(dāng)時(shí)心里還有點(diǎn)覺(jué)得好像怪得罪人的。可是后來(lái)發(fā)現(xiàn)同事反而很客氣地接受并道謝了。心里也是很感激有這樣的工作環(huán)境。
另外,經(jīng)常會(huì)遇到有些 review 的 comments 里出現(xiàn)不同意見(jiàn),其實(shí)是兩個(gè)人在編程習(xí)慣和約定俗成上沒(méi)有共識(shí)。如果在不違背公司 style guideline 的情況下,沒(méi)必要一定讓對(duì)方和你有一樣的習(xí)慣。如果你真的覺(jué)得這樣更好,通常我也只會(huì)寫(xiě)「I personally would prefer A over B, but no strong opinion.」或者「How about change it to A, since … However, this is not a merge blocker. 」
人都有不周到的時(shí)候。多幾雙眼睛一起幫你看一遍,就可以很大程度地減少代碼里的錯(cuò)誤。另外,相互 review 的過(guò)程中還能從彼此那里學(xué)到很多編程的小技巧和好習(xí)慣。細(xì)想來(lái),很多 Java 和 Ruby 的特別好用的 feature,我都是在 code review 的過(guò)程中學(xué)到的。
文章引用:http://www.lt-ad.com/new/201.html
本站文章為深圳網(wǎng)站建設(shè)·源美網(wǎng)絡(luò)原創(chuàng)策劃,如有版權(quán)糾紛或者違規(guī)問(wèn)題,請(qǐng)聯(lián)系我們刪除,謝謝!
上一篇: 支付寶回應(yīng)安全漏洞
售后保障
承諾任何問(wèn)題1小時(shí)內(nèi)解決數(shù)據(jù)備份
更安全、更高效、更穩(wěn)定價(jià)格公道精準(zhǔn)
項(xiàng)目經(jīng)理精準(zhǔn)報(bào)價(jià)不弄虛作假合作無(wú)風(fēng)險(xiǎn)
重合同講信譽(yù),無(wú)效全額退款