
不想成為優(yōu)秀程序員的碼農(nóng),那和咸魚有什么區(qū)別?李清照有句詩:生當(dāng)作人杰,死亦為鬼雄。也許我們不必、也可能永遠(yuǎn)都不會是最優(yōu)秀的程序員,但我們至少可以成為一名職業(yè)的程序員。我們也想成為一名專業(yè)人士。
Chapter 1. 專業(yè)主義
作為一名“專業(yè)人士”,不僅僅是一種榮耀,它更多的意味著義務(wù),正所謂欲戴王冠,必承其重。當(dāng)項(xiàng)目中有某個“臨時工”犯了錯誤,他大可不必承擔(dān)責(zé)任,只需要攤攤手,說幾句自我安慰的話;如果是“職業(yè)”人員,你必須為自己寫的每一行代碼負(fù)責(zé),出了bug必須承擔(dān)相應(yīng)的責(zé)任。
“職業(yè)”的程序員也應(yīng)當(dāng)有自己的職業(yè)道德,Bob大叔把它概括為以下8點(diǎn):
- 了解你的領(lǐng)域
- 堅(jiān)持學(xué)習(xí)
- 練習(xí)
- 合作
- 輔導(dǎo)
- 了解業(yè)務(wù)領(lǐng)域
- 與雇主/客戶保持一致
- 謙遜
Chapter 2. Say No
職業(yè)的程序員敢于與現(xiàn)實(shí)抗?fàn)帲矣谡f“不”。尤達(dá)說過:“能就是能,不能就是不能。不要說‘試試看’”。如果某項(xiàng)任務(wù)你無法勝任,拒絕接受總比臨近交付日期才告訴產(chǎn)品經(jīng)理你無法完成好;同樣的,如果沒辦法在某個時間內(nèi)完成,就不要說“試試看”。試試看意味著你會嘗試著去完成,而大多數(shù)人都是樂觀主義者,這樣說無異于一種承諾。礙于情面的人也許覺得不妥,需要指出的是:“say no”并不意味著拒絕合作,而且為了團(tuán)隊(duì)更好的發(fā)展。
Chapter 3. Say Yes
如果你覺得“say no”讓你很難為情,那么,“say yes”(做出承諾)也很有挑戰(zhàn)性。做出承諾包含了三個步驟:
- 口頭上說自己將會去做
- 心里認(rèn)真對待做出的承諾
- 真正付諸行動
“職業(yè)的”程序員對自己做出的承諾會做到言必行,行必果,甚至承擔(dān)相應(yīng)的責(zé)任,職場上可不允許隨便說說而已。
Chapter 4. 編碼
“職業(yè)的”程序員應(yīng)該具備良好的編碼能力。代碼要整潔、符合規(guī)范,特別是在趕進(jìn)度的情況下。Bob大叔在《Clean Code》(《代碼的整潔之道》)中說到,一個外科醫(yī)生不會因?yàn)闀r間緊急而答應(yīng)病人的請求——不要洗手就做手術(shù),因?yàn)檫@樣并不是職業(yè)的做法(更別說犯罪)。同樣地,職業(yè)的程序員不會因?yàn)闀r間緊急就寫出混亂的代碼或者上百行代碼的函數(shù),這樣談不上快,只會讓進(jìn)度更加慢。整潔的代碼也需要從平時不斷的訓(xùn)練養(yǎng)成,這方面的書有《The Art of Readable Code》、Bob大叔的《Clean Code》、《Code Complete》。
Chapter 5. 測試
Bob大叔的書有一個特點(diǎn)(雖然我只看過兩本…),他會在不經(jīng)意中特別地插入測試方面的內(nèi)容??此臅紩DD有一定的了解,此處略去n個字……
不管是否采用TDD的方式,“職業(yè)的”程序員都必須具有一定的測試能力。最為開發(fā)人員,寫的最多就是單元測試,雖然單元測試不能保證程序一定不出錯,但是寫好的單測是對自己代碼負(fù)責(zé)的一種體現(xiàn)。如果代碼沒有測試過就簽入代碼庫,無異于放進(jìn)去一個定時炸彈?!禖ode Complete》里面介紹了一些辦法,可以在寫更少量的單測的情況下覆蓋到更多的代碼,例如結(jié)構(gòu)化的基礎(chǔ)測試。
Chapter 6. 預(yù)估
軟件開發(fā)過程中最常出現(xiàn)的問題就是延期交付,因?yàn)檫M(jìn)度延遲往往導(dǎo)致開發(fā)人員需要連續(xù)的加班,甚至通宵達(dá)旦的趕進(jìn)度,而這個日期很多時候都是由于項(xiàng)目組過于樂觀的預(yù)估。
-
時間預(yù)估——三元分析法
三元分析法是1957年美國海軍的潛艇極地航行計(jì)劃中的一部分內(nèi)容,是一種對預(yù)估的計(jì)算方法,這種技術(shù)簡單而有效,把預(yù)估變成概率分布。你可以更具三個數(shù)字預(yù)估某項(xiàng)任務(wù):- O:樂觀預(yù)估。這是非常樂觀的數(shù)字,也就是我們經(jīng)常說的最快時間,快到程序沒有異常,開發(fā)過程中不會出岔。實(shí)際上,為了保持樂觀預(yù)估有意義,這個數(shù)字對應(yīng)的概率應(yīng)當(dāng)小于1%(正常分布下具體數(shù)字是3個西格瑪或者0.13%)。
- N:標(biāo)稱預(yù)估。這個數(shù)字概率最大。如果畫一張柱狀圖,標(biāo)稱預(yù)估就是最高的那個。
- P:悲觀預(yù)估。這是最糟糕的數(shù)字,因?yàn)樗紤]到各種意外,比如颶風(fēng)啊,戰(zhàn)爭啊。為了保證這個數(shù)字有意義,它的概率也應(yīng)當(dāng)小于1%。
有了以上三個預(yù)估,我們可以這樣描述概率分布:
μ = (O+4N+P)/ 6
μ 是任務(wù)的期望完成時間。
σ = (P - O)/ 6
σ 是任務(wù)的概率分布的標(biāo)準(zhǔn)差,用來衡量不確定性。數(shù)字大就表示非常不確定。
所以一項(xiàng)任務(wù)的預(yù)估時間就是 μ/σ 。
Chapter 7. 壓力
書中有一段描述:
你看見自己躺在一張手術(shù)臺上,以為外科醫(yī)生給你做開胸手術(shù)。醫(yī)生竭力挽救你的性命,但是時間有限……
你期望醫(yī)生的表現(xiàn)如何?你希望他冷靜、井井有條嗎?你希望他清楚準(zhǔn)確地吩咐助手嗎?你希望他嚴(yán)格遵循當(dāng)初訓(xùn)練時的做法堅(jiān)守手術(shù)規(guī)程嗎?
還是想讓他汗流浹背、咒罵之聲不斷?想讓他亂扔手術(shù)器械、把東西摔的哐當(dāng)響嗎?想讓他滿腹怨氣責(zé)怪管理人員設(shè)定的不現(xiàn)實(shí)的手術(shù)時間,一直嚷嚷時間不夠用嗎?你期望他表現(xiàn)得像一名專業(yè)人士,還是像我們常見的某些開發(fā)人員的那種做派?
關(guān)于壓力,最好的做法就是避免壓力:
- 承諾:不要輕易做出承諾,承諾的時候也要正確地預(yù)估,避免過于樂觀。
- 保持整潔:快速前進(jìn)確保最后期限的方法就是保持整潔。專業(yè)人士不會為了快點(diǎn)兒亂來?!翱焖俚K亂”是自相矛盾的說法。
- 危機(jī)中的紀(jì)律:Bob大叔說過,觀察自己在危機(jī)時刻中的反應(yīng)就可以了解自己的信念。如果在危機(jī)中依然遵循你守持的紀(jì)律,就說明你確實(shí)相信那些紀(jì)律。選擇那些你在危機(jī)中依然會遵循的紀(jì)律原則,并且在所有工作中都遵守這些紀(jì)律。遵守這些紀(jì)律原則是避免陷入危機(jī)的最好途徑。
如果壓力已經(jīng)產(chǎn)生,不可避免的,“職業(yè)”的做法是不要驚慌,而是從容不迫、努力尋找解決方案,同時尋求幫助。
Chapter 8. 協(xié)作
大多數(shù)軟件都是靠團(tuán)隊(duì)開發(fā)出來的,單打獨(dú)斗與游離于團(tuán)隊(duì)之外都是不專業(yè)的表現(xiàn)。即使是Linus Torvalds這種單兵作戰(zhàn)能力超強(qiáng)的,也需要一堆優(yōu)秀程序員來幫忙維護(hù)Linux。想象一下deadline到來之前你拼了命趕進(jìn)度,恨不得多找?guī)讉€人來幫忙,這時候你是堅(jiān)定不移的相信團(tuán)隊(duì)開發(fā)這個守則的。那為什么平時卻不肯相信?
協(xié)作主要有兩點(diǎn):
- 與開發(fā)人員的協(xié)作:這要求我們按照規(guī)范寫好代碼、注釋和文檔,便于其他程序員更快理解。這也要求程序員要有良好的表達(dá)能力和寫作能力。Joel Spolsky在《軟件隨想錄》中給計(jì)算機(jī)系學(xué)生的建議中,第一條就是:畢業(yè)前練好寫作。
- 與雇主的協(xié)作:代碼應(yīng)該是為了業(yè)務(wù)服務(wù),有的開發(fā)人員只知道為了開發(fā)方便,隨意的砍需求,或者想出一些不切實(shí)際的想法。所以Joel的建議(3)是:畢業(yè)前學(xué)好微觀經(jīng)濟(jì)學(xué)。