目标
本章目的主要是介紹軟體工程和提供了解本書剩餘部分的架構。閱讀本章時将會:
- 了解軟體工程是什麼以及為什麼很重要
- 了解不同類型軟體系統的開發可能需要不同的軟體工程技術
- 了解一些對于軟體工程師很重要的倫理和專業問題
- 已被介紹的三種不同類型的系統,将作為案例在全書使用
内容
1. 專業軟體開發
2. 軟體工程倫理
3. 案例學習
沒有軟體,現實世界無法運轉。國家基礎設施和公共事業都是被基于計算機的系統控制,而且許多電子産品都有計算機或控制軟體。工業生産和分布都是完全計算機化的,就像金融系統一樣。娛樂,包括音樂産業、電腦遊戲、電影和電視都是軟體密集區。是以,軟體工程是國家和國際社會的運作必不可少的。
軟體系統是抽象和無形的。不被材料屬性限制,不受實體規則或生産過程限制。這使得軟體工程得以簡化,因為軟體的發展潛能不受自然的限制。然而,因為實體限制的缺失,軟體系統會很快變得非常複雜,很難了解且不易改變。
有許多不同類型的軟體系統,從簡單的嵌入式系統到複雜的、寬泛的資訊系統。為軟體工程尋求統一的标記、方法或技術是沒有意義的,因為不同類型的軟體需要不同的方法。開發一套組織化資訊系統是完全不同于開發一個針對科學儀器的控制器。這些系統與圖形化密集的電腦遊戲也無過多共同之處。所有的這些應用都需要軟體工程,但是它們不需要相同的軟體工程技術。
現在仍然有許多關于軟體故障和軟體失效的報告。軟體工程是以被批,認為對于現代的軟體開發是不夠的。然而,在我看來,許多這些所謂的軟體故障是兩個因素的結果:
- 增長的需求:因為新的軟體工程技術幫助我們建構更大、更複雜的系統,使用者需求也不斷随之變化。系統必須快速建構和傳遞;需要更大甚至更複雜的系統;系統要具備之前被認為不可能的能力。已存在的軟體工程方法無法處理,新的軟體工程技術必須被開發滿足這些新的需求。
- 過低的期待:不使用軟體工程方法和技術編寫計算機程式是很容易的。許多公司因為軟體和服務需要更新,已經在軟體開發中随風漂泊了。他們在日常工作中沒有使用軟體工程方法。是以,他們的軟體經常是更昂貴且更不可靠。我們需要更好的軟體工程教育和教育訓練處理這些問題。
軟體工程可為其成績而驕傲。當然,在開發複雜的軟體時還有很多問題!但是,沒有軟體工程,我們無法探索太空,不可能有網絡或現代的電話通信。所有形式的出行都将更加危險和昂貴。軟體工程已經貢獻了很多,而且我相信在21世紀它将做出更多的貢獻!
軟體工程的曆史
軟體工程的概念在1968年的一次讨論軟體危機(Naur和Randell,1969)的會議上首次被提出。很明顯,個人化的程式設計方法無法放大應用到更大和更複雜的軟體系統中。這些系統不可靠,花費要比預期更高,而且傳遞更遲緩!
20世紀70年代到80年代間,大量新的軟體工程技術和方法被開發,例如結構化程式設計、資訊隐藏和面向對象開發。工具和标準概念都被開發而且現在都被廣泛使用。
專業軟體開發
許多人編寫程式。業務人員編寫電子制表程式簡化他們的工作,科學家和工程師編寫程式處理他們的實驗資料,業餘愛好者編寫程式為了他們自己的愛好和樂趣。然而,絕大多數的軟體開發都是專業活動,軟體被開發用于特定的商業目的,用于植入到其他裝置或作為軟體産品如資訊系統、CAD系統等。專業軟體,被不同于開發者的其他使用者使用,通常被團隊而非個人開發。終身被維護和修改。
軟體工程目的是支援專業軟體開發,而非個人程式設計。包括支援程式說明、設計和進化的技術,這些技術與個人軟體開發并無正常相關性。為了幫助你獲得軟體工程是關于什麼的一個大概的了解,我總結了一些常被問及的問題在圖1.1中。

