2017年最后一周,我按計(jì)劃把《The Clean Coder》讀完了,大約100頁(yè)左右。
第6章?練習(xí)
這一章的內(nèi)容是專(zhuān)業(yè)人士如何刻意練習(xí)。Bob大叔提到40年來(lái)他使用的電腦綜合性能(內(nèi)存硬盤(pán)容量和速度,顯示分辨率的提升;提及能耗價(jià)格等的縮減)提升了10的22次方倍,但是實(shí)際上計(jì)算機(jī)程序的本質(zhì)并沒(méi)有變化,是可以通過(guò)一些基礎(chǔ)程序的練習(xí)來(lái)不斷提升自己的技能的。為了讓22次方更形象,Bob大叔用了一個(gè)喬布斯經(jīng)常用的技巧,把它轉(zhuǎn)換成人可以理解的其他東西:是從這里到半人馬座阿爾法星的距離(以埃為單位),是1美元硬幣里的電子數(shù),是地球質(zhì)量與個(gè)人質(zhì)量的比例。
今天,編譯不再需要程序員等待?,F(xiàn)在仍然有些程序員必須等待構(gòu)建,這是悲劇,也是不夠仔細(xì)的征兆。如今,構(gòu)建時(shí)間應(yīng)該用秒來(lái)衡量,而不是分鐘,更不是小時(shí)。
構(gòu)建時(shí)間這么細(xì)節(jié)的問(wèn)題體現(xiàn)了專(zhuān)業(yè)性,比如前段時(shí)間大家關(guān)注解決的flex編譯時(shí)間的問(wèn)題,只是通過(guò)申請(qǐng)更好的機(jī)器就把整個(gè)項(xiàng)目的編譯時(shí)間從90分鐘縮減到20分鐘,這應(yīng)該是最便宜的投資了。不過(guò)還沒(méi)達(dá)到Bob大叔說(shuō)的秒級(jí)構(gòu)建的水平,這里還有進(jìn)一步提升的空間,但是也需要有專(zhuān)業(yè)人士的投入才行,需要學(xué)習(xí)和嘗試下flex的增量編譯框架fcsh和flex編譯支持maven的工具flexmojos,也許會(huì)有幫助。
對(duì)于練習(xí)方式,作者給出了幾種形式,一些練習(xí)套路,可以嘗試在公司里設(shè)計(jì)相關(guān)的課程。
卡塔
在武術(shù)里,卡塔是一套設(shè)計(jì)好的、用來(lái)模擬搏斗一方的招式。與之類(lèi)似,編程卡塔也是一整套敲擊鍵盤(pán)和鼠標(biāo)的動(dòng)作,用來(lái)模擬編程問(wèn)題的解決過(guò)程。聯(lián)系著不是在解決真正的問(wèn)題,因?yàn)槟阋呀?jīng)知道了解決方案。相反,你是在練習(xí)解決這個(gè)問(wèn)題所需要的動(dòng)作和決策。
編程卡塔的最終目標(biāo),也是逐步練習(xí)以達(dá)到純熟。反復(fù)的練習(xí)會(huì)訓(xùn)練大腦和手指如何動(dòng)作和反應(yīng)。在不斷練習(xí)當(dāng)眾,你或許會(huì)發(fā)現(xiàn)動(dòng)作的細(xì)微進(jìn)步,或者解決問(wèn)題效率的小幅提升。
要學(xué)習(xí)熱鍵和導(dǎo)航操作,以及測(cè)試驅(qū)動(dòng)開(kāi)發(fā)、持續(xù)集成之類(lèi)的方法,找整套的卡塔來(lái)練習(xí)都是相當(dāng)有效的。
Bob大叔給出了一些卡塔,參考網(wǎng)站http://codekata.pragprog.com,其中包括在《ASD》中給出的保齡球計(jì)分程序。今年后備教練訓(xùn)練營(yíng)的TDD作業(yè),我做的就是這個(gè)BowlingGame的程序。
真正的挑戰(zhàn)是把一個(gè)卡塔練習(xí)到爐火純青,你可以窺見(jiàn)其中的韻律。要做到這一點(diǎn)可不容易。
瓦薩
瓦薩基本可以說(shuō)是兩個(gè)人的卡塔。其中的招式需要精確地記憶,反復(fù)演練。一個(gè)人負(fù)責(zé)攻,另一個(gè)人負(fù)責(zé)守。攻守雙方互換時(shí),各種動(dòng)作要一而再、再而三地反復(fù)。
程序員可以用一種叫“乒乓”的游戲來(lái)進(jìn)行類(lèi)似的練習(xí):兩個(gè)人選擇一個(gè)卡塔,或者一個(gè)簡(jiǎn)單問(wèn)題,一個(gè)人寫(xiě)單元測(cè)試,另一個(gè)人寫(xiě)程序通過(guò)單元測(cè)試,然后交換角色。
自由練習(xí)
自由練習(xí)就是不限制形式的搏擊。模擬搏斗與編程并不是特別貼合。不過(guò),很多編程練習(xí)場(chǎng)中都會(huì)玩一種叫做“自由練習(xí)”的游戲。它很像由兩個(gè)參與者解決問(wèn)題的瓦薩,只是自由練習(xí)是有很多人參與的,而且規(guī)則是可以延續(xù)的。在自由練習(xí)中,屏幕被投影到墻上,一個(gè)人寫(xiě)測(cè)試,然后坐下來(lái),另一個(gè)人寫(xiě)程序通過(guò)測(cè)試,再寫(xiě)下一個(gè)測(cè)試。桌子邊的人一個(gè)個(gè)輪流接下去,或者有興趣的人可以自己排隊(duì)參加。無(wú)論怎么安排,都是非常有趣的。
上面這三種方式,無(wú)一不是以TDD的方式進(jìn)行,和上一章的內(nèi)容吻合。另外還有在業(yè)余時(shí)間參與開(kāi)源社區(qū),也是推薦的練習(xí)方法,總之,專(zhuān)業(yè)人士需要不斷的練習(xí)。
無(wú)論如何,專(zhuān)業(yè)人士都需要練習(xí)。他們這么做,是因?yàn)樗鼈冴P(guān)心自己能做到的最好結(jié)果。更重要的是,他們用自己的時(shí)間練習(xí),因?yàn)樗鼈冎辣3肿约旱募寄懿宦湮槭亲约旱呢?zé)任,而不是雇主的責(zé)任。練習(xí)的時(shí)候你是賺不到錢(qián)的,但是練習(xí)之后,你會(huì)獲得回報(bào),而且是豐厚的回報(bào)。
第7章? 驗(yàn)收測(cè)試
Bob大叔舉了一個(gè)和業(yè)務(wù)人員一起以不斷探索的方式寫(xiě)應(yīng)用程序的例子,并總結(jié)了一些經(jīng)驗(yàn)。其實(shí)是再一次闡述了敏捷的一些原則,強(qiáng)調(diào)變化是一定會(huì)有的,過(guò)早精細(xì)化是不必要的,業(yè)務(wù)方自己很可能并不知道自己要什么。應(yīng)對(duì)方式是推遲精細(xì)化,用驗(yàn)收測(cè)試驅(qū)動(dòng)開(kāi)發(fā)。驗(yàn)收測(cè)試要自動(dòng)化。幾年前測(cè)試團(tuán)隊(duì)做過(guò)相關(guān)的嘗試,當(dāng)時(shí)覺(jué)得在驗(yàn)收自動(dòng)化測(cè)試上投入有點(diǎn)高,沒(méi)有繼續(xù)進(jìn)行下去,2018年是不是可以再?lài)L試一下,改變一下PO和BA的工作方法?
驗(yàn)收測(cè)試和單元測(cè)試
驗(yàn)收測(cè)試是寫(xiě)給業(yè)務(wù)方看的,單元測(cè)試是寫(xiě)個(gè)程序員的,它們并不重復(fù)。它們的主要功能其實(shí)不是測(cè)試,測(cè)試只是附屬功能。它們首先是文檔,其次才是測(cè)試。
圖形界面的測(cè)試
這里提到了增加ID和分層測(cè)試服務(wù)兩種方式,都是以前曾經(jīng)嘗試過(guò)的,關(guān)鍵是要找到項(xiàng)目真實(shí)的落地。
持續(xù)集成
這里重點(diǎn)提到的是持續(xù)集成的紀(jì)律,集成失敗必須立即修復(fù),這是優(yōu)先級(jí)最高的事情。實(shí)際做起來(lái)是需要全員意識(shí)上的改變的。
第8章?測(cè)試策略
“QA應(yīng)該找不到任何錯(cuò)誤”,這是對(duì)專(zhuān)業(yè)人士的要求。QA的主要職責(zé)不是發(fā)現(xiàn)程序員的錯(cuò)誤,保證程序沒(méi)有錯(cuò)誤是程序員自己的職責(zé)。那QA做什么?
QA在團(tuán)隊(duì)中要扮演的是需求規(guī)約定義者(specifier)和特性描述者(characterizer)。
需求規(guī)約定義者:QA的任務(wù)是和業(yè)務(wù)人員一起創(chuàng)建自動(dòng)化驗(yàn)收測(cè)試,作為系統(tǒng)真正的需求規(guī)約文檔。
特性描述者:QA的另一項(xiàng)任務(wù)是遵循探索式測(cè)試的原則,描述系統(tǒng)運(yùn)行中的真實(shí)情況,將之反饋給開(kāi)發(fā)人員和業(yè)務(wù)人員。在這項(xiàng)任務(wù)中,QA并沒(méi)有解析需求,而是在鑒別系統(tǒng)的真實(shí)情況。
自動(dòng)化測(cè)試金字塔
專(zhuān)業(yè)開(kāi)發(fā)人員遵循測(cè)試驅(qū)動(dòng)開(kāi)發(fā)的要求來(lái)創(chuàng)建單元測(cè)試。專(zhuān)業(yè)開(kāi)發(fā)團(tuán)隊(duì)使用驗(yàn)收測(cè)試定義系統(tǒng)需求,使用持續(xù)集成保證質(zhì)量穩(wěn)步提升;同時(shí),這些測(cè)試又屬于全局測(cè)試體系。擁有一套單元測(cè)試和驗(yàn)收測(cè)試的同時(shí),還需要有更高層次的測(cè)試,這樣QA才找不出任何錯(cuò)誤。
Bob大叔給出了五層的自動(dòng)化測(cè)試金字塔,和我們經(jīng)常看到的三層的金字塔不太一樣,從下到上依次是:?jiǎn)卧獪y(cè)試、組件測(cè)試、集成測(cè)試、系統(tǒng)測(cè)試、人工探索式測(cè)試。
單元測(cè)試是程序員自己編寫(xiě)自己使用,并且要做到接近100%的覆蓋率,通常在90%以上,并且是真實(shí)的覆蓋率,而不是那種雖然能通過(guò)但并不關(guān)心運(yùn)行結(jié)果的錯(cuò)誤的單元測(cè)試。
組件測(cè)試和集成測(cè)試都是針對(duì)API進(jìn)行的測(cè)試。組件測(cè)試針對(duì)單個(gè)組件,集成測(cè)試針對(duì)多個(gè)組件。組件測(cè)試由QA和業(yè)務(wù)人員編寫(xiě),開(kāi)發(fā)人員提供輔助。常用的工具是FitNesse, JBehave, Cucumber。針對(duì)GUI的是Selenium或Watir等工具。組件測(cè)試要覆蓋差不多系統(tǒng)的一半,主要是成功路徑。異常路徑是要靠單元測(cè)試來(lái)覆蓋的。集成測(cè)試主要針對(duì)大型系統(tǒng),是編排性測(cè)試,主要不是測(cè)試業(yè)務(wù)規(guī)則,而是測(cè)試組件裝配在一起時(shí)是否協(xié)調(diào)。集成測(cè)試一般由系統(tǒng)架構(gòu)師或主設(shè)計(jì)師來(lái)編寫(xiě),用于確認(rèn)系統(tǒng)架構(gòu)層面的結(jié)構(gòu)是否正確無(wú)誤。集成測(cè)試時(shí)間運(yùn)行比較長(zhǎng),一般不會(huì)作為持續(xù)集成的一部分。
系統(tǒng)測(cè)試大約占測(cè)試的10%,由系統(tǒng)架構(gòu)師和技術(shù)負(fù)責(zé)人編寫(xiě),一般是在GUI層次。
人工探索性測(cè)試不是自動(dòng)化測(cè)試,它需要使用人類(lèi)的創(chuàng)新能力,對(duì)系統(tǒng)進(jìn)行深入研究和探索。預(yù)先編寫(xiě)測(cè)試計(jì)劃反而會(huì)削弱這類(lèi)測(cè)試的效果??梢钥紤]一些全員“抓蟲(chóng)”行動(dòng)。覆蓋率不是探索性測(cè)試的目標(biāo)。
結(jié)論
TDD、驗(yàn)收測(cè)試這些組合起來(lái),最終目標(biāo)還是讓QA找不到任何錯(cuò)誤。
第9章?時(shí)間管理
會(huì)議
關(guān)于會(huì)議,有兩條真理:
(1)會(huì)議是必需的;
(2)會(huì)議浪費(fèi)了大量時(shí)間。
通常,兩條真理同時(shí)適用于同一場(chǎng)會(huì)議。有些與會(huì)者認(rèn)為這兩條總結(jié)得非常好,有些則認(rèn)為它們是正確的廢話(huà)。
你需要為自己的時(shí)間負(fù)責(zé),所以你需要選擇哪些會(huì)議參加哪些會(huì)議不參加。Bob大叔提到Scrum的四會(huì)的問(wèn)題,相關(guān)內(nèi)容應(yīng)該可以參考Scrum相關(guān)書(shū)籍。
爭(zhēng)論/反對(duì)
Kent Beck曾告訴我一個(gè)深刻的道理:“凡事不能在5分鐘內(nèi)解決的爭(zhēng)論,都不能靠辯論解決?!?/p>
如果爭(zhēng)論必須解決,就應(yīng)當(dāng)要求爭(zhēng)論各方在5分鐘時(shí)間內(nèi)向大家擺明問(wèn)題,然后大家投票。這樣,整個(gè)會(huì)議花的時(shí)間不會(huì)超過(guò)15分鐘。
注意力點(diǎn)數(shù)
現(xiàn)在是個(gè)爭(zhēng)搶注意力的時(shí)代,每個(gè)人最稀缺的資源就是注意力,誰(shuí)搶到更多的注意力就能賺錢(qián)。如何保持注意力?
首先需要保證睡眠。Bob大叔每晚需要睡7小時(shí)。年初有幾個(gè)月我曾經(jīng)每晚睡5小時(shí),想多爭(zhēng)取些時(shí)間工作和學(xué)習(xí),靠每天早晨的咖啡來(lái)支撐,后來(lái)發(fā)現(xiàn)自己有點(diǎn)扛不住,就盡量往7小時(shí)睡眠靠了。前陣子聽(tīng)樊登講《睡眠革命》,一個(gè)睡眠周期時(shí)間是1.5小時(shí),如果在睡眠周期中間被鬧醒,則整天都會(huì)受影響,所以睡眠時(shí)間最好是1.5小時(shí)的整數(shù)倍,一周累積睡到35個(gè)周期就沒(méi)問(wèn)題。正在嘗試中,貌似挺有道理。
肌肉注意力。體力活動(dòng)需要肌肉注意力,編程需要心智注意力,兩者的要求不相同。不過(guò)定期訓(xùn)練肌肉注意力可以提升心智注意力的上限。Bob大叔的做法是騎自行車(chē)1-2小時(shí),大約30-50km,騎車(chē)的時(shí)候可以聽(tīng)播客或者音樂(lè)。我自己挺喜歡慢跑的,周六的早上慢跑聽(tīng)書(shū)是一種享受,也是一種放松。不過(guò)進(jìn)入冬天霧霾重了就沒(méi)怎么跑了。不過(guò)在家里做些俯臥撐也挺有好處。
時(shí)間拆分和番茄工作法
番茄工作法我用過(guò)一段時(shí)間,有時(shí)經(jīng)常被打斷或者自己內(nèi)心沒(méi)法靜下來(lái);有時(shí)又覺(jué)得25分鐘時(shí)間好像有點(diǎn)短,專(zhuān)注的做一件事情時(shí)剛進(jìn)入狀態(tài),番茄就結(jié)束了??吹接械奈恼抡f(shuō)番茄時(shí)間設(shè)置成1小時(shí)比較好。不過(guò)按照Bob大叔前面的說(shuō)法,其實(shí)進(jìn)入心流狀態(tài)并不是很好。也許25分鐘的番茄鐘就是很科學(xué)的。
要避免的行為是優(yōu)先級(jí)錯(cuò)亂,或者不按優(yōu)先級(jí)順序來(lái)處理,這個(gè)事情在我身上也經(jīng)常發(fā)生,明明知道有個(gè)事情是重要的,但總是拖到最后一刻才做,把自己逼到死角,搞得很忙亂。
番茄時(shí)間也需要回顧,感覺(jué)番茄工作法就是一個(gè)人的Scrum。我對(duì)自己的回顧就是對(duì)于每項(xiàng)事情的預(yù)估時(shí)間還是經(jīng)常偏樂(lè)觀,也許是因?yàn)樽约河型昝乐髁x的傾向。這個(gè)和敏捷的思路并不太匹配,造成自己效率不高,需要調(diào)整。
死胡同和泥潭
死胡同:比如選擇了走不通的技術(shù)道路,越是堅(jiān)持浪費(fèi)的時(shí)間越多。要記得,任何時(shí)候都有選擇。
坑法則:如果你掉進(jìn)了坑里,別挖。
比死胡同更糟糕的是泥潭。泥潭會(huì)減慢速度,但不會(huì)讓你徹底停下來(lái)。但如果你使盡全力,你仍然可以取得進(jìn)展。
之所以說(shuō)泥潭比死胡同更麻煩,是因?yàn)樵谀嗵吨?,你仍然可以看到前進(jìn)的道路,而且看起來(lái)總是比回頭路要短(雖然實(shí)際不是這樣)。
這兩個(gè)道理一看就懂,可以如何分辨哪些是死胡同,哪些是泥潭,哪些是需要堅(jiān)持挺過(guò)去的呢?感覺(jué)需要大智慧才行啊。
第10章?預(yù)估
預(yù)估是軟件開(kāi)發(fā)人員面對(duì)的最簡(jiǎn)單、也是最可怕的活動(dòng)之一了。
承諾和預(yù)估
承諾是確定性的,必須要完成,其他人會(huì)依據(jù)你的承諾制定計(jì)劃。不能兌現(xiàn)的承諾是一種欺騙。
預(yù)估是一種猜測(cè),預(yù)估錯(cuò)誤無(wú)關(guān)聲譽(yù)。
我記得Steve McConnell的《快速軟件開(kāi)發(fā)》中有過(guò)描述,預(yù)估總是會(huì)給出兩個(gè)值,要么是一個(gè)區(qū)間范圍,要么是一個(gè)值和概率,而承諾就只有一個(gè)值。糟糕的是我們給出的大部分預(yù)估都會(huì)被管理者當(dāng)成承諾,因?yàn)槲覀冊(cè)陬A(yù)估時(shí)往往只給出一個(gè)值。
特別提一點(diǎn),按照我們完成任務(wù)的時(shí)長(zhǎng)繪制出直方圖,大致上是符合韋伯分布的,而不是正態(tài)分布。從我司的度量數(shù)據(jù)可以看出這一點(diǎn)。如果出現(xiàn)明顯不符合韋伯分布的曲線,要么說(shuō)明任務(wù)粒度差異比較大,要么說(shuō)明這里存在明顯的異常,需要關(guān)注一下。
常用的預(yù)估方法,都是PMBOK中的知識(shí):三點(diǎn)法、DELPHI法等。計(jì)劃撲克就是一種DEPLHI法。
關(guān)于軟件估算,McConnell專(zhuān)門(mén)寫(xiě)了一本書(shū),可惜沒(méi)投入時(shí)間仔細(xì)讀過(guò)。從經(jīng)驗(yàn)來(lái)看,多人一起拍腦袋做類(lèi)比估算是比較靠譜的,在PMBOK中叫做專(zhuān)家判斷。目前業(yè)界的趨勢(shì)應(yīng)該是使用功能點(diǎn)方法或快速功能點(diǎn)方法,感覺(jué)其本質(zhì)也是類(lèi)比估算,不過(guò)是基于大數(shù)據(jù)的類(lèi)比估算,最核心的東西是其積累的成千上萬(wàn)的項(xiàng)目數(shù)據(jù)信息。
第11章?壓力
即使有壓力,專(zhuān)業(yè)開(kāi)發(fā)人員也會(huì)冷靜果斷。盡管壓力不斷增大,他仍然會(huì)堅(jiān)守所受的訓(xùn)練和紀(jì)律,他知道這些是他賴(lài)以戰(zhàn)勝由最后期限和承諾鎖帶來(lái)的壓力感的最好方法。
本章前面講述了Bob大叔自己承擔(dān)壓力以及他的應(yīng)對(duì)方法。確實(shí)在他40年的軟件生涯中,什么都遇到過(guò)了。有興趣就閱讀原書(shū)吧。
保持整潔
快速前進(jìn)確保最后期限的方法,便是保持整潔。專(zhuān)業(yè)人士不會(huì)為了快點(diǎn)前進(jìn)而亂來(lái)。他們明白“快而臟”是自相矛盾的說(shuō)法。臟亂只會(huì)導(dǎo)致緩慢!
根據(jù)經(jīng)驗(yàn)和我自己的理解,如果工作總是在交接中,可以找到下一位“接盤(pán)俠”,那么大家在工作中保持專(zhuān)業(yè)性的可能性就會(huì)大大降低。以前我維護(hù)的程序,我知道出了問(wèn)題都要自己去解決,沒(méi)有其他人可以依靠,所以為了讓自己維護(hù)和理解程序的負(fù)擔(dān)輕一些,所以我會(huì)把所有已知的問(wèn)題都花時(shí)間消除掉,這樣在遇到問(wèn)題時(shí)我就不會(huì)分心去考慮這些已知的問(wèn)題。已知的問(wèn)題包括編譯器檢查出的所有告警,要么通過(guò)修改代碼消除掉隱患,要么自己要確信理解了編譯器告警的原因,并且明確這是無(wú)害的。事實(shí)證明這個(gè)確實(shí)有效,我很為我以前維護(hù)過(guò)的程序的穩(wěn)定性和代碼質(zhì)量自豪。
是的,那時(shí)我還不知道Clean Code和TDD,不然我一定也在自己維護(hù)的代碼中進(jìn)行實(shí)踐。
危機(jī)中的紀(jì)律
觀察自己在危機(jī)時(shí)刻中的反應(yīng),就可以了解自己的信念。如果在危機(jī)中依然遵循著你守持的紀(jì)律,就說(shuō)明你確實(shí)相信那些紀(jì)律。反過(guò)來(lái)說(shuō),如果在危機(jī)中改變行為,就說(shuō)明你并不真正相信常規(guī)行為中的原則。
如果在非危機(jī)時(shí)刻你會(huì)遵循測(cè)試驅(qū)動(dòng)開(kāi)發(fā)的紀(jì)律,但是在危機(jī)時(shí)刻你放棄了這種做法,就說(shuō)明你并不真正相信TDD是有幫助的。如果在平常時(shí)候你會(huì)注意保持代碼整潔,但在危機(jī)時(shí)刻你卻會(huì)產(chǎn)出混亂的代碼,就說(shuō)明你并不真正相信混亂會(huì)導(dǎo)致速度下降。如果在危機(jī)時(shí)刻你會(huì)結(jié)對(duì)工作,但平時(shí)卻不結(jié)對(duì),就說(shuō)明你相信結(jié)對(duì)工作比不結(jié)對(duì)更有效率。
Bob大叔已經(jīng)說(shuō)得很清晰了,我完全贊同。意識(shí)不到混亂會(huì)導(dǎo)致速度下降,也許是因?yàn)檫€沒(méi)有合適的度量方式讓大家意識(shí)到這一點(diǎn)。想起CMMI顧問(wèn)魏老師曾經(jīng)給過(guò)的一個(gè)建議:如果公司不為修復(fù)程序故障支付報(bào)酬,或者只支付固定比例的報(bào)酬,也許對(duì)我們的交付質(zhì)量提升會(huì)有比較大的促進(jìn)作用。
應(yīng)對(duì)壓力
1:不要驚慌失措;2:溝通;3:依靠你的紀(jì)律原則;4:尋求幫助。
第12章?協(xié)作
程序員正是因?yàn)椴簧朴诤腿舜蚪坏溃矚g和機(jī)器打交道才選擇了這個(gè)職業(yè)。Bob大叔從程序員與雇主,程序員與程序員兩個(gè)方面討論了協(xié)作的問(wèn)題,并且又是用自己親身經(jīng)歷來(lái)說(shuō)法。曾經(jīng)他做過(guò)獨(dú)行俠,忽略了雇主和公司利益,慘遭解雇的故事。這部分簡(jiǎn)單易懂,但很有警醒作用,值得讀一下。
第13章?團(tuán)隊(duì)與項(xiàng)目
有凝聚力的團(tuán)隊(duì)
形成團(tuán)隊(duì)需要時(shí)間。團(tuán)隊(duì)成員需要首先建立關(guān)系。他們需要學(xué)習(xí)如何互相協(xié)作,需要了解彼此的癖好、強(qiáng)項(xiàng)、弱項(xiàng),最終,才能凝聚成團(tuán)隊(duì)。
有凝聚力的團(tuán)隊(duì)確實(shí)有些神奇之處。他們能夠一起創(chuàng)造奇跡。
有凝聚力的團(tuán)隊(duì)通常有大約12名成員。由12個(gè)人組成的理想團(tuán)隊(duì),人員配備情況是這樣的:7名程序員、2名測(cè)試人員、2名分析師和1名項(xiàng)目經(jīng)理。
這個(gè)團(tuán)隊(duì)規(guī)模不符合5-9人的原則,不過(guò)可能平常我們是認(rèn)為分析師(BA)和項(xiàng)目經(jīng)理(PM)是團(tuán)隊(duì)外的人員,算起來(lái)也差不多。這個(gè)規(guī)模差不多也是我們以前一個(gè)科室的規(guī)模,確實(shí)感覺(jué)很不錯(cuò)。記得團(tuán)隊(duì)在解散的時(shí)候科室同事在公司論壇上留下一個(gè)帖子:“鋼七連要解散了,實(shí)名留念”。我被別人叫做“七連長(zhǎng)”(參考《士兵突擊》),感覺(jué)這是我十幾年工作生涯中得到過(guò)的最高褒獎(jiǎng)。
團(tuán)隊(duì)和項(xiàng)目,何者為先?
試圖圍繞項(xiàng)目來(lái)構(gòu)建團(tuán)隊(duì)是一種愚蠢的做法。按照這種做法,團(tuán)隊(duì)永遠(yuǎn)都不可能形成凝聚力。
專(zhuān)業(yè)的開(kāi)發(fā)組織會(huì)把項(xiàng)目分配給已形成凝聚力的團(tuán)隊(duì),而不會(huì)圍繞著項(xiàng)目來(lái)組建團(tuán)隊(duì)。一個(gè)有凝聚力的團(tuán)隊(duì)能夠同時(shí)承接多個(gè)項(xiàng)目,根據(jù)成員各自的意愿、技能和能力來(lái)分配工作,會(huì)順利完成項(xiàng)目。
結(jié)論
團(tuán)隊(duì)比項(xiàng)目更難構(gòu)建。因此,組建穩(wěn)健的團(tuán)隊(duì),讓團(tuán)隊(duì)在一個(gè)又一個(gè)項(xiàng)目中整體移動(dòng)共同工作是較好的做法。并且,團(tuán)隊(duì)也可以同時(shí)承接多個(gè)項(xiàng)目。在組建團(tuán)隊(duì)時(shí),要給予團(tuán)隊(duì)充足的時(shí)間,讓他們形成凝聚力,一直共同工作,成為不斷交付項(xiàng)目的強(qiáng)大引擎。
第14章?輔導(dǎo)、學(xué)徒期與技藝
這是全書(shū)的最后一章(不算附錄,附錄說(shuō)的是工具,和人無(wú)關(guān)),Bob大叔用自己的成長(zhǎng)經(jīng)歷做了個(gè)總結(jié),表達(dá)了對(duì)學(xué)??瓢嘟虒W(xué)的失望,認(rèn)為學(xué)校的教育并沒(méi)能教會(huì)學(xué)生編程,真正的編程是在工作中學(xué)習(xí)和錘煉出來(lái)的。這個(gè)確實(shí)是現(xiàn)狀,可能在中國(guó)和美國(guó)都是類(lèi)似的情況,我自認(rèn)自己只是個(gè)中級(jí)水平的程序員,這個(gè)能力水平也是在工作之后讀了一些書(shū)做了一些實(shí)踐之后獲得的,剛畢業(yè)的時(shí)候確實(shí)很渣。
Bob大叔是雪鳥(niǎo)會(huì)議的發(fā)起者,某種意義上說(shuō)可以認(rèn)為是敏捷宣言之父,他同時(shí)也是軟件工藝運(yùn)動(dòng)的推動(dòng)者,他用這本小書(shū)向我們闡述了何為專(zhuān)業(yè)人士,以及如何成為專(zhuān)業(yè)人士,為他的專(zhuān)業(yè)精神所折服,推薦程序員都讀一讀,然后不再自稱(chēng)“碼農(nóng)”。
很高興自己在兩周內(nèi)讀完了一本書(shū),并且這也是唯一一本我寫(xiě)完了讀后感的書(shū),感謝Bob大叔的言簡(jiǎn)意賅。
對(duì)了,其實(shí)還有最后的附錄工具沒(méi)有寫(xiě),里面提到了配置管理工具svn/git,代碼編輯器IDE,持續(xù)集成工具,問(wèn)題跟蹤工具,自動(dòng)化測(cè)試工具等,提供的都是最優(yōu)秀的選項(xiàng),值得學(xué)習(xí)和參考。
我是有底線的