軟體工程 軟體的估計為什麼這麼難

2021-09-08 07:47:49 字數 2424 閱讀 7346

前兩年在網上看到乙個笑話集錦, 列舉電視劇集中的穿幫情節。 其中乙個是在某纏綿冗長的言情劇中, 乙個叫 「書桓」 的角色沉痛地說 - 「長達八年的抗日戰爭就要開始了…」  書桓同學當時是怎麼估計到抗日戰爭要打八年的?  這一技術讓軟體工程師和專案經理望塵莫及。

軟體專案計畫的乙個重要環節就是估計專案各類工作(特別是各種功能)所需的時間。 如果你沒有書桓同學的能力, 你得好好練習這一技術。 「估計」 這一技術看似容易, 其實大有學問。 steve mcconnell 還專門寫了 《software estimation: demystifying the black art》 一書, 希望能把軟體估計這一神秘技術 「去神秘化」。

在開始估計之前, 我們先分清楚幾個概念 - 目標,  估計和決心, 。

目標:表明乙個希望達到的狀態.  例如:  軟體五一之前要投放市場!  在建校一百周年之時把我校建成世界一流大學!  不論這類目標如何重要, 它們未必能夠實現。

估計:以當前了解的情況和掌握的資源, 要花費多少人力物力時間才能實現某事。

決心:保證在某個時間之前完成預先規定的功能和質量。 例如: 我們跑步前進, 全民煉鋼, 兩年超英趕美!

如果我們混淆了目標, 估計和決心, 那就會犯錯誤, 我們歷史上就有這樣的例子:

- 2023年5月中共八大二次會議肯定了當時中國出現的「大躍進」形勢,認為中國正經歷著 「一天等於二十年」 的偉大時期。調整了「二五」計畫指標,鋼產量由1200萬噸提高到3000萬噸,糧食從5000億斤上公升到7000億斤。提出要使中國在15年或更短的時間內,在主要工業產品產量方面在十年內超過英國、十五年內趕美國(所謂「超英趕美」)。這是乙個估計。

- 偉大領袖在他的批語中寫道:「趕超英國,不是十五年,也不是七年,只需要兩年到三年,兩年是可能的。」這是乙個目標。-大躍進開展只過了半年的時間,**在偉大領袖的影響力之下,  把趕超英國的時間由十五年改為兩年。下面各級組織紛紛動員, 停止其他正常工作, 全民大煉鋼鐵.這是乙個決心。後來全國各地出現了大量的衛星, 和不能用的鋼鐵,  鋼產量, 糧食產量在後面兩年不公升反降。再後來… 

到了1976-77 年, 中國鋼產量終於超過英國。 用了18 - 19 年時間。 扣除當年瞎折騰的幾年, 這和當初估計的時間差不多! 

這樣痛心的例子在軟體專案也可以看到,  軟體專案的延遲更是比比皆是 - 為什麼我們估計得不准呢?  因為難麼?   為什麼軟體估計這麼難呢?  其實所有的估計都難.  不信的話, 我們做一些估計的練習,  不查搜尋引擎, 你估計一下下面的數目 (數量級正確就行):

中國陸地邊界長度 (

參***

) 非洲人口密度  (

參***

) 長江一年的流量  (

參***

) 2023年中國貨幣流通的總量 (

參***

) 乙個80歲的人一生說過多少句話 (

參***

)

怎麼樣? 你的估計和實際情況差幾個數量級?

一些硬體專案的估計相對容易 - 例如: 這邊有一堆磚頭, 估計有 x 塊, 我們 n 個人要把這些磚頭搬到那邊, 每人每小時可以搬 m 塊, 那麼我們估計大概要 x / n / m 小時。 這個估計還是比較靠譜的。

軟體專案的難度還體現在另乙個方面, 寫軟體的人的能力也是要估計出來的數值, 而且沒有合適的衡量單位,  例如:  如果王屋村的移山公司程式設計師果凍一天能寫1000 行c++ **。 那他 10 天就能寫好10,000 行**?!  而且什麼叫寫好10,000 行**?  如果你估計乙個專案的**量是10萬行, 難道 10個像果凍這樣的人 10 天就能做完? 

所以我們做軟體的估計, 事實上是 (估計的工作量 / 估計的人員能力), 如果兩個估計都差一兩個數量級, 那麼我們最終估計的結果就會偏離十萬八千里. 

我在上課的時候給學生布置這樣的課堂練習:

乙個小組的同學 (6-8 人) 決定要徒步遍歷中國陸地邊界,  假設硬體裝備齊全, 估計需要多長時間?

很多軟體專案就是這樣雄心勃勃地開始的, 大家覺得當年某某牛人/公司也這樣做出來世界級的軟體,  我們現在還有網際網路, 我們小組裡還有人精通設計模式, 這有什麼可怕?   他們甚至連硬體裝備都不齊全, 就開始行軍了.

你覺得他們會花多長時間?  用什麼樣的辦法能讓同學們方便地交流各自的估計, 最後到達大致理性和統一的共識?

答案明天揭曉。

為什麼應該學好軟體工程?

我大學學的專業是通訊工程,設定的課程裡沒有軟體工程相關的課。畢業後從事軟體測試工作,作為測試人員,與開發人員溝通是重要的工作內容之一,所以做測試的十多年來,接觸了很多的開發人員,有些開發人員留下了深刻的印象,當然這個印象有好的也有差的。在這些開發人員中,有些人fix bug的速度超快,還不會引入新的...

軟體工程 軟體工程的概述

軟體工程是研究和應用如何以系統性的 規範化的 可定量的過程化方法去開發和維護軟體,以及如何把經過時間考 驗而證明正確的管理技術和當前能夠得到的最好的技術方法結合起來的學科,它涉及到程式語言 資料庫 軟體 開發工具 系統平台 標準 設計模式等方面。先從軟體工程的第一章開始說起 軟體工程的概述,這一章是...

軟體工程 軟體工程的理解

四 軟體危機 五 軟體工程要素及其作用 針對本學期第一次軟體工程課後的思考題,參考課本以及網路上的資料,作出如下自己的思考理解。在此之前,我所做過的工程僅僅侷限於一些課程的大作業上,並沒有更進一步到軟體上面,僅僅是針對某乙個或者某一類問題進行解決。我的看法 1 書上的定義 書上給出了許許多多的定義,...