序
軟體工程的新思維與契機
自1955年開始有了軟體產業以來,軟體成為推動世界向前邁進的主要動力之一。1993年,全球IT軟體與服務產值首度超過硬體產值,正式宣告軟體成為資訊科技主軸的時代來臨了。時至今日,不論是我們日常生活所及,或是關於企業與組織的營運,或是在國防與太空科技的發展上,軟體都扮演了不可或缺的角色,主導著各類系統的運作,其對人類影響之深遠與巨大,可說是無遠弗屆。
談到軟體產業,就不能不談到與其息息相關的軟體工程。全世界軟體業發展成熟的國家如歐美、日本及印度等國,不但重視軟體工程,也藉由軟體工程技術與流程改善來發展具有一定品質的系統與產品,讓其軟體產業在世界占有一席之地。
回顧臺灣過去約40年的軟體產業,長久以來一直未能蓬勃發展,目前似乎更已陷入瓶頸。追本溯源,以往臺灣的資訊科系教育偏重程式開發技術(Programming Language Skill),而較不重視流程(Process)、領域知識(Domain Knowledge)、塑模(Modeling)以及品質管控(Quality Control)。在此教育體制下畢業的軟體工程師,大部分依舊著重程式碼的撰寫,相較於歐、美、日等軟體產業成熟的國家,甚或是如印度等軟體代工新興國家,臺灣缺乏應用軟體工程的開發方法,導致所開發出來的軟體品質參差不齊,連帶影響國外大廠對我國軟體產業的信任。
個人認為要提振臺灣的軟體產業,必須要有更寬廣的軟體工程新思維及作法。軟體工程不僅僅是過往大家所著重的程式開發技術,它還包含了流程、塑模與品質等軟體開發的重要觀念。作法上則應從三個層面著手:第一是軟體知識,第二是軟體教育,第三是軟體流程。
在軟體知識部分,必須將軟體知識與領域知識合一。整體產業的未來發展應該要能結合專業領域知識與軟體知識,這又可分為三個層面來談:其一是國內軟體公司雖然具備相當的專業領域知識,但相對而言,軟體知識以及軟體系統整合的能力則較缺乏,因此必須著力提升其軟體方面的知識與能力,才能與原有的領域知識相加相乘,建立更優越的競爭能力;其次是過去數十年來,臺灣擁有相當多扎實、優異的傳統產業,雖然隨著科技與時代進步而逐漸式微或外移,但是如果臺灣的軟體公司能將專業領域擴展至傳統產業,藉由兩者的結合重新賦予傳統產業全新的生命力,而軟體產品服務亦可隨著傳統產業的外移而向外擴展、發光發熱;最後,臺灣軟體產業應與目前在世界占有舉足輕重地位的臺灣硬體系統產業結合,藉此提高嵌入式軟體的開發與測試市場,走出原有的市場窠臼。
產業的源頭在教育及人才,因此在軟體教育方面,須著重於與產業接軌的人才培育。要強健臺灣軟體工程競爭力,除了政府、產業界的投入之外,主要發展的關鍵在於培養全方位的專業人才[LC2011, LLCML2012, McC2009]。過去由於偏重程式開發技術的資訊教育,造成學校畢業生到了業界無法立即投入生產,或是缺乏足夠的戰力,所開發出來的產品品質亦是良莠不齊,以致維護困難。這種現象不但造成高素質人才的斷層,也損耗了業界的生產力與進步動力,形成整個軟體產業的惡性循環,因此軟體人才的培育,實在是刻不容緩的教育大計。個人認為作法上應該在大學的資訊科系提供軟體工程專業學程,強化大型程式碼的閱讀與分析能力,進而精進軟體的設計與實作,提高學生軟體工程的素養,培育產、學、研各界所需的國際水準之人才。
最後在軟體流程方面,應鼓勵學生建立屬於自己的軟體流程,並具備逐步實踐自我流程改善(Process Improvement)的能力,奠定未來加入業界的基礎,以順利銜接到產業界在組織層面的軟體流程,同時也可以對於組織的流程改善提供改良的建議。另外,也需著重在重構流程(Refactor Process)的訓練,針對既有的大型軟體程式碼進行解析,進而套用封裝(Encapsulation)、抽象(Abstraction)與委任(Delegation)的重構流程,讓重構後的程式碼更具彈性,以因應未來的改變。
在軟體產業問世超過半個世紀後的今天,世界各行各業的需求以及人工智慧的成長,已經成為軟體向前邁進的原動力。面對此潮流趨勢的挑戰,我們絕對不能缺席,應該以全新的思維與積極的作法,走出一條不一樣的路,也就是,軟體工程應以服務所有產業為目標,而非僅是局限於軟體產業本身。現實的世界裡,軟體已經跟人類生活緊密連結,舉凡日常生活、生產製造、科技研發、財務金融等各種產業領域,無一不需要軟體。透過軟體工程的全新思維,軟體產業是臺灣全力加碼進入全球競爭的新契機。
筆者撰寫本書的目的,在於提供一個進入軟體工程領域的切入點,引導讀者跳脫以元件的方式看待軟體,而改以流程的方式來看待整個軟體專案。
本書內容共包含10個章節。第1章介紹軟體流程。軟體流程就像演算法一樣,合適的流程讓工程師可以有效率地開發系統,不合適的流程則會延宕專案的進行。組織或開發團隊必須依照自己的特性去設計自己的流程,本章所提供的僅是大架構上的流程模式。目前臺灣與全世界所極力推行的「能力成熟度整合模式」(CMMI)流程改善機制,即是透過定義合適的流程來改善軟體開發的效率與產品的品質,讓軟體開發流程與組織企業文化相融合。
第2章介紹需求工程。需求工程為軟體開發的第一步,是後續設計、開發、實作的基礎。如果定義上出了問題,即使有好的設計與實作能力,終究會產出不合使用者期待的產品或系統。然而,要建立正確的需求並不容易,它需要來自各種不同觀點的分析方法、溝通技巧與專業的領域知識。除此以外,需求的管理更是一門學問,許多專案因為沒有妥善地管理需求的變更,導致系統不斷地發散擴張而無法收拾結案。本章的主題在闡述需求擷取、建立與管理的方法和技巧。
第3章深入探討物件導向軟體開發。物件導向軟體開發方法的主要概念是將真實世界以物件封裝觀念進行塑模,其包含四個階段:需求塑模、物件導向分析、物件導向設計與物件導向實作。需求塑模是針對使用者需求加以分析,建立系統的使用案例模式與領域模式。在物件導向分析階段,即針對每個使用案例進行分析,利用互動圖描述物件之間的訊息交換,以完成使用案例所需求的功能。在物件導向設計階段,則依據分析階段的產出,再加以細部設計轉換成具體的軟體系統模式。當細部設計完成後,程式設計師即可使用所建立的設計圖為藍本,實作物件導向軟體系統。
第4章闡述軟體設計的基本概念。本章以軟體設計概念、軟體設計策略與方法、軟體設計規畫書撰寫以及進階設計概念等方面來描述軟體設計的相關知識,期使讀者在學習軟體設計的技術知識時,能夠同時獲得工程化思維方式的訓練。本章主要內容包含架構設計、介面設計、資料結構設計以及演算法設計,強調軟體系統分析與系統設計的分工與對應,尤其著重於軟體架構設計對於大型軟體系統開發的重要性。
第5章主要探討軟體專案的計畫與管理議題。如同軟體系統開發,為了能更有效率地執行軟體專案,軟體專案的計畫與管理引進了流程的概念。軟體專案管理流程配合軟體專案管理計畫,對於專案的執行將有莫大的影響。軟體專案的生命週期大致可分成初始(Initial)、計畫(Planning)、執行(Execution)與結案(Closure)四個階段。軟體專案流程的工作,必須考慮專案是否應該進行、如何開始進行,以及有哪些項目應列入考量,進而形成一份計畫書,其後根據此計畫書進行專案的執行、管理與監控,以利該軟體專案的完成。一個軟體專案開發過程順利與否,專案管理工作占了相當重要的地位。
第6章介紹軟體測試。在軟體發展過程中,可能因為人為疏失、溝通不良而造成規格不符、設計錯誤或程式撰寫疏漏等問題,這些問題不僅延誤軟體開發時程,更有可能會導致軟體開發成本的增加,甚至嚴重影響軟體的品質。為了能找出上述各種因素所造成的軟體錯誤、瑕疵與損害,便需要經由軟體測試的相關技術來確保軟體系統的品質。
對於軟體流程、開發與管理有了基本認識之後,第7章將帶入軟體品質的觀念。在我們生活周遭,時常見到因軟體品質管理缺失而導致非預期的事件發生,例如鐵路與公路的購票系統,曾發生售票重複劃位的情況,不僅造成旅客很大的困擾,也使得企業的形象受損,由此可知品質的控管對軟體專案的重要性。本章將講解軟體品質概念、品質管理工作內容,並介紹提升軟體品質的方法。
第8章介紹軟體建構管理及其工作內容。在軟體發展中,管理軟體版本、建立軟體基準與控制軟體變更是不可或缺的。有太多的軟體專案因為軟體變更的管控不當,導致重大的損失,甚至造成整個專案失敗。如果能落實建構識別、建構控制、建構狀態報告與建構稽核等建構管理工作,則變更所造成的影響與損失將可被妥善控制。
第9章將數學理論與軟體工程方法作結合,稱之為軟體正規方法論。在許多傳統的工程領域中,如電子、電機、土木、機械等,其所發展出來的任何方法論都有數學理論作為基礎,數學分析在這些產品設計方法中,也成為開發過程的基礎之一。然而在軟體工程領域中,數學理論卻非如此普遍,即使軟體工程的數學理論研究發展至今已有近40年的歷史,卻沒有被廣泛地應用到實際的軟體發展方法論中。本章的主題著重在探討軟體工程與正規方法論的關係,討論如何將正規方法論應用到軟體開發,同時也將探討其所面臨的挑戰。整體而言,軟體正規方法是值得軟體開發人員學習的主題,對於軟體品質與可靠度的提升有相當大的助益。
第10章帶領讀者認識對軟體開發影響顯著的軟體流程改善方法,尤其針對美國卡內基美隆大學軟體工程研究所發展出來的CMMI模式作概要式的探討,讓讀者可以了解以CMMI模式為基礎的流程改善方式。經過本書先前章節的探討與分析,讀者可知軟體開發有著本質上的問題及困難,而軟體工程各種工程層面及管理層面的各項技法,便是為了逐步克服與減緩這些軟體與生俱來的複雜性、易變性、隱藏性及一致性等問題,進而透過有系統的軟體流程改善,讓開發團隊能循序漸進地學習如何與這「軟體狼人」共舞。
本書最後藉由一個軟體開發案例,引導讀者體會軟體開發實際會面臨的過程與困難,了解需求管理是如何進行,並期望透過此案例的安排,讓讀者能在理論與實際的對照中,感受軟體工程及其相關工程技法所帶來的實質好處。至於各章節出現的關鍵詞彙,本書統一整理彙編成「詞彙說明與索引」附於書後,以方便初步接觸軟體工程的讀者對照參考,幫助理解書中的基本概念與內容。
期待本書能使讀者對軟體的設計、開發與維護有更全面的理解,並建立屬於個人的軟體流程,逐步強化流程的改善,讓自己每天都活在充滿發現新知的喜悅。