軟件工程-第一章 介紹

目標

本章目的主要是介紹軟件工程和提供理解本書剩餘部分的框架。閱讀本章時將會:

  • 理解軟件工程是什麼以及爲什麼很重要
  • 理解不同類型軟件系統的開發可能需要不同的軟件工程技術
  • 理解一些對於軟件工程師很重要的倫理和專業問題
  • 已被介紹的三種不同類型的系統,將作爲案例在全書使用

內容


1. 專業軟件開發
2. 軟件工程倫理
3. 案例學習

沒有軟件,現實世界無法運轉。國家基礎設施和公共事業都是被基於計算機的系統控制,而且許多電子產品都有計算機或控制軟件。工業生產和分佈都是完全計算機化的,就像金融系統一樣。娛樂,包括音樂產業、電腦遊戲、電影和電視都是軟件密集區。因此,軟件工程是國家和國際社會的運行必不可少的。

軟件系統是抽象和無形的。不被材料屬性限制,不受物理規則或生產過程約束。這使得軟件工程得以簡化,因爲軟件的發展潛能不受自然的約束。然而,因爲物理限制的缺失,軟件系統會很快變得非常複雜,很難理解且不易改變。

有許多不同類型的軟件系統,從簡單的嵌入式系統到複雜的、寬泛的信息系統。爲軟件工程尋求統一的標記、方法或技術是沒有意義的,因爲不同類型的軟件需要不同的方法。開發一套組織化信息系統是完全不同於開發一個針對科學儀器的控制器。這些系統與圖形化密集的電腦遊戲也無過多共同之處。所有的這些應用都需要軟件工程,但是它們不需要相同的軟件工程技術。

現在仍然有許多關於軟件故障和軟件失效的報告。軟件工程因此被批,認爲對於現代的軟件開發是不夠的。然而,在我看來,許多這些所謂的軟件故障是兩個因素的結果:

  1. 增長的需求:因爲新的軟件工程技術幫助我們構建更大、更復雜的系統,用戶需求也不斷隨之變化。系統必須快速構建和交付;需要更大甚至更復雜的系統;系統要具備之前被認爲不可能的能力。已存在的軟件工程方法無法處理,新的軟件工程技術必須被開發滿足這些新的需求。
  2. 過低的期待:不使用軟件工程方法和技術編寫計算機程序是很容易的。許多公司因爲軟件和服務需要升級,已經在軟件開發中隨風漂泊了。他們在日常工作中沒有使用軟件工程方法。因此,他們的軟件經常是更昂貴且更不可靠。我們需要更好的軟件工程教育和培訓處理這些問題。

軟件工程可爲其成績而驕傲。當然,在開發複雜的軟件時還有很多問題!但是,沒有軟件工程,我們無法探索太空,不可能有網絡或現代的電話通信。所有形式的出行都將更加危險和昂貴。軟件工程已經貢獻了很多,而且我相信在21世紀它將做出更多的貢獻!

軟件工程的歷史

軟件工程的概念在1968年的一次討論軟件危機(Naur和Randell,1969)的會議上首次被提出。很明顯,個人化的編程方法無法放大應用到更大和更復雜的軟件系統中。這些系統不可靠,花費要比預期更高,而且交付更遲緩!

20世紀70年代到80年代間,大量新的軟件工程技術和方法被開發,例如結構化編程、信息隱藏和麪向對象開發。工具和標準概念都被開發而且現在都被廣泛使用。

專業軟件開發

許多人編寫程序。業務人員編寫電子製表程序簡化他們的工作,科學家和工程師編寫程序處理他們的實驗數據,業餘愛好者編寫程序爲了他們自己的愛好和樂趣。然而,絕大多數的軟件開發都是專業活動,軟件被開發用於特定的商業目的,用於植入到其他設備或作爲軟件產品如信息系統、CAD系統等。專業軟件,被不同於開發者的其他用戶使用,通常被團隊而非個人開發。終身被維護和修改。

軟件工程目的是支持專業軟件開發,而非個人編程。包括支持程序說明、設計和進化的技術,這些技術與個人軟件開發並無正常相關性。爲了幫助你獲得軟件工程是關於什麼的一個大概的理解,我總結了一些常被問及的問題在圖1.1中。

