一門學(xué)問。然而,我可以肯定地說,軟件的度量不可能準(zhǔn)確,尤其是對進(jìn)度的把握而言。即使一個(gè)項(xiàng)目的開發(fā)周期看起來是如此的充裕,以至于感受不到最后期限的壓力,我們?nèi)匀灰獙浖M(jìn)度的控制采取如坐針氈的謹(jǐn)慎態(tài)度,即使這樣在某些人的眼中,我成為了持懷疑論者,或者悲觀主義者,我仍然愿意背著這樣的名身惡意地懷疑項(xiàng)目時(shí)間不夠。原因有二。其一是我們的工作量估算無法做到精確,即使是經(jīng)驗(yàn)豐富的天才程序員,在估算項(xiàng)目的整體工作量時(shí),都會(huì)出現(xiàn)偏差。是的,我們采用了分而治之的方式,對功能進(jìn)行分解,從最小單元來評(píng)估工作量。但我們無法估算各個(gè)功能單元之間存在的各種顯式和隱式關(guān)系,以及各種非功能性需求帶給項(xiàng)目的影響。其二,我們無法事先完全預(yù)知開發(fā)過程中的各種風(fēng)險(xiǎn)。我們得為這種風(fēng)險(xiǎn)買上一份保險(xiǎn),這樣才不至于在風(fēng)險(xiǎn)真正產(chǎn)生時(shí)要我們自己來買單,或者追悔莫及。
關(guān)于技術(shù)風(fēng)險(xiǎn),最佳方式莫過于事先進(jìn)行技術(shù)預(yù)演。不要揣測,或者從理論上去推導(dǎo)。在這個(gè)過程中,我們可以應(yīng)用經(jīng)驗(yàn),但最保險(xiǎn)的方式還是對系統(tǒng)中的核心問題以及關(guān)鍵問題進(jìn)行研究,創(chuàng)建技術(shù)原型。它才是規(guī)避技術(shù)風(fēng)險(xiǎn)的定心丸。
成員變動(dòng)風(fēng)險(xiǎn)是最難以預(yù)知的,因?yàn)槿耸亲铍y以通過數(shù)據(jù)分析得出正確結(jié)論的動(dòng)物。人的心理太復(fù)雜了,因此在軟件業(yè)中還專門誕生了“人件(Peopleware)”這門學(xué)問。在我們進(jìn)行項(xiàng)目開發(fā)過程中,誰知道有多少人會(huì)因?yàn)楦鞣N各樣的因素,而萌生去意呢?此外,正所謂“人有旦夕禍?!?,我們總不能預(yù)測哪些成員會(huì)在開發(fā)過程中生病或者失戀吧?若要解決這個(gè)問題,一個(gè)辦法是“結(jié)對編程”。雖然提出這一方法的目的并不是為了應(yīng)對成員變動(dòng)的風(fēng)險(xiǎn),但事實(shí)上這種互相協(xié)作的方式確實(shí)能夠?qū)⒊蓡T離開所造成的損失降到最低。以我的經(jīng)驗(yàn),要發(fā)生那種編程開發(fā)的一對都離開項(xiàng)目的情形,實(shí)在是少之又少。還有一種辦法則是Constantine提出的“交叉培訓(xùn)”。在其《人件集》的《穩(wěn)步提升的質(zhì)量》一篇中,他提出“將交叉培訓(xùn)納入項(xiàng)目的組織形式中,……是最有效、最有影響的辦法之一。這種方法同時(shí)也增加了工作透明度。通過增加團(tuán)隊(duì)中面對面工作的機(jī)會(huì),團(tuán)隊(duì)成員間自然也就增加了相互學(xué)習(xí)的機(jī)會(huì)”。此外,他還提出 “在團(tuán)隊(duì)中進(jìn)行軟件開發(fā)角色輪循,也為成員增加了實(shí)踐的機(jī)會(huì),可以幫助大家掌握更多的技巧和知識(shí)?!边@里固然在說培訓(xùn),但它帶來的結(jié)果是讓團(tuán)隊(duì)中各個(gè)成員都能夠了解彼此的工作,這就能夠彌補(bǔ)因?yàn)槟承┏蓡T離開項(xiàng)目帶來的空白。
這里同樣牽扯出一個(gè)話題,就是關(guān)于團(tuán)隊(duì)的培訓(xùn)。我的理解是,即使最后期限泰山壓頂,也千萬不要節(jié)省團(tuán)隊(duì)培訓(xùn)的時(shí)間,除非你的團(tuán)隊(duì)已經(jīng)熟悉了項(xiàng)目開發(fā)的所有領(lǐng)域知識(shí),以及解決領(lǐng)域問題的所有技術(shù)知識(shí),同時(shí),這個(gè)團(tuán)隊(duì)已經(jīng)固定不變的合作過三個(gè)項(xiàng)目以上,因而團(tuán)隊(duì)成員已經(jīng)達(dá)到了一個(gè)微小動(dòng)作就能夠心領(lǐng)神會(huì)的境界。有這樣的團(tuán)隊(duì)么?或許有,不過我還沒有看見。