官术网_书友最值得收藏!

1.3 什么是軟件工程

面對軟件開發與維護所面臨的挑戰和問題,人們開始探索把工程的方法應用于軟件開發,即以價值為中心,用現代工程的概念、原理、技術和方法進行計算機軟件的開發、運營和維護,把經過時間考驗而證明正確的管理技術和當前能夠得到的最好的技術方法結合起來,以經濟地開發出高質量的軟件并進行有效的維護,這就是軟件工程。

1.3.1 軟件工程的概念和知識體系

“軟件工程”一詞,最早是1968年北大西洋公約組織(NATO)在開創性軟件工程主題會議上提出的,Fritz Bauer給出了如下的定義:“軟件工程就是為了經濟地獲得可靠的且能在實際機器上高效運行的軟件而建立和使用的工程原理”。1990年,ISO/IEC/IEEE系統和軟件工程的術語標準給出一個更全面的定義:軟件工程是將系統的、規范的、可量化的方法應用于軟件的開發、運行和維護,即將工程化應用于軟件。

1999年,ISO和IEC啟動了軟件工程知識體系(Software Engineering Body Of Knowledge,SWEBOK)指南的標準化項目,IEEE和ACM等聯合承擔了這一任務,幾十個國家和地區的幾百名軟件工程專家共同參與了指南的制定。SWEBOK指南在2001年推出第一個版本,2004年和2014年分別推出了2.0版和3.0版,目前4.0版正在評審中,預計2023年推出。SWEBOK指南的目的是促進世界范圍內對軟件工程的一致觀點,闡明軟件工程相對其他學科(如計算機科學、項目管理、數學、工程學)的定位和分界,刻畫軟件工程學科的核心知識。更新后的SWEBOK指南4.0版把軟件工程的知識域分為軟件需求、軟件架構、軟件設計、軟件構造、軟件測試、軟件工程運營、軟件維護、軟件配置管理、軟件工程管理、軟件工程模型與方法、軟件工程過程、軟件質量、軟件安全、軟件工程經濟、軟件工程職業實踐、計算基礎、數學基礎和工程基礎。其中前15個知識域涵蓋軟件工程專業知識,后3個知識域是通用的基礎知識。

1.3.2 軟件價值工程

軟件工程是一門工程,因此其根本目標是創造價值。價值是“事物的作用、重要性或實用性”[4]。軟件價值對不同的對象有不同的含義:對軟件開發方來說,高價值就是低的開發成本;對軟件開發投資方(sponsor)來說,價值是投資收益;對軟件使用者來說,價值就是效益。因此要提高軟件價值,就要提高效益、降低成本。而效益和成本之間沒有固定的計算公式,這就是創新的動力之源。

UMLChina首席專家潘加宇提出一個很有趣也頗有道理的觀點,他認為,軟件需求的根本目標是創新,解決“提高效益”問題,即讓“產品好賣”;而軟件設計的根本目標是模塊化與復用,致力于解決“降低成本”的問題。不僅僅是軟件需求和設計,軟件工程中的每一個環節和每一個活動都是為了價值交付。例如,智能編碼、強調質量和測試而減少返工、進行成本的估算和控制、采用敏捷過程、構建DevOps工具鏈、關注軟件服務的運維質量等,都是以價值為目標所提出的最佳實踐。

軟件工程是一項價值工程,其生產力是持續快速交付價值的能力,即以價值為中心,追求軟件開發的質量、效率和速度,如圖1-2所示。用最樸素直白的表達,就是“多快好省”地開發和運維有價值的軟件。

圖1-2 軟件工程生產力

1.3.3 軟件系統工程

軟件總是處于復雜的系統中,其中包括網絡、服務器、中間件、數據庫等基礎軟硬件以及用戶和軟件所處的物理與社會環境。對用戶及其他干系人(即與軟件系統相關的人或組織)而言,真正有價值的是完整的系統而非其中的軟件。因此,需要在這個更大的系統范圍內思考軟件的定位和作用,進行不同系統組成成分之間的職責分配和協同,明確軟件的需求。

軟件工程的系統思維分為四個方面:

1)全局思維。分析軟件系統內各模塊之間的關系,與外部系統交互,以及這些關系背后的運行邏輯。

2)綜合思維。軟件系統是社會系統和技術系統相互作用而形成的社會技術(social-tech)系統。

3)工程思維。軟件工程應以資源有限、條件不足為前提,去實現“現實世界”的目標。

4)抽象思維。通過抽象提煉復雜軟件系統的本質,對軟件系統進行建模。

如何才能成功地開發出一個復雜的軟件系統?有三條復雜性控制的基本準則——抽象、分解和迭代,這些方法能應用于幾乎所有復雜事物的處理上。

(1)抽象

