1. 程式人生 > >軟體開發流程(轉載)(介紹迭代的)

軟體開發流程(轉載)(介紹迭代的)

1. 傳統開發流程的問題 
傳統的 軟體開發流程是一個文件驅動的流程,它將整個軟體開發過程劃分為順序相接的幾個階段,每個階段都必需完成全部規定的任務(文件)後才能夠進入下一個階段。 如必須完成全部的系統需求規格說明書之後才能夠進入概要設計階段,編碼必需在系統設計完成之後才能夠進行。這就意味著只有當所有的系統模組全部開發完成之 後,我們才進行系統整合,對於一個由上百個模組組的複雜系統來說,這是一個非常艱鉅而漫長的工作。


隨著我們所開發的軟體專案越來越複雜,傳統的瀑布型開發流程不斷地暴露出以下問題:

  • 需求或設計中的錯誤往往只有到了專案後期才能夠被發現例如:系統交付客戶之後才發現原先對於需求的理解是錯誤的,系統設計中的問題要到測試階段才能被發現。
  • 對於專案風險的控制能力較弱專案風險在專案開發較晚的時候才能夠真正降低,往往是經過系統測試之後,才能確定該設計是否能夠真正滿足系統需求。
  • 軟體專案常常延期完成或開發費用超出預算專案開發進度往往會被意外發生的問題所打亂,需要進行返工或其他一些額外的開發週期,造成專案延期或費用超支。
  • 專案管理人員專注於文件的完成和稽核來估計專案的進展情況所以專案經理對於專案狀態的估計往往是不準確的,當他回答系統已完成了80%的開發任務時,剩下20%的開發任務實際上消耗的是整個專案80%的開發資源。

在傳統的瀑布模型中,需求和設計中的問題是無法在專案開發的前期被檢測出來的,只有當第一次系統整合時,這些設計缺陷才會在測試中暴露出來,從而導致一系列的返工:重新設計、編碼、測試,進而導致專案的延期和開發成本的上升。


2. 採用迭代化開發控制專案風險 
為 瞭解決傳統軟體開發流程中的問題,我們建議採用迭代化的開發方法來取代瀑布模型。在瀑布模型中,我們要完成的是整個軟體系統開發這個大目標。在迭代化的方 法中,我們將整個專案的開發目標劃分成為一些更易於完成和達到的階段性小目標,這些小目標都有一個定義明確的階段性評估標準。迭代就是為了完成一定的階段 性目標而所從事的一系列開發活動,在每個迭代開始前都要根據專案當前的狀態和所要達到的階段性目標制定迭代計劃,整個迭代過程包含了需求、設計、實施(編 碼)、部署、測試等各種型別的開發活動,迭代完成之後需要對迭代完成的結果進行評估,並以此為依據來制定下一次迭代的目標。


