天天看點

人月神話:沒有理想的人月神話

人月神話:沒有理想的人月神話

美食的烹調需要時間,片刻等待,更多美味,更多享受。

                                       ---- 新奧爾良安托萬餐廳菜單

在軟體開發項目中,大部分情況都不可能精準的按照預期的時間來完成。越是複雜的系統,涉及到的人越多時候,項目時間的精準度就會更不可控,正真的人月可以說隻是理想中的神話。

導緻軟體項目人月失控的原因有哪些呢?下面具體看看吧。

過度的樂觀

所有的工程師都是天生的樂觀主義者。在面對程式設計的任務時,我們都是高估自身能力和結果的,例如:

• 這次它運作一定是正常的;

• 我剛剛已經找出了最後一個bug;

這樣的心态背後,在進度評估上都隐藏着一條錯誤的假設: 一切都會運作良好,每一項任務僅會花費它“應該”花費的時間。

這種彌漫在軟體工程師群中過度自信的樂觀主義,需要慎重的分析和對待。

因為對于創造性的活動,從構思,實作和交流溝通,都有着很大的不确定性存在。這種不确定性就會導緻實際情況的複雜度,可能會遠遠大于我們假設中的理想狀态。

對于複雜度的有效估算,更需要理性的樂觀态度,做到前期準備工作的紮實有效,同時也需要留有一定的富餘的空間。

簡單的人月

首先,對于軟體開發這類創造性的工作,用人月作為衡量工作估摸是一個危險和帶有欺騙性的神話。

人月神話背後的假設是:人員數量和時間是可以互相替換的因素。

這個假設,對于比較簡單的可重複的工作來說,也許是适用的。例如收割小麥和摘棉花的工作,因為此類工作不需要人們之前太多的互相交流和配合。

但對于程式設計此類的創造性工作,由于存在一定次序性的問題,這種假設是近乎不可能成立的。例如孕育一個生命需要母親的10個月,就不可能換成10個人用一個月。

其次,對于軟體開發此類團隊協作共創性的工作,就需要有内部大量的溝通和交流的任務,在工作量中要增加這類因素。

理想情況下,增加人手來減少時間得到情況如下圖所示:

人月神話:沒有理想的人月神話

現實情況下,複雜系統開發,每一個單獨任務都會和其他單元要做出協作,則整個工作量會按照N*(N-1)/2方式遞增。在1V1de交流時,3個人的工作量是2個人的3倍,4個人的工作量則是2個人的6倍。而多對多的會議交流,一同協商和解決問題,情況會進一步的惡化。我們會進入下圖所示情況:

人月神話:沒有理想的人月神話

是以,對于軟體開發這次複雜的系統性的工作,如果隻是考慮增加人手就能提升傳遞效率,這是不太現實的。有的時候,可能會适得其反,外行的管理者更需要慎重。

測試的不重視

在軟體開發的進度安排中,最大的不确定性來自于系統測試階段的挑戰,主要原因有:

• 在時間順序上,系統測試是靠後的階段,越後面的階段發現的問題影響就越大;

• 在測試階段發現的問題的數量和複雜度不确定性較大;

由于我們的過度樂觀主義,我們往往可能對實際出現的問題的預估不夠,系統測試階段的時間預估常常是最不合理的。

而合理有效的做法是:

• 在計劃和方案設計階段的時間要足夠,前期的工作做到足夠細緻和嚴謹,評估後面的開發時間和測試時間才能更加有效;

• 對于單元測試和聯調測試時間,要安排最夠的多,可能要占接近整個項目一半的時間;

• 對于确定性高的編碼時間,時間配置設定不宜過多,可能隻是整體的1/6時間;

重視系統測試,重視前期的設計,安排足夠的時間,盡可能讓問題在早期就能暴露出來,這樣才會為團隊留出面對不确定性的時空。

空泛的估算

軟體開發工期的估算,我們缺乏有效的科學的資料支撐依據。是以,在管理和需求的壓力之下,技術團隊常常會缺乏堅持的勇氣。

過于緊迫的,空泛的估算,導緻的最終實際的情況可能是事與願違的結果。就像廚師煎蛋,在兩分鐘内正好可以剪出最好的煎蛋。當我們要求提高到1分鐘時,那廚師隻能選擇把火開大,結果可能是無法挽回的:一面已經焦了,一面還是生的。

有時候,過度的妥協,會為系統埋下無數的陷阱。

從長期的價值來說,如果有合理有效的估計,或者在過程中有足夠的堅持不妥協,比經常性的倒排期下的妥協,産生的結果要好的多。

重複的災難

當一個軟體項目進度落後時,加派新的人手進去,并不能夠解決問題,反而會造成更大問題。

Brooks法則:向進度落後的項目中增加人手,組織使進度更加落後。

對于周期長的開發項目,不要試圖重複多次的往裡面加人來保障按時的傳遞,因為:

• 每次增加新的人員進去,都會增加教育訓練學習,交流溝通的硬性的成本;

• 增加的新的人員不宜過多,過多的新人進入,團隊整體的磨合成本會更高;

• 在後期的沖刺階段,不宜增加新的人員,新人會分散團隊成熟人員的精力;

要在預期内完成項目,建議: 

前期加人:在項目前期增加合适的數量人員,重新評估合理的工期;

重新安排進度:根據實際情況,避免小的偏差,在新的進度中配置設定充分的時間,重新确定有效的時間進度; 

消減任務: 

  1. 根據實際情況,消減部分非關鍵的任務,優先保障核心的任務的順利完成;
  2. 每次增加人手都會增加總體的工作量:任務的重新配置設定導緻的工作中斷;
  3. 新人的教育訓練學習成本;
  4. 額外增加的互相間的交流溝通成本。

試圖通過不斷往團隊中增加新的成員,來保障項目的按時完成,這是一種外行的,瘋狂的做法。

寫在最後

由于軟體開發工作的複雜性和不确定性,現實中是不會存在理想的人月神話的。

繼續閱讀