天天看點

《實踐者的研究方法》—— 第1章 軟體的本質 1.1 軟體的本質

本節書摘來自華章出版社《實踐者的研究方法》一書中的第1章,第1.1節,作者羅傑 s. 普萊斯曼(roger s. pressman),更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

<b></b>

<b>第1章</b>

<b>software engineering: a practitioner’s approach, eighth edition</b>

軟體的本質

要 點 浏 覽

概念:計算機軟體是由專業人員開發并長期維護的軟體産品。完整的軟體産品包括:可以在各種不同容量及系統結構的計算機上運作的程式、程式運作過程中産生的各種結果以及各種描述資訊,這些資訊可以以硬拷貝或是各種電子媒介形式存在。

人員:軟體工程師開發軟體并提供技術支援,産業界中幾乎每個人都間接或直接地使用軟體。

重要性:軟體之是以重要是因為它在我們的生活中無所不在,并且日漸深入到商業、文化和日常生活的各個方面。

步驟:客戶和利益相關者表達對計算機軟體的要求,工程師建構軟體産品,最終使用者應用軟體來解決特定的問題或者滿足特定的要求。

工作産品:在一種或多種特定環境中運作并服務于一個或多個最終使用者要求的計算機軟體。

品質保證措施:如果你是軟體工程師,就要應用本書中包含的思想。如果你是最終使用者,應確定了解了自己的要求和環境,然後選擇能很好地滿足兩者的應用軟體。

在給我示範了最新開發的世界上最流行的第一人稱射擊視訊遊戲之後,這位年輕的開發者笑了。

“你不是一個玩家,對嗎?”他問道。

我微笑道:“你是怎麼猜到的?”

這位年輕人身着短褲和t恤衫。他的腿像活塞那樣上下跳動,燃燒着神經能量,這在他的同僚中看起來是很平常的。

“因為如果你是玩家,”他說,“你應該會更加興奮。你已經看到了我們的下一代産品,我們的客戶會對它着迷……這不是開玩笑。”

我們坐在開發區,這是地球上最成功的遊戲開發者之一。在過去幾年中,他示範的前幾代遊戲售出了5000萬份,收入達幾億美元。

“那麼,這一版什麼時候上市?”我問道。

他聳聳肩,“大約在5個月以内,我們還有很多工作要做。”

他負責一個應用軟體中的遊戲和人工智能功能,該軟體包含的代碼超過了300萬行。

“你們使用任何軟體工程技術嗎?”我問道,估計他會笑笑并搖頭。

他停頓了一下,想了一會兒,然後緩慢地點點頭。“我們讓軟體工程技術适應我們的需求,但是,我們确實使用。”

“在什麼地方使用?”我試探地問道。

“我們的問題是經常将需求翻譯成創意。”

“創意?”我打斷了他的話。

“你知道,那些設計故事、人物及所有遊戲素材的家夥,他們想的是遊戲大賣。而我們不得不接受他們抛給我們的這些,并形成一組技術需求,進而建構遊戲。”

“那麼形成了需求之後呢?”

他聳聳肩,“我們不得不擴充并修改以前遊戲版本的體系結構,并建立新的産品。我們需要根據需求建立代碼,對每日建構的代碼實施測試,并且做你書中建議的很多事情。”

“你知道我的書?”老實說,我非常驚訝。

“當然,在學校使用。那裡有很多。”

“我已經與你的很多同僚談了,他們對我書中的很多東西持懷疑态度。”

他皺了皺眉,“你看,我們不是it部門或航空公司,是以我們不得不對你所提倡的東西進行取舍。但是底線是一樣的——我們需要生産高品質的産品,并且以可重複方式完成這一目标的唯一途徑是改寫我們自己的軟體工程技術子集。”

“那麼這個子集是如何随着時間的推移變更的?”

