官术网_书友最值得收藏!

第1章
軟件項目管理概述

1.1 項目與軟件項目

“軟件”“項目”“軟件項目”等概念已經越來越被大家所熟悉,并且普遍存在于生活和社會的各個方面。軟件行業是一個極具挑戰性和創造性的行業,而軟件項目管理也是一項具有挑戰性的工作,同時,也是保證項目成功的必要手段。

1.1.1 項目及其特征

人類社會和日常生活中有很多的活動,有的活動稱為項目,有的活動則不能稱為項目。項目(project)是為了創造唯一的產品或提供唯一的服務而進行的臨時性的努力;是以一套獨特而相互聯系的任務為前提,有效地利用資源,在一定時間內滿足一系列特定目標的多項相關工作的總稱。一般來說,日常運作和項目是兩種主要的活動。它們雖然有共同點—例如,都需要由人來完成,均受到有限資源的限制,均需要計劃、執行、控制—但項目是組織層次上進行的具有時限性和唯一性的工作,也許只需要一個人,也許涉及成千上萬個人,也許需要100小時完成,也許要10年才能完成,等等。“上班”“批量生產”“每天的衛生保潔”等屬于日常運作,不是項目。項目與日常運作的不同是:項目是一次性的,日常運作是重復進行的;項目是以目標為導向的,日常運作是通過效率和有效性體現的;項目是通過項目經理及其團隊工作完成的,日常運作是職能式的線性管理;項目存在大量的變更管理,日常運作基本保持持續的連貫性。下面介紹項目具有的特征。

? 目標性。項目的目的在于得到特定的結果,即項目是面向目標的。其結果可能是一種產品,也可能是一種服務。目標貫穿于項目始終,一系列的項目計劃和實施活動都是圍繞這些目標進行的。例如,一個軟件項目的最終目標可以是開發一個學生成績管理系統。

? 相關性。項目的復雜性是固有的,一個項目有很多彼此相關的活動,例如,某些活動在其他活動完成之前不能啟動,而另一些活動必須并行實施,如果不能協調地開展這些活動,就不能實現整個項目的目標。

? 臨時性。項目的臨時性是指項目有明確的起點和終點。臨時性并不一定意味著項目的持續時間短。項目要在一個限定的期間內完成,是一種臨時性的任務。當項目的目標達到時,意味著項目任務完成。項目管理主要用來保證在預定時間內完成項目任務,為此而制訂項目計劃進度表,標識任務何時開始、何時結束。項目任務不同于批量生產,批量生產是指相同的產品連續生產,取決于要求的生產量,當生產任務完成時,生產線停止運行,這種連續生產不是項目。

? 獨特性。在一定程度上,項目與項目之間沒有重復性,每個項目都有其獨自的特點。每一個項目都是唯一的。如果一位建筑工程師要按照規范建造第五十棟住宅,該住宅的獨特性一定很低,它的基本部分與已經建好的第四十九棟住宅是相同的,如果說它有特殊性,也只是在于其地基不同、使用了一個新的熱水器、請了幾位新木工等。然而,如果要為新一代計算機設計操作系統,則該工作必然會有很強的獨特性,因為沒有人做過這個項目,可供參考的經驗并不多。

? 資源約束性。每一個項目都需要運用各種資源作為實施的保證,而資源是有限的,所以資源是項目成功實施的一個約束條件。

? 不確定性。項目開始前,應當在一定預算的基礎上制訂一份計劃,但是,在項目的具體實施過程中,外部因素和內部因素總是會發生一些變化,存在一定的風險和很多不確定性因素,因此項目具有不確定性。

1.1.2 項目、項目群、項目組合的關系

圖1-1展示了項目、項目群和項目組合之間的關系。

(1)項目與子項目

項目(project)是“為創造唯一的產品、服務或結果而開展的一種暫時性活動”。在軟件工程中,有各種類型的項目,如產品開發、外包服務、軟件維護服務、服務創建等。在產品生命周期中,可能需要多個項目。例如,在產品概念階段,可啟動一個決定產品目標客戶和市場需求的項目,而在產品維護階段,可設立一個生產該產品下一版本的項目。

圖1-1 項目、項目群和項目組合之間的關系

