软件开发

软件开发（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 通常包含自动编译、错误语法高亮、调试辅助、与版本控制系统的集成，以及对测试的半自动化支持等功能。

### 版本控制

版本控制是管理软件变更的常用方式。每次签入新版本时，软件会对所有已修改文件进行备份。若多名程序员同时开发同一软件，版本控制系统可管理其代码变更的合并过程：系统会标出两组变更之间存在冲突的情况，并允许程序员解决冲突。

### 视图模型

视图模型是一种框架，提供了对系统及其环境的多种视角，用于软件开发过程中。它是底层语义的图形化表示。视点与视图的目的在于帮助工程师理解极度复杂系统，并围绕专业领域组织问题要素。在物理密集型系统的工程设计解中，视点通常对应工程组织内的能力与职责分工。

### 适应度函数

适应度函数是自动化的客观测试，用于确保新的开发成果不偏离既定的约束、检查项与合规控制要求。

## 知识产权

当开发者将开源代码或库集成到专有产品中时，知识产权问题随之而来——因为大多数软件开源许可证要求对代码的修改须以相同许可证发布。作为替代方案，开发者可选择使用专有替代方案，或自行编写相应的软件模块。