這裏寫圖片描述

許多人簡單地認爲軟件就是計算機軟件的代名詞。然而,當我們論及軟件工程時,軟件不僅是程序自身,也包括使這些程序正常運行的所有相關的文檔和配置數據。一個專業地被開發的軟件系統經常不只是一個單獨的程序。系統通常由許多獨立的程序和用於設置這些程序的配置文件組成。可能包括系統文檔,描述了系統的結構;用戶文檔,解釋瞭如何使用系統,以及用戶下載最近的產品信息的網站。

這是專業和業餘軟件開發最重要的一點差異。如果你是爲自己編寫程序,沒人將會使用而且你不用擔心編寫程序指南、記錄程序設計等。然而,如果你是編寫其他人將會使用而且其他工程師將會改變的軟件,通常要提供額外的信息正如程序源碼一樣。

軟件工程師關注於開發軟件產品(如被賣給顧客的軟件)。有兩類軟件產品:

  1. 一般產品:這是些被開發組織生產的獨立系統而且在開放市場出售給任何能買得起的顧客。這類產品包括PC軟件如數據庫、文字處理軟件、繪圖軟件和項目管理工具。也包括針對特定目的設計的所謂的垂直應用,比如庫信息系統、賬號系統或維護牙科病歷的系統。
  2. 定製(或定做)產品:這些系統是受特殊的顧客委託。軟件承包商專門爲該顧客開發軟件。這類軟件包括電子設備的控制系統、支持特殊商務處理的系統和空中交通控制系統。

兩類軟件最重要的差異就是,對於一般產品,開發軟件的組織控制軟件說明。對於訂製化產品,說明通常是被購買該軟件的組織開發和控制。軟件開發人員必須依照該說明辦事。

然而,這些產品類型的差異逐漸變得模糊。越來越多的系統採用一般產品作爲基礎,然後被適配滿足顧客的需求。企業資源規劃(Enterprise Resource Planning:ERP)系統,例如SAP系統,是這種方式的最好例子。通過合併有關業務規則和流程,以及各種報表信息等,使得一個龐大和複雜的系統適用於一家公司。

當我們論及專業軟件質量時,要考慮到軟件是被開發人員之外的人使用和改變的。因此,質量不僅僅關注軟件做什麼。當然也包括軟件執行時的行爲和系統程序的結構與組織以及相關的文檔。這反映在所謂的質量或非功能性軟件屬性中。這些屬性的例子就是軟件的用戶請求響應時間以及程序代碼的可理解性。

對於軟件系統期望的屬性集合明顯依賴於它的應用。因此,銀行系統必須安全,交互式遊戲必須響應及時,電話交互系統必須可靠等等。這些屬性可被概括到圖表1.2展示的屬性集合中,我相信這是專業軟件系統基本的屬性。

這裏寫圖片描述

軟件工程

軟件工程是一門工程學科,關注於軟件產品從早期的系統說明階段到投入使用後的維護階段的方方面面。在定義中,有兩個關鍵詞:

  1. 工程學科:工程師應用相應的理論、方法和工具使得事物工作。然而,他們選擇性地使用它們。甚至當沒有可應用的理論和方法時,不斷嘗試發現問題的解決方案。工程師也認識到他們必須依照組織和經濟的約束,以便在這些約束之內需求解決方案。
  2. 軟件產品方方面面:軟件工程不僅關注於軟件開發的技術流程。也包括諸如軟件項目管理和工具開發等活動,以及支持軟件產品的方法和理論。

工程是關於在計劃和預算內,獲得要求的質量的結果。這經常需要妥協———工程師不能是完美主義者。然而,爲自己寫程序的人,在軟件開發中可以如其所願的花費時間。

一般而言,軟件工程師在工作中採用系統和組織化的方法,因爲這是生產高質量軟件最有效的方式。然而,工程就是關於對於一系列情況選擇最合適的方法,所以更具創造性、更少形式的方法對於開發在有些情況下可能非常高效。更少形式的開發尤其適用於基於Web的系統開發,它要求軟件和圖形設計技巧混合。

