導航:首頁 > 編程語言 > 極限編程只考慮當前的需求

極限編程只考慮當前的需求

發布時間:2022-09-07 14:59:25

① 軟體工程相關基礎問題

淺論軟體工程
軟體工程 (Software Engineering,簡稱為SE)是一門研究用工程化方法構建和維護有效的、實用的和高質量的軟體的學科。它涉及到程序設計語言,資料庫,軟體開發工具,系統平台,標准,設計模式等方面。
在現代社會中,軟體應用於多個方面。典型的軟體比如有電子郵件,嵌入式系統,人機界面,辦公套件,操作系統,編譯器,資料庫,游戲等。同時,各個行業幾乎都有計算機軟體的應用,比如工業,農業,銀行,航空,政府部門等。這些應用促進了經濟和社會的發展,使得人們的工作更加高效,同時提高了生活質量。
軟體工程師是對應用軟體創造軟體的人們的統稱,軟體工程師按照所處的領域不同可以分為系統分析員,軟體設計師,系統架構師,程序員,測試員等等。人們也常常用程序員來泛指各種軟體工程師。
軟體工程的主要課程:
外語、高等數學、線性代數、高等代數、電子技術基礎、離散數學、計算機引論(C語言)、數據結構、C++程序設計、匯編語言程序設計、演算法設計與分析、計算機組成原理與體系結構、資料庫系統、計算機網路、軟體工程、軟體測試技術、軟體需求與項目管理、軟體設計實例分析、CMM/ISO9000等。
軟體工程(SoftWare Engineering)的框架可概括為:目標、過程和原則。
(1)軟體工程目標:生產具有正確性、可用性以及開銷合宜的產品。正確性指軟體產品達到預期功能的程度。可用性指軟體基本結構、實現及文檔為用戶可用的程度。開銷合宜是指軟體開發、運行的整個開銷滿足用戶要求的程度。這些目標的實現不論在理論上還是在實踐中均存在很多待解決的問題,它們形成了對過程、過程模型及工程方法選取的約束。
(2)軟體工程過程:生產一個最終能滿足需求且達到工程目標的軟體產品所需要的步驟。軟體工程過程主要包括開發過程、運作過程、維護過程。它們覆蓋了需求、設計、實現、確認以及維護等活動。需求活動包括問題分析和需求分析。問題分析獲取需求定義,又稱軟體需求規約。需求分析生成功能規約。設計活動一般包括概要設計和詳細設計。概要設計建立整個軟體系統結構,包括子系統、模塊以及相關層次的說明、每一模塊的介面定義。詳細設計產生程序員可用的模塊說明,包括每一模塊中數據結構說明及加工描述。實現活動把設計結果轉換為可執行的程序代碼。確認活動貫穿於整個開發過程,實現完成後的確認,保證最終產品滿足用戶的要求。維護活動包括使用過程中的擴充、修改與完善。伴隨以上過程,還有管理過程、支持過程、培訓過程等。
(3)軟體工程的原則是指圍繞工程設計、工程支持以及工程管理在軟體開發過程中必須遵循的原則。
[編輯本段]軟體工程的定義
軟體工程一直以來都缺乏一個統一的定義,很多學者、組織機構都分別給出了自己的定義:
(1)。Barry Boehm:運用現代科學技術知識來設計並構造計算機程序及為開發、運行和維護這些程序所必需的相關文件資料。
(2)。IEEE在軟體工程術語匯編中的定義:軟體工程是:1.將系統化的、嚴格約束的、可量化的方法應用於軟體的開發、運行和維護,即將工程化應用於軟體;2.在1中所述方法的研究
(3)。Fritz Bauer在NATO會議上給出的定義:建立並使用完善的工程化原則,以較經濟的手段獲得能在實際機器上有效運行的可靠軟體的一系列方法。
目前比較認可的一種定義認為:軟體工程是研究和應用如何以系統性的、規范化的、可定量的過程化方法去開發和維護軟體,以及如何把經過時間考驗而證明正確的管理技術和當前能夠得到的最好的技術方法結合起來。
(4)。《計算機科學技術網路全書》中的定義:軟體工程是應用計算機科學、數學及管理科學等原理,開發軟體的工程。軟體工程借鑒傳統工程的原則、方法,以提高質量、降低成本。其中,計算機科學、數學用於構建模型與演算法,工程科學用於制定規范、設計范型(paradigm)、評估成本及確定權衡,管理科學用於計劃、資源、質量、成本等管理。
[編輯本段]軟體工程學的內容
軟體工程學的主要內容是軟體開發技術和軟體工程管理.
軟體開發技術包含軟體工程方法學、軟體工具和軟體開發環境;軟體工程管理學包含軟體工程經濟學和軟體管理學。
[編輯本段]軟體工程基本原理
著名軟體工程專家B.Boehm綜合有關專家和學者的意見並總結了多年來開發軟體的經驗,於1983年在一篇論文中提出了軟體工程的七條基本原理。Boehm
(1)用分階段的生存周期計劃進行嚴格的管理。
(2)堅持進行階段評審。
(3)實行嚴格的產品控制。
(4)採用現代程序設計技術。
(5)軟體工程結果應能清楚地審查。
(6)開發小組的人員應該少而精。
(7)承認不斷改進軟體工程實踐的必要性。
B.Boehm指出,遵循前六條基本原理,能夠實現軟體的工程化生產;按照第七條原理,不僅要積極主動地採納新的軟體技術,而且要注意不斷總結經驗。
軟體工程(SoftWare Engineering)的框架可概括為:目標、過程和原則。
(1)軟體工程目標:生產具有正確性、可用性以及開銷合宜的產品。正確性指軟體產品達到預期功能的程度。可用性指軟體基本結構、實現及文檔為用戶可用的程度。開銷合宜是指軟體開發、運行的整個開銷滿足用戶要求的程度。這些目標的實現不論在理論上還是在實踐中均存在很多待解決的問題,它們形成了對過程、過程模型及工程方法選取的約束。
(2)軟體工程過程:生產一個最終能滿足需求且達到工程目標的軟體產品所需要的步驟。軟體工程過程主要包括開發過程、運作過程、維護過程。它們覆蓋了需求、設計、實現、確認以及維護等活動。需求活動包括問題分析和需求分析。問題分析獲取需求定義,又稱軟體需求規約。需求分析生成功能規約。設計活動一般包括概要設計和詳細設計。概要設計建立整個軟體系統結構,包括子系統、模塊以及相關層次的說明、每一模塊的介面定義。詳細設計產生程序員可用的模塊說明,包括每一模塊中數據結構說明及加工描述。實現活動把設計結果轉換為可執行的程序代碼。確認活動貫穿於整個開發過程,實現完成後的確認,保證最終產品滿足用戶的要求。維護活動包括使用過程中的擴充、修改與完善。伴隨以上過程,還有管理過程、支持過程、培訓過程等。
(3)軟體工程的原則是指圍繞工程設計、工程支持以及工程管理在軟體開發過程中必須遵循的原則
[編輯本段]軟體工程必須遵循什麼原則
圍繞工程設計、工程支持以及工程管理已提出了以下四條基本原則:
(1)選取適宜的開發模型
該原則與系統設計有關。在系統設計中,軟體需求、硬體需求以及其它因素間是相互制約和影響的,經常需要權衡。因此,必需認識需求定義的易變性,採用適當的開發模型,保證軟體產品滿足用戶的要求。
(2)採用合適的設計方法
在軟體設計中,通常需要考慮軟體的模塊化、抽象與信息隱蔽、局部化、一致性以及適應性等特徵。合適的設計方法有助於這些特徵的實現,以達到軟體工程的目標。
(3)提供高質量的工程支撐
工欲善其事,必先利其器。在軟體工程中,軟體工具與環境對軟體過程的支持頗為重要。軟體工程項目的質量與開銷直接取決於對軟體工程所提供的支撐質量和效用。
(4)重視軟體工程的管理
軟體工程的管理直接影響可用資源的有效利用,生產滿足目標的軟體產品以及提高軟體組織的生產能力等問題。因此,僅當軟體過程予以有效管理時,才能實現有效的軟體工程。
軟體工程是指導計算機軟體開發和維護的工程學科。
採用工程的概念、原理、 技術和方法來開發與維護軟體,把經過時間考驗而證明正確的管理技術和當前能夠 得到的最好的技術方法結合起來,這就是軟體工程。
軟體工程強調使用生存周期方法學和各種結構分析及結構設計技術。它們是在七十年代為了對付應用軟體日益增長的復雜程度、漫長的開發周期以及用戶對軟體產品經常不滿意的狀況而發展起來的。人類解決復雜問題時普遍採用的一個策略就是「各個擊破」,也就是對問題進行分解然後再分別解決各個子問題的策略。軟體工程採用的生存周期方法學就是從時間角度對軟體開發和維護的復雜問題進行分解,把軟體生存的漫長周期依次劃分為若干個階段,每個階段有相對獨立的任務,然後逐步完成每個階段的任務。採用軟體工程方法論開發軟體的時候,從對任務的抽象邏輯分析開始,一個階段一個階段地進行開發。前一個階段任務的完成是開始進行後一個階段工作的前提和基礎,而後一階段任務的完成通常是使前一階段提出的解法更進一步具體化,加進了更多的物理細節。每一個階段的開始和結束都有嚴格標准,對於任何兩個相鄰的階段而言,前一階段的結束標准就是後一階段的開始標准。在每一個階段結束之前都必須進行正式嚴格的技術審查和管理復審,從技術和管理兩方面對這個階段的開發成果進行檢查,通過之後這個階段才算結束;如果檢查通不過,則必須進行必要的返工,並且返工後還要再經過審查。審查的一條主要標准就是每個階段都應該交出「最新式的」(即和所開發的軟體完全一致的)高質量的文檔資料,從而保證在軟體開發工程結束時有一個完整准確的軟體配置交付使用。文檔是通信的工具,它們清楚准確地說明了到這個時候為止,關於該項工程已經知道了什麼,同時確立了下一步工作的基礎。此外,文檔也起備忘錄的作用,如果文檔不完整,那麼一定是某些工作忘記做了,在進入生存周期的下一階段之前,必須補足這些遺漏的細節。在完成生存周期每個階段的任務時,應該採用適合該階段任務特點的系統化的技術方法——結構分析或結構設計技術。
把軟體生存周期劃分成若干個階段,每個階段的任務相對獨立,而且比較簡單,便於不同人員分工協作,從而降低了整個軟體開發工程的困難程度;在軟體生存周期的每個階段都採用科學的管理技術和良好的技術方法,而且在每個階段結束之前都從技術和管理兩個角度進行嚴格的審查,合格之後才開始下一階段的工作,這就使軟體開發工程的全過程以一種有條不紊的方式進行,保證了軟體的質量,特別是提高了軟體的可維護性。總之,採用軟體工程方法論可以大大提高軟體開發的成功率,軟體開發的生產率也能明顯提高。
目前劃分軟體生存周期階段的方法有許多種,軟體規模、種類、開發方式、開發環境以及開發時使用的方法論都影響軟體生存周期階段的劃分。在劃分軟體生存周期的階段時應該遵循的一條基本原則就是使各階段的任務彼此間盡可能相對獨立,同一階段各項任務的性質盡可能相同,從而降低每個階段任務的復雜程度,簡化不同階段之間的聯系,有利於軟體開發工程的組織管理。一般說來,軟體生存周期由軟體定義、軟體開發和軟體維護三個時期組成,每個時期又進一步劃分成若干個階段。下面的論述主要針對應用軟體,對系統軟體也基本適用。
軟體定義時期的任務是確定軟體開發工程必須完成的總目標;確定工程的可行性,導出實現工程目標應該採用的策略及系統必須完成的功能;估計完成該項工程需要的資源和成本,並且制定工程進度表。這個時期的工作通常又稱為系統分析,由系統分析員負責完成。軟體定義時期通常進一步劃分成三個階段,即問題定義、可行性研究和需求分析。
開發時期具體設計和實現在前一個時期定義的軟體,它通常由下述四個階段組成:總體設計,詳細設計,編碼和單元測試,綜合測試。
維護時期的主要任務是使軟體持久地滿足用戶的需要。具體地說,當軟體在使用過程中發現錯誤時應該加以改正;當環境改變時應該修改軟體以適應新的環境;當用戶有新要求時應該及時改進軟體滿足用戶的新需要。通常對維護時期不再進一步劃分階段,但是每一次維護活動本質上都是一次壓縮和簡化了的定義和開發過程。
下面扼要介紹軟體生存周期每個階段的基本任務和結束標准。
1問題定義
問題定義階段必須回答的關鍵問題:「要解決的問題是什麼?」如果不知道問題是什麼就試圖解決這個問題,顯然是盲目的,只會白白浪費時間和金錢,最終得出的結果很可能是毫無意義的。盡管確切地定義問題的必要性是十分明顯的,但是在實踐中它卻可能是最容易被忽視的一個步驟。
通過問題定義階段的工作,系統分析員應該提出關於問題性質、工程目標和規模的書面報告。通過對系統的實際用戶和使用部門負責人的訪問調查,分析員扼要地寫出他對問題的理解,並在用戶和使用部門負責人的會議上認真討論這份書面報告,澄清含糊不精的地方,改正理解不正確的地方,最後得出一份雙方都滿意的文檔。
問題定義階段是軟體生存周期中最簡短的階段,一般只需要一天甚至更少的時間。
2可行性研究
這個階段要回答的關鍵問題:「對於上一個階段所確定的問題有行得通的解決辦法嗎?」為了回答這個問題,系統分析員需要進行一次大大壓縮和簡化了的系統分析和設計的過程,也就是在較抽象的高層次上進行的分析和設計的過程。
可行性研究應該比較簡短,這個階段的任務不是具體解決問題,而是研究問題的范圍,探索這個問題是否值得去解,是否有可行的解決辦法。
在問題定義階段提出的對工程目標和規模的報告通常比較含糊。可行性研究階段應該導出系統的高層邏輯模型(通常用數據流圖表示),並且在此基礎上更准確、更具體地確定工程規模和目標。然後分析員更准確地估計系統的成本和效益,對建議的系統進行仔細的成本/效益分析是這個階段的主要任務之一。
可行性研究的結果是使用部門負責人做出是否繼續進行這項工程的決定的重要依據,一般說來,只有投資可能取得較大效益的那些工程項目才值得繼續進行下去。可行性研究以後的那些階段將需要投入要多的人力物力。及時中止不值得投資的工程項目,可以避免更大的浪費。
3需求分析
這個階段的任務仍然不是具體地解決問題,而是准確地確定「為了解決這個問題,目標系統必須做什麼」,主要是確定目標系統必須具備哪些功能。
用戶了解他們所面對的問題,知道必須做什麼,但是通常不能完整准確地表達出他們的要求,更不知道怎樣利用計算機解決他們的問題;軟體開發人員知道怎樣使用軟體實現人們的要求,但是對特定用戶的具體要求並不完全清楚。因此系統分析員在需求分析階段必須和用戶密切配合,充分交流信息,以得出經過用戶確認的系統邏輯模型。通常用數據流圖、數據字典和簡要的演算法描述表示系統的邏輯模型。
在需求分析階段確定的系統邏輯模型是以後設計和實現目標系統的基礎,因此必須准確完整地體現用戶的要求。系統分析員通常都是計算機軟體專家,技術專家一般都喜歡很快著手進行具體設計,然而,一旦分析員開始談論程序設計的細節,就會脫離用戶,使他們不能繼續提出他們的要求和建議。較件工程使用的結構分析設計的方法為每個階段都規定了特定的結束標准,需求分析階段必須提供完整准確的系統邏輯模型,經過用戶確認之後才能進入下一個階段,這就可以有效地防止和克服急於著手進行具體設計的傾向。
4總體設計
這個階段必須回答的關鍵問題是:「概括地說,應該如何解決這個問題?」
首先,應該考慮幾種可能的解決方案。列如,目標系統的一些主要功能是用計算機自動完成還是用人工完成;如果使用計算機,那麼是使用批處理方式還是人機交互方式;信息存儲使用傳統的文件系統還是資料庫……。通常至少應該考慮下述幾類可能的方案:
低成本的解決方案。系統只能完成最必要的工作,不能多做一點額處的工作。
中等成本的解決方案。這樣的系統不僅能夠很好地完成預定的任務,使用起來很方便,而且可能還具有用戶沒有具體指定的某些功能和特點。雖然用戶沒有提出這些具體要求,但是系統分析員根據自己的知識和經驗斷定,這些附加的能力在實踐中將證明是很有價值的。
高成本的「十全十美」的系統。這樣的系統具有用戶可能希望有的所有功能和特點。
系統分析員應該使用系統流程圖或其他工具描述每種可能的系統,估計每種方案的成本和效益,還應該在充分權衡各種方案的利弊的基礎上,推薦一個較好的系統 (最佳方案),並且制定實現所推薦的系統的詳細計劃。如果用戶接受分析員推薦的系統,則可以著手完成本階段的另一項主要工作。
上面的工作確定了解決問題的策略以及目標系統需要哪些程序,但是,怎樣設計這些程序呢?結構設計的一條基本原理就是程序應該模塊化,也就是一個大程序應該由許多規模適中的模塊按合理的層次結構組織而成。總體設計階段的第二項主要任務就是設計軟體的結構,也就是確定程序由哪些模塊組成以及模塊間的關系。通常用層次圖或結構圖描繪軟體的結構。
5詳細設計
總體設計階段以比較抽象概括的方式提出了解決問題的辦法。詳細設計階段的任務就是把解法具體化,也就是回答下面這個關鍵問題:「應該怎樣具體地實現這個系統呢?」
這個階段的任務還不是編寫程序,而是設計出程序的詳細規格說明。這種規格說明的作用很類似於其他工程領域中工程師經常使用的工程藍圖,它們應該包含必要的細節,程序員可以根據它們寫出實際的程序代碼。
通常用HIPO圖(層次圖加輸入/處理/輸出圖)或PDL語言(過程設計語言)描述詳細設計的結果。
6編碼和單元測試
這個階段的關鍵任務是寫出正確的容易理解、容易維護的程序模塊。
程序員應該根據目標系統的性質和實際環境,選取一種適當的高級程序設計語言(必要時用匯編語言),把說細設計的結果翻譯成用選定的語言書寫的程序,並且仔細測試編寫出的每一個模塊。
7綜合測試
這個階段的關鍵任務是通過各種類型的測試(及相應的調試)使軟體達到預定的要求。
最基本的測試是集成測試和驗收測試。所謂集成測試是根據設計的軟體結構,把經過單元測試檢驗的模塊按某種選定的策略裝配起來,在裝配過程中對程序進行必要的測試。所謂驗收測試則是按照規格說明書的規定(通常在需求分析階段確定),由用戶(或在用戶積極參加下)對目標系統進行驗收。
必要時還可以再通過現場測試或平行運行等方法對目標系統進一步測試檢驗。
為了使用戶能夠積極參加驗收測試,並且在系統投入生產性運行以後能夠正確有效地使用這個系統,通常需要以正式的或非正式的方式對用戶進行培訓。
通過對軟體測試結果的分析可以預測軟體的可靠性;反之,根據對軟體可靠性的要求也可以決定測試和調試過程什麼時候可以結束。
應該用正式的文檔資料把測試計劃、詳細測試方案以及實際測試結果保存下來,做為軟體配置的一個組成成分。
8軟體維護
維護階段的關鍵任務是,通過各種必要的維護活動使系統持久地滿足用戶的需要。
通常有四類維護活動:改正性維護,也就是診斷和改正在使用過程中發現的軟體錯誤;適應性維護,即修改軟體以適應環境的變化;完善性維護,即根據用戶的要求改進或擴充軟體使它更完善;預防性維護,即修改軟體為將來的維護活動預先做准備。
雖然沒有把維護階段進一步劃分成更小的階段,但是實際上每一項維護活動都應該經過提出維護要求(或報告問題),分析維護要求,提出維護要求,提出維護方案,審批維護方案,確定維護計劃,修改軟體設計,修改程序,測試程序,復查驗收等一系列步驟,因此實質上是經歷了一次壓縮和簡化了的軟體定義和開發的全過程。
都應該經過提出維護要求(或報告問題),分析維護要求,提出維護要求,提出維護方案,審批維護方案,確定維護計劃,修改軟體設計,修改程序,測試程序,復查驗收等一系列步驟,因此實質上是經歷了一次壓縮和簡化了的軟體定義和開發的全過程。

