軟體工程學

軟體的學科

軟體工程學,是一門研究用工程化方法構建和維護有效的、實用的和高質量的軟體的學科,它涉及到程序設計語言、資料庫、軟體開發工具、系統平台、標準、設計模式等方面。

目前狀況


在現代社會中,軟體應用於多個方面。典型的軟體比如有電子郵件,嵌入式系統,人機界面,辦公套件,操作系統,編譯器,資料庫,遊戲等。同時,各個行業幾乎都有計算機軟體的應用,比如工業,農業,銀行,航空,政府部門等。這些應用促進了經濟和社會的發展,提高人們的工作效率,同時提升了生活質量。
軟體工程師是對應用軟體創造軟體的人們的統稱,軟體工程師按照所處的領域不同可以分為系統分析員,軟體設計師系統架構師,程序員,測試員等等。人們也常常用程序員來泛指各種軟體工程師。
軟體的開發到底是一門科學還是一門工程,這是一個被爭論了很久的問題。實際上,軟體開發兼有兩者的特點。但是這並不意味著它們可以被互相混淆。
很多人認為軟體工程基於計算機科學和信息科學就如傳統意義上的工程學之於物理和化學一樣。
在美國,大約40%的軟體工程師具有計算機科學的學位。在世界其他地方,這個比例也差不多。他們並不一定會每天使用計算機科學方面的知識,但是他們每天都會使用軟體工程方面的知識。

軟體危機


軟體工程的興起要根源於20世紀60,70和80年代的軟體危機。在那個時代,很多的軟體最後都得到了一個悲慘的結局。很多的軟體項目開發時間大大超出了規劃的時間表。一些項目導致了財產的流失,甚至某些軟體導致了人員傷亡。同時軟體開發人員也發現軟體開發的難度越來越大。
OS 360操作系統被認為是一個典型的案例。到現在為止,它仍然被使用在IBM360系列主機中。這個經歷了數十年,極度複雜的軟體項目甚至產生了一套不包括在原始設計方案之中的工作系統。OS 360是第一個超大型的軟體項目,它使用了1000人左右的程序員。Fred Brooks在隨後他的大作《人月神話》(The Mythical Man-Month)中曾經承認,在他管理這個項目的時候,他犯了一個價值數百萬美元的錯誤。
財產的損失:軟體的錯誤可能導致巨大的財產損失。歐洲阿里亞娜火箭的爆炸就是一個最為慘痛的教訓。
人員傷亡:由於計算機軟體被廣泛應用於包括醫院等與生命息息相關的行業。這也使得軟體的錯誤導致人員傷亡成為了可能。
在軟體工程界被大量引用的案例是Therac-25的意外. 在1985年六月到1987年一月之間, 六個已知的醫療事故來自於Therac-25錯誤地超過劑量, 導致患者死亡或嚴重輻射灼傷。在工業上,某些嵌入式系統導致機器的不正常運轉,從而將一些人推入了險境。

銀彈


從軟體危機被提出以來。人們一直在尋找解決它的方法。於是一系列的方法被提出並且加以應用。比如結構化的程序設計,面向對象的開發,CMM,UML等等。在1986年,IBM大型電腦之父Fred Brooks發表了他的著名論文《沒有銀彈》(No Silver Bullet:Essence and Accidents of Software Engineering)。
在這篇著名的論文中他斷言:“在10年內無法找到解決軟體危機的銀彈”(There will be no silver bullet within ten years)。這篇論文在其後引起了巨大的反響。關於這本論文及其引起的反響,可以參考銀彈與沒有銀彈。
Fred Brooks的著名作品還有《人月神話》

方法學


軟體工程的方法有很多方面的意義。包括項目管理,分析,設計,程序的編寫,測試和質量控制。
軟體設計方法可以區別為重量級的方法和輕量級的方法。重量級的方法中產生大量的正式文檔。
著名的重量級開發方法包括ISO 9000,CMM,和統一軟體開發過程(RUP)。
輕量級的開發過過程沒有對大量正式文檔的要求。著名的輕量級開發方法包括極限編程(XP)和敏捷流程(Agile Processes)。
根據《新方法學》這篇文章的說法,重量級方法呈現的是一種“防禦型”的姿態。在應用“重量級方法”的軟體組織中,由於軟體項目經理不參與或者很少參與程序設計,無法從細節上把握項目進度,因而會對項目產生“恐懼感”,不得不要求程序員不斷撰寫很多“軟體開發文檔”。而輕量級方法則呈現“進攻型”的姿態,這一點從XP方法特彆強調的四個準則—“溝通、簡單、反饋和勇氣”上有所體現。目前有一些人認為,“重量級方法”適合於大型的軟體團隊(數十人以上)使用,而“輕量級方法”適合小型的軟體團隊(幾人、十幾人)使用。當然,關於重量級方法和輕量級方法的優劣存在很多爭論,而各種方法也在不斷進化中。
一些方法論者認為人們在開發中應當嚴格遵循並且實施這些方法。但是一些人並不具有實施這些方法的條件。實際上,採用何種方法開發軟體取決於很多因素,同時受到環境的制約。

軟體開發過程


軟體開發過程是隨著開發技術的演化而隨之改進的。從早期的瀑布式(Waterfall)的開發模型到後來出現的螺旋式的迭代(Spiral)開發,以致最近開始興起的敏捷開發方法(Agile),他們展示出了在不同的時代軟體產業對於開發過程的不同的認識,以及對於不同類型項目的理解方法。
注意區分軟體開發過程和軟體過程改進之間的重要區別。諸如像ISO 15504, ISO 9000, CMM, CMMI這樣的名詞闡述的是一些軟體過程改進框架,他們提供了一系列的標準和策略來指導軟體組織如何提升軟體開發過程的質量、軟體組織的能力,而不是給出具體的開發過程的定義。
軟體開發的過程,現在最流行的是V字模型,由需求分析->概要設計->詳細設計->編碼->單體測試->結合測試->系統測試,最後交貨到維護階段。

發展方向


“敏捷開發”(Agile Development)被認為是軟體工程的一個重要的發展。它強調軟體開發應當是能夠對未來可能出現的變化和不確定性作出全面反應的。
敏捷開發被認為是一種“輕量級”的方法。在輕量級方法中最負盛名的應該是“極限編程”(Extreme Programming,簡稱為XP)。而與輕量級方法相對應的是“重量級方法”的存在。重量級方法強調以開發過程為中心,而不是以人為中心。重量級方法的例子比如CMM/PSP/TSP。面向側面的程序設計(Aspect Oriented Programming,簡稱AOP)被認為是近年來軟體工程的另外一個重要發展。這裡的方面指的是完成一個功能的對象和函數的集合。在這一方面相關的內容有泛型編程(Generic Programming)和模板。