他停頓了一下,像是在思考着未來。“遊戲将變得更加龐大和複雜,那是肯定的。随着更多競争的出現,我們的開發時間表将會收縮。慢慢地,遊戲本身會迫使我們應用更多的開發規範。如果我們不這樣做,我們就會死掉。”

計算機軟體仍然是世界舞台上最為重要的技術,并且也是“意外效應法則”的典型例子。60年前,沒有人曾預料到軟體科學會成為今天商業、科學和工程所必需的技術。軟體促進了新科技的創新(例如基因工程和納米科技)、現代科技的發展(例如通信)以及傳統技術的根本轉變(例如媒體行業),軟體技術已經成為個人計算機革命的推動力量,消費者使用智能手機就可以購買軟體産品。軟體還将由産品逐漸演化為服務,軟體公司随需應變,通過web浏覽器釋出即時更新功能,軟體公司幾乎可以比所有工業時代的公司都更大、更有影響力。在大量應用軟體的驅動下,網際網路将迅速發展,并逐漸改變人們生活的諸多方面——從圖書館搜尋、消費購物、政治論戰到年輕人和 (不很年輕的)成年人的約會行為。

沒有人曾想到軟體可嵌入各種系統中:交通運輸、醫療、通信、軍事、工業、娛樂以及辦公裝置……不勝枚舉。如果笃信“意外效應法則”的話,那麼還有很多結果和影響是我們尚未預料到的。

沒有人曾想到,随着時間的推移,将有數百萬的計算機程式需要進行糾錯、适應性調整和優化,這些維護工作将耗費比開發新軟體更多的人力和物力。

随着軟體重要性的日漸凸現,軟體業界一直試圖開發新的技術,使得高品質計算機程式的開發和維護更容易、更快捷、成本更低廉。一些技術主要針對特定應用領域(例如網站設計和實作),另一些着眼于技術領域(例如面向對象系統、面向方面的程式設計),還有一些覆寫面很寬(例如像linux這樣的作業系統)。然而,我們尚未開發出一種可以實作上述所有需求的軟體技術,而且未來能夠産生這種技術的可能性也很小。人們也尚未将其工作、享受、安全、娛樂、決策以及全部生活都完全依賴于計算機軟體。這或許是正确的選擇。

本書為需要建構正确軟體的計算機軟體工程師提供了一個架構。該架構包括過程、一系列方法以及我們稱為軟體工程的各種工具。

<b>1.1 軟體的本質</b>

現在的軟體具有産品和産品傳遞載體的雙重作用。作為産品,軟體顯示了由計算機硬體展現的計算能力,更廣泛地說,顯示的是由一個可被本地硬體裝置通路的計算機網絡展現的計算潛力。無論是安裝在行動電話、手持平闆電腦、桌上型電腦還是大型計算機中,軟體都扮演着資訊轉換的角色:産生、管理、擷取、修改、顯示或者傳輸各種不同的資訊,簡單如幾個比特的傳遞,複雜如從多個獨立的資料源擷取的多媒體示範。而作為産品生産的載體,軟體提供了計算機控制(作業系統)、資訊通信(網絡)以及應用程式開發和控制(軟體工具和環境)的基礎平台。

軟體提供了我們這個時代最重要的産品——資訊。它轉換個人資料(例如個人财務交易),進而使資訊在一定範圍内發揮更大的作用;它通過管理商業資訊提升競争力;它為世界範圍的資訊網絡提供通路(例如網際網路),并為各類格式的資訊提供不同的查詢方式。軟體還提供了可以威脅個人隐私的載體,并給那些懷有惡意目的的人提供了犯罪的途徑。

在最近半個世紀裡,計算機軟體的作用發生了很大的變化。硬體性能的極大提高、計算機結構的巨大變化、存儲容量的大幅度增加以及種類繁多的輸入和輸出方法都促使基于計算機的系統更加先進和複雜。如果系統開發成功,那麼“先進和複雜”可以産生驚人的效果,但是同時複雜性也給系統的開發人員和防護人員帶來巨大的挑戰。