與傳統的瀑布式開發模型相比較,迭代化開發具有以下特點:

  • 允許變更需求
    需求總是會變化,這是事實。給專案帶來麻煩的常常主要是需求變化和需求"蠕變",它們會導致延期交付、工期延誤、客戶不滿 意、開發人員受挫。通過向用戶演示迭代所產生的部分系統功能,我們可以儘早地收集使用者對於系統的反饋,及時改正對於使用者需求的理解偏差,從而保證開發出來 的系統真正地解決客戶的問題。
  • 逐步整合元素
    在傳統的專案開發中,由於要求一下子整合系統中所有的模組,整合階段往往要佔到整個專案很大比例的工作量(最 高可達40%),這一階段的工作經常是不確定並且非常棘手。在迭代式方法中,整合可以說是連續不斷的,每一次迭代都會增量式整合一些新的系統功能,要整合 的元素都比過去少得多,所以工作量和難度都是比較低的。
  • 儘早降低風險
    迭代化開發的主要指導原則就是以架構為中心,在早期的迭代中所要解決的主要問題就是儘快確定系統架構,通過幾 次迭代來儘快地設計出能夠滿足核心需求的系統架構,這樣可以迅速降低整個專案的風險。等到系統架構穩定之後,專案的風險就比較低了,這個時候再去實現系統 中尚未完成的功能,進而完成整個專案。
  • 有助於提高團隊的士氣
    開發人員通過每次迭代都可以在短期內看到自己的工作成果,從而有助於他們增強信心,更好地完成開發任務。而在非迭代式開發中,開發人員只有在專案接近尾聲時才能看到開發的結果,在此之前的相當長時間,大家還是在不確定性中摸索前近。
  • 生成更高質量的產品
    每次迭代都會產生一個可執行的系統,通過對這個可執行系統進行測試,我們在早期的迭代中就可以及時發現缺陷並改正,效能上的瓶頸也可以儘早發現並處理。因為在每次迭代中總是不斷地糾正錯誤,我們可以得到更高質量的產品。
  • 保證專案開發進度
    每次迭代結束時都會進行評估,來判斷該次迭代有沒有達到預定的目標。專案經理可以很清楚地知道有哪些需求已經實現了,並且比較準確地估計專案的狀態,對專案的開發進度進行必要的調整,保證專案按時完成。
  • 容許產品進行戰術改變
    迭代化的開發具有更大的靈活性,在迭代過程中可以隨時根據業務情況或市場環境來對產品的開發進行調整。例如為了同現有的同類產品競爭,可以決定採用搶先競爭對手一步的方法,提前釋出一個功能簡化的產品。
  • 迭代流程自身可在進行過程中得到改進和精煉
    一次迭代結束時的評估不僅要從產品和進度的角度來考察專案的情況,而且還要分析組織和流程本身有什麼待改進之處,以便在下次迭代中更好地完成任務。


迭代化方法解決的主要是對於風險的控制問題,從下圖可以看出,傳統的開發流程中系統的風險要到專案開發的後期(主要是測試階段)才能夠被真正降低。 而迭代化開發中的風險,可以在專案開發的早期通過幾次迭代來儘快地解決掉。在早期的迭代中一旦遇到問題,如某一個迭代沒有完成預定的目標,我們還可以及時 調整開發進度以保證專案按時完成。一般到了專案開發的後期(風險受控階段),由於大部分高風險的因素(如需求、架構、效能等)都已經解決,這時候只需要投 入更多的資源去實現剩餘的需求即可。這個階段的專案開發具有很強的可控性,從而保證我們按時交付一個高質量的軟體系統。


迭代化開發不是一種高深的軟體工程理論,它提供了一種控制專案風險的非常有效的機制。在日常的工作我們也經常地應用到這一基本思想,如對於一個非常 大型的工程專案,我們經常會把它分為幾期來分步實施,從而把複雜的問題分解為相對容易解決的小問題,並且能夠在較短週期內看到部分系統實現的效果,通過盡 早暴露問題來幫助我們及早調整我們的開發資源,加強專案進度的可控程度,保證專案的按時完成。

3. 管理迭代化的軟體專案 
當我 們在實際工作中實踐迭代化思想時,Rational統一開發流程RUP(Rational Unified Process)可以給予我們實踐的指導。RUP是一個通用的軟體流程框架,它是一個以架構為中心、用例驅動的迭代化軟體開發流程。RUP是從幾千個軟體 專案的實踐經驗中總結出來的,對於實際的專案具有很強的指導意義,是軟體開發行業事實上的行業標準。

3.1 軟體開發的四個階段 
在RUP中,我們把軟體開發生命週期劃分為四個階段,每個階段的結束標誌就是一個主要的里程碑(如下圖所示)。


這四個階段主要是為了達到以下階段性的目標里程碑:

  • 先啟(Inception):確定專案開發的目標和範圍
  • 精化(Elaboration):確定系統架構和明確需求
  • 構建(Construction):實現剩餘的系統功能
  • 產品化(Transition):完成軟體的產品化工作,將系統移交給客戶

每個目標里程碑都是一個商業上的決策點,如先啟階段結束之後,我們就要決定這個專案是否可行、是否要繼續做這個專案。每一個階段都是由里程碑來決定的,判斷一個階段是否結束的標誌就是看專案當前的狀態是否滿足裡碑中所規定的條件。

