也读《人月神话》:没有银弹的软件工程
一、關(guān)于人月神話這本書(shū)
記得在上大學(xué)的時(shí)候,就經(jīng)常聽(tīng)學(xué)長(zhǎng)和老師講起《人月神話》,但是卻一直沒(méi)有閱讀。記得當(dāng)時(shí)一聽(tīng)到這個(gè)書(shū)名,還以為是個(gè)神馬科幻類(lèi)別的書(shū),結(jié)果是個(gè)軟件工程方面的書(shū)籍。這本書(shū)是“圖靈獎(jiǎng)得主、“IBM360系統(tǒng)之父”作者Brooks寫(xiě)的,人們都說(shuō)它顛覆了項(xiàng)目管理領(lǐng)域,是一本長(zhǎng)久不衰的傳奇經(jīng)典,暢銷(xiāo)了40多年。的確,在我們熟悉的豆瓣讀書(shū)上面,它的評(píng)分達(dá)到了8.6(滿分10分),不可不畏是一本好書(shū)。最近快速地閱讀完后,按照我的老規(guī)矩,也需要總結(jié)總結(jié),寫(xiě)一篇筆記來(lái)日后回顧之用。
二、什么是“人月神話”?
“人月”這個(gè)詞英文原文是“Man Month”,代表一個(gè)人一個(gè)月的時(shí)間內(nèi)能夠完成的工作量,在軟件開(kāi)發(fā)項(xiàng)目管理中,常用來(lái)估算任務(wù)量,比如“這個(gè)項(xiàng)目需要多少個(gè)人月?”。很多時(shí)候我們或多或少都有過(guò)這樣的經(jīng)歷,很多的項(xiàng)目管理人員總是希望通過(guò)增加更多的人手來(lái)加快軟件工程的完成進(jìn)度。比如,一個(gè)工作量為10個(gè)人月的項(xiàng)目,如果只有一個(gè)人做,需要10個(gè)月才能完成。于是,我們的項(xiàng)目管理人員認(rèn)為,只要再加入9個(gè)人,那么10個(gè)人一起做,就只需要一個(gè)月啦。然而,實(shí)際情況并非如此,因此軟件工程的各項(xiàng)工作之間,往往存在著一個(gè)前后繼承的關(guān)系,完成了這一項(xiàng),下一項(xiàng)才能開(kāi)始。那么,加進(jìn)來(lái)的人手呢,他并不能立即開(kāi)始工作。所以,想要通過(guò)增加人手來(lái)縮短工程時(shí)間,其實(shí)只是一個(gè)“神話”而已。這里,就不得不提經(jīng)常被拿來(lái)舉例的一個(gè)例子,一個(gè)孕婦生一個(gè)小孩需要10個(gè)月,那么請(qǐng)10個(gè)孕婦來(lái)就只需要1個(gè)月啦?顯然是不可能完成的任務(wù)。
而“人月神話”反映出的,就是軟件開(kāi)發(fā)在項(xiàng)目管理中所遇到的難題:管理人員因?yàn)槊つ繕?lè)觀,對(duì)項(xiàng)目開(kāi)發(fā)過(guò)程中的困難沒(méi)有充分的認(rèn)識(shí),在計(jì)算項(xiàng)目的工作量和交付時(shí)間上采用了錯(cuò)誤的計(jì)算方法,忽略了細(xì)節(jié)對(duì)整體的巨大影響,而這很可能會(huì)導(dǎo)致項(xiàng)目延期。
三、如何處理“人月神話”的難題?
首先,作者建議,以小團(tuán)隊(duì)的方式開(kāi)展工作。
這里不得不說(shuō),作者在當(dāng)時(shí)提出了一個(gè)類(lèi)似于外科手術(shù)團(tuán)隊(duì)的組織結(jié)構(gòu)來(lái)開(kāi)展工作。外科手術(shù)團(tuán)隊(duì)的奧秘就在于,它是以主刀醫(yī)生為核心,其他像負(fù)責(zé)助理醫(yī)生、麻醉師、護(hù)士等人都是為主刀醫(yī)生服務(wù)的,大家各司其職、齊心協(xié)力,從而保證手術(shù)順利完成。那么,反映到軟件工程上面,就是以架構(gòu)師或者高級(jí)程序員充當(dāng)主刀醫(yī)生的角色,而團(tuán)隊(duì)管理者充當(dāng)副手或者服務(wù)人員,其他團(tuán)隊(duì)成員則分別負(fù)責(zé)單元代碼編寫(xiě),功能單元測(cè)試,文檔管理,工具開(kāi)發(fā)及技術(shù)支持等等。即使整個(gè)項(xiàng)目團(tuán)隊(duì)的人數(shù)龐大,但只要根據(jù)工作邊界,將大家劃分到一個(gè)個(gè)類(lèi)似于外科手術(shù)隊(duì)伍那樣的小團(tuán)隊(duì)當(dāng)中去,就可以保障在一定程度上的效率提升。
其次,要進(jìn)行行之有效的溝通。
定期召開(kāi)項(xiàng)目進(jìn)度例會(huì),對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行監(jiān)督和全員反饋等等,都是常見(jiàn)的增進(jìn)溝通的手段。而近年來(lái)流行的敏捷開(kāi)發(fā)模式,例如Scrum這種敏捷開(kāi)發(fā)流派,就特別倡導(dǎo)小團(tuán)隊(duì)的高頻率的溝通,每個(gè)迭代(大概2周一個(gè)迭代)都會(huì)完整經(jīng)歷計(jì)劃會(huì)議、每日站立會(huì)議、項(xiàng)目評(píng)審會(huì)議、團(tuán)隊(duì)回顧會(huì)議等,特別是每日站立會(huì)議,雖然一般只有短短15分鐘,但是確是增進(jìn)溝通的主要行之有效的方式。
此外,作者還在特別強(qiáng)調(diào)了兩個(gè)點(diǎn):
使用產(chǎn)品文檔
“手把手帶”的溝通方式
關(guān)于“防微杜漸”,作者具體給出了幾點(diǎn)建議:
在項(xiàng)目推進(jìn)的過(guò)程中設(shè)立一些關(guān)鍵節(jié)點(diǎn),作者稱(chēng)之為“里程碑事件” => 我所在的團(tuán)隊(duì)每天的站立會(huì)議都會(huì)設(shè)立“今日目標(biāo)”,也就是一些里程碑,在每天下班時(shí)后看看這些里程碑事件完成了多少,如果完成100%那么久擦掉,如果沒(méi)有就說(shuō)明情況和問(wèn)題,留到下一個(gè)工作日繼續(xù)完成。
為項(xiàng)目設(shè)立一個(gè)專(zhuān)門(mén)的規(guī)劃和控制小組
項(xiàng)目管理必須認(rèn)清一個(gè)現(xiàn)實(shí):“唯一不變的就是變化” => 我所在的團(tuán)隊(duì)經(jīng)歷過(guò)多次需求大改的情況,迫使我們每次修改都要面向未來(lái)考慮變化點(diǎn)和可擴(kuò)展性
為了避免項(xiàng)目延遲和失敗,要盡可能地提前集成測(cè)試 => 只有盡快集成測(cè)試,才能暴露前后端在對(duì)于backlog的理解上存在的問(wèn)題,有沒(méi)有完成AC(驗(yàn)收條件)
四、“人月神話”為何無(wú)法徹底解決?
“人月神話”中的一些問(wèn)題,其根源在于軟件工程本身的特性,是無(wú)法徹底解決的,這也是廣大IT從業(yè)人士的共識(shí)。其原因歸根結(jié)底有以下幾點(diǎn):
計(jì)算機(jī)技術(shù)的發(fā)展實(shí)在是太快了 => 想想摩爾定律到現(xiàn)在前后端的框架變化,我們時(shí)常感嘆前一陣子學(xué)的東西現(xiàn)在又被淘汰了,是否要開(kāi)始學(xué)習(xí)AI了?
軟件研發(fā)本身的內(nèi)在的特性也制約了軟件工程的進(jìn)展 => 作者用了4個(gè)詞來(lái)概括這種特性:復(fù)雜性、一致性、可變性和不可見(jiàn)性。
五、改善軟件開(kāi)發(fā)根本難題的建議
雖然作者說(shuō)到上面提到的這些困境是軟件開(kāi)發(fā)的根本困難,無(wú)法徹底解決。但是,它還是給出了三方面的建議,來(lái)盡可能改善這種困難造成的困境:
采用新技術(shù) => 使用高級(jí)語(yǔ)言總比低級(jí)語(yǔ)言方便吧,使用.NET Core總比.NET Framework程序性能和跨平臺(tái)好吧?
“快速開(kāi)發(fā)原型”,然后再做“增量開(kāi)發(fā)” => 其實(shí)跟我們的敏捷開(kāi)發(fā)思想一致,通過(guò)在不斷地迭代反復(fù)中堆成一個(gè)完整的系統(tǒng),在精益創(chuàng)業(yè)中,也有一個(gè)MVP(最小可用產(chǎn)品)的概念,它提倡快速原型試錯(cuò),快速獲取市場(chǎng)反饋,然后再慢慢完成最后的完整的產(chǎn)品。
聘用卓越人才 => 這一點(diǎn)毋庸置疑,有了新的技術(shù)和敏捷開(kāi)發(fā),還需要合格的、追求卓越的程序員人才,這讓我想起了ThoughtWorks這家公司,它是一個(gè)尊重技術(shù),提倡敏捷并且積極追求卓業(yè)人才的代表性企業(yè),Martin Fowler是其首席科學(xué)家,無(wú)數(shù)的咨詢師走上了技術(shù)布道之路,敏捷開(kāi)發(fā),DDD,微服務(wù)等實(shí)踐總結(jié)和分享雨后春筍般地出來(lái),向ThoughtWorks致敬。
整體腦圖
參考資料
弗雷德里克·布魯克斯,《人月神話》
王福強(qiáng),《喜馬講書(shū):人月神話》
總結(jié)
以上是生活随笔為你收集整理的也读《人月神话》:没有银弹的软件工程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 基于Dapper的开源Lambda扩展,
- 下一篇: [译]如何在C#中调试LINQ查询