軟件工程是非常重要的,原因有二:

  1. 越來越多的個人和設備依賴於先進的軟件系統,我們需要能夠經濟而又快速地生產穩定可用的系統。
  2. 從長遠來看,針對軟件系統,使用軟件工程方法和技術要比猶如個人程序一般編寫程序更加划算。對於大部分的軟件,主要的費用就是投入使用後修改軟件的花費。

在軟件工程中使用的系統的方式有時被稱爲軟件過程。軟件過程就是通向軟件產品生產的一系列活動。對於所有的軟件過程,有四種基礎的活動。就是:

  1. 軟件說明:顧客和工程師定義將被生產的軟件和操作限制。
  2. 軟件開發:軟件被設計和編程。
  3. 軟件有效性驗證:軟件被檢查確保是用戶要求的。
  4. 軟件進化:軟件被修改以反映變化的顧客和市場需求。

不同類型的系統需要不同的開發過程。例如,飛機上的實時軟件在開發之前必須被完整地說明。在電子商務系統中,說明和程序通常一起被開發。因此,這些通用的活動可能會以不同的方式被組織和在不同詳細水平上被描述,主要依賴於被開發的軟件類型。我會在第2章更具體的描述軟件過程。

軟件工程和計算機科學和系統工程都是相關的:

  1. 計算機科學關注於構成計算機和軟件系統基礎的理論和方法,然而軟件工程關注於軟件生產的實踐問題。有些計算機科學方面的知識對於軟件工程是必不可少的,同樣地有些物理知識對於電子工程也是必不可少的。然而,計算機科學理論經常最適用於相對較小的程序。計算機科學的雅正說不能總是應用到要求軟件解決方案的龐大,複雜的問題上。
  2. 系統工程關注於複雜系統的開發和進化的所有方面。在該系統中軟件扮演着主要角色。因此系統工程關注於硬件開發、政策和流程設計以及系統部署,也包括軟件工程。系統工程師涉及定義系統和它的整體架構,然後集成不同的部分創建和完成系統。它們較少關注於系統組件(硬件、軟件等)的工程問題。

正如我要在下節討論的,有許多不同的軟件類型。沒有通用的軟件工程方法或技術可應用到所有的軟件中。然而,有三種通用的問題可能影響到不同的軟件類型:

  1. 異質性:系統不斷被要求如分佈式系統一般基於網絡操作,網絡中包含不同類型的計算機和移動設備。有些軟件不僅運行到通用計算機上,可能也會運行到移動手機上。你經常要把新的軟件集成到使用不同編程語言編寫的舊的系統中。挑戰就是開發技術,構建可靠軟件,充分靈活應對異質性。
  2. 業務和社會變化:業務和社會快速的變化猶如新興經濟之發展和新技術之可用。他們需要能夠改變已存在的軟件並快速地開發新的軟件。許多傳統的軟件工程技術是很耗時的而且新的系統經常花費比預期更多的時間才能交付。他們需要進化以便減少用戶要求的軟件交付時間。
  3. 安全和信任:因爲軟件與我們的生活息息相關,軟件可信是必要的。對於通過Web界面或Web服務接口被訪問的遠程軟件系統尤是如此。要確保惡意用戶無法攻擊我們的軟件而且保證信息安全。

當然,這些不是獨立的問題。例如,快速地改變舊系統,使用web服務接口提供服務是必須的。爲了處理這些挑戰,我們需要新的工具和技術以及融合與使用現有的軟件工程方法的創新舉措。

軟件工程多元化

軟件工程是軟件生產的系統化方式,考慮實際成本、時間表、可靠性等因素,以及客戶和生產者的需求。系統化方式如何被實施依賴於開發軟件的組織、軟件類型和開發過程中涉及的人。沒有通用的軟件工程方法和技術適用於所有的系統和公司。而且,多元的軟件工程方法和工具已經演化了超過50年。