抽象(abstraction)是從眾多的事物中抽取出共同的、本質性的特征,而舍棄其非本質的特征。共同特征是指那些能把一類事物與他類事物區分開來的特征,這些具有區分作用的特征又稱本質特征。因此抽取事物的共同特征就是抽取事物的本質特征,舍棄非本質的特征。抽象也是一個裁剪的過程,它將不同的、非本質性的特征全部裁剪掉了。

共同特征是相對的,是指從某一個刻面(角度)看是共同的。比如,對于汽車和大米,從買賣的角度看都是商品,都有價格,這是它們的共同特征,而從其生物特性角度看,它們則是不同的。所以在抽象時,同與不同,決定于從什么角度上來抽象。抽象的角度取決于分析問題的目的。

抽象可應用于各領域中以降低問題的復雜度。普遍運用于程序設計中的抽象包括兩種,一種是過程抽象(procedural abstraction),另一種是數據抽象(data abstraction)。對象(類)的抽象則通過操作和屬性,組合了這兩種抽象。

(2)分解

分解(decomposition),即分而治之,是指把一個復雜的問題分解成若干個簡單的問題,然后逐個解決。我們把一個復雜的軟件分解成多個模塊,開發人員能夠在不需要許多交流的情況下,開發不同的模塊,最終把這些模塊集成為一個軟件系統。在分解問題時,應遵循以下原則:

● 每個子問題在細節上處于相同的級別。

● 每個子問題能夠被獨立解決。

● 每個子問題的解決方案綜合起來可以解決原來的問題。

(3)迭代

復雜軟件系統充滿著很多不確定性和挑戰,當我們對此缺少經驗,無法對其進行正確的分解和抽象時,如何進行處理?采用迭代(iteration)開發!在軟件系統全面構造之前,我們先針對不確定的問題做試驗,以獲得經驗。如果問題很復雜,則再做試驗,獲得更多經驗,直至我們有足夠的經驗進行正確的處理。每一輪嘗試就是一個迭代,例如應對需求模糊的需求界面原型迭代,應對技術和架構風險的技術原型迭代,應對進度風險的構造迭代(重要的功能在前期迭代中完成,可以提前交付),等等。前一個迭代中獲得的知識將為后期迭代提供指導。

1.3.4 軟件工程的發展趨勢

在互聯網和人工智能等技術的影響下,軟件工程正在經歷一場深刻的變革,呈現出敏捷化、智能化和全球化的發展趨勢。

(1)敏捷化

面臨在需求和技術不斷變化的場景下快速實現軟件開發和維護的挑戰,軟件的開發和運維呈敏捷化趨勢,Scrum和DevOps等敏捷過程應運而生。敏捷過程強調以人為本,快速響應需求和變化,高效地交付產品,它基于適應而非預測,通過快速、短迭代的開發,不斷產出和演化軟件。敏捷過程高度注重人員間的協作和交流,而非命令和控制,充分發揮工程師的能動性和創造力,同時通過工具鏈來提升工作的效率和質量。

(2)智能化

軟件工程正在進入智能化時代,Codex、ChatGPT和GPT-4等人工智能技術極大地賦能于軟件開發和運維,成為軟件工程師強大的智能助手,可用于軟件需求分析、設計方案推薦、根據上下文自動生成代碼、自動生成測試腳本、自動診斷和修復缺陷、輔助理解代碼等環節。智能化軟件工程不僅能提升軟件工程的效率和質量,使軟件工程師能更多地關注創造性工作,而且將極大地推動最終用戶參與到軟件開發中,最終實現“人人都是程序員”。

(3)全球化

互聯網為人類個體之間的交互和協作提供了一種全新的基礎設施,促進了社會化、全球化的軟件工程實踐的出現。這種新型軟件工程被稱為群體軟件工程,它利用互聯網將全球各地的開發者和用戶協同起來,合作創新,“集眾智、采眾長”,快速開發出高質量的軟件系統。這不僅有利于軟件開發和運維的全球化,同時也推動了軟件生態的建立和產業創新。目前群體軟件工程主要形態有三種,即開源軟件、軟件眾包,以及應用程序商店。

主站蜘蛛池模板: 合水县| 云龙县| 南康市| 定结县| 汉源县| 龙泉市| 新巴尔虎右旗| 武清区| 车致| 赫章县| 博爱县| 休宁县| 阜康市| 大石桥市| 安顺市| 贺州市| 鹰潭市| 遂川县| 宁海县| 安乡县| 呈贡县| 吴川市| 章丘市| 大关县| 莱西市| 和硕县| 彭泽县| 称多县| 柞水县| 大竹县| 莎车县| 来宾市| 府谷县| 梁河县| 山东省| 昭通市| 洞头县| 通海县| 黄陵县| 阜平县| 镇江市|