② 極限編程的核心價值

極限編程中有四個核心價值是我們在開發中必須注意的:溝通(Communication)、簡單(Simplicity)、反饋(Feedback)、勇氣(Courage)、此外還擴展了第五個價值觀:謙遜(Modesty)。 XP用「溝通、簡單、反饋、勇氣和謙遜」來減輕開發壓力和包袱;無論是術語命名、專著敘述內容和方式、過程要求,都可以從中感受到輕松愉快和主動奮發的態度和氣氛。這是一種幫助理解和更容易激發人的潛力的手段。XP用自己的實踐,在一定范圍內成功地打破了軟體工程「必須重量」才能成功的傳統觀念。
XP精神可以啟發我們如何學習和對待快速變化、多樣的開發技術。成功學習XP的關鍵,是用「溝通、簡單、反饋、勇氣和謙遜」的態度來對待XP;輕松愉快地來感受XP的實踐思想;自己認真實踐後,通過對真實反饋的分析,來決定XP對自己的價值;有勇氣接受它,或改進它。

③ 軟體測試

軟體測試知識點
一.軟體測試基本概念
1.軟體質量的概念
功能性:軟體提供明確與隱含功能的能力
可靠性:維持規定性能的能力
易用性:被理解學習使用和吸引用戶的能力
效率:相對於所用資源的數量,軟體產品可提供適應性能的能力
可維護性:糾正錯誤,改進功能,適應環境的能力
可移植性:遷移到另一種環境的能力
2.軟體測試目標和原則
目標:以最少的時間和人力,系統地找出軟體潛在的各種錯誤和缺陷
原則:1.盡早和不斷地進行軟體測試;
2.測試用例應該由測試輸入數據和預期輸出結果構成;
3.程序員盡量避免測試自己的程序(最好是獨立於開發組和客戶的第三方測試組和機構)
4.測試應包括合理的和不合理的輸出條件,
5。注意測試中的集群現象(測試後的程序殘存的錯誤數目與已經發現的成正比)
6.嚴格執行測試計劃,排除隨意性7.對每一個結果做全面檢查
8.妥善保管測試計劃用例出錯統計和分析報告
3.軟體測試心理學
1)程序測試過程具有破壞性:測試是為了發現錯誤而執行程序的過程
2)程序員盡量避免測試自己的程序
3)程序設計組織不應測試自己的程序
4.軟體測試的經濟學:不能發現」所有」的缺陷和錯誤
1.黑盒測試(數據驅動測試/輸入輸出驅動測試):測試人員完全不考慮程序內部的特性,和邏輯結構,只根據程序的需求規格說明書,檢查程序是否符合他的功能說明
2.白盒測試(邏輯驅動測試):對程序的邏輯結構進行檢查
5.軟體質量保證』