決定哪些軟件工程方法和技術是最重要的最主要的因素可能就是將被開發的應用的類型。有許多不同類型的應用,包括:

  1. 獨立應用:這些是運行在本地計算機如PC上的應用系統。它們包含所有必須的功能,而且不需要聯網。這種軟件的例子就是PC上的辦公軟件、CAD程序、圖片處理軟件等。
  2. 以業務爲基礎的交互式應用:這些是運行在遠程計算機而且可被用戶通過PC或終端訪問的應用。很明顯,這些應用包括web應用如電子商務應用,可以與軟件系統交互,購買商品和服務。也包括業務系統,業務通過web瀏覽器或專用客戶端程序和基於雲的服務訪問系統,例如郵件和圖片共享。交互式應用經常包含大量的數據存儲,每次交易都要訪問和更新。
  3. 嵌入式控制系統:這是些控制和管理設備的軟件控制系統。單從數量上來說,嵌入式系統可能要比其他類型的系統更多。嵌入式系統的例子包括移動手機中的軟件、汽車上的控制防抱死制動的軟件以及微波爐中控制蒸煮過程的軟件。
  4. 批處理系統:這是些被設計用於處理大批量數據的業務系統。它們處理大量的個性化的輸入創建對應的輸出。批處理系統的例子包括週期性計費系統,如電話計費系統和薪酬系統。
  5. 娛樂系統:這是些主要針對個人使用而且目的在於娛樂用戶的系統。大部分都是一種或另一種的遊戲。被提供的用戶交互質量是娛樂系統最重要的明顯特徵。
  6. 建模與仿真系統:這是些被科學家和工程師開發用於建模物理過程或情境的系統,包括許多獨立的、相互影響的對象。是計算密集型的,而且要求高性能並行系統才能運行。
  7. 數據收集系統:這是些使用一系列傳感器從環境中讀取數據併發送到其他系統處理的系統。該軟件要與傳感器打交道而且經常被安裝到不利的環境如發動機裏或邊遠地區。
  8. 集成系統:這是些由許多其他軟件系統組合而成的系統。它們有些是一般的軟件產品,如電子製表程序。有些是專門針對環境編寫的。

當然,這些類型的系統之間的界限是很模糊的。如果開發個手機遊戲,作爲手機軟件開發者要考慮相同的約束(電量、硬件交互)。批處理系統經常被用在基於web的系統上。例如,在公司中,差旅費報銷可能通過web應用提交,但是由批應用處理以便按月支付。

對於每種類型的系統,要使用不同的軟件工程技術,因爲軟件都有不同的特性。例如,汽車中的嵌入式控制系統對安全要求很嚴格,而且當被安裝到車輛中時要燒進ROM中。因此改變起來非常昂貴。這樣的系統需要非常昂貴的驗證與確認,以便在汽車售出之後重新召回以修復軟件問題的機會最低。用戶交互很少(甚至可能不存在),所以不需要使用使用依賴於用戶接口原型的開發過程。

對於基於web的系統,隨着系統被可重用的組件組合,基於迭代開發和交付的方式可能就比較合適。然而,這樣的方式對於集成系統可能就有些不切實際了。在集成系統中,系統交互的詳細說明必須要提前制定以便每個系統都能獨立地被開發。

話雖如此,還是有些軟件工程基礎原理能應用到所有類型的軟件系統中:

  1. 它們應當使用被託管和充分理解的開發過程開發。軟件開發組織應當計劃開發過程並清楚地知道將生產什麼東西以及什麼時候完成。當然,不同的過程被應用於不同類型的軟件。
  2. 對於所有類型的系統,可靠性和性能都是非常重要的。軟件應當如預期一般工作,沒有失敗而且被用戶使用時應當可用。它的操作應該很安全而且儘可能的保護軟件免受外部攻擊的威脅。系統應該高效地工作而且不浪費資源。
  3. 理解和管理軟件說明和需求(這是軟件應該做的)很重要。你要了解不同的系統客戶和用戶對系統的期望並對之管理,以便一個有用的系統能在預算和預期內交付。
  4. 應該儘可能高效的利用已存在的資源。這意味着你應該適當地重用已被開發的軟件而非重寫編寫新的軟件。