子項目(subproject)是指將項目分解為更小的單位,以便更好地控制項目。項目中的某一階段可以是一個單獨的項目,也可以是一個子項目,子項目可以轉包給外部機構的一個單元。在實際工作中,子項目的劃分是很靈活的,可以視項目的需要而定。可以按照階段劃分子項目(如一期項目、二期項目……),也可以按照項目的組成部分劃分子項目。

(2)項目群

項目群(program)是一組相互聯系的項目、子項目以及受控過程的活動。通常使用程序來定義和管控在有限時間內面向單一客戶或者市場的不同提交物。項目群也稱為大型項目,是通過協調來進行統一管理的一組相互聯系的項目,它本身可能不是項目。許多大型項目通常包括持續運作的活動。可以將大型項目理解為比項目高一級別的大項目,如“863計劃”“星火計劃”“阿波羅計劃”等。以“863計劃”為例,它的目標是瞄準世界先進水平,集中資源重點投入,爭取在我國部分有優勢的高科技領域有所突破,為我國在21世紀的經濟發展和國防安全創造條件。這樣的目標是戰略性的,很難具體化,但可以通過一系列的具體項目去實現。

(3)項目組合

項目組合(portfolio)是指把項目、項目群、子組合及操作作為一個整體進行管理。通過組合可對一條產品線或者一個組織內部并存的所有資產進行分組與管理。如果考察一個完整的項目組合,會發現它受到決策的影響。

1.1.3 軟件項目

軟件一詞于1956年在美國被正式提出,是指計算機程序及說明程序的各種文檔。軟件是計算機系統中與硬件相互依存的部分,是包括程序、數據及其相關文檔的完整集合。其中,程序是按事先設計的功能和性能要求執行的指令序列,數據是使程序能正常操縱信息的數據結構,文檔是與程序開發、維護和使用有關的圖文材料。軟件項目除了具備項目的基本特征之外,還有如下特點。

? 軟件是一種邏輯實體,不是具體的物理實體,具有抽象性,這使得軟件與硬件或者工程類項目有很多的不同之處。

? 軟件的生產與硬件不同,開發過程中沒有明顯的制造過程,也不存在重復生產過程。

? 軟件沒有硬件的機械磨損和老化問題,然而,軟件存在退化問題。在軟件的生存期中,軟件環境的變化會導致軟件的失效率提高。

? 軟件的開發受到計算機系統的限制,對計算機系統有不同程度的依賴。

? 軟件開發至今沒有擺脫手工的開發模式,軟件產品基本上是“定制的”,無法利用現有的軟件組件組裝成所需要的軟件。

? 軟件本身是復雜的,其復雜性來自應用領域實際問題的復雜性和應用軟件技術的復雜性。

? 軟件的成本相當高昂。軟件開發需要投入大量資金和高強度的腦力勞動,因此成本比較高。

? 很多軟件工作涉及社會的因素,例如,許多軟件開發受到機構、體系和管理方式等問題的限制。

軟件項目是一種特殊的項目,它創造的唯一產品或者服務是邏輯載體,沒有具體的形狀和尺寸,只有邏輯的規模和運行的效果。軟件項目不同于其他項目,軟件是一個新領域而且涉及的因素比較多,管理起來比較復雜。目前,軟件項目的開發遠遠不如其他領域的項目規范,很多理論還不適用于所有軟件項目,經驗在軟件項目中仍起很大的作用。軟件項目由相互作用的各個系統組成,“系統”包括彼此相互作用的部分。軟件項目中涉及的因素越多,彼此之間的相互作用就越大。另外,變更也是軟件項目中常見的現象,如需求的變更、設計的變更、技術的變更、社會環境的變更等,這些均說明了軟件項目管理的復雜性。項目的獨特性和臨時性決定了項目是漸進明細的,軟件項目更是如此,因為軟件項目比其他項目有更大的獨特性。“漸進明細”表明項目的定義會隨著項目團隊成員對項目、產品等的理解和認識的逐步加深而得到逐漸清晰的描述。軟件行業是一個極具挑戰性和創造性的行業,軟件開發是一項復雜的系統工程,牽涉各方面的因素。軟件項目的特征包括需求的不確定性和開發過程中存在技術風險。在實際的軟件項目開發工作中,經常會出現各種各樣的問題,甚至軟件項目會失敗。如何總結、分析項目失敗的原因并得出有益的教訓,是今后項目取得成功的關鍵。