從這種階段劃分模式中可以看出,專案的主要風險集中在前兩個階段。在精化階段中經過幾次迭代後,我們要為系統建立一個穩定的架構,在此之後再實現更 多的系統需求時,不再需要對該架構進行修改。同時,在精化階段中,我們通過迭代來不斷地收集使用者的需求反饋,便得系統的需求逐步地明確和完整。

3.2 關於開發資源的分配 
基於 RUP風險驅動的迭代化開發模式,我們只需要在專案的先啟階段投入少量的資源,對專案的開發前景和商業可行性進行一些探索性的研究。在精化階段再投入多一 些的研發力量來實現一些與架構相關的核心需求,逐步地把系統架構搭建起來。等到這兩個階段結束之後,專案的一些主要風險和問題也得到了解決,這時候再投入 整個團隊進行全面的系統開發。等到產品化階段,主要的開發任務已經全部完成,專案不再需要維持一個大規模的開發團隊,開發資源也可以隨之而減少。在專案開 發週期中,開發資源的分配可以如下圖所示。


這樣安排可以最充分有效地利用公司的開發資源,緩解軟體公司對於人力資源不斷增長的需求,從而降低成本。另外一方面,由於前兩個階段(先啟和精化) 的風險較高,我們只是投入部分的資源,一旦發生返工或是專案目標的改變,我們也可以將資源浪費降到最低點。在傳統的軟體開發流程中,對於開發資源的分配基 本上是貫穿整個專案週期而不變的,資源往往沒有得到充分有效地利用。

基於這種資源分配模式,一個典型的專案在專案進度和所完成的工作量之間的關係可能如下表中的資料所示。

先啟 精化 構建 產品化
工作量 ~5% 20% 65% 10%
進度 10% 30% 50% 10%

3.3 迭代策略 
關於迭代計劃的安排,通常有以下四種典型的策略模式:

  • 增量式(Incremental)
    這種模式的特點是專案架構的風險較小(往往是開發一些重複性的專案),所以精化階段只需要一個迭代。但專案的開發工作量較大,構建階段需要有多次迭代來實現,每次迭代都在上一次迭代的基礎上增加實現一部分的系統功能,通過迭代的進行而逐步實現整個系統的功能。
  • 演進式(Evolutionary)
    當專案架構的風險較大時(從未開發過類似專案),需要在精化階段通過多次迭代來建立系統的架構,架構是通過多次迭代的探索,逐步演化而來的。當架構建立時,往往系統的功能也已經基本實現,所以構建階段只需要一次迭代。
  • 增量提交(Incremental Delivery)
    這種模式的特點產品化階段的迭代較多,比較常見的例子是專案的難度並不 大,但業務需求在不斷地發生變化,所以需要通過迭代來不斷地部署完成的系統;但同時又要不斷地收集使用者的反饋來完善系統需求,並通過後續的迭代來補充實現 這些需求。應用這種策略時要求系統架構非常穩定,能夠適應滿足後續需求變化的要求。
  • 單次迭代(Grand Design)
    傳統的瀑布模型可以看作是迭代化開發的一個特例,整個開發流程只有一次迭代。但這種模式有一個固有的弱點,由於它對風險的控制能力較差,往往會在產品化階段產生一些額外的迭代,造成專案的延誤。

這幾種迭代策略只是一些典型模式的代表,實際應用中應根據實際情況靈活應用,最常見的迭代計劃往往是這幾種模式的組合。

3.4 制定專案開發計劃 
在迭代 化的開發模式中,專案開發計劃也是隨著專案的進展而不斷細化、調整並完善的。傳統的專案開發計劃是在專案早期制定的,專案經理總是試圖在專案的一開始就制 定一個非常詳細完善的開發計劃。與之相反,迭代開發模式認為在專案早期只需要制定一個比較粗略的開發計劃,因為隨著專案的進展,專案的狀態在不斷地發生變 化,專案經理需要隨時根據迭代的結果來對專案計劃進行調整,並制定下一次迭代的詳細計劃。

