欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
軟件開(kāi)發(fā)流程
迭代化軟件開(kāi)發(fā)技術(shù)

1. 傳統開(kāi)發(fā)流程的問(wèn)題
傳統的軟件開(kāi)發(fā)流程是一個(gè)文檔驅動(dòng)的流程,它將整個(gè)軟件開(kāi)發(fā)過(guò)程劃分為順序相接的幾個(gè)階段,每個(gè)階段都必需完成全部規定的任務(wù)(文檔)后才能夠進(jìn)入下一個(gè)階段。如必須完成全部的系統需求規格說(shuō)明書(shū)之后才能夠進(jìn)入概要設計階段,編碼必需在系統設計完成之后才能夠進(jìn)行。這就意味著(zhù)只有當所有的系統模塊全部開(kāi)發(fā)完成之后,我們才進(jìn)行系統集成,對于一個(gè)由上百個(gè)模塊組的復雜系統來(lái)說(shuō),這是一個(gè)非常艱巨而漫長(cháng)的工作。


隨著(zhù)我們所開(kāi)發(fā)的軟件項目越來(lái)越復雜,傳統的瀑布型開(kāi)發(fā)流程不斷地暴露出以下問(wèn)題:

  • 需求或設計中的錯誤往往只有到了項目后期才能夠被發(fā)現例如:系統交付客戶(hù)之后才發(fā)現原先對于需求的理解是錯誤的,系統設計中的問(wèn)題要到測試階段才能被發(fā)現。
  • 對于項目風(fēng)險的控制能力較弱項目風(fēng)險在項目開(kāi)發(fā)較晚的時(shí)候才能夠真正降低,往往是經(jīng)過(guò)系統測試之后,才能確定該設計是否能夠真正滿(mǎn)足系統需求。
  • 軟件項目常常延期完成或開(kāi)發(fā)費用超出預算項目開(kāi)發(fā)進(jìn)度往往會(huì )被意外發(fā)生的問(wèn)題所打亂,需要進(jìn)行返工或其他一些額外的開(kāi)發(fā)周期,造成項目延期或費用超支。
  • 項目管理人員專(zhuān)注于文檔的完成和審核來(lái)估計項目的進(jìn)展情況所以項目經(jīng)理對于項目狀態(tài)的估計往往是不準確的,當他回答系統已完成了80%的開(kāi)發(fā)任務(wù)時(shí),剩下20%的開(kāi)發(fā)任務(wù)實(shí)際上消耗的是整個(gè)項目80%的開(kāi)發(fā)資源。

在傳統的瀑布模型中,需求和設計中的問(wèn)題是無(wú)法在項目開(kāi)發(fā)的前期被檢測出來(lái)的,只有當第一次系統集成時(shí),這些設計缺陷才會(huì )在測試中暴露出來(lái),從而導致一系列的返工:重新設計、編碼、測試,進(jìn)而導致項目的延期和開(kāi)發(fā)成本的上升。


2. 采用迭代化開(kāi)發(fā)控制項目風(fēng)險
為了解決傳統軟件開(kāi)發(fā)流程中的問(wèn)題,我們建議采用迭代化的開(kāi)發(fā)方法來(lái)取代瀑布模型。在瀑布模型中,我們要完成的是整個(gè)軟件系統開(kāi)發(fā)這個(gè)大目標。在迭代化的方法中,我們將整個(gè)項目的開(kāi)發(fā)目標劃分成為一些更易于完成和達到的階段性小目標,這些小目標都有一個(gè)定義明確的階段性評估標準。迭代就是為了完成一定的階段性目標而所從事的一系列開(kāi)發(fā)活動(dòng),在每個(gè)迭代開(kāi)始前都要根據項目當前的狀態(tài)和所要達到的階段性目標制定迭代計劃,整個(gè)迭代過(guò)程包含了需求、設計、實(shí)施(編碼)、部署、測試等各種類(lèi)型的開(kāi)發(fā)活動(dòng),迭代完成之后需要對迭代完成的結果進(jìn)行評估,并以此為依據來(lái)制定下一次迭代的目標。


與傳統的瀑布式開(kāi)發(fā)模型相比較,迭代化開(kāi)發(fā)具有以下特點(diǎn):

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


迭代化方法解決的主要是對于風(fēng)險的控制問(wèn)題,從下圖可以看出,傳統的開(kāi)發(fā)流程中系統的風(fēng)險要到項目開(kāi)發(fā)的后期(主要是測試階段)才能夠被真正降低。而迭代化開(kāi)發(fā)中的風(fēng)險,可以在項目開(kāi)發(fā)的早期通過(guò)幾次迭代來(lái)盡快地解決掉。在早期的迭代中一旦遇到問(wèn)題,如某一個(gè)迭代沒(méi)有完成預定的目標,我們還可以及時(shí)調整開(kāi)發(fā)進(jìn)度以保證項目按時(shí)完成。一般到了項目開(kāi)發(fā)的后期(風(fēng)險受控階段),由于大部分高風(fēng)險的因素(如需求、架構、性能等)都已經(jīng)解決,這時(shí)候只需要投入更多的資源去實(shí)現剩余的需求即可。這個(gè)階段的項目開(kāi)發(fā)具有很強的可控性,從而保證我們按時(shí)交付一個(gè)高質(zhì)量的軟件系統。


迭代化開(kāi)發(fā)不是一種高深的軟件工程理論,它提供了一種控制項目風(fēng)險的非常有效的機制。在日常的工作我們也經(jīng)常地應用到這一基本思想,如對于一個(gè)非常大型的工程項目,我們經(jīng)常會(huì )把它分為幾期來(lái)分步實(shí)施,從而把復雜的問(wèn)題分解為相對容易解決的小問(wèn)題,并且能夠在較短周期內看到部分系統實(shí)現的效果,通過(guò)盡早暴露問(wèn)題來(lái)幫助我們及早調整我們的開(kāi)發(fā)資源,加強項目進(jìn)度的可控程度,保證項目的按時(shí)完成。

3. 管理迭代化的軟件項目
當我們在實(shí)際工作中實(shí)踐迭代化思想時(shí),Rational統一開(kāi)發(fā)流程RUP(Rational Unified Process)可以給予我們實(shí)踐的指導。RUP是一個(gè)通用的軟件流程框架,它是一個(gè)以架構為中心、用例驅動(dòng)的迭代化軟件開(kāi)發(fā)流程。RUP是從幾千個(gè)軟件項目的實(shí)踐經(jīng)驗中總結出來(lái)的,對于實(shí)際的項目具有很強的指導意義,是軟件開(kāi)發(fā)行業(yè)事實(shí)上的行業(yè)標準。

3.1 軟件開(kāi)發(fā)的四個(gè)階段
在RUP中,我們把軟件開(kāi)發(fā)生命周期劃分為四個(gè)階段,每個(gè)階段的結束標志就是一個(gè)主要的里程碑(如下圖所示)。


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

  • 先啟(Inception):確定項目開(kāi)發(fā)的目標和范圍
  • 精化(Elaboration):確定系統架構和明確需求
  • 構建(Construction):實(shí)現剩余的系統功能
  • 產(chǎn)品化(Transition):完成軟件的產(chǎn)品化工作,將系統移交給客戶(hù)

每個(gè)目標里程碑都是一個(gè)商業(yè)上的決策點(diǎn),如先啟階段結束之后,我們就要決定這個(gè)項目是否可行、是否要繼續做這個(gè)項目。每一個(gè)階段都是由里程碑來(lái)決定的,判斷一個(gè)階段是否結束的標志就是看項目當前的狀態(tài)是否滿(mǎn)足里碑中所規定的條件。

從這種階段劃分模式中可以看出,項目的主要風(fēng)險集中在前兩個(gè)階段。在精化階段中經(jīng)過(guò)幾次迭代后,我們要為系統建立一個(gè)穩定的架構,在此之后再實(shí)現更多的系統需求時(shí),不再需要對該架構進(jìn)行修改。同時(shí),在精化階段中,我們通過(guò)迭代來(lái)不斷地收集用戶(hù)的需求反饋,便得系統的需求逐步地明確和完整。

3.2 關(guān)于開(kāi)發(fā)資源的分配
基于RUP風(fēng)險驅動(dòng)的迭代化開(kāi)發(fā)模式,我們只需要在項目的先啟階段投入少量的資源,對項目的開(kāi)發(fā)前景和商業(yè)可行性進(jìn)行一些探索性的研究。在精化階段再投入多一些的研發(fā)力量來(lái)實(shí)現一些與架構相關(guān)的核心需求,逐步地把系統架構搭建起來(lái)。等到這兩個(gè)階段結束之后,項目的一些主要風(fēng)險和問(wèn)題也得到了解決,這時(shí)候再投入整個(gè)團隊進(jìn)行全面的系統開(kāi)發(fā)。等到產(chǎn)品化階段,主要的開(kāi)發(fā)任務(wù)已經(jīng)全部完成,項目不再需要維持一個(gè)大規模的開(kāi)發(fā)團隊,開(kāi)發(fā)資源也可以隨之而減少。在項目開(kāi)發(fā)周期中,開(kāi)發(fā)資源的分配可以如下圖所示。


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

基于這種資源分配模式,一個(gè)典型的項目在項目進(jìn)度和所完成的工作量之間的關(guān)系可能如下表中的數據所示。

先啟 精化 構建 產(chǎn)品化
工作量 ~5% 20% 65% 10%
進(jìn)度 10% 30% 50% 10%

3.3 迭代策略
關(guān)于迭代計劃的安排,通常有以下四種典型的策略模式:

  • 增量式(Incremental)
    這種模式的特點(diǎn)是項目架構的風(fēng)險較?。ㄍ情_(kāi)發(fā)一些重復性的項目),所以精化階段只需要一個(gè)迭代。但項目的開(kāi)發(fā)工作量較大,構建階段需要有多次迭代來(lái)實(shí)現,每次迭代都在上一次迭代的基礎上增加實(shí)現一部分的系統功能,通過(guò)迭代的進(jìn)行而逐步實(shí)現整個(gè)系統的功能。
  • 演進(jìn)式(Evolutionary)
    當項目架構的風(fēng)險較大時(shí)(從未開(kāi)發(fā)過(guò)類(lèi)似項目),需要在精化階段通過(guò)多次迭代來(lái)建立系統的架構,架構是通過(guò)多次迭代的探索,逐步演化而來(lái)的。當架構建立時(shí),往往系統的功能也已經(jīng)基本實(shí)現,所以構建階段只需要一次迭代。
  • 增量提交(Incremental Delivery)
    這種模式的特點(diǎn)產(chǎn)品化階段的迭代較多,比較常見(jiàn)的例子是項目的難度并不大,但業(yè)務(wù)需求在不斷地發(fā)生變化,所以需要通過(guò)迭代來(lái)不斷地部署完成的系統;但同時(shí)又要不斷地收集用戶(hù)的反饋來(lái)完善系統需求,并通過(guò)后續的迭代來(lái)補充實(shí)現這些需求。應用這種策略時(shí)要求系統架構非常穩定,能夠適應滿(mǎn)足后續需求變化的要求。
  • 單次迭代(Grand Design)
    傳統的瀑布模型可以看作是迭代化開(kāi)發(fā)的一個(gè)特例,整個(gè)開(kāi)發(fā)流程只有一次迭代。但這種模式有一個(gè)固有的弱點(diǎn),由于它對風(fēng)險的控制能力較差,往往會(huì )在產(chǎn)品化階段產(chǎn)生一些額外的迭代,造成項目的延誤。

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

3.4 制定項目開(kāi)發(fā)計劃
在迭代化的開(kāi)發(fā)模式中,項目開(kāi)發(fā)計劃也是隨著(zhù)項目的進(jìn)展而不斷細化、調整并完善的。傳統的項目開(kāi)發(fā)計劃是在項目早期制定的,項目經(jīng)理總是試圖在項目的一開(kāi)始就制定一個(gè)非常詳細完善的開(kāi)發(fā)計劃。與之相反,迭代開(kāi)發(fā)模式認為在項目早期只需要制定一個(gè)比較粗略的開(kāi)發(fā)計劃,因為隨著(zhù)項目的進(jìn)展,項目的狀態(tài)在不斷地發(fā)生變化,項目經(jīng)理需要隨時(shí)根據迭代的結果來(lái)對項目計劃進(jìn)行調整,并制定下一次迭代的詳細計劃。

在RUP中,我們把項目開(kāi)發(fā)計劃分為以下三部分:

  • 項目計劃
    確定整個(gè)項目的開(kāi)發(fā)目標和進(jìn)度安排,包括每一個(gè)階段的起止時(shí)間段。
  • 階段計劃
    當前階段中包含有幾個(gè)迭代,每一次迭代要達到的目標以及進(jìn)度安排。
  • 迭代計劃
    針對當前迭代的詳細開(kāi)發(fā)計劃,包括開(kāi)發(fā)活動(dòng)以及相關(guān)資源的分配。

