首先要承認(rèn),大學(xué)畢業(yè)的時(shí)候我是個(gè)糟糕的程序員。 我拿到了學(xué)位,學(xué)到了一大堆書(shū)本知識(shí),然后,我開(kāi)始做一個(gè)不太重要的項(xiàng)目,每天晚上花大量的時(shí)間做簡(jiǎn)化。 起初,一切正常,但是我的代碼風(fēng)格一直在添亂。復(fù)制、粘貼、蹩腳的命名,混亂的思考,而且總用長(zhǎng)期連續(xù)運(yùn)行的方法,執(zhí)行各種各樣本可以分開(kāi)的任務(wù)。幾個(gè)月 之后,我意識(shí)到一個(gè)嚴(yán)峻的現(xiàn)實(shí):這個(gè)項(xiàng)目要崩潰了。原本我以為一個(gè)人開(kāi)發(fā),可以避免混亂。但是終不得不承認(rèn),這個(gè)項(xiàng)目被我弄得一團(tuán)糟,沒(méi)法維護(hù),更別說(shuō) 去理解了。
盡管我的代碼通常能正常運(yùn)行,但我確實(shí)在編碼時(shí)玩忽職守,因?yàn)槲覍?xiě)的代碼,不經(jīng)過(guò)仔細(xì)重構(gòu),沒(méi)人能看懂。那時(shí),我是個(gè)超高效的技術(shù)債務(wù)制造者。 你一定不想那樣。
再簡(jiǎn)單的問(wèn)題,一個(gè)糟糕的程序員都能把它變復(fù)雜?!猄teve Bohlen
哇,Steve是在說(shuō)我吧?我早期的項(xiàng)目就很好驗(yàn)證了這句話。沒(méi)有良好的實(shí)現(xiàn),再簡(jiǎn)單的邏輯都能變得晦澀難懂。早期的經(jīng)驗(yàn)讓我明白,我該研究下怎么改進(jìn)代碼風(fēng)格了。
什么是整潔的代碼?
代碼整潔是一種以讀者為中心的開(kāi)發(fā)風(fēng)格,以此開(kāi)發(fā)的軟件易于讀寫(xiě)和維護(hù)。開(kāi)發(fā)人員總以為他們的工作在應(yīng)用程序能夠正常運(yùn)行時(shí)就完成了。但是我們編寫(xiě)代碼,并不只是為了給計(jì)算機(jī)用。
編碼是一種和另外一個(gè)人交流你希望計(jì)算機(jī)做什么的藝術(shù)。–Nonald Knuth
保持代碼整潔,首先要意識(shí)到你的讀者不只是計(jì)算機(jī),還是活生生的人!牢記這個(gè)原則,我們來(lái)討論代碼整潔之所以重要的七個(gè)簡(jiǎn)單理由。
1. 你是個(gè)作家
想讓媽媽覺(jué)得你很厲害?告訴她你是個(gè)作家!作家就是那些練習(xí)寫(xiě)作并以此為職業(yè)的人。開(kāi)發(fā)人員每天都在寫(xiě)。但是作為開(kāi)發(fā)人員,我們總會(huì)忘記我們寫(xiě)的每一行代碼都會(huì)被人閱讀十遍以上。這些人,就是我們的同事。他們閱讀代碼,忙著修復(fù)漏洞和添加新的特性。
卓越的作家以寫(xiě)敘述清晰、扣人心弦的故事著稱(chēng)于世。他們使用諸如章節(jié)、標(biāo)題和段落等工具,有條理組織他們的想法,并耐心的引導(dǎo)讀者。開(kāi)發(fā)人員的工作模式也很類(lèi)似,只是他們簡(jiǎn)單的使用命名空間、類(lèi)和方法這些行話來(lái)講述故事罷了。
代碼整潔的人能夠聰明使用這些工具來(lái)降低復(fù)雜度,使故事變得清晰。
2. 代碼整潔是基礎(chǔ)
近年來(lái),專(zhuān)業(yè)的重構(gòu)、單元測(cè)試、測(cè)試驅(qū)動(dòng)的開(kāi)發(fā)等軟件實(shí)踐備受關(guān)注。這些實(shí)踐提升了代碼質(zhì)量和軟件的可維護(hù)性。實(shí)現(xiàn)代碼整潔的原則是一項(xiàng)基本技能, 它的優(yōu)勢(shì)會(huì)在進(jìn)行重構(gòu)代碼或者對(duì)代碼進(jìn)行單元測(cè)試時(shí)顯現(xiàn)。代碼整潔的原則使得源代碼高度模塊化并且易于閱讀和測(cè)試。如果將那些軟件實(shí)踐看作是房子的話,整 潔的代碼則是地基。
3. 證明你的技能
假設(shè)你正在參加一場(chǎng)技術(shù)面試。如果被問(wèn)到代碼質(zhì)量,為證明你的代碼質(zhì)量,你能夠舉出專(zhuān)業(yè)且合理的理由嗎?
或者,你會(huì)這樣回答?
如果這就是你關(guān)于代碼整潔所能想到的,那可是個(gè)壞兆頭。如果你從未有條有理的深入思考過(guò)代碼風(fēng)格的質(zhì)量問(wèn)題,那么你可以改進(jìn)的機(jī)會(huì)估計(jì)很多。代碼整 潔的人能夠傳授很多他們使用的具體行為、模式和技巧。但是,代碼整潔畢竟不是偶然現(xiàn)象,它要求可行的規(guī)律的專(zhuān)注于清晰的表達(dá)意圖。
能夠被衡量的東西,都能被管理?!?Peter Drucker
建立一個(gè)整潔代碼的詞匯表,不僅有利于面試和提升代碼質(zhì)量;而且,在代碼審查時(shí),建立大家公認(rèn)的代碼可讀性的詞匯表和框架,能夠促進(jìn)冷靜的對(duì)話。
4. 讀代碼才是難事
開(kāi)發(fā)人員常以能夠解決難題為傲。不過(guò)相對(duì)來(lái)講,寫(xiě)代碼比較簡(jiǎn)單,讀代碼才是件難事。這就是為什么 Eric Lippert 寫(xiě)文章說(shuō)閱讀代碼很難。 這也是為什么這么多的程序員寧愿重寫(xiě),也不愿做閱讀和理解已有的代碼這種苦差事。既然看代碼原本就很挑戰(zhàn),如果一些代碼你寫(xiě)的時(shí)候都只能勉強(qiáng)理解,你會(huì)發(fā) 現(xiàn)過(guò)后你一點(diǎn)都看不懂。專(zhuān)業(yè)的程序員寫(xiě)了太多的代碼,以至于只要間隔幾周,就能忘記大部分的結(jié)構(gòu)和設(shè)計(jì),像以全新的視角看這個(gè)項(xiàng)目。過(guò)段時(shí)間看不懂自己的代碼確實(shí)是很尷尬的事。相信我,我經(jīng)歷過(guò)好幾次。
5. 技術(shù)債務(wù)讓人沮喪
馬虎混亂的代碼會(huì)給我們的項(xiàng)目埋下技術(shù)債務(wù)。仔細(xì)考慮情境時(shí),技術(shù)債務(wù)也會(huì)是有用的,但是過(guò)度的技術(shù)債讓人沮喪,并且會(huì)導(dǎo)致團(tuán)隊(duì)的人才流失。當(dāng)簡(jiǎn)單 的事情變得復(fù)雜時(shí),開(kāi)發(fā)人員就會(huì)開(kāi)始撤退去別的地方了。他們更看重工作質(zhì)量帶來(lái)的成就感,而不是工作數(shù)量。技術(shù)債務(wù)會(huì)降低代碼重用的機(jī)會(huì),并且處處拉低其 他代碼庫(kù)的質(zhì)量。
6. 你太懶惰
PERL語(yǔ)言的作者Larry Wall說(shuō)過(guò)程序員的三大美德:懶、缺乏耐心、自大。是的,在合適的情境中,懶惰確實(shí)是積極因素。早些年,當(dāng)我還在跌跌撞撞的寫(xiě)代碼的時(shí)候,我認(rèn)識(shí)到保持代碼整潔所付出的艱辛真的會(huì)得到回報(bào)。專(zhuān)業(yè)的開(kāi)發(fā)人員努力做到正確的懶惰。這種懶惰是把更多的精力放到代碼中,以至于開(kāi)始時(shí)不難寫(xiě),以后也不會(huì)難以重用。 代碼整潔不會(huì)多花費(fèi)很多時(shí)間,而且一旦你掌握這些原則,你的編碼速度實(shí)際上會(huì)更快。因?yàn)榫珶挼?、表達(dá)充分的代碼大的優(yōu)點(diǎn)就是易于管理。
人們處于壓力中時(shí),容易偷工減料并且忽略佳做法。然而像Bob Martin大叔在他的《代碼整潔之道》中提醒我們的那樣:我們沒(méi)有時(shí)間不認(rèn)真。長(zhǎng)遠(yuǎn)來(lái)看,馬虎草率所增加的出錯(cuò)次數(shù)和后期的維護(hù)代價(jià),終會(huì)拖延項(xiàng)目速度。歷史經(jīng)驗(yàn)告訴我們,后期你基本不可能有時(shí)間再去整理你的代碼。所以為什么不在一開(kāi)始就好好做呢?
7. 不要成為那個(gè)動(dòng)詞
好吧,其他的原因都解釋的站得住腳,但是這個(gè)理由關(guān)鍵。大家都知道前同事的名字變成動(dòng)詞來(lái)描述“臟”代碼的事:糟糕,這些代碼是Jimmy寫(xiě)的?!癘h man, this code has been Jimmy’d.”
這樣的評(píng)價(jià),簡(jiǎn)直就是長(zhǎng)遠(yuǎn)就業(yè)前景的克星啊。我們都希望未來(lái)的職位上,同事能夠推薦或者錄用我們不是嗎?想要確保今后同事會(huì)推薦你,并且期待和你以及你的代碼合作,讓別人知道你的代碼整潔是好的方式。
代碼整潔的原則
以下是代碼整潔的三個(gè)核心原則:
1. 選擇正確的工具
2. 優(yōu)化信噪比
3. 盡大努力寫(xiě)出能夠自解釋的代碼
Cory在PluralSight的新課程代碼整潔之道:寫(xiě)代碼給人看詳細(xì)的闡述了這三個(gè)原則。如果你有興趣提升代碼質(zhì)量,建立評(píng)價(jià)和編寫(xiě)整潔代碼的詞匯庫(kù),去看看吧!
關(guān)于作者
Cory House,軟件架構(gòu)師,獨(dú)立顧問(wèn),Pluralsignht作者,INETA社區(qū)英國(guó)發(fā)展會(huì)議正式發(fā)言人。精通響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)、代碼整潔之道以及臭高爾夫球技。
——摘自開(kāi)源中國(guó)