軟體開發

軟體開發（Software development）是設計、創建、測試和維護軟體應用程式以滿足特定使用者需求或業務目標的過程。軟體開發的範疇超越了單純的編程或編寫原始碼，涵蓋了構想目標、評估可行性、分析軟體需求、設計、測試與發布等完整環節。該過程是軟體工程的組成部分，後者還包括組織管理、項目管理與配置管理等內容。

軟體開發涉及眾多技能與職業分工，包括編程、測試、文檔編寫、圖形設計、使用者支持、市場營銷以及資金募集等。常用的工具類型有編譯器、集成開發環境（IDE）和版本控制系統。

具體的開發過程因項目而異，可能遵循正式的書面標準，也可能隨項目發展而靈活演進。開發流程可以是順序式的（即完成一個主要階段後再進入下一個），也可以採用迭代式方法——對各個小模塊分別進行設計、實現與測試——從而降低風險與成本、提升質量。

「軟體開發」一詞有時亦特指電腦編程，即編寫和維護原始碼的過程。軟體一般通過某種或數種程序設計語言、在特定的電腦平台上實現，通常藉助軟體開發工具進行。

## 開發方法論

<image>

各種開發方法論分別適用於不同類型的項目，具體取決於技術、組織、項目和團隊等因素。

- 最簡單的方法論是「編碼後修復」（code and fix），通常由一名程式設計師完成小型項目時採用。程式設計師在簡略考慮程序目的後即開始編碼，運行檢查是否可用，完成後即發布產品。此方法適合製作原型，但不適用於較複雜的程序。
- 自頂向下的瀑布模型將可行性分析、需求分析、設計、開發、質量保證和實施依次順序推進，要求每一步完成後才能進入下一步，容易造成延誤，且無法在必要時回溯修改前一步驟。
- 迭代式流程將上述各步驟相互交織，以提高靈活性與效率，並制定更為切實可行的進度計劃。與其一次性完成整個項目不如每次只對某一組件推進大部分步驟。迭代與增量開發還允許開發者優先實現最重要的功能，在必要時放棄優先級較低的功能。敏捷開發是一種流行的迭代方法，最初面向中小型項目設計，旨在讓開發者對自己負責的功能擁有更多主導權，從而降低工期或成本超支的風險。敏捷的衍生方法包括極限編程和Scrum。開源軟體開發因依賴分布式志願者網路，通常採用敏捷方法，並發進行設計、編碼和測試。
- 在敏捷之外，一些企業將資訊技術（IT）運維與軟體開發整合，稱為DevOps，若進一步納入電腦安全則稱為DevSecOps。DevOps 涵蓋持續開發、持續測試、將新代碼集成入版本控制系統、部署新代碼，有時還包括向客戶交付代碼，目標是更快速、高效地提供 IT 服務。

許多編程方法論還注重儘早發現安全漏洞和程序錯誤等問題（即「左移測試」），以降低後期追蹤和修復的成本。

2009年的數據顯示，僅有32%的軟體項目能按時、按預算並以完整功能交付；另有44%的項目雖完成交付，但至少缺少一項計劃功能；其餘24%的項目在發布前即被取消。

## 生命周期

軟體開發生命周期描述了軟體開發過程的典型階段。

### 可行性分析

軟體產品創意的來源多種多樣，可源自市場調研（包括潛在新客戶人口結構分析）、現有客戶、拒絕購買的銷售潛在客戶、公司內部開發人員，或具備創造力的第三方。軟體產品創意通常首先由市場營銷人員從經濟可行性、與現有分銷渠道的契合度、對現有產品線的可能影響、所需功能特性及與公司營銷目標的一致性等維度進行評估。在市場評估階段，成本與時間假設亦會受到審查。可行性分析會估算項目的投資回報率、開發成本及時間跨度；基於此分析，公司可決定是否繼續投入開發。決定開發後，公司的目標是在估算成本與時間內以高質量（即缺陷最少）和預期功能交付產品；然而，大多數軟體項目都會有所延期，有時不得不為趕上截止日期而在功能或質量上作出妥協。

### 需求分析

軟體分析從需求分析開始，旨在獲取軟體的業務需求。識別需求的挑戰在於：當前或潛在使用者可能持有不同乃至相互衝突的需求，可能無法清晰表達自身需求，並可能在開發過程中不斷變更需求。分析的最終成果是一份供開發者參照執行的詳細產品規格說明書。軟體分析師常將項目分解為較小的對象和可復用的組件，以提升成本效益、效率與可靠性。對項目進行分解還可能支持多線程實現，使程序在多處理器電腦上顯著提速。

在軟體開發的與分析設計階段，常使用結構化分析將客戶需求分解為可由程式設計師實現的片段。程序的底層邏輯可通過數據流圖、數據字典、偽代碼、狀態轉換圖或實體關係圖等方式加以表達。若項目包含尚未建模的遺留軟體，則應先對其建模，以確保其能正確地與較新的軟體集成。

### 設計

設計涉及軟體實現方案的選擇，例如使用哪種程式語言和資料庫軟體，或如何組織硬體與網路通信。設計過程可與使用者協商迭代，通過反覆試驗確認需求。設計工作常需要精通資料庫設計、界面架構以及伺服器等硬體性能的專業人員參與。設計師常嘗試在軟體功能中識別設計模式，以抽離出可通過面向對象編程復用的獨立模塊。典型示例之一是模型-視圖-控制器（MVC），它是圖形使用者界面與後端之間的一種接口架構。

### 編程