現階段,軟件的發展存在以下五大趨勢。

? 計算技術重心轉向網絡,互聯網成為軟件開發、部署和運行的平臺。

? 軟件服務化趨勢逐步從以應用和軟件產品為中心轉移到以客戶服務為中心。

? 智能化趨勢逐步由物理傳感器狀態感知分析向人類意識思維方向轉變。

? 操作系統、數據庫、中間件和應用軟件等相互融合,向一體化平臺發展。

? 大量創新技術、業態模式推動人類社會、國民經濟各行業、數字經濟市場快速發展。

1.1.4 軟件項目組成要素

簡單地說,項目就是在既定的資源和要求的約束下,為實現某種目的而相互聯系的一次性工作任務。軟件項目的要素包括軟件開發的過程、軟件開發的結果、軟件開發賴以生存的資源及軟件項目的特定委托人(或者說是客戶,既是項目結果的需求者,也是項目實施的資金提供者)。

軟件項目的目標就是在一定時間、預算內完成項目范圍內的事項,以使客戶滿意。一個成功的軟件項目應該在項目允許的范圍內滿足成本、進度要求,并得到客戶滿意的產品質量。所以,軟件項目目標的實現受4個因素的制約:項目范圍、成本、進度計劃和客戶滿意度,見圖1-2。項目范圍是為使客戶滿意必須做的所有工作。成本是完成項目所需要的費用。進度計劃安排每項任務的起止時間及所需的資源等,為項目描繪一個過程藍圖。客戶是否滿意要看項目交付的成果質量,只有客戶滿意才能更快地結束項目,否則會導致項目的拖延,從而增加額外的費用。

圖1-2 軟件項目目標實現的制約因素

1.1.5 軟件工程發展階段

按照某些專家的說法,可以將軟件工程劃分為三個時代。1968年“軟件工程”學科誕生為第一代軟件工程,即軟件工程1.0;2001年敏捷宣言發布意味著進入第二代軟件工程,即軟件工程2.0;2023年以ChatGPT為代表的大模型爆發表明進入第三代軟件工程,即軟件工程3.0,如圖1-3所示。

1.第一代軟件工程

第一代軟件工程是指受建筑工程、水利工程等影響的傳統軟件工程,它的誕生可以追溯到1968年。20世紀五六十年代出現了軟件危機,布魯克斯(Frederick P.Brooks)在《人月神話》一書中寫道:軟件開發被喻為讓眾多史前巨獸痛苦掙扎,卻無力擺脫的焦油坑。軟件危機迫使人們去尋找產生危機的內在原因,進而找出消除危機的解決方案。面對軟件危機,人們調查研究了軟件開發的實際情況,逐步認識到采用工程化的方法從事軟件系統的研發和維護的必要性。為了克服這一危機,大家走到一起,共同探討以獲得問題的解決途徑。1968年北大西洋公約組織(NATO)的計算機科學家在德國召開國際會議,討論軟件危機問題,正式提出了“軟件工程”(software engineering)的概念,從此一門新的工程學科誕生了。軟件工程自此得以不斷發展并逐漸成熟起來。傳統軟件工程主要向土木工程、工業工程學習,吸收其實踐方法和經驗。軟件工程1.0體現了以下特征。

? 產品化:交付符合質量標準的組件、構件和系統。

? 過程決定結果:流程質量決定產品質量,一環扣一環,相信良好的過程產生良好的產品,關注過程勝過關注人,也非常關注過程評估和過程改進,如CMM(能力成熟度模型)是其典型代表。

? 階段性明確:需求評審通過了,才能開始設計;設計評審通過了,才能開始實施(編程);編程結束了再進行測試等。瀑布模型是其典型代表。

? 責任明確:角色定義清楚,分工細致。

? 文檔化:強調規范的文檔,存在大量的文檔模板。

? 計劃性強:具有完整的計劃,嚴格控制變更。

? 建筑工程的框架結構設計,在軟件工程上表現為以架構設計為中心。