二.軟體測試類型以其地位
1.軟體開發階段:
1.生存周期:制定規劃(功能需求可靠性介面可行性資源,可行性報告)——系統與軟體需求定義——軟體設計(技術核心)——編程和單元測試——系統與集成測試——運行和維護
2.測試信息流:軟體配置,測試配置,測試工具
2.規劃階段的測試:目標闡述(不太詳細也不具體),需求分析,功能定義,規劃階段的測試
3.設計階段的測試:外部設計(用戶界面),內部設計(結構設計,數據設計,邏輯設計),偽代碼分析
4.編程階段的測試:白盒測試與黑盒測試,結構測試與功能測試,路徑測試:覆蓋准則,增量測試與大突擊測試
三.代碼檢查、走查和評審
1.桌面檢查:程序員檢查自己編寫的程序,是在進行單元測試之前對代碼進行分析
2.代碼檢查:以小組為單位閱讀代碼,
1.協調人:主持、引導代碼檢查的過程
2.開發人員:檢查項目的生產者
3.檢查人員:檢查小組每一個人都可以認為是一個檢查人員,可以兼任不同的角色。
4.解說員5.記錄員
項目:變數是否喂賦值或者初始化?上下標是否在界限之內?是不是整數?是否分配了數值的內存單元?變數的數據類型是否與編譯器所預期的一致?
3.走查:與代碼檢查類似,以小組為單位進行,進行一些列規程的錯誤檢查技術的集合
4.同行評審:通過作者的同行來確認缺陷和需要變更區域檢查的方法
評審的方法和技術:
1. 臨時評審:一位程序員臨時請另一位花幾分鍾時間查找一個缺陷
2. 桌上檢查或輪查:多人進行的並行桌上檢查
3. 結對評審:作者請另一位同行進行桌上檢查
4. 走查:5.小組評審。6.正式審查
四.覆蓋率測試
1.概念:度量測試完整性的手段
覆蓋率=被執行的項目數/項總數 ×100%
2.邏輯結構的覆蓋測試
◇判定,□語句,○程序的開始或者結束,
1.語句覆蓋率=被評價用到的語句數/可執行的語句總數 ×100%
2.指令塊:不存在(會引起分支)的控制語句,IB
IB覆蓋率=被執行的語句塊數量/程序中的指令塊總數 ×100%
3.判定覆蓋率=被執行的分支數量/程序中的分支總數 ×100%
DDP覆蓋率=被評價到的判定路徑數量/程序中的判定路徑總數 ×100%
5. 條件覆蓋=被評價到的條件取值數量/條件取值總數 ×100%
3.路徑測試覆蓋:
1.分支結構的路徑測試:①對於嵌套型分支結構,若有n個判定語句,則存在n+1條不同的路徑
②對於串聯型分支結構,若有n個判定語句,則有2n個路徑 →減少測試用例,構造正交表P71
2.循環結構的路徑測試:簡單循環,嵌套循環,連鎖循環,非結構循環
4.數據流測試:關注在一條路徑上變數在何處賦值,在何處引用
傭金問題偽代碼描述:P79
5.基於覆蓋測試的數據選擇
如何使用覆蓋率①覆蓋率不是目的,只是一種手段②不能針對所有的覆蓋率指標進行測試③不能追求100%的覆蓋率
五.黑盒測試
1.等價類測試:降數目極多的數據化成等價類,然後測試某類的代表值
原則:①如果確定了取值范圍或者取值的個數,則可以確立一個有效等價類和兩個無效等價類
②如果輸入條件規定了輸入值的集合,則可以有一個有效和一個無效等價類
2.邊界值測試:用例:剛達到這個范圍的值,比最大范圍多1或者少1,如果輸入輸出域是有序集合,則採用邊界
3.基於因果圖的測試:E互斥,I包含(至少一個成立)O唯一 R要求(a→b)M屏蔽(a1則b0)
4.基於狀態圖的測試:P105
六.單元測試和集成測試
1.單元測試的目標和模型:
1.單元:可以編譯和執行的最小軟體構件、不會指派給多個設計人員開發
2.目標:驗證代碼是與設計相合的,跟蹤需求和設計的實現和缺陷,發現編碼過程中引入的錯誤
3.模型:(與集成,系統測試區別:P120)

2.單元測試的策略
1.自頂向下:逐層打樁 2.自底向上:自下向上打樁 3.孤立測試:為每個模塊單獨打樁
4.綜合測試
3.單元測試分析:
1.模塊介面
2.局部數據結構:保證臨時存儲在模塊內的數據的完整正確
3.獨立路徑:保證每個模塊的每條語句至少執行一次
4.出錯處理:預見各種出錯條件,進行適當的處理
5.邊界條件.
4.集成測試的基本概念
1.定義:對系統介面和集成後的功能的正確性進行檢驗
2.與系統測試區別:
①測試對象 集成:各個模塊的構件 系統:軟硬體以及相關的外圍設備,數據採集傳輸等
②測試時間 集成介於單元和系統測試之間
③ 測試方法:單元白盒,集成灰盒,系統黑盒
5.集成測試策略:
1.基於分解
①一次性集成測試②自頂向下增量式測試③自底向上的增量式集成測試④三明治集成
2.基於功能的集成:採用增量式集成測試方法
3.基於調用圖的集成:成對測試,相鄰測試
4.基於路徑的集成 5.基於進度的集成
6集成測試分析
1.體系結構分析:
①根據需求分析,劃分結構層次圖
②對各個結構之間的依賴關系進行分析,確定測試模塊的大小
2.模塊分析 3.介面分析 4.可測試性分析
七.系統測試
1.概念:軟體開發完成後,還要與系統的其他部分結合起來才能運行,系統測試的目的就是對各部分進行集成和確認測試
2.系統測試的方法:
①功能測試:是否有不正確或者遺漏的功能,能否滿足系統和用戶的隱式需求,能否正確接受輸入
②協調一致測試
③性能測試:度量系統的性能與預先定義的目標有多大差距:壓力測試:
④壓力測試:測試者想要破壞程序,邊界測試
⑤容量測試⑥安全性測試⑦失效恢復測試⑧備份測試GUI圖形化用戶介面測試⑩健壯性測試
易用性測試、安裝測試、文檔測試、在線幫助測試
3.系統測試的實施
①確認測試:有效性測試
②α測試和β測試:內部用戶/內測
③驗收測試:
④回歸測試:軟體變更後對其進行重新測試
八.軟體性能測試和可靠性測試
1.軟體性能的概念:完成某項功能時展現出來的及時性
指標:響應時間(平均,最大),吞吐量,並發用戶數,資源利用率
2.性能測試的執行:
3.軟體可靠性的概念:在規定時間條件內,軟體不引起失效的概率
軟硬體可靠性區別:
① 唯一性:軟體每份拷貝都相同,硬體不能相同
② 物理退化:硬體可靠性下降
③ 邏輯復雜性:軟體是純邏輯產品,其失效也主要是邏輯錯誤
④ 版本更新:硬體較慢,軟體較快
4.軟體可靠性預計:
①軟體的運行剖面與可靠性剖面一致②一旦發生故障,立即修復,不引入新的故障③故障和失效是相互獨立的④每個故障發生的概率相等
九.面向對象的軟體測試
1. 面向對象的軟體測試的問題
1.封裝:信息隱蔽,一組相關變數和方法被封裝在同一個類中
2.繼承:子類直接獲得父類的屬性和方法 充分性,誤用
3.多態
2. 面向對象的軟體測試模型:分析測試(OOA),設計測試(OOD)編程測試(OOP)
3. 面向對象的軟體測試策略:檢查分析結果是否附和相應的面向對象分析方法要求,分析檢查結果是否滿足軟體需求
十:WEB應用測試
1. 應用伺服器的分類:
① 面向的領域:通用應用伺服器(提供多方面服務),專用應用伺服器
② 循環的規范:
2. WEB應用的測試策略
1. 表示層的測試:拍板結構,鏈接結構,客戶端程序,瀏覽器兼容性
2. 業務層的測試:單個程序(盡可能白盒測試),對一組程序
3. 數據層的測試:
3.WEB軟體的測試技術:
1.功能測試:鏈接測試,表單測試,Cookies測試
2.性能測試:並發測試,負載測試和性能調優
3.安全性測試:伺服器,客戶端,Cookies,日誌功能
4.介面測試:使用介面,提供介面
4.系統安全檢測與防護
1.入侵檢測 狹義:黑客進入一個系統 廣義:竊取數據,濫用伺服器,發送垃圾郵件
2.漏洞掃描 操作系統漏洞,網路漏洞,資料庫漏洞
3.安全策略 ①物理破壞防護:遠離火災,人為破壞
②信息竊取防護:入網訪問控制,許可權控制(用戶許可權,操作許可權),伺服器和節點安全控制,網路監測控制,防火牆控制
③信息加密:保護策略,加密演算法
十一.其他測試
1. 兼容性測試①不同的硬體配置影響軟體性能②軟體使用了硬體的特定功能
1. 軟體兼容性測試:與操作系統,資料庫,瀏覽器,中間件,其他軟體 兼容性
2. 數據兼容性:不同版本數據,不同軟體間兼容性
2.易用性測試
1.易安裝性測試:安裝手冊自動化程度,靈活性,中斷處理,安裝和卸載,多環境安裝支持
2.功能易用性測試:業務符合度,功能定製性,功能關聯度,數據共享度,用戶約束的合理性
3.用戶界面測試:界面整體(合理一致規范),界面元素,輸入測試
3.構件測試:
4.極限測試:
1.極限編程:①特性:簡單的分析設計,頻繁的客戶交流,增量式開發,連續的測試
②優點:隨時應對新增或改變的需求
2.極限測試①單元測試:最重要的發現錯誤的手段,由編碼人員完成,在編程之前測試
②極限測試的實施:單元測試用例的生成
5.文檔測試:只能以文檔審查的方式進行
內容:宣傳和包裝材料,用戶許可說明書,手冊,在線幫助,示例和模板
文檔的測試

④ 極限編程和其它的軟體開發方法的區別。 盡量全一點。2000字左右

極限編程(ExtremeProgramming,簡稱XP)是由KentBeck在1996年提出的。KentBeck在九十年代初期與WardCunningham共事時,就一直共同探索著新的軟體開發方法,希望能使軟體開發更加簡單而有效。Kent仔細地觀察和分析了各種簡化軟體開發的前提條件、可能行以及面臨的困難。1996年三月,Kent終於在為DaimlerChrysler所做的一個項目中引入了新的軟體開發觀念——XP。

極限編程是一個輕量級的、靈巧的軟體開發方法;同時它也是一個非常嚴謹和周密的方法。它的基礎和價值觀是交流、樸素、反饋和勇氣;即,任何一個軟體項目都可以從四個方面入手進行改善:加強交流;從簡單做起;尋求反饋;勇於實事求是。XP是一種近螺旋式的開發方法,它將復雜的開發過程分解為一個個相對比較簡單的小周期;通過積極的交流、反饋以及其它一系列的方法,開發人員和客戶可以非常清楚開發進度、變化、待解決的問題和潛在的困難等,並根據實際情況及時地調整開發過程。

極限編程中有四個核心價值是我們在開發中必須注意的:溝通(Communication)、簡單(Simplicity)、反饋(Feedback)和勇氣(Courage)。 XP用「溝通、簡單、反饋和勇氣」來減輕開發壓力和包袱;無論是術語命名、專著敘述內容和方式、過程要求,都可以從中感受到輕松愉快和主動奮發的態度和氣氛。這是一種幫助理解和更容易激發人的潛力的手段。XP用自己的實踐,在一定范圍內成功地打破了軟體工程「必須重量」才能成功的傳統觀念。

XP精神可以啟發我們如何學習和對待快速變化、多樣的開發技術。成功學習XP的關鍵,是用「溝通、簡單、反饋和勇氣」的態度來對待XP;輕松愉快地來感受XP的實踐思想;自己認真實踐後,通過對真實反饋的分析,來決定XP對自己的價值;有勇氣接受它,或改進它。

