招待費用:項目組成員因工作需要,和客戶相關人員吃飯、娛樂的相關費用。例如:需求調研期間和客戶吃飯;項目實施階段因推動驗收和客戶一起加班,加班后請客戶吃飯。這筆費用一般不會很大,一頓飯一般是幾十到一百多元,一個項目也不會請很多次吃飯。
采購費用:采購項目所需的軟硬費用,如數據庫平臺、服務器等,如果項目部分內容要外包出去,那還要包括外包的費用。有時候這筆費用會比較巨大,但這些費用都很容易估計。
以上費用難估計的是人工費,人工費我們以工作量來考慮,下文開始我們重點講解項目工作量的估算。
如何估計項目的工作量呢?
簡單地說,我們需要將項目的所有工作進行分解,直到每個分解后的工作都能估計出具體的所需時間來。
那項目的“所有工作”包含什么呢?回答這個問題其實是回答“估算要估啥?”這個問題了。
一般情況下,項目工作包括以下內容:
1.項目前期工作。
包括商務談判、技術方案準備、投標準備、前期需求調研、前期技術研究等工作。當你接手項目的時候,這些工作往往已經做了,你估算項目工作量時,不要忘記這些已經花費的工作量。
2.商務方面的工作。
從客戶開始有意向做這個項目,一直到項目驗收、維護,整個過程中都會貫穿商務活動。前期的商務活動有商務談判、投標準備、合同簽署等,而簽訂合同后的商務活動有項目請款和催款、促進驗收等。某些商務活動屬于灰色地帶,如請客、送禮等,這些往往是花費巨大的。一般來說我們不需要估算灰色地帶的商務活動,灰色地帶的商務活動公司的高層會考慮的了,但我們需要對正常的商務活動進行估算。
3.需求調研方面的工作。
需求調研是一個“反復”的過程,一般來說能在前期確定80%已經是很了不起的成績。
需求調研的工作量一般由三部分組成:前期調研的工作量,后期需求細化的工作量,后期需求變更的工作量。
前期調研的工作包括:項目組內部討論、確認,與客戶討論、確認需求,編寫需求規格說明書及組織評審等工作。
需求細化是指對之前已確定需求的進一步具體化、優化或輕微調整,如:界面細節的確認、各業務概念的具體化等。需求細化一般是可預見可估計的。
需求變更是指對之前已確認需求的“否定”,變更的原因主要有兩種情況:一是之前需求調研工作沒有能做好,理解錯客戶的真正意圖或者是遺漏重要的需求;二是客戶業務情況發生變化,與之前情況已經不同。第一種情況應該盡量避免,而第二種情況一般是難以估計的。需求變更時需重新估算,和客戶簽訂需求變更協議。
我們一般會充分估計前期需求調研工作量以及需求細化工作量,對于需求變更則暫不考慮,因為一旦變更我們會和客戶確認需求變更的費用。但有些項目有很特殊,項目報價中預留了少量的需求變更費用,這時估算中需要適當考慮需求變更了。
4.軟件設計方面的工作。
不少項目為了“趕”進度,設計文檔很少,然則項目真的很簡單、不需要仔細考慮設計的情況是非常少的!
軟件設計工作包括:
1)系統架構設計。
2)技術方案選擇。
3)關鍵模塊設計。
4)數據庫設計。
5)用戶體驗設計。
以上內容具體項目可以有所取舍,但不可能全部都不用考慮。
另外不要忘記了以下兩方面的工作:
1)各類設計工作產品的討論、確認、評審工作。
2)設計細化與優化工作。設計是需要持續改進的,不要忘記這些工作。
5.編碼方面的工作。
要注意不要遺漏代碼返工、代碼評審、代碼調試、修復缺陷的工作量。
需求、設計沒有做好,編碼質量不過關,這些會嚴重增加代碼返工、代碼調試、修復缺陷的工作量。代碼首次完成的時間如果是100小時,那么后面代碼調試、修復缺陷等所需要的時間可能是200小時以上,往往我們估算時只考慮了前面的100小時。
6.測試方面的工作。
測試工作包括測試計劃、測試用例、測試文檔評審、測試環境準備、測試數據準備、執行測試、回歸測試等內容。
軟件測試一般要經歷多輪,我們估算往往只考慮了第一輪,好象軟件只需要測試一回不用再測試了。而測試環境準備、測試數據準備這些工作也很容易在估算時“忘記”了。
7.實施方面的工作。
實施工作包括實施計劃、實施方案的準備,編寫管理員手冊、用戶手冊,熟悉系統,搭建實施環境并進行演練,在客戶現場安裝、部署、調試系統,培訓客戶,協助系統上線,推動驗收等工作。
我們公司通常的做法是:
1)系統在客戶處部署后,會推動客戶進行初步驗收,初驗標準是系統的所有功能跑可以了。初驗成功,客戶需要支付相應的項目款項。
2)初驗后要協助客戶讓系統正式上線,讓客戶真正用上這套系統,推動終驗收。
影響終驗主要有兩個因素,一個是客戶在使用系統過程中會提出各式各樣的問題,如果在需求范圍內應該都予以滿足;而另外一個影響因素是客戶會因為各種各樣的原因推遲使用系統,或者是使用不充分,讓項目終驗無期。估算時需要充分考慮這兩個影響因素。
8.維護方面的工作。
項目終驗后,一般都要提供半年到一年的維護服務,維護器后項目還會有后一筆款項。
維護期比較長,事情繁雜,一個不小心很容易估算不足。
維護的工作一般有:
1)用戶培訓;
2)協助客戶錄入資料;
3)修復被破壞的數據以及數據庫;
4)修改客戶或內部發現的軟件缺陷;
5)代碼重構,提高部分程序的性能與可靠性;
6)修改一些界面文字或顯示風格;
7)回答客戶反饋的一些安裝與操作疑難問題;
8)提供合同中所要求的其它特殊軟件維護服務。
在維護期,往往還需要發布數個小版本來解決客戶的問題。