現在,一個龐大的軟體産業已經成為了工業經濟中的主導因素。早期的獨立程式員也已經被專業的軟體開發團隊所代替,團隊中的不同專業技術人員可分别關注複雜應用系統中的某一部分技術。然而同過去的獨立程式員一樣,開發現代計算機系統時,軟體開發人員依然面臨同樣的問題:

為什麼軟體需要如此長的開發時間?

為什麼開發成本居高不下?

為什麼在将軟體傳遞顧客使用之前,我們無法找到所有的錯誤?

為什麼維護已有的程式要花費如此多的時間和人工?

為什麼軟體開發和維護的進度仍舊難以度量?

種種問題顯示了業界對軟體以及軟體開發方式的關注,這種關注導緻了業界對軟體工程實踐方法的采納。

1.1.1 定義軟體

今天,絕大多數專業人員和許多普通人認為他們對軟體大概了解。真的是這樣嗎?

來自教科書的關于軟體的定義也許是:

軟體是:(1)指令的集合(計算機程式),通過執行這些指令可以滿足預期的特性、功能和性能需求;(2)資料結構,使得程式可以合理利用資訊;(3)軟體描述資訊,它以硬拷貝和虛拟形式存在,用來描述程式的操作和使用。

當然,還有更完整的解釋。但是一個更加正式的定義可能并不能顯著改善其可了解性。為了更好地了解“軟體”的含義,有必要将軟體和其他人工産品的特點加以區分。軟體是邏輯的而非實體的系統元素。是以,軟體和硬體具有完全不同的特性:軟體不會“磨損”。

圖1-1描述了硬體的失效率,該失效率是時間的函數。這個名為“浴缸曲線”的關系圖顯示:硬體在早期具有相對較高的失效率(這種失效通常來自設計或生産缺陷);在缺陷被逐個糾正之後,失效率随之降低并在一段時間内保持平穩(理想情況下很低);然而,随着時間推移,因為灰塵、振動、不當使用、溫度超限以及其他環境問題所造成的硬體元件損耗累積的效果,使得失效率再次擡高。簡而言之,硬體開始磨損了。

而軟體是不會被引起硬體磨損的環境問題所影響的。是以,從理論上來說,軟體的失效率曲線應該呈現為圖1-2的“理想曲線”。未知的缺陷将在程式生命周期的前期造成高失效率。然而随着錯誤的糾正,曲線将如圖中所示趨于平緩。“理想曲線”隻是軟體實際失效模型的粗略簡化。曲線的含義很明顯——軟體不會磨損,但是軟體退化的确存在。

《實踐者的研究方法》—— 第1章 軟體的本質 1.1 軟體的本質

這個似乎沖突的現象用圖1-2所示的“實際曲線”可以很好地解釋。在完整的生命周期裡,軟體将會面臨變更,每次變更都可能引入新的錯誤,使得失效率像“實際曲線”(圖1-2)那樣陡然上升。在曲線回到最初的穩定失效率狀态前,新的變更會引起曲線又一次上升。就這樣,最小的失效率點沿類似于斜線的形狀逐漸上升,可以說,不斷的變更是軟體退化的根本原因。

磨損的另一方面同樣說明了軟硬體的不同。磨損的硬體部件可以用備用部件替換,而軟體卻不存在備用部件。每個軟體的缺陷都暗示了設計的缺陷或者在從設計轉化到機器可執行代碼的過程中産生的錯誤。是以,軟體維護要應對變更請求,比硬體維護更為複雜。

1.1.2 軟體應用領域

今天,計算機軟體可分為七個大類,軟體工程師正面臨持續的挑戰。

系統軟體——一整套服務于其他程式的程式。某些系統軟體(例如編譯器、編輯器、檔案管理軟體)處理複雜但确定的資訊結構,另一些系統應用程式(例如作業系統構件、驅動程式、網絡軟體、遠端通信處理器)主要處理的是不确定的資料。