軟體開發的核心在於編寫和理解為實現預期功能的代碼。編寫代碼有多種策略。高內聚的軟體由各自獨立的組件構成；而組件之間的「耦合」（即相互依賴關係）被認為是不良設計，因為它增加了維護的難度。軟體程式設計師往往未能遵循行業最佳實踐，導致代碼低效、難以理解，或缺乏對功能的文檔說明——這種情況在存在截止日期壓力時尤為突出，進而使測試、調試和修訂代碼的工作變得更加困難。代碼重構是一種在不改變外部行為的前提下對現有代碼進行結構調整的技術，常用於改善代碼的設計、可讀性或可維護性。

自大型語言模型普及以來，Q135423070已被用於輔助人工編程，即讓AI處理商業及語法規則並生成代碼。

### 測試

測試是確保代碼正確運行且不出錯的過程。每位軟體開發者都需對自己的代碼進行調試，以確認代碼按預期執行——尤其重要的是，軟體必須能處理所有可能的輸入，即使結果不正確亦然。其他開發者開展的代碼審查常用於審核新提交的代碼，據估計可大幅減少測試完成後仍然存在的缺陷數量。代碼提交後，質量保證部門（在大多數大型公司中，由非程式設計師組成的獨立部門）會對整個軟體產品的準確性進行測試；依據所採用的方法論，測試活動也可能貫穿軟體開發生命周期的各個階段。源自原始軟體需求的驗收測試是常用工具之一。質量測試通常還包括壓力測試與負載檢測（驗證軟體是否能承受高強度的輸入或使用量）、集成測試（確保軟體與其他軟體的良好集成）以及兼容性測試（衡量軟體在不同作業系統或瀏覽器上的性能表現）。若測試在代碼編寫之前完成，則稱為測試驅動開發。

### 生產發布

生產階段是將軟體部署給最終使用者的階段。在此階段，開發者可能會為使用者創建技術支持資源，或制定修復早期未被發現的缺陷與錯誤的流程。若使用者需求發生變化或之前存在誤解，開發過程可能需要回溯至更早的階段重新推進。

## 從業人員

軟體開發由軟體開發者承擔，通常以團隊協作方式進行。團隊成員之間高效的溝通是成功的關鍵——團隊規模較小、成員之間有合作經驗且地理位置相近時，溝通更易實現。良好的溝通還有助於在開發早期發現問題，避免重複勞動。許多開發項目通過確保多名成員熟悉各個組件，來規避因關鍵知識集中於單一人而帶來的風險。

軟體開發涉及多種專業人員，不僅包括程式設計師，還包括制定產品戰略與技術路線圖的產品經理，以及精於測試、文檔撰寫、圖形設計、使用者支持、市場營銷和資金募集的各類人員。專有軟體的開發者通常有償工作，而開源軟體的大多數貢獻者則是志願者，也有部分人員受僱於商業模式不以銷售軟體本身為核心（而以服務或對開源軟體的定製修改為核心）的企業。

## 模型與工具

### 電腦輔助軟體工程

電腦輔助軟體工程（CASE）是對軟體開發進行部分自動化的工具集合。CASE 使設計者能夠勾勒出程序的邏輯結構，既可用於規劃待編寫的程序，也可用於分析已有程序，以便將其與新代碼集成或進行逆向工程（例如更改程式語言）。

### 文檔

軟體文檔通常分為兩類，且一般分開維護：一類面向軟體開發者，另一類面向最終使用者，幫助使用者使用軟體。開發者文檔大多以代碼注釋形式呈現，涵蓋各文件、類和方法，說明應用程式編程接口（API）——即其他程序如何調用該模塊——以及實現細節，有助於新開發者快速上手項目。在敏捷開發中，文檔常與代碼同步編寫。面向使用者的文檔則更多由技術寫作人員負責撰寫。

### 工作量估算

準確的估算在可行性階段及按時、按預算交付產品方面至關重要，估算工作通常由項目經理委託執行。由於工作量估算與應用程式的最終規模直接相關，因此受到需求中功能數量的顯著影響——需求越多，開發成本越高。與功能無關的因素，如開發者的經驗水平和代碼可復用性，也是估算時不可忽視的重要考量。截至2019年，大多數用於估算軟體開發時間和資源的工具是為傳統應用程式設計的，並不適用於Web應用或移動應用。

### 集成開發環境

集成開發環境（IDE）提供了超越普通文本編輯器的增強功能，支持軟體開發工作。IDE 通常包含自動編譯、錯誤語法高亮、調試輔助、與版本控制系統的集成，以及對測試的半自動化支持等功能。

### 版本控制

版本控制是管理軟體變更的常用方式。每次簽入新版本時，軟體會對所有已修改文件進行備份。若多名程式設計師同時開發同一軟體，版本控制系統可管理其代碼變更的合併過程：系統會標出兩組變更之間存在衝突的情況，並允許程式設計師解決衝突。

### 視圖模型

視圖模型是一種框架，提供了對系統及其環境的多種視角，用於軟體開發過程中。它是底層語義的圖形化表示。視點與視圖的目的在於幫助工程師理解極度複雜系統，並圍繞專業領域組織問題要素。在物理密集型系統的工程設計解中，視點通常對應工程組織內的能力與職責分工。

### 適應度函數

適應度函數是自動化的客觀測試，用於確保新的開發成果不偏離既定的約束、檢查項與合規控制要求。

## 智慧財產權

當開發者將開原始碼或庫集成到專有產品中時，智慧財產權問題隨之而來——因為大多數軟體開源許可證要求對代碼的修改須以相同許可證發布。作為替代方案，開發者可選擇使用專有替代方案，或自行編寫相應的軟體模塊。