這些基礎的過程概念,可靠性、需求、管理以及重用都是本書的中重要主題。不同的方法以不同的方式表達它們,但它們都是專業軟件開發的基礎。

你應該注意到了這些基礎原理並不涉及實現和編程。在本書中我沒有涉及到特定的編程技術因爲不同類型的系統相距甚殊。例如,腳本語言如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的系統的改變就是設計。例如:

  1. 軟件重用已經成爲構建基於web的系統的明顯方式。構建這些系統時,要思考如何能夠從預存在的軟件組件和系統中集成它們。
  2. 現在普遍地都意識到了對於這樣的系統提前提出所有的需求示不切實際的。基於web的系統應該能夠被增量地開發和交付。
  3. 用戶接口被web瀏覽器的能力約束。雖然如AJAX等技術意味着豐富的接口可在瀏覽器內創建,但這些技術使用起來還是存在困難。使用本地腳本的web表單是更常用的。基於web的系統的應用接口經常要比PC系統產品上的特殊設計的用戶接口更難得。

軟件工程的基本思想,在之前的章節已討論過,可以以應用到其他類型的軟件系統中的方式應用到基於web的軟件。在20世紀,大型系統開發經驗還是與基於web的軟件相關。

軟件工程倫理

像其他工程學科一樣,軟件工程在社會和法律的框架內被實現,該框架限制了人在所處區域的行爲的自由。作爲一個軟件工程師,你必須接受你的工作包含了更廣泛的責任而非簡單的技術能力的應用。你必須以一種倫理和道德的負責任的方式行爲,如果你想作爲一個專業的工程師被尊重的話。

不言而喻,你應該堅守誠實和正直的一般標準。不應以一種不誠實或會給軟件工程專業帶來不好名聲的方式使用你的技術和能力。然而,在一些方面,可接受行爲的標準不受法律而是而是更多的無力的專業責任的概念的約束。如下:

  1. 機密性:應該正常地尊重你的僱主或客戶的機密,不管是否簽署了保密協議。
  2. 能力勝任:不應歪曲自己的能力水平。不應故意接收能力範圍之外的任務。
  3. 知識產權:應意識到本地法律支配着知識產權如專利和著作權。應仔細確保僱主和客戶的知識產權收到保護。
  4. 計算機濫用:不應使用技術能力濫用他人的計算機。計算機濫用範圍包括從相對不重要(在僱主計算機上玩遊戲)到極度嚴重(病毒和其他惡意軟件的傳播)。

專業的團體和單位在設置倫理標準中扮演着重要的角色。組織如ACM、IEEE(Institute of Electrical and Electronic Engineers)和英國計算機協會發布了職業道德或道德規範的標準。這些組織的成員承諾遵守這些規範當他們註冊會員身份時。這些道德規範一般關注於基本的倫理行爲。

職業協會,尤其是ACM和IEEE,都曾經合作生成一套共同的道德規範和行業準則。規範以短與長兩種形式存在,前者如表1.3所示,後者在短版本上添加了詳情和內容。規範背後的基本原理在長形式的前兩段被總結:

計算機在商業、工業、政府、醫藥、教育、娛樂及全社會中都扮演着核心和增長的角色。軟件工程師就是通過直接參與或教學的方式貢致力於分析、說明、設計、開發、認證、維護和軟件系統的測試。因爲他們在軟件系統開發中的角色,軟件工程師有重要的機會做好事或導致危害,使得或影響他人做好事或導致危害。爲了儘可能的確保他們的努力被用於做好事,軟件工程師必須承諾使得軟件工程成爲一個有益的和受尊重的職業。依照承諾,軟件工程師必須堅持遵守道德規範和職業準則。

規範包含八項與行爲相關的準則和被專業軟件工程師制定的決策。這些專業的軟件工程師包括實踐者、教育者、管理者、主管和決策者,以及該專業的實習生和學生。準則確定了個人、小組和組織參與的道德責任關係以及關係內部的主要義務。每項準則的條款都是包含了這些關係的義務的插圖。這些義務存在於軟件工程師的人性當中,

案例





發佈了39 篇原創文章 · 獲贊 77 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章