解讀卓越程序員密碼
雨夜,北京,在家讀了《卓越程序員密碼》一書,覺得有一些內(nèi)容值得回味,所以寫了這篇讀書筆記。
卓越程序員密碼
本書的作者是Ka Wai Cheung,一看名字就知道是中國人,的確如此,作者名叫張家為,是一名程序員和設(shè)計(jì)師,同時(shí)也是美國芝加哥“We Are Mammoth”公司的聯(lián)合創(chuàng)始人,公司名稱翻譯成中文是“我們是猛犸”,很好玩的一個(gè)名字。
出于好奇,我看了We Are Mammoth的網(wǎng)站,網(wǎng)站設(shè)計(jì)的既有趣又有愛,可想而知,這是一家充滿活力的公司。如果大家有興趣,可以去那里瀏覽他們的公司主頁。
這本《卓越程序員密碼》,并不厚,全書總共只有157頁,分為9個(gè)章節(jié),分別是“引言”、“比喻”、“動力”、“生產(chǎn)力”、“復(fù)雜性”、“教學(xué)”、 “客戶”、“代碼”和“自豪感”。直到第8章才提到代碼,足以說明這本書其實(shí)并不是教你如何編程的,而是教你如何高效的出色的完成任務(wù)的。
言歸正傳,我們來看看這本書里哪些段落是值得回味和思考的。
本書的封面:
【思想相通】
在編程的世界里,我們會和各種各樣的“語言”打交道。雖然我主要的服務(wù)器端開發(fā)語言是C#,但我的工作方法卻幾乎可以完全應(yīng)用到Java、PHP、 Ruby和Python上。編程語言雖然有不同,但核心的編程思想、方法和架構(gòu)卻是高度類似的。我們只是用不同的方式來表達(dá)而已。
【普通人不了解編程】
大廚用不著琢磨烹飪要怎么比喻,肉湯要是太咸了,你一下就能嘗出來了;音樂家也不用這么拐彎抹角地描述歌曲,一個(gè)調(diào)子聽起來太老套,是因?yàn)槟阍缦染?聽過一樣的節(jié)奏。別人一下就明白了。然而,編程可不大一樣。普通人看不出來什么樣的代碼優(yōu)雅,什么樣得代碼一團(tuán)糟。我們這個(gè)行業(yè)非常新。人類做飯、創(chuàng)作音 樂、蓋房子都有幾千年了,可是考古學(xué)家還沒在巖壁上發(fā)現(xiàn)“人類坐在桌前打字”這種圖案。
【不要過度規(guī)劃】
在傳統(tǒng)的建筑行業(yè)中,規(guī)劃是至關(guān)重要的。因?yàn)橐ㄒ粋€(gè)摩天大樓,撤銷(ctrl-z)、剪貼(ctrl-x)和拷貝(ctrl-c)都是行不通的。 建筑上沒法享受這些簡潔而強(qiáng)勁的案件,所以需要非常詳盡的說明書。日進(jìn)斗金的房地產(chǎn)生意和災(zāi)難性得頭條新聞之間就只有一步之遙。所以,要是打算建造一棟摩 天大樓,把建筑說明書寫得詳細(xì)到讓人想吐才是最合理的做法。
反過來,這些就是我們這個(gè)行業(yè)獨(dú)有得奢華享受了。軟件組件又不需要等著本地的工廠發(fā)運(yùn)字母和數(shù)字。打字、編譯、測試,然后重復(fù)就行了。我們可以在實(shí) 際產(chǎn)品上測試代碼,而不用對著產(chǎn)品的某種模具測試。在開發(fā)過程中,我們可以看著懸索橋斷成千上萬次,在各種地方斷,在各種條件下斷,而不用擔(dān)心浪費(fèi)材料或 者鬧出人命。
在寫第一行代碼之前做出非常詳細(xì)的說明書仍然有些好處,但這沒能充分利用到這種媒介的優(yōu)勢。“規(guī)劃、規(guī)劃、規(guī)劃”過于強(qiáng)調(diào)要花大量時(shí)間計(jì)劃讓所有東西臻于完美,而忽視了可以用好實(shí)際寫代碼的工夫。
【扔掉舊代碼】
即使我確定要重新實(shí)現(xiàn)我前一陣子寫過的東西,早先注釋掉的東西一般來說也無論如何用不上。我可能把其他地方的邏輯動過了,舊代碼里面引用的對象或者方法可能也變了。比起重新干干凈凈地把代碼寫對,要把這舊代碼救活,我得花上更多的時(shí)間在那兒東敲西補(bǔ)。
不要把代碼囤積在注釋里,刪除代碼可以讓代碼庫精簡。眼前的頁面應(yīng)該精確地反映出軟件現(xiàn)在的工作方式,一分不多,一分不少。現(xiàn)在就扔掉舊代碼,在編 程中間就不用跳過一堆不相干得垃圾字節(jié)。我們以后也用不著去琢磨,這一大團(tuán)已經(jīng)注釋掉可看起來還很重要的代碼,到底還是不是那么重要。
【多元化勝于專業(yè)化】
在傳統(tǒng)的建筑行業(yè)里,讓電工兼任水泥澆筑工,或者讓鋪磚工去裝管道都是不現(xiàn)實(shí)的事情。他們都各有專長,各司其職。但把同樣的理念移植到我們這個(gè)行業(yè) 就不大站得住腳了。我們工作所用的工具無非就在眼前的這塊屏幕上。如果正在搞SQL,也用不著要換個(gè)地方才能寫HTML或者是在Photoshop里面弄 上一張圖,只要在計(jì)算機(jī)上切換程序就行了。編程的科目之間,沒有任何物理上的障礙。
【工作即福利】
在我們這個(gè)行業(yè)里,長久的動力并不來自于福利。當(dāng)然,高薪和免費(fèi)午餐確實(shí)不錯(cuò),能隨時(shí)玩玩桌上足球機(jī)也不賴。但歸根結(jié)底,長久的動力來自于我們所做 的工作。我所見到的每個(gè)有激情的程序員,在談?wù)撈鸾?jīng)過長時(shí)間苦苦思索才為技術(shù)問題找到的優(yōu)雅解決方案時(shí),都異常興奮,這比說起在公司編程大會上贏得10% 的加薪要興奮得多。
【福利可能是毀滅性的】
表面化的福利實(shí)際上會削弱人們工作的積極性。是的,在我們面前晃動的胡蘿卜可能讓我們更加沒有工作的激情。
傳統(tǒng)的商業(yè)激勵因素,比如大筆獎金,可能會成功調(diào)動員工的積極性,但只能用于那些簡單瑣碎的工作,類似于把數(shù)據(jù)從一張表填到另一張表這樣的工作。
相反,那些需要批判性分析和創(chuàng)造性解決方案的工作,就像我們每天面對的這些,把金錢獎勵掛在員工眼前晃悠則沒什么用處。在一些涉及高層次思考的實(shí)驗(yàn)中,金錢激勵和業(yè)績之間是負(fù)相關(guān):給一組特定研究對象的金錢獎勵越多,他們最后做的越糟。
#p#
【別在臥室里工作】
正如帕金森定律所說:“工作會不斷膨脹,直到占滿所有可用的時(shí)間之后才會完成。”由于我們可以在一天中的任何時(shí)間工作,所以可占用的時(shí)間就多了去了。每周40個(gè)小時(shí)的工作突然就變成了168小時(shí)的工作+睡覺+吃喝娛樂。
在家辦公是一種奢侈,如果你有幸享受這一點(diǎn)的話,千萬不要在臥室辦公,最好搞出一個(gè)封閉的房間,這樣就可以在工作時(shí)間結(jié)束后從那里離開,在門上掛上“打烊”的牌子,然后去享受生活中的其他樂趣,第二天再繼續(xù)工作。
這才是真正的生活。
【對閑散項(xiàng)目堅(jiān)決說不】
我們每個(gè)人都有一堆閑散項(xiàng)目,可能是寫了一半但從來沒完成的軟件,也可能是開始寫時(shí)干勁十足,但因出現(xiàn)更緊迫的事情而戛然而止的代碼。可以怪其他工作占用了時(shí)間,也可能是我們自己已然失去了興趣。
這類閑散項(xiàng)目本身沒有嚴(yán)格的時(shí)間限制,而且不成功也沒有什么關(guān)系,因此注定要失敗。如果它的發(fā)布日期不定,只是“未來某年某月某日”,很可能我們近期就不會去完成它。
三個(gè)月怎么樣?
Jack Dorsey用三個(gè)月開發(fā)了一個(gè)鮮為人知的短信服務(wù),他從構(gòu)思到發(fā)布第一版所花的時(shí)間還不到三個(gè)月,這個(gè)服務(wù)就是后來的Twitter。試想一下,如果他年復(fù)一年地開發(fā),而不是一旦開始就閃電發(fā)布,那么結(jié)果可能就大不一樣了。
【設(shè)定一個(gè)最后期限,即使是隨便設(shè)的】
制定了最后期限,工作才能得以完成,否則產(chǎn)品永遠(yuǎn)難見曙光。最后期限提升了工作的重要性。如果讓一個(gè)項(xiàng)目從幾個(gè)月拖到幾年,你的產(chǎn)品可能就失去了開始時(shí)所期待得價(jià)值了。
最后期限創(chuàng)造了一種緊迫感,敦促你沖過終點(diǎn)線。即使沒有人再逼迫你,它也能給你你所需的鞭策。
【去掉時(shí)間表中的細(xì)節(jié)】
我搞軟件開發(fā)十二年,從來沒見過一個(gè)項(xiàng)目是完全按計(jì)劃走的。
功能會變,未預(yù)料到的障礙會出現(xiàn)。有時(shí)候,我們預(yù)計(jì)花一個(gè)星期的事情,最后花了三個(gè)星期。不過,最常見的事情是我們把項(xiàng)目時(shí)間制定得過于詳細(xì),會讓 我們成為時(shí)間的奴隸。所以,開始做計(jì)劃的時(shí)候,要少計(jì)劃些細(xì)節(jié)。一個(gè)八周的項(xiàng)目,找出八個(gè)每周要交付的成果,而不是四十個(gè)每天要交付的東西。
如果時(shí)間表太詳細(xì),交付太頻繁,開發(fā)過程中就沒有做試驗(yàn)伙食重新考慮細(xì)節(jié)的余地。我們便只能嚴(yán)格遵守根據(jù)攝像出來的任務(wù)所設(shè)定的時(shí)間表,就好像被一 個(gè)無知的“微觀經(jīng)理”一直監(jiān)督著一樣。一旦有幾個(gè)小任務(wù)沒按時(shí)完成,整個(gè)時(shí)間表就轟然坍塌了。這一點(diǎn)也不會激發(fā)我們的積極性,好的軟件不是這么開發(fā)出來 的。
【團(tuán)隊(duì)是最寶貴的資產(chǎn)】
很多大公司都在兜售“人是我們最寶貴的資產(chǎn)”的陳詞濫調(diào),聽起來就惡心。這些公司同時(shí)在用胸牌編號標(biāo)識員工,用法購物卡的方式來挽救員工迅速消退的積極性,結(jié)果呢,還不是人員流動率居高不下。
說老實(shí)話,在我的小咨詢公司里,人不是最寶貴的資產(chǎn)。而隨著時(shí)間建立起來的工作關(guān)系才是最重要的。我已經(jīng)和幾乎同一批志趣相投的人一起工作了許多年,這種團(tuán)隊(duì)內(nèi)部的親密感意味著我們知道每個(gè)人喜歡的工作方式。
有些人喜歡細(xì)致周到地工作,每一行代碼都深思熟慮;有些人則粗枝大葉,再事后清理;有些人經(jīng)常需要獨(dú)自工作,單槍匹馬解決問題;而有些人則一上來就 需要協(xié)作。慢慢地,我們會以不同的方式互相彌補(bǔ),我們會適應(yīng)周圍的人。隨著時(shí)間的推移,我們開始凝聚在一起,真的是“凝”在一起。
【當(dāng)心“知識魔咒”】
一旦你成為了某個(gè)領(lǐng)域的專家,就幾乎不可能明白對這個(gè)領(lǐng)域一無所知是什么感覺。
想想你該如何向一個(gè)先天失明的人解釋是什么顏色,或者向先天失聰?shù)娜私忉屖裁词锹曇簟Ee個(gè)不那么極端的例子,想想律師吧,如果沒有各種抽象和限定,他就沒法準(zhǔn)確回答法律問題。
這種現(xiàn)象就稱為“知識魔咒”。
【為簡化不妨說謊】
當(dāng)你教一樣新東西的時(shí)候,不要認(rèn)為你所說的每一句話都必須是百分之百正確的。要把一個(gè)概念從一開始就將得非常完美,既不現(xiàn)實(shí),效果也不好。高級概念本來就難以理解,這也正是它成為高級概念的原因。
所以,在你成為專家之后,要先把你所在領(lǐng)域中那些錯(cuò)綜復(fù)雜的細(xì)枝末節(jié)舍掉。不要講那些“除了”和“但是要…”之類的特殊情況,因?yàn)樗鼈儸F(xiàn)在不那么重要。稍微把事實(shí)扭曲一點(diǎn)沒什么大不了的,講課時(shí),善意的謊言并不見得是件壞事。
【項(xiàng)目管理主要是人的管理】
好的開發(fā)人員是軟件領(lǐng)域的專家,而好的項(xiàng)目經(jīng)理是客戶領(lǐng)域的專家。他們和電話或郵件那頭的人形成了親密的工作關(guān)系。他們知道什么時(shí)候可以拖延,或者什么東西對于客戶來說是真正重要的。客戶工作對于項(xiàng)目經(jīng)理來說可能是一場情緒上的掙扎。
【代碼的迷人特質(zhì)】
代碼不會偷懶;
代碼不會嫌煩;
代碼很廉價(jià);
代碼不會遺忘;
代碼運(yùn)行很快;
可見,代碼才是有史以來最偉大得初級程序員。
==
【結(jié)語】
這本書里,包含了作者的很多感悟,其中一些思考和沉淀,不光對程序員有益,對于做很多事情都有指導(dǎo)作用。
如果有空,可以看看這本小書,再結(jié)合自己之前的工作體會,或許能有自己的一些理解和收獲!
謝謝!