XP中一些基本概念的簡介 UserStory:開發人員要求客戶把所有的需求寫成一個個獨立的小故事,每個只需要幾天時間就可以完成。開發過程中,客戶可以隨時提出新的UserStory,或者更改以前的UserStory。 StoryEstimates和開發速度:開發小組對每個UserStory進行估算,並根據每個開發周期(Iteration)中的實際情況反復計算開發速度。這樣,開發人員和客戶能知道每個星期到底能開發多少UserStory。 ReleasePlan和ReleaseScope:整個開發過程中,開發人員將不斷地發布新版本。開發人員和客戶一起確定每個發布所包含的UserStory。 Iteration(開發周期,或稱迭代)和IterationPlan:在一個Release過程中,開發人員要求客戶選擇最有價值的UserStory作為未來一兩個星期的開發內容。 TheSeed:第一個迭代(Iteration)完成後,提交給客戶的系統。雖然這不是最終的產品,但它已經實現了幾個客戶認為是最重要的Story,開發人員將逐步在其基礎上增加新的模塊。 ContinuousIntegration(整合):把開發完的UserStory的模塊一個個拼裝起來,一步步接近乃至最終完成最終產品。 驗收測試(功能測試):對於每個UserStory,客戶將定義一些測試案例,開發人員將使運行這些測試案例的過程自動化。 UnitTest(單元測試):在開始寫程序前,程序員針對大部分類的方法,先寫出相應的測試程序。 Refactoring(重構):去掉代碼中的冗餘部分,增加代碼的可重用性和伸縮性。

⑤ 極限編程的方法

基於敏捷的核心思想和價值目標,XP要求項目團隊遵循13個核心實踐
團隊協作(Whole Team)
規劃策略(The Planning Game);
結對編程(Pair programming)
測試驅動開發(Testing-Driven Development)
重構(Refactoring)
簡單設計(Simple Design)
代碼集體所有權(Collective Code Ownership)
持續集成(Continuous Integration)
客戶測試(Customer Tests)
小型發布(Small Release)
每周40小時工作制(40-hour Week)
編碼規范(Code Standards)
系統隱喻(System Metaphor) 計劃項目(PlanningGame)、驗收測試、小規模發布(SmallReleases)
XP開發小組使用簡單的方式進行項目計劃和開發跟蹤,並以此預測項目進展情況和決定未來的步驟。根據需求的商業價值,開發小組針對一組組的需求進行一系列的開發和整合,每次開發都會產生一個通過測試的、可以使用的系統。

⑥ 極限編程xp與scrum的區別有哪些

m的迭代長度一般為 2~ 4周. 區別之二: 在迭代中, 是否允許修改需求 XP 在一個迭代中,如果一個User Story(用戶素材, 也就是一個需求)還沒有實現, 則可以考慮用另外的需

⑦ 代碼重構的概述

