國立屏東大學 資訊工程學系 物件導向軟體工程 (last updated September 6, 2021)
軟體工程(software engineering),顧名思義就是「製作軟體(software)的工程(engineering)方法(methodologies)」,用以確保高品質的軟體產品能夠在有限的資源、預算與時間內開發完成。本章將從軟體的定義開始,針對軟體及軟體工程相關的主體加以簡介,讓同學能夠在開始學習前有足夠的基礎。
相較於有形的「硬體(hardware)」,「軟體(software)」則是無形的。舉例來說,Nintendo Switch遊戲機以及其相關的搖桿與健身環等就是硬體裝置;而「瑪利歐賽車」、「動物森友會」、「健身環大冒險」等遊戲就是軟體。同樣的道理,也可以套用在音樂產業,音樂作品是軟體,用以播放作品的音響設備則是硬體。硬體與軟體必須互相配合,才能發揮功能或提供使用者相關的服務。例如單有遊戲主機,而無遊戲光碟;或是單有音響主機,卻沒有音樂光碟。反之,單有遊戲或音樂光碟,但卻沒有對應的執行或播放硬體,也都是沒有意義的。
<note> 用來存放軟體或是音樂作品的光碟則被稱為載具(carrier)。 </note>
本課程所關注的軟體,專指在電腦系統上運作的軟體,又稱為電腦軟體(computer software)。當然,電腦系統是一個泛稱,並不挶限於桌上型或筆記型電腦,還包含了伺服器主機、智慧型手機、平板電腦,甚至是前述的家用電視遊樂器等各式裝置。電腦軟體可以被視為是一些電腦程式(Computer Program)的集合,當其被加以執行時可以提供特定的功能或服務;至於一個電腦程式又可以被視為是一些程式碼(code)的集合,用以完成特定的功能。除此之外,與電腦程式相關的資料以及說明文件(操作與安裝說明等)都應該被視為是軟體的一部份。綜合上述,我們將「軟體」定義為:為了在電腦系統上執行以達成特定目的一組電腦程式、資料及其文件的組合。
基本上,軟體是無形的(intangible),它沒有一般商品存在的耗損(wear out)問題,不過它可能存在效能退化(deteriorate)的問題(你有沒有遇過隨著時間的推移,軟體執行效率退化的情況?例如因為累積的資料過多,造成需要處理的時間愈來愈長 )。另一方面,軟體是極為容易再製的(reproduce),不管製作多少份複本,其成本不會隨之增加(只要一個cp的指令即可完成)。一般而言,軟體的成本集中在其開發階段,一但開發完成,其再製成本極低,不過後續的軟體維護也必須投入相當的人力與物力。整體而言,軟體產業可算是一個勞力密集(labor-intensive)的產業,不像其它的製造業,其製作或開發的過程很難加以自動化。
通常軟體可以依據用途與功能區分為系統軟體(system software)與應用軟體(application software)兩大類,例如 作業系統(operating system)、程式語言的編譯器(compiler)」與裝置驅動程式(device driver)等用以控制或操控硬體的軟體;至於應用軟體則是以提供使用者服務為主要目的,依用途又可再區分為文書處理軟體、會計軟體、即時通訊軟體、簡報軟體與遊戲軟體等多個類別。
另一方面,我們也可以依照軟體使用者的不同,將軟體可以分為客製型軟體(customized software)與通用型軟體(generic software),其中客製型軟體是針對特定使用者、特定的用途所加以製作,通常此類軟體只有有少數的複本存在;非客製型的軟體則被稱為「通用型軟體(generic software)」,它是由軟體廠商針對特定市場所開發的軟體產品(product),通常在市場上公開向所有使用者販售,有時又稱為「商用成品(commerical off-the shelf,COTS)」,消費者購買後可以不經修改而直接使用(或是再付費進行小幅度的修改)。這兩種軟體的差別在於,客製型軟體是針對明確已知的使用者及其需求客製化設計開發,至於通用型軟體則是由軟體開發者預想使用者可能的需求而加以設計開發;簡言之,這兩者的差別就如同量身定製的西裝與大量生產的成衣西裝一樣,穿起量身定製的西裝當然合身帥氣,可以卻價格高昂;相對之下,成衣的價格則便宜親民多了,不過只能在現有的尺碼上做出選擇,有時可能還要再花點錢修改一下才能穿上身!
本課程受限於18週的課堂時間,將以通用型的軟體開發為主要演示,但同學們在分組開發軟體時,可依喜好在客製型軟體與通用型軟體間進行選擇。
軟體工程(Software Engineering)一詞,首見於1968年的NATO的Software Engineering Conference.1)2),用以面對當時已注意到的軟體危機 – 在當時絕大多數的軟體專案都面臨開發成本不斷追加,以及不斷推遲交貨時間的困境。不像傳統的製造業或營造業,已存在許多自動化或是專案管理的方法,軟體產業極需好的方法在有限的時間與預算內,開發出具有高品質的軟體。
用更簡單的話來說,軟體工程就是關於從無到有產生軟體的過程;而這個過程希望能夠有工程、科學化的方法,讓軟體的開發能夠如同其它領域的商品開發一樣,採用有效的方法來確保軟體開發的效率、品質以及成本的控管。為了達到此一目的,軟體工程應該被視為是一種專業技能,可以應用在軟體的設計、開發、實作以及修改、維護等過程,並希望能達成軟體開發的品值保證、降低成本、易於維護,同時也希望能透過軟體工程的方法來縮短開發的時程3)。同時,軟體工程也被期望能向許多其它領域一樣,能夠提供包含分析、設計、評量、實作、測試、維護與精進的工程方法4)。這些所謂的工程方法必須是易於理解、管理與應用的方法,同時也被期待是易於再製且能夠具有標準化程序的方法。用更簡單的話來說,軟體工程就是採用系統化、規章化、可量測的方法,來進行軟體的開發與維護5)。
軟體的開發過程,也可以視為是從抽象化到具體化的過程,從一開始較高抽象層次的系統分析、設計,到逐漸具體化的程式碼撰寫與測試等過程。同時在這些過程中,我們必須建構出完善的工程方法來獲致具有經濟效益、且能夠在提供穩定與效率的高品質軟體6)。為了回應這些需求,目前的主流做法之一就是將軟體工程視為是建立與使用模型的過程 7)。模型必須是明確且易於理解的,在軟體開發的過程當中針對不同抽象層次建立並使用這些模型,就可以在真正進行軟體開發前將最終軟體的樣貌先加以呈現。其中需求與使用者界面模型,有助於軟體開發團隊與使用者進行相關的討論;更具體的設計模型,則可以用來描述實際需要開發的各項軟體組件之功能與設計準則;建置模型則可以應用在軟體的配置與維護等方面的工作。本課程後續也將就這些不同的模型加以討論,並以UML模型為主要的探討對象。
軟體工程的主要目標可列示如下:
如前所述,以最簡單的方式來說,軟體工程就是從無到有將軟體開發出來的過程,其相關的範疇(與簡要內涵)如下:
發展於90年代初期的物件導向(object-oriented)概念與相關技術,現今已普及成為當代軟體開發的主流方法;軟體工程領域也廣泛地使用物件導向技術來進行各項活動,並稱為物件導向軟體工程(object-oriented software engineering),相關的活動包含:
本課程後續也將把重點放在物件導向軟體工程的相關活動與技術介紹。
現在的軟體開發愈趨大型化、複雜化,往往不再是一個人或少數人可以獨立完成的,所以軟體工程也與軟體團隊的管理緊密相關。專案(project)8)係指一項暫時性的工作,其目的在於創造出特定的產品或服務。專案通常具有以下的特性9):
所謂的軟體專案(Software Project)即為以開發軟體為主要目的的專案。就軟體產業而言,不論是客製型的軟體或是通用型軟體,其開發通常都被視為是一項軟體專案。每一項軟體專案都必須針對有限的資源(包含人力、設備、時程等)進行的管理,相關工作稱為軟體專案管理(software project management)。當然也不是每一項軟體專案,都是以開發新軟體為目的,有些軟體專案是針對既有的軟體進行改善或維護等工作;又例如有的軟體專案是為了找出既有軟體的缺失並加以修正,又或者有的軟體專案是為了將既有的系統進行修改,使其能適用於更新版本的作業系統、資料庫系統、或是新的商業模式或法規。另外有些軟體專案則是為了幫既有的軟體增加或修改功能、有時候是由開發人員針對既有的功能進行新的設計,以提升軟體的效能、或透過模組的重新設計提升軟體的可維護性。
軟體專案的相關人員(stakeholders)包含:
負則開發軟體專案的相關人員將被視為(或實際上即為)一個團隊,如何在團隊間適切地分工、溝通合作,也成為軟體工程相關領域的重點之一。主要的困難在於以下數點:
本課程以一套繪圖軟體為例,實際演示使用軟體工程方法開發軟體的過程。課程所開發的繪圖軟體,可以讓使用者使用基本的筆及圖形(例如矩形、橢圓形等)元件進行繪圖。希望透過此實際個案的示範,幫助同學理解軟體工程的相關活動及設計與實作方法。