朱大鵬
開發(fā)方法是開發(fā)模型中非常關(guān)鍵的要素,不同的開發(fā)模型既可以運(yùn)用相同的開發(fā)方法,也可以運(yùn)用不同的開發(fā)方法。
軟件生命周期模型(開發(fā)模型)與軟件開發(fā)方法是兩個不同的事物。開發(fā)模型是指開發(fā)軟件項(xiàng)目的總體過程的框架安排。軟件開發(fā)方法指如何組織軟件生產(chǎn)過程的方法,包括一系列的步驟,每一步驟都與相應(yīng)的技術(shù)和符號相關(guān);目的在于有效地完成一個運(yùn)行的系統(tǒng)及其支持文檔。因此,開發(fā)方法是開發(fā)模型中非常關(guān)鍵的要素,不同的開發(fā)模型既可以運(yùn)用相同的開發(fā)方法,也可以運(yùn)用不同的開發(fā)方法。
軟件開發(fā)方法是伴隨著計(jì)算機(jī)性能提高、應(yīng)用范圍擴(kuò)大而不斷發(fā)展的。軟件行業(yè)普遍認(rèn)可和應(yīng)用的開發(fā)方法,起源于20世紀(jì)60年代軟件危機(jī)。為了應(yīng)對軟件危機(jī),1968、1969年連續(xù)召開兩次著名的北大西洋公約組織會議,提出了軟件工程的概念,軟件開發(fā)方法也逐漸實(shí)現(xiàn)了科學(xué)化。按照時間序列,核心的軟件開發(fā)方法是結(jié)構(gòu)化方法、面向數(shù)據(jù)結(jié)構(gòu)方法、維也納開發(fā)方法、面向?qū)ο蟮拈_發(fā)方法;模塊化開發(fā)方法、可視化開發(fā)方法和敏捷開發(fā)方法可視為非核心的開發(fā)方法。下面逐一介紹。
結(jié)構(gòu)化方法就是以現(xiàn)實(shí)用戶的實(shí)際結(jié)構(gòu)和所開發(fā)的軟件的結(jié)構(gòu)為框架,以用戶數(shù)據(jù)流和軟件數(shù)據(jù)流為核心,以分解和抽象、獨(dú)立的模塊化等為主要方法進(jìn)行軟件開發(fā)。結(jié)構(gòu)是指系統(tǒng)內(nèi)各組成要素之間的相互聯(lián)系、相互作用的框架。結(jié)構(gòu)化開發(fā)方法的特點(diǎn)主要表現(xiàn)在:一是自頂向下,逐步求精。將軟件分析的過程劃分成若干個層次,每一個新的層次都是上一個層次的細(xì)化。二是模塊化。將軟件系統(tǒng)分解成若干個模塊,每個模塊內(nèi)的信息被屏蔽,并實(shí)現(xiàn)特定的功能。最終的系統(tǒng)由這些模塊組裝而成,模塊之間通過接口傳遞信息。三是語句結(jié)構(gòu)化。在每個模塊中只允許出現(xiàn)順序、分支和循環(huán)三種流程結(jié)構(gòu)的語句。結(jié)構(gòu)化方法由結(jié)構(gòu)化分析、結(jié)構(gòu)化設(shè)計(jì)、結(jié)構(gòu)化程序設(shè)計(jì)等三部分組成。結(jié)構(gòu)化方法是軟件工程中最早、最傳統(tǒng)的開發(fā)方法。被稱為續(xù)子程序、高級語言之后軟件發(fā)展中的第三個里程碑,影響深遠(yuǎn)。結(jié)構(gòu)化開發(fā)方法是從針對普通數(shù)據(jù)的處理應(yīng)用發(fā)展而來的,技術(shù)成熟,是其他開發(fā)方法的基礎(chǔ)。特別適合于數(shù)據(jù)處理領(lǐng)域的問題;但不適應(yīng)于規(guī)模大以及特別復(fù)雜項(xiàng)目。難以解決軟件重用問題、需求變化問題和維護(hù)問題。
面向數(shù)據(jù)結(jié)構(gòu)的方法是一種以數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)為核心,以事件和數(shù)據(jù)驅(qū)動,基于進(jìn)程的軟件開發(fā)方法,是從結(jié)構(gòu)化方法演變而來的。面向數(shù)據(jù)結(jié)構(gòu)的方法強(qiáng)調(diào)數(shù)據(jù)結(jié)構(gòu),而不像結(jié)構(gòu)化方法強(qiáng)調(diào)數(shù)據(jù)流,這是由于一個問題的數(shù)據(jù)結(jié)構(gòu)與處理該問題的數(shù)據(jù)結(jié)構(gòu)的控制結(jié)構(gòu)高度相似。該方法的特點(diǎn)為:首先描述問題的輸入、輸出數(shù)據(jù)結(jié)構(gòu),分析其對應(yīng)性,并用數(shù)據(jù)結(jié)構(gòu)圖(特指該類方法所用的圖形描述工具,如Jackson結(jié)構(gòu)圖、Warnier圖)來表示,再在此基礎(chǔ)上進(jìn)行需求分析。最后完成問題的軟件過程描述。該方法也是遵循分解和抽象的原則,將問題分解為由順序、選擇和重置三種基本結(jié)構(gòu)形式表示的各部分層次結(jié)構(gòu)。再用數(shù)據(jù)結(jié)構(gòu)圖來表達(dá)。該方法適合于小規(guī)模的項(xiàng)目。當(dāng)輸入數(shù)據(jù)結(jié)構(gòu)和輸出數(shù)據(jù)結(jié)構(gòu)無對應(yīng)關(guān)系時,難以應(yīng)用該方法。
維也納開發(fā)方法是用嚴(yán)格的形式語言來描述軟件需求,用形式化的開發(fā)方法把描述模型變換成目標(biāo)系統(tǒng)。形式化是指借助數(shù)學(xué)方程、函數(shù)等數(shù)學(xué)方式的表達(dá)形式。該方法的特點(diǎn)是將軟件系統(tǒng)視為一個模型,輸入/輸出是模型的對象,模型通過對對象的操作實(shí)現(xiàn)了軟件功能。這個模型具有代數(shù)式的特點(diǎn):輸入/輸出和對象的真正含義都用數(shù)學(xué)的域方程來表示,系統(tǒng)在計(jì)算機(jī)內(nèi)的狀態(tài)用數(shù)學(xué)函數(shù)表示。該方法產(chǎn)生于用高級語言開發(fā)編譯系統(tǒng)的過程中。先應(yīng)用于開發(fā)程序語言的語義形式說明,逐步演變成一般軟件的開發(fā)方法,但應(yīng)用范圍不如其他方法廣泛。
面向?qū)ο蟮拈_發(fā)方法是以對象為中心,以類、屬性、服務(wù)和繼承等為構(gòu)造機(jī)制來認(rèn)識、理解、反映客觀世界,以封裝、聚合、消息傳送、結(jié)構(gòu)與連接等來設(shè)計(jì),構(gòu)建相應(yīng)的軟件系統(tǒng)。面向?qū)ο蟮拈_發(fā)方法最大的特點(diǎn)是將其他開發(fā)方法以數(shù)據(jù)流、數(shù)據(jù)結(jié)構(gòu)等為中心,調(diào)整為以對象為中心;而對象是構(gòu)成世界的一個獨(dú)立單位,具有自己的靜態(tài)特征和動態(tài)特征;計(jì)算機(jī)實(shí)現(xiàn)的對象與真實(shí)世界的對象具有一一對應(yīng)的關(guān)系,更能易于為人們所理解和接受,降低了用戶、開發(fā)人員的溝通成本。面向?qū)ο蠓椒ò嫦驅(qū)ο蠓治觥⒃O(shè)計(jì)和實(shí)現(xiàn)活動。由于對象是客觀存在的,因此當(dāng)需求變化時對象的性質(zhì)要比對象的使用更為穩(wěn)定。從而使建立在對象結(jié)構(gòu)上的軟件系統(tǒng)也更為穩(wěn)定,因此該方法徹底解決了軟件的可維護(hù)性問題,成為近年來最流行的軟件開發(fā)方法。
上述方法屬于核心的開發(fā)方法,具有比較全面的技術(shù)、使用、管理和經(jīng)濟(jì)等特征,理論體系、技術(shù)應(yīng)用均處于成熟的狀態(tài)。此外,還有一些非核心的開發(fā)方法,主要是模塊化、可視化和敏捷開發(fā)方法,這些方法更具有工具性或者組合性的特點(diǎn),整體性和理論體系不夠顯著。
模塊化開發(fā)方法把一個待開發(fā)的軟件進(jìn)行分解,分解成若干模塊,每個模塊分別獨(dú)立地開發(fā)、測試,最后再組裝出整個軟件。模塊就是可組成系統(tǒng)的、具有某種確定獨(dú)立功能的半自律性的子系統(tǒng)。該方法將復(fù)雜的軟件系統(tǒng)通過模塊分解的方式降低難度和復(fù)雜度,每個模塊的研發(fā)和改進(jìn)都獨(dú)立于其他模塊的研發(fā)和改進(jìn),既保證模塊功能的獨(dú)立,又能實(shí)現(xiàn)模塊的重復(fù)使用;每個模塊所特有的信息處理過程都被包含在模塊的內(nèi)部,通過一個或數(shù)個通用的標(biāo)準(zhǔn)界面與系統(tǒng)或其他模塊相互連接,既實(shí)現(xiàn)了內(nèi)部信息的屏蔽,又提高信息處理的效率和準(zhǔn)確性。該方法缺點(diǎn)在于處理大型復(fù)雜的問題,往往無法分解;此外,在分解過程中,不同角度要求屏蔽的信息是不同的,形成沖突。因此,該方法一般是融合入其他開發(fā)方法內(nèi)來運(yùn)用的。
可視化開發(fā)方法就是在可視開發(fā)工具提供的圖形用戶界面上,通過操作界面元素,諸如菜單、按鈕、對話框、編輯框、單選框、復(fù)選框、列表框和滾動條等,由可視開發(fā)工具自動生成應(yīng)用軟件。該開發(fā)方法是事件驅(qū)動的,系統(tǒng)按照事件一消息一消息相應(yīng)函數(shù)的邏輯運(yùn)行的。該開發(fā)方法的核心要素是消息響應(yīng)函數(shù),是由可視開發(fā)工具在生成軟件時自動裝入的。該開發(fā)方法可實(shí)現(xiàn)兩類服務(wù):一是生成圖形用戶界面及相關(guān)的消息響應(yīng)函數(shù);二是為各種具體的子應(yīng)用的各個常規(guī)執(zhí)行步驟提供規(guī)范窗口,包括對話框、菜單、列表框、組合框、按鈕和編輯框等,提高開發(fā)效率。由于要事先生成各種消息相應(yīng)函數(shù),該方法只能應(yīng)用于相當(dāng)成熟的領(lǐng)域,比如關(guān)系數(shù)據(jù)庫等;在一般應(yīng)用領(lǐng)域,只適合用戶界面的可視化開發(fā)。該開發(fā)方法一般不能獨(dú)立運(yùn)用,需要融入其他開發(fā)方法中來運(yùn)用。
敏捷開發(fā)方法是移動互聯(lián)時代興起的綜合性開發(fā)方法,將互聯(lián)網(wǎng)精神融入到開發(fā)團(tuán)隊(duì),采取適應(yīng)變化、以人為楊心、迭代、循序漸進(jìn)的開發(fā)方法。該方法是在互聯(lián)網(wǎng)技術(shù)和商業(yè)發(fā)展背景下產(chǎn)生的,適用互聯(lián)網(wǎng)軟件開發(fā)需求不明確、客戶體驗(yàn)性強(qiáng)、用戶競爭激烈等情況。該方法注意團(tuán)隊(duì)組合。一般將項(xiàng)目經(jīng)理、用戶人員和開發(fā)團(tuán)隊(duì)混合編組,注意激發(fā)開發(fā)人員活力、給與充分授權(quán)等適應(yīng)互聯(lián)網(wǎng)精神的團(tuán)隊(duì)組織和管理理念,融合原有的迭代、增量、噴泉等開發(fā)模型中分析、設(shè)計(jì)、開發(fā)等既有方法。把一個大項(xiàng)目分為多個相互聯(lián)系,但也可獨(dú)立運(yùn)行的小項(xiàng)目,并分別完成,在此過程中軟件一直處于可使用狀態(tài);強(qiáng)調(diào)各個階段任務(wù)的短、小、靈、快。該方法是一種綜合方法,重視強(qiáng)調(diào)一些核心原則和輔助原則,這些原則既是開發(fā)人員和團(tuán)隊(duì)價值取向,也是工作方法。比如,核心原則包括:①注重個人及互動勝于過程和工具;②注重可用的軟件勝過詳盡的文檔;③注重客戶協(xié)作勝于合同談判;④注重響應(yīng)變化勝于恪守計(jì)劃等。具體的敏捷開發(fā)方法包括×P極限編程、Scrunm、水晶方法、開放式源碼、功用驅(qū)動開發(fā)方法、自適應(yīng)軟件開發(fā)方法等。
不論開發(fā)方法如何變化,并不存在完美無缺的開發(fā)方法;也不存在一種萬能的開發(fā)方法,能適應(yīng)于所有軟件開發(fā)之需。在實(shí)踐中,各種開發(fā)方法是可以組合使用的。結(jié)構(gòu)化方法和模塊化方法,可理解為系統(tǒng)架構(gòu)的設(shè)計(jì)方法路徑;面向數(shù)據(jù)結(jié)構(gòu)的方法,可理解為從數(shù)據(jù)結(jié)構(gòu)作為起點(diǎn)的一種設(shè)計(jì)思路,而不是將功能作為設(shè)計(jì)起點(diǎn);敏捷方法更多的是偏向過程和團(tuán)隊(duì)建設(shè)的工作組織方法。因此,在一個項(xiàng)目中,可以以敏捷方法作為工作組織形式,按照模塊化方法把工作任務(wù)分解,然后按照數(shù)據(jù)結(jié)構(gòu)方法進(jìn)行內(nèi)部設(shè)計(jì)。當(dāng)需要選用開發(fā)方法時,應(yīng)實(shí)事求是,選擇最適合主客觀條件的開發(fā)方法。