重構(),通過調整程序代碼改善軟體的質量、性能,使其程序的設計模式和架構更趨合理,提高軟體的擴展性和維護性。也許有人會問,為什麼不在項目開始時多花些時間把設計做好,而要以後花時間來重構呢?要知道一個完美得可以預見未來任何變化的設計,或一個靈活得可以容納任何擴展的設計是不存在的。系統設計人員對即將著手的項目往往只能從大方向予以把控,而無法知道每個細枝末節,其次永遠不變的就是變化,提出需求的用戶往往要在軟體成型後,才開始品頭論足,系統設計人員畢竟不是先知先覺的神仙,功能的變化導致設計的調整再所難免。所以測試為先,持續重構作為良好開發習慣被越來越多的人所採納,測試和重構像黃河的護堤,成為保證軟體質量的法寶。 在不改變系統功能的情況下,改變系統的實現方式。為什麼要這么做?投入精力不用來滿足客戶關心的需求,而是僅僅改變了軟體的實現方式,這是否是在浪費客戶的投資呢?
重構的重要性要從軟體的生命周期說起。軟體不同與普通的產品,他是一種智力產品,沒有具體的物理形態。一個軟體不可能發生物理損耗,界面上的按鈕永遠不會因為按動次數太多而發生接觸不良。那麼為什麼一個軟體製造出來以後,卻不能永遠使用下去呢?
對軟體的生命造成威脅的因素只有一個:需求的變更。一個軟體總是為解決某種特定的需求而產生,時代在發展,客戶的業務也在發生變化。有的需求相對穩定一些,有的需求變化的比較劇烈,還有的需求已經消失了,或者轉化成了別的需求。在這種情況下,軟體必須相應的改變。
考慮到成本和時間等因素,當然不是所有的需求變化都要在軟體系統中實現。但是總的說來,軟體要適應需求的變化,以保持自己的生命力。
這就產生了一種糟糕的現象:軟體產品最初製造出來,是經過精心的設計,具有良好架構的。但是隨著時間的發展、需求的變化,必須不斷的修改原有的功能、追加新的功能,還免不了有一些缺陷需要修改。為了實現變更,不可避免的要違反最初的設計構架。經過一段時間以後,軟體的架構就千瘡百孔了。bug越來越多,越來越難維護,新的需求越來越難實現,軟體的構架對新的需求漸漸的失去支持能力,而是成為一種制約。最後新需求的開發成本會超過開發一個新的軟體的成本,這就是這個軟體系統的生命走到盡頭的時候。
重構就能夠最大限度的避免這樣一種現象。系統發展到一定階段後,使用重構的方式,不改變系統的外部功能,只對內部的結構進行重新的整理。通過重構,不斷的調整系統的結構,使系統對於需求的變更始終具有較強的適應能力。
通過重構可以達到以下的目標:
·持續糾偏和改進軟體設計
重構和設計是相輔相成的,它和設計彼此互補。有了重構,你仍然必須做預先的設計,但是不必是最優的設計,只需要一個合理的解決方案就夠了,如果沒有重構、程序設計會逐漸腐敗變質,愈來愈像斷線的風箏,脫韁的野馬無法控制。重構其實就是整理代碼,讓所有帶著發散傾向的代碼回歸本位。
·
Martin Flower在《重構》中有一句經典的話:任何一個傻瓜都能寫出計算機可以理解的程序,只有寫出人類容易理解的程序才是優秀的程序員。對此,筆者感觸很深,有些程序員總是能夠快速編寫出可運行的代碼,但代碼中晦澀的命名使人暈眩得需要緊握坐椅扶手,試想一個新兵到來接手這樣的代碼他會不會想當逃兵呢?
軟體的生命周期往往需要多批程序員來維護,我們往往忽略了這些後來人。為了使代碼容易被他人理解,需要在實現軟體功能時做許多額外的事件,如清晰的排版布局,簡明扼要的注釋,其中命名也是一個重要的方面。一個很好的辦法就是採用暗喻命名,即以對象實現的功能的依據,用形象化或擬人化的手法進行命名,一個很好的態度就是將每個代碼元素像新生兒一樣命名,也許筆者有點命名偏執狂的傾向,如能榮此雅號,將深以此為幸。
對於那些讓人充滿迷茫感甚至誤導性的命名,需要果決地、大刀闊斧地整容,永遠不要手下留情!
·幫助發現隱藏的代碼缺陷
孔子說過:溫故而知新。重構代碼時逼迫你加深理解原先所寫的代碼。筆者常有寫下程序後,卻發生對自己的程序邏輯不甚理解的情景,曾為此驚悚過,後來發現這種症狀居然是許多程序員常患的感冒。當你也發生這樣的情形時,通過重構代碼可以加深對原設計的理解,發現其中的問題和隱患,構建出更好的代碼。
·從長遠來看,有助於提高編程效率
當你發現解決一個問題變得異常復雜時,往往不是問題本身造成的,而是你用錯了方法,拙劣的設計往往導致臃腫的編碼。
改善設計、提高可讀性、減少缺陷都是為了穩住陣腳。良好的設計是成功的一半,停下來通過重構改進設計,或許會在當前減緩速度,但它帶來的後發優勢卻是不可低估的。 新官上任三把火,開始一個全新??、腳不停蹄、加班加點,一支聲勢浩大的千軍萬碼夾裹著程序員激情和扣擊鍵盤的鳴金奮力前行,勢如破竹,攻城掠地,直指黃龍府。
開發經理是這支浩浩湯湯代碼隊伍的統帥,他負責這支隊伍的命運,當齊桓公站在山頂上看到管仲訓練的隊伍整齊劃一地前進時,他感嘆說我有這樣一支軍隊哪裡還怕沒有勝利呢?。但很遺憾,你手中的這支隊伍原本只是散兵游勇,在前進中招兵買馬,不斷壯大,所以隊伍變形在所難免。當開發經理發覺隊伍變形時,也許就是克制住攻克前方山頭的誘惑,停下腳步整頓隊伍的時候了。
Kent Beck提出了代碼壞味道的說法,和我們所提出的隊伍變形是同樣的意思,隊伍變形的信號是什麼呢?以下列述的代碼症狀就是隊伍變形的強烈信號:
·代碼中存在重復的代碼
中國有118 家整車生產企業,數量幾乎等於美、日、歐所有汽車廠家數之和,但是全國的年產量卻不及一個外國大汽車公司的產量。重復建設只會導致效率的低效和資源的浪費。
程序代碼更是不能搞重復建設,如果同一個類中有相同的代碼塊,請把它提煉成類的一個獨立方法,如果不同類中具有相同的代碼,請把它提煉成一個新類,永遠不要重復代碼。
·過大的類和過長的方法
過大的類往往是類抽象不合理的結果,類抽象不合理將降低了代碼的復用率。方法是類王國中的諸侯國,諸侯國太大勢必動搖中央集權。過長的方法由於包含的邏輯過於復雜,錯誤機率將直線上升,而可讀性則直線下降,類的健壯性很容易被打破。當看到一個過長的方法時,需要想辦法將其劃分為多個小方法,以便於分而治之。
·牽一毛而需要動全身的修改
當你發現修改一個小功能,或增加一個小功能時,就引發一次代碼地震,也許是你的設計抽象度不夠理想,功能代碼太過分散所引起的。
·類之間需要過多的通訊
A類需要調用B類的過多方法訪問B的內部數據,在關繫上這兩個類顯得有點狎昵,可能這兩個類本應該在一起,而不應該分家。
·過度耦合的信息鏈
計算機是這樣一門科學,它相信可以通過添加一個中間層解決任何問題,所以往往中間層會被過多地追加到程序中。如果你在代碼中看到需要獲取一個信息,需要一個類的方法調用另一個類的方法,層層掛接,就象輸油管一樣節節相連。這往往是因為銜接層太多造成的,需要查看就否有可移除的中間層,或是否可以提供更直接的調用方法。
·各立山頭幹革命
如果你發現有兩個類或兩個方法雖然命名不同但卻擁有相似或相同的功能,你會發現往往是因為開發團隊協調不夠造成的。筆者曾經寫了一個頗好用的字元串處理類,但因為沒有及時通告團隊其他人員,後來發現項目中居然有三個字元串處理類。革命資源是珍貴的,我們不應各立山頭幹革命。
·不完美的設計
在筆者剛完成的一個比對報警項目中,曾安排阿朱開發報警模塊,即通過Socket向指定的簡訊平台、語音平台及客戶端報警器插件發送報警報文信息,阿朱出色地完成了這項任務。後來用戶又提出了實時比對的需求,即要求第三方系統以報文形式向比對報警系統發送請求,比對報警系統接收並響應這個請求。這又需要用到Socket報文通訊,由於原來的設計沒有將報文通訊模塊獨立出來,所以無法復用阿朱開發的代碼。後來我及時調整了這個設計,新增了一個報文收發模塊,使系統所有的對外通訊都復用這個模塊,系統的整體設計也顯得更加合理。
每個系統都或多或少存在不完美的設計,剛開始可能注意不到,到後來才會慢慢凸顯出來,此時唯有勇於更改才是最好的出路。
·缺少必要的注釋
雖然許多軟體工程的書籍常提醒程序員需要防止過多注釋,但這個擔心好象並沒有什麼必要。往往程序員更感興趣的是功能實現而非代碼注釋,因為前者更能帶來成就感,所以代碼注釋往往不是過多而是過少,過於簡單。人的記憶曲線下降的坡度是陡得嚇人的,當過了一段時間後再回頭補注釋時,很容易發生提筆忘字,愈言且止的情形。
曾在網上看到過微軟的代碼注釋,其詳盡程度讓人嘆為觀止,也從中體悟到了微軟成功的一個經驗。 學習一種可以大幅提高生產力的新技術時,你總是難以察覺其不適用的場合。通常你在一個特定場景中學習它,這個場景往往是個項目。這種情況下你很難看出什麼會造成這種新技術成效不彰或甚至形成危害。十年前,對象技術(object tech.)的情況也是如此。那時如果有人問我「何時不要使用對象」,我很難回答。並非我認為對象十全十美、沒有局限性 — 我最反對這種盲目態度,而是盡管我知道它的好處,但確實不知道其局限性在哪兒。
現在,重構的處境也是如此。我們知道重構的好處,我們知道重構可以給我們的工作帶來垂手可得的改變。但是我們還沒有獲得足夠的經驗,我們還看不到它的局限性。
這一小節比我希望的要短。暫且如此吧。隨著更多人學會重構技巧,我們也將對??你應該嘗試一下重構,獲得它所提供的利益,但在此同時,你也應該時時監控其過程,注意尋找重構可能引入的問題。請讓我們知道你所遭遇的問題。隨著對重構的了解日益增多,我們將找出更多解決辦法,並清楚知道哪些問題是真正難以解決的。
·資料庫(Databases)
「重構」經常出問題的一個領域就是資料庫。絕大多數商用程序都與它們背後的database schema(資料庫表格結構)緊密耦合(coupled)在一起,這也是database schema如此難以修改的原因之一。另一個原因是數據遷移(migration)。就算你非常小心地將系統分層(layered),將database schema和對象模型(object model)間的依賴降至最低,但database schema的改變還是讓你不得不遷移所有數據,這可能是件漫長而煩瑣的工作。
在「非對象資料庫」(nonobject databases)中,解決這個問題的辦法之一就是:在對象模型(object model)和資料庫模型(database model)之間插入一個分隔層(separate layer),這就可以隔離兩個模型各自的變化。升級某一模型時無需同時升級另一模型,只需升級上述的分隔層即可。這樣的分隔層會增加系統復雜度,但可以給你很大的靈活度。如果你同時擁有多個資料庫,或如果資料庫模型較為復雜使你難以控制,那麼即使不進行重構,這分隔層也是很重要的。
你無需一開始就插入分隔層,可以在發現對象模型變得不穩定時再產生它。這樣你就可以為你的改變找到最好的杠桿效應。
對開發者而言,對象資料庫既有幫助也有妨礙。某些面向對象資料庫提供不同版本的對象之間的自動遷移功能,這減少了數據遷移時的工作量,但還是會損失一定時間。如果各資料庫之間的數據遷移並非自動進行,你就必須自行完成遷移工作,這個工作量可是很大的。這種情況下你必須更加留神classes內的數據結構變化。你仍然可以放心將classes的行為轉移過去,但轉移值域(field)時就必須格外小心。數據尚未被轉移前你就得先運用訪問函數(accessors)造成「數據已經轉移」的假象。一旦你確定知道「數據應該在何處」時,就可以一次性地將數據遷移過去。這時惟一需要修改的只有訪問函數(accessors),這也降低了錯誤風險。
·修改介面(Changing Interfaces)
關於對象,另一件重要事情是:它們允許你分開修改軟體模塊的實現(implementation)和介面(interface)。你可以安全地修改某對象內部而不影響他人,但對於介面要特別謹慎 — 如果介面被修改了,任何事情都有可能發生。
一直對重構帶來困擾的一件事就是:許多重構手法的確會修改介面。像Rename Method(273)這么簡單的重構手法所做的一切就是修改介面。這對極為珍貴的封裝概念會帶來什麼影響呢?
如果某個函數的所有調用動作都在你的控制之下,那麼即使修改函數名稱也不會有任何問題。哪怕面對一個public函數,只要能取得並修改其所有調用者,你也可以安心地將這個函數易名。只有當需要修改的介面系被那些「找不到,即使找到也不能修改」的代碼使用時,介面的修改才會成為問題。如果情況真是如此,我就會說:這個介面是個「已發布介面」(published interface)— 比公開介面(public interface)更進一步。介面一旦發行,你就再也無法僅僅修改調用者而能夠安全地修改介面了。你需要一個略為復雜的程序。
這個想法改變了我們的問題。如今的問題是:該如何面對那些必須修改「已發布介面」的重構手法?
簡言之,如果重構手法改變了已發布介面(published interface),你必須同時維護新舊兩個介面,直到你的所有用戶都有時間對這個變化做出反應。幸運的是這不太困難。你通常都有辦法把事情組織好,讓舊介面繼續工作。請盡量這么做:讓舊介面調用新介面。當你要修改某個函數名稱時,請留下舊函數,讓它調用新函數。千萬不要拷貝函數實現碼,那會讓你陷入「重復代碼」(plicated code)的泥淖中難以自拔。你還應該使用java提供的 deprecation(反對)設施,將舊介面標記為 deprecated。這么一來你的調用者就會注意到它了。
這個過程的一個好例子就是Java容器類(collection classes)。Java 2的新容器取代了原先一些容器。當Java 2容器發布時,JavaSoft花了很大力氣來為開發者提供一條順利遷徙之路。
「保留舊介面」的辦法通常可行,但很煩人。起碼在一段時間里你必須建造(build)並維護一些額外的函數。它們會使介面變得復雜,使介面難以使用。還好我們有另一個選擇:不要發布(publish)介面。當然我不是說要完全禁止,因為很明顯你必得發布一些介面。如果你正在建造供外部使用的APIs,像Sun所做的那樣,肯定你必得發布介面。我之所以說盡量不要發布,是因為我常常看到一些開發團隊公開了太多介面。我曾經看到一支三人團隊這么工作:每個人都向另外兩人公開發布介面。這使他們不得不經常來回維護介面,而其實他們原本可以直接進入程序庫,徑行修改自己管理的那一部分,那會輕松許多。過度強調「代碼擁有權」的團隊常常會犯這種錯誤。發布介面很有用,但也有代價。所以除非真有必要,別發布介面。這可能意味需要改變你的代碼擁有權觀念,讓每個人都可以修改別人的代碼,以運應介面的改動。以搭檔(成對)編程(Pair Programming)完成這一切通常是個好主意。
不要過早發布(published)介面。請修改你的代碼擁有權政策,使重構更順暢。
Java之中還有一個特別關於「修改介面」的問題:在throws子句中增加一個異常。這並不是對簽名式(signature)的修改,所以你無法以delegation(委託手法)隱藏它。但如果用戶代碼不作出相應修改,編譯器不會讓它通過。這個問題很難解決。你可以為這個函數選擇一個新名tion(可控式異常)轉換成一個unchecked exception(不可控異常)。你也可以拋出一個unchecked異常,不過這樣你就會失去檢驗能力。如果你那麼做,你可以警告調用者:這個unchecked異常日後會變成一個checked異常。這樣他們就有時間在自己的代碼中加上對此異常的處理。出於這個原因,我總是喜歡為整個package定義一個superclass異常(就像java.sql的SQLException),並確保所有public函數只在自己的throws子句中聲明這個異常。這樣我就可以隨心所欲地定義subclass異常,不會影響調用者,因為調用者永遠只知道那個更具一般性的superclass異常。
·難以通過重構手法完成的設計改動
通過重構,可以排除所有設計錯誤嗎?是否存在某些核心設計決策,無法以重構手法修改?在這個領域里,我們的統計數據尚不完整。當然某些情況下我們可以很有效地重構,這常常令我們倍感驚訝,但的確也有難以重構的地方。比如說在一個項目中,我們很難(但還是有可能)將「無安全需求(no security requirements)情況下構造起來的系統」重構為「安全性良好的(good security)系統」。
這種情況下我的辦法就是「先想像重構的情況」。考慮候選設計方案時,我會問自己:將某個設計重構為另一個設計的難度有多大?如果看上去很簡單,我就不必太擔心選擇是否得當,於是我就會選最簡單的設計,哪怕它不能覆蓋所有潛在需求也沒關系。但如果預先看不到簡單的重構辦法,我就會在設計上投入更多力氣。不過我發現,這種情況很少出現。
·何時不該重構?
有時候你根本不應該重構 — 例如當你應該重新編寫所有代碼的時候。有時候既有代碼實在太混亂,重構它還不如從新寫一個來得簡單。作出這種決定很困難,我承認我也沒有什麼好准則可以判斷何時應該放棄重構。
重寫(而非重構)的一個清楚訊號就是:現有代碼根本不能正常運作。你可能只是試著做點測試,然後就發現代碼中滿是錯誤,根本無法穩定運作。記住,重構之前,代碼必須起碼能夠在大部分情況下正常運作。
一個折衷辦法就是:將「大塊頭軟體」重構為「封裝良好的小型組件」。然後你就可以逐一對組件作出「重構或重建」的決定。這是一個頗具希望的辦法,但我還沒有足夠數據,所以也無法寫出優秀的指導原則。對於一個重要的古老系統,這肯定會是一個很好的方向。
另外,如果項目已近最後期限,你也應該避免重構。在此時機,從重構過程贏得的生產力只有在最後期限過後才能體現出來,而那個時候已經時不我予。Ward Cunningham對此有一個很好的看法。他把未完成的重構工作形容為「債務」。很多公司都需要借債來使自己更有效地運轉。但是借債就得付利息,過於復雜的代碼所造成的「維護和擴展的額外開銷」就是利息。你可以承受一定程度的利息,但如果利息太高你就會被壓垮。把債務管理好是很重要的,你應該隨時通過重構來償還一部分債務。
如果項目已經非常接近最後期限,你不應該再分心於重構,因為已經沒有時間了。不過多個項目經驗顯示:重構的確能夠提高生產力。如果最後你沒有足夠時間,通常就表示你其實早該進行重構。 「重構」肩負一項特別任務:它和設計彼此互補。初學編程的時候,我埋頭就寫程序,渾渾噩噩地進行開發。然而很快我便發現,「事先設計」(upfront design)可以助我節省回頭工的高昂成本。於是我很快加強這種「預先設計」風格。許多人都把設計看作軟體開發的關鍵環節,而把編程(programming)看作只是機械式的低級勞動。他們認為設計就像畫工程圖而編碼就像施工。但是你要知道,軟體和真實器械有著很大的差異。軟體的可塑性更強,而且完全是思想產品。正如Alistair Cockburn所說:『有了設計,我可以思考更快,但是其中充滿小漏洞。』
有一種觀點認為:重構可以成為「預先設計」的替代品。這意思是你根本不必做任何設計,只管按照最初想法開始編碼,讓代碼有效運作,然後再將它重構成型。事實上這種辦法真的可行。我的確看過有人這么做,最後獲得設計良好的軟體。極限編程(Extreme Programming)【Beck, XP】 的支持者極力提倡這種辦法。
盡管如上所言,只運用重構也能收到效果,但這並不是最有效的途徑。是的,即使極限編程(Extreme Programming)愛好者也會進行預先設計。他們會使用CRC卡或類似的東西來檢驗各種不同想法,然後才得到第一個可被接受的解決方案,然後才能開始編碼,然後才能重構。關鍵在於:重構改變了「預先設計」的角色。如果沒有重構,你就必須保證「預先設計」正確無誤,這個壓力太大了。這意味如果將來需要對原始設計做任何修改,代價都將非常高昂。因此你需要把更多時間和精力放在預先設計上,以避免日後修改。
如果你選擇重構,問題的重點就轉變了。你仍然做預先設計,但是不必一定找出正確的解決方案。此刻的你只需要得到一個足夠合理的解決方案就夠了。你很肯定地知道,在實現這個初始解決方案的時候,你對問題的理解也會逐漸加深,你可能會察覺最佳解決方案和你當初設想的有些不同。只要有重構這項武器在手,就不成問題,因為重構讓日後的修改成本不再高昂。
這種轉變導致一個重要結果:軟體設計朝向簡化前進了一大步。過去未曾運用重構時,我總是力求得到靈活的解決方案。任何一個需求都讓我提心吊膽地猜疑:在系統壽命期間,這個需求會導致怎樣的變化?由於變更設計的代價非常高昂,所以我希望建造一個足夠靈活、足夠強固的解決方案,希望它能承受我所能預見的所有需求變化。問題在於:要建造一個靈活的解決方案,所需的成本難以估算。靈活的解決方案比簡單的解決方案復雜許多,所以最終得到的軟體通常也會更難維護 — 雖然它在我預先設想的??方向上,你也必須理解如何修改設計。如果變化只出現在一兩個地方,那不算大問題。然而變化其實可能出現在系統各處。如果在所有可能的變化出現地點都建立起靈活性,整個系統的復雜度和維護難度都會大大提高。當然,如果最後發現所有這些靈活性都毫無必要,這才是最大的失敗。你知道,這其中肯定有些靈活性的確派不上用場,但你卻無法預測到底是哪些派不上用場。為了獲得自己想要的靈活性,你不得不加入比實際需要更多的靈活性。
有了重構,你就可以通過一條不同的途徑來應付變化帶來的風險。你仍舊需要思考潛在的變化,仍舊需要考慮靈活的解決方案。但是你不必再逐一實現這些解決方案,而是應該問問自己:『把一個簡單的解決方案重構成這個靈活的方案有多大難度?』如果答案是「相當容易」(大多數時候都如此),那麼你就只需實現目前的簡單方案就行了。
重構可以帶來更簡單的設計,同時又不損失靈活性,這也降低了設計過程的難度,減輕了設計壓力。一旦對重構帶來的簡單性有更多感受,你甚至可以不必再預先思考前述所謂的靈活方案 — 一旦需要它,你總有足夠的信心去重構。是的,當下只管建造可運行的最簡化系統,至於靈活而復雜的設計,唔,多數時候你都不會需要它。
勞而無獲— Ron Jeffries
Chrysler Comprehensive Compensation(克萊斯勒綜合薪資系統)的支付過程太慢了。雖然我們的開發還沒結束,這個問題卻已經開始困擾我們,因為它已經拖累了測試速度。
Kent Beck、Martin Fowler和我決定解決這個問題。等待大夥兒會合的時間里,憑著我對這個系統的全盤了解,我開始推測:到底是什麼讓系統變慢了?我想到數種可能,然後和夥伴們談了幾種可能的修改方案。最後,關於「如何讓這個系統運行更快」,我們提出了一些真正的好點子。
然後,我們拿Kent的量測工具度量了系統性能。我一開始所想的可能性竟然全都不是問題肇因。我們發現:系統把一半時間用來創建「日期」實體(instance)。更有趣的是,所有這些實體都有相同的值。
於是我們觀察日期的創建邏輯,發現有機會將它優化。日期原本是由字元串轉換而生,即使無外部輸入也是如此。之所以使用字元串轉換方式,完全是為了方便鍵盤輸入。好,也許我們可以將它優化。
於是我們觀察日期怎樣被這個程序運用。我們發現,很多日期對象都被用來產生「日期區間」實體(instance)。「日期區間」是個對象,由一個起始日期和一個結束日期組成。仔細追蹤下去,我們發現絕大多數日期區間是空的!
處理日期區間時我們遵循這樣一個規則:如果結束日期在起始日期之前,這個日期區間就該是空的。這是一條很好的規則,完全符合這個class的需要。採用此一規則後不久,我們意識到,創建一個「起始日期在結束日期之後」的日期區間,仍然不算是清晰的代碼,於是我們把這個行為提煉到一個factory method(譯註:一個著名的設計模式,見《Design Patterns》),由它專門創建「空的日期區間」。
我們做了上述修改,使代碼更加清晰,卻意外得到了一個驚喜。我們創建一個固定不變的「空日期區間」對象,並讓上述調整後的factory method每次都返回該對象,而不再每次都創建新對象。這一修改把系統速度提升了幾乎一倍,足以讓測試速度達到可接受程度。這只花了我們大約五分鍾。
我和團隊成員(Kent和Martin謝絕參加)認真推測過:我們瞭若指掌的這個程序中可能有什麼錯誤?我們甚至憑空做了些改進設計,卻沒有先對系統的真實情況進行量測。
我們完全錯了。除了一場很有趣的交談,我們什麼好事都沒做。
教訓:哪怕你完全了解系統,也請實際量測它的性能,不要臆測。臆測會讓你學到一些東西,但十有八九你是錯的。

