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