書山有路勤為徑--一個程序猿書蟲的進(jìn)階之路

學(xué)以致用

記得初來乍道的時候,師傅丟給我一本字典一般的《光同步數(shù)字傳送網(wǎng)》,叮囑我要像看金庸的武俠小說一樣看。我當(dāng)時不明就里的接過書,意想不到的是,這開啟了我的軟件閱讀時代。

《光同步數(shù)字傳送網(wǎng)》封面,轉(zhuǎn)自百度百科


此后,陸陸續(xù)續(xù)的看了不少書,從《Effective C++》系列到《設(shè)計(jì)模式》,從《程序開發(fā)心理學(xué)》到《大教堂與集市》。游歷其間,受益匪淺,故而樂此不疲。通過書,得以身臨其境的聆聽可望不可及的大牛們的諄諄教誨。他們?yōu)槲业闹该髁饲斑M(jìn)的方向,幫我一覽方塘上的天光云影。

以前讀過一本名為《如何閱讀一本書》的書,此書堪稱meta book。其中羅列的閱讀原則和技巧讓我受用不盡。此書開宗明義的要求讀者要主動的閱讀,作者好比棒球的投手,稱職的讀者則要接好來球?!氨M信書不如無書”,讀者要提問題,并努力在書中找到答案。我習(xí)慣在書上作筆記,有時把令我茅塞頓開的句子勾勒出來,有時在書的空白處寫幾句自己的看法,權(quán)當(dāng)是跟作者爭論一番。

不同的書讀的方式也不盡相同?!对O(shè)計(jì)模式》要腦洞大開般反復(fù)研讀,時常回頭再讀會有新的體會;《Clean Code》適合浮光掠影般通讀一遍,待用時仔細(xì)查閱。除了讀書,好網(wǎng)站也不能放過。訂閱code project每天推送郵件,逛逛stackoverflow.com和github.com,總會有驚喜。

借用Linus的名言--“Talk is cheap, show me the code”,書看多了,總有一種虛無感,這時需要結(jié)合代碼看。寫好代碼的第一步是模仿。在github.com fork牛人們的項(xiàng)目,看看他們是怎么命名函數(shù)和變量,怎么設(shè)計(jì)和組織類和函數(shù)。這都是很好的起點(diǎn)。在github找工作中主要使用的編程語言開源的單元測試框架,一邊學(xué)大牛的編程風(fēng)格,一邊學(xué)單元測試的玩法,一舉兩得。

我?guī)煾党私o我一本書,還告訴我他的學(xué)習(xí)經(jīng)驗(yàn):“書讀著讀著,靈光乍現(xiàn),就一通百通了”?;叵胛业膶W(xué)習(xí)過程,我發(fā)現(xiàn)僅僅讀是不夠。當(dāng)初我費(fèi)時費(fèi)力把龍書看完,沒多久就把工作中很少用到的詞法分析還給了作者。陸游詩云:“紙上得來終覺淺,絕知此事要躬行?!蔽疑钜詾槿弧?/p>

學(xué)以致用方是正途,這是一個螺旋上升的過程。上次做的PoE項(xiàng)目正是這樣一個過程。在剛分析的時候就想到了狀態(tài)機(jī)模式。但是從四人幫的書中只學(xué)到了類圖,對應(yīng)用場景和限制不甚了解。于是回頭惡?之,理順了基本思路。但是項(xiàng)目的場景跟書中描述總有些差異,于是在標(biāo)準(zhǔn)的類圖上又有針對性的修改了設(shè)計(jì)。在寫代碼過程中,對類的結(jié)構(gòu),限制和相關(guān)模式(如享元模式和職責(zé)鏈模式)的組合有了更深的體會,發(fā)現(xiàn)早期的設(shè)計(jì)有一些問題,于是又調(diào)整了結(jié)構(gòu)。項(xiàng)目完成完后,把自己的解決方案和標(biāo)準(zhǔn)方案對照玩味一番,對狀態(tài)機(jī)和設(shè)計(jì)模式的認(rèn)識更上一層樓了。

軟件是門實(shí)踐的學(xué)科。書本上的知識講得再好,也要運(yùn)用到實(shí)際工作中去驗(yàn)證。在實(shí)際運(yùn)用的時候,也許會發(fā)現(xiàn)有些地方行不通,需要調(diào)整;也許會體會到這個方法的好處而拍案叫絕;也許會發(fā)現(xiàn)這個方法跟其它方法的關(guān)聯(lián)性而找到一個更大的體系。然后將這些點(diǎn)點(diǎn)滴滴匯總起來,形成自己的經(jīng)驗(yàn)。這樣才能叫做真正學(xué)到東西,讓書上的知識真正變成自己的了。