項目開(kāi)發(fā)計劃也是完全體現迭代化的思想,每次迭代中項目經(jīng)理都會(huì )根據項目情況來(lái)不斷地調整和細化項目開(kāi)發(fā)計劃。迭代計劃是在對上一次迭代結果進(jìn)行評估的基礎上制定的,如果上一次迭代達到了預定的目標,那么當前迭代只需要解決剩下的問(wèn)題;如果上一次迭代中留有一些問(wèn)題還沒(méi)有解決,則當前迭代還需要繼續去解決這些問(wèn)題。所以必須注意,迭代是不能重疊的,即你還沒(méi)有完成當前迭代時(shí),你決不能進(jìn)入下一迭代,因為下一次迭代的計劃是根據當前迭代的結果而制定的。


 

Rational開(kāi)發(fā)過(guò)程
 

1. 引言
本文對 Rational 軟件開(kāi)發(fā)過(guò)程(Rational Software Development Process)的原理和結構給出了高度的描述,它是:

  • 迭代的、增量的開(kāi)發(fā)過(guò)程
  • 面向對象的開(kāi)發(fā)過(guò)程
  • 管理和控制的開(kāi)發(fā)過(guò)程

它具有足夠的普遍性,可以在規模與應用領(lǐng)域方面,為各個(gè)軟件產(chǎn)品和項目量身訂做。

2.總體軟件生命周期

2.1 兩種視角
Rational 過(guò)程可以從兩種不同而又密不可分的視角來(lái)觀(guān)察:

  • 從管理的視角來(lái)看,涉及財務(wù)、戰略、商業(yè)和人文方面
  • 從技術(shù)的視角來(lái)看,涉及質(zhì)量、工程和設計方法方面

2.2 周期和階段


從管理的角度,即從業(yè)務(wù)和經(jīng)濟的角度來(lái)看,對應項目的進(jìn)展,軟件的生命周期包含四個(gè)主要階段:

  • 起始階段(Inception)-- 有一個(gè)好的想法:詳細構想出最終產(chǎn)品的設想和它的業(yè)務(wù)案例,確定項目的范圍 。
  • 細化階段(Elaboration)--計劃必要的活動(dòng)和所需資源,詳細確定功能并設計構架 。
  • 構建階段(Construction)-- 構建產(chǎn)品, 發(fā)展最初的設想、構架和計劃,直到一個(gè)可以交付給用戶(hù)的產(chǎn)品(完成后的設想)完成。
  • 移交階段(Transition)-- 將產(chǎn)品移交用戶(hù)使用,包括:制造、交付、培訓、支持、維護,直到用戶(hù)滿(mǎn)意。

完成這4個(gè)階段稱(chēng)為一個(gè)開(kāi)發(fā)周期, 它產(chǎn)生的軟件稱(chēng)作第一代(generation)。 除非產(chǎn)品的生命結束, 一個(gè)現有產(chǎn)品可以通過(guò)重復下一個(gè)相同的起始、細化、構建和移交四階段,各個(gè)階段的側重點(diǎn)與第一次不同,從而演進(jìn)為下一代產(chǎn)品。 這個(gè)時(shí)期我們稱(chēng)之為演進(jìn)(evolution)。最后伴隨著(zhù)產(chǎn)品經(jīng)過(guò)幾個(gè)周期的演進(jìn),新一代產(chǎn)品也不斷被制造出來(lái)。

例如,演進(jìn)周期的啟動(dòng)可能由以下這幾項觸發(fā):用戶(hù)建議增強功能、用戶(hù)環(huán)境的改變、重要技術(shù)的變更,以及應對競爭的需要。


實(shí)際中,周期之間會(huì )有輕微重疊:起始階段和細化階段可能會(huì )在上一個(gè)周期的移交階段未結束時(shí)就開(kāi)始了。

2.3. 迭代
從技術(shù)的角度來(lái)看,軟件開(kāi)發(fā)可以視為一連串的迭代過(guò)程,通過(guò)這些迭代被開(kāi)發(fā)的軟件得以增量演進(jìn)。 每次迭代都以一個(gè)可執行的產(chǎn)品的發(fā)布而結束, 該產(chǎn)品可能是完整版本的一個(gè)子集,但從工程的或用戶(hù)的角度來(lái)看是有用的。 每次發(fā)布都伴隨一些支持性工件:版本描述、用戶(hù)文檔和計劃等。

 


一次迭代包括以下活動(dòng): 計劃、分析、設計、實(shí)施和測試。 根據迭代在開(kāi)發(fā)周期中所處位置的不同,這些活動(dòng)分別占不同的比例。

管理角度和技術(shù)角度之間是協(xié)調的, 而且各個(gè)階段的結束還和各次迭代的結束保持同步。

換句話(huà)說(shuō),每個(gè)階段可以分為一次或多次迭代過(guò)程。

(注意:本圖中每階段的迭代數目?jì)H為示意)

但是,這兩個(gè)角度(管理角度和技術(shù)角度),不僅僅只是保持同步,它們還具有一些完全相同的里程碑,它們共同貢獻出一些隨時(shí)間演進(jìn)的產(chǎn)品和工件。 一些工件更多地處于技術(shù)方面控制之下,另一些工件更多地處于管理方面的控制之下。見(jiàn)第五節。

這些工件的可用性、工件是否滿(mǎn)足所建立的評估標準,是構成里程碑的主要具體元素,比日歷牌上的日期提供了多得多的內容。

像周期一樣,迭代之間也會(huì )有輕微重疊。即第N次迭代的計劃和構架在第N-1次迭代還未結束時(shí)就開(kāi)始了。有時(shí)候,迭代也會(huì )平行進(jìn)行:一個(gè)工作于系統某一部分的小組,可能在某個(gè)迭代內沒(méi)有可交付的工件。

2.4.區別
對于不同的項目而言,每個(gè)階段的側重點(diǎn),入口和出口準則,一個(gè)開(kāi)發(fā)周期的各個(gè)工件,以及各次迭代的數目和長(cháng)度都會(huì )不同。這主要取決于作為過(guò)程判別式的的四個(gè)主要項目特征。按照影響程度降序排列,它們是:

  • 業(yè)務(wù)環(huán)境
    • 契約性工作,開(kāi)發(fā)者基于給定的客戶(hù)規格說(shuō)明只為該客戶(hù)開(kāi)發(fā)軟件。
    • 推測性開(kāi)發(fā)或商業(yè)開(kāi)發(fā),開(kāi)發(fā)者開(kāi)發(fā)軟件以推向市場(chǎng)。
    • 內部項目, 開(kāi)發(fā)者和客戶(hù)在同一個(gè)機構中。
  • 軟件開(kāi)發(fā)工作量的規模:
    按照一些度量標準來(lái)確定,比如 Delivered Source Instructions,或功能點(diǎn)、人-月數,或者只按照成本。
  • 新穎程度:
    對于軟件開(kāi)發(fā)組織,這個(gè)軟件新穎程度如何有多新,尤其是該軟件是否為第二次或更后面的周期。這項區別包括了組織和過(guò)程的成熟度、資產(chǎn)、技術(shù)水平,當前的技狀況,以及諸如組建并培訓團隊、獲取工具及其他資源這樣的問(wèn)題。
  • 應用類(lèi)型,目標領(lǐng)域:
    MIS,命令和控制系統, 嵌入式實(shí)時(shí)系統, 軟件開(kāi)發(fā)環(huán)境工具等等, 尤其時(shí)具體的應用領(lǐng)域會(huì )給開(kāi)發(fā)提出特殊的約束條件:安全性、性能、國際化、內存限制等。
    本文首先描述適用所有類(lèi)型軟件開(kāi)發(fā)的通用過(guò)程,然后描述了一些有區別價(jià)值的特定過(guò)程實(shí)例,并列舉了幾個(gè)例子。

2.5工作量和日程安排
各階段在工作量和時(shí)間安排上是不同的。盡管由于不同項目類(lèi)型之間相差會(huì )很大,一個(gè)典型的中等規模項目的最初開(kāi)發(fā)周期可以預計為下面的比率:

起始階段 細化階段 構建階段 移交階段
工作量 5% 20% 65% 10%
日程安排 10% 30% 50% 10%

可以用下圖表示:


但是對于一個(gè)演進(jìn)周期來(lái)說(shuō),起始階段和細化階段可能大大縮減。使用特定工具和技術(shù)(如應用程序構建器),構建階段可以遠遠小于起始階段和細化階段的總和。

3. Rational 過(guò)程的各個(gè)階段

3.1. 起始階段
這個(gè)階段產(chǎn)生一個(gè)預測產(chǎn)品的最初設想,并將其轉換為一個(gè)實(shí)際的項目。本階段的目的是建立一個(gè)新產(chǎn)品或一次大的更新的業(yè)務(wù)案例,并且指定項目的范圍。

對于一個(gè)新產(chǎn)品的開(kāi)發(fā),本階段的主要結果是得到一個(gè)"做還是不做"的決定以進(jìn)入下一階段,并投入一定的時(shí)間和資金來(lái)詳細分析構建什么、能否構建,以及如何構建。

對于一個(gè)現有產(chǎn)品的演進(jìn),這會(huì )是一個(gè)簡(jiǎn)短的階段, 主要看用戶(hù)或客戶(hù)的要求、問(wèn)題報告,或是新的技術(shù)動(dòng)態(tài)。

對于一個(gè)契約性的開(kāi)發(fā),是否進(jìn)行項目的決定取決于在特定領(lǐng)域的經(jīng)驗、以及組織在此領(lǐng)域的競爭力和市場(chǎng)情況。這里起始階段可以歸結為一個(gè)參加投標的決定,或投標活動(dòng)本身。該決定可能是基于一個(gè)現有的研究原型,其結構對最終軟件可能合適,也可能不合適。

入口準則:

對于一項需要的描述,可以采用以下形式:

  • 一份最初的設想
  • 一個(gè)遺留系統
  • 一份建議請求(An RFP --request for proposal)
  • 先前一代的產(chǎn)品和一個(gè)增強要求清單
  • 一些資產(chǎn)(軟件, 專(zhuān)門(mén)技能, 財務(wù)資產(chǎn))
  • 一個(gè)概念原型或實(shí)物模型

出口準則:

  • 一個(gè)初始的業(yè)務(wù)案例至少要包含以下內容:
    • 對產(chǎn)品設想的明確表達即核心需求,表述為功能、范圍、性能、容量和技術(shù)等。
    • 成功標準 (如收入的數目)
    • 最初的風(fēng)險評估
    • 完成細化階段所需的資源估算

通常在初試階段結束時(shí),我們將得到:

  • 一個(gè)最初的域分析模型(完成大約10%-20%), 確定最關(guān)鍵的用例, 并且足以進(jìn)行進(jìn)構架工作。
  • 一個(gè)最初的構架原型,在這個(gè)階段可以是一個(gè)一次性原型

3.2. 細化階段
本階段的主要目的是更徹底地分析問(wèn)題域,定義構架并使之穩定,確定項目的最大風(fēng)險。這樣在本階段結束時(shí),我們可以得到一個(gè)關(guān)于下2個(gè)階段如何工作的綜合計劃:

  • 一個(gè)基于分析模型的基線(xiàn)產(chǎn)品設想(即最初的需求集合)。
  • 至少對第一次構建迭代的評價(jià)準則。
  • 一個(gè)基線(xiàn)軟件構架。
  • 開(kāi)發(fā)和部署產(chǎn)品的必需資源,尤其是人員和工具。
  • 一份日程安排。
  • 足以對構建階段的成本、日程安排和質(zhì)量做出"精確"的評估的一份風(fēng)險決議。

在這個(gè)階段,建立了一個(gè)可執行的構架原型;它至少實(shí)現了初始階段識別出的最關(guān)鍵的用例 ,解決了項目的最大技術(shù)風(fēng)險;根據范圍、規模、風(fēng)險和項目新穎程度的不同構架原型需要一次或多次迭代。這是一個(gè)生成高質(zhì)量代碼(這些代碼成為架構基線(xiàn))的演進(jìn)原型,但是也不排除開(kāi)發(fā)出一個(gè)或幾個(gè)試探性的、一次性原型,以降低開(kāi)發(fā)的風(fēng)險:對需求、可行性、人機界面研究、向投資者演示等的精化。在本階段的結束時(shí),仍然會(huì )產(chǎn)生一個(gè)"做還是不做"的決定, 以確定是否要真正投資構建這個(gè)產(chǎn)品(或參與合同項目的競標)。

此時(shí)產(chǎn)生的計劃一定要足夠詳細,風(fēng)險也必須充分降低,可以對開(kāi)發(fā)工作的完成進(jìn)行精確的成本和日程估算。

入口準則:

  • 前一階段出口準則所描述的產(chǎn)品和工件
  • 被項目管理者和投資者認可的計劃,和細化階段所需的資源