⑧ 軟體開發方法

1:瀑布方法
所有軟體方法的祖先是瀑布方法(waterfall methodology)。它之所以被稱為瀑布方法是因為開發模塊相互之間的依次流動,瀑布方法通過控制閥門的一系列活動組成。這些控制閥門決定一個給定的活動是否已經完成並且可以進入下一個活動。需求階段處理決定了所有的軟體需求。設計階段決定整個系統的設計。代碼在代碼階段編寫。代碼然後被測試。最後產品被發布。
對瀑布方法模型最基本的批評就是瀑布方法對於反饋事物發展狀況耗時太長。軟體的一些內容那個很容易被理解,而另一些內容則相反。因此,當用戶對於手邊出現的問題都沒有很好理解的時候,開發人員試圖先完成所有的需求(也就是說,將需求量化到實際的規格說明當中)是非常空難的。更進一步來說,如果在需求中出現一個錯誤,它將傳播到設計階段,傳播到代碼中等。同時一般不存在過程中返回的真正能力。因此,如果進入測試並且發現設計的一部分是無法工作的,那麼就會進行修改並修補問題而交差,但是這種方法將會失去設計活動的所有上下文環境——你只是有目的地對系統權宜行事!
認識到這個問題後瀑布方法已經被修改成幾種形式。例如螺旋式瀑布方法它繼承並使用了多個瀑布模型。這種方法縮短了生命周期向下的時間;也就是說,為解決為題提供了迭代方案。
最終,大家無法脫離瀑布方法是因為它確實是合乎常規的方法。首先,這種方法可以決定將要構建的內容。接著,決定將要如何構建這些,下一步,世界構建這些內容。可以確保自己確實構建自己所需的東西(並且可以成功運行)。
2:統一過程
統一過程應用了基於處理系統首先考慮的最重要方面而實施的短期迭代開發。
開發一個寡慾各種用列(use case)的調查文檔(也就是說,對用戶與系統交互的簡短描述),並且開始排除那些可能對整個系統成功造成風險的用列。只要適合,就可以在開發過程中添加或者刪除用列。
統一過程的4個階段定義如下:
初始(inception):系統仍然處於決定系統內容的階段——系統將要完成什麼以及系統的邊界是什麼。如果系統能夠很好的理解,那麼這個階段就非常短。
細化(Elaboration):正在將體系結構的風險移至系統。一種表述該階段的說法是,「你是否已經解決了所有難題?」或者「你知道如何完成你將要去完成的事情嗎?」
構造(Construction)正在完成所有相關的用列來使系統為移交做好准備,也就是說,進入Beta版本。
移交(Transition)使系統通過它的最後發布階段以及Beta版本。它可能包括軟體的操作及維護。
這是一個關注於維護要素的敏捷過程,但是仍然採用了大量用例開發,間模等方面的傳統實踐。
3:極限編程:
極限編程的開發過程就是以代碼為中心的方法。
讓用戶告知你一些有關系統是如何如用轉的故事描述,基於故事相互之間的重要性來定製這些系統這樣就可以為自己的團隊提供一個故事集合,可以在一個給定的迭代中完成他們,大約兩周時間——每周工作40個小時,你將團隊劃分,雙人應付沒一個故事,在代碼被編寫時提供確定數量的內建對等評審。你和你的同伴在編寫自己代碼的同時編寫單元測試。在完成自己負責的那段代碼後,將其拿到集成的機器上,放入代碼基線,運行從所有人的代碼中積累而成的單元測試。在完成iji負責的那段代碼後,將會提供一個運行系統使用戶可以評審來確保自己的工作滿足他們的需要。
注意極限編程並沒有將軟體的設計設置成一個高級階段。相反它認為那些最前端的設計對於整個系統開發不是很有幫助,並且隨著實際開發的進行它最終還是被修改。
極限編程對於需要持續提供運行系統的軟體卡發來說非常適用。當缺少用戶介入或者項目規模很大時極限編程方法將會不好用,因為這時協調和設計活動實際上變得更重要了。
極限編程合理地考慮開發團體的能力,這樣可以有效計劃。

⑨ 什麼是極限編程

極限編程(Extreme Programming,XP)是一門針對業務和軟體開發的規則,它的作用在於將兩者的力量集中在共同的、可以達到的目標上。它是以符合客戶需要的軟體為目標而產生的一種方法論,XP使開發者能夠更有效的響應客戶的需求變化,哪怕是在軟體生命周期的後期。它強調,軟體開發是人與人合作進行的過程,因此成功的軟體開發過程應該充分利用人的優勢,而弱化人的缺點,突出了人在軟體開發過程中的作用。極端編程屬於輕量級的方法,認為文檔、架構不如直接編程來的直接。

⑩ 什麼極限編程

ExtremeProgramming(極限編程,簡稱XP)是由KentBeck在1996年提出的。KentBeck在九十年代初期與WardCunningham共事時,就一直共同探索著新的軟體開發方法,希望能使軟體開發更加簡單而有效。Kent仔細地觀察和分析了各種簡化軟體開發的前提條件、可能行以及面臨的困難。1996年三月,Kent終於在為DaimlerChrysler所做的一個項目中引入了新的軟體開發觀念——XP。
XP是一個輕量級的、靈巧的軟體開發方法;同時它也是一個非常嚴謹和周密的方法。它的基礎和價值觀是交流、樸素、反饋和勇氣;即,任何一個軟體項目都可以從四個方面入手進行改善:加強交流;從簡單做起;尋求反饋;勇於實事求是。XP是一種近螺旋式的開發方法,它將復雜的開發過程分解為一個個相對比較簡單的小周期;通過積極的交流、反饋以及其它一系列的方法,開發人員和客戶可以非常清楚開發進度、變化、待解決的問題和潛在的困難等,並根據實際情況及時地調整開發過程。
什麼是軟體開發

軟體開發的內容是:需求、設計、編程和測試!

需求:不僅僅是用戶需求,應該是開發中遇到的所有的需求。比如,你首先要知道做這個項目是為了解決什麼問題;測試案例中應該輸入什麼數據……為了清楚地知道這些需求,你經常要和客戶、項目經理等交流。

設計:編碼前,肯定有個計劃告訴你要做什麼,結構是怎樣等等。你一定要按照這個來做,否則可能會一團糟。

編程:如果在項目截止日,你的程序不能跑起來或達不到客戶的要求,你就拿不到錢。

