之前一直要總結(jié)高效的研發(fā)團(tuán)隊(duì),正好最近再讀《人月神話》,今天結(jié)合書中內(nèi)容一并來(lái)說(shuō)說(shuō)。
以前的觀點(diǎn):
高效的團(tuán)隊(duì)由高效的個(gè)人組成,高效的團(tuán)隊(duì)才能完成高效的項(xiàng)目交付。
新的認(rèn)知:
高效的項(xiàng)目交付才是結(jié)果,而能夠進(jìn)行高效交付的團(tuán)隊(duì)未必是高效團(tuán)隊(duì),這個(gè)團(tuán)隊(duì)中的個(gè)人也不一定得是高效人士。其核心在于降低延期的各項(xiàng)風(fēng)險(xiǎn)值,而不是非得每個(gè)人都優(yōu)秀。
1. 研發(fā)項(xiàng)目為什么會(huì)經(jīng)常延期?
在軟件研發(fā)項(xiàng)目中,缺乏合理的進(jìn)度安排是造成延期最主要的原因,這比其他所有因素加起來(lái)影響還要大。這個(gè)災(zāi)難是怎么發(fā)生的呢?
1.1. 所有編程人員都是樂(lè)觀主義者
所有系統(tǒng)的進(jìn)度安排背后第一個(gè)錯(cuò)誤的假設(shè)是:一切都將運(yùn)作良好,每項(xiàng)任務(wù)僅需要花費(fèi)它“應(yīng)該”花費(fèi)的時(shí)間。對(duì)于創(chuàng)造者,只有在實(shí)現(xiàn)的過(guò)程中,才能發(fā)現(xiàn)我們構(gòu)思的不完整和不一致性。
編程人員通過(guò)非常純粹的思維活動(dòng)構(gòu)思程序,所以很容易自信的認(rèn)為實(shí)現(xiàn)過(guò)程中不會(huì)遇到困難。然而我們的思維是有缺陷的,項(xiàng)目越大,能夠按照計(jì)劃順利進(jìn)行的概率就越小。
1.2. 人月是一個(gè)隱性的謊言
在估計(jì)和進(jìn)度安排的過(guò)程中使用“人月”作為工作量單位是十分荒謬的,是一個(gè)帶有危險(xiǎn)和欺詐性的神話,他暗示著人員數(shù)量和時(shí)間可以相互替換。然而人數(shù)和時(shí)間的互換僅僅適用于,某個(gè)任務(wù)可以分解給參與人員,并且他們之間不需要相互交流的情況。
當(dāng)任務(wù)不能分解時(shí),人手的添加對(duì)進(jìn)度沒(méi)有任何幫助,大多數(shù)編程工作都具有這種特征。就像你無(wú)論找?guī)讉€(gè)媽媽,孕育一個(gè)生命總是需要10個(gè)月的時(shí)間。
Brooks法則:為進(jìn)度落后的項(xiàng)目增加人手,只會(huì)使進(jìn)度更加落后。
對(duì)于可以分解的情況,增加人手可以加快進(jìn)度,但是會(huì)提高成本,2個(gè)人的效率可能僅等于1.5個(gè)人。原因在于溝通、培訓(xùn)、交流等事物增加了工作量,而且所增加的工作量可能會(huì)完全抵消任務(wù)分解所產(chǎn)生的作用。
軟件開(kāi)發(fā)作為一項(xiàng)系統(tǒng)工作,溝通、交流的工作量非常大,它會(huì)快速消耗任務(wù)分解所節(jié)約下來(lái)的時(shí)間。
1.3. 系統(tǒng)測(cè)試都過(guò)于短了
系統(tǒng)測(cè)試進(jìn)度的安排往往是編程中最不合理的部分,都過(guò)于短了。很少項(xiàng)目允許為為測(cè)試分配一半的時(shí)間,然而大多數(shù)項(xiàng)目的測(cè)試實(shí)際上是花費(fèi)了進(jìn)度中一半的時(shí)間。不安排足夠的測(cè)試時(shí)間將會(huì)是一場(chǎng)災(zāi)難,由此造成的項(xiàng)目延期成本高昂,在早期規(guī)劃時(shí),保留充分的測(cè)試時(shí)間非常重要。
作者建議的進(jìn)度安排:
1/3 計(jì)劃
1/6 編碼
1/4 構(gòu)建測(cè)試和早期系統(tǒng)測(cè)試
1/4 系統(tǒng)測(cè)試,所有的構(gòu)建已完成
1.4. 管理人員往往比開(kāi)發(fā)人員更加樂(lè)觀
管理人員很容易會(huì)認(rèn)為項(xiàng)目功能完成就意味著開(kāi)發(fā)完成了,沒(méi)有為測(cè)試階段安排較長(zhǎng)時(shí)間的意識(shí),往往測(cè)試的時(shí)間只能占到項(xiàng)目周期的1/8甚至更少。這明顯是犯了樂(lè)觀主義的錯(cuò)誤,項(xiàng)目管理人員甚至比開(kāi)發(fā)人員更加樂(lè)觀。
如果不是站在專業(yè)的角度上,似乎很難理解測(cè)試階段所花的時(shí)間,更難理解的是為什么增加人手不能讓項(xiàng)目進(jìn)度加快。
2. 如何更準(zhǔn)確的進(jìn)行時(shí)間評(píng)估?
2.1. 不能簡(jiǎn)單的使用系數(shù)進(jìn)行計(jì)算
僅僅通過(guò)對(duì)編碼部分時(shí)間的估計(jì),然后乘以其他部分的相對(duì)系數(shù),是無(wú)法得出對(duì)整項(xiàng)工作的精確估計(jì)的。
比如編碼預(yù)計(jì)要用1個(gè)月的時(shí)間是推不出總體用時(shí)6個(gè)月的。
2.2. 構(gòu)建獨(dú)立小程序的經(jīng)驗(yàn)不適用與大系統(tǒng)項(xiàng)目。
獨(dú)立小型程序的案例數(shù)據(jù)可能不適用于系統(tǒng)的產(chǎn)品,這就像不能通過(guò)統(tǒng)計(jì)百米短跑紀(jì)錄得出人類可以在3分鐘內(nèi)跑完一英里的結(jié)論一樣。
2.3. 程序開(kāi)發(fā)隨著程序規(guī)模的大量增長(zhǎng)而增長(zhǎng)。
剛才說(shuō)的編碼預(yù)計(jì)要用1個(gè)月,總周期是可能大于6個(gè)月的,因?yàn)闀凶髡咛岢隽司幊炭傮w工作量和程序規(guī)模之間顯示出的關(guān)系是指數(shù)關(guān)系,指數(shù)值在1.05到1.2之間。也就是隨著程序規(guī)模的增加,編程工作量的增長(zhǎng)量也會(huì)增長(zhǎng)。
3. 改善項(xiàng)目交付的效率
結(jié)合這部經(jīng)典和敏捷的方法論,總結(jié)了一下幾個(gè)點(diǎn)來(lái)進(jìn)行項(xiàng)目交付效率的提升。
3.1. 重要文檔先行
《人月神話》的作者非??粗匚牡?,認(rèn)為優(yōu)質(zhì)的文檔就是項(xiàng)目成功的保證。雖然這一觀點(diǎn)與敏捷方法的觀點(diǎn)有所出入,但不可否認(rèn)我們現(xiàn)在的工程師對(duì)于文檔編寫缺乏激情,而文檔的缺失也給后期加入和新人和功能修改帶來(lái)復(fù)雜度。
敏捷不等于不要文檔,文檔也未必需要事無(wú)巨細(xì)的記錄。對(duì)于我們而言,重要的文檔必須輸出,如帶有描述的產(chǎn)品原型文檔,擁有實(shí)體、接口和數(shù)據(jù)庫(kù)定義的系統(tǒng)設(shè)計(jì)文檔, 還得有相應(yīng)的測(cè)試用例,發(fā)布程序時(shí)的發(fā)布記錄。
對(duì)于一些重復(fù)性強(qiáng)的工作、經(jīng)驗(yàn)性強(qiáng)的工作,需要整理成執(zhí)行清單,這樣下次的執(zhí)行按照清單進(jìn)行即可。對(duì)于清單不要擔(dān)心寫的不夠完善,因?yàn)榍鍐瓮枰?jīng)過(guò)實(shí)踐的檢驗(yàn),而在檢驗(yàn)的過(guò)程中自然就會(huì)完善起來(lái),不過(guò)前提還是需要重視文檔,這樣清單才能得到及時(shí)的更新。
3.2. 顯性的進(jìn)度表
我們現(xiàn)在采用了顯性化的里程碑進(jìn)行項(xiàng)目進(jìn)度溝通,但這些里程碑以結(jié)點(diǎn)為主,缺少過(guò)程的顯性化,最好再增加一個(gè)進(jìn)度表,由大里程、小里程及完成時(shí)間組成,并且記錄真是的進(jìn)度情況?不可模棱兩可。
3.3. 使用高效的語(yǔ)言和框架
- 對(duì)于常用的編程語(yǔ)言,生產(chǎn)率似乎是固定的
- 使用適當(dāng)?shù)母呒?jí)語(yǔ)言,編程的生產(chǎn)率可以提高5倍
這點(diǎn)我們?cè)诟纳?,但是還不夠,特別是在語(yǔ)言的突破上局限性太大。
3.4. 主動(dòng)溝通但要減少無(wú)效溝通
隨著敏捷思想的貫徹,大家的溝通也頻繁了起來(lái),但是目前的溝通詢問(wèn)偏多,主動(dòng)偏少,后面要讓主動(dòng)溝通更多一些。
減少無(wú)效溝通,溝通之后要有結(jié)論和輸出。比如目前一些溝通是在拋問(wèn)題,拋完問(wèn)題溝通也就結(jié)束了,可這種溝通對(duì)于實(shí)際工作并無(wú)益處,反而浪費(fèi)了時(shí)間。
3.5. 有效的人員分配與賦能
完成一個(gè)項(xiàng)目往往不是一個(gè)人的事情,需要多工種、多成員的密切配合,有效的配合將帶來(lái)高效的回報(bào)。
但是人員的分工、分配不等于責(zé)任的劃分,因?yàn)轫?xiàng)目是一個(gè)整體,項(xiàng)目的整體交付結(jié)果才是團(tuán)隊(duì)的輸出結(jié)果、每個(gè)人的結(jié)果。一定不能存在項(xiàng)目整體很糟,但某個(gè)人確非常優(yōu)秀,項(xiàng)目的榮辱就是每個(gè)項(xiàng)目成員的榮辱。
對(duì)于團(tuán)隊(duì)來(lái)講,賦能也是非常、非常重要的點(diǎn),通過(guò)賦能不僅能夠減少管理者的工作量,更能夠讓普通成員肩負(fù)起項(xiàng)目交付的單子更好的成長(zhǎng)。但是賦能不可以是甩鍋,特別對(duì)于成長(zhǎng)中的隊(duì)友,要在關(guān)注,要在關(guān)鍵時(shí)刻推一把。
軟件系統(tǒng)與計(jì)算機(jī)、建筑或者汽車大不相同,后者往往存在著大量重復(fù)的部分,而前者需要我們投入大量的思考和實(shí)踐來(lái)尋求正確的路線。本次讀《人月生化》又有不少的收獲,感謝布魯克斯留給我們的寶貴財(cái)富。