出口準則:

  • 一份詳細的軟件開(kāi)發(fā)計劃,包含:
    • 更新后的風(fēng)險評估
    • 一份管理計劃
    • 一份人員配置計劃
    • 一份顯示迭代內容和次數的階段計劃
    • 一份迭代計劃,詳細計劃下次迭代
    • 開(kāi)發(fā)環(huán)境和所需的其他工具
    • 一份測試計劃
  • 一個(gè)基線(xiàn)設想,以對最終產(chǎn)品的一個(gè)評估準則的集合的形式
  • 用于評估構建階段最初的迭代結果的客觀(guān)、可測量的演進(jìn)標準
  • 一個(gè)域分析模型(80%完成),相應的構架可以稱(chēng)之為是"完整的"
  • 一個(gè)軟件構架描述(說(shuō)明約束和限制)
  • 一個(gè)可執行的構架基線(xiàn)

3.3. 構建階段
本階段可以劃分為數次迭代,不斷充實(shí)構架基線(xiàn),向最終產(chǎn)品逐步演進(jìn)或增量演進(jìn)。在每次迭代過(guò)程中,上個(gè)階段(細化階段)的工件得到擴充和修正, 但它們最終將隨著(zhù)系統向正確和完整的方向的演進(jìn)而穩定下來(lái)。在這個(gè)階段,除了軟件本身,還生成一些新的工件:文檔(既有內部使用的文檔,也有面向最終用戶(hù)的文檔)、測試床及測試套件、部署附件,以及用于支持下一階段的部署輔助(例如銷(xiāo)售輔助)。

對每次迭代,都具有:

入口準則:

  • 上次迭代的產(chǎn)品和工件。 迭代計劃必須闡明迭代的特定目標:
    • 將要開(kāi)發(fā)的新增功能,覆蓋了哪些用例或場(chǎng)景
    • 本次迭代過(guò)程中減少的風(fēng)險
    • 本次迭代過(guò)程中修改的缺陷

出口準則:

更新后的產(chǎn)品和工件,另外還有:

 
  • 一個(gè)版本描述文檔,記錄了迭代的結果
  • 測試用例和根據產(chǎn)品得出的測試結果
  • 一個(gè)詳細描述下一次迭代的計劃
  • 對下一次迭代的客觀(guān)度量標準

到構建階段的后期,必須完成以下工件,及本階段最后一次迭代額外的出口準則:

  • 一個(gè)部署計劃,指定必需的事項:
    • 打包
    • 定價(jià)
    • 演示
    • 支持
    • 培訓
    • 移交策略 (例如一個(gè)現有系統的更新計劃)
    • 產(chǎn)品 (軟盤(pán)和手冊)
  • 用戶(hù)文檔

3.4. 移交階段
移交階段是將產(chǎn)品交付給最終用戶(hù)的階段。 它涉及銷(xiāo)售、打包、安裝、配置、支持用戶(hù)社區和做出修正等.