測試:目的是讓你知道,什麼時候算是完成了。如果你聰明,你就應該先寫測試,這樣可以及時知道你是否真地完成了。否則,你經常會不知道,到底有哪些功能是真正完成了,離預期目標還差多遠。

軟體開發中,客戶和開發人員都有自己的基本權利和義務。
客戶:
定義每個用戶需求的商業優先順序;
制訂總體計劃,包括用多少投資、經過多長時間、達到什麼目的;
在項目開發過程中的每個工作周,都能讓投資獲得最大的收益;
通過重復運行你所指定的功能測試,准確地掌握項目進展情況;
能隨時改變需求、功能或優先順序,同時避免昂貴的再投資;能夠根據各種變化及時調整項目計劃;
能夠隨時取消項目;項目取消時,以前的開發工作不是一堆垃圾,已開發完的功能是合乎要求的,正在進行或未完成的的工作則應該是不難接手的。

開發人員:
知道要做什麼,以及要優先做什麼;
工作有效率;
有問題或困難時,能得到客戶、同事、上級的回答或幫助;
對工作做評估,並根據周圍情況的變化及時重新評估;
積極承擔工作,而不是消極接受分配;
一周40小時工作制,不加班。

這就是軟體開發,除此之外再還有其它要關心的問題!

靈巧的輕量級軟體開發方法

一套軟體開發方法是由一系列與開發相關的規則、規范和慣例。重量級的開發方法嚴格定義了許多的規則、流程和相關的文檔工作。靈巧的輕量級開發方法,其規則和文檔相對較少,流程更加靈活,實施起來相對較容易。

在軟體工程概念出現以前,程序員們按照自己喜歡的方式開發軟體。程序的質量很難控制,調試程序很繁瑣,程序員之間也很難讀懂對方寫的代碼。1968年,EdsgerDijkstra給CACM寫了一封題為的信,軟體工程的概念由此誕生。程序員們開始摒棄以前的做法,轉而使用更系統、更嚴格的開發方法。為了使控制軟體開發和控制其它產品生產一樣嚴格,人們陸續制定了很多規則和做法,發明了很多軟體工程方法,軟體質量開始得到大幅度提高。隨著遇到的問題更多,規則和流程也越來越精細和復雜。

到了今天,在實際開發過程中,很多規則已經難於遵循,很多流程復雜而難於理解,很多項目中文檔的製作過程正在失去控制。人們試圖提出更全面更好的一攬子方案,或者寄希望於更復雜的、功能更強大的輔助開發工具(CaseTools),但總是不能成功,而且開發規范和流程變得越來越復雜和難以實施。

為了趕進度,程序員們經常跳過一些指定的流程,很少人能全面遵循那些重量級開發方法。

失敗的原因很簡單,這個世界沒有萬能葯。因此,一些人提出,將重量級開發方法中的規則和流程進行刪減、重整和優化,這樣就產生了很多適應不同需要的輕量級流程。在這些流程中,合乎實際需要的規則被保留下來,不必要的復雜化開發的規被拋棄。而且,和傳統的開發方法相比,輕量級流程不再象流水生產線,而是更加靈活。

ExtremeProgramming(XP)就是這樣一種靈巧的輕量級軟體開發方法。

為什麼稱為「Extreme」(極限)

「Extreme」(極限)是指,對比傳統的項目開發方式,XP強調把它列出的每個方法和思想做到極限、做到最好;其它XP所不提倡的,則一概忽略(如開發前期的整體設計等)。一個嚴格實施XP的項目,其開發過程應該是平穩的、高效的和快速的,能夠做到一周40小時工作制而不拖延項目進度。

XP的軟體開發是什麼樣

1極限的工作環境

為了在軟體開發過程中最大程度地實現和滿足客戶和開發人員的基本權利和義務,XP要求把工作環境也做得最好。每個參加項目開發的人都將擔任一個角色(項目經理、項目監督人等等)並履行相應的權利和義務。所有的人都在同一個開放的開發環境中工作,最好是所有人在同一個大房子中工作,還有茶點供應;每周40小時,不提倡加班;每天早晨,所有人一起站著開個短會;牆上有一些大白板,所有的Story卡、CRC卡等都貼在上面,討論問題的時候可以在上面寫寫畫畫;下班後大家可以一起玩電腦游戲……。

2極限的需求

客戶應該是項目開發隊伍中的一員,而不是和開發人員分開的;因為從項目的計劃到最後驗收,客戶一直起著很重要的作用。開發人員和客戶一起,把各種需求變成一個個小的需求模塊(UserStory),例如「計算年級的總人數,就是把該年級所有班的人數累加。」;這些模塊又會根據實際情況被組合在一起或者被分解成更小的模塊;它們都被記錄在一些小卡片(StoryCard)上,之後分別被程序員們在各個小的周期開發中(Iteration,通常不超過3個星期)實現;客戶根據每個模塊的商業價值來指定它們的優先順序;開發人員要做的是確定每個需求模塊的開發風險,風險高的(通常是因為缺乏類似的經驗)需求模塊將被優先研究、探索和開發;經過開發人員和客戶分別從不同的角度評估每個模塊後,它們被安排在不同的開發周期里,客戶將得到一個盡可能准確的開發計劃;客戶為每個需求模塊指定驗收測試(功能測試)。

每發布一次開發的軟體(經過一個開發周期),用戶都能得到一個可以開始使用的系統,這個系統全面實現了相應的計劃中的所有需求。而在一些傳統的開發模式中,無論什麼功能,用戶都要等到所有開發完成後才能開始使用。

3極限的設計

從具體開發的角度來看,XP內層的過程是一個個基於測試驅動的開發(TestDrivenDevelopment)周期,諸如計劃和設計等外層的過程都是圍繞這些展開的。每個開發周期都有很多相應的單元測試(UnitTest)。剛開始,因為什麼都沒有實現,所以所有的單元測試都是失敗的;隨著一個個小的需求模塊的完成,通過的單元測試也越來越多。通過這種方式,客戶和開發人員都很容易檢驗,是否履行了對客戶的承諾。XP提倡對於簡單的設計(SimpleDesign),就是用最簡單的方式,使得為每個簡單的需求寫出來的程序可以通過所有相關的單元測試。XP強調拋棄那種一攬子詳細設計方式(BigDesignUpFront),因為這種設計中有很多內容是你現在或最近都根本不需要的。XP還大力提倡設計復核(Review)、代碼復核以及重整和優化(Refectory),所有的這些過程其實也是優化設計的過程;在這些過程中不斷運行單元測試和功能測試,可以保證經過重整和優化後的系統仍然符合所有需求。

4極限的編程

既然編程很重要,XP就提倡兩個人一起寫同一段程序(PairProgramming),而且代碼所有權是歸於整個開發隊伍(CollectiveCodeOwnership)。程序員在寫程序和重整優化程序的時候,都要嚴格遵守編程規范。任何人都可以修改其他人寫的程序,修改後要確定新程序能通過單元測試。

5極限的測試

既然測試很重要,XP就提倡在開始寫程序之前先寫單元測試。開發人員應該經常把開發好的模塊整合到一起(ContinuousIntegration),每次整合後都要運行單元測試;做任何的代碼復核和修改,都要運行單元測試;發現了BUG,就要增加相應的測試(因此XP方法不需要BUG資料庫)。除了單元測試之外,還有整合測試,功能測試、負荷測試和系統測試等。所有這些測試,是XP開發過程中最重要的文檔之一,也是最終交付給用戶的內容之一。

XP中的重要慣例和規則

1項目開發小組(Team)

在XP中,每個對項目做貢獻的人都應該是項目開發小組中的一員。而且,這個小組中必須至少有一個人對用戶需求非常清晰,能夠提出需求、決定各個需求的商業價值(優先順序)、根據需求等的變化調整項目計劃等。這個人扮演的是「客戶」這個角色,當然最好就是實際的最終用戶,因為整個項目就是圍繞最終用戶的需求而展開的。程序員是項目開發小組中必不可少的成員。小組中可以有測試員,他們幫助客戶制訂驗收測試;有分析員,幫助客戶確定需求;通常還有個Coach(教練),負責跟蹤開發進度、解決開發中遇到的一些問題、推動項目進行;還可以又一個項目經理,負責調配資源、協助項目內外的交流溝通等等。項目小組中有這么多角色,但並不是說,每個人做的工作是別人不能插手或干預的,XP鼓勵每個人盡可能地為項目多做貢獻。平等相處,取長補短;這就是最好的XP開發小組。

2計劃項目(PlanningGame)、驗收測試、小規模發布(SmallReleases)

XP開發小組使用簡單的方式進行項目計劃和開發跟蹤,並以次預測項目進展情況和決定未來的步驟。根據需求的商業價值,開發小組針對一組組的需求進行一系列的開發和整合,每次開發都會產生一個通過測試的、可以使用的系統。

計劃項目

XP的計劃過程主要針對軟體開發中的兩個問題:預測在交付日期前可以完成多少工作;現在和下一步該做些什麼。不斷的回答這兩個問題,就是直接服務於如何實施及調整開發過程;與此相比,希望一開始就精確定義整個開發過程要做什麼事情以及每件事情要花多少時間,則事倍功半。針對這兩個問題,XP中又兩個主要的相應過程:

軟體發布計劃(ReleasePlanning)。客戶闡述需求,開發人員估算開發成本和風險。客戶根據開發成本、風險和每個需求的重要性,制訂一個大致的項目計劃。最初的項目計劃沒有必要(也沒有可能)非常准確,因為每個需求的開發成本、風險及其重要性都不是一成不變的。而且,這個計劃會在實施過程中被不斷地調整以趨精確。

周期開發計劃(IterationPlanning)。開發過程中,應該有很多階段計劃(比如每三個星期一個計劃)。開發人員可能在某個周期對系統進行內部的重整和優化(代碼和設計),而在某個周期增加了新功能,或者會在一個周期內同時做兩方面的工作。但是,經過每個開發周期,用戶都應該能得到一個已經實現了一些功能的系統。而且,每經過一個周期,客戶就會再提出確定下一個周期要完成的需求。在每個開發周期中,開發人員會把需求分解成一個個很小的任務,然後估計每個任務的開發成本和風險。這些估算是基於實際開發經驗的,項目做得多了,估算自然更加准確和精確;在同一個項目中,每經過一個開發周期,下一次的估算都會有更過的經驗、參照和依據,從而更加准確。這些簡單的步驟對客戶提供了豐富的、足夠的信息,使之能靈活有效地調控開發進程。每過兩三個星期,客戶總能夠實實在在地看到開發人員已經完成的需求。在XP里,沒有什麼「快要完成了」、「完成了90%」的模糊說法,要不是完成了,要不就是沒完成。這種做法看起來好象有利有弊:好處是客戶可以馬上知道完成了哪些、做出來的東西是否合用、下面還要做些什麼或改進什麼等等;壞處是客戶看到做出來的東西,可能會很不滿意甚至中止合同。實際上,XP的這種做法是為了及早發現問題、解決問題,而不是等到過了幾個月,用戶終於看到開發完的系統了,然後才告訴你這個不行、那個變了、還要增加
哪個內容等等。

驗收測試

客戶對每個需求都定義了一些驗收測試。通過運行驗收測試,開發人員和客戶可以知道開發出來的軟體是否符合要求。XP開發人員把這些驗收測試看得和單元測試一樣重要。為了不浪費寶貴的時間,最好能將這些測試過程自動化。

頻繁地小規模發布軟體(SmallReleases)

