軟件開發
軟件開發是指設計和構建計算機程序以滿足用戶需求的過程。這個過程通常被稱為軟件開發生命周期(SDLC),它包括需求分析、設計、編程、測試和維護等多個階段。這些階段的目標是創建一個滿足用戶需求的高質量軟件產品。
軟件開發經歷了不同的階段,包括編程階段、軟件設計階段和軟件工程階段。常見的軟件過程模型包括瀑布模型、原型模型、螺旋模型、組件復用模型和敏捷軟件開發過程模型,以滿足不同項目的需求。軟件開發環境可以根據解決的問題或開發環境的演變趨勢進行分類。軟件開發工具通常由三部分組成:工具本身、工具界面和工具用戶界面。常用的軟件開發語言包括Java、Python、C/C++、JavaScript等。
未來,云計算、低代碼和無代碼開發、人工智能、物聯網、DevOps、區塊鏈和遠程辦公等趨勢將進一步推動軟件開發的發展,并為用戶提供更友好的體驗和功能。
定義概述
軟件是用于操作計算機和執行特定任務的一系列指令、數據或程序。軟件開發是設計、創建、測試和維護不同軟件應用程序或系統的集體過程,包括從需求分析、設計、編程、測試到維護的所有階段。這些階段反映了系統開發生命周期(SDLC)的所有方面,包括滿足業務需求的設計、滿足指定設計的開發、將軟件部署到生產環境以及后續的支持和維護。
發展歷程
軟件開發的歷史可以追溯到1804年,當時約瑟夫·瑪麗·雅卡爾在紙板上打孔,以引導織機編織圖案。
19世紀末,“計算機之父”查爾斯·巴貝奇發明了第一臺機械計算機,被稱為分析引擎,后來成為其他計算機設計和電子計算機的靈感來源。雖然這些機器還沒有制造出來,但這并不意味著不能為它們編寫“軟件”。
1843年,世界上第一個程序員阿達·洛芙萊斯為查爾斯·巴貝奇的分析引擎開發了一種計算伯努利數的算法,這被認為是第一個計算機程序。同時,她的工作對計算機科學的發展產生了重要影響。她不僅將機器視為執行數學計算的工具,還認識到計算機可以處理不同類型的信息。她的思想開創了圖靈機的概念,奠定了計算機科學的基礎。
1889年,赫爾曼·何樂禮發明了霍爾瑞斯制表機,它通過編程對數據進行計數和制表。霍爾瑞斯制表器的發明標志著數據處理和自動化的重要進展,對軟件開發的演變產生了一定的影響。
1936年,艾倫·圖靈提出了圖靈機的概念,其關鍵思想是抽象計算過程,被認為是計算機科學的開創性理論之一,成為計算機科學中許多理論和算法的基礎。隨著計算機技術的發展,軟件開發經歷了程序設計、軟件設計和軟件工程階段。編程階段出現在1946-1955年。1946年,美國物理學家和工程師約翰·莫奇利和約翰·p·埃克特在賓夕法尼亞大學共同發明了第一臺通用計算機(ENIAC)。它是一個巨人,有18000個電子管,面積170平方米,重30噸,消耗約150千瓦的功率,每秒進行5000次運算。ENIAC是一個研究主機,使用電子管作為元件。它體積龐大,耗電量大,容易發熱,并且不能工作太長時間。在這個第一代計算機(電子管)階段,還沒有軟件的概念。程序設計主要圍繞硬件開發,追求節省空間和編程技巧。規模很小,工具簡單,沒有明確的分工(開發人員和用戶),也沒有文檔(程序列表除外),主要用于科學計算。
1948年,一位名叫湯姆·基爾本的英國計算機科學家使用8個字的工作內存和17個字的指令編寫了世界上第一個軟件。他和他的同事弗雷迪·威廉姆斯開發了世界上最早的計算機之一——曼徹斯特小型實驗機(SSEM),并運行基爾本的代碼進行數學計算。
1949年,John Mauchly提出了第一個高級編程語言Brief Code(后來稱為短代碼),并由William F. Schmidt實現。Brief Code是第一種函數式編程語言,它以易于理解的數學表達式呈現,但每次運行程序時都必須將其轉換為機器代碼,這使得軟件開發過程更加緩慢。
1951年,美國海軍軍官格雷斯·霍珀為UNIVAC創建了第一個計算機語言編譯器A-0(算術語言版本0),它是COBOL的前身。
1952年,Alick Glennie開發了Autocode,這是第一種可以由編譯器直接轉換為機器代碼的編譯語言,也是描述一種曼徹斯特Mark 1自動編碼系統的術語。兩年后,R.A. Brooker開發了第二個版本的Autocode,稱為Mark 1 Autocode。
1954年,IBM的一個團隊開發了FORTRAN語言,這是至今仍在使用的最古老的高級編程語言。軟件設計階段出現在1956-1970年。這是第二代計算機(晶體管數字計算機)和第三代計算機(集成電路數字計算機),商用主機和商用微型計算機已逐漸出現。其特點是:硬件環境相對穩定,有軟件作坊式的開發組織形式;產品軟件(可購買)被廣泛使用,從而建立了軟件的概念,出現了BIOS、操作系統和數據庫管理系統等系統軟件,并出現了瀑布模型。隨著計算機技術的發展和計算機應用的日益普及,軟件系統的規模越來越大,從科學計算到商業應用,高級編程語言層出不窮,應用領域不斷擴大,開發人員和用戶分工明確,對軟件的需求急劇增加,逐漸形成了結構化編程和結構化分析與設計的軟件開發技術,但軟件產品質量不高,生產效率低,導致軟件危機的出現。即落后的軟件生產模式無法滿足快速增長的計算機軟件需求,導致軟件開發和維護過程中出現一系列嚴重問題。
1958年,一個科學委員會開發了ALGOL,一種用于研究和科學目的的編程語言。Java和許多其他高級語言在某種程度上是從這種語言演變而來的。
1959年,格蕾絲·霍珀和鮑勃·貝默開發了COBOL(通用商業語言),這是第一種可以在各種類型或品牌的計算機上運行的高級編程語言。它仍然廣泛應用于卡處理、ATM機甚至電影中的視覺效果。同樣在1959年,麻省理工學院的約翰·麥卡錫為開發人工智能創建了第一版LISP語言,該語言一直沿用至今。
1964年5月1日,由John Kemeny和Thomas Kurtz開發的BASIC語言向公眾推出。許多商業應用程序仍在使用BASIC語言。微軟的Visual BASIC(VB)在標準BASIC基礎上增加了面向對象的功能和圖形用戶界面。軟件工程階段從1970年開始出現。這是第四代計算機(大規模集成電路機)及其后期階段。個人電腦已經普及,圖形操作系統已經建立。軟件危機迫使人們研究和改變軟件開發的技術手段和管理方法,形成了現代結構化方法、面向對象編程和軟件重用,并開始使用增量進化的開發模型。從此,軟件生產進入了軟件工程時代。這一階段的特點是:硬件向巨型化、小型化、網絡化和智能化四個方向發展,數據庫技術成熟并得到廣泛應用,出現了第三代和第四代編程語言;第一代軟件技術(結構化程序設計)在數值計算領域取得了突出成就;第二代軟件技術(軟件測試技術、方法和原理)用于軟件生產過程;第三代軟件技術(處理需求定義技術)用于軟件需求分析和描述。
1972年,丹尼斯·里奇在貝爾實驗室開發了C語言,該語言成為當時最流行的編程語言之一,并對后來的許多編程語言產生了巨大影響。同年,Donald D. Chamberlin和Raymond F. Boyce開發了SQL(結構化查詢語言),它是為數據庫的使用而設計的,SQL仍然是最流行的數據庫語言之一。從20世紀60年代末到70年代末,有許多流行的編程范例,如Simula、C和Prolog。上世紀七八十年代,隨著Apple II系統的發布,軟件開發開始發揮重要作用。與此同時,與蘋果Apple II系統競爭的產品VisiCalc問世,并首次將電子表格軟件帶到公眾面前。隨著人們對個人電腦領域越來越感興趣,許多公司,如行業巨頭IBM,被吸引進入該市場。然而,盡管它被稱為“個人電腦”,但這一時期開發的大多數軟件都與工作和商業社區密切相關,其中最重要的應用程序是Microsoft Word和Excel。
在20世紀80年代,另一個重要趨勢是使用模塊,即代碼的大規模組織單元。與此同時,面向對象的特性,如封裝、繼承和多態也起源于這十年。1983年,比雅尼·斯特勞斯特魯普開發的C++引入了面向對象編程的概念,在游戲引擎和Web開發中得到了廣泛應用。同年,Objective-C語言發布并應用于蘋果的操作系統、macOS和IOS。這一時期的其他重要編程語言包括Ada(1983年)、Common Lisp(CL)(1984年)、Eiffel(1984年)、Perl(1987年)和TCL腳本語言(1988年)。
開源程序的發布也成為改變軟件開發規則的重要力量,軟件開發在20世紀90年代開始流行,主要是由在線興趣驅動的。例如,Linux內核的最早版本(后來發展成為同名操作系統)于1991年在線發布。
同樣在1991年,Guido Van Rossum創建了一種非常用戶友好的編程語言Python,這是當今最流行的語言之一。1995年,Brendan Eich僅用10天就創建了JavaScript,這是使用最廣泛的編程語言之一,也是萬維網的核心技術之一。同年,由詹姆斯·高斯林和太陽微系統公司的其他開發人員開發的Java語言向公眾推出。
20世紀90年代創建的其他著名編程語言包括Haskell(1991年)、Visual Basic(1991年)、Lua(1993年)、R(1993年)、Ruby(1995年)、Ada 95(1995年)、PHP(1995年)和Rebol。函數式編程、數據分析和Web開發也在此期間得到了發展。自1996年以來,計算機開始通過移動設備影響公眾,如PDA(Palm OS)和黑莓系列。
2001年,微軟開發了C#語言,它與C++、Java和Visual Basic非常相似,被廣泛用于微軟產品和桌面應用程序的開發。2003年,Martin Odersky為Android開發創建了Scala語言。同年,谷歌開發了Go語言來解決大型軟件系統出現的問題。2007年,蘋果推出了iPhone,標志著移動技術新時代的開始。2012年發布的TypeScript語言是JavaScript語言的語法超集,增加了靜態類型,它也是Angular框架的重要組成部分。2014年,蘋果開發了Swift語言來取代C#、C和C++。
在Rust世紀出現了許多其他重要的編程語言,例如action script(2000年)、D(2001年)、Scratch(2002年)、Groovy(2003年)、F #(2005年)、PowerShell(2006年)和clo jure(2007年)。
隨著互聯網技術的蓬勃發展,網絡操作系統和中間件平臺也促進了軟件開發技術的發展和成熟,敏捷開發方法逐漸流行起來。未來有望在互聯網平臺上進一步整合資源,形成高效可信的虛擬環境,更好地服務所有用戶。軟件復用和軟件構件技術被認為是解決軟件危機的現實途徑和實現軟件工業化生產的必要手段。軟件工程將向開放計算方向發展,確定行業的基本框架,并引導行業的發展和技術融合。
生命周期
軟件項目的開發需要先計劃,后實施。在軟件開發和維護的漫長生命周期中,需要完成許多不同性質的任務,這意味著要將軟件生命周期分為幾個階段,并據此制定可行的計劃,然后嚴格按照計劃管理軟件開發和維護。
軟件開發生命周期(SDLC)提供了一個國際標準,軟件公司可以使用該標準來構建和改進他們的計算機程序。它可以分為以下幾個階段:可行性研究、需求分析、總體設計、詳細設計、系統測試、系統部署和系統維護。
可行性研究:在可行性研究階段,需要進行廣泛的市場調查,以確定產品的可行性并同時規劃項目。這一階段涉及資源分配、產能規劃、項目調度、成本估算和供應。理想情況下,項目經理和開發人員應該與操作和安全團隊密切合作,以確保所有相關方的意見都得到充分考慮。這一階段的主要成果包括詳細的項目計劃、時間表、準確的成本估算和必要的采購要求。
需求分析:需求分析是軟件開發生命周期的第二階段。在此階段,利益相關者就提議產品的技術和用戶要求及規格達成一致,以實現其目標。此階段的首要任務是收集需求,以了解和歸檔用戶和其他利益相關者的需求。通過需求分析,提供每個組件測試參數的詳細概述、范圍、開發人員和任務,以確保高質量的產品開發。同時,這個階段涉及開發人員、用戶、測試人員、項目經理和質量保證人員之間的密切合作。程序員也會在這個階段選擇合適的軟件開發方法,如瀑布模型或V模型。團隊將此階段的結果記錄在軟件需求規范文檔中,該文檔可作為團隊在項目實施過程中的參考。
總體設計:總體設計是軟件開發生命周期的第三階段。在這個階段,架構師和開發人員不僅要制定所需的高級技術規范以創建符合要求的軟件,還要選擇或構建軟件的底層架構,為整個系統提供可靠的基礎。這個階段可能還包括一些快速原型制作。利益相關者將討論風險級別、團隊組成、適用技術、時間、預算、項目限制、方法和架構設計等因素。設計規范文檔(DSD)詳細說明了產品的架構設計、組件、通信、前端表示和用戶流。這一步為開發人員和測試人員提供了一個模板,并減少了成品出現缺陷和延遲的可能性。
細節設計:詳細設計階段是軟件開發過程中的關鍵步驟。在此階段,開發人員開始實際編寫代碼以開發軟件,并根據公司的程序和指南,基于前一階段商定的產品規格和要求進行編碼。前端開發人員構建接口,后端開發人員創建與數據庫相關的數據。同時,詳細設計階段還涉及相關的解決方案設計,并使用流程模型和故事板詳細定義解決方案的思想。開發人員使用建模工具構建模型,用于早期驗證、原型制作和設計模擬。為了保證軟件的質量,開發人員用相應的編程語言編寫設計代碼,并參與同行和團隊的評估。此外,在此階段應定期聯系業務利益相關者,以確保他們的期望得到滿足。最后,這個階段的輸出是可測試的功能軟件。
系統測試:系統測試階段是軟件開發過程中保證軟件質量的關鍵環節。在此階段,測試人員通過單元測試(功能測試)、集成測試、性能測試和安全測試來驗證產品的功能,并確保其按照需求分析文檔的要求進行。一些團隊選擇自動化測試執行過程,并使用持續集成工具(如Appveyor或Travis CI)更有效地發現錯誤。測試人員負責通知開發人員代碼中的缺陷。在開發人員確認并修復這些缺陷后,測試人員將重復測試過程,直到他們確保軟件沒有問題并且可以按要求運行。此外,系統測試階段還體現在軟件設計和編碼過程中,包括預先計劃的場景測試和性能測試,以模擬應用程序的實際負載,從而確保軟件在各種條件下的穩定性和可靠性。
系統部署:系統部署階段的目標是將軟件部署到生產環境中以供實際使用。在高度成熟的企業中,這一階段通常是高度自動化的,軟件一旦準備好就將部署到生產環境中。對于成熟度較低的企業或一些高度標準化的行業,部署過程可能涉及一些人工審批。在大中型企業中,為了簡化部署過程,通常使用應用程序發布自動化(ARA)工具,該工具可以與持續集成工具集成,使將應用程序部署到生產環境的過程更加自動化。此外,系統部署階段還負責響應和解決用戶在使用過程中遇到的問題,并在必要時遷移數據。
系統維護:軟件開發周期不會在系統維護的這個階段結束,必須不斷監控軟件以確保其正常運行。作為軟件開發過程中的關鍵環節,系統維護階段致力于確保軟件的正常運行和持續改進。在生產環境中發現的問題和缺陷必須及時報告和響應,這通常會將工作重新引入開發過程。對于bug修復,可能不需要經歷整個開發過程,但至少需要一個簡化的過程來確保修復不會引入其他問題(回歸問題),以避免問題擴大。
在系統維護階段,團隊還需要管理和評估整個項目,以保持應用程序生命周期的質量和交付。為此,使用能力成熟度模型(CMM)等評估模型來評估開發過程,以確保過程的科學性和效率。同時,構建不同版本的軟件也是現階段的任務之一。通過確定質量保證優先級和發布標準,團隊可以解決和跟蹤系統缺陷,并確保軟件在迭代過程中不斷優化和改進。