從技術(shù)角度來(lái)看,伴隨本階段迭代的是一次或多次發(fā)布:`beta' 版發(fā)布、正式版發(fā)布、修補bug , 或增強版發(fā)布。

當用戶(hù)對產(chǎn)品滿(mǎn)意時(shí),本階段即告結束。 例如,契約性開(kāi)發(fā)時(shí)正式驗收, 或者產(chǎn)品有關(guān)的所有活動(dòng)都已結束。 此時(shí),某些積累的資產(chǎn)可以加以整理,以為下一個(gè)周期或其他項目重用。

入口準則:

  • 上一次迭代的產(chǎn)品和工件, 尤其是足夠成熟可以交付給用戶(hù)的軟件產(chǎn)品

出口準則:

  • 前一階段某些文檔的更新,以及必要時(shí)根據原始及修訂后的成功標準,進(jìn)行"事后"項目性能分析,從而替換原有計劃。
  • 一個(gè)簡(jiǎn)短的清單,列出本次開(kāi)發(fā)周期給組織帶來(lái)的新的資產(chǎn)

3.5. 演進(jìn)周期
對于重要的演進(jìn),我們應用整個(gè)過(guò)程遞歸,仍從起始階段開(kāi)始一個(gè)新的周期。因為我們已經(jīng)有了一個(gè)產(chǎn)品,所以比起一個(gè)初次開(kāi)發(fā)的產(chǎn)品,起始階段可能大大縮短。細化階段也可能縮小范圍,而在計劃方面的關(guān)注程度要大于分析或構架的演進(jìn)方面。需要指出:周期之間可以略有重疊。

較小的演進(jìn)可以通過(guò)延長(cháng)移交階段或增加一兩次迭代來(lái)完成。

移交階段可以以一個(gè)終結過(guò)程而結束,即產(chǎn)品不再演進(jìn)了,但是為了終結它,需要采取一些特定的動(dòng)作。

4. Rational過(guò)程中的活動(dòng)
Rational 過(guò)程中各個(gè)階段的名稱(chēng)(如起始、細化、構建、移交)與描述高級活動(dòng)的術(shù)語(yǔ)(如分析、設計、測試等)相差甚遠。 因此我們容易理解某種活動(dòng)的進(jìn)行并不局限于某個(gè)特定階段,也與其他作者、標準及特定領(lǐng)域的所使用的術(shù)語(yǔ)無(wú)關(guān)。這些活動(dòng)確實(shí)發(fā)生,但它們在每個(gè)階段和每次迭代中的程度有所不同。下圖表明了活動(dòng)重點(diǎn)如何隨時(shí)間的推進(jìn)而發(fā)生演進(jìn)。

 


圖中活動(dòng)重點(diǎn)的變化也說(shuō)明盡管每次迭代在形式上都是"相似"的,但它們的性質(zhì)和內容卻是隨時(shí)間而改變的。

這還表明,一項活動(dòng)的結束并不總意味著(zhù)另一項活動(dòng)的開(kāi)始,即并不是分析完成了才開(kāi)始設計,而是這些活動(dòng)相關(guān)的各種"工件"在隨著(zhù)開(kāi)發(fā)者對問(wèn)題或需求的理解的加深也不斷得到更新。

最后,在一個(gè)迭代過(guò)程中,計劃、測試和集成這些活動(dòng)不是集中堆積在開(kāi)發(fā)活動(dòng)的開(kāi)始和結束階段,而是增量地分布在整個(gè)開(kāi)發(fā)周期的各個(gè)階段、每次迭代之中。 它們并不表現為開(kāi)發(fā)過(guò)程的某個(gè)獨立的階段或步驟。

盡管具體的項目有具體的區別,但對于一個(gè)中等規模、初次開(kāi)發(fā)的典型項目來(lái)說(shuō),其開(kāi)發(fā)周期中各種活動(dòng)的比例如下:

計劃與管理 15%
分析/需求 10%
設計/集成 15%
實(shí)施/功能測試 30%
度量/評估/驗收測試 15%
工具/環(huán)境/變更管理 10%
維護(開(kāi)發(fā)過(guò)程中的修補) 5%

5. 生命周期工件
開(kāi)發(fā)過(guò)程不是文檔驅動(dòng)的:它的工件中必須一直包括軟件產(chǎn)品自身。文檔應該十分精簡(jiǎn),數目不能太多,應只保留那些確實(shí)從管理或技術(shù)的角度有真正價(jià)值的文檔。 Rational 建議保留以下典型的文檔集。

5.1管理工件
管理工件不是產(chǎn)品,而是用來(lái)驅動(dòng)或監控項目進(jìn)展、估計項目風(fēng)險、調整項目資源,以及使客戶(hù)或投資者對項目保持一定的"可見(jiàn)性" 的。

  • 一份機構策略文檔,是機構開(kāi)發(fā)過(guò)程的明文規定。 它包含一個(gè)此類(lèi)項目的實(shí)例。
  • 一份遠景文檔, 描述系統級需求,質(zhì)量要求和優(yōu)先級。
  • 一份業(yè)務(wù)案例文檔, 描述財務(wù)環(huán)境、合同,以及項目的投資回報等等。
  • 一份開(kāi)發(fā)計劃文檔, 包括總體的迭代計劃和當前及近期迭代的詳細規劃。
  • 一份評估標準文檔,包括需求、驗收標準及其他特定的技術(shù)目標,它們由各個(gè)階段演進(jìn)的主要"里程碑"組成。包含迭代的目標和驗收水平。
  • 每次發(fā)布的版本描述文檔。
  • 部署文檔, 包含對交付、培訓、安裝、銷(xiāo)售、制造和交割相關(guān)的有用信息。
  • 狀態(tài)評估文檔: 項目狀態(tài)的階段性"快照", 具有進(jìn)展、人力、開(kāi)銷(xiāo)、結果、關(guān)鍵風(fēng)險、活動(dòng)等的度量標準。

5.2技術(shù)工件
它們或者是交付的產(chǎn)品,可執行的軟件及手冊,或者是一些用于制造產(chǎn)品的藍圖,這些產(chǎn)品包括軟件模型、源代碼和其他有助于理解和演進(jìn)產(chǎn)品的工程信息。

  • 用戶(hù)手冊, 在生命周期早期開(kāi)發(fā)。
  • 軟件文檔, 最好以源代碼自建文檔和模型的形式,其中模型是用合適的CASE工具捕獲并維護的這些模型包括用例、類(lèi)圖和過(guò)程圖等。
  • 一個(gè)軟件構架文檔, 描述軟件的整體構架,及它的主要組成元素的分解說(shuō)明: 類(lèi)的分組、類(lèi)、過(guò)程、子系統、關(guān)鍵接口的定義和關(guān)鍵設計決策的依據。

本文第3部分中列舉的入口準則和出口準則可以映射到這11類(lèi)文檔之中。

上面介紹的這套文檔可以依照具體項目的類(lèi)型進(jìn)行擴充和刪減,一些文檔可以合并。 文檔不必一定是紙張形式---也可以是電子表格、文本文件、數據庫、源代碼的注釋、超文本文檔等等---但相應的信息資源必須被清楚地識別,易于訪(fǎng)問(wèn),也要保存一些歷史記錄。

5.3需求
Rational 軟件開(kāi)發(fā)過(guò)程也不是需求驅動(dòng)的。 在產(chǎn)品演進(jìn)的周期中,需求表現為不同的形式:

  • 業(yè)務(wù)案例給出了主要約束,多是些可用的資源。
  • 遠景文檔從用戶(hù)角度僅描述了系統的關(guān)鍵需求,它在開(kāi)發(fā)過(guò)程中將緩慢演進(jìn)。
  • 更詳細的需求在第二階段(細化階段)以用例和場(chǎng)景的形式進(jìn)行闡明,并在第三階段(構建階段)隨著(zhù)對產(chǎn)品和用戶(hù)需求了解的加深進(jìn)一步精化。這些更詳細的需求記錄在評估標準文檔中,它們驅動(dòng)了構建階段和移交階段迭代內容的定義, 并在迭代計劃中引用。

6. Rational過(guò)程的例子
按照2.4節中所述的區別,Rational 過(guò)程采用不同的形式。 這里有兩個(gè)極端的例子。

6.1大型契約性軟件開(kāi)發(fā)的Rational過(guò)程
對這個(gè)軟件開(kāi)發(fā)項目,Rational 過(guò)程分為3個(gè)階段建立招標, 對應3個(gè)不同類(lèi)型的合同。

  • 一個(gè)研究與設計階段, 包含了生命周期的起始階段和細化階段, 通常以風(fēng)險分擔方式投標,舉例來(lái)說(shuō),成本加獎金合同( cost plus award fee contract ,CPAF)。
  • 一個(gè)生產(chǎn)階段,包含了生命周期的構建和移交階段, 通常作為一個(gè)公司、固定的價(jià)格合同(a firm, fixed price contract ,FFP)來(lái)投標。
  • 一個(gè)維護階段,對應生命周期的演進(jìn)階段,通常作來(lái)工作量水平合同( a level of effort contract ,LOE)來(lái)投標。

因為用戶(hù)需要更高的可視性來(lái)評估項目,還因為項目涉及大量人員和組織,開(kāi)發(fā)過(guò)程應更加正規化,要比小型、內部的項目更加重視書(shū)面工件。第5部分列出的11類(lèi)文檔都以某種形式或名稱(chēng)存在。


6.2小型商業(yè)軟件產(chǎn)品的Rational過(guò)程
在按規模分類(lèi)的過(guò)程家族的另一端,是小型的商業(yè)軟件開(kāi)發(fā)。它的流動(dòng)性更強一些,只有有限的正規性, 表現為一些主要的里程碑和有限的文檔集:

  • 一個(gè)產(chǎn)品遠景 (A product vision)。
  • 一份開(kāi)發(fā)計劃,顯示資源和日程安排
  • 版本描述文檔,在每次迭代的開(kāi)始指明本次迭代的目標,在迭代結束時(shí) 作為版本說(shuō)明(release notes)進(jìn)行更新。
  • 必要的用戶(hù)手冊

軟件結構、軟件設計、開(kāi)發(fā)過(guò)程可以通過(guò)代碼本身或軟件開(kāi)發(fā)環(huán)境來(lái)進(jìn)行文檔化。

 

在項目中集成RUP和XP
概述

我們集中討論如何通過(guò)使用兩個(gè)流行的方法得到過(guò)程的恰當級別:Rational Unified Process 或簡(jiǎn)稱(chēng) RUP 以及極限編程(XP)。我們展示如何在小型項目中使用 RUP 以及 RUP 如何處理 XP 沒(méi)有涉及到的領(lǐng)域。二者融合為項目團隊提供了所需的指南--減少風(fēng)險同時(shí)完成交付軟件產(chǎn)品的目標。

RUP 是由 IBM Rational 開(kāi)發(fā)的過(guò)程框架。它是一種迭代的開(kāi)發(fā)方法,基于六個(gè)經(jīng)過(guò)行業(yè)驗證的最佳實(shí)踐(參見(jiàn) RUP 附錄)。隨著(zhù)時(shí)間的推進(jìn),一個(gè)基于 RUP 的項目將經(jīng)歷四個(gè)階段:起始階段(Inception)、細化階段(Elaboration)、構造階段(Construction)、交付階段(Transition)。每個(gè)階段都包括一次或者多次的迭代。在每次迭代中,您根據不同的要求或工作流(如需求、分析和設計等)投入不同的工作量。RUP 的關(guān)鍵驅動(dòng)因素就是降低風(fēng)險。RUP 通過(guò)數千個(gè)項目中數千名 IBM Rational 客戶(hù)和合作伙伴使用而得到精化。下圖展示了一個(gè)典型迭代過(guò)程的工作流:

典型迭代流

作為風(fēng)險如何影響過(guò)程的一個(gè)例子,我們應該考慮是否需要為業(yè)務(wù)建模。如果由于對業(yè)務(wù)的理解中沒(méi)有考慮到一些重大風(fēng)險,將導致我們所構建的系統是錯誤的,那么我們就應該執行一些業(yè)務(wù)建模工作。我們需要正式進(jìn)行建模工作嗎?這取決于我們的涉眾--如果一個(gè)小團隊將非正式地使用結果,那么我們也許只進(jìn)行非正式的記錄就可以。如果組織中的其他人也將使用結果或者查看結果,那么我們可能就要投入更大的努力,并且確保該結果的正確性和可理解性。

您可以定制 RUP 使其滿(mǎn)足幾乎任何項目的需要。如果沒(méi)有滿(mǎn)足您特定需要的即裝即用的過(guò)程或路線(xiàn)圖,您可以輕松地創(chuàng )建您自己的路線(xiàn)圖。路線(xiàn)圖描述了該項目如何計劃使用過(guò)程,因此代表了該項目的特定過(guò)程實(shí)例。這就意味著(zhù),RUP 可以按需要變得簡(jiǎn)單或復雜,我們將在本文中詳細解釋。

XP 是一個(gè)用于小型項目中的以代碼為中心的輕量級過(guò)程(參見(jiàn) XP 附錄)。它來(lái)自 Kent Beck 的創(chuàng )意,在大概 1997 年 Chrysler 公司的 C 3 工資單項目中得到軟件界的關(guān)注。如同 RUP 一樣,XP 也是基于迭代的,并且體現了諸如小規模發(fā)布、簡(jiǎn)單設計、測試以及持續迭代幾項實(shí)踐,。XP 為恰當的項目和環(huán)境引入了一些有效的技術(shù);不過(guò),其中也存在隱藏的假設、活動(dòng)和角色。

RUP 和 XP 具有不同的基本原理。RUP 是過(guò)程組件、方法以及技術(shù)的框架,您可以將其應用于任何特定的軟件項目,我們希望用戶(hù)限定 RUP 的使用范圍。XP,從另一方面來(lái)說(shuō),是一個(gè)具有更多限制的過(guò)程,需要附加內容以使其適合完整的開(kāi)發(fā)項目。這些不同點(diǎn)解釋了軟件開(kāi)發(fā)界的一個(gè)觀(guān)點(diǎn):開(kāi)發(fā)大型系統的人員使用 RUP 解決問(wèn)題,而開(kāi)發(fā)小型系統的人員使用 XP 作為解決方案。我們的經(jīng)驗表明大部分的軟件項目都處于兩者之間--盡力找尋適用于各自情況的過(guò)程的恰當級別。單純地使用兩者之一是不充分的。

當您在 RUP 中融合了 XP 技術(shù)時(shí),您會(huì )得到過(guò)程的正確量,既滿(mǎn)足了項目所有成員的需要,又解決了所有主要的項目風(fēng)險問(wèn)題。對于一個(gè)工作于高信任環(huán)境中的小型項目團隊,其中用戶(hù)是團隊的一部分,那么 XP 完全可以勝任。對于團隊越來(lái)越分散,代碼量越來(lái)越大,或者構架沒(méi)有很好定義的情況,您需要做一些其他工作。在用戶(hù)交互具有"契約"風(fēng)格的項目中,僅有 XP 是不夠的。RUP 是一個(gè)框架,您可以從 RUP 出發(fā),在必要時(shí)以一組更健壯的技術(shù)來(lái)擴展 XP。

本文的以下部分描述了一個(gè)基于 RUP 四個(gè)階段的小型項目。在每個(gè)階段中,我們都確定了所產(chǎn)生的活動(dòng)和工件 。雖然 RUP 和 XP 具有不同的角色和職責,但是我們在這里不會(huì )處理這些差異。對于任何組織或項目,實(shí)際項目成員必須在過(guò)程中與正確的角色關(guān)聯(lián)起來(lái)。

項目啟動(dòng)-起始階段
對于新的開(kāi)發(fā)項目來(lái)說(shuō),起始階段是很重要的,在項目繼續進(jìn)行前,您必須處理重要的業(yè)務(wù)與需求風(fēng)險。對于那些增強現有系統的項目,起始階段是比較短暫的,但是其目的仍是確定該項目的實(shí)施價(jià)值及可行性。

在起始階段中,為了構建軟件您可以創(chuàng )建業(yè)務(wù)案例。視圖是起始過(guò)程中的關(guān)鍵工件。它是系統的高級描述。它為每個(gè)人解釋該系統是什么、可能使用系統的用戶(hù)、使用系統的原因、必須具備的功能,以及存在的約束。視圖可能很短,也許只有一兩段。視圖往往包括軟件必須為客戶(hù)提供的關(guān)鍵功能。

下面的例子展示了一個(gè)項目的很短視圖,該項目對 Rational 的外部網(wǎng)站進(jìn)行了改造。

為使 Rational 的地位達到電子開(kāi)發(fā)(包括工具、服務(wù)和最佳實(shí)踐)的世界領(lǐng)先程度,可以通過(guò)動(dòng)態(tài)的、個(gè)性化的網(wǎng)站加強客戶(hù)關(guān)系,為訪(fǎng)問(wèn)者提供自助服務(wù)、支持和目標內容。新的過(guò)程和技術(shù)啟用可以使內容供應商通過(guò)一種簡(jiǎn)化的、自動(dòng)的解決方案加速發(fā)布并提高內容的質(zhì)量。

RUP 起始階段中 4 個(gè)重要活動(dòng)為:

制定項目的范圍。如果我們打算構建一個(gè)系統,我們需要知道其內容以及它如何滿(mǎn)足涉眾的需要。在這個(gè)活動(dòng)中,我們捕獲內容和最重要的需求的足夠詳細的信息,從而得出產(chǎn)品可接受的標準。

計劃并準備業(yè)務(wù)案例。我們使用視圖作為指導,定義風(fēng)險緩和策略,開(kāi)發(fā)起始的項目計劃,并確定已知成本、日程計劃,以及盈利率平衡。

綜合得出備選構架。如果正在計劃中的系統沒(méi)什么新穎性,而且使用的框架廣為人之,那么您可以跳過(guò)這一步。我們一旦知道客戶(hù)的需求,就要開(kāi)始分配時(shí)間研究可行的備選構架。新技術(shù)能夠帶來(lái)解決軟件問(wèn)題的新的并且經(jīng)過(guò)改進(jìn)的解決方案。在過(guò)程的早期花些時(shí)間評估購買(mǎi)還是創(chuàng )建系統,并選擇技術(shù),也可以開(kāi)發(fā)出一個(gè)起始原型,這些都可以減少項目的一些主要風(fēng)險。

準備項目環(huán)境。任何項目都需要項目環(huán)境。不論您使用 XP 技術(shù)(例如結對編程),還是較傳統的技術(shù),您都需要確定團隊將要使用的物理資源、軟件工具以及步驟。

進(jìn)行小型項目開(kāi)發(fā)時(shí),并不需要太多的"過(guò)程時(shí)間"來(lái)執行起始過(guò)程。您往往可以在幾天中或者更少的時(shí)間里完成,下面的內容說(shuō)明了本階段除了視圖之外的預期工件。

一個(gè)經(jīng)批準的業(yè)務(wù)案例
涉眾有機會(huì )從業(yè)務(wù)的角度認定項目是值得進(jìn)行的。RUP 和 XP 都承認最好在早期就得出項目是否值得進(jìn)行的結論,以免在一個(gè)注定將要失敗的項目中花費寶貴的資源。如同在"Planning Extreme Programming" 一書(shū)描述的那樣,XP 對于項目是如何形成的以及涉及哪些角色這兩個(gè)問(wèn)題的回答是比較模糊的(似乎在現有項目或系統的環(huán)境中是最清晰的),但是在研究階段,XP 處理的工件與 RUP 起始過(guò)程中的是相同的。

不論您在 XP 中非正式地考慮業(yè)務(wù)問(wèn)題,還是在 RUP 中將業(yè)務(wù)案例做成一流的項目工件,您都需要考慮這些問(wèn)題。風(fēng)險清單您應該在整個(gè)項目開(kāi)發(fā)過(guò)程中都保持記錄 Risk List(風(fēng)險清單)。使用有風(fēng)險清單可以是一個(gè)具有經(jīng)過(guò)計劃的風(fēng)險緩和策略的簡(jiǎn)單清單。為各個(gè)風(fēng)險設定優(yōu)先級。任何與項目有關(guān)的人員都可以隨時(shí)看到風(fēng)險的內容以及如何處理風(fēng)險,但是沒(méi)有提供解決風(fēng)險的一般方式 。

初步項目計劃
本計劃包括資源估算、規模以及階段計劃。對于任何項目,這些估算都是不斷變化的,您必須監控它們。

項目驗收計劃
您的計劃正式與否依賴(lài)于項目的類(lèi)型。您必須判斷客戶(hù)會(huì )如何才能認為您的項目取得了成功。對于一個(gè) XP 項目,客戶(hù)會(huì )采取驗收測試的形式。在更普遍的過(guò)程中,客戶(hù)可能不會(huì )真正地進(jìn)行測試,但是接受的標準必須直接由客戶(hù)作出,或者由另一個(gè)角色作出,例如與客戶(hù)直接接觸的系統分析員。也可能存在其他的驗收標準,例如創(chuàng )建最終用戶(hù)文檔和幫助,但是XP并不涉及此內容。

起始細化迭代計劃
在基于 RUP 的項目中,在上次迭代的最后,您將詳細計劃下次迭代。在迭代的最后,您可以評估迭代開(kāi)始時(shí)設立的標準。XP 提供了探監控與衡量迭代成功的一些優(yōu)秀技巧。衡量標準是簡(jiǎn)單的,您可以輕松地將它們合并到迭代計劃和評估標準中。

起始用例模型
雖然這聽(tīng)起來(lái)比較正式而讓人望之卻步,但是它卻相當簡(jiǎn)單。用例與客戶(hù)在XP中編寫(xiě)的"故事"相對應。其間的差異就是一個(gè)用例就是一套完整的動(dòng)作,由參與者或系統外部的人員或事物發(fā)起,這正是用例的價(jià)值所在。用例可能包括若干個(gè)XP"故事"。RUP 為了定義項目的邊界,推薦在起始過(guò)程中確定用戶(hù)與角色。從用戶(hù)的觀(guān)點(diǎn)關(guān)注整套操作有助于將系統分為有價(jià)值的部分。這有助于判定恰當的實(shí)施特性,因此我們能夠在每次迭代的最后向客戶(hù)交付一些成果(可能在起始迭代與細化迭代早期除外)。

RUP 與 XP 都可以幫助我們確保避免一種情況,即整個(gè)項目已完成 80%,但都不是可交付的形式。我們一直希望發(fā)布的系統對用戶(hù)都是有價(jià)值的。

在這一點(diǎn)上,用例模型在識別用例和參與者方面幾乎沒(méi)有或只有很少提供支持的細節。它可以是手工或使用工具繪制的簡(jiǎn)單的文本或者 UML(統一建模語(yǔ)言)圖。該模型幫助我們確保已經(jīng)包含了涉眾所關(guān)心的正確的功能,并且沒(méi)用忘記任何功能,并允許我們輕松地查看整個(gè)系統。用例根據若干因素設定優(yōu)先級,這些因素包括風(fēng)險、對客戶(hù)的重要程度以及技術(shù)難點(diǎn)。起始階段中不需要過(guò)于正式的或過(guò)大的工件。按照您的需求讓它們保持簡(jiǎn)單或者正式就可以。XP 包括對計劃與系統驗收的指南,但是 RUP 需要在項目的早期添加更多的一些內容。這些少量添加可能通過(guò)處理一套更完整的風(fēng)險而為項目提供很大的價(jià)值。

細化階段
細化階段的目標是為系統構架設立基線(xiàn),為在構建階段大量的設計與實(shí)施工作打下堅實(shí)的基礎。構架通過(guò)考慮最重要的需求(那些對系統構架影響最大的需求)與評估風(fēng)險演進(jìn)而來(lái)。構架的穩定性是通過(guò)一個(gè)或多個(gè)構架原型進(jìn)行評估的。

在 RUP 中,設計活動(dòng)主要關(guān)注系統構架的概念,對于軟件密集型的系統來(lái)說(shuō),就是軟件構架的概念。使用組件構架是在 RUP 中體現的軟件開(kāi)發(fā) 6 項最佳實(shí)踐其中之一,該實(shí)踐推薦在開(kāi)發(fā)與所作所為構架上要投入一些時(shí)間。在這項工作花費的時(shí)間可以減緩與脆弱的、僵化日系統有關(guān)的風(fēng)險。

XP 使用"隱喻"替換了構架的概念。隱喻只捕獲構架的一部分,而其余構架部分則隨著(zhù)代碼開(kāi)發(fā)的自然結果而演進(jìn)。XP假定構架的形成是從生成簡(jiǎn)單的代碼開(kāi)始,然后進(jìn)行持續的代碼重構。

在 RUP 中,構架不只是"隱喻"。在細化階段中,您構建可執行的構架,從中可能降低與是否滿(mǎn)足非功能性需求相關(guān)的許多風(fēng)險,例如性能、可靠性以及健壯性。通過(guò)閱讀XP文獻,很可能推斷出一些 RUP 為細化階段所描述的內容,尤其是過(guò)于 XP 所稱(chēng)的基礎設施的過(guò)分關(guān)注,都是徒勞無(wú)功的。XP 認為在沒(méi)有必要的情況下創(chuàng )建基礎設施所做的工作導致了解決方案過(guò)于復雜,并且所創(chuàng )建的結果對客戶(hù)沒(méi)有價(jià)值。在 RUP 中,構架與基礎設施不是等同的。

在 RUP 與 XP 中創(chuàng )建構架的方法是截然不同。RUP 建議您關(guān)注構架,避免隨時(shí)間變化而產(chǎn)生的范圍蔓延、增加項目規模以及采用新技術(shù)帶來(lái)的風(fēng)險。XP 采用足夠簡(jiǎn)單或是很好理解的現有構架,該構架能夠隨著(zhù)代碼而演進(jìn)。XP 建議您不要為明天而設計,而要為今天而實(shí)施。XP 相信如果您盡可能地保持設計簡(jiǎn)單,那么將來(lái)管理起來(lái)也輕而易舉。RUP 希望您考慮該主張帶來(lái)的風(fēng)險。如果系統或者部分系統在未來(lái)不得不重寫(xiě),那么 XP 認為這種舉措比現在就計劃這種可能性更明智而且花費更少。對于一些系統,這是千真萬(wàn)確的,而且使用 RUP 時(shí),在您細化階段考慮風(fēng)險也會(huì )得出同一結論。RUP 并不認為對于所有系統這都是正確的,而且經(jīng)驗表明對于那些較大型、較復雜和沒(méi)有先例的系統來(lái)說(shuō),這可能是災難性的。

雖然為未來(lái)的可能性(可能永遠不會(huì )生生)花費太多的精力可能是一種浪費但是對未來(lái)進(jìn)行足夠的關(guān)注不失為一件精明之舉。多少公司能花得起代價(jià)不斷重寫(xiě)或者甚至是重構代碼呢?

對于任何項目,在細化階段您應該至少完成這三項活動(dòng):

定義、驗證并且設定構架的基線(xiàn)。使用風(fēng)險清單從起始階段開(kāi)發(fā)備選構架。我們關(guān)注是否能夠保證構想中的軟件具有可行性。如果選定技術(shù)對于系統沒(méi)什么新穎性或者復雜性,這項任務(wù)不會(huì )花費太長(cháng)時(shí)間。如果您正在向現有系統中添加內容,那么如果現有構架不需要進(jìn)行變更,這項任務(wù)就不是必要的。但是當真正出現構架風(fēng)險時(shí),您并不想讓您的架構來(lái)"碰運氣"。

作為這項活動(dòng)的一部分,您可能執行一些組件選擇,并且做出決定進(jìn)行購買(mǎi)/創(chuàng )建/重用組件。如果這需要大量工作,您可以將其分為單獨的活動(dòng)。

精化視圖。在起始階段,您開(kāi)發(fā)了一個(gè)視圖。因為你要確定項目的可行性,并且涉眾有時(shí)間檢查和評價(jià)系統,因此可能要對視圖文檔及需求作出一些變更。對視圖與需求的修改一般在細化階段進(jìn)行。在細化階段的最后,您已經(jīng)深刻理解了用來(lái)構建和計劃的最關(guān)鍵的用例。涉眾需要得到認可,在當前構架的環(huán)境中,只要按照當前的計劃開(kāi)發(fā)整個(gè)系統,就能實(shí)現當前的設想。在隨后的迭代過(guò)程中,變更的數量應該有所減少,但是您可能會(huì )在每次迭代中花一些時(shí)間進(jìn)行需求管理。

為構建階段創(chuàng )建迭代計劃并且設定基線(xiàn)?,F在,可以為您的計劃填充細節了。在每次構建迭代的最后,您可以按需要重新考慮計劃并且進(jìn)行調整。調整過(guò)程經(jīng)常是必需的,因為需要進(jìn)行的工作往往被錯誤地估算,業(yè)務(wù)環(huán)境也會(huì )常常變化,有時(shí)需求也會(huì )發(fā)生變更。為用例、場(chǎng)景以及技術(shù)工作設定優(yōu)先級,然后將它們分配到迭代過(guò)程中。在每次迭代過(guò)程的最后,您計劃產(chǎn)生一個(gè)能夠為涉眾提供價(jià)值的工作產(chǎn)品。

您可以在細化階段執行其他活動(dòng)。我們推薦您建立測試環(huán)境并且開(kāi)始開(kāi)發(fā)測試。雖然詳細的代碼還沒(méi)有完成,但是您仍然可以設計測試,也許可以實(shí)施集成測試。程序員應該隨時(shí)準備進(jìn)行單元測試,并且了解如何使用項目選定的測試工具。XP 推薦您在編寫(xiě)代碼前先設計測試內容。這是個(gè)獨到的見(jiàn)解,尤其是當您向現有代碼主體中添加內容時(shí)。不過(guò),無(wú)論您選擇如何進(jìn)行測試,都應該在細化階段建立常規測試體制。

RUP 描述的細化階段包括 XP 中的研究階段和投入階段。XP 處理技術(shù)風(fēng)險(例如新穎性和復雜性)的方式為使用"spike"解決方案,例如花費一些時(shí)間進(jìn)行試驗以對工作量進(jìn)行估算。這種技術(shù)在許多案例中都是有效的,當較大風(fēng)險沒(méi)有體現在單個(gè)用例或"故事"中時(shí),您就需要花些工夫確保系統的成功而且對工作量進(jìn)行精確的估算。

在細化階段,您會(huì )經(jīng)常更新工件,例如起始階段的需求與風(fēng)險清單。在細化階段可能出現的工件包括:

軟件構架文檔(SAD)。SAD 是一個(gè)復合型的工件,它提供了整個(gè)項目的技術(shù)信息的單一來(lái)源。在細化階段的最后,該文檔可能會(huì )包含詳細的介紹,描述在結構上很重要的用例,并且確定關(guān)鍵的機制和設計元素。對于增強現有系統的項目,您可以使用以前的 SAD,或者如果你覺(jué)得不會(huì )帶來(lái)什么風(fēng)險,那么就決定不使用該文檔。在所有的情況下,您都應該深思熟慮并且記錄于文檔中。

構建過(guò)程的迭代計劃。您可以在細化階段計劃構建迭代的次數。每次迭代都有特定的用例、場(chǎng)景以及其他分配的工作項目。這些信息都在迭代計劃中有所體現并且設定基線(xiàn)。評審與核準計劃可以作為細化階段的出口標準的一部分。對于非常小的短期項目來(lái)說(shuō),您可以將細化階段的迭代與起始過(guò)程和構建過(guò)程合并。關(guān)鍵性的活動(dòng)仍然可以進(jìn)行,但是迭代計劃和評審所需的資源都會(huì )有所減少。

構建階段
構建的目標是完成系統開(kāi)發(fā)。構建階段從某種意義上來(lái)看是一個(gè)制造過(guò)程,其中重點(diǎn)工作就是管理資源、控制操作以?xún)?yōu)化成本、日程和質(zhì)量。從這個(gè)意義上來(lái)講,管理理念應該進(jìn)行一個(gè)轉換,從起始階段和細化階段的知識產(chǎn)權開(kāi)發(fā)轉換到構建和交付階段的部署產(chǎn)品的開(kāi)發(fā)。

XP 側重構建階段。構建階段是編寫(xiě)產(chǎn)品代碼的階段。XP所有階段的目的都是為了進(jìn)行計劃,但是 XP 的關(guān)注焦點(diǎn)是構建代碼。

構建階段的每次迭代都具有三個(gè)關(guān)鍵活動(dòng):

管理資源與控制過(guò)程。每個(gè)人都需要了解自己的工作內容和時(shí)間。您必須保證工作負荷不會(huì )超過(guò)您的能力,而且工作可以按計劃進(jìn)行。

開(kāi)發(fā)與測試組件。您構建組件以滿(mǎn)足迭代中用例、場(chǎng)景以及其他功能的需要。您對其進(jìn)行單元測試和集成測試。

對迭代進(jìn)行評估。在迭代完成時(shí),您需要判斷是否已經(jīng)達到了迭代的目標。如果沒(méi)有,您必須重新劃分優(yōu)先級并管理范圍以確保能夠按時(shí)交付系統。

不同類(lèi)型的系統需要使用不同的技術(shù)。RUP 為軟件工程師提供了不同的指導,以幫助他們創(chuàng )建恰當的組件。以用例和補充(非功能)需求的形式提出的需求是足夠詳細的,可以使工程師開(kāi)展工作。RUP 中的若干活動(dòng)為設計、實(shí)施和測試不同種類(lèi)的組件提供了指南。一名有經(jīng)驗的軟件工程師不需要詳細查看這些活動(dòng)。經(jīng)驗稍欠缺一些的工程師可以通過(guò)最佳實(shí)踐獲得很大的幫助。每個(gè)團隊成員都可以按需要深入研究過(guò)程或者只是稍微了解一下。不過(guò),他們都參照一個(gè)單獨的過(guò)程知識基礎。

在 XP 中,"故事"驅動(dòng)實(shí)施過(guò)程。在 Extreme Programming Installed 一書(shū)中,Jeffries等人認為"故事"是程序員的"會(huì )話(huà)承諾"(promises for conversation)。 持續有效的交流大有裨益。雖然總是需要澄清一些細節,如果"故事"不夠詳細,而使程序員不能完成他們大部分工作,那么可以說(shuō)"故事"還沒(méi)有就緒。用例必須足夠詳細以方便程序員實(shí)施。在許多情況下,程序員會(huì )幫助編寫(xiě)用例的技術(shù)細節。Jeffries 等人認為,會(huì )話(huà)應該記錄在文檔中并且附加到"故事"中。RUP 也同意這個(gè)觀(guān)點(diǎn),除了以用例規格說(shuō)明的形式,可以按需要使用非正式的形式。捕獲并管理會(huì )話(huà)的結果是您必須管理的任務(wù)。

XP 的長(cháng)處在于構建階段。對于大多數團隊來(lái)說(shuō),都存在適用于他們的"智慧與指南的結晶"。XP 中最顯著(zhù)的實(shí)踐包括:

測試--程序員不斷地隨著(zhù)代碼的開(kāi)發(fā)編寫(xiě)測試。測試反映了"故事"。XP提倡您首先編寫(xiě)測試,這是一項優(yōu)秀的實(shí)踐,因為它可以迫使您深刻地理解"故事",并且在必要的地方提出更多的問(wèn)題。不論在編寫(xiě)代碼之前還是之后,一定要編寫(xiě)測試。將它們加入到您的測試包中,并且保證每次代碼變更時(shí)都運行測試。

重構--不斷重構系統的結構而不改變其行為,可以使其更加簡(jiǎn)單或靈活。您需要判斷對您的團隊來(lái)說(shuō)是否存在一個(gè)較好的實(shí)踐。簡(jiǎn)單與復雜的判別否因人而異。有這樣一個(gè)例子,一個(gè)項目中的兩個(gè)很聰明的工程師每晚都要重寫(xiě)對方的代碼,因為他們認為對方的代碼過(guò)于復雜。這產(chǎn)生了一個(gè)副作用,也就是他們總是干擾第二天其他成員的工作。測試是有幫助的,但是如果他們之間不陷入代碼之爭的話(huà),那么團隊的處境就會(huì )更好一些。

結對編程--XP 認為結對編程可以在更短的時(shí)間內創(chuàng )建出更好的代碼。有證據表明這是正確的 。如果您遵照這項實(shí)踐,就需要考慮許多人文與環(huán)境的因素。程序員愿意對此進(jìn)行嘗試嗎?您的物理環(huán)境可以滿(mǎn)足這種情況嗎,即有足夠的空間使兩個(gè)程序員在一個(gè)單獨工作站中有效地工作?您如何對待遠程工作或者在其他地點(diǎn)工作的程序員?

持續集成--集成與構建工作需要持續進(jìn)行,可能每天不止一次。這是一種確保代碼結構完整的很好的方式,它還允許在集成測試過(guò)程中進(jìn)行持續的質(zhì)量監控。

集體代碼所有權--任何人都可以隨時(shí)修改任何代碼。XP 依賴(lài)這樣一個(gè)事實(shí),即一組好的單元測試將會(huì )減少這項實(shí)踐的風(fēng)險。讓大家將每一件事都搞清楚的好處不能局限在一定的尺度上--是 1 萬(wàn)行代碼、2 萬(wàn)行代碼還是一定要少于 5 萬(wàn)行?

簡(jiǎn)單設計--隨著(zhù)重構過(guò)程的進(jìn)行,需要不斷地修改系統設計使其變更簡(jiǎn)單。再一次重申,您需要判斷這項工作進(jìn)行到何種程度才恰好合適。如果您在細化階段中花費了必要霎時(shí)間來(lái)設計構架,我們相信簡(jiǎn)單的設計將會(huì )很快完成并且很快變得穩定。

代碼標準--這一直都是一項良好實(shí)踐。標準是什么都沒(méi)關(guān)系,只要您使用它們而且每個(gè)人都認可就可以。

RUP 與 XP 都認為您必須管理(和控制)迭代過(guò)程。衡量標準可以提供較好的計劃信息,因為它們可以幫助您選擇對于您的團隊來(lái)說(shuō)什么是最適合的。需要衡量三件事:時(shí)間、規模和缺陷。這樣您就可以獲得所有類(lèi)型您所感興趣的統計數字。XP 為您提供簡(jiǎn)單的衡量標準來(lái)判斷進(jìn)展并且預測成果。這些衡量標準圍繞著(zhù)完成的"故事"數量、通過(guò)測試的數量以及統計中的趨勢這些問(wèn)題。XP 為使用最少量的衡量標準做出了一個(gè)優(yōu)秀的表率,因為查看太多并不一定會(huì )增加項目成功的機會(huì )。RUP 為您提供了對于您可以衡量的內容以及如何衡量的指導,并且舉了有關(guān)衡量標準的例子。在所有的情況中,衡量標準必須簡(jiǎn)單、客觀(guān)、易于搜集、易于表達,并且不易產(chǎn)生誤解。

在構建階段的迭代過(guò)程中將會(huì )產(chǎn)生哪些工件呢?這取決于迭代是處于構建階段的早期還是后期,您可以創(chuàng )建以下工件:

組件--組件代表了軟件代碼中的一部分(源代碼、二進(jìn)制代碼或者可執行程序),或者包含信息的文件,例如,一個(gè)啟動(dòng)文件或者一個(gè) ReadMe 文件。組件還可以是其他組件的聚合,例如由幾個(gè)可執行程序組成的應用程序。

培訓資料--如果系統的用戶(hù)界面比較復雜,那么請在用例的基礎上盡早編寫(xiě)用戶(hù)手冊和其他培訓資料的初稿。

部署計劃--客戶(hù)需要一個(gè)系統。部署計劃描述了一組安裝、測試并且有效地向用戶(hù)交付產(chǎn)品所需的任務(wù)。對于 以Web 為中心的系統來(lái)說(shuō),我們已經(jīng)發(fā)現,部署計劃的重要性又提高了。

交付階段迭代計劃--臨近交付時(shí),您需要完成并且評審交付階段迭代計劃。

代碼完整嗎?
認為代碼就是設計并且設計也就是代碼。代碼與自身總是一致的,這一點(diǎn)是千真萬(wàn)確的。我們認為花費精力進(jìn)行設計并且溝通設計是很值得的,而不僅僅是創(chuàng )建代碼。下面的小故事會(huì )說(shuō)明這一點(diǎn)。

RUP 與 XP 間的差異除了建立構架的方法以外,還包括其他方面的不同。其中一點(diǎn)就是關(guān)于設計概念的溝通方式。XP

一名工程師曾有兩次這樣的軟件項目經(jīng)歷,設計體現在代碼中,并且只能在代碼中找到設計信息。這兩個(gè)項目都是關(guān)于編譯器的:一個(gè)是改進(jìn)與維護用于 Ada 編譯器的優(yōu)化程序,另一個(gè)項目是將一個(gè)編譯器的前端移植到一個(gè)新的平臺上,并且連接一個(gè)第三方的代碼生成器。

編譯器技術(shù)是比較復雜的,但也是廣為人知的。在這兩個(gè)項目中,該工程師想要概覽編譯器(或者優(yōu)化程序)的設計和實(shí)施。在每個(gè)案例中,他都接到一堆源代碼清單,大概有幾英尺厚,而且被告知"查看這些信息"。他本應被提供一些帶有支持性文字的構建很好的圖。優(yōu)化程序的項目沒(méi)有完成。但是編譯器項目確實(shí)取得了成功,由于在代碼開(kāi)發(fā)過(guò)程中進(jìn)行了廣泛的測試,所以代碼質(zhì)量很高。這位工程師花費了數天時(shí)間研究調試器中的代碼以弄明白其作用。個(gè)人的損失尚在其次,團隊的損失代價(jià)就更不值得。我們并沒(méi)有按 XP 所示的那樣在 40 小時(shí)后完成開(kāi)發(fā),我們反而花費了大量個(gè)人努力來(lái)完成工作。

只開(kāi)發(fā)代碼帶來(lái)的主要問(wèn)題就是無(wú)論代碼文檔編寫(xiě)得多么好,它都沒(méi)有告訴您它本身要解決的問(wèn)題,它只提供了問(wèn)題的解決方案。一些需求文檔在最初用戶(hù)和開(kāi)發(fā)人員繼續工作很長(cháng)時(shí)間以后,仍然可以很好地解釋項目的原始目標。為了維護系統,您往往需要了解最初項目團隊的設計目標。一些高級設計文檔都是相似的--代碼經(jīng)常沒(méi)有經(jīng)過(guò)高度的抽象,所以無(wú)法提供任何信息以表明整體的系統能夠實(shí)現什么功能。在面向對象的系統中,這一點(diǎn)尤其是正確的,因為僅僅查看里面的類(lèi)文件是很難甚至無(wú)法得出執行線(xiàn)程。設計文檔指導您在后期出現問(wèn)題時(shí)該查看的內容--在后期經(jīng)常會(huì )出現問(wèn)題。

這個(gè)故事說(shuō)明花費時(shí)間創(chuàng )建與維護設計文檔確實(shí)會(huì )有所幫助。這可以降低誤解的風(fēng)險,并且加速開(kāi)發(fā)過(guò)程。XP 的方式就是花費幾分鐘勾畫(huà)出設計的大概內容或者使用 CRC 卡片。 但是團隊不主張這樣,而只是進(jìn)行代碼開(kāi)發(fā)。他們有一個(gè)隱含的假設,那就是任務(wù)很簡(jiǎn)單,我們已經(jīng)知道該如何進(jìn)行了。即使我們成功地完成了任務(wù),那么下一個(gè)新來(lái)的人可能就不會(huì )如此幸運。RUP建議您多花費一些時(shí)間創(chuàng )建并維護這些設計工件。

交付階段
交付階段的焦點(diǎn)就是確保軟件對于最終用戶(hù)是可用的。交付階段包括為發(fā)布進(jìn)行產(chǎn)品的測試,在用戶(hù)反饋的基礎上做微小的調整等幾方面內容。在生命周期的這個(gè)時(shí)刻,用戶(hù)反饋主要集中在精確調整產(chǎn)品、配置、安裝,以及可用性等問(wèn)題上。

較早發(fā)布、經(jīng)常性發(fā)布都是很好的辦法。但是,我們通過(guò)發(fā)布要達到的目的是什么呢?XP 沒(méi)有清楚地解釋這個(gè)問(wèn)題,也沒(méi)有處理發(fā)布商業(yè)軟件所必須制造問(wèn)題。在內部項目中,您可以為解決這些問(wèn)題找到捷徑,但是即使這樣,您仍然需要編輯文檔、員工培訓等工作。那么技術(shù)支持與變更管理又如何呢?希望現場(chǎng)客戶(hù)控制這些內容,這是可行的嗎?Bruce Conrad 在他的 XP 的 InfoWorld 評論 中指出用戶(hù)并不希望得到的軟件總是在持續變更。您必須對快速變更軟件的利益和變更的劣勢及可能帶來(lái)的不穩定性進(jìn)行權衡。

當您決定發(fā)布的時(shí)候,您必須為最終用戶(hù)提供比代碼多得多的東西。交付階段的活動(dòng)和工件會(huì )指導您完成本部分軟件開(kāi)發(fā)過(guò)程。這些活動(dòng)主要是為了向您的客戶(hù)提供可用的產(chǎn)品。交付階段的關(guān)鍵活動(dòng)如下:

確定最終用戶(hù)支持資料。該活動(dòng)比較簡(jiǎn)單,您只需提供一個(gè)清單即可。但是務(wù)必要確保您的組織已準備好對客戶(hù)進(jìn)行技術(shù)支持。

在用戶(hù)的環(huán)境中測試可交付的產(chǎn)品。如果您能夠在公司內部模擬用戶(hù)環(huán)境,那是最好不過(guò)的。否則,就到客戶(hù)的公司去,安裝軟件并且保證其可以運行。您一定不想尷尬地回答客戶(hù):"但是在我們的系統上工作很正常。"

基于用戶(hù)反饋精確調整產(chǎn)品。如果可能的話(huà),在您向有限數量客戶(hù)交付軟件時(shí)計劃一次或者多次 Beta 測試周期。如果進(jìn)行該測試,那么就需要對 Beta 測試周期進(jìn)行管理,并且考慮您"收尾工作"中的客戶(hù)反饋。

向最終用戶(hù)交付最終產(chǎn)品。對于不同類(lèi)型的軟件產(chǎn)品和發(fā)布版本,需要處理許多有關(guān)打包、制造和其他產(chǎn)品問(wèn)題。您肯定不會(huì )僅僅將軟件復制到一個(gè)文件夾中,然后向客戶(hù)發(fā)一封郵件告訴他們軟件已經(jīng)到位了。

與其他階段一樣,過(guò)程的格式與復雜度都有所不同。不過(guò),如果您沒(méi)有注意部署細節,那么可能導致數周或數月的良好開(kāi)發(fā)工作前功盡棄,從而在進(jìn)入目標市場(chǎng)時(shí)以失敗告終。

在交付階段中您可以生成若干工件。如果您的項目涉及到將來(lái)的發(fā)布(有多少項目沒(méi)有涉及到呢?),那么您就應該開(kāi)始為下次發(fā)布確定功能和缺陷。對于任何項目,下列工件都至關(guān)重要:

部署計劃--完成您始于構建階段的部署計劃并且將其作為交付的路線(xiàn)圖。

版本注釋--它是一個(gè)比較少見(jiàn)的軟件產(chǎn)品,不包含對最終用戶(hù)至關(guān)重要的指令??梢詫ζ渥龀鲇媱?,對于注釋要有一個(gè)可用的、一致的格式。

交付階段資料與文檔--這類(lèi)資料可以采取很多形式。您可以在線(xiàn)提供所有內容嗎?您會(huì )進(jìn)行指導嗎?您的產(chǎn)品幫助完整并且可用嗎?不要認為您所了解的,客戶(hù)也同樣了解。您的成功就在于幫助您的客戶(hù)取得成功。

結束語(yǔ)
構建軟件的工作遠遠多于編寫(xiě)代碼所工作。一個(gè)軟件開(kāi)發(fā)過(guò)程必須集中處理向用戶(hù)發(fā)布高質(zhì)量軟件的所有必需活動(dòng)。一個(gè)完整的過(guò)程不必是龐大的。我們通過(guò)集中論述項目中的主要活動(dòng)和工件,已經(jīng)向您展示了如何進(jìn)行一個(gè)小型但是完整的過(guò)程。如果執行某項活動(dòng)或者創(chuàng )建某個(gè)工件對于緩解項目中的風(fēng)險是有幫助的,那么就請進(jìn)行。您可以按需要為您的項目團隊和組織使用或多或少的過(guò)程和格式。

RUP 和 XP 并不必是互相排斥的。通過(guò)結合使用這兩種方法,您完全可以得到一個(gè)過(guò)程,幫助您比現在更快地交付更高質(zhì)量的軟件。Robert Martin 描述了一個(gè)叫做 dX 的過(guò)程,他將其作為 RUP 的附屬品 。它就是一個(gè)從 RUP 框架中構建的過(guò)程的實(shí)例。

一個(gè)優(yōu)秀的軟件過(guò)程可以使用經(jīng)業(yè)界驗證的最佳實(shí)踐。最佳實(shí)踐已經(jīng)在真實(shí)的軟件開(kāi)發(fā)組織中使用,并且經(jīng)歷了時(shí)間的考驗。XP 是目前廣為關(guān)注的方法。它以代碼為中心,并提供了一項承諾:花費最少的過(guò)程開(kāi)銷(xiāo)得到最大的生產(chǎn)力。XP 中的許多技術(shù)值得在恰當的情況中考慮和采用。

XP 關(guān)注"故事"、測試和代碼--它以一定的深度討論了計劃,但沒(méi)有詳細闡述如何獲取計劃。XP 意味著(zhù)您可以完成其他一些工作,例如"使用一些卡片進(jìn)行 CRC 設計或者草擬某種 UML……"或者"請不要生成并不使用的文檔或者其他工件",但只是一帶而過(guò)。RUP 希望您在定制和更新開(kāi)發(fā)計劃時(shí),僅僅考慮創(chuàng )建有用和必須的東西,并且指出了這些東西該是什么。

RUP 是一個(gè)可以處理整個(gè)軟件開(kāi)發(fā)周期的過(guò)程。它關(guān)注最佳實(shí)踐,并且經(jīng)過(guò)了數千個(gè)項目的洗禮。我們鼓勵研究和發(fā)明新的技術(shù)以產(chǎn)生最佳實(shí)踐。隨著(zhù)新的最佳實(shí)踐嶄露頭腳,我們希望將它們納入 RUP 中。

附錄:Rational Unified Process
Rational Unified Process,或者簡(jiǎn)稱(chēng) RUP,提供了軟件開(kāi)發(fā)的規律性方法。它是由IBM Rational開(kāi)發(fā)并維護的過(guò)程產(chǎn)品。它為來(lái)同類(lèi)型的項目提供了幾種即裝即用的路線(xiàn)圖。RUP 還提供了一些信息,幫助您在軟件開(kāi)發(fā)過(guò)程中使用其他 Rational 工具,但是它不要求將 Rational 工具有效地應用于整個(gè)組織,您也可以將 Rational 工具與其他供應商的產(chǎn)品進(jìn)行集成。

RUP 為軟件項目所有方面提供了指導。并不需要您執行任何特定的活動(dòng)或者創(chuàng )建任何特定的工件。它只為您提供信息和指南,您可以決定將哪些應用于您的組織。如果沒(méi)有特定的路線(xiàn)圖適合您的項目或者組織,RUP 還提供了一些指南來(lái)幫助您量身定做你的過(guò)程。

RUP 強調采用現代軟件開(kāi)發(fā)的一些最佳實(shí)踐,作為一種降低開(kāi)發(fā)新軟件所帶來(lái)的內在風(fēng)險的方式。這些最佳實(shí)踐包括:

1. 迭代開(kāi)發(fā)
2. 管理需求
3. 使用基于組件的構架
4. 可視建模
5. 持續的質(zhì)量驗證
6. 控制變更

這些最佳經(jīng)驗融合到 Rational Unified Process 的以下定義中:

角色--執行的系列活動(dòng)和擁有的工件。
學(xué)科--軟件工程中的關(guān)鍵領(lǐng)域,例如需求、分析與設計、實(shí)施與測試。
活動(dòng)--工件生成與評估方式的定義。
工件--在執行活動(dòng)中所使用的、生成的或修改的工作產(chǎn)品。

RUP 是一個(gè)迭代過(guò)程,確定了任何軟件開(kāi)發(fā)項目的四個(gè)階段。隨著(zhù)時(shí)間的推進(jìn),每個(gè)項目都要經(jīng)歷起始階段、細化階段、構建階段和交付階段。每個(gè)階段包括一次或多次迭代,其中您可以生成可執行文件,但是系統可能不完整(可能起始階段除外)。在每次迭代過(guò)程中,您以不同的細節級別執行幾個(gè)學(xué)科中的活動(dòng)。下文是 RUP 的概述圖。

RUP 概覽圖

The Rational Unified Process, An Introduction, Second Edition 一書(shū)是 RUP 的好的概述。您可以在 Rational 的 Web 站點(diǎn) www.rational.com 上找到更進(jìn)一步的信息和對于 RUP 的評價(jià)。

附錄:極限編程
極限編程(XP)是由 Kent Beck 在 1996 年開(kāi)發(fā)的一種軟件開(kāi)發(fā)學(xué)科。它基于四個(gè)價(jià)值:溝通、簡(jiǎn)單、反饋和勇氣。它強調客戶(hù)與開(kāi)發(fā)團隊成員的持續溝通,在開(kāi)發(fā)進(jìn)程中設立一名現場(chǎng)客戶(hù)。該現場(chǎng)客戶(hù)決定創(chuàng )建的內容和順序。通過(guò)持續重構代碼并創(chuàng )建最小的非代碼工件集合而體現簡(jiǎn)單。許多短期發(fā)布和持續單元測試建立了反饋機制。勇氣意味著(zhù)完成正確的事情,即使并不是最流行的事情。它還意味著(zhù)誠實(shí)面對您能做的和不能做的事情。

12 個(gè) XP 實(shí)踐為這四個(gè)價(jià)值提供支持。它們是:

有計劃的開(kāi)發(fā):通過(guò)結合使用優(yōu)先級"故事"和技術(shù)估算,確定下一版本的功能。

小版本:以小的增量版本經(jīng)常向客戶(hù)發(fā)布軟件。

隱喻:隱喻是一個(gè)簡(jiǎn)單、共享的"故事"或描述,說(shuō)明系統如何工作。

簡(jiǎn)單設計:通過(guò)保持代碼簡(jiǎn)單從而保證設計簡(jiǎn)單。不斷的在代碼中尋找復雜點(diǎn)并且立刻進(jìn)行移除。

測試:用戶(hù)編寫(xiě)測試內容以對"故事"進(jìn)行測試。程序員編寫(xiě)測試內容來(lái)發(fā)現代碼中的任何問(wèn)題。在編寫(xiě)代碼前先編寫(xiě)測試內容。

重構:這是一項簡(jiǎn)化技術(shù),用來(lái)移除代碼中的重復內容和復雜之處。

結對編程:團隊中的兩個(gè)成員使用同一臺計算機開(kāi)發(fā)所有的代碼。一個(gè)人編寫(xiě)代碼或者驅動(dòng),另一個(gè)人同時(shí)審查代碼的正確性和可理解性。

集體代碼所有權:任何人都擁有所有的代碼。這就意味這每個(gè)人都可以在任何時(shí)候變更任何代碼。

持續集成:每天多次創(chuàng )建和集成系統,只要任何實(shí)現任務(wù)完成就要進(jìn)行。

每周 40 個(gè)小時(shí):程序員在疲勞時(shí)無(wú)法保證最高效率。連續兩周加班是絕對不允許的。

現場(chǎng)客戶(hù):一名真實(shí)的客戶(hù)全時(shí)工作于開(kāi)發(fā)環(huán)境中,幫助定義系統、編寫(xiě)測試內容并回答問(wèn)題。

編碼標準:程序員采用一致的編碼標準。

淺談測試驅動(dòng)開(kāi)發(fā)(TDD)
 

 

測試驅動(dòng)開(kāi)發(fā)(TDD)是極限編程的重要特點(diǎn),它以不斷的測試推動(dòng)代碼的開(kāi)發(fā),既簡(jiǎn)化了代碼,又保證了軟件質(zhì)量。本文從開(kāi)發(fā)人員使用的角度,介紹了 TDD 優(yōu)勢、原理、過(guò)程、原則、測試技術(shù)、Tips 等方面。

背景
一個(gè)高效的軟件開(kāi)發(fā)過(guò)程對軟件開(kāi)發(fā)人員來(lái)說(shuō)是至關(guān)重要的,決定著(zhù)開(kāi)發(fā)是痛苦的掙扎,還是不斷進(jìn)步的喜悅。國人對軟件藍領(lǐng)的不屑,對繁瑣冗長(cháng)的傳統開(kāi)發(fā)過(guò)程的不耐,使大多數開(kāi)發(fā)人員無(wú)所適從。最近興起的一些軟件開(kāi)發(fā)過(guò)程相關(guān)的技術(shù),提供一些比較高效、實(shí)用的軟件過(guò)程開(kāi)發(fā)方法。其中比較基礎、關(guān)鍵的一個(gè)技術(shù)就是測試驅動(dòng)開(kāi)發(fā)(Test-Driven Development)。雖然TDD光大于極限編程,但測試驅動(dòng)開(kāi)發(fā)完全可以單獨應用。下面就從開(kāi)發(fā)人員使用的角度進(jìn)行介紹,使開(kāi)發(fā)人員用最少的代價(jià)盡快理解、掌握、應用這種技術(shù)。下面分優(yōu)勢,原理,過(guò)程,原則,測試技術(shù),Tips等方面進(jìn)行討論。

1. 優(yōu)勢
TDD的基本思路就是通過(guò)測試來(lái)推動(dòng)整個(gè)開(kāi)發(fā)的進(jìn)行。而測試驅動(dòng)開(kāi)發(fā)技術(shù)并不只是單純的測試工作。

需求向來(lái)就是軟件開(kāi)發(fā)過(guò)程中感覺(jué)最不好明確描述、易變的東西。這里說(shuō)的需求不只是指用戶(hù)的需求,還包括對代碼的使用需求。很多開(kāi)發(fā)人員最害怕的就是后期還要修改某個(gè)類(lèi)或者函數的接口進(jìn)行修改或者擴展,為什么會(huì )發(fā)生這樣的事情就是因為這部分代碼的使用需求沒(méi)有很好的描述。測試驅動(dòng)開(kāi)發(fā)就是通過(guò)編寫(xiě)測試用例,先考慮代碼的使用需求(包括功能、過(guò)程、接口等),而且這個(gè)描述是無(wú)二義的,可執行驗證的。

通過(guò)編寫(xiě)這部分代碼的測試用例,對其功能的分解、使用過(guò)程、接口都進(jìn)行了設計。而且這種從使用角度對代碼的設計通常更符合后期開(kāi)發(fā)的需求??蓽y試的要求,對代碼的內聚性的提高和復用都非常有益。因此測試驅動(dòng)開(kāi)發(fā)也是一種代碼設計的過(guò)程。

開(kāi)發(fā)人員通常對編寫(xiě)文檔非常厭煩,但要使用、理解別人的代碼時(shí)通常又希望能有文檔進(jìn)行指導。而測試驅動(dòng)開(kāi)發(fā)過(guò)程中產(chǎn)生的測試用例代碼就是對代碼的最好的解釋。

快樂(lè )工作的基礎就是對自己有信心,對自己的工作成果有信心。當前很多開(kāi)發(fā)人員卻經(jīng)常在擔心:“代碼是否正確?”“辛苦編寫(xiě)的代碼還有沒(méi)有嚴重bug?”“修改的新代碼對其他部分有沒(méi)有影響?”。這種擔心甚至導致某些代碼應該修改卻不敢修改的地步。測試驅動(dòng)開(kāi)發(fā)提供的測試集就可以作為你信心的來(lái)源。

當然測試驅動(dòng)開(kāi)發(fā)最重要的功能還在于保障代碼的正確性,能夠迅速發(fā)現、定位bug。而迅速發(fā)現、定位bug是很多開(kāi)發(fā)人員的夢(mèng)想。針對關(guān)鍵代碼的測試集,以及不斷完善的測試用例,為迅速發(fā)現、定位bug提供了條件。

我的一段功能非常復雜的代碼使用TDD開(kāi)發(fā)完成,真實(shí)環(huán)境應用中只發(fā)現幾個(gè)bug,而且很快被定位解決。您在應用后,也一定會(huì )為那種自信的開(kāi)發(fā)過(guò)程,功能不斷增加、完善的感覺(jué),迅速發(fā)現、定位bug的能力所感染,喜歡這個(gè)技術(shù)的。

那么是什么樣的原理、方法提供上面說(shuō)的這些好處哪?下面我們就看看TDD的原理。

2. 原理
測試驅動(dòng)開(kāi)發(fā)的基本思想就是在開(kāi)發(fā)功能代碼之前,先編寫(xiě)測試代碼。也就是說(shuō)在明確要開(kāi)發(fā)某個(gè)功能后,首先思考如何對這個(gè)功能進(jìn)行測試,并完成測試代碼的編寫(xiě),然后編寫(xiě)相關(guān)的代碼滿(mǎn)足這些測試用例。然后循環(huán)進(jìn)行添加其他功能,直到完全部功能的開(kāi)發(fā)。

我們這里把這個(gè)技術(shù)的應用領(lǐng)域從代碼編寫(xiě)擴展到整個(gè)開(kāi)發(fā)過(guò)程。應該對整個(gè)開(kāi)發(fā)過(guò)程的各個(gè)階段進(jìn)行測試驅動(dòng),首先思考如何對這個(gè)階段進(jìn)行測試、驗證、考核,并編寫(xiě)相關(guān)的測試文檔,然后開(kāi)始下一步工作,最后再驗證相關(guān)的工作。下圖是一個(gè)比較流行的測試模型:V測試模型。

【圖 V測試模型】

在開(kāi)發(fā)的各個(gè)階段,包括需求分析、概要設計、詳細設計、編碼過(guò)程中都應該考慮相對應的測試工作,完成相關(guān)的測試用例的設計、測試方案、測試計劃的編寫(xiě)。這里提到的開(kāi)發(fā)階段只是舉例,根據實(shí)際的開(kāi)發(fā)活動(dòng)進(jìn)行調整。相關(guān)的測試文檔也不一定是非常詳細復雜的文檔,或者什么形式,但應該養成測試驅動(dòng)的習慣。

關(guān)于測試模型,還有X測試模型。這個(gè)測試模型,我認為,是對詳細階段和編碼階段進(jìn)行建模,應該說(shuō)更詳細的描述了詳細設計和編碼階段的開(kāi)發(fā)行為。及針對某個(gè)功能進(jìn)行對應的測試驅動(dòng)開(kāi)發(fā)。

【圖 X測試模型】

基本原理應該說(shuō)非常簡(jiǎn)單,那么如何進(jìn)行實(shí)際操作哪,下面對開(kāi)發(fā)過(guò)程進(jìn)行詳細的介紹。

3. 過(guò)程
軟件開(kāi)發(fā)其他階段的測試驅動(dòng)開(kāi)發(fā),根據測試驅動(dòng)開(kāi)發(fā)的思想完成對應的測試文檔即可。下面針對詳細設計和編碼階段進(jìn)行介紹。

測試驅動(dòng)開(kāi)發(fā)的基本過(guò)程如下:

1) 明確當前要完成的功能??梢杂涗洺梢粋€(gè) TODO 列表。

2) 快速完成針對此功能的測試用例編寫(xiě)。

3) 測試代碼編譯不通過(guò)。

4) 編寫(xiě)對應的功能代碼。

5) 測試通過(guò)。

6) 對代碼進(jìn)行重構,并保證測試通過(guò)。

7) 循環(huán)完成所有功能的開(kāi)發(fā)。

為了保證整個(gè)測試過(guò)程比較快捷、方便,通??梢允褂脺y試框架組織所有的測試用例。一個(gè)免費的、優(yōu)秀的測試框架是 Xunit 系列,幾乎所有的語(yǔ)言都有對應的測試框架。

開(kāi)發(fā)過(guò)程中,通常把測試代碼和功能代碼分開(kāi)存放,這里提供一個(gè)簡(jiǎn)單的測試框架使用例子,您可以通過(guò)它了解測試框架的使用。下面是文件列表。

	project/				項目主目錄                        project/test			測試項目主目錄                        project/test/testSeq.cpp		測試seq_t 的測試文件,對其他功能文件的測試文件復制后修改即可                        project/test/testSeq.h                        project/test/Makefile			測試項目的 Makefile                        project/test/main.cpp			測試項目的主文件,不需要修改                        project/main.cpp		           項目的主文件                        project/seq_t.h			功能代碼,被測試文件                        project/Makefile		           項目的 Makefile

主要流程基本如此,但要讓你的代碼很容易的進(jìn)行測試,全面又不繁瑣的進(jìn)行測試,還是有很多測試原則和技術(shù)需要考慮。

4. 原則
測試隔離。不同代碼的測試應該相互隔離。對一塊代碼的測試只考慮此代碼的測試,不要考慮其實(shí)現細節(比如它使用了其他類(lèi)的邊界條件)。

一頂帽子。開(kāi)發(fā)人員開(kāi)發(fā)過(guò)程中要做不同的工作,比如:編寫(xiě)測試代碼、開(kāi)發(fā)功能代碼、對代碼重構等。做不同的事,承擔不同的角色。開(kāi)發(fā)人員完成對應的工作時(shí)應該保持注意力集中在當前工作上,而不要過(guò)多的考慮其他方面的細節,保證頭上只有一頂帽子。避免考慮無(wú)關(guān)細節過(guò)多,無(wú)謂地增加復雜度。

測試列表。需要測試的功能點(diǎn)很多。應該在任何階段想添加功能需求問(wèn)題時(shí),把相關(guān)功能點(diǎn)加到測試列表中,然后繼續手頭工作。然后不斷的完成對應的測試用例、功能代碼、重構。一是避免疏漏,也避免干擾當前進(jìn)行的工作。

測試驅動(dòng)。這個(gè)比較核心。完成某個(gè)功能,某個(gè)類(lèi),首先編寫(xiě)測試代碼,考慮其如何使用、如何測試。然后在對其進(jìn)行設計、編碼。

先寫(xiě)斷言。測試代碼編寫(xiě)時(shí),應該首先編寫(xiě)對功能代碼的判斷用的斷言語(yǔ)句,然后編寫(xiě)相應的輔助語(yǔ)句。

可測試性。功能代碼設計、開(kāi)發(fā)時(shí)應該具有較強的可測試性。其實(shí)遵循比較好的設計原則的代碼都具備較好的測試性。比如比較高的內聚性,盡量依賴(lài)于接口等。

及時(shí)重構。無(wú)論是功能代碼還是測試代碼,對結構不合理,重復的代碼等情況,在測試通過(guò)后,及時(shí)進(jìn)行重構。關(guān)于重構,我會(huì )另撰文詳細分析。

小步前進(jìn)。軟件開(kāi)發(fā)是個(gè)復雜性非常高的工作,開(kāi)發(fā)過(guò)程中要考慮很多東西,包括代碼的正確性、可擴展性、性能等等,很多問(wèn)題都是因為復雜性太大導致的。極限編程提出了一個(gè)非常好的思路就是小步前進(jìn)。把所有的規模大、復雜性高的工作,分解成小的任務(wù)來(lái)完成。對于一個(gè)類(lèi)來(lái)說(shuō),一個(gè)功能一個(gè)功能的完成,如果太困難就再分解。每個(gè)功能的完成就走測試代碼-功能代碼-測試-重構的循環(huán)。通過(guò)分解降低整個(gè)系統開(kāi)發(fā)的復雜性。這樣的效果非常明顯。幾個(gè)小的功能代碼完成后,大的功能代碼幾乎是不用調試就可以通過(guò)。一個(gè)個(gè)類(lèi)方法的實(shí)現,很快就看到整個(gè)類(lèi)很快就完成啦。本來(lái)感覺(jué)很多特性需要增加,很快就會(huì )看到?jīng)]有幾個(gè)啦。你甚至會(huì )為這個(gè)速度感到震驚。(我理解,是大幅度減少調試、出錯的時(shí)間產(chǎn)生的這種速度感)

5. 測試技術(shù)

5.1. 測試范圍、粒度
對哪些功能進(jìn)行測試?會(huì )不會(huì )太繁瑣?什么時(shí)候可以停止測試?這些問(wèn)題比較常見(jiàn)。按大師 Kent Benk 的話(huà),對那些你認為應該測試的代碼進(jìn)行測試。就是說(shuō),要相信自己的感覺(jué),自己的經(jīng)驗。那些重要的功能、核心的代碼就應該重點(diǎn)測試。感到疲勞就應該停下來(lái)休息一下。感覺(jué)沒(méi)有必要更詳細的測試,就停止本輪測試。

測試驅動(dòng)開(kāi)發(fā)強調測試并不應該是負擔,而應該是幫助我們減輕工作量的方法。而對于何時(shí)停止編寫(xiě)測試用例,也是應該根據你的經(jīng)驗,功能復雜、核心功能的代碼就應該編寫(xiě)更全面、細致的測試用例,否則測試流程即可。

測試范圍沒(méi)有靜態(tài)的標準,同時(shí)也應該可以隨著(zhù)時(shí)間改變。對于開(kāi)始沒(méi)有編寫(xiě)足夠的測試的功能代碼,隨著(zhù)bug的出現,根據bug補齊相關(guān)的測試用例即可。

小步前進(jìn)的原則,要求我們對大的功能塊測試時(shí),應該先分拆成更小的功能塊進(jìn)行測試,比如一個(gè)類(lèi)A使用了類(lèi)B、C,就應該編寫(xiě)到A使用B、C功能的測試代碼前,完成對B、C的測試和開(kāi)發(fā)。那么是不是每個(gè)小類(lèi)或者小函數都應該測試哪?我認為沒(méi)有必要。你應該運用你的經(jīng)驗,對那些可能出問(wèn)題的地方重點(diǎn)測試,感覺(jué)不可能出問(wèn)題的地方就等它真正出問(wèn)題的時(shí)候再補測試吧。

5.2. 怎么編寫(xiě)測試用例
測試用例的編寫(xiě)就用上了傳統的測試技術(shù)。

  • 操作過(guò)程盡量模擬正常使用的過(guò)程。
  • 全面的測試用例應該盡量做到分支覆蓋,核心代碼盡量做到路徑覆蓋。
  • 測試數據盡量包括:真實(shí)數據、邊界數據。
  • 測試語(yǔ)句和測試數據應該盡量簡(jiǎn)單,容易理解。
  • 為了避免對其他代碼過(guò)多的依賴(lài),可以實(shí)現簡(jiǎn)單的樁函數或樁類(lèi)(Mock Object)。
  • 如果內部狀態(tài)非常復雜或者應該判斷流程而不是狀態(tài),可以通過(guò)記錄日志字符串的方式進(jìn)行驗證。

6. Tips
很多朋友有疑問(wèn),“測試代碼的正確性如何保障?是寫(xiě)測試代碼還是寫(xiě)測試文檔?”這樣是不是會(huì )陷入“雞生蛋,蛋生雞”的循環(huán)。其實(shí)是不會(huì )的。通常測試代碼通常是非常簡(jiǎn)單的,通常圍繞著(zhù)某個(gè)情況的正確性判斷的幾個(gè)語(yǔ)句,如果太復雜,就應該繼續分解啦。而傳統的開(kāi)發(fā)過(guò)程通常強調測試文檔。但隨著(zhù)開(kāi)發(fā)節奏的加快,用戶(hù)需求的不斷變化,維護高層(需求、概要設計)的測試文檔可以,更低層的測試文檔的成本的確太大了。而且可實(shí)時(shí)驗證功能正確性的測試代碼就是對代碼最好的文檔。

軟件開(kāi)發(fā)過(guò)程中,除了遵守上面提到的測試驅動(dòng)開(kāi)發(fā)的幾個(gè)原則外,一個(gè)需要注意的問(wèn)題就是,謹防過(guò)度設計。編寫(xiě)功能代碼時(shí)應該關(guān)注于完成當前功能點(diǎn),通過(guò)測試,使用最簡(jiǎn)單、直接的方式來(lái)編碼。過(guò)多的考慮后期的擴展,其他功能的添加,無(wú)疑增加了過(guò)多的復雜性,容易產(chǎn)生問(wèn)題。應該等到要添加這些特性時(shí)在進(jìn)行詳細的測試驅動(dòng)開(kāi)發(fā)。到時(shí)候,有整套測試用例做基礎,通過(guò)不斷重構很容易添加相關(guān)特性。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
淺析軟件工程開(kāi)發(fā)方法學(xué)RUP
軟件開(kāi)發(fā)過(guò)程學(xué)習總結CMM、RUP、XP
RUP和IPD流程的優(yōu)缺點(diǎn)
解析UML的要點(diǎn)與應用 第3頁(yè)|IT168 技術(shù)開(kāi)發(fā)
軟件過(guò)程開(kāi)發(fā)方法(RUP、AP、MP、HP)
RUP
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久