每個周期(Iteration)開發的需求都是用戶最需要的東西。在XP中,對於每個周期完成時發布的系統,用戶都應該可以很容易地進行評估,或者已經能夠投入實際使用。這樣,軟體開發對於客戶來說,不再是看不見摸不著的東西,而是實實在在的。XP要求頻繁地發布軟體,如果有可能,應該每天都發布一個新版本;而且在完成任何一個改動、整合或者新需求後,就應該立即發布一個新版本。這些版本的一致性和可靠性,是靠驗收測試和測試驅動的開發來保證的。

3簡單設計,PairProgramming,測試驅動開發,重整和優化

XP程序員不但做為一個開發小組共同工作,還以兩個人為一個小開發單元編寫同一個程序。開發人員們進行簡單的設計,編寫單元測試後再編寫符合測試要求的代碼,並在滿足需求的前提下不斷地優化設計。

簡單設計

XP中讓初學者感到最困惑的就是這點。XP要求用最簡單的辦法實現每個小需求,前提是按照這些簡單設計開發出來的軟體必須通過測試。這些設計只要能滿足系統和客戶在當下的需求就可以了,不需要任何畫蛇添足的設計,而且所有這些設計都將在後續的開發過程中就被不斷地重整和優化。

在XP中,沒有那種傳統開發模式中一次性的、針對所有需求的總體設計。在XP中,設計過程幾乎一直貫穿著整個項目開發:從制訂項目的計劃,到制訂每個開發周期(Iteration)的計劃,到針對每個需求模塊的簡捷設計,到設計的復核,以及一直不間斷的設計重整和優化。整個設計過程是個螺旋式的、不斷前進和發展的過程。從這個角度看,XP是把設計做到了極致。

PairProgramming

XP中,所有的代碼都是由兩個程序員在同一台機器上一起寫的——這是XP中讓人爭議最多、也是最難實施的一點。這保證了所有的代碼、設計和單元測試至少被另一個人復核過,代碼、設計和測試的質量因此得到提高。看起來這樣象是在浪費人力資源,但是各種研究表明事實恰恰相反。——這種工作方式極大地提高了工作強度和工作效率。

很多程序員一開始是被迫嘗試這點的(XP也需要行政命令的支持)。開始時總是不習慣的,而且兩個人的效率不會比一個人的效率高。這種做法的效果往往要堅持幾個星期或一兩個月後才能很顯著。據統計,在所有剛開始PairProgramming的程序員中,90%的人在兩個月以後都很認為這種工作方式更加高效。

項目開發中,每個人會不斷地更換合作編程的夥伴。因此,PairProgramming不但提高了軟體質量,還增強了相互之間的知識交流和更新,增強了相互之間的溝通和理解。這不但有利於個人,也有利於整個項目、開發隊伍和公司。從這點看,PairProgramming不僅僅適用於XP,也適用於所有其它的軟體開發方法。

測試驅動開發

反饋是XP的四個基本的價值觀之一——在軟體開發中,只有通過充分的測試才能獲得充分的反饋。XP中提出的測試,在其它軟體開發方法中都可以見到,比如功能測試、單元測試、系統測試和負荷測試等;與眾不同的是,XP將測試結合到它獨特的螺旋式增量型開發過程中,測試隨著項目的進展而不斷積累。另外,由於強調整個開發小組擁有代碼,測試也是由大家共同維護的。即,任何人在往代碼庫中放程序(CheckIn)前,都應該運行一遍所有的測試;任何人如果發現了一個BUG,都應該立即為這個BUG增加一個測試,而不是等待寫那個程序的人來完成;任何人接手其他人的任務,或者修改其他人的代碼和設計,改動完以後如果能通過所有測試,就證明他的工作沒有破壞願系統。這樣,測試才能真正起到幫助獲得反饋的作用;而且,通過不斷地優先編寫和累積,測試應該可以基本覆蓋全部的客戶和開發需求,因此開發人員和客戶可以得到盡可能充足的反饋。

重整和優化(Refactoring)

XP強調簡單的設計,但簡單的設計並不是沒有設計的流水帳式的程序,也不是沒有結構、缺乏重用性的程序設計。開發人員雖然對每個USERSTORY都進行簡單設計,但同時也在不斷地對設計進行改進,這個過程叫設計的重整和優化(Refactoring)。這個名字最早出現在MartinFowler寫的《Refactoring:》這本書中。

Refactoring主要是努力減少程序和設計中重復出現的部分,增強程序和設計的可重用性。Refactoring的概念並不是XP首創的,它已經被提出了近30年了,而且一直被認為是高質量的代碼的特點之一。但XP強調,把Refactoring做到極致,應該隨時隨地、盡可能地進行Refactoring,只要有可能,程序員都不應該心疼以前寫的程序,而要毫不留情地改進程序。當然,每次改動後,程序員都應該運行測試程序,保證新系統仍然符合預定的要求。

4頻繁地整合,集體擁有代碼(CollectiveCodeOwnership),編程規范

XP開發小組經常整合不同的模塊。為了提高軟體質量,除了測試驅動開發和PairProgramming以外,XP要求每個人的代碼都要遵守編程規范,任何人都可以修改其他人寫的代碼,而且所有人都應該主動檢查其他人寫的代碼。

頻繁地整合(Integration)

在很多項目中,開發人員往往很遲才把各個模塊整合在一起。在這些項目中,開發人員經常在整合過程中發現很多問題,但不能肯定到底是誰的程序出了問題;而且,只有整合完成後,開發人員才開始稍稍使用整個系統,然後就馬上交付給客戶驗收。對於客戶來說,即使這些系統能夠通過終驗收測試,因為使用時間短,客戶門心裡並沒有多少把握。

為了解決這些問題,XP提出,整個項目過程中,應該頻繁地,盡可能地整合已經開發完的USERSTORY(每次整合一個新的USERSTORY)。每次整合,都要運行相應的單元測試和驗收測試,保證符合客戶和開發的要求。整合後,就發布一個新的應用系統。這樣,整個項目開發過程中,幾乎每隔一兩天,都會發布一個新系統,有時甚至會一天發布好幾個版本。通過這個過程,客戶能非常清楚地掌握已經完成的功能和開發進度,並基於這些情況和開發人員進行有效地、及時地交流,以確保項目順利完成。

集體擁有代碼(CollectiveCodeOwnership)

在很多項目開發過程中,開發人員只維護自己的代碼,而且很多人不喜歡其他人隨意修改自己的代碼。因此,即使可能有相應的比較詳細的開發文檔,但一個程序員卻很少、也不太願意去讀其他程序員的代碼;而且,因為不清楚其他人的程序到底實現了什麼功能,一個程序員一般也不敢隨便改動其他人的代碼。同時,因為是自己維護自己的代碼,可能因為時間緊張或技術水平的局限性,某些問題一直不能被發現或得到比較好的解決。針對這點,XP提倡大家共同擁有代碼,每個人都有權利和義務閱讀其他代碼,發現和糾正錯誤,重整和優化代碼。這樣,這些代碼就不僅僅是一兩個人寫的,而是由整個項目開發隊伍共同完成的,錯誤會減少很多,重用性會盡可能地得到提高,代碼質量是非常好。

為了防止修改其他人的代碼而引起系統崩潰,每個人在修改後都應該運行測試程序。(從這點,我們可以再次看到,XP的各個慣例和規則是怎樣有機地結合在一起的。)

編程規范

XP開發小組中的所有人都遵循一個統一的編程標准,因此,所有的代碼看起來好像是一個人寫的。因為有了統一的編程規范,每個程序員更加容易讀懂其他人寫的代碼,這是是實現CollectiveCodeOwnership的重要前提之一。

5Metaphor(系統比喻),不加班

XP過程通過使用一些形象的比喻讓所有人對系統有個共同的、簡潔的認識。XP認為加班是不正常的,因為這說明關於項目進度的估計和安排有問題。

Metaphor(系統比喻)

為了幫助每個人一致清楚地理解要完成的客戶需求、要開發的系統功能,XP開發小組用很多形象的比喻來描述系統或功能模塊是怎樣工作的。比如,對於一個搜索引擎,它的Metaphor可能就是「一大群蜘蛛,在網上四處尋找要捕捉的東西,然後把東西帶回巢穴。」

不加班

大量的加班意味著原來的計劃是不準確的,或者是程序遠不清楚自己到底什麼時候能完成什麼工作。而且,開發管理人員和客戶也因此無法准確掌握開發速度;開發人員也因此非常疲勞。XP認為,如果出現大量的加班現象,開發管理人員(比如Coach)應該和客戶一起確定加班的原因,並及時調整項目計劃、進度和資源。

XP中一些基本概念的簡介

UserStory:開發人員要求客戶把所有的需求寫成一個個獨立的小故事,每個只需要幾天時間就可以完成。開發過程中,客戶可以隨時提出新的UserStory,或者更改以前的UserStory。

StoryEstimates和開發速度:開發小組對每個UserStory進行估算,並根據每個開發周期(Iteration)中的實際情況反復計算開發速度。這樣,開發人員和客戶能知道每個星期到底能開發多少UserStory。

ReleasePlan和ReleaseScope:整個開發過程中,開發人員將不斷地發布新版本。開發人員和客戶一起確定每個發布所包含的UserStory。

Iteration(開發周期)和IterationPlan:在一個Release過程中,開發人員要求客戶選擇最有價值的UserStory作為未來一兩個星期的開發內容。

TheSeed:第一個開發周期(Iteration)完成後,提交給客戶的系統。雖然這不是最終的產品,但它已經實現了幾個客戶認為是最重要的Story,開發人員將逐步在其基礎上增加新的模塊。

ContinuousIntegration(整合):把開發完的UserStory的模塊一個個拼裝起來,一步步接近乃至最終完成最終產品。

驗收測試(功能測試):對於每個UserStory,客戶將定義一些測試案例,開發人員將使運行這些測試案例的過程自動化。

UnitTest(單元測試):在開始寫程序前,程序員針對大部分類的方法,先寫出相應的測試程序。

Refactoring(重整和優化):去掉代碼中的冗餘部分,增加代碼的可重用性和伸縮性。

小結

XP的一個成功因素是重視客戶的反饋——開發的目的就是為了滿足客戶的需要。XP方法使開發人員始終都能自信地面對客戶需求的變化。XP強調團隊合作,經理、客戶和開發人員都是開發團隊中的一員。團隊通過相互之間的充分交流和合作,使用XP這種簡單但有效的方式,努力開發出高質量的軟體。XP的設計簡單而高效;程序員們通過測試獲得客戶反饋,並根據變化修改代碼和設計,他們總是爭取盡可能早地將軟體交付給客戶。XP程序員能夠勇於面對需求和技術上的變化。

XP很象一個由很多小塊拼起來的智力拚圖,單獨看每一小塊都沒有什麼意義,但拼裝好後,一幅美麗的圖畫就會呈現在你面前。

閱讀全文

與極限編程只考慮當前的需求相關的資料

熱點內容
軍營訓練不聽教官的命令 瀏覽:258
v開頭的音樂播放器是什麼APP 瀏覽:117
單片機是怎麼做出來的 瀏覽:315
博圖怎麼作為opc伺服器 瀏覽:100
編譯做題軟體 瀏覽:293
橋梁檢測pdf 瀏覽:685
化解壓力的一種方法 瀏覽:680
路由器和DSN伺服器有什麼區別 瀏覽:547
android伸縮控制項 瀏覽:851
androidm3u8緩存 瀏覽:234
imphp開源知乎 瀏覽:706
清除網路通配符dos命令 瀏覽:837
鴻蒙系統怎麼快速換回安卓 瀏覽:712
pdf綠色虛擬列印機 瀏覽:213
androidtab框架 瀏覽:147
java轉php的時間戳 瀏覽:640
編譯libstdc依賴 瀏覽:659
清演算法人與原法人的區別 瀏覽:411
家庭裝修下載什麼app軟體 瀏覽:576
美食博主用什麼app拍視頻 瀏覽:817