應用軟體——解決特定業務需要的獨立應用程式。這類應用軟體處理商務或技術資料,以協助業務操作或協助做出管理或技術決策。

工程/科學軟體——“數值計算”(number crunching)類程式涵蓋了廣泛的應用領域,從天文學到火山學,從自動壓力分析到軌道動力學,從計算機輔助設計到分子生物學,從遺傳分析到氣象學。

嵌入式軟體——嵌入式軟體存在于某個産品或者系統中,可實作和控制面向最終使用者和系統本身的特性和功能。嵌入式軟體可以執行有限的和内部的功能(例如微波爐的按鍵控制),或者提供重要的功能和控制能力(例如汽車中的燃油控制、儀表闆顯示、刹車系統等汽車電子功能)。

産品線軟體——為多個不同使用者的使用提供特定功能。産品線軟體關注有限的及内部的市場(例如庫存控制産品)或者大衆消費品市場。

web /移動app——以網絡為中心,其概念涵蓋了寬泛的應用軟體産品,包括基于浏覽器的app和安裝在移動裝置上的軟體。

人工智能軟體——利用非數值算法解決計算和直接分析無法解決的複雜問題。這個領域的應用程式包括機器人、專家系統、模式識别(圖像和語音)、人工神經網絡、定理證明和博弈等。

全世界成百萬的軟體工程師在為以上各類軟體項目努力地工作着。有時是建立一個新的系統,而有時隻是對現有應用程式的糾錯、适應性調整和更新。一個年輕的軟體工程師所經手項目本身的年限比他自己的年齡還大是常有的事。對于上述讨論的各類軟體,上一代的軟體工程師都已經留下了遺留系統。我們希望這代工程師留下的遺留系統可以減輕未來工程師的負擔。

1.1.3 遺留軟體

成千上萬的計算機程式都可以歸于在前一小節中讨論的7大類應用領域。其中某些是當今最先進的軟體——最近才對個人、企業和政府釋出。但是另外一些軟體則年代較久,甚至過于久遠了。

這些舊的系統——通常稱為遺留軟體(legacy software)——從20世紀60年代起,就成為人們持續關注的焦點。dayani-fard和他的同僚[day99]這樣描述遺留軟體:

遺留軟體系統……在幾十年前誕生,它們不斷被修改以滿足商業需要和計算平台的變化。這類系統的繁衍使得大型機構十分頭痛,因為它們的維護代價高昂且系統演化風險較高。

liu和他的同僚[liu98]進一步擴充了這個描述,指出“許多遺留軟體系統仍然支援核心的商業功能,是業務必不可少的支撐。”是以,遺留軟體具有生命周期長以及業務關鍵性的特點。

然而不幸的是,遺留軟體常常存在另一個特點——品質差。遺留軟體通常擁有數不清的問題:遺留系統的設計難以擴充,代碼令人費解,文檔混亂甚至根本沒有,測試用例和結果并未歸檔,變更的曆史管理混亂……然而,這些系統仍然支撐着“核心的業務功能,并且是業務必不可少的支撐”。該如何應對這種情況?

最合理的回答也許就是什麼也不做,至少在其不得不進行重大變更之前什麼也不做。如果遺留軟體可以滿足使用者的需求并且能可靠運作,那麼它就沒有失效,不需要修改。然而,随着時間的推移,遺留系統經常會由于下述原因而發生演化:

軟體需要進行适應性調整,進而可以滿足新的計算環境或者技術的需求。

軟體必須更新以實作新的商業需求。

軟體必須擴充以使之具有與更多新的系統和資料庫的互操作能力。

軟體架構必須進行改建以使之能适應不斷演化的計算環境。

當這些變更發生時,遺留系統需要經過再工程(第36章)以适應未來的多樣性。當代軟體工程的目标是“修改在進化論理論上建立的方法論”,即“軟體系統不斷經曆變更,新的軟體系統從舊系統中建立起來,并且……新舊所有系統都必須具有互操作性和協作性。”[day99]。