(二)成本估算
為了使開發項目能夠在規定的時間內完成,而且不超過預算,成本估算的管理控制是關鍵。計算機廣泛使用有35年,而高級語言應用僅30年。費用估算大約開始于50年代的第一個大型程序設計,60年代估算過于樂觀,結果費用大大超支,70年代以后,費用估算才引起人們的普遍重視。由于影響軟件成本的因素太多(如人、技術、環境以及政治因素等),直到最近,軟件成本估算仍是一門很不成熟的技術,國外已有的技術只能作為我們的借鑒。
1.成本估算方法
有兩種基本的估算方法:自頂向下和自底向上。自頂向下的方法是對整個項目的總開發時間和總工作量做出估算,然后把它們按階段、步驟和工作單元進行分配。自底向上的方法則正好相反,分別估算各工作單元所需的工作量和開發時間,然后相加,就得出總的工作量和總的開發時間。
兩種方法都要求采用某種方法做出估算。有許多現成的方法可以利用,大致可分為三類:(1)專家估算法(2)類推估算法;(3)算式估算法。
(1)專家估算法
這種方法依靠一個或多個專家,對要求的項目做出估計,其精確性主要取決于兩點,即專家對估算項目的定性參數的了解和他們的經驗。后者類似于類推估算法。
(2)類推估算法
自頂向下的方法中,類推估算法是將估算項目的總體參數與類似項目進行直接相比得到結果。自底向上的方法中,類推是在兩個具有相似條件的工作單元之間進行。
(3)算式估算法
專家估算法和類推估算法的缺點在于,它們依靠帶有一定盲目性的和主觀的猜測對項目進行估算。算式估算法則是企圖避免主觀因素的影響。用于估算的算式方法有兩種基本類型:
(1)由理論導出;(2)由經驗得出。
2.每項任務工作量的成本估算方法
開發過程中,最常用的是每項任務工作量的成本估算方法。工作量可以用人-日、人-月或人-年的數量來表示。知道單位工作量的成本,就可得到估算成本。下面仍以上節中的CAD軟件包為例,估算步驟如下:
①確定任務 即每個功能都必須經過需求分析、設計、編碼和測試工作②確定每項任務的工作量,對每項任務要估算它們所需要的人-月數。
③找出與各項任務的對應的勞務費數據 即每個單位工作量成本(元/人-月)。因為各階段的勞務費用不同,需求分析和概要設計階段需要較多的高級技術人員;而詳細設計、編碼和早期測試則要求較多的初級技術人員。而他們的工資是不相同的。
④計算 計算各個工作各個階段的成本和工作量,然后計算總成本和總工作量。
⑤分析比較 在整個開發工作量中,需求分析和設計用去了75人-月,約占全部分任務工作量的50%,說明了這項工作的重要性。勞務費反映了勞動者的成本,其中包括管理費。需求分析的勞務費(5200元/人-月)比設計、編碼和單元測試都高,這也說明了這項工作的重要性。
(三)進度安排
軟件開發項目的進度安排可以有兩種考慮方式。第一種,系統最終交付使用的日期已經確定,軟件開發機構必須在合同規定的時間內安排;第二種,只確定了大致的年限,最后交付使用的日期由軟件開發機構根據具體情況確定。后一種考慮能夠對軟件開發任務進行細致的分析;能夠最好地利用資源,合理地分配工作量,但實際工作中常常遇到第一種情況,問題是軟件管理人員如何在規定的期限內分配人力和安排進度。進度安排的好壞往往影響整個項目的按期完成和用戶的使用,如不能按期完成,用戶就會不滿,而且需向用戶賠償損失。如作為商品,將會失去市場競爭力。
進度安排的精確性有時比成本估算更重要。在商品生產的社會中,某種商品的損失往往還可以通過其他商品或分期償還來承擔。而進度拖延的損失是無法彌補的。下面就軟件開發項目進度安排中的幾個問題進行討論。
1.軟件工作的特殊性
制定軟件進度與其他工程沒有很大的區別,因此使用一般的通用技術和工具即可。但重點要強調的是軟件產品是邏輯產品,這與其他工程不同。因此當幾個人共同完成某項任務時,人與人之間就有一個思想交流問題,稱之為通信關系。通信是要付出代價的,不只是要花時間,同時由于通信中的疏忽常常會使錯誤增加。如一個組有4個軟件工程師,兩兩之間進行通信聯系,通信路徑有6條;對6個軟件工程師,則通信路徑增加至14條。因此所付的代價就必然會增加,所以工作組的人員不宜太多,一般3—5人為好,目前國外一般采用主程序員組的制度。另一點要強調的是軟件工作切忌中間臨時加人,必須在安排進度時就考慮周到。
2.各階段工作量的分配
估算出總的工作量以后,就需要一個可以進行各階段工作量分配的模型。某一階段工作量所占的百分比必須根據經驗數據確定。這里要再一次強調,在開發過程中保存的記錄將增加經驗數據庫存,而且將改善今后估算的準確性。
R.S.Pressman提出一種稱作40-20-40的工作量分配規則,即前期工作(計劃、需求分析、概要設計和詳細設計階段)和后期工作(測試階段)各占40%,編碼階段占20%。
應該強調要重市馨期和后期工作。前期工作容易被忽視,主要原因是:管理人員認為不開始編碼工作就算沒有進行,他們不了解前期工作的重要性;技術人員往往也急于編碼,認為寫出代碼任務就算完成了。后期工作也容易被忽視,認為編碼出來就完事了,對測試工作要占這么大的工作量沒有思想準備。所以要制定好進度計劃,就要研究軟件工作的規律,前期基礎工作沒做好,將會給后期工作帶來很大困難,往往使工程進度一拖再拖,難以堅持,有的不得不中途夭折。
3.制定開發進度
需要涉及的下一個未知量是開發進度。進度安排是軟件計劃工作中一項最困難的任務,計劃人員要把可用資源與項目工作量協調好;要考慮各項任務之間的相互依賴關系,并且盡可能地平行進行;預見可能出現問題和項目的“細脖子”,并提出處理意見;以及規定進度,評審和應交付的文檔。
假設用作變量的開發時間TD接線性變化,而且已經得到了總的開發工作量估算值ED,要求在規定的時間TD內完成,在項目中最好有參加工作的人員平均值M,即M=ED/TD,這將是一個非常有用的數據。遺憾的是在上述算式中,項目的工作量和開發時間不能作為獨立的變量。Brooks定律描述了這種現象的最極端情況:為誤期的軟件項目增加人員將會使其進度更慢。估算開發時間可以使用類似于工作量的估算法。一些研究人員指出,開發時間與開發工作量之間十分精確地滿足下面關系 TD=a(ED) b
其中a和b為經驗常數,若ED以人-月為單位,則TD的單位為月,a和b的大小分別為2到4和0.25到0.4。
算式TD=a(ED) b 給出了名義開發時間。某些其他模型能夠表示出名義開發時間發生變化后,開發工作量將如何變化。如COCOMO模型,最多只能壓縮到名義開發時間的75%。所增加的這一部分工作人員的工作量都消耗在保持項目人員通信開銷中了。
4.軟件開發組織
有多少個軟件開發機構,幾乎也就有多少人員的組織機構。不管這些組織機構是好或壞,一般是不可能輕易改變的。盡管組織機構的改變不屬于軟件計劃人員的職責范圍內的事。不過,在一個新的軟件項目中直接涉及人員的組織問題卻是可以,也應該在軟件計劃階段加以認真考慮的。
對于一個需要n個人工作k年的軟件項目,如何使用人員資源,可能有以下幾種選擇:
(1)把m項不同功能的軟件分配給n個人去完成,他們之間無需多少合作,主要協調的任務由一位軟件主管人員來負責。這樣,軟件主管可能同時需要管理多個不同項目;
(2)把m項不同功能的軟件分配給n個人去完成(m≤n),這樣可能就要建立一些非正式的小組,并指定小組負責人,而小組之間的協調工作則由軟件主管負責;
(3)n個人被組成k個小組,每個小組分配一個或多個功能,并有具體組織,協調工作由小組和軟件主管共同進行。
雖然對上述每一種方案都可能說出贊成或反對的理由。然而,有越來越多的證據表明,第三種方案,即正式的小組是最好最有效的。
正式的小組的方案來源于“主程序員小組”的概念。它是由Harlan Mills首先提出,并由Baker進一步闡述的。小組的核心由一位高級工程師(主程序員)、2至5位技術人員和一位后備工程師組成。主程序員負責小組的所有技術活動的計劃、協調和評審工作;技術人員負責項目的具體分析和開發;后備工程師則支持主程序員工作,必要時能代替主程序員工作,以便使項目能繼續進行,而使損失最小。
主程序員小組有一名或多名專家(如數據庫設計或通信方面專家)、數名輔助人員(如秘書和打字員)和一名資料員參加工作。資料員同時為多個小組工作,具體完成下列工作:
(1)保存和管理所有軟件配置(包括各種文檔、源程序清單、數據和各種磁介質資料);
(2)協助收集和整理軟件生產率數據;
(3)對可修改的模塊分類及編寫索引;
(4)協助小組進行調查、評價和準備文檔等。主程序員小組的主要目標是發揮集體力量。因引,小組要培養從“全局”觀點出發進行程序設計,把“我的”程序變為“我們的”程序;幫助消除軟件的個人屬性,小組可以鼓勵更加徹底的評審,并在共同的工作中增加學習,從而改善軟件質量。
在本章中,我們曾討論過人們在工作中有一個需要交流的問題。當采用主程序員小組這種形式時,必須會增加交換意見所需的工作量,這似乎不利于提高軟件開發的生產率。然而,不管怎樣組織,在軟件整個開發過程的總工作量的相當一部分總是要花費在交換意見方面(如計劃、分析和評審等)。雖然,小組的形式增加了內部交換意見的工作量,但是這是有組織的評審,必將減少在設計和編碼中引入的錯誤。結果是測試工作量減少了,從而使小組有更高的生產率。當然,小組中技術人員的數量不宜過多,一般建議2~5人為好。5.軟件計劃
軟件開發過程的每一步都要生產出可交付的文檔,這些文檔可以用來進行評審和作為下一步工作的基礎。
軟件計劃是一份比較簡短精煉的文件。它應該發給有關部門,其中包括:
(1)把該項目所確定的工作范圍和所需的資源告訴軟件主管部門、技術人員和該項目的需求者;
(2)有關該項目的成本估算和進度安排,應告訴軟件主管部門,以便他們進行評審;
(3)還要發給與該項目開發有關的所有人員,給他們提供有關該項目開發的總辦法。軟件計劃應包含以下內容:
1.工作范圍
1.1項目目標 1.2主要功能 1.3其他特性 1.4開發情況
2.資源
2.1人員資源 2.2硬件資源 2.3軟件資源2.4可利用的窗口
3.成本估算
4.進度安排六、軟件開發工具與環境