軟體專案管理流程總結
轉自:風塵浪子
專案管理與軟體開發的質量、效率、最終成果息息相關,本文主要講述軟體專案的風險評估、成本預算、客戶溝通、需要分析、開發管理、成品交付等多個流程。
在現今國內的專案的管理形式十分零亂,對管理欠缺重視,以致很多專案因為失去管理而最終折腰。
很多的實戰形人才只重視於開發環節,而對其他的流程欠缺認識(包括本人),因而導致專案欠缺有條理的、階段化的管理。
本人是一個典型的只重視開發的管理者,在多次的教訓中深刻地體會到管理的重要性,因而以此文章對專案管理作出一個總結,當中存在很多的不足之處,敬請各位點評!
- 風險評估
- 成本預算
- 客戶溝通的過程
- 需求分析
- 面向物件程式設計(略)
- 開發管理
- 產品交付
一、 風險評估
軟體專案風險是指在整個專案週期中所涉及的成本預算、開發進度、技術難度、經濟可行性、安全管理等各方面的問題,以及由這些問題而對專案所產生的影響。專案的風險與其可行性成反比,其可行性越高,風險越低。軟體專案的可行性分為經濟可行性、業務可行性、技術可行性、法律可行性等四個方面。而軟體專案風險則分為產品規模風險、需要風險、相關性風險、管理風險、安全風險等六個方面:
- 產品規模風險
專案的風險是與產品的規模成正比的,一般產品規模越大,問題就越突出。尤其是估算產品規模的方法,複用軟體的多少,需求變更的多少等因素與產品風險息息相關:
(1) 估算產品規模的方法
(2) 產品規模估算的信任度
(3) 產品規模與以前產品規模平均值的偏差
(4) 產品的使用者數
(5) 複用軟體的多少
(6) 產品需求變更的多少
- 需求風險
很多專案在確定需求時都面臨著一些不確定性。當在專案早期容忍了這些不確定性,並且在專案進展過程當中得不到解決,這些問題就會對專案的成功造成很大威脅。如果不控制與需求相關的風險因素,那麼就很有可能產生錯誤的產品或者拙劣地建造預期的產品。每一種情況對產品來講都可能致命的,這些的風險因素有:
(1) 對產品缺少清晰的認識
(2) 對產品需求缺少認同
(3) 在做需求分析過程中客戶參與不夠
(4) 沒有優先需求
(5) 由於不確定的需要導致新的市場
(6) 不斷變化需求
(7) 缺少有效的需求變化管理過程
(8) 對需求的變化缺少相關分析等
- 相關性風險
許多風險都是因為專案的外部環境或因素的相關性產生的。控制外部的相關性風險, 能緩解策略應該包括可能性計劃,以便從第二資源或協同工作資源中取得必要的組成部分,並覺察潛在的問題,與外部環境相關的因素有:
(1) 客戶供應條目或資訊
(2) 互動成員或互動團體依賴性
(3) 內部或外部轉包商的關係
(4) 經驗豐富人員的可得性
(5) 專案的複用性
- 技術風險
軟體技術的飛速發展和經驗豐富員工的缺乏,意味著專案團隊可能會因為技巧的原因影響專案的成功。 在早期,識別風險從而採取合適的預防措施是解決風險領域問題的關鍵,比如:培訓、聘請顧問以及為專案團隊招聘合適的人才等。關於技術主要有下面這些風險因素:
(1) 缺乏培訓
(2) 對方法、工具和技術理解的不夠
(3) 應用領域的經驗不足
(4) 對新的技術和開發方法應用不熟悉
- 管理風險
儘管管理問題制約了很多專案的成功,但是不要因為風險管理計劃中沒有包括所有管理活動而感到驚奇。在大部分專案裡,專案經理經常是寫專案風險管理計劃的人,他們有先天性的不足——不能檢查到自己的錯誤。因而,使專案的成功變得更加困難。如果不正視這些棘手的問題,它們就很有可能在專案進行的某個階段影響專案本身。當我們定義了專案追蹤過程並且明晰專案角色和責任,就能處理這些風險因素:
(1) 計劃和任務定義不夠充分
(2) 對實際專案狀態不瞭解
(3) 專案所有者和決策者分不清
(4) 不切實際的承諾
(5) 不能與員工之間的進行充分地溝通
安全風險
軟體產品本身是屬於創造性的產品,產品本身的核心技術保密非常重要。但一直以來,我們在軟體這方 面的安全意識比較淡薄,對軟體產品的開發主要注重技術本身,而忽略了專利的保護。軟體行業的技術人員流動是很普遍的現象,隨著技術人員的流失、變更,很能會導致產品和新技術的洩密,致使我們的軟體產品被它公司竊取,導致專案失敗。而且在軟體方面關於智慧財產權的認定目前還沒有明確的一個行業規範,這也是我們 軟體專案潛在的風險。迴避風險的方式
(1) 以開發方誘導能保證需求的完整,使需求與客戶的真實期望高度一致。再以書面方便形成《使用者需求》這一重要的文件,避免疏漏造成的損失在軟體系統的後續階段被逐步地放大。
(2) 設立監督制度,專案開發中任何較大的決定都必須有客戶參與進行的,在該專案中專案監督由專案開發中的質量監督組來實施。
(3) 需求變更需要經過統一的負責人提出,並且要使用者需求的稽核領導認可,需求變更應該是定期而不是隨時的提出,而且開發方應該做好詳細的記錄,讓客戶瞭解需求變更的實際情況。
(4) 控制系統的複雜程度,過於簡單的系統結構,對使用者來使用比例會有明顯的折扣,甚至造成軟體壽命過短。反之,軟體結構的過於靈活和通用,必然引起軟體實現的難度增加,系統的複雜度會上升,這又會在實現和測試階段帶來風險。適當控制系統的複雜程度有利於降低開發的風險。
(5) 從軟體工程的角度看,軟體維護費用約佔總費用的55%~70%,系統越大,該費用越高。對系統可維護性的輕視是大型軟體系統的最大風險。在軟體漫長的運營期內,業務規則肯定會不斷髮展,科學的解決此問題的做法是不斷對軟體系統進行版本升級,在確保可維護性的前提下逐步擴充套件系統。
(6) 設定應急計劃,每個開發計劃都至少應該設定一個應急預案去應對出現突發情況和不可遇知的風險。
二、 成本預算
- 成本預算方式
(1) 自上而下的預算方法
自上而下的預方法主要是依據上層、中層專案管理人員的管理經驗進行判斷,對構成專案整體成本的子專案成本進行估計,並把這些判斷估計的結果傳遞給低一層的管理人員,在此基礎上由這一層的管理人員對組成專案的子任務和子專案的成本進行估計,然後繼續向下一層傳遞他們的成本估計,直到傳遞到最低一層。
使用此預算方式,在上層的管理人員根據他們的經驗進行的費用估計分解到下層時,可能會出現下層人員認為上層的估計不足以完成相應任務的情況。這時,下層人員不一定會表達出自己的真實觀點,不一定會和上層管理人員進行理智地討論,從而得出更為合理的預算分配方案。在實際中,他們往往只能沉默地等待上層管理者自行發現問題並予以糾正,這樣往往會給專案帶來諸多問題。
自上而下更適用於專案啟動的前期,與真實費用相差在30% ~ 70%之間。
Scrum使用自上而下的成本預算方式,它不會立即精確地確定成本,而是以最大限度容納客戶對未來產品要求所產生的變更。
(2) 自下而上的預算方法
自下而上方法要求運用WBS(Work Breakdown Structure,工作分解結構)對專案的所有工作任務的時間和預算進行仔細考察。最初,預算是針對資源(團隊成員的工作時間、硬體的配置)進行的,專案經理在此之上再加上適當的間接費用(如培訓費用、管理費用、不可預見費等)以及專案要達到的利潤目標就形成了專案的總預算。自下而上的預算方法要求全面考慮所有涉及到的工作任務,更適用於專案的初期與中期,它能準備地評估專案的成本,與真實費用相差在5% ~ 10%之間。
- 註解:WBS
WBS是面向提交成果對專案的分解,從提交成果的列表可以確定每個提交成果需要執行的活動。Scrum會對WBS進一步細化,把一個迭代分解為一個或多個的工作包,再把工作包分解為細小的開發任務(一般開發任務的開發週期在15個工作小時以內)。
- 確定專案支出
總體成本預算就是結合下列多個成本預算方式綜合計算的開發成本:
(1) 零基數預算
在成本預算的初期應該使用零基數的計算原則,而不可以使用類似於:以上一年總體費用加上20% 這樣粗略的方式計算專案成本。
(2) 軟硬體成本、物品成本
物品成本是指類似於:伺服器(RAM 硬碟 CPU NIC卡 RAID簇)成本、維護成本、機房租金、光纖通訊成本、軟體成本等的成本。
計算成本時需要考慮組裝硬碟需時的長短,技術人員需要具備的質素,產品供應商能否提供保證質量,管理時是否需要額外的管理人員這些多方因素。
(3) 軟體許可證成本
(4) 外包成本
當使用類似:視訊、簡訊、移動電信類服務、入口網站等子專案時可以考慮以外包形式完成,以降低開發成本。
(5) 人力資源成本
計算人力資源成本時應該使用以最高和最低的工作效率估算平均效率的方式,計算出人力資源的平均成本。
(6) 維修保養成本
三、 客戶溝通的過程
從客戶溝通的方向出發來看,軟體專案可分為:需求識別、方案定製、專案實施、專案結束等4個不同的階段,各個階段都具有不同的溝通重點。
- 需求識別階段
(1) 文字溝通
在需求識別的前期,應該通過問卷、原型展示、介面展示、邏輯處理展示、準化文件模板等方式進行全方位多角度的分析,隨時將不明確之處反饋給客戶,以期待客戶解答。並以文字記錄的方式建立需要分析書,並要求客戶稽核需求分析書,以達到需要分析與客戶的真實期望高度一致的結果。
(2) 業務邏輯溝通
在進行業務溝通時,應該瞭解客戶的行業語言,以促進業務分析的過程,越過應用需求和開發之間的鴻溝。溝通過程提倡以草圖或者可視資訊化的方式進行, 針對不同層面的企業使用者提供最適合的操作介面。以多角度的方式思考問題,要抓住需求重點,尤其是客戶方領導所關注的創新類和實用類需求。
(3) 需求變更的規範化管理
需求變更在軟體開發類專案中是可以理解的,但必須對需求變更做好規範化的管理,以避免出現需求無止境變更的風險。需求變更必須由統一的負責人提出,並且由使用者需求的稽核領導者認可。需求變更的提出應該是定期而不是隨時的,開發方應該做好詳細的文字記錄,讓客戶瞭解需求變更的實際情況和開發方為之所付出的成本代價。
方案定製階段
該階段專案的主要任務是與客戶共同制定一個以前期明確的需求、雙方的資源、專案開始的階段、實施的時間約定、專案費用限制等為基礎的具有可操作性的專案計劃,從本階段開始爭取客戶全面參與專案的管理,並以雙方的共同利益考慮專案實施的具體計劃與風險規避。專案實施階段
在該階段,軟體專案團隊應該與客戶共同領導專案的實施。同時,專案團隊應實時評估客戶滿意度,並通過持續改進的方式提高客戶滿意度,還應要求客戶參加必要的培訓,以及在必要時檢查專案產品。在出現客戶的需求變更前,應主動與客戶溝通交流,使客戶充分了解專案的每個環節,以及變更帶來的影響,減少需求變更。如果出現客戶需求變更,應與客戶一起共同解決由變更引起的成本、進度、質量變化。結束階段
該階段主要進行專案成果的移交,並把系統交付給維護人員,幫助客戶實現商務目標,結清各種款項。完成這些工作後應該進行專案評估,稽核此專案的成果並總結專案經驗。售前人員注意事項
在產品型專案作為開發成果時,相關銷售人員應該注意:對產品的推銷不應該過分承諾。如果過分承諾,會給後續的專案實施帶來困難;一旦承諾沒有兌現,也會降低客戶滿意度,影響今後合作。如果有附加承諾,一定要以文字形式記錄,讓實施專案經理知曉並傳達給專案組成員。註解:在軟體專案中,需要明確以下四種客戶角色
A. 要明確最終使用部門和使用者,要去了解他們現有的工作方式,要讓他們知道專案的目標框架,知道專案要解決他們的哪些困難,但絕對不是全部困難,這樣可以較好的控制專案範圍。
B. 要明確需求的提出者,他或者他們要能夠代表最終客戶群體。提出產品需求的這類客戶要具有一定的技術、業務能力和權威,能夠真正代表最終客戶團隊的意願和想法,最好有IT基礎,能夠用IT語言描述問題和需求,以利於雙方的溝通、協作,避免產生歧義。
C. 要明確做需求確認的中層領導,他要把握方向。軟體開發專案是解決實際生產或者管理問題,同時 也是領導系統建設的具體實現,做需求確認的客戶領導,既要了解高層領導的系統建設要點和方向,又要諳熟具體業務和生產管理實際。如果是這樣的客戶領導來把 握和決策,對企業軟體開發專案的順利進展作用非凡。
D. 要明確誰來對成品提意見,誰來驗收。專案驗收環節,是專案的收尾環節,如果驗收的人對專案初期的需求目標不瞭解,會從態度和產品實際使用效果上對驗收產生負面的影響,對提供產品的企業關閉專案非常不利。根據實踐總結,由需求提出人和確認人來做項 目的驗收工作,能夠促進專案的順利完成,避免延期。
四、 需求分析
- 需求分析的過程
需求過程包括需求開發和需求管理2個部分:
(1) 需求開發就是對開發前期的管理,與客房的溝通過程,可以分為4個階段:需求獲取、需求分析、編寫需求和需求驗證。
(2) 需求管理:就是軟體專案開發過程中控制和維持需求約定的活動。包括:變更控制、版本控制、需求跟蹤、需求狀態跟蹤。
需求的層次
需求的層次包括:業務需求、使用者需求、功能需求、非功能需求等4個方面。需求開發階段的重點
(1) 提取業務物件
業務物件是指系統使用的真實物件,例如一個供應鏈管理 (Supply Chain Management ,簡稱SCM) 業務物件主要包括:生產批發商、零售商、送貨商、顧客多個層次。
(2) 提取業務流程
在瞭解業務邏輯的過程中,應該列舉出所開發軟體模組的各自職能,並細化每個工作流程,深入分析業務邏輯。
(3) 效能需求
在分析的前期應該注意客戶對所開發軟體的技術性能指標,如儲存容量限制、執行時間限制、安全保密性等。
(4) 環境需求
環境需求是指軟體平臺執行時所處環境的要求,如硬體方面:機型、外部裝置、資料通訊介面;軟體方面:系統軟體,包括作業系統、網路軟體、資料庫管理系統方面;使用方面:使用部門在制度上,操作人員上的技術水平上應具備怎樣的條件。
(5) 可靠性需求
對所開發軟體在投入執行後發生故障的概率,應該按實際的執行環境提出要求。對於重要的軟體,或是執行失效會造成嚴重後果的軟體,應提出較高的可靠性要求。
(6) 安全保密要求
在需求分析時應當在這方面恰當地做出規定,對所開發的軟體給予特殊的設計,使其在執行中,其安全保密方面的效能得到必要的保證。
(7) 使用者介面需求
為使用者介面細緻地規定到達的要求。
(8) 資源使用需求
開發的軟體在執行時和開發時所需要的各種資源。
(9) 軟體成本消耗與開發進度需求
在軟體專案立項後,根據合同規定,對軟體開發的進度和各步驟的費用提出要求,作為開發管理的依據。
(10) 開發目標需求
預先估計以後系統可能達到的目標,這樣可以比較容易對系統進行必要的補充和修改。
- 需求分析的任務
需求分析的主要任務是藉助於當前系統的邏輯模型匯出目標系統的邏輯模型,其流程如下:
(1) 確定對系統的綜合需求(功能、效能、執行、擴充需求)
(2) 製作產品需求文件 (PRD)
(3) 分析系統的資料需求(概念模型、資料字典、規範化)
(4) 匯出目標系統的詳細的邏輯模型(資料流圖、資料字典、主要功能描述)
(5) 開發原形系統
(6) 從PRD提取編制軟體需求規格說明書(SRS)
- 註解:SRS格式
1.引言 2系統概述(專案背景、系統目標、核心業務流程) 3.術語說明 4.系統結構(架構圖、功能圖)5.主體功能與業務邏輯(重點) 6.介面需求(內部、外部介面、) 7.網路總體設計(拓撲網路、主機、組網) 8.執行環境(Linux、Windows、IIS、 WebLogic、Tomcat、OLAP、OLTP、JDK 8.0 、.NET Framework 4.0等)
五、 面向物件程式設計(略)
- 設計原則
(1) SRP單一職責鏈
每個類都應該只負責做一件事。
(2) OCP開封閉合原則
軟體的實體(類、模組、函式等)應該是可以擴充套件的,但是不可修改的。
(3) LSP替換原則
子類必須能替換他們的基型別。
(4) DIP依賴倒置原則
高層模組不應該依賴於低層模組,二者都應該依賴於介面與抽象類。抽象不應該依賴於細節,細節應依賴於物件。
(5) ISP介面隔離原則
不應該強迫客戶依賴於並未使用的介面,而應該把胖介面分離。
- 實現UML建模
(1) 業務物件的提取
(2) 根據SRS、CRC等實現用況建模
(3) 實現業務順序圖
(4) 建立類圖,根據用況圖建立物件之間的關聯
(5) 繪製活動圖、實現協作圖、狀態圖
六、 開發管理
- 建立專案計劃
(1) 設計總體架構
針對系統的實施需要,採取適當的且成熟的框架結構。
(2) 控制可擴充套件度
擴充套件度過大,將提高系統的複雜程度,延長開發時間;擴充套件度過低,會直接影響系統的二次開發與維護。控制系統的可擴充套件性,能提高開發效率,降低系統維護的難度。
(3) 建立基礎設施
合理分配部署軟、硬體等基礎設施所需要的時間與成本(例如:伺服器的訂購安裝、光纖接入、軟體平臺訂購)。
(4) 劃分開發任務
利用WBS(Work Breakdown Structure,工作分解結構)對可交付結果進行分類與劃分。每個專案都能劃分為多個不同階段,每個階段又可以分為多個工作包(Work Package),工作包是WBS裡最小的可交付結果,最後從工作包中分解出多個開發任務列表。
(5) 部署開發進度
一個專案應該按進度劃分為多個開發階段,每個階段的開發週期一般在30~60個工作日以內。在此階段內應該與客戶舉行協商會議,制定產品路線圖,在開發過程中邀請客戶積極參與並提出反饋意見。然後把該時段內的開發任務按照開發難度,依賴性,重要性等多方條件劃分為多個迭代週期。
在Scrum 敏捷軟體開發原則中,應該把每個迭代任務進一步細分為多個開發任務列表,再開發任務分配給組員各自負責,而開發時間應該控制在15個工作小時以內。如果開發時間超出15個工作小時,應該考慮把開發任務再度細化。開發任務建議應該由組員自主選擇,而不要使用強制分配的方式。
(5) 測試專案成果
每個工作包都應該同步部署測試工作,提高專案的質量。對出錯BUG的工作包應該由測試人員以文字方式記錄,向開發人員展示錯誤所在,讓開發人員及時進行修改。
- 管理開發團隊
(1) 組建團隊
按照工作任務與專案時間的前提條件建立團隊,按團隊職責分配人員,一般團隊人數應該控制在8~12人之間。當團隊人數超過15人時,應該考慮把團隊分解成2個獨立團隊,負責不同的開發任務。
(2) 分配開發任務
在每個迭代週期內(一般是15~30個工作日),應該把每個工作包進一步細分為多個開發任務,再開發任務分配給組員各自負責,開發時間應該控制在15個工作小時以內。如果開發任務的開發時間超出15個工作小時,應該考慮把任務再度細化。而開發任務應該以自由選擇的方式分配給每個組員。
(3) 監督開發進度
在迭代的前期舉行一次會議,讓組員瞭解開發的進展及流程,並以自主選擇的方式分配開發任務。期間可使用Microsoft Project等工具記錄開發流程的進展,在每個工作包完成開發後應該進行性功能的測試,並以文字方式記錄測試結果。
每天舉行一次15分鐘的站立會議,讓組員交待昨天已完成的開發任務,當天將要做的任務,與開發過程中所遇到的問題。並在每週末舉行一次例行會議,交待總體程序。
在迭代末期舉行一次衝刺會議,總結專案的進展,交行已完成的任務,回顧該迭代週期內所遇到的問題,為下一個迭代做好準備。
(4) 系統測試
對每個已完成的工作包進行適時的測試,保證系統質量與效能。對測試結果進行文字的記錄,並把測試結果與績效工資收入掛鉤,並以真實資料計算組員的績效收入。
(5) 解決開發中所遇到的問題
對開發人員進行前期培訓,可適當按工作能力分配任務,指導組員的開發。當遇到問題時應該在當天的站立會議時即時提出,並在15個工作小時內解決所遇到的問題以防止問題進一步擴大。
- 監管產品質量
(1) 質量需要的是計劃、設計而並非審查的。在產品建立的初級,必須與“質量保證”(QA)的部門進行協商,以正式文件的方式,決定恰當的質量策略和標準。
(2) 在開發過程中使用TDD(測試驅動開發)的模式,提高開發質量。測試人員應該以文字方式記錄bug,並與開發人員共同工作的,把突出的缺陷演示給開發人員,以提高修改的效率。
(3) 在每個迭代的結束時進行一次產品效果的演示,從客戶、使用者、高層領導中收集反饋資訊。在團隊內部舉行評審會議,分析測試結果,瞭解產品效能,為下次迭代所需要做的改進做好計劃。
- 修改專案計劃
(1) 在產品需要識別階段,應該以文件形式記錄產品功能與開發流程,在開發計劃需要修改時,應該與客戶共同探討,讓客戶瞭解計劃修改對專案進度所造成的影響。
(2) 專案計劃的修改應該由統一的負責人提出,並且由使用者需求的稽核領導者認可。需求變更的提出應該是定期而不是隨時的。
(3) 計劃的變更應該做好詳細的文字記錄,讓客戶瞭解需求變更的實際情況和開發方為之所付出的成本代價。
七、 產品交付
專案的後期稽核
在專案開發最終完成後,對開發人員來說可算是放下工作的重擔,但對專案經理來說這往往是專案的關鍵時刻。前期的風險評估、成本預算、需求分析、軟體設計都是為了引導專案走向這一時刻,此時所有的目光都將投向專案管理人員。你可能發現大量而瑣碎的工作將要在幾個小時內完成,此刻專案經理更需要保持清醒與鎮定,把最後的工作視為微型專案來對待。細緻地對專案進行後期的稽核,分析專案成果、專案團隊的效率、可交付產品的價值,以此稽核結果可作為專案管理經驗總結的一部分。質量評審
在專案交付前,應該把專案交給相關的“質量保證”(QA)部門進行質量評審,並邀請典型使用者感受產品的質量。專案的最終交付
正常情況下在專案的前期就會訂立專案交付的協議,專案交付方式分為非正式驗收與正式驗收兩種。一般在專案完成後都會先進行非正式驗收,讓客戶體會專案的質量並提出反饋意見,最後在客戶肯定產品質量後再以書面協議的形式進行正式的產品驗收。專案的最終報告
在專案的最後,應該制定專案的最終報告,此報告可以視為是對該專案一個記錄,但報告不必包含專案的所有方面。一般最終報告應該包含以下方面:
(1) 最初引進專案時的初期專案檢視
(2) 對該專案的價值評估及支援性資訊
(3) 專案的範圍
(4) 專案的開發流程及WBS
(5) 專案的會議記錄
(6) 專案變更的報告及變更的理由
(7) 與專案相關的溝通過程檔案
(8) 專案的稽核報告與客戶驗收報告
(9) 專案成員的表現報告
(10) 專案的最終成果