資料介紹
一、目的是什么
做任何事情都要有一個(gè)目的,那么我們做code review的目的是什么呢?本來(lái)開(kāi)發(fā)工期就非常緊了,特別是身處中國(guó)這個(gè)大環(huán)境下的互聯(lián)網(wǎng)公司,老板恨不得要你二十四小時(shí)連軸轉(zhuǎn),為什么還要花那么多時(shí)間去做code review呢?我認(rèn)為code review的目的在于提升代碼質(zhì)量。
前幾天看了篇文章,里面有這么一段對(duì)我觸動(dòng)很大:
在這種業(yè)務(wù)需求緊張的模式下,F(xiàn)acebook一些開(kāi)源技術(shù)方案是如何產(chǎn)出的,是非業(yè)務(wù)團(tuán)隊(duì)專(zhuān)門(mén)做的么?
我想說(shuō)的是即使業(yè)務(wù)需求緊張,也一樣把代碼好好寫(xiě)好,另外有牛逼的tech lead和嚴(yán)格的code review,總的質(zhì)量也不是很差。國(guó)內(nèi)有一點(diǎn)很不好:經(jīng)常沒(méi)有code review;而且技術(shù)人員觀(guān)念不好,把要寫(xiě)的代碼當(dāng)差事,只要能完成能用就好。所以就越來(lái)越操。
(Code review一直是硅谷一線(xiàn)互聯(lián)網(wǎng)公司的質(zhì)量控制法寶,從Apple到Google,從Facebook到現(xiàn)在的Airbnb和Uber。可悲的是,國(guó)內(nèi)的人都太聰明,覺(jué)得這東西沒(méi)用繁瑣,而且減慢開(kāi)發(fā)速度。有時(shí),我們就是太過(guò)聰明。)
所以我們不要總是拿沒(méi)時(shí)間來(lái)當(dāng)做借口,如果對(duì)代碼質(zhì)量沒(méi)有一定的追求,給再多時(shí)間也是沒(méi)用的。業(yè)務(wù)需求緊張需要通過(guò)提高工作效率來(lái)解決,而不是不花精力提高代碼質(zhì)量。另外,站在一個(gè)項(xiàng)目的生命周期來(lái)看,寫(xiě)爛代碼真的會(huì)比寫(xiě)好代碼花的時(shí)間更少么?
二、好代碼最重要的特征是什么?
既然做code review的目的是提高代碼質(zhì)量了,那么什么樣的代碼才能算是好的代碼呢?最開(kāi)始這個(gè)標(biāo)題我寫(xiě)的是「什么樣的代碼才是好代碼?」,后來(lái)我想了下這個(gè)問(wèn)題太大,我無(wú)法對(duì)「好代碼」簡(jiǎn)單的下一個(gè)定義,真正討論起來(lái)估計(jì)得單獨(dú)寫(xiě)一篇文章了,所以先按住這個(gè)話(huà)題,換成簡(jiǎn)單的「好代碼的最重要的特征是什么?」。
我覺(jué)著好代碼最重要的特征是可讀性強(qiáng),這樣才能讓和你協(xié)作的同學(xué)以及未來(lái)的你自己能夠不用想太多就能看得懂,畢竟花在維護(hù)代碼上的時(shí)間要遠(yuǎn)遠(yuǎn)超過(guò)寫(xiě)這段代碼花的時(shí)間。每新增一行代碼就會(huì)多增加一份維護(hù)成本,而可讀性強(qiáng)的代碼可以把維護(hù)成本降到最低。
那么我們?cè)鯓觼?lái)定義這個(gè)可讀性強(qiáng)呢?每個(gè)人都有自己的標(biāo)準(zhǔn),怎樣才能在團(tuán)隊(duì)里讓大家都認(rèn)可呢?微博的一位工程師在他寫(xiě)的《關(guān)于爛代碼的那些事》這樣寫(xiě)到:
在很多跟代碼質(zhì)量有關(guān)的書(shū)里都強(qiáng)調(diào)了一個(gè)觀(guān)點(diǎn):程序首先是給人看的,其次才是能被機(jī)器執(zhí)行,我也比較認(rèn)同這個(gè)觀(guān)點(diǎn)。在評(píng)價(jià)一段代碼能不能讓人看懂的時(shí)候,我習(xí)慣讓作者把這段代碼逐字翻譯成中文,試著組成句子,之后把中文句子讀給另一個(gè)人沒(méi)有看過(guò)這段代碼的人聽(tīng),如果另一個(gè)人能聽(tīng)懂,那么這段代碼的可讀性基本就合格了。
用這種判斷方式的原因很簡(jiǎn)單:其他人在理解一段代碼的時(shí)候就是這么做的。閱讀代碼的人會(huì)一個(gè)詞一個(gè)詞的閱讀,推斷這句話(huà)的意思,如果僅靠句子無(wú)法理解,那么就需要聯(lián)系上下文理解這句代碼,如果簡(jiǎn)單的聯(lián)系上下文也理解不了,可能還要掌握更多其它部分的細(xì)節(jié)來(lái)幫助推斷。大部分情況下,理解一句代碼在做什么需要聯(lián)系的上下文越多,意味著代碼的質(zhì)量越差。
逐字翻譯的好處是能讓作者能輕易的發(fā)現(xiàn)那些只有自己知道的、沒(méi)有體現(xiàn)在代碼里的假設(shè)和可讀性陷阱。無(wú)法從字面意義上翻譯出原本意思的代碼大多都是爛代碼,比如“ms代表messageService“,或者“ms.proc()是發(fā)消息“,或者“tmp代表當(dāng)前的文件”。
我很認(rèn)可這個(gè)說(shuō)法,在這個(gè)基礎(chǔ)上,我一直堅(jiān)持認(rèn)為雖然一個(gè)能把一件事情描述清楚的人寫(xiě)的代碼不一定可讀性強(qiáng),但是一個(gè)無(wú)法將一件事情描述清楚的人寫(xiě)出來(lái)的代碼可讀性肯定很差。
三、那么,該怎樣做呢?
說(shuō)了那么多了,具體怎樣落地到現(xiàn)實(shí)工作中呢?即使按照前文所說(shuō)的把代碼逐字翻譯成中文講給其他同學(xué)聽(tīng),也一樣可能由于認(rèn)知問(wèn)題導(dǎo)致對(duì)方聽(tīng)不懂,比如你認(rèn)為很基礎(chǔ)的概念可能別人并不了解。所以我認(rèn)為大家要遵循一些基本原則,這樣才能有效的溝通。
3.1 SOLID原則
這是面向?qū)ο蟮奈鍡l基本原則,我列在下面,在這里就不展開(kāi)來(lái)說(shuō)了
Single responsibility principle
Open/closed principle
Interface segregation principle
Dependency inversion principle
3.2 Don’t Repeat Yourself
一般對(duì)這條原則的理解是對(duì)于同樣的功能不要直接copy原來(lái)的代碼,而是要抽象出一個(gè)公用的方法。但是實(shí)際上對(duì)同樣的功能用不同的思路或者代碼去實(shí)現(xiàn)也是一種浪費(fèi)。比如常見(jiàn)的日志處理、異常處理邏輯。
3.3 Prefer Composition to Inheritance
這條原則跟前面提到的OOP的SOLID原則里面的Interface segregation principle有點(diǎn)重合之處。隨著業(yè)務(wù)需求的不斷迭代,小的組件逐漸會(huì)演變成大的組件,在這個(gè)過(guò)程中駕馭的難度會(huì)逐步提升,而如果在不斷迭代的過(guò)程中不斷抽象出小的組件,則可以在業(yè)務(wù)功能復(fù)雜的同時(shí)保持代碼的簡(jiǎn)潔。比如不管是飛機(jī)還是汽車(chē)火車(chē)都是會(huì)移動(dòng)的,而我在使用時(shí)只需知道這個(gè)對(duì)象是可移動(dòng)的即可,至于這個(gè)對(duì)象是飛機(jī)還是汽車(chē)我并不關(guān)心。
3.4 編碼規(guī)范
這個(gè)不多說(shuō)了,可以采用一些行業(yè)里優(yōu)秀的編碼規(guī)范。但是要注意的一點(diǎn)是規(guī)范的作用是保持項(xiàng)目編碼風(fēng)格的統(tǒng)一,不要在規(guī)范上做無(wú)意義的爭(zhēng)論。
3.5 如果不具備抽象的能力,那就重復(fù)吧
這是一個(gè)比較殘酷的也比較常見(jiàn)的現(xiàn)實(shí),看了一大摞的書(shū)廢了老大的勁終于抽象出了一個(gè)組件,但是最后的結(jié)果卻是加大了維護(hù)成本。所以如果你覺(jué)著無(wú)法很好的去抽象,就直接用最粗魯?shù)闹貜?fù)代碼吧,畢竟這樣別人還能看得懂,比抽象出來(lái)后還要再寫(xiě)一大堆的if else好多了。
四、技術(shù)之外的tips
在技術(shù)之外還有一些要注意的點(diǎn),首先最重要的就是要有一個(gè)開(kāi)放的心態(tài),review的是代碼,而不是具體的人,不要因?yàn)閷?duì)方的review而感覺(jué)羞恥,當(dāng)然也不要進(jìn)行人身攻擊。
其次,要把握review的粒度,不要一下發(fā)起一個(gè)非常大的PR,這樣會(huì)給review的同學(xué)特別大的壓力。比如一個(gè)PR里最好不要同時(shí)既有重構(gòu)又有新特性的開(kāi)發(fā),或者憋到最后這個(gè)版本都要開(kāi)發(fā)完了才一起提交一個(gè)PR。review應(yīng)該是在平時(shí)的工作中持續(xù)進(jìn)行的,而不是類(lèi)似里程碑的總結(jié)之類(lèi)的東西。
第三,code review不應(yīng)該承擔(dān)發(fā)現(xiàn)業(yè)務(wù)邏輯錯(cuò)誤的責(zé)任,也就是平常我們所說(shuō)的bug,bug應(yīng)該由單元測(cè)試、功能測(cè)試、性能測(cè)試等方法來(lái)保證,不要賦予code review太多的責(zé)任。
- 關(guān)于藍(lán)橋杯單片機(jī)開(kāi)發(fā)板矩陣鍵盤(pán)的一些坑
- 一些關(guān)于射頻板PCB的布局、布線(xiàn)原則資料下載
- 學(xué)習(xí)單片機(jī)的一些心得體會(huì)
- 使用16位單片機(jī)C語(yǔ)言實(shí)現(xiàn)PID調(diào)速的一些心得體會(huì)
- 關(guān)于單片機(jī)的一些按鍵問(wèn)題和代碼詳細(xì)資料總結(jié)
- 如何生成簡(jiǎn)單脈寬調(diào)制所需的基本步驟帶你了解一些基本nhet模塊的操作 17次下載
- Code Composer Studio入門(mén)指南(修訂版) 36次下載
- PIC單片機(jī)的一些學(xué)習(xí)心得與總結(jié) 12次下載
- 關(guān)于信息治理與云的一些事實(shí) 0次下載
- 關(guān)于PID一些常用知識(shí) 2次下載
- 關(guān)于畫(huà)高頻PCB板的一點(diǎn)心得 0次下載
- 關(guān)于續(xù)流二極管的一些問(wèn)題 23次下載
- 關(guān)于紅外通信的一些問(wèn)題知識(shí)點(diǎn) 4次下載
- C++面向?qū)ο?b class="flag-6" style="color: red">關(guān)于MFC的一些簡(jiǎn)單應(yīng)用和總結(jié) 1次下載
- 關(guān)于單形體積的一些不等式
- 如何使用Polyspace Code Prover來(lái)統(tǒng)計(jì)堆棧 243次閱讀
- 分享一些SystemVerilog的coding guideline 558次閱讀
- 談一談開(kāi)發(fā)團(tuán)隊(duì)代碼質(zhì)量如何管控與提升 455次閱讀
- 通過(guò)RealSense代碼說(shuō)明一些C語(yǔ)言問(wèn)題 604次閱讀
- INCA的一些用法 7959次閱讀
- 一些對(duì)OpenMP進(jìn)行優(yōu)化的方法 1575次閱讀
- get與post的請(qǐng)求一些區(qū)別 1281次閱讀
- 寫(xiě)Java代碼的一些技巧分享 1249次閱讀
- usb通信的一些基礎(chǔ)知識(shí) 4326次閱讀
- 一些在文本數(shù)據(jù)量不夠大的時(shí)候可用的一些實(shí)用方法 6578次閱讀
- 一些能夠解決生活中一些具體問(wèn)題的常用算法的整理集合 1.7w次閱讀
- 關(guān)于二叉樹(shù)一些數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目 3112次閱讀
- 根據(jù)研發(fā)經(jīng)歷談?wù)劅o(wú)人駕駛的一些實(shí)踐與心得 1.8w次閱讀
- 學(xué)習(xí)管理 docker 容器的一些命令 4216次閱讀
- 設(shè)計(jì)達(dá)人分享干貨:LED驅(qū)動(dòng)設(shè)計(jì)心得 1611次閱讀
下載排行
本周
- 1電子電路原理第七版PDF電子教材免費(fèi)下載
- 0.00 MB | 1490次下載 | 免費(fèi)
- 2單片機(jī)典型實(shí)例介紹
- 18.19 MB | 92次下載 | 1 積分
- 3S7-200PLC編程實(shí)例詳細(xì)資料
- 1.17 MB | 27次下載 | 1 積分
- 4筆記本電腦主板的元件識(shí)別和講解說(shuō)明
- 4.28 MB | 18次下載 | 4 積分
- 5開(kāi)關(guān)電源原理及各功能電路詳解
- 0.38 MB | 10次下載 | 免費(fèi)
- 6基于A(yíng)T89C2051/4051單片機(jī)編程器的實(shí)驗(yàn)
- 0.11 MB | 4次下載 | 免費(fèi)
- 7藍(lán)牙設(shè)備在嵌入式領(lǐng)域的廣泛應(yīng)用
- 0.63 MB | 3次下載 | 免費(fèi)
- 89天練會(huì)電子電路識(shí)圖
- 5.91 MB | 3次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費(fèi)
- 2PADS 9.0 2009最新版 -下載
- 0.00 MB | 66304次下載 | 免費(fèi)
- 3protel99下載protel99軟件下載(中文版)
- 0.00 MB | 51209次下載 | 免費(fèi)
- 4LabView 8.0 專(zhuān)業(yè)版下載 (3CD完整版)
- 0.00 MB | 51043次下載 | 免費(fèi)
- 5555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33562次下載 | 免費(fèi)
- 6接口電路圖大全
- 未知 | 30320次下載 | 免費(fèi)
- 7Multisim 10下載Multisim 10 中文版
- 0.00 MB | 28588次下載 | 免費(fèi)
- 8開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21539次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935053次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537791次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233045次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191183次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183277次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138039次下載 | 免費(fèi)
評(píng)論
查看更多