在RUP中,我們把專案開發計劃分為以下三部分:

  • 專案計劃
    確定整個專案的開發目標和進度安排,包括每一個階段的起止時間段。
  • 階段計劃
    當前階段中包含有幾個迭代,每一次迭代要達到的目標以及進度安排。
  • 迭代計劃
    針對當前迭代的詳細開發計劃,包括開發活動以及相關資源的分配。

專案開發計劃也是完全體現迭代化的思想,每次迭代中專案經理都會根據專案情況來不斷地調整和細化專案開發計劃。迭代計劃是在對上一次迭代結果進行評 估的基礎上制定的,如果上一次迭代達到了預定的目標,那麼當前迭代只需要解決剩下的問題;如果上一次迭代中留有一些問題還沒有解決,則當前迭代還需要繼續 去解決這些問題。所以必須注意,迭代是不能重疊的,即你還沒有完成當前迭代時,你決不能進入下一迭代,因為下一次迭代的計劃是根據當前迭代的結果而制定 的。

相關推薦

軟體開發流程轉載(介紹的)

1. 傳統開發流程的問題  傳統的 軟體開發流程是一個文件驅動的流程,它將整個軟體開發過程劃分為順序相接的幾個階段,每個階段都必需完成全部規定的任務(文件)後才能夠進入下一個階段。 如必須完成全部的系統需求規格說明書之後才能夠進入概要設計階段,編碼必需在系統設計完成之後才能夠進行。這就意味著只有當所有的系統

軟體開發流程轉載

概述 我們集中討論如何通過使用兩個流行的方法得到過程的恰當級別:Rational Unified Process 或簡稱 RUP 以及極限程式設計(XP)。我們展示如何在小型專案中使用 RUP 以及 RUP 如何處理 XP 沒有涉及到的領域。二者融合為專案團隊提供了所需的指南--減少風險同時完成交付軟體產品

[微信小程序直播平臺開發]___介紹流程

手機視頻 html5 pre har 性問題 瀏覽器 所在 頁面 直播 1.一個可以忽略的前言 最近在做的一個項目,客戶要做一個直播平臺,主播發起視頻直播,然後其他人進入房間觀看這樣子,跟其他直播平臺不同的是,主播可以打賞觀眾,噗,不過這些千奇百怪的想法我也見怪不怪了,而

軟體開發流程Software development process

首先 看一下基本軟體專案開發流程圖其中1.需求分析:   通過對客戶業務的瞭解和與客戶對流程的討論對需求進行基本建模,最終形成需求規格說明書。 2.總體設計:   通過分析需求資訊,對系統的外部條件及內部業務需求進行抽象建模,最終形成概要設計說明文件。 3.詳細設計:  

vue項目開發流程

訪問 running you 命令 http nbsp div spa new vue的環境配置好之後,讓項目運行起來,一般是localhost:8080,如果是移動端,想在手機上查看效果,可以用電腦ip連接訪問 1.打開控制臺查看本機ip,輸入命令:ipconfig

weexapp 開發流程其他頁面創建

導航 引入 組件 創建 exp 輪播圖 slider 分享圖片 -c 1.首頁 (1)輪播圖 步驟一:創建 輪播圖 組件(Slider.vue) src / assets / components / Slider.vue <!-- 輪播圖 組件 --> &l

安全開發流程SDL學習概述

1.簡介 SDL的全稱是Security Development Lifecycle,即:安全開發生命週期。由微軟最早提出,是一種專注於軟體開發的安全保障流程。為實現保護終端使用者為目標,它在軟體開發流程的各個階段引入安全和隱私問題。 2.流程 SDL大致如下,包括了以下七個階段:

設計模式之軟體開發原則1開閉原則和依賴倒置原則

開閉原則 定義 所謂開閉原則就是一個軟體實體如類、模組和函式應該對擴充套件開放、對修改關閉。 強呼叫抽象構建框架,實現實現拓展細節。 有優點是提高軟體的複用性和易維護展性。是面向物件的最基本原則。 依賴倒置原則 定義 高層模組不應該依賴底層模組,二者都應該依賴其抽象。 抽象不應該依賴細節:細節應該

軟體研發成本估算過程之估算軟體規模概述轉載

