在現(xiàn)代社會中,軟件應用于多個方面。典型的軟件比如有電子郵件,嵌入式系統(tǒng),人機界面,辦公套件,操作系統(tǒng),編譯器,數(shù)據(jù)庫,游戲等。同時,各個行業(yè)幾乎都有計算機軟件的應用,比如工業(yè),農(nóng)業(yè),銀行,航空,政府部門等。這些應用促進了經(jīng)濟和社會的發(fā)展,使得人們的工作更加高效,同時提高了生活質量。
軟件工程師是對應用軟件創(chuàng)造軟件的人們的統(tǒng)稱,軟件工程師按照所處的領域不同可以分為系統(tǒng)分析員,軟件設計師,系統(tǒng)架構師,程序員,測試員等等。人們也常常用程序員來泛指各種軟件工程師。
軟件工程(SoftWare Engineering)的框架可概括為:目標、過程和原則。
(1)軟件工程目標:生產(chǎn)具有正確性、可用性以及開銷合宜的產(chǎn)品。正確性指軟件產(chǎn)品達到預期功能的程度??捎眯灾杠浖窘Y構、實現(xiàn)及文檔為用戶可用的程度。開銷合宜是指軟件開發(fā)、運行的整個開銷滿足用戶要求的程度。這些目標的實現(xiàn)不論在理論上還是在實踐中均存在很多待解決的問題,它們形成了對過程、過程模型及工程方法選取的約束。
(2)軟件工程過程:生產(chǎn)一個最終能滿足需求且達到工程目標的軟件產(chǎn)品所需要的步驟。軟件工程過程主要包括開發(fā)過程、運作過程、維護過程。它們覆蓋了需求、設計、實現(xiàn)、確認以及維護等活動。需求活動包括問題分析和需求分析。問題分析獲取需求定義,又稱軟件需求規(guī)約。需求分析生成功能規(guī)約。設計活動一般包括概要設計和詳細設計。概要設計建立整個軟件系統(tǒng)結構,包括子系統(tǒng)、模塊以及相關層次的說明、每一模塊的接口定義。詳細設計產(chǎn)生程序員可用的模塊說明,包括每一模塊中數(shù)據(jù)結構說明及加工描述。實現(xiàn)活動把設計結果轉換為可執(zhí)行的程序代碼。確認活動貫穿于整個開發(fā)過程,實現(xiàn)完成后的確認,保證最終產(chǎn)品滿足用戶的要求。維護活動包括使用過程中的擴充、修改與完善。伴隨以上過程,還有管理過程、支持過程、培訓過程等。
(3)軟件工程的原則是指圍繞工程設計、工程支持以及工程管理在軟件開發(fā)過程中必須遵循的原則。
一、軟件工程概述
概念:應需而生
軟件工程是一類工程。工程是將理論和知識應用于實踐的科學。就軟件工程而言,它借鑒了傳統(tǒng)工程的原則和方法,以求高效地開發(fā)高質量軟件。其中應用了計算機科學、數(shù)學和管理科學。計算機科學和數(shù)學用于構造模型與算法,工程科學用于制定規(guī)范、設計范型、評估成本及確定權衡,管理科學用于計劃、資源、質量和成本的管理。
軟件工程這一概念,主要是針對20世紀60年代“軟件危機”而提出的。它首次出現(xiàn)在1968年NATO(北大西洋公約組織)會議上。自這一概念提出以來,圍繞軟件項目,開展了有關開發(fā)模型、方法以及支持工具的研究。其主要成果有:提出了瀑布模型,開發(fā)了一些結構化程序設計語言(例如PASCAL語言,Ada語言)、結構化方法等。并且圍繞項目管理提出了費用估算、文檔復審等方法和工具。綜觀60年代末至80年代初,其主要特征是,前期著重研究系統(tǒng)實現(xiàn)技術,后期開始強調開發(fā)管理和軟件質量。
70年代初,自“軟件工廠”這一概念提出以來,主要圍繞軟件過程以及軟件復用,開展了有關軟件生產(chǎn)技術和軟件生產(chǎn)管理的研究與實踐。其主要成果有:提出了應用廣泛的面向對象語言以及相關的面向對象方法,大力開展了計算機輔助軟件工程的研究與實踐。尤其是近幾年來,針對軟件復用及軟件生產(chǎn),軟件構件技術以及軟件質量控制技術、質量保證技術得到了廣泛的應用。目前各個軟件企業(yè)都十分重視資質認證,并想通過這些工作進行企業(yè)管理和技術的提升。軟件工程所涉及的要素可概括如下:
根據(jù)這一框架,可以看出:軟件工程涉及了軟件工程的目標、軟件工程原則和軟件工程活動。
目標:我的眼里只有“產(chǎn)品”
軟件工程的主要目標是:生產(chǎn)具有正確性、可用性以及開銷合宜的產(chǎn)品。正確性意指軟件產(chǎn)品達到預期功能的程度??捎眯灾杠浖窘Y構、實現(xiàn)及文檔為用戶可用的程度。開銷合宜性是指軟件開發(fā)、運行的整個開銷滿足用戶要求的程度。這些目標的實現(xiàn)不論在理論上還是在實踐中均存在很多問題有待解決,它們形成了對過程、過程模型及工程方法選取的約束。
軟件工程活動是“生產(chǎn)一個最終滿足需求且達到工程目標的軟件產(chǎn)品所需要的步驟”。主要包括需求、設計、實現(xiàn)、確認以及支持等活動。需求活動包括問題分析和需求分析。問題分析獲取需求定義,又稱軟件需求規(guī)約。需求分析生成功能規(guī)約。設計活動一般包括概要設計和詳細設計。概要設計建立整個軟件體系結構,包括子系統(tǒng)、模塊以及相關層次的說明、每一模塊接口定義。詳細設計產(chǎn)生程序員可用的模塊說明,包括每一模塊中數(shù)據(jù)結構說明及加工描述。實現(xiàn)活動把設計結果轉換為可執(zhí)行的程序代碼。確認活動貫穿于整個開發(fā)過程,實現(xiàn)完成后的確認,保證最終產(chǎn)品滿足用戶的要求。支持活動包括修改和完善。伴隨以上活動,還有管理過程、支持過程、培訓過程等。
框架:四項基本原則是基石
軟件工程圍繞工程設計、工程支持以及工程管理,提出了以下四項基本原則:
第一,選取適宜開發(fā)范型。該原則與系統(tǒng)設計有關。在系統(tǒng)設計中,軟件需求、硬件需求以及其他因素之間是相互制約、相互影響的,經(jīng)常需要權衡。因此,必須認識需求定義的易變性,采用適宜的開發(fā)范型予以控制,以保證軟件產(chǎn)品滿足用戶的要求。
第二,采用合適的設計方法。在軟件設計中,通常要考慮軟件的模塊化、抽象與信息隱蔽、局部化、一致性以及適應性等特征。合適的設計方法有助于這些特征的實現(xiàn),以達到軟件工程的目標。
第三,提供高質量的工程支持?!肮び破涫拢叵壤淦鳌?。在軟件工程中,軟件工具與環(huán)境對軟件過程的支持頗為重要。軟件工程項目的質量與開銷直接取決于對軟件工程所提供的支撐質量和效用。
第四,重視開發(fā)過程的管理。軟件工程的管理,直接影響可用資源的有效利用,生產(chǎn)滿足目標的軟件產(chǎn)品,提高軟件組織的生產(chǎn)能力等問題。因此,僅當軟件過程得以有效管理時,才能實現(xiàn)有效的軟件工程。
這一軟件工程框架告訴我們,軟件工程的目標是可用性、正確性和合算性;實施一個軟件工程要選取適宜的開發(fā)范型,要采用合適的設計方法,要提供高質量的工程支撐,要實行開發(fā)過程的有效管理;軟件工程活動主要包括需求、設計、實現(xiàn)、確認和支持等活動,每一活動可根據(jù)特定的軟件工程,采用合適的開發(fā)范型、設計方法、支持過程以及過程管理。根據(jù)軟件工程這一框架,軟件工程學科的研究內(nèi)容主要包括:軟件開發(fā)范型、軟件開發(fā)方法、軟件過程、軟件工具、軟件開發(fā)環(huán)境、計算機輔助軟件工程(CASE) 及軟件經(jīng)濟學等。
作用:高效開發(fā)高質量軟件
自從軟件工程概念提出以來,經(jīng)過30多年的研究與實踐,雖然“軟件危機”沒得到徹底解決,但在軟件開發(fā)方法和技術方面已經(jīng)有了很大的進步。尤其應該指出的是,自80年代中期,美國工業(yè)界和政府部門開始認識到,在軟件開發(fā)中,最關鍵的問題是軟件開發(fā)組織不能很好地定義和管理其軟件過程,從而使一些好的開發(fā)方法和技術都起不到所期望的作用。也就是說,在沒有很好定義和管理軟件過程的軟件開發(fā)中,開發(fā)組織不可能在好的軟件方法和工具中獲益。
根據(jù)調查,中國的現(xiàn)狀幾乎和美國10多年前的情況一樣,軟件開發(fā)過程沒有明確規(guī)定,文檔不完整,也不規(guī)范,軟件項目的成功往往歸功于軟件開發(fā)組的一些杰出個人或小組的努力。這種依賴于個別人員上的成功并不能為全組織的軟件生產(chǎn)率和質量的提高奠定有效的基礎,只有通過建立全組織的過程改善,采用嚴格的軟件工程方法和管理,并且堅持不懈地付諸實踐,才能取得全組織的軟件過程能力的不斷提高。
這一事實告訴我們,只有堅持軟件工程的四條基本原則,既重視軟件技術的應用,又重視軟件工程的支持和管理,并在實踐中貫徹實施,才能高效地開發(fā)出高質量的軟件。
二、軟件工程的七條基本原理
自從1968年提出“軟件工程”這一術語以來,研究軟件工程的專家學者們陸續(xù) 提出了100多條關于軟件工程的準則或信條。 美國著名的軟件工程專家 Boehm 綜合這些專家的意見,并總結了TRW公司多年的開發(fā)軟件的經(jīng)驗,于1983年提出了軟件工程的七條基本原理。
Boehm 認為,著七條原理是確保軟件產(chǎn)品質量和開發(fā)效率的原理的最小集合。
它們是相互獨立的,是缺一不可的最小集合;同時,它們又是相當完備的。
人們當然不能用數(shù)學方法嚴格證明它們是一個完備的集合,但是可以證明,在此之前已經(jīng)提出的100多條軟件工程準則都可以有這七條原理的任意組合蘊含或派生。
下面簡要介紹軟件工程的七條原理:
1 用分階段的生命周期計劃嚴格管理
這一條是吸取前人的教訓而提出來的。統(tǒng)計表明,50%以上的失敗項目是由于計劃不周而造成的。在軟件開發(fā)與維護的漫長生命周期中,需要完成許多性質各異的工作。這條原理意味著,應該把軟件生命周期分成若干階段,并相應制定出切實可行的計劃,然后嚴格按照計劃對軟件的開發(fā)和維護進行管理。 Boehm 認為,在整個軟件生命周期中應指定并嚴格執(zhí)行6類計劃:項目概要計劃、里程碑計劃、項目控制計劃、產(chǎn)品控制計劃、驗證計劃、運行維護計劃。
2 堅持進行階段評審
統(tǒng)計結果顯示: 大部分錯誤是在編碼之前造成的,大約占63%; <2> 錯誤發(fā)現(xiàn)的越晚,改正它要付出的代價就越大,要差2到3個數(shù)量級。 因此,軟件的質量保證工作不能等到編碼結束之后再進行,應堅持進行嚴格的階段評審,以便盡早發(fā)現(xiàn)錯誤。
3 實行嚴格的產(chǎn)品控制
開發(fā)人員最痛恨的事情之一就是改動需求。但是實踐告訴我們,需求的改動往往是不可避免的。這就要求我們要采用科學的產(chǎn)品控制技術來順應這種要求。也就是要采用變動控制,又叫基準配置管理。當需求變動時,其它各個階段的文檔或代碼隨之相應變動,以保證軟件的一致性。
4 采納現(xiàn)代程序設計技術
從六、七時年代的結構化軟件開發(fā)技術,到最近的面向對象技術,從第一、第二代語言,到第四代語言,人們已經(jīng)充分認識到:方法大似氣力。采用先進的技術即可以提高軟件開發(fā)的效率,又可以減少軟件維護的成本。
5 結果應能清楚地審查
軟件是一種看不見、摸不著的邏輯產(chǎn)品。軟件開發(fā)小組的工作進展情況可見性差,難于評價和管理。為更好地進行管理,應根據(jù)軟件開發(fā)的總目標及完成期限, 盡量明確地規(guī)定開發(fā)小組的責任和產(chǎn)品標準,從而使所得到的標準能清楚地審查。
6 開發(fā)小組的人員應少而精
開發(fā)人員的素質和數(shù)量是影響軟件質量和開發(fā)效率的重要因素,應該少而精。
這一條基于兩點原因:高素質開發(fā)人員的效率比低素質開發(fā)人員的效率要高幾倍到幾十倍,開發(fā)工作中犯的錯誤也要少的多; 當開發(fā)小組為N人時,可能的通訊信道為N(N-1)/2, 可見隨著人數(shù)N的增大,通訊開銷將急劇增大。
7 承認不斷改進軟件工程實踐的必要性
遵從上述六條基本原理,就能夠較好地實現(xiàn)軟件的工程化生產(chǎn)。但是,它們只是對現(xiàn)有的經(jīng)驗的總結和歸納,并不能保證趕上技術不斷前進發(fā)展的步伐。因此,Boehm提出應把承認不斷改進軟件工程實踐的必要性作為軟件工程的第七條原理。根據(jù)這條原理,不僅要積極采納新的軟件開發(fā)技術,還要注意不斷總結經(jīng)驗,收集進度和消耗等數(shù)據(jù),進行出錯類型和問題報告統(tǒng)計。這些數(shù)據(jù)既可以用來評估新的 軟件技術的效果,也可以用來指明必須著重注意的問題和應該優(yōu)先進行研究的工具和技術。
面向方面的編程(Aspect Oriented Programming,簡稱AOP)被認為是近年來軟件工程的另外一個重要發(fā)展。這里的方面指的是完成一個功能的對象和函數(shù)的集合。在這一方面相關的內(nèi)容有泛型編程(Generic Programming)和模板。
參考
胡崑山,《中國軟件產(chǎn)業(yè)發(fā)展現(xiàn)狀與人才需求》,2003年9月1日, http://software.ccidnet.com/pub/article/c372_a62973_p1.html
三、軟件工程的目標與常用模型
軟件工程的目標是提高軟件的質量與生產(chǎn)率,最終實現(xiàn)軟件的工業(yè)化生產(chǎn)。質量是軟件需求方最關心的問題,用戶即使不圖物美價廉,也要求個貨真價實。生產(chǎn)率是軟件供應方最關心的問題,老板和員工都想用更少的時間掙更多的錢。質量與生產(chǎn)率之間有著內(nèi)在的聯(lián)系,高生產(chǎn)率必須以質量合格為前提。如果質量不合格,對供需雙方都是壞事情。從短期效益看,追求高質量會延長軟件開發(fā)時間并且增大費用,似乎降低了生產(chǎn)率。從長期效益看,高質量將保證軟件開發(fā)的全過程更加規(guī)范流暢,大大降低了軟件的維護代價,實質上是提高了生產(chǎn)率,同時可獲得很好的信譽。質量與生產(chǎn)率之間不存在根本的對立,好的軟件工程方法可以同時提高質量與生產(chǎn)率。
軟件供需雙方的代表能在餐桌上談笑風生,歸功于第一線開發(fā)人員的辛勤工作。質量與生產(chǎn)率的提高就指望程序員與程序經(jīng)理。對開發(fā)人員而言,如果非得在質量與生產(chǎn)率之間分個主次不可,那么應該是質量第一,生產(chǎn)率第二。這是因為:(1)質量直接體現(xiàn)在軟件的每段程序中,高質量自然是開發(fā)人員的技術追求,也是職業(yè)道德的要求。(2)高質量對所有的用戶都有價值,而高生產(chǎn)率只對開發(fā)方有意義。(3)如果一開始就追求高生產(chǎn)率,容易使人急功近利,留下隱患。寧可進度慢些,也要保證每個環(huán)節(jié)的質量,以圖長遠利益。
軟件的質量因素很多,如正確性,性能、可靠性、容錯性、易用性、靈活性、可擴充性、可理解性、可維護性等等。有些因素相互重疊,有些則相抵觸,真要提高質量可不容易啊!
軟件工程的主要環(huán)節(jié)有:人員管理、項目管理、可行性與需求分析、系統(tǒng)設計、程序設計、測試、維護等,如圖1.1所示。
軟件工程模型建議用一定的流程將各個環(huán)節(jié)連接起來,并可用規(guī)范的方式操作全過程,如同工廠的生產(chǎn)線。常見的軟件工程模型有:線性模型(圖1.2),漸增式模型(圖1.3),螺旋模型,快速原型模型,形式化描述模型等等 [Pressmam 1999, Sommerville 1992]。
最早出現(xiàn)的軟件工程模型是線性模型(又稱瀑布模型)。線性模型太理想化,太單純,已不再適合現(xiàn)代的軟件開發(fā)模式,幾乎被業(yè)界拋棄。偶而被人提起,都屬于被貶對象,未被留一絲惋惜。但我們應該認識到,“線性”是人們最容易掌握并能熟練應用的思想方法。當人們碰到一個復雜的“非線性”問題時,總是千方百計地將其分解或轉化為一系列簡單的線性問題,然后逐個解決。一個軟件系統(tǒng)的整體可能是復雜的,而單個子程序總是簡單的,可以用線性的方式來實現(xiàn),否則干活就太累了。線性是一種簡潔,簡潔就是美。當我們領會了線性的精神,就不要再呆板地套用線性模型的外表,而應該用活它。例如漸增式模型實質就是分段的線性模型,如圖1.3所示。螺旋模型則是接連的彎曲了的線性模型。在其它模型中都能夠找到線性模型的影子。
套用固定的模型不是程序員的聰明之舉。比如“程序設計”與“測試”之間的關系,習慣上總以為程序設計在先,測試在后,如圖1.4(a)所示。而對于一些復雜的程序,將測試分為同步測試與總測試更有效,如圖1.4(b)所示。
不論是什么軟件工程模型,總是少不了圖1.1中的各個環(huán)節(jié)。本書擗開具體的軟件工程模型,順序講述人員管理、項目管理、可行性與需求分析、系統(tǒng)設計、程序設計、測試,以及維護與再生工程。其中程序設計部分以C++/C語言為例。
四、軟件體系結構和工具的選擇
軟件體系結構表示了一個軟件系統(tǒng)的高層結構,主要特點有:1)軟件系統(tǒng)結構是一個高層次上的抽象,它并不涉及具體的系統(tǒng)結構(比如B/S還是C/S),也不關心具體的實現(xiàn)。2)軟件體系結構必須支持系統(tǒng)所要求的功能,在設計軟件體系結構的時候,必須考慮系統(tǒng)的動態(tài)行為。3)在設計軟件體系結構的時候,必須考慮有現(xiàn)有系統(tǒng)的兼容性、安全性和可靠性。同時還要考慮系統(tǒng)以后的擴展性和伸縮性。所以有時候必須在多個不同方向的目標中進行決策。
當前已經(jīng)有一些關于規(guī)范化軟件體系結構,比如:ISO的開放系統(tǒng)互聯(lián)模型、X Window系統(tǒng)等等。軟件系統(tǒng)的結構通常被定義為兩個部分:一個是計算部件。另一個就是部件之間的交互。如果把軟件系統(tǒng)看成一幅圖的話,計算部件就是其中的節(jié)點,而部件之間的交互就是節(jié)點之間的弧線。部件之間的連接可以被認為是一種連接器,比如過程調用、事件廣播、數(shù)據(jù)庫查詢等等。正確的體系結構設計是軟件系統(tǒng)成功的關鍵。
我們理解了軟件工程的重要性以后,我們沒有相應的工具,我們也很難很好的完成一個系統(tǒng)。在需求分析和設計階段,我們需要什么樣的工具呢?
當然最好是基于UML的CASE工具。當前比較流行的就是Rose,它是一個很好的分析和建立對象和對象關系的工具。在具體編碼的時候,我們需要版本控制工具,MS的SourceSafe就是一個很好的版本管理工具和項目管理工具。具體的開發(fā)工具當然很多,但是如果你是一個對VC侵淫了多年的程序員,你一定會選擇它,因為它會讓你感到什么是真正的面向對象的編程,而你在用VB,PowerBuilder,Delphi時很少會有同樣的感受。至于數(shù)據(jù)庫模式構建,我一向是采用Sybase的S-Design,更好的工具就不知道了。
另外需要注意的是,我們需要建立文檔編寫的若干模板,以便開發(fā)人員按照這個模板編寫規(guī)范的技術和說明文檔。幫助文檔可以用微軟的HTML Help Workshop(hhw.exe)制作,你也可以編譯成.chm格式,它打包了文本和圖形,只有一個文件,使用和分發(fā)比較方便。最后,如果開發(fā)人員不是集中在一個地方的話,最好建立一個郵件列表,開發(fā)人員可以通過郵件系統(tǒng)討論開發(fā)中的各項事宜。
五、軟件開發(fā)方法綜述
國外大的軟件公司和機構一直在研究軟件開發(fā)方法這個概念性的東西,而且也提出了很多實際的開發(fā)方法,比如:生命周期法、原型化方法、面向對象方法等等。下面介紹幾種流行的開發(fā)方法:
1、結構化方法
結構化開發(fā)方法是由E.Yourdon 和 L.L.Constantine 提出的,即所謂的SASD 方 法, 也可稱為面向功能的軟件開發(fā)方法或面向數(shù)據(jù)流的軟件開發(fā)方法。Yourdon方法是80年代 使用最廣泛的軟件開發(fā)方法。它首先用結構化分析(SA)對軟件進行需求分析,然后用結構化設計(SD)方法進行總體設計,最后是結構化編程(SP)。它給出了兩類典型的軟件結構(變換型和事務型)使軟件開發(fā)的成功率大大提高。
2、面向數(shù)據(jù)結構的軟件開發(fā)方法
Jackson方法是最典型的面向數(shù)據(jù)結構的軟件開發(fā)方法,Jackson方法把問題分解為可由三種基本結構形式表示的各部分的層次結構。三種基本的結構形式就是順序、選擇和重復。三種數(shù)據(jù)結構可以進行組合,形成復雜的結構體系。這一方法從目標系統(tǒng)的輸入、輸出數(shù)據(jù)結構入手,導出程序框架結構,再補充其它細節(jié),就可得到完整的程序結構圖。這一方法對輸入、輸出數(shù)據(jù)結構明確的中小型系統(tǒng)特別有效,如商業(yè)應用中的文件表格處理。該方法也可與其它方法結合,用于模塊的詳細設計。
3、 面向問題的分析法
PAM(Problem Analysis Method)是80年代末由日立公司提出的一種軟件開發(fā)方法。 它的基本思想是考慮到輸入、輸出數(shù)據(jù)結構,指導系統(tǒng)的分解,在系統(tǒng)分析指導下逐步綜 合。這一方法的具體步驟是:從輸入、輸出數(shù)據(jù)結構導出基本處理框;分析這些處理框之間的先后關系;按先后關系逐步綜合處理框,直到畫出整個系統(tǒng)的PAD圖。這一方法本質上是綜合的自底向上的方法,但在逐步綜合之前已進行了有目的的分解,這個目的就是充分考慮系統(tǒng)的輸入、輸出數(shù)據(jù)結構。PAM方法的另一個優(yōu)點是使用PAD圖。這是一種二維樹形結構圖,是到目前為止最好的詳細設計表示方法之一。當然由于在輸入、輸出數(shù)據(jù)結構與整個系統(tǒng)之間同樣存在著鴻溝,這一方法仍只適用于中小型問題。
4、原型化方法
產(chǎn)生原型化方法的原因很多,主要隨著我們系統(tǒng)開發(fā)經(jīng)驗的增多,我們也發(fā)現(xiàn)并非所有的需求都能夠預先定義而且反復修改是不可避免的。當然能夠采用原型化方法是因為開發(fā)工具的快速發(fā)展,比如用VB,DELPHI等工具我們可以迅速的開發(fā)出一個可以讓用戶看的見、摸的著的系統(tǒng)框架,這樣,對于計算機不是很熟悉的用戶就可以根據(jù)這個樣板提出自己的需求。
開發(fā)原型化系統(tǒng)一般由以下幾個階段:
(1) 確定用戶需求
(2) 開發(fā)原始模型
(3) 征求用戶對初始原型的改進意見
(4) 修改原型。
原型化開發(fā)比較適合于用戶需求不清、業(yè)務理論不確定、需求經(jīng)常變化的情況。當系統(tǒng)規(guī)模不是很大也不太復雜時采用該方法是比較好的。
5、面向對象的軟件開發(fā)方法
當前計算機業(yè)界最流行的幾個單詞就是分布式、并行和面向對象這幾個術語。由此可以看到面向對象這個概念在當前計算機業(yè)界的地位。比如當前流行的兩大面向對象技術DCOM和CORBA就是例子。當然我們實際用到的還是面向對象的編程語言,比如C++。不可否認,面向對象技術是軟件技術的一次革命,在軟件開發(fā)史上具有里程碑的意義。
隨著OOP(面向對象編程)向OOD(面向對象設計)和OOA(面向對象分析)的發(fā)展,最終形成面向對象的軟件開發(fā)方法OMT (Object Modeling Technique)。這是一種自底向上和自頂向下相結合的方法,而且它以對象建模為基礎,從而不僅考慮了輸入、輸出數(shù)據(jù)結構,實際上也包含了所有對象的數(shù)據(jù)結構。所以OMT徹底實現(xiàn)了PAM沒有完全實現(xiàn)的目標。不僅如此,OO技術在需求分析、可維護性和可靠性這三個軟件開發(fā)的關鍵環(huán)節(jié)和質量指標上有了實質性的突破,基本地解決了在這些方面存在的嚴重問題。
綜上所述,面向對象系統(tǒng)采用了自底向上的歸納、自頂向下的分解的方法,它通過對對象模型的建立,能夠真正建立基于用戶的需求,而且系統(tǒng)的可維護性大大改善。當前業(yè)界關于面向對象建模的標準是UML(Unified Modeling Language)。
這里我們需要談一下微軟的MSF(Microsoft Solutions Framework)的框架,它簡單的把系統(tǒng)設計分成三個階段:概念設計、邏輯設計和物理設計。概念設計階段就是從用戶的角度出發(fā)可以得到多少個對象,并且以對象為主體,畫出業(yè)務框架。邏輯設計階段就是對概念設計階段的對象進行再分析、細分、整合、刪除。并建立各個對象的方法屬性以及對象之間的關系。而物理設計實際上就是要確定我們實際需要的組件、服務和采用的框架結構、具體的編程語言等。MCF整個結構比較清楚是基于對象開發(fā)的一個比較好的可操作的框架系統(tǒng)。
6、可視化開發(fā)方法
其實可視化開發(fā)并不能單獨的作為一種開發(fā)方法,更加貼切的說可以認為它是一種輔助工具,比如用過SYBASE的S-Design的人都知道,用這個工具可以進行顯示的圖形化的數(shù)據(jù)庫模式的建立,并可以導入到不同的數(shù)據(jù)庫中去。當然用過S-Design的人不一定很多,但用過VB,DELPHI,C++ Builder等開發(fā)工具的人一定不少,實際上你就是在使用可視化開發(fā)工具。
當然,不可否認的是,你只是在編程這個環(huán)節(jié)上用了可視化,而不是在系統(tǒng)分析和系統(tǒng)設計這個高層次上用了可視化的方法。實際上,建立系統(tǒng)分析和系統(tǒng)設計的可視化工具是一個很好的賣點,國外有很多工具都致力于這方面產(chǎn)品的設計。比如Business Object就是一個非常好的數(shù)據(jù)庫可視化分析工具。
可視化開發(fā)使我們把注意力集中在業(yè)務邏輯和業(yè)務流程上,用戶界面可以用可視化工具方便的構成。通過操作界面元素,諸如菜單、按鈕、對話框、編輯框、單選框、復選框、 列表框和滾動條等,由可視開發(fā)工具自動生成應用軟件。
六、怎樣培養(yǎng)軟件工程的思維與方法
作為軟件開發(fā)人員的一個通病是在項目初期的時候,就喜歡談論實現(xiàn)的細節(jié),并且樂此不疲。我們更喜歡討論如何用靈活而簡短的代碼來實現(xiàn)一個特定的功能,而忽略了對整個系統(tǒng)架構的考慮。所以作為一個開發(fā)人員,尤其是一個有經(jīng)驗的開發(fā)人員,應該把自己從代碼中解脫出來,更多的時候在我們的腦子里甚至暫時要放棄去考慮如何實現(xiàn)的問題,而從項目或產(chǎn)品的總體去考慮一個軟件產(chǎn)品。
以下是我個人的一些經(jīng)驗:
1.考慮整個項目或者產(chǎn)品的市場前景。作為一個真正的系統(tǒng)分析人員,不僅要從技術的角度來考慮問題,而且還要從市場的角度去考慮問題。也就是說我們同時需要考慮我們產(chǎn)品的用戶群是誰,當我們產(chǎn)品投放到市場上的時候,是否具有生命力。比如即使我們采用最好的技術實現(xiàn)了一個單進程的操作系統(tǒng),其市場前景也一定是不容樂觀的。
2.從用戶的角度來考慮問題。比如一些操作對于開發(fā)人員來講是非常顯而易見的問題。但是對于一般的用戶來說可能就非常難于掌握,也就是說,有時候,我們不得不在靈活性和易用性方面進行折中。另外,在功能實現(xiàn)上,我們也需要進行綜合考慮,盡管一些功能十分強大,但是如果用戶幾乎不怎么使用它的話,就不一定在產(chǎn)品的第一版的時候就推出。從用戶的角度考慮,也就是說用戶認可的才是好的,并不是開發(fā)人員覺的好才好。
3.從技術的角度考慮問題。雖然技術絕對不是唯一重要的,但是技術一定是非常重要的,是成功的必要環(huán)節(jié)。在產(chǎn)品設計的時候,必須考慮采用先進的技術和先進的體系結構。比如,如果可以采用多線程進行程序中各個部分并行處理的話,就最好采用多線程處理。在Windows下開發(fā)的時候,能夠把功能封裝成一個單獨的COM構件就不作成一個簡單的DLL或者是以源代碼存在的函數(shù)庫或者是對象。比如能夠在B/S結構下運行并且不影響系統(tǒng)功能的話就不一定要在C/S下實現(xiàn)。
4.合理進行模塊的分割。從多層模型角度來講,一般系統(tǒng)可以分成用戶層、業(yè)務層和數(shù)據(jù)庫層三部分。當然每以部分都還可以進行細分。所以在系統(tǒng)實現(xiàn)設計的時候,盡量進行各個部分的分割并建立各個部分之間進行交互的標準。并且在實際開發(fā)的時候,確實有需要的話再進行重新調整。這樣就可以保證各個部分齊頭并進,開發(fā)人員也可以各施其職。
5.人員的組織和調度。這里很重要的一點是到考慮人員的特長,有的人喜歡做界面,有的人喜歡做核心。如果有可能要根據(jù)人員的具體的情況進行具體的配置。同時要保證每一個開發(fā)人員在開發(fā)的時候首先完成需要和其他人員進行交互的部分,并且對自己的項目進度以及其他開發(fā)人員的進度有一個清晰的了解,保證不同部分的開發(fā)人員能夠經(jīng)常進行交流。
6.開發(fā)過程中文檔的編寫。在開發(fā)過程中會碰到各種各樣的問題和困難,當然還有各種各樣的創(chuàng)意和新的思路。應該把這些東西都記錄下來并進行及時整理,對于困難和問題,如果不能短時間解決的,可以考慮采用其他的技術替代,并在事后做專門的研究。對于各種創(chuàng)意,可以根據(jù)進度計劃安排考慮是在本版本中實現(xiàn)還是在下一版本中實現(xiàn)。
7.充分考慮實施時可能遇到的問題。開發(fā)是一回事情,用戶真正能夠使用好它又是另外一回事情。比如在MIS系統(tǒng)開發(fā)中,最簡單的一個問題就是用戶如果數(shù)據(jù)輸入錯誤的時候,如何進行操作。在以流程方式工作的時候,如何讓用戶理解自己在流程中的位置和作用,如何讓用戶真正利用計算機進行協(xié)作也是成敗的關鍵。
以上是我個人的一點體會,實際上,作為一個軟件開發(fā)人員,我也喜歡看到問題就坐在計算機前面直接編碼,但是我確實認為軟件工程對于我們系統(tǒng)開發(fā)的指導作用是巨大的。作為軟件工程的擁戴者,下面我簡單結合自己的開發(fā)經(jīng)歷介紹基于軟件工程的開發(fā)方法、編程規(guī)范和工具使用等方面的問題。
七、軟件開發(fā)的發(fā)展變化
國外很多項目的開發(fā)都是基于一些圖形化的東西來做的,他們的目的是盡量少寫代碼甚至不寫代碼。代碼能夠通過圖形化的方式自動生成,這樣的一個好處就是如果用戶的需求變化或者業(yè)務邏輯發(fā)生變化,我們需要做的就是對圖形表示的調整,然后重新自動生成代碼,這也就是國外開發(fā)很注重對項目的概念和邏輯分析的原因。
他們的重點是把業(yè)務規(guī)則和需求用圖形化的方式表現(xiàn)出來,然后通過CASE工具自動生成代碼。所以當國人還在不停的開發(fā)一個又一個的MIS工具的時候,國外已經(jīng)把很多精力放到了CASE工具的制作上。
我們很多公司人員忙著寫具體業(yè)務過程的相關代碼,而國外很多都把精力放到對不同應用,不同行業(yè)的模型的建立和共性的提取上。所以,他們做出來的東西就相對具有很強的靈活性和擴展性,而我們是用戶的需求稍微有一點變化,就要忙著改代碼,甚至改體系結構。
另外,因為他們注重模型的建立,所以在建立其他應用的時候,能夠借鑒原先的模型,在高層次上做調整和優(yōu)化,同時能夠有效的提取原有系統(tǒng)中可以被使用的部分。所以我們應該從以代碼為核心的軟件開發(fā)模式轉化到以模型為中心的、基于CASE的開發(fā)上來。
關于協(xié)作與個人英雄主義
社會進步的一個很明顯的現(xiàn)象就是社會分工越來越細,軟件的開發(fā)也不例外。為什么在軟件開發(fā)的今天已經(jīng)不能出現(xiàn)象裘伯君這樣的軟件英雄的原因也在這里,單憑個人之力,我們也許窮盡有生之年也開發(fā)不出象Windows這樣的操作系統(tǒng)。
因為,當前軟件行業(yè)的壁壘無非就是兩個,一個就是以技術創(chuàng)新取勝,你模仿的了其中的界面,但是你沒有辦法實現(xiàn)其中的核心功能。結果是你只能購買其技術核心,而你作一些邊角工作。不舉別的例子,比如VB這樣的開發(fā)工具,其核心部分是它和第三方提供的COM控件或者是DLL函數(shù)庫,你所做的就是一個整合的工作。
第二個就是以細致取勝,也就是說功能很多而且做的很精致,即使技術本身不是很復雜,你真要想做出一個這樣的東西來沒有一兩年的工夫是不可能的。而真等你做出來了,它的新版本也早已經(jīng)推出。真正能夠在市面上叫得想、經(jīng)得起考驗得產(chǎn)品都是具有這兩方面的特點。
這兩方面的特點決定了你一個人絕對是不可能勝任的,也許你可以獨立的完成技術創(chuàng)新,但是你絕對不可能一個人實現(xiàn)所有這些紛繁復雜的功能。所以,這個時代需要創(chuàng)新的英雄,也更需要人與人之間的協(xié)作。
當今的軟件發(fā)展已經(jīng)不是一個人可以包打天下的年代。軟件開發(fā)的管理、系統(tǒng)體系結構的設計、模塊之間的銜接、核心算法的實現(xiàn)、靈活界面的制定、軟件再開發(fā)接口的實現(xiàn)都需要專門的人來做。而把這些有效的集成顯然就需要有效的利用軟件工程的思想和方法。所以,真正的軟件英雄絕對不再是寫著別人看不懂代碼的程序員,而是整個體系結構的分析、設計、標準制定、協(xié)調人員。
八、我們是否需要軟件工程
有一點大家可以達成共識的就是,如果一個象Windows這樣的操作系統(tǒng),不進行全面的規(guī)劃,不采用軟件工程的思想和方法,是絕對搞不出來的。
Windows的成功不在于它在進程管理和調度,文件系統(tǒng)、內(nèi)存管理、界面設計等方面有多少成功的創(chuàng)新,它的成功最大的一點就是把所有的技術能夠合理的整合起來,并集中到一個Window操作系統(tǒng)特有的框架結構中去。
更為重要的是,Windows的每一項技術創(chuàng)新都能夠有效的整合到Windows框架中去,比如COM、XML等技術,通過ActiveX、DCOM等技術使Windows從桌面操作系統(tǒng)發(fā)展成為一個基于網(wǎng)絡的操作系統(tǒng)。
OLE2技術把整個Office中相關的軟件進行了有效的整合,顯然,這里我們可以把Office的設計和WPS的設計進行比較,客觀的講,WPS對中國用戶來說實在也是一個很好的產(chǎn)品。但是從整個系統(tǒng)設計概念上來講,Office顯然要比WPS高一個層次,它能夠把WORD,EXCEL,POWERPOINT,ACCESS有效的整合在一起,使我們所有辦公相關的文檔、圖表、數(shù)據(jù)庫、演示變成了一個一體化的東西。而且通過宏調用,用戶可以自己定制用戶界面并編制適當?shù)哪0?,單是這個二次開發(fā)功能就不是WPS現(xiàn)在所能及項背的,當然限于當前用戶的水平還很少有人使用二次開發(fā)的功能。
從微軟產(chǎn)品系列可以看到軟件工程的作用,微軟的所有產(chǎn)品都有一個整體的框架結構,比如Office軟件,通過OLE技術進行有效的通訊和聯(lián)系。比如Visual系列開發(fā)工具,提供了相似的開發(fā)界面使用戶學會一種開發(fā)工具以后能夠很容易的學習其他的開發(fā)工具。比如SQL SERVER和ACCESS,盡管它們適用的范圍不同,但是它們表現(xiàn)給用戶的界面,特別是在查詢和分析上表現(xiàn)了高度的一致性。
更值得一提的是,因為設計結構的合理性,因為在開發(fā)前期作了很多分析和調研,考慮了擴展性和伸縮性,微軟的系列產(chǎn)品能夠很快的利用新的技術并采用統(tǒng)一的結構形式表現(xiàn)出來。比如當網(wǎng)絡成為計算機發(fā)展的主流的時候,幾乎微軟所有的工具都能夠快速的支持基于網(wǎng)絡的開發(fā)和應用。
相比之下,我們國內(nèi)很多公司的產(chǎn)品很少具有連續(xù)性,往往是新的一個產(chǎn)品完全重起爐灶,和老的產(chǎn)品沒有半點關系。這就是我們在設計產(chǎn)品的時候,沒有很好的進行抽象和概念、邏輯設計,造成的結果是從舊的產(chǎn)品中提取不出一些有用的、共性的東西為后來的產(chǎn)品所使用。
當然,很多開發(fā)人員從心里也承認一個大的系統(tǒng)確實需要軟件工程的依托,但是一個小的工程項目是否就可以倉促上馬呢?答案是否定的。所謂麻雀碎小,五臟俱全。無論是大項目、還是小項目。它們作為一個項目,都需要有一個需求分析、系統(tǒng)結構建立、設計、編碼、測試等階段。這是任何一個項目都不可缺少的。
往往可以看到很多大公司的IT部門的人員都在不停的作各種各樣的報表,當各個部門提出一種新類型的報表的時候,就從數(shù)據(jù)庫中提取相應的數(shù)據(jù)并畫出業(yè)務人員所需要的樣式結構,很少是提供了一個通用的模板,當然提供高層API接口進行這種操作的就更少了。這樣不可避免的使開發(fā)人員陷入一些瑣碎的報表編制工作。而造成這個局面的很重要的一個原因就是沒有在系統(tǒng)開發(fā)的前期進行很好的調研、需求分析和系統(tǒng)體系結構的設計。
這里就我們開發(fā)過的一些小型軟件項目來談一些開發(fā)的總結和體會,一般來說,小型軟件項目功能比較單一,而且模塊與模塊之間的銜接不是很多,同時對開發(fā)周期要求比較短。
小項目雖然看起來比較簡單,所以很多開發(fā)人員容易犯一些錯誤,記得我們在開發(fā)一個基于Internet的有償服務系統(tǒng)的時候,有三個開發(fā)人員:一個負責前端界面的編寫,一個負責數(shù)據(jù)通訊協(xié)議和實現(xiàn)(基于TCP基礎上的應用協(xié)議),一個負責對數(shù)據(jù)庫數(shù)據(jù)的查詢、整理和提取。我們在開發(fā)的時候沒有認真地進行項目實際前途和工作量的估計。沒有認真地估計項目難度,比如對于通訊中多用戶并發(fā)訪問時的多線程問題和緩存處理問題,用戶批量請求處理的實現(xiàn)復雜度問題等等。三個人之間的接口也是在開發(fā)中休息的時候,口頭定義一下。結果發(fā)現(xiàn)有不嚴密的地方(比如在通訊服務器端是用VC編寫的,開發(fā)人員是通過stream來傳送數(shù)據(jù)的,客戶端是用Delphi編寫,在接收數(shù)據(jù)的時候發(fā)現(xiàn)數(shù)據(jù)不準確,后來研究發(fā)現(xiàn)VC利用CSocket在傳送數(shù)據(jù)流的時候對數(shù)據(jù)進行了自己定義的格式化,結果服務器端數(shù)據(jù)發(fā)送模塊只好重寫),而且其中關于一個接口雙方的理解不同,然后又返工重新修改。最后到系統(tǒng)基本完成的時候沒有一份較正式的文檔。然后因為有人畢業(yè)離開這個項目,然后他編寫的模塊需要升級,新的接收的人不得不花很多時間去閱讀他的源代碼。
所以在開發(fā)小項目的時候也必須要建立合理的模式:而所謂合理的模式就是軟件工程告訴我們的在開發(fā)一個項目的時候所需要的五步曲:獲取需求、需求分析、設計、編碼、測試。
1.理解用戶真正的需求。在進入正式開發(fā)之前,必須先從用戶處獲取準確的需求。在這上面花費相當時間是很必要的。
我們軟件項目可以大致分為專用軟件和通用軟件兩大類。對于專用軟件,一般用戶對于軟件要完成哪些功能已經(jīng)有了一個比較清楚的輪廓,而且往往在開發(fā)合同中已經(jīng)大致地規(guī)定了。
但是,開發(fā)合同上規(guī)定的只是一個大概的框架,在進入開發(fā)之前必須與用戶進行比較具體的交流和討論,了解清楚用戶心目中的產(chǎn)品究竟是什么樣子,這里最好就采用原型化的方法作出一個簡單的框架給用戶看。
對于通用軟件,在開發(fā)之前必須做一定的市場調查工作,一方面是從經(jīng)濟效益考慮,調查產(chǎn)品的潛在市場有多大,一方面是從技術的角度,了解清楚潛在用戶對軟件的各種技術上的要求,另一方面是確定我們軟件的定位,即我們軟件具體是為哪一些用戶群體服務的。然后對該群體用戶現(xiàn)有硬件配置,軟件配置,網(wǎng)絡使用情況,數(shù)據(jù)庫使用情況,計算機熟悉程度做一定的調研,根據(jù)調查的統(tǒng)計結果決定即將開發(fā)的軟件的一些技術指標。
2.需求分析。需求分析需要做的事情有:高層構思、確立系統(tǒng)目標、劃分業(yè)務領域、現(xiàn)行業(yè)務分析、建立業(yè)務模型(Enterprise Model)、信息需求分析、用戶視圖規(guī)范化、數(shù)據(jù)元素標準化與一致性控制。
在了解用戶的需求之后,將需求用一種模型來表示,就是需求分析,一般我們可以面向對象的方法,通過分析用戶需求,用類、類之間的各種關系來表示整個系統(tǒng)。
為了討論軟件運行的流程,可以采用UML的Use Case圖。在系統(tǒng)分析的時候需要明確應用域(application domain)的范圍,然后明確我們系統(tǒng)需要做什么。同時我們需要決定用什么方法來完成需求的獲取,這在很大程度上影響了需求分析的做法。
例如可以采用Use Case來表示用戶需求,那么從各種序列圖中選出相互交互的各個實體,就是一個個類。另外分析需要與設計過程相銜接。分析過程的內(nèi)容是用對象和對象之間的關系來表示整個系統(tǒng)和系統(tǒng)的流程的,并不設計具體實現(xiàn),如采用什么編程語言,在什么操作系統(tǒng)平臺上運行等等。這些具體實現(xiàn)是在設計階段來完成的。
面向對象方法的優(yōu)點是分析、設計、編碼過程表示法統(tǒng)一,能比較好的銜接?,F(xiàn)在很多CASE工具并不區(qū)分分析和設計的階段。但是,這并不意味著開發(fā)就可以對分析和設計不加區(qū)分,如何用好輔助設計(case)工具還是開發(fā)人員的事情。
3.設計過程。設計階段的工作包括對分析模型進行必要的修改,同時可能需要對某些類結構做一些修改,確定用戶表示層(也就是通俗所說的界面定義)、用戶服務層、業(yè)務邏輯層、數(shù)據(jù)庫服務層和具體數(shù)據(jù)庫所需要做的工作。同時需要確定使用的體系結構(比如B/S還是C/S)和開發(fā)工具(如VB,VC,VI,C++ Builder,DELPHI,PowerBuiler等等)
4.編碼。進入編碼工作之后,依然可能會發(fā)現(xiàn)前面分析或設計階段的某些錯誤,這時應返回到前面的階段進行必要的修改。同時在編碼前規(guī)定編碼的風格并在開發(fā)過程中保持一致的風格。
5.測試。測試是系統(tǒng)投入使用前最關鍵的一個步驟。即使是小項目也應該嚴格地進行測試。就實際上就是一個把錯誤留給自己還是留給客戶的問題。
最后,我們知道軟件項目主要是由開發(fā)人員完成的,所以對人員的合理安排和配置也很重要,一般在開發(fā)過程中,需要有一位項目負責人,負責分析、設計和協(xié)調的工作。另外需要幾個程序員完成不同層的代碼(比如用戶服務層、業(yè)務邏輯層、數(shù)據(jù)庫服務層等等)。
同時需要有一個文檔整理人員隨時整理系統(tǒng)開發(fā)過程中相關的文檔。如果條件可能的話,要配置一個測試工程師,專門進行代碼的測試工作,當然如果條件不允許的話,也可以由開發(fā)人員交叉測試。這里需要注意的是,對于項目負責人而言,協(xié)調幾個人的工作比自己完成一段編碼更重要。
由于協(xié)調上出了漏洞,可能導致很大的問題,所以項目負責人必須隨時監(jiān)控各開發(fā)人員的工作,包括內(nèi)容是否與要求發(fā)生偏差,進度是否滯后等等。同時必須給每個開發(fā)人員明確的任務書。具體開發(fā)時每個開發(fā)人員必須非常明確自己的任務,這些任務應該采用明確的文檔來表示。每個開發(fā)人員需要清楚自己所做的工作在整個系統(tǒng)中處于什么地位,這樣就有可能會發(fā)現(xiàn)設計模型中的漏洞,避免了各人的代碼編寫完畢之后又要修改的后果。
九、我國軟件工程發(fā)展的現(xiàn)狀
很多國內(nèi)搞計算機的專家都認為:國內(nèi)的軟件研發(fā)過程,個人色彩比較濃。過分地依靠個人無法形成產(chǎn)業(yè)規(guī)模,而沒有規(guī)模就談不上產(chǎn)業(yè)化了。
不管怎么樣,我們大家還是先要來看一看國內(nèi)軟件廠商到底提供給我們多少有震撼力的軟件產(chǎn)品,從技術和利潤的角度講,軟件系統(tǒng)最核心的部分還是操作系統(tǒng)、編譯系統(tǒng)然后就是開發(fā)平臺之類的東西,接下來就是一些應用系統(tǒng),比如圖形開發(fā)、游戲開發(fā)、企業(yè)應用、網(wǎng)站建設、殺毒、網(wǎng)絡工具等等。
操作系統(tǒng)以中科院為中心,做了一個COSIX,這個本質上是一個UNIX系統(tǒng),UNIX最初的源代碼是公開的,盡管COSIX是一個被稱為中國的操作系統(tǒng)并是UNIX系列的(IX就代表UNIX系列),但是其中到底有多少獨創(chuàng)的技術成分我們暫時還不知道,但有一點可以肯定,它現(xiàn)在的市場覆蓋率絕對不大,而且能否在上面運行各種各樣的編譯系統(tǒng)、數(shù)據(jù)庫、群件和應用系統(tǒng)可能還需要進一步測試。然后就是對硬件平臺的支持也需要進一步完善。
然后就是轟轟烈烈的Linux系統(tǒng),Linux是遵守GNU標準的操作系統(tǒng),中國有很多家公司推出了自己的Linux并且還有漢化的Linux,這就有比較疑惑的一點,為什么不在Linux上構架一個類似UNICODE這樣的東西,而只做漢化這么本地化的產(chǎn)品呢?不知道是眼光還是市場的問題了。
MIS系統(tǒng)、財務軟件是中國軟件行業(yè)的重頭戲,它們徹底的暴露了中國軟件開發(fā)無序和重復低效勞動的一面。教育軟件在某一種層面上看就是電子題庫,當然也有優(yōu)點,比如加入了多媒體教學(可視化程度不錯)和所謂寓教于樂的特點,但是從本質上說還是題庫。殺毒軟件據(jù)說是中國軟件的驕傲,由中國權威機構評測是達到了世界領先水平,但是好象還沒有得到國際權威機構的認可。游戲軟件就不用提了,國內(nèi)業(yè)界能夠流行的游戲軟件成功的秘訣眾所周知,不是技術和創(chuàng)意,實在是歸功于我們悠久的歷史。字處理軟件和排版軟件客觀的說國內(nèi)的也做的不錯,但是從系統(tǒng)的擴展性和體系結構上說和MS和Adobe相比,差距也放在那里。其實這種現(xiàn)狀的原因很簡單,一個是我們?nèi)鄙賱?chuàng)新的能力,另一個就是我們欠缺軟件工程的概念,系統(tǒng)開發(fā)前期的需求分析、設計沒有做好或者做的不夠好。
當然,我們很少懷疑自己的技術能力,我們很多時候認為這是地理環(huán)境和經(jīng)濟環(huán)境的原因造成了中國軟件業(yè)現(xiàn)在的局面。當然中國軟件開發(fā)人員絕對可以算是優(yōu)秀的,但是想想我們軟件行業(yè)龍頭企業(yè)到底有多少有技術創(chuàng)新和專利技術呢?姑且不論這個,實際上把一個操作系統(tǒng)分解開來,比如文件系統(tǒng)、進程管理和調度、IO調度等等,也許我們可以實現(xiàn)其中某一塊的內(nèi)容,但是如何把它們合理的整合起來絕對是一個涉及到軟件工程的問題。
作為一個開發(fā)人員,我們已經(jīng)習慣了自己那一套編程模式,而且我們的這種習慣也不自覺的影響著新的開發(fā)人員。所以在頭腦中建立一個軟件工程的作用,從某種角度上講,要比會幾種開發(fā)語言、幾個編程技巧實在是重要的多。
舉一個例子來說,我們也許可以寫MFC中的幾個類或者是用自己的類擴展MFC,但是我們又有幾個人真正去認真分析和考慮MFC架構的設計和原理呢?捫心自問,我們又有多少人能夠設計出MFC這樣的框架系統(tǒng)呢?下面就我們的題目談一些相關的話題。
十、我有一個夢
毋庸質疑的是,計算機的發(fā)展和人類的歷史相比甚至和其他很多科技產(chǎn)品相比都是非常短的,從第一臺計算機的研制成功到現(xiàn)在也沒有百年的歷史,但是計算機及其相關技術的發(fā)展卻絕對可以說是最快的。拋開硬件的發(fā)展(硬件的發(fā)展基本上是按照摩爾定律來的,每18個月,機器的速度性能都要提高一倍),單從軟件的發(fā)展來說,從體系結構來講,我們經(jīng)歷了從主機結構到文件服務器結構,從客戶服務器系統(tǒng)到基于Internet的服務器瀏覽器結構的體系結構的變化。從編碼的角度來講,我們經(jīng)歷了從最開始的機器代碼到匯編代碼,從高級程序語言到人工智能語言,從專用的程序設計語言到通用的程序設計語言。從開發(fā)工具來講,我們經(jīng)歷了從分離的開發(fā)工具(有代碼編輯器,中間代碼生成器和連接器)到集成的開發(fā)系統(tǒng),從最簡單的單行命令式調試器到方便靈活的多功能的調試器。
但是,今天所有的軟件廠商和軟件開發(fā)人員依然會想起當年的黑人人權運動領袖馬丁?路德?金曾經(jīng)說過的一句名言我有一個夢想。是的,所有的開發(fā)人員依然懷著夢想,希望能夠有一個萬能的系統(tǒng)開發(fā)的框架和方法,只要我們沿著這個框架,我們將能開發(fā)出適合所有領域的應用系統(tǒng),于是,我們在念書的時候把這個希望投到了一門課上,這么課就是軟件工程。但是當我們在學完這門課的時候,我們依然沒有找到這么一個框架甚至連接近這么一個框架的東西也沒有碰到。
不管我們認為軟件工程可能是多么的虛無,但是所有學工科并且有邏輯頭腦的人都堅信理論對實踐的指導意義,因為有了愛因斯坦及其許多偉大的科學家關于能量和質量方面的理論以后,我們才造出了原子彈。但是,遺憾的是軟件工程并不是一個具體的理論,它更象一門抽象的科學。軟件工程是一種方法論,而不是一種具體的摸的著,看的見的產(chǎn)品。它告訴我們在設計一個系統(tǒng)的時候,我們需要進行可行性研究、計劃制訂、需求分析、系統(tǒng)設計、編碼、測試、維護等等。并且對這些過程中應該做什么提出了一個指導性的東西。但是沒有任何專家和標準委員會保證只要按照這些標準,我們的系統(tǒng)肯定會順利完成。而且事實上,軟件開發(fā)針對的領域是如此之多并不沒有一種對所有領域適用的萬能框架。
不管認為軟件工程已經(jīng)到了非常成熟的階段還是認為軟件工程依然是一個搞不懂的黑箱子,軟件工程確實已經(jīng)經(jīng)歷了三個不同的階段。第一個階段是軟件結構化生產(chǎn)階段,以結構化分析與設計、結構化評審、結構化程序設計以及結構化測試為特征。從80年代中期,軟件生產(chǎn)開始進入以過程為中心的第二階段,以提出過程成熟模型CMM、個體軟件過程PSP和群組軟件過程TSP為標志。第三個階段就是以軟件過程、面向對象和構件重用三把斧頭出現(xiàn)的軟件工業(yè)化生產(chǎn)階段。
言歸正傳,我們還是回到我們的文章標題上來,我們在開發(fā)的時候是兵馬未動、糧草先行還是摸著石子過河。兵馬未動、糧草先行當然意味著我們在開發(fā)的時候先不忙著編寫代碼做程序,我們先要制訂一個關于開發(fā)的方法。這點就象元數(shù)據(jù)(metadata)的概念,元數(shù)據(jù)并不定義數(shù)據(jù),它是對數(shù)據(jù)的說明,也就是通常所說的關于數(shù)據(jù)的數(shù)據(jù)。我們設計的時候也是這樣,定義開發(fā)的標準,如何進行開發(fā)、怎樣開發(fā)。摸著石子過河就意味著我們先不管什么理論,方法,科學的問題,我們先動手做起來,如果做的也算成功的話,那就可以按照這種模式來,實際上,在任何事情的最初,我們都是這樣。從辨證唯物主義者的觀點來說,就是從實踐中來,然后升華到理論,再用理論來指導實踐。記得一個笑話說:外國人搞軟件工程是在一個黑屋子里面抓黑貓,不過到現(xiàn)在還是沒有抓住,而中國人是在一個黑屋子里面,而里面連貓都沒有,然后有人說,我已經(jīng)抓到貓了。這個笑話一方面是說明直到現(xiàn)在,軟件工程還是一個在繼續(xù)探索、發(fā)展的過程,另一個側面也說明中國搞軟件工程摸不著邊的局面。
實際上,不管有沒有軟件工程,不管是否存在一個萬能的框架系統(tǒng),我們的應用系統(tǒng)還是要做,各種各樣的軟件還是要開發(fā)。說到底,軟件系統(tǒng)是因為有需求才存在的。有了應用域才有了軟件存在的意義。很多時候,我們可以看到國外有各種各樣的軟件和創(chuàng)新,而我們沒有,我們更多的是模仿和一些重復的功能相近的軟件的原因就是因為我們沒有這方面的需求,這也正解釋了為什么ERP系統(tǒng)能在國外開展的很好,而在國內(nèi)失敗多于成功的原因。一方面當然是因為我們的企業(yè)按照市場經(jīng)濟發(fā)展的時間還不長,另一方面是我們的企業(yè)確實也沒有這方面的需求。
十一、軟件工程的發(fā)展方向
“敏捷開發(fā)”(Agile Development)被認為是軟件工程的一個重要的發(fā)展。它強調軟件開發(fā)應當是能夠對未來可能出現(xiàn)的變化和不確定性作出全面反應的。
敏捷開發(fā)被認為是一種“輕量級”的方法。在輕量級方法中最負盛名的應該是“極限編程”(Extreme Programming,簡稱為XP)。而與輕量級方法相對應的是“重量級方法”的存在。重量級方法強調以開發(fā)過程為中心,而不是以人為中心。重量級方法的例子比如CMM/PSP/TSP。