? 現代制造業流水線的啟發—軟件工廠思想。

? 注重項目管理:圍繞項目開展管理工作,包括風險預防、里程碑控制和關鍵路徑法等。

? 以顧客為中心的全面質量管理。

? 預防為主,檢驗為輔,即缺陷預防思想。

圖1-3 軟件工程的三個時代

2.第二代軟件工程

受互聯網、開源軟件運動、敏捷/DevOps開發模式所影響并最終形成的建立在SaaS(軟件即服務)、云計算基礎之上的軟件工程被定義為“軟件工程2.0”。軟件工程2.0的特征可以簡單概括為下列幾點。

? SaaS:軟件更多是以服務的形式存在。

? 以人為本:個體與協作勝于流程和工具,充分發揮個人和團隊的創造性和潛力。

? 擁抱變化:敏捷開發或輕量級過程,加速迭代,以不變應萬變。

? 持續性:階段性不明確,持續構建、持續集成、持續測試、持續交付,以時間換空間,消除市場風險。

? 融合:強調測試與開發融合、開發與運維融合、推崇全棧工程師等。

? 真正把用戶放在第一位:用戶、產品經理盡可能參與團隊研發過程,注重用戶體驗。

? 強調價值交付:只做對用戶有價值的事情,加速價值流的流動。

? 知識管理,將軟件工程納入知識管理的范疇。

? 史詩般故事、用戶故事、站立會議,讓軟件開發工作更有趣、更健康。

3.第三代軟件工程

在技術突破和創新方法的推動下,軟件工程的發展越來越快,而GPT-4等人工智能(AI)語言大模型的出現也改變了很多行業,對軟件研發的影響更為顯著。考慮到它的發展速度,在不久的將來,AI將開始逐漸承擔一些軟件研發的工作,通過將GPT-4+(指GPT-4及其未來升級的版本)融入軟件研發生命周期中,研發人員的使命將發生變化。GPT-4+將重新定義開發人員構建、維護和改進軟件應用程序的方式,之后的軟件開發會依賴這種全新的語言交流方式(類似ChatGPT),讓這類工具理解研發人員交代的任務并自主完成軟件開發,如理解需求、自動生成UI、自動生成產品代碼、自動生成測試腳本等。此后,研發團隊的主要任務不是寫代碼、執行測試,而是訓練模型、進行參數調優、圍繞業務主題提問或給提示。因此,我們說GPT-4將開啟“軟件工程3.0”新時代。軟件工程3.0具有以下特征。

? 數字化:軟件研發平臺開始能夠理解需求、設計、代碼等,軟件研發從過去的信息化進入數字化時代。

? AIGC:生成軟件的各種ware:驗收標準、測試用例、UI、代碼、測試腳本等。

? 極致的持續交付:雖然軟件工程2.0開始面向CI/CD,但還存在許多障礙,而軟件工程3.0,得益于設計、代碼、測試腳本等的自動生成,可以真正實現持續交付,即及時響應客戶需求,交付客戶所需的功能。

? 人機交互智能:軟件研發過程就是人與計算機的交互過程。

? 以模型和數據為本:研發人員服務于大模型和大數據平臺,包括模型的創建、訓練、調優、使用等。

不同時代的軟件工程,對于軟件項目管理體現為不同的管理方法和模式。軟件工程1.0體現為傳統軟件項目管理模式,軟件工程2.0更多是敏捷化項目管理,同時與傳統軟件項目管理并存。對于軟件工程3.0,智能化時代改變了軟件開發方式,軟件項目管理的方式也應該隨之有所改變。

主站蜘蛛池模板: 监利县| 桂阳县| 盘锦市| 白玉县| 揭西县| 陈巴尔虎旗| 泰和县| 江都市| 乌兰浩特市| 股票| 祥云县| 长泰县| 崇义县| 绍兴市| 宜川县| 文成县| 定西市| 湘潭县| 楚雄市| 神池县| 临湘市| 玛纳斯县| 大足县| 无锡市| 江川县| 新晃| 古蔺县| 阜新| 文水县| 辽源市| 利津县| 汝城县| 安阳市| 昌乐县| 永定县| 大洼县| 江阴市| 乌鲁木齐县| 田林县| 惠东县| 汶川县|