軟件工程導(dǎo)論 張海藩

1、軟件危機的典型表現(xiàn)
(1)對軟件開發(fā)成本和進度的估計常常很不準(zhǔn)確
(2)經(jīng)常出現(xiàn)用戶對“已完成的”軟件產(chǎn)品不滿意的情況
(3)軟件產(chǎn)品的質(zhì)量往往達(dá)不到要求
(4)軟件通常是很難維護的
(5)軟件往往沒有適當(dāng)?shù)奈臋n資料
(6)軟件成本在計算機系統(tǒng)總成本種所占比例逐年上升
(7)軟件開發(fā)生產(chǎn)率提高的速度遠(yuǎn)遠(yuǎn)不能滿足社會對軟件產(chǎn)品日益增長的需求
2、消除軟件危機的途徑
(1)對計算機軟件有一個正確的認(rèn)識,軟件≠程序
(2)必須充分認(rèn)識到軟件開發(fā)不是某種個體勞動的神秘技巧,而應(yīng)該是一種組織良好、管理嚴(yán)密、各類人員協(xié)同配合、共同完成的工程項目。
?
(3)推廣使用在實踐中總結(jié)出來的開發(fā)軟件的成功的技術(shù)和方法
(4)應(yīng)該開發(fā)和使用更好的軟件工具即技術(shù)措施,組織管理措施
?
3、瀑布模型
適用范圍:需求明確,小規(guī)模軟件開發(fā)傳統(tǒng)軟件工程方法學(xué)的軟件過程基本上可以用瀑布模型來描述
優(yōu)點:強迫開發(fā)人員采用規(guī)范的技術(shù)方法;嚴(yán)格地規(guī)定了每個階段必須提交的文檔;每個階段結(jié)束前必須正式進行嚴(yán)格的技術(shù)審查和管理復(fù)查。
缺點:開發(fā)人員和用戶之間缺乏有效的溝通,很可能導(dǎo)致最終開發(fā)出來的軟件產(chǎn)品不能真正滿足用戶的需求。
?
4、快速原型模型
適用范圍:需求不明確的
所謂快速原型模型是快速建立起來的、可在計算機上運行得程序,它所能完成的功能往往是最終的軟件產(chǎn)品所能完成功能的子集。原型是軟件開發(fā)人員與用戶溝通的強有力工具,因此有助于所開發(fā)出的軟件產(chǎn)品滿足用戶的真實需求。
優(yōu)點:使用這種軟件過程開發(fā)出的軟件產(chǎn)品通常能滿足用戶的真實需求;軟件產(chǎn)品的開發(fā)過程基本上是線性順序過程。
缺點:這樣開發(fā)出來的系統(tǒng),往往可能因為折中而采取不合適的操作系統(tǒng)或程序設(shè)計語言。
5、增量模型
適用范圍:進行已有產(chǎn)品升級或新版本開發(fā);對完成期限嚴(yán)格要求的產(chǎn)品;對所開發(fā)的領(lǐng)域比較熟悉而且已有原型系統(tǒng)。
增量模型也稱為漸增模型,使用增量模型開發(fā)軟件時,把軟件產(chǎn)品作為一系列增量構(gòu)件來設(shè)計、編碼、集成和測試。每個構(gòu)件由若干個相互協(xié)作的模塊構(gòu)成,并且能夠完成相對獨立的功能。
優(yōu)點:能在較短時間內(nèi)向用戶提交可完成部分工作的產(chǎn)品;逐步增加產(chǎn)品功能,從而使用戶有較充裕的時間學(xué)習(xí)和適應(yīng)新產(chǎn)品,減少一個全新的軟件給用戶所帶來的沖擊。
缺點:集成困難,軟件結(jié)構(gòu)開放不好設(shè)計。
6、螺旋模型
適用范圍:內(nèi)部開發(fā)的大型軟件項目
把它看作在每個階段之前都增加了風(fēng)險分析過程的快速原型模型,是一種風(fēng)險驅(qū)動的迭代式開發(fā)過程。具體為不斷重復(fù)生命周期模型,并在每個生命周期結(jié)構(gòu)后,向用戶提交一個可運行的軟件產(chǎn)品版本。
優(yōu)點:有利于已有軟件得重用;有助于把軟件質(zhì)量作為軟件開發(fā)的一個重要目標(biāo);減少了過多測試或測試不足所帶來的風(fēng)險;軟件維護與軟件開發(fā)沒有本質(zhì)區(qū)別。
缺點:需要相當(dāng)?shù)娘L(fēng)險分析評估的專門技術(shù),且成功依賴于這種技術(shù)。很明顯一個大的沒有被發(fā)現(xiàn)的風(fēng)險問題,將會導(dǎo)致問題的發(fā)生,可能導(dǎo)致煙花的方向失去控制。這種模型相對比較新,應(yīng)用不廣泛,其功效需要進一步驗證。
7、Rational 統(tǒng)一過程
適用范圍:大型的需求不斷變化的復(fù)雜軟件系統(tǒng)項目
優(yōu)點:提高了團隊生產(chǎn)力,在迭代的開發(fā)過程、需求管理、基于組建的體系結(jié)構(gòu)、可視化軟件建模、驗證軟件質(zhì)量及控制軟件變更等方面、針對所有關(guān)鍵的開發(fā)活動為每個開發(fā)成員提供了必要的準(zhǔn)則、模板和工具指導(dǎo),并確保全體成員共享相同的知識基礎(chǔ)。它建立了簡潔和清晰的過程結(jié)構(gòu),為開發(fā)過程提供較大的通用性。
缺點:RUP?只是一個開發(fā)過程,并沒有涵蓋軟件過程的全部內(nèi)容,例如它缺少關(guān)于軟件運行和支持等方面的內(nèi)容,此外,他沒有支持多項目的開發(fā)結(jié)構(gòu),這在一定程度上降低了在開發(fā)組織內(nèi)大范圍實現(xiàn)重用的可能性。
?
RUP?得最佳實踐:迭代式開發(fā);管理需求;使用基于構(gòu)件的體系結(jié)構(gòu);可視化建模;驗證軟件質(zhì)量;控制軟件變更。?
RUP?軟件開發(fā)生命周期:是一個二維的生命周期;9?個核心工作流和?4?個工作階段。其中前?6?個是核心過程工作流程,后?3?個是核心支持工作流程。
9?個核心工作流:業(yè)務(wù)建模,需求,分析與設(shè)計,實現(xiàn),測試,部署,配置與變更管理,項目管理,環(huán)境。
?4?個工作階段:初始階段(建立業(yè)務(wù)模型,定義最終產(chǎn)品視圖,并且確定項目的范圍);精化階段(設(shè)計并確定系統(tǒng)的體系結(jié)構(gòu),制定項目計劃,確定資源需求);構(gòu)建階段(開發(fā)出所有構(gòu)件和應(yīng)用程序,把它們集成為客戶所需得產(chǎn)品,并且詳盡地測試所有功能);移交階段(把開發(fā)出的產(chǎn)品提交給用戶使用)。
?
8、敏捷過程
適用范圍:商業(yè)競爭環(huán)境下對小型項目提出的有限資源和有限開發(fā)時間的約束/開發(fā)可用資源及開發(fā)時間都有較苛刻約束得小型項目
?
敏捷軟件開發(fā)宣言的?4?個簡單的價值觀:個體和交互勝過過程和工具;可以工作的軟件勝過面面俱到的文檔;客戶合作勝過合同談判;響應(yīng)變化勝過遵循計劃。
?
9、極限編程?XP
適用范圍:需求模糊且經(jīng)常改變的場合。
特點:對變化和不確定性的更快速、更敏捷的反應(yīng);在快速的同時仍然能夠保持可持續(xù)的開發(fā)速度。
有效實踐:客戶作為開發(fā)團隊的成員;使用用戶素材;短交付周期;驗收測試;結(jié)對編程;測試驅(qū)動開發(fā);集體所有;持續(xù)集成;可持續(xù)的開發(fā)速度;開放的工作空間;及時調(diào)整計劃;簡單的設(shè)計;重構(gòu);使用隱喻。
?
10、微軟過程
適用范圍:商業(yè)環(huán)境下具有有限資源和有限開發(fā)時間約束的項目的軟件過程模式。
?
優(yōu)點:綜合了?RUP?和敏捷過程的許多優(yōu)點,是對眾多成功項目的開發(fā)經(jīng)驗的正確總結(jié)缺點:對方法、工具和產(chǎn)品等方面的論述不如?RUP?和敏捷過程全面,人們對它的某些準(zhǔn)則本身也有不同意見。
生命周期:5?個階段,規(guī)劃階段,設(shè)計階段,開發(fā)階段,穩(wěn)定階段,發(fā)布階段。
11、為什么說分階段的生命周期模型有助于軟件項目管理?
軟件是計算機系統(tǒng)的邏輯部件而不是物理部件,其固有的特點是缺乏可見性,因此,管理和控制軟件開發(fā)過程相當(dāng)困難。分階段的生命周期模型提高了軟件項目的可見性。管理者可以把各個階段任務(wù)的完成作為里程碑來對軟件開發(fā)過程進行管理。把階段劃分得更細(xì)就能夠更密切地監(jiān)控軟件項目的進展情況。
?
12、在進行詳細(xì)設(shè)計之前先進行總體設(shè)計的必要性:
可以站在全局高度上,花較少成本,從較抽象的層次上分析對比多種可能的系統(tǒng)實現(xiàn)方案和軟件結(jié)構(gòu),從中選出最佳方案和最合理的軟件結(jié)構(gòu),從而用較低成本開發(fā)出較高質(zhì)量的軟件系統(tǒng)。
?
13、編程時使用的程序設(shè)計語言對軟件開發(fā)與維護的影響?
(1)程序設(shè)計語言是人們用計算機解決問題的基本工具,因此,它將影響軟件開發(fā)人員的思維方式和解題方式。?
(2)程序設(shè)計語言是表達(dá)具體的解題方法的工具,它的語法是否清晰易懂,閱讀程序時是否容易產(chǎn)生二義性,都對程序的可讀性和可理解性有較大影響。?
(3)程序設(shè)計語言所提供的模板化機制是否完善,編譯程序查錯能力的強弱等,都對程序的可靠性有明顯影響。?
(4)程序設(shè)計語言實現(xiàn)設(shè)計結(jié)果的難易程度,是否提供了良好的獨立編譯機制,可利用的軟件開發(fā)工具是否豐富而且有效等,都對軟件的開發(fā)效率有影響。?
(5)編譯程序優(yōu)化能力的強弱,程序設(shè)計語言直接操縱硬件設(shè)施的能力等,都將明顯地影響程序的運行效率。?
(6)程序設(shè)計語言的標(biāo)準(zhǔn)化程度,所提供的模板封裝機制,源程序的可讀性和可理解性等,都將影響軟件的可維護性。
?
14、維護代價高昂——軟件維護中無形的代價有:
(1)因為可用的資源必須供維護任務(wù)使用,以致耽誤甚至喪失了開發(fā)的良機。
(2)當(dāng)看來合理的有關(guān)改錯或修改的要求不能及時滿足時將引起用戶不滿。
(3)由于維護時的改動,在軟件中引入了潛伏的錯
誤,從而降低了軟件的質(zhì)量。
(4)當(dāng)必須把軟件工程師調(diào)去從事維護工作時,將在開發(fā)過程中造成混亂。
(5)生產(chǎn)率的大幅度下降。
維護存在的問題:
(1)理解別人寫的程序非常困難,而且困難程度隨著軟件配置成分的減少而迅速增加。
(2)需要維護的軟件往往沒有合格的文檔,或者文檔資料顯著不足。
(3)當(dāng)要求對軟件進行維護時,不能指望由開發(fā)人員給人們仔細(xì)說明軟件。
(4)絕大多數(shù)軟件在設(shè)計時沒有考慮將來的修改。
(5)軟件維護不是一項吸引人的工作。
15、為什么在開發(fā)大型軟件時,采用面向?qū)ο蠓缎捅炔捎媒Y(jié)構(gòu)化范型較易取得成功?
(1)結(jié)構(gòu)化技術(shù)要么面向處理(如面向數(shù)據(jù)流的設(shè)計方法),要么面向數(shù)據(jù)(如面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計方法),但沒有既面向處理又面向數(shù)據(jù)的結(jié)構(gòu)化技術(shù)。用結(jié)構(gòu)化技術(shù)開發(fā)出的軟件產(chǎn)品的基本成分是產(chǎn)品的行為(即處理)和這些行為所操作的數(shù)據(jù)。由于數(shù)據(jù)和對數(shù)據(jù)的處理是分離的,因此,使用結(jié)構(gòu)化范型開發(fā)出的軟件產(chǎn)品本質(zhì)上是一個完整的單元,由此帶來的后果是軟件規(guī)模越大,用結(jié)構(gòu)化范型開發(fā)軟件的技術(shù)難度和管理難度就越大。?
(2)與結(jié)構(gòu)化技術(shù)相反,面向?qū)ο蠹夹g(shù)是一種以數(shù)據(jù)為主線,把數(shù)據(jù)和處理相結(jié)合的方法。面向?qū)ο蠓缎桶褜ο笞鳛橛蓴?shù)據(jù)及可以施加在這些數(shù)據(jù)上的操作所構(gòu)成的統(tǒng)一體。用面向?qū)ο蠓缎烷_發(fā)軟件時,構(gòu)成軟件系統(tǒng)的每個對象就好像一個微型程序,有自己的數(shù)據(jù)、操作、功能和用途,因此,可以把一個大型軟件產(chǎn)品分解成一系列本質(zhì)上相互獨
立的小產(chǎn)品來處理,不僅降低了軟件開發(fā)的技術(shù)難度,而且也使得對軟件開發(fā)工作的管理變得相對容易了。
?
16、為什么說面向?qū)ο蠓椒ㄅc人類習(xí)慣的思維解題方法比較一致?
面向?qū)ο蠓椒▽W(xué)的基本原則是按照人們習(xí)慣的思維方式建立問題域的模型,開發(fā)出盡可能直觀、自然地表現(xiàn)求解方法的軟件系統(tǒng)。面向?qū)ο蟮能浖到y(tǒng)中廣泛使用的對象是對客觀世界中實體的抽象,對象實際上是抽象數(shù)據(jù)類型的實例,提供了立項的數(shù)據(jù)抽象機制,同時又具有良好的過程抽象機制(通過發(fā)消息使用公有成員函數(shù))。因此,面向?qū)ο蟮沫h(huán)境提供了強有力的抽象機制,便于人們在利用計算機軟件系統(tǒng)解決復(fù)雜問題時使用習(xí)慣的抽象思維工具。此外,面向?qū)ο蠓椒▽W(xué)中普遍進行的對象分類過程支持從特殊到一般的歸納思維過程;面向?qū)ο蠓椒?學(xué)中通過建立類等級而獲得的繼承特性支
持從一般到特殊的演繹思維過程。
?
17、功能內(nèi)聚和信息性內(nèi)聚的區(qū)別
(1)內(nèi)聚是衡量組成模塊的各個元素彼此結(jié)合的緊密程度,它是信息隱藏和局部化原理的自然擴展。設(shè)計軟件時應(yīng)該力求做到模塊高內(nèi)聚。?
(2)當(dāng)采用結(jié)構(gòu)化范型設(shè)計軟件系統(tǒng)時,使用功能分解方法劃分模塊。組成這類模塊的元素最主要是完成模塊功能的可執(zhí)行語句。如果模塊內(nèi)所有處理元素屬于一個整體,完成單一完整的功能,則該模塊的內(nèi)聚稱為功能內(nèi)聚。采用結(jié)構(gòu)化范型開發(fā)軟件時,功能內(nèi)聚是最高級的內(nèi)聚。
(3)采用面向?qū)ο蠓缎驮O(shè)計軟件時,使用對象分解方法劃分模塊。對象是面向?qū)ο筌浖幕灸K,它是由描述該對象屬性的數(shù)據(jù)及可以對這些數(shù)據(jù)施加的操作封裝在一起構(gòu)成的統(tǒng)一體。因此,組成對象的主要元素既有數(shù)據(jù)又有操作,這兩類元素是同等重要的。如果一個對象可以完成許多相關(guān)的操作,每個操作都有自己的入口點,它們的代碼相對獨立,而且所有操作都在相同的數(shù)據(jù)結(jié)構(gòu)上完成,也就是說,操作圍繞對其數(shù)據(jù)所需要做的處理來設(shè)置,不設(shè)置與這些數(shù)據(jù)無關(guān)的操作,則該對象具有信息性內(nèi)聚。實際上,信息性內(nèi)聚的對象所包含的操作本身應(yīng)該是功能內(nèi)聚的。
18、多態(tài)重用與繼承重用的關(guān)系。
(1)當(dāng)已有的類構(gòu)件不能通過實例重用方式滿足當(dāng)前系統(tǒng)的需求時,利用繼承機制從已有類誕生出符合當(dāng)前需要的子類,從而獲得可在當(dāng)前系統(tǒng)中使用的類構(gòu)件,這種重用方式稱為繼承重用。
(2)如果在設(shè)計類構(gòu)件時,把可能妨礙重用的、與應(yīng)用環(huán)境密切相關(guān)的操作從一般操作中分離出來,作為適配接口,并且把這類操作說明為多態(tài)操作,類中其他操作通過調(diào)用適當(dāng)?shù)亩嗯_操作來完成自己的功能,則為了在當(dāng)前系統(tǒng)中重用已有的類構(gòu)件,在從已有類誕生出的子類中只需要重新定義某些多態(tài)操作即可滿足當(dāng)前系統(tǒng)的需求,這種重用方式稱為多態(tài)重用。
(3)通過上面的敘述可以知道,多態(tài)重用實際上是一種特殊的繼承重用,是充分利用多態(tài)性機制支持的繼承重用。一般說來,使用多態(tài)重用方式重用已有的類構(gòu)件時,在子類中需要重新定義的操作比較少,因此,這種重用方式的成本比繼承重用方式的成本低。
19、程序設(shè)計風(fēng)格
新規(guī)則:提高可重用性(準(zhǔn)則:提高方法的內(nèi)聚;減小方法的規(guī)模;保持方法的一致性;把策略和實現(xiàn)分開;全面覆蓋輸入條件的各種可能組合;盡量不使用全局信息;盡量利用繼承機制),提高可擴充性(準(zhǔn)則:封裝類的實現(xiàn)細(xì)節(jié);避免使用多分支語句;精心選擇和定義公有方法),提高健壯性(準(zhǔn)則:預(yù)防用戶的錯誤操作;檢查參數(shù)的合法性;不要預(yù)先設(shè)定數(shù)據(jù)結(jié)構(gòu)的限制條件;先測試后優(yōu)化)。
20、為什么應(yīng)該盡量使用面向?qū)ο笳Z言來實現(xiàn)面向?qū)ο蠓治龊驮O(shè)計的結(jié)果?
面向?qū)ο笳Z言充分支持對象、類、封裝、繼承、多態(tài)、重載等面向?qū)ο蟮母拍睿幾g程序能夠自動地在目標(biāo)程序中實現(xiàn)上述概念,因此,把面向?qū)ο蟮脑O(shè)計結(jié)果翻譯成面向?qū)ο蟪绦蛟O(shè)計比較容易,這就降低了編程工作量而且減少了編程錯誤。更重要的是,從面向?qū)ο蠓治龅矫嫦驅(qū)ο笤O(shè)計再到面向?qū)ο蟪绦蛟O(shè)計,始終使用統(tǒng)一的概念,既可以保證在軟件開發(fā)過程的各個階段之間平滑過渡,又有助于提高軟件的可重用性和可維護性。
21、什么是強類型語言?這類語言有哪些優(yōu)點?
(1)按照編譯時對程序中使用的數(shù)據(jù)進行類型檢查的嚴(yán)格程度,可以把程序設(shè)計語言劃分為兩類。如果語言僅要求每個變量或?qū)傩噪`屬于一個對象,則是弱類型的;如果語法規(guī)定每個變量或?qū)傩员仨殰?zhǔn)確地屬于某個特定的類,則這樣的語言是強類型的。
(2)強類型的語言主要有兩個優(yōu)點:一是有利于在編譯時發(fā)現(xiàn)程序錯誤;二是增加了優(yōu)化的可能性。因此,強類型語言提高程序的可靠性和運行效率。
22、為什么推遲關(guān)鍵路徑上的任務(wù)會延遲整個項目?
關(guān)鍵路徑定義為一組任務(wù)(稱為關(guān)鍵任務(wù)),這組任務(wù)決定了完成項目所需要的最短時間。如果位于關(guān)鍵路徑上的一個關(guān)鍵任務(wù)的完成時間被推遲了,則關(guān)鍵路徑上的下一個任務(wù)的開始時間和結(jié)束時間也要相應(yīng)的延遲。這樣依次傳遞,會波及關(guān)鍵路徑上的最后一個任務(wù),從而延遲整個項目。
23、一個程序能既正確又不可靠嗎?
所謂軟件可靠性,是程序在給定的時間間隔內(nèi)按照規(guī)格說明書的規(guī)定成功地運行概率。通常認(rèn)為,軟件可靠性既包含正確性又包含健壯性,也就是說,不僅在預(yù)定環(huán)境下程序應(yīng)該能正確地完成預(yù)期功能,而且在硬件發(fā)生故障,輸入的數(shù)據(jù)無效或用戶操作錯誤等意外環(huán)境下,程序也應(yīng)該能作出適當(dāng)?shù)捻憫?yīng)。
如果一個程序在預(yù)定環(huán)境下能夠正確地完成預(yù)期的功能,但是在意外環(huán)境下不能作出適當(dāng)?shù)捻憫?yīng),則該程序就是既正確又不可靠。
24、為什么在開發(fā)軟件的過程中變化既是必要的又是不可避免的?為什么必須進行配置管理?
在開發(fā)軟件的過程中,下述原因會導(dǎo)致軟件配置項發(fā)生變化:新的市場條件導(dǎo)致產(chǎn)品需求或業(yè)務(wù)規(guī)則發(fā)生變化;客戶提出了新需求,要求修改信息系統(tǒng)產(chǎn)生的數(shù)據(jù)或產(chǎn)品提供的功能;企業(yè)改組或業(yè)務(wù)縮減,引起項目優(yōu)先級或軟件工程隊伍結(jié)構(gòu)變化;預(yù)算或進度限制,導(dǎo)致對目標(biāo)系統(tǒng)的重新定義;發(fā)現(xiàn)了在軟件開發(fā)過程的前期階段所犯的錯誤,必須加以改正。
但是,變化也很容易失去控制,如果不能適當(dāng)?shù)毓芾砗涂刂谱兓厝粫斐苫靵y并產(chǎn)生許多嚴(yán)重的錯誤。軟件配置管理就是在軟件的整個生命期內(nèi)管理和控制變化的一組活動??梢园衍浖渲霉芾砜醋鍪菓?yīng)用于整個軟件過程的軟件質(zhì)量保證活動,是專門用來管理和控制變化的軟件質(zhì)量保證活動。軟件配置管理的目標(biāo)是,使變化更正確且更容易被適應(yīng),在必須變化時減少為此而花費的工作量。從上面的敘述可以知道,軟件配置管理是十分必要的。
25、 面向?qū)ο?/strong>
面向?qū)ο笫前岩唤M數(shù)據(jù)結(jié)構(gòu)和處理他們的方法封裝在一起的對象
把具有相同行為的對象歸納為類、
通過封裝隱藏類的內(nèi)部細(xì)節(jié)、
通過繼承使類得到泛化、
通過多態(tài)實現(xiàn)繼續(xù)對象類型的動態(tài)分派。
●26、軟件工程的重構(gòu)和設(shè)計模式
軟件設(shè)計模式又稱設(shè)計模式,是”套被反復(fù)使用、多數(shù)人知曉的經(jīng)過分類編目的.代碼設(shè)計經(jīng)驗總結(jié).使用設(shè)計模式是為了重用代碼讓代碼更容易被他人理解。保證代碼可靠性、程序重用性 。
重構(gòu) 就是在不改變軟件現(xiàn)有功能的基礎(chǔ)上通過調(diào)整程度代碼改善軟件的質(zhì)量和性能使其程序的設(shè)計模式和架構(gòu)更趨合理提高軟件的擴展性和維護性.
?通俗的說法就是程序的功能和結(jié)果沒有任何變化,重構(gòu)只對程序內(nèi)部結(jié)構(gòu)進行調(diào)整,讓代碼更加容易理解