如何寫的一手好代碼
一 前言
在日常工作中,我經(jīng)常聽到部分同學(xué)抱怨代碼質(zhì)量問題,潛臺(tái)詞是:“除了自己的代碼,其他人寫的都是垃圾,得送到絞刑架上,重構(gòu)!”。今天就來聊一聊,如何寫的一手好代碼。要回答這個(gè)問題之前,得先弄清楚一個(gè)問題,好代碼的標(biāo)準(zhǔn)是什么?易閱讀,可擴(kuò)展,高內(nèi)聚,低耦合,編程范式,設(shè)計(jì)原則......,要求不少,卻很難度量。實(shí)則代碼和文章一樣,正所謂文無第一,武無第二。
這里不打算從規(guī)則寶典,最佳實(shí)踐等方面入手,因?yàn)槟菍⑾萑氲綗o數(shù)的規(guī)則細(xì)節(jié)中去,容易不得要領(lǐng)。這也是很多同學(xué),學(xué)了很多當(dāng)下最新技術(shù),掌握了N門編程語言,卻始終沒有明顯提升的原因。對(duì)于技術(shù)而言,底層的原理和運(yùn)行規(guī)律是根本,它和編程語言,語法等應(yīng)用層的重要程度是不一樣的,切記不要進(jìn)入這個(gè)誤區(qū)。
技能的掌握一般需要經(jīng)歷學(xué)習(xí)、模仿、思考、創(chuàng)新四個(gè)過程,下面就分幾個(gè)階段來探討一下,到底該如何快速學(xué)習(xí)成長(zhǎng)。
二 學(xué)習(xí)出來的代碼
學(xué)習(xí)意識(shí)
如果說人生有什么捷徑,尋找前人走出來的路,就算是捷徑了吧。前人需要花了幾年,甚至窮其一生研究的成果,擺在那里,用還是不用?答案應(yīng)該是肯定的,接下來要做的,只是如何把它們找出來,結(jié)合當(dāng)下的情形,在眾多的解決方案中選出行之有效的就可以了。 Henry Spencer曾說:“不懂 Unix 的人注定最終還要重復(fù)發(fā)明一個(gè)撇腳的 Unix”。
所以有必要建立這種意識(shí):有效的學(xué)習(xí)是降低目標(biāo)成本的最佳策略之一。這比自己摸著石頭過河,在時(shí)間成本上,會(huì)有很大的節(jié)省,這還沒考慮物質(zhì)和精力上的投入,各種試錯(cuò),就更劃算了。
選擇榜樣
既然是取經(jīng)學(xué)習(xí),就要學(xué)習(xí)優(yōu)秀的,成功的經(jīng)驗(yàn),如此,相同的精力投入,獲得的回報(bào)往往更高。半路出家,或者正在和你同行的都不是好的選擇,你不知道他們最終會(huì)不會(huì)誤入歧途。所以選擇榜樣時(shí),一定要跳出圈子,去找你能找到的最優(yōu)質(zhì)的的那些,你的選擇可以涵蓋歷史上,行業(yè)里,公司中各個(gè)維度。
學(xué)習(xí)的過程中,帶著批判的思維去消化,只有這樣才能改進(jìn)創(chuàng)新,所有的金科玉律都有其限定范圍,當(dāng)限定邊界打破了,之前的正確性,就值得你去懷疑。舉個(gè)例子,很多編碼規(guī)范里都有那么一條:“一行代碼長(zhǎng)度,不超過80個(gè)字符”。
它的來歷是這樣的:在很久很久以前,有一個(gè)很流行的人機(jī)交互接口(終端) 叫 VT100,用來處理字符/文本,后來其它的很多終端都是以它為標(biāo)準(zhǔn)。這個(gè)終端屏幕24行、80列,編輯器菜單還占了 4 行。所以,代碼編寫建議是一個(gè)邏輯的處理代碼,20行最佳、每行字符長(zhǎng)度不超過80列。目的就是為了可視性(目之所能及)、可維護(hù)性。而如今顯示終端的分辨率普遍提高了,所以升級(jí)調(diào)整規(guī)范并無不可,比如:“每行 120 個(gè)字符,每個(gè)函數(shù)體代碼 80 行以內(nèi)”。
所以,很多歷史經(jīng)驗(yàn),了解其背后的運(yùn)行邏輯,才能發(fā)揮出它原本的作用。
學(xué)以致用
大家常說萬事開頭難,究竟難在哪里?難在決心上,難在門檻上。決心可以通過痛點(diǎn)和目標(biāo)來牽引,門檻可以通過目標(biāo)拆解來降低。高質(zhì)量的完成某件事情,有很多科學(xué)的工具和方法,比如:PDCA循環(huán),SMART原則等,有興趣的,可以拓展學(xué)習(xí)。
這里想要表達(dá)的是,擁有痛點(diǎn)和目標(biāo)是能夠持之以恒的前提,因?yàn)樵趯W(xué)習(xí)實(shí)踐的過程中,能夠練習(xí)中進(jìn)行應(yīng)用,并能獲得真實(shí)反饋和回報(bào),這是能夠堅(jiān)持精進(jìn)的原動(dòng)力。否則就容易陷入,類似我們背誦四級(jí)應(yīng)用單詞‘’“abandon”的魔咒,也不知道從它開始背誦了多少遍了。
再舉個(gè)例子,我們需要做系統(tǒng)模塊解耦,調(diào)研下來,使用消息隊(duì)列MQ中間件,能夠很好的解決我們目前面臨的問題。
第一步,開始學(xué)習(xí)有關(guān)MQ的知識(shí),了解各種MQ中間件的適用場(chǎng)景,結(jié)合使用場(chǎng)景,給出具體中間件的選型;
第二步,將MQ中間件引入到我們的系統(tǒng)中。使用的過程,就是一個(gè)不斷發(fā)現(xiàn)問題,研究原因,修復(fù)問題,總結(jié)經(jīng)驗(yàn)的過程。
如果沒有真實(shí)的應(yīng)用場(chǎng)景,往往會(huì)始終停留在第一步,反復(fù)開始,直到失去耐心,最終放棄。
小結(jié)
想要寫好代碼,需要有學(xué)習(xí)的意識(shí),至少能夠知道什么樣的代碼是好的,什么樣的代碼是有改進(jìn)空間的。這種判斷能力,需要通過不斷的閱讀各種類型的代碼,從中找出榜樣。資料的來源可以是經(jīng)典書籍,好的開源項(xiàng)目,甚至是你身邊的優(yōu)秀項(xiàng)目。同時(shí)也需要規(guī)避一些誤區(qū):
工作上遇到的大部分問題,只要去尋找,都是有解決方案的。需要親自下場(chǎng)試錯(cuò),創(chuàng)造答案的場(chǎng)景,很少;
經(jīng)驗(yàn)都是有適用邊界的,照搬的經(jīng)驗(yàn)不一定就適合我們,這需要了解經(jīng)驗(yàn)背后的支撐邏輯,靈活的做出調(diào)整;
學(xué)習(xí)目標(biāo)的選擇是需要時(shí)機(jī)的,要有合適的實(shí)踐場(chǎng)景,否則,往往會(huì)事倍功半,甚至半途而廢;