通常情況下,規模估算是軟體成本估算過程的起點。估算規模是後續計算軟體專案的工作量、成本和進度的主要輸入,是專案範圍管理的關鍵,因此,在條件允許的情況下,應進行規模估算。在規模估算過程中,需要注意以下情況: a) 在規模估算開始前,應根據可行性研究報告或類似文件明確專案需求及系統邊界。專案

微信開發學習總結——微信開發入門轉載

轉自:https://www.cnblogs.com/xdp-gacl/p/5151857.html   上一篇《微信開發學習總結(一)——微信開發環境搭建》我們已經完成了微信開發的準備工作,準備工作完成之後,就要開始步入正題了。 一、微信公眾平臺的基本原理   在開始

訊息中介軟體詳解轉載

轉載自 : https://blog.csdn.net/leexide/article/details/80035462  1 訊息中介軟體概述 訊息佇列已經逐漸成為企業IT系統內部通訊的核心手段。它具有低耦合、可靠投遞、廣播、流量控制、最終一致性等一系列功能,成為非同步R

Android8.0新特性及開發指南轉載

背景介紹谷歌2017 I/O開發者大會今年將於5月17-19日在美國加州舉辦。大會將跟往年一樣釋出最新的 Android 系統,今年為 Android 8.0。谷歌在今年3 月21日釋出 Android 新系統開發者預覽版時已給新系統取名為 Android O。自2008 年

安全軟體開發入門教程

軟體安全問題有趣的《黑客帝國》終極解釋:《黑客帝國》故事裡面的人物關係,就像電腦裡面的各種程式的關係一樣:電腦裡面的系統程式:Matrix; 病毒程式:以Neo為首的人類; 防病毒軟體:Agent特工、機器章魚、先知(迷惑和引導病毒程式的); 以及出錯程式:Smith和Merovingian。 第一集:病毒程

微信公眾平臺的後臺開發流程

6. 部署、修改完該文件後,點選“成為開發者”按鈕,輸入你剛才部署的檔案的url(例如:http://www.your-server.com/weixin.php)和你剛才修改的TOKEN(例如myweixintoken),點選“提交”。如果沒有意外的話就成功激活了開發者功能。如果不成功,只有三種可能:a)你

【自考】——軟體開發工具

    《軟體開發工具》粗略的看完了一遍,總體的瀏覽嘛,大概瞭解了這本書到底講了些什麼。     在拿到這本書之前我也想過這本書可能會有哪些內容,當時認為既然書名為《軟體開發工具》,那書中應該講解

小程式開發流程附加tabBar框架

(一):第一講 說到client --> pages --> index -->. index.wxml. 為入口檔案; 那麼專案開發當然要從入口開始啦~現在寫一個 hello world 吧~ 畢竟hello world 是程式猿的必經之路呢~完美! (二

TI_BLE_軟體開發者指導2—軟體開發平臺筆記

Texas Instruments CC2540/41 Bluetooth® Low Energy Software Developer’s Guide v1.3.2 Document Number:SWRU271F TI_BLE軟體開發筆記

微信公眾號開發流程--自定義伺服器

一、在微信公眾號平臺註冊公眾號,公眾號型別為服務號; 二、稽核認證 只有認證後的公眾號才具有較全的許可權,比如生成帶引數的微信二維碼; 三、自定義伺服器,本次用BAE(百度雲引擎): 1、開啟百度雲首頁,找到產品分類下的應用引擎BAE: 2、點選購

華為軟體開發DevCloud:免費可商用的專案管理工具

在軟體開發技術和理念層出不窮的今天,如何更快的適應變化的環境,更好的滿足客戶的需求,已經成為決定從小到大各種規模企業能否活下去的關鍵。 天下武功唯快不破,在當今大環境中更是如此,微服務,敏捷開發,新的方法論和技術無時無刻不在提醒我們,要更快響應客戶需求,更快交付,更短的

Linux EMMC子系統分析-初始化流程轉載

最近在解EMMC的一個bug,發現Linux EMMC有點小複雜,先整理個文件出來吧 用的是TI 平臺,僅分析MMC,不分析SD和SDIO mmc_init 2769 static int __init mmc_init(void