摘要:軟件工程是一門研究用工程化方法構建和維護有效的、實用的和高質量的軟件的學科。軟件工程的目標是提高軟件的質量與生產率,最終實現軟件的工業化生產。它貫徹于軟件開發的整個過程。
關鍵詞:生產效率 結構化 復用 優化
在60年代計算機發展初期,程序設計是少數聰明人干的事。他們的智力與技能超群,編寫的程序既能控制弱智的計算機,又能讓別人看不懂、不會用。那個時期編程就跟捏泥巴一樣隨心所欲,于是他們很過分地把程序的集合稱為軟件,以便自己開心或傷心時再把程序捏個面目全非。人們就在這種美滋滋的感覺下熱情地編程,結果產生了一堆問題:程序質量低下,錯誤頻出,進度延誤,費用劇增……。這些問題導致了“軟件危機”。
在1968年,一群程序員、計算機科學家與工業界人士聚集一起共商對策。通過借鑒傳統工業的成功做法,他們主張通過工程化的方法開發軟件來解決軟件危機,并冠以“軟件工程”這一術語。三十年余年來,盡管軟件的一些毛病如人類的感冒一樣無法根治,但軟件的發展速度超過了任何傳統工業,期間并未出現真真的軟件危機。這的確是前人的先見之明。如今軟件工程成了一門學科。
軟件工程主要講述軟件開發的道理,基本上是軟件實踐者的成功經驗和失敗教訓的總結。軟件工程的觀念、方法、策略和規范都是樸實無華的,平凡之人皆可領會,關鍵在于運用。我們不可以把軟件工程方法看成是諸葛亮的錦囊妙計─—在出了問題后才打開看看,而應該事先掌握,預料將要出現的問題,控制每個實踐環節,并防患于未然。
一、軟件工程目標與常用模型
軟件工程的目標是提高軟件的質量與生產率,最終實現軟件的工業化生產。質量是軟件需求方最關心的問題,用戶即使不圖物美價廉,也要求個貨真價實。生產率是軟件供應方最關心的問題,老板和員工都想用更少的時間掙更多的錢。質量與生產率之間有著內在的聯系,高生產率必須以質量合格為前提。如果質量不合格,對供需雙方都是壞事情。從短期效益看,追求高質量會延長軟件開發時間并且增大費用,似乎降低了生產率。從長期效益看,高質量將保證軟件開發的全過程更加規范流暢,大大降低了軟件的維護代價,實質上是提高了生產率,同時可獲得很好的信譽。質量與生產率之間不存在根本的對立,好的軟件工程方法可以同時提高質量與生產率。
軟件供需雙方的代表能在餐桌上談笑風生,歸功于第一線開發人員的辛勤工作。質量與生產率的提高就指望程序員與程序經理。對開發人員而言,如果非得在質量與生產率之間分個主次不可,那么應該是質量第一,生產率第二。這是因為:(1)質量直接體現在軟件的每段程序中,高質量自然是開發人員的技術追求,也是職業道德的要求。(2)高質量對所有的用戶都有價值,而高生產率只對開發方有意義。(3)如果一開始就追求高生產率,容易使人急功近利,留下隱患。寧可進度慢些,也要保證每個環節的質量,以圖長遠利益。
軟件工程的主要環節有:人員管理、項目管理、可行性與需求分析、系統設計、程序設計、測試、維護等。
軟件工程模型建議用一定的流程將各個環節連接起來,并可用規范的方式操作全過程,如同工廠的生產線。常見的軟件工程模型有:線性模型(圖1),漸增式模型(圖2),螺旋模型,快速原型模型,形式化描述模型等。
最早出現的軟件工程模型是線性模型(又稱瀑布模型)。線性模型太理想化,太單純,已不再適合現代的軟件開發模式,幾乎被業界拋棄。偶而被人提起,都屬于被貶對象,未被留一絲惋惜。但我們應該認識到,“線性”是人們最容易掌握并能熟練應用的思想方法。當人們碰到一個復雜的“非線性”問題時,總是千方百計地將其分解或轉化為一系列簡單的線性問題,然后逐個解決。一個軟件系統的整體可能是復雜的,而單個子程序總是簡單的,可以用線性的方式來實現,否則干活就太累了。線性是一種簡潔,簡潔就是美。當我們領會了線性的精神,就不要再呆板地套用線性模型的外表,而應該用活它。例如漸增式模型實質就是分段的線性模型,如圖2所示。螺旋模型則是接連的彎曲了的線性模型。在其它模型中都能夠找到線性模型的影子。
二、軟件開發的基本策略
人們都有自己的世界觀和方法論,能自然而然地運用于生活和工作中。同樣,程序員腦子里的軟件工程觀念會無形地支配其怎么去做事情。軟件工程三十年的發展,已經積累了相當多的方法,但這些方法不是嚴密的理論。實踐人員不應該教條地套用方法,更重要的是學會“選擇合適的方法”和“產生新方法”。有謀略才會有好的戰術。下面講述軟件開發中的三種基本策略:“復用”、“分而治之”、“優化——折衷”。
復用
復用就是指“利用現成的東西”,文人稱之為“拿來主義”。被復用的對象可以是有形的物體,也可以是無形的成果。復用不是人類懶惰的表現而是智慧的表現。因為人類總是在繼承了前人的成果,不斷加以利用、改進或創新后才會進步。
復用的內涵包括了提高質量與生產率兩者。由經驗可知,在一個新系統中,大部分的內容是成熟的,只有小部分內容是創新的。一般地可以相信成熟的東西總是比較可靠的(即具有高質量),而大量成熟的工作可以通過復用來快速實現(即具有高生產率)。勤勞并且聰明的人們應該把大部分的時間用在小比例的創新工作上,而把小部分的時間用在大比例的成熟工作中,這樣才能把工作做得又快又好。
將具有一定集成度并可以重復使用的軟件組成單元稱為軟構件(Software Component)。軟件復用可以表述為:構造新的軟件系統可以不必每次從零做起,直接使用已有的軟構件,即可組裝(或加以合理修改)成新的系統。復用方法合理化并簡化了軟件開發過程,減少了總的開發工作量與維護代價,既降低了軟件的成本又提高了生產率。另一方面,由于軟構件是經過反復使用驗證的,自身具有較高的質量。因此由軟構件組成的新系統也具有較高的質量。
分而治之
分而治之是指把一個復雜的問題分解成若干個簡單的問題,然后逐個解決。這種樸素的思想來源于人們生活與工作的經驗,完全適合于技術領域。軟件人員在執行分而治之的時候,應該著重考慮:復雜問題分解后,每個問題能否用程序實現?所有程序最終能否集成為一個軟件系統并有效解決原始的復雜問題?
優化——折衷
軟件的優化是指優化軟件的各個質量因素,如提高運行速度,提高對內存資源的利用率,使用戶界面更加友好,使三維圖形的真實感更強等等。想做好優化工作,首先要讓開發人員都有正確的認識:優化工作不是可有可無的事情,而是必須要做的事情。當優化工作成為一種責任時,程序員才會不斷改進軟件中的算法,數據結構和程序組織,從而提高軟件質量。
優化工作的復雜之處是很多目標存在千絲萬縷的關系,可謂數不清理還亂。當不能夠使所有的目標都得到優化時,就需要“折衷”策略。軟件中的折衷策略是指通過協調各個質量因素,實現整體質量的最優。軟件折衷的重要原則是不能使某一方損失關鍵的職能,更不可以象“舍魚而取熊掌”那樣拋棄一方。人都有惰性,如果允許濫用折衷的話,那么一當碰到困難,人們就會用拆東墻補西墻的方式去折衷,不再下苦功去做有意義的優化。所以我們有必要為折衷制定嚴正的立場:在保證其它因素不差的前提下,使某些因素變得更好。
以上就是我個人對軟件工程的一些粗淺看法,軟件工程這門學科還遠未達到完美的境地,我們還需在實踐中不斷摸索與完善。
參考文獻:
Roger S.Pressman ,etc Software Engineering:A Practitioner’s Approach,Sixth Edition