許多人簡單地認為軟體就是計算機軟體的代名詞。然而,當我們論及軟體工程時,軟體不僅是程式自身,也包括使這些程式正常運作的所有相關的文檔和配置資料。一個專業地被開發的軟體系統經常不隻是一個單獨的程式。系統通常由許多獨立的程式和用于設定這些程式的配置檔案組成。可能包括系統文檔,描述了系統的結構;使用者文檔,解釋了如何使用系統,以及使用者下載下傳最近的産品資訊的網站。
這是專業和業餘軟體開發最重要的一點差異。如果你是為自己編寫程式,沒人将會使用而且你不用擔心編寫程式指南、記錄程式設計等。然而,如果你是編寫其他人将會使用而且其他工程師将會改變的軟體,通常要提供額外的資訊正如程式源碼一樣。
軟體工程師關注于開發軟體産品(如被賣給顧客的軟體)。有兩類軟體産品:
- 一般産品:這是些被開發組織生産的獨立系統而且在開放市場出售給任何能買得起的顧客。這類産品包括PC軟體如資料庫、文字處理軟體、繪圖軟體和項目管理工具。也包括針對特定目的設計的所謂的垂直應用,比如庫資訊系統、賬号系統或維護牙科病曆的系統。
- 定制(或定做)産品:這些系統是受特殊的顧客委托。軟體承包商專門為該顧客開發軟體。這類軟體包括電子裝置的控制系統、支援特殊商務處理的系統和空中交通控制系統。
兩類軟體最重要的差異就是,對于一般産品,開發軟體的組織控制軟體說明。對于訂制化産品,說明通常是被購買該軟體的組織開發和控制。軟體開發人員必須依照該說明辦事。
然而,這些産品類型的差異逐漸變得模糊。越來越多的系統采用一般産品作為基礎,然後被适配滿足顧客的需求。企業資源規劃(Enterprise Resource Planning:ERP)系統,例如SAP系統,是這種方式的最好例子。通過合并有關業務規則和流程,以及各種報表資訊等,使得一個龐大和複雜的系統适用于一家公司。
當我們論及專業軟體品質時,要考慮到軟體是被開發人員之外的人使用和改變的。是以,品質不僅僅關注軟體做什麼。當然也包括軟體執行時的行為和系統程式的結構與組織以及相關的文檔。這反映在所謂的品質或非功能性軟體屬性中。這些屬性的例子就是軟體的使用者請求響應時間以及程式代碼的可了解性。
對于軟體系統期望的屬性集合明顯依賴于它的應用。是以,銀行系統必須安全,互動式遊戲必須響應及時,電話互動系統必須可靠等等。這些屬性可被概括到圖表1.2展示的屬性集合中,我相信這是專業軟體系統基本的屬性。
軟體工程
軟體工程是一門工程學科,關注于軟體産品從早期的系統說明階段到投入使用後的維護階段的方方面面。在定義中,有兩個關鍵詞:
- 工程學科:工程師應用相應的理論、方法和工具使得事物工作。然而,他們選擇性地使用它們。甚至當沒有可應用的理論和方法時,不斷嘗試發現問題的解決方案。工程師也認識到他們必須依照組織和經濟的限制,以便在這些限制之内需求解決方案。
- 軟體産品方方面面:軟體工程不僅關注于軟體開發的技術流程。也包括諸如軟體項目管理和工具開發等活動,以及支援軟體産品的方法和理論。
工程是關于在計劃和預算内,獲得要求的品質的結果。這經常需要妥協———工程師不能是完美主義者。然而,為自己寫程式的人,在軟體開發中可以如其所願的花費時間。
一般而言,軟體工程師在工作中采用系統群組織化的方法,因為這是生産高品質軟體最有效的方式。然而,工程就是關于對于一系列情況選擇最合适的方法,是以更具創造性、更少形式的方法對于開發在有些情況下可能非常高效。更少形式的開發尤其适用于基于Web的系統開發,它要求軟體和圖形設計技巧混合。
軟體工程是非常重要的,原因有二:
- 越來越多的個人和裝置依賴于先進的軟體系統,我們需要能夠經濟而又快速地生産穩定可用的系統。
- 從長遠來看,針對軟體系統,使用軟體工程方法和技術要比猶如個人程式一般編寫程式更加劃算。對于大部分的軟體,主要的費用就是投入使用後修改軟體的花費。
在軟體工程中使用的系統的方式有時被稱為軟體過程。軟體過程就是通向軟體産品生産的一系列活動。對于所有的軟體過程,有四種基礎的活動。就是:
- 軟體說明:顧客和工程師定義将被生産的軟體和操作限制。
- 軟體開發:軟體被設計和程式設計。
- 軟體有效性驗證:軟體被檢查確定是使用者要求的。
- 軟體進化:軟體被修改以反映變化的顧客和市場需求。
不同類型的系統需要不同的開發過程。例如,飛機上的實時軟體在開發之前必須被完整地說明。在電子商務系統中,說明和程式通常一起被開發。是以,這些通用的活動可能會以不同的方式被組織和在不同詳細水準上被描述,主要依賴于被開發的軟體類型。我會在第2章更具體的描述軟體過程。
軟體工程和計算機科學和系統工程都是相關的:
- 計算機科學關注于構成計算機和軟體系統基礎的理論和方法,然而軟體工程關注于軟體生産的實踐問題。有些計算機科學方面的知識對于軟體工程是必不可少的,同樣地有些實體知識對于電子工程也是必不可少的。然而,計算機科學理論經常最适用于相對較小的程式。計算機科學的雅正說不能總是應用到要求軟體解決方案的龐大,複雜的問題上。
- 系統工程關注于複雜系統的開發和進化的所有方面。在該系統中軟體扮演着主要角色。是以系統工程關注于硬體開發、政策和流程設計以及系統部署,也包括軟體工程。系統工程師涉及定義系統和它的整體架構,然後內建不同的部分建立和完成系統。它們較少關注于系統元件(硬體、軟體等)的工程問題。
正如我要在下節讨論的,有許多不同的軟體類型。沒有通用的軟體工程方法或技術可應用到所有的軟體中。然而,有三種通用的問題可能影響到不同的軟體類型:
- 異質性:系統不斷被要求如分布式系統一般基于網絡操作,網絡中包含不同類型的計算機和移動裝置。有些軟體不僅運作到通用計算機上,可能也會運作到移動手機上。你經常要把新的軟體內建到使用不同程式設計語言編寫的舊的系統中。挑戰就是開發技術,建構可靠軟體,充分靈活應對異質性。
- 業務和社會變化:業務和社會快速的變化猶如新興經濟之發展和新技術之可用。他們需要能夠改變已存在的軟體并快速地開發新的軟體。許多傳統的軟體工程技術是很耗時的而且新的系統經常花費比預期更多的時間才能傳遞。他們需要進化以便減少使用者要求的軟體傳遞時間。
- 安全和信任:因為軟體與我們的生活息息相關,軟體可信是必要的。對于通過Web界面或Web服務接口被通路的遠端軟體系統尤是如此。要確定惡意使用者無法攻擊我們的軟體而且保證資訊安全。
當然,這些不是獨立的問題。例如,快速地改變舊系統,使用web服務接口提供服務是必須的。為了處理這些挑戰,我們需要新的工具和技術以及融合與使用現有的軟體工程方法的創新舉措。
軟體工程多元化
軟體工程是軟體生産的系統化方式,考慮實際成本、時間表、可靠性等因素,以及客戶和生産者的需求。系統化方式如何被實施依賴于開發軟體的組織、軟體類型和開發過程中涉及的人。沒有通用的軟體工程方法和技術适用于所有的系統和公司。而且,多元的軟體工程方法和工具已經演化了超過50年。
決定哪些軟體工程方法和技術是最重要的最主要的因素可能就是将被開發的應用的類型。有許多不同類型的應用,包括:
- 獨立應用:這些是運作在本地計算機如PC上的應用系統。它們包含所有必須的功能,而且不需要聯網。這種軟體的例子就是PC上的辦公軟體、CAD程式、圖檔處理軟體等。
- 以業務為基礎的互動式應用:這些是運作在遠端計算機而且可被使用者通過PC或終端通路的應用。很明顯,這些應用包括web應用如電子商務應用,可以與軟體系統互動,購買商品和服務。也包括業務系統,業務通過web浏覽器或專用用戶端程式和基于雲的服務通路系統,例如郵件和圖檔共享。互動式應用經常包含大量的資料存儲,每次交易都要通路和更新。
- 嵌入式控制系統:這是些控制和管理裝置的軟體控制系統。單從數量上來說,嵌入式系統可能要比其他類型的系統更多。嵌入式系統的例子包括移動手機中的軟體、汽車上的控制防抱死制動的軟體以及微波爐中控制蒸煮過程的軟體。
- 批處理系統:這是些被設計用于處理大批量資料的業務系統。它們處理大量的個性化的輸入建立對應的輸出。批處理系統的例子包括周期性計費系統,如電話計費系統和薪酬系統。
- 娛樂系統:這是些主要針對個人使用而且目的在于娛樂使用者的系統。大部分都是一種或另一種的遊戲。被提供的使用者互動品質是娛樂系統最重要的明顯特征。
- 模組化與仿真系統:這是些被科學家和工程師開發用于模組化實體過程或情境的系統,包括許多獨立的、互相影響的對象。是計算密集型的,而且要求高性能并行系統才能運作。
- 資料收集系統:這是些使用一系列傳感器從環境中讀取資料并發送到其他系統處理的系統。該軟體要與傳感器打交道而且經常被安裝到不利的環境如發動機裡或邊遠地區。
- 內建系統:這是些由許多其他軟體系統組合而成的系統。它們有些是一般的軟體産品,如電子制表程式。有些是專門針對環境編寫的。
當然,這些類型的系統之間的界限是很模糊的。如果開發個手機遊戲,作為手機軟體開發者要考慮相同的限制(電量、硬體互動)。批處理系統經常被用在基于web的系統上。例如,在公司中,差旅費報帳可能通過web應用送出,但是由批應用處理以便按月支付。
對于每種類型的系統,要使用不同的軟體工程技術,因為軟體都有不同的特性。例如,汽車中的嵌入式控制系統對安全要求很嚴格,而且當被安裝到車輛中時要燒進ROM中。是以改變起來非常昂貴。這樣的系統需要非常昂貴的驗證與确認,以便在汽車售出之後重新召回以修複軟體問題的機會最低。使用者互動很少(甚至可能不存在),是以不需要使用使用依賴于使用者接口原型的開發過程。
對于基于web的系統,随着系統被可重用的元件組合,基于疊代開發和傳遞的方式可能就比較合适。然而,這樣的方式對于內建系統可能就有些不切實際了。在內建系統中,系統互動的詳細說明必須要提前制定以便每個系統都能獨立地被開發。
話雖如此,還是有些軟體工程基礎原理能應用到所有類型的軟體系統中:
- 它們應當使用被托管和充分了解的開發過程開發。軟體開發組織應當計劃開發過程并清楚地知道将生産什麼東西以及什麼時候完成。當然,不同的過程被應用于不同類型的軟體。
- 對于所有類型的系統,可靠性和性能都是非常重要的。軟體應當如預期一般工作,沒有失敗而且被使用者使用時應當可用。它的操作應該很安全而且盡可能的保護軟體免受外部攻擊的威脅。系統應該高效地工作而且不浪費資源。
- 了解和管理軟體說明和需求(這是軟體應該做的)很重要。你要了解不同的系統客戶和使用者對系統的期望并對之管理,以便一個有用的系統能在預算和預期内傳遞。
- 應該盡可能高效的利用已存在的資源。這意味着你應該适當地重用已被開發的軟體而非重寫編寫新的軟體。
這些基礎的過程概念,可靠性、需求、管理以及重用都是本書的中重要主題。不同的方法以不同的方式表達它們,但它們都是專業軟體開發的基礎。
你應該注意到了這些基礎原理并不涉及實作和程式設計。在本書中我沒有涉及到特定的程式設計技術因為不同類型的系統相距甚殊。例如,腳本語言如Ruby被用于基于web的系統程式設計但是完全不适用于嵌入式系統工程。
軟體工程和Web
網際網路的開發對我們的生活的各個方面都有深刻的影響。最初,Web主要是個普遍可通路資訊倉庫而且對軟體系統影響很小。這些系統運作在本地計算機上而且僅可從組織内部通路。大約2000年左右,Web開始發展而且越來越多的功能被添加到浏覽器上。這意味着基于web的系統可能會被開發,取代特殊用途的使用者接口,這些系統可被使用web浏覽器通路。這導緻了大量提供創新服務、可通過web通路的新系統産品的開發。這些産品經常被展示在使用者螢幕而不涉及直接從使用者收費的廣告提供資金支援。
與這些系統産品一樣,可運作小程式和做些局部處理的web浏覽器的開發促進了商業群組織軟體的進化。代之編寫軟體和部署到使用者的PC機上,這些軟體被部署到web伺服器上。這使得改變和更新軟體更實惠,因為不需要安裝軟體到每台PC上。也減少了花費,因為使用者接口開發是非常昂貴的。是以,無論什麼環境都可以這樣做,許多業務使用公司軟體系統已經遷移到基于web的互動了。
基于web的系統的開發的下一階段就是web服務的概念。web服務是實作特定、有用的功能而且可通過web通路的軟體元件。應用是通過內建這些可被不同公司提供的web服務建構而成的。原則上,連結可以是動态的以便應用每次可以使用不同的要被執行的web服務。我在第19章提及到這個方法用于軟體開發。
在最近幾年,“軟體即服務”的概念被開發。它提議軟體一般将不會運作在本地計算機而是在可通過網際網路通路的計算雲上。。如果使用服務如基于web的郵箱,你就是在使用一個基于雲的系統。一個計算雲就是大量互相關聯的被許多使用者共享的計算機系統。使用者并不購買軟體而是根據他們的使用程度付費,或者免費通路作為觀看展示在他們螢幕上的廣告的回報。
是以,web的出現引起了商業軟體組織化的顯著變化。web出現之前,商業應用主要是龐大、單獨的應用,運作在單獨的計算機或計算機簇上。在組織之内,通信都是本地的。現在,軟體是高度分布式的,有時可能跨越全世界。商業應用不是被随便編寫而是包含了元件和程式的廣泛的重用。
軟體組織的巨變,很明顯地導緻了基于web的系統的改變就是設計。例如:
- 軟體重用已經成為建構基于web的系統的明顯方式。建構這些系統時,要思考如何能夠從預存在的軟體元件和系統中內建它們。
- 現在普遍地都意識到了對于這樣的系統提前提出所有的需求示不切實際的。基于web的系統應該能夠被增量地開發和傳遞。
- 使用者接口被web浏覽器的能力限制。雖然如AJAX等技術意味着豐富的接口可在浏覽器内建立,但這些技術使用起來還是存在困難。使用本地腳本的web表單是更常用的。基于web的系統的應用接口經常要比PC系統産品上的特殊設計的使用者接口更難得。
軟體工程的基本思想,在之前的章節已讨論過,可以以應用到其他類型的軟體系統中的方式應用到基于web的軟體。在20世紀,大型系統開發經驗還是與基于web的軟體相關。
軟體工程倫理
像其他工程學科一樣,軟體工程在社會和法律的架構内被實作,該架構限制了人在所處區域的行為的自由。作為一個軟體工程師,你必須接受你的工作包含了更廣泛的責任而非簡單的技術能力的應用。你必須以一種倫理和道德的負責任的方式行為,如果你想作為一個專業的工程師被尊重的話。
不言而喻,你應該堅守誠實和正直的一般标準。不應以一種不誠實或會給軟體工程專業帶來不好名聲的方式使用你的技術和能力。然而,在一些方面,可接受行為的标準不受法律而是而是更多的無力的專業責任的概念的限制。如下:
- 機密性:應該正常地尊重你的雇主或客戶的機密,不管是否簽署了保密協定。
- 能力勝任:不應歪曲自己的能力水準。不應故意接收能力範圍之外的任務。
- 知識産權:應意識到本地法律支配着知識産權如專利和著作權。應仔細確定雇主和客戶的知識産權收到保護。
- 計算機濫用:不應使用技術能力濫用他人的計算機。計算機濫用範圍包括從相對不重要(在雇主計算機上玩遊戲)到極度嚴重(病毒和其他惡意軟體的傳播)。
專業的團體和機關在設定倫理标準中扮演着重要的角色。組織如ACM、IEEE(Institute of Electrical and Electronic Engineers)和英國計算機協會釋出了職業道德或道德規範的标準。這些組織的成員承諾遵守這些規範當他們注冊會員身份時。這些道德規範一般關注于基本的倫理行為。
職業協會,尤其是ACM和IEEE,都曾經合作生成一套共同的道德規範和行業準則。規範以短與長兩種形式存在,前者如表1.3所示,後者在短版本上添加了詳情和内容。規範背後的基本原理在長形式的前兩段被總結:
計算機在商業、工業、政府、醫藥、教育、娛樂及全社會中都扮演着核心和增長的角色。軟體工程師就是通過直接參與或教學的方式貢緻力于分析、說明、設計、開發、認證、維護和軟體系統的測試。因為他們在軟體系統開發中的角色,軟體工程師有重要的機會做好事或導緻危害,使得或影響他人做好事或導緻危害。為了盡可能的確定他們的努力被用于做好事,軟體工程師必須承諾使得軟體工程成為一個有益的和受尊重的職業。依照承諾,軟體工程師必須堅持遵守道德規範和職業準則。
規範包含八項與行為相關的準則和被專業軟體工程師制定的決策。這些專業的軟體工程師包括實踐者、教育者、管理者、主管和決策者,以及該專業的實習生和學生。準則确定了個人、小組群組織參與的道德責任關系以及關系内部的主要義務。每項準則的條款都是包含了這些關系的義務的插圖。這些義務存在于軟體工程師的人性當中,