快樂編程

前段時間參與了一個短片的拍攝,導(dǎo)演要我擺出痛苦編程的表情。我做得很不到位,被NG了好幾次。一則是因?yàn)槲也粫輧?nèi)心戲,二則是因?yàn)榫幊探o我的更多的是快樂。正是這份快樂指引我不停的學(xué)習(xí),不停的嘗試更有趣更高效的開發(fā)模式和更簡潔的編碼風(fēng)格。

雖然不太有機(jī)會選擇寫什么代碼,但是我們可以選擇如何寫好代碼。于是,在PoE項(xiàng)目中,我選擇了重新設(shè)計(jì)狀態(tài)機(jī)。在編碼初期,結(jié)合項(xiàng)目的發(fā)布策略(先要緊急發(fā)布演示版本,再發(fā)布正式版本),制定了迭代計(jì)劃,并選擇了TDD和gtest來保證質(zhì)量。在編碼中期,為了代碼更簡潔和更高的擴(kuò)展性,又重構(gòu)狀態(tài)機(jī)。還好前幾個迭代已經(jīng)搭好單元測試集,可以放心大膽的去重構(gòu)。

追求極致跟快樂工作和高效工作并不沖突,反而是相輔相成的。追求極致,在開發(fā)過程中需要多付出一些,但是與之相伴的快樂和成長,會證明汗水是值得的。而且開發(fā)質(zhì)量保證了,在后期的測試和維護(hù)都一馬平川,后期的工作量大大節(jié)省了。這樣就會進(jìn)入一種良性循環(huán)。工作越來越快樂和高效。

每個開發(fā)者都有特性交付后,“會當(dāng)臨絕頂,一覽眾山小”的興奮。但這股興奮勁往往來得太晚,去得太快。零星一閃,就淹沒在繁重而抓狂的調(diào)試和定位的汪洋中,似乎開發(fā)沒有快樂可言。我喜歡把大塊需求分解成一天就能看到成果的小任務(wù),比如一段代碼能編過,一個單元測試?yán)芘苓^。每天都能看到實(shí)實(shí)在在的進(jìn)步。日積月累,單元測試的綠條越來越多,就像玩RPG游戲,打怪升級,級別越來越高。每天的工作都快樂的結(jié)束,并期待第二天工作的開始。單元測試?yán)褪俏业膭渍拢粗鴿M眼的綠,醉人的綠啊,頗有一番洋洋自得的自豪感,而且每天都來過幾遍!這很容易上癮,我稱之為編程游戲。

Bob大叔(Robert C. Martin)一直戴著的綠色腕帶也有異曲同工之妙。這條腕帶上寫著:“test obsessed(沉迷測試)”。Bob大叔是世界項(xiàng)級的軟件開發(fā)大師,同時也是TDD的簇?fù)?,所以前面那句話更?zhǔn)確的說是“obsessed with test-driven development”。腕帶就像緊箍咒,戴上就取不下來。不過跟孫悟空不同,他是自愿的。這條腕帶代表了他的信仰和追求,提醒著他要寫出簡潔的代碼。

Bob大叔的腕帶

壽司之神小野二郎曾經(jīng)說過:“我總是向往能夠有所進(jìn)步,我繼續(xù)向上,努力達(dá)到巔峰,但沒人知道巔峰在哪”。每個人都有夢想,我既然已經(jīng)走到了軟件的路上,就會努力前行。讓我們把夢想照進(jìn)現(xiàn)實(shí),努力讓他生根發(fā)芽。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,284評論 25 708
  • 本文把程序員所需掌握的關(guān)鍵知識總結(jié)為三大類19個關(guān)鍵概念,然后給出了掌握每個關(guān)鍵概念所需的入門書籍,必讀書籍,以及...
    dle_oxio閱讀 11,207評論 6 244
  • 一路往北,高速路口前堵車了,堵了很長,我掃了一眼,大概有一公里的樣子,這種情況在信陽這個小城市,特別是高速路口這么...
    大地_行者閱讀 481評論 0 0
  • 語不驚人死不休,混沌之中一清流 透過迷霧一束光,留心處處皆學(xué)問 時之去兮不復(fù)返,寧缺毋濫之學(xué)時 不順耳之事尤多,時...
    萌龍?jiān)谔?/span>閱讀 216評論 0 1
  • 我要離開這里去遠(yuǎn)方 天空中告別聲振蕩 這座城市留下太多感傷 不去多想 不用多回望 遠(yuǎn)行的路還有微風(fēng)清涼 很迷茫 不...
    李承墨閱讀 451評論 1 3