软件开发是指专门针对软件创建、设计、部署和支持过程的一系列计算机科学活动。

软件本身是对计算机发号施令的一系列指令或程序。 它独立于硬件,并支持对计算机进行编程。 其分为三种基本类型:

系统软件 ,用于提供诸如操作系统、磁盘管理、实用程序、硬件管理及其他运营必备要素的核心功能。

编程软件 ,用于为程序员提供工具,如文本编辑器、编译器、连接器、调试器和其他用于创建代码的工具。

应用软件 (应用程序或应用),可帮助用户执行任务。 比如办公生产力套件、数据管理软件、媒体播放器和安全程序。 应用程序还指代 Web 和移动应用程序,如用于在 Amazon.com 上购物、通过 Facebook 进行社交互动或将照片发布到 Instagram 的应用。 1

可能存在的第四种类型为 嵌入式软件 。 嵌入式系统软件用于控制通常不被视为计算机的机器和设备,如电信网络、汽车、工业机器人等等。 这些设备及其软件可作为 物联网 (IoT) 的一部分实现连通。 2

软件开发主要由程序员、软件工程师和软件开发人员进行。 这些角色彼此互动且存在交叠,另外他们之间的互动方式在开发部门和社区间变化明显。

程序员或编码员 负责编写源代码来对计算机进行编程,目的是完成诸如合并数据库、处理在线订单、路由通信、执行搜索或显示文本和图形等具体任务。 程序员通常会解释来自软件开发人员和工程师的指令,并利用 C++ 或 Java 等编程语言来实施指令。

软件工程师 运用工程原理来构建软件和系统,以解决问题。 他们使用建模语言和其他工具来设计解决方案,这些解决方案往往可用于解决常规问题,而不是仅解决具体实例或客户的相关问题。 软件工程解决方案遵循科学方法,且必须具有现实可用性,其作用类似于桥梁或电梯。 随着产品越来越智能,并新增了大量微处理器、传感器和软件,软件工程师的职责范围也随之扩张。 不仅有更多的产品依靠软件获得了市场优势,另外产品的软件开发工作必须与产品的机械和电气开发工作协调一致。

软件开发者 相比工程师而言,其角色不那么正式,且可能与具体项目领域密切相关,如编写代码。 同时,他们还推动着整个软件开发生命周期的发展,包括跨职能团队合作,以将需求转换为功能,管理开发团队和流程,并开展软件测试和维护。 3

软件开发工作并不仅限于编码人员或开发团队。 科学家、设备制造商和硬件制造商等专业人员尽管不是主要的软件开发人员,但他们也可以创建软件编码。 同时软件开发也不局限于传统的信息技术行业,如软件或半导体业务。 事实上, 根据 Brookings Institute(链接位于 ibm.com 外部)研究报告 ,这些企业中“有不到一半的公司会进行软件开发。”

但一个重要的区别是,他们从事的是 定制软件开发 ,而非商业软件开发。 定制软件开发是针对一系列特定用户、功能或组织过程设计、创造、部署和维护软件的过程。 相反,成熟的商业软件 (COTS) 旨在满足一系列广泛的需求,可进行包装并用于商业营销和分发。

开发软件通常涉及以下步骤:

  • 选择方法 来建立框架,然后在其中应用软件开发步骤。 它描述项目的整体工作流程或路线图。 方法可能包括 敏捷开发 DevOps 快速应用开发 (RAD)、 规模化敏捷框架 ( (SAFe)、 瀑布式方法 等。 (见术语表。)
  • 收集需求 以了解并归档用户和其他利益相关者所需的内容。
  • 选择或构建一个架构 作为底层结构,供软件在其中运行。
  • 进行解决方案的相关设计 ,以解决需求反映出的问题,通常涉及流程模型和故事板。
  • 利用建模工具建立模型 ,此类工具利用 SysML 或 UML 等建模语言开展早期验证、原型制作和设计模拟。
  • 以相应的编程语言构造代码 。 参与同行和团队评估,尽早排除问题,更快开发出高质量软件。
  • 在软件设计和编码过程中借助预先计划的场景进行 测试 ,同时开展性能测试,以模拟应用程序上的负载测试。
  • 管理配置和缺陷 以了解所有软件工件(需求、设计、编码和测试),并构建不同版本的软件。 确定质量保证优先级和发布标准,以解决并跟踪缺陷。
  • 部署 软件以供使用,以及响应和解决用户问题。
  • 如有必要,将数据从现有应用程序或数据源 迁移 至全新或更新的软件。
  • 管理和评估项目 ,以保持应用程序生命周期的质量和交付,同时通过 能力成熟度模型 (CMM) 等模型来评估开发流程。
  • 软件开发流程的一系列步骤融合成了 应用程序生命周期管理  (ALM)。 IBM 的工程管理解决方案是一系列出色的 ALM,支持对并行的机械、电气和软件开发进行管理。

  • 需求分析及规格
  • 设计与开发
  • 维护与支持
  • 软件开发流程步骤可归入生命周期的各个阶段,但生命周期的重要性在于它会不断循环,以实现持续改进。 例如,维护和支持阶段出现的用户问题可能成为下一周期开始时的需求。

    软件开发的重要性还源于它无处不在。 IBM 副总裁,同时也是博客作者 Dibbe Edwards 指出:“随着不断发展的物联网实现了从汽车到洗衣机和恒温器等产品的互联互通,软件已成为众多产品的一个关键优势。”

    几个例子:

  • Soul Machines(链接位于 ibm.com 外部) 使用软件创建人工智能在线顾问,以改进客户服务并提升效率。 此类顾问拥有人脸、表情和声音,可以对客户问题和需求做出智能、善解人意且有效的反应。 它们可以在无需人为干预的情况下回答超过 40% 的客户查询,同时它们还会从其互动中不断学习和改进。 Soul Machines 借助 IBM Watson Assistant 将人工智能 (AI) 功能整合到开发流程,在大约 8 到 12 周的时间内创建并 推出了一款人工智能顾问
  • “这也算是一个种族,”Erik Bak-Mikkelsen 说。 “我们必须跟上市场的发展。” Bak-Mikkelsen 是 car2go(链接位于 ibm.com 外部) 的云运营总监。 他明白,向 car2go 的共享出行应用和车辆交付全新功能部件和功能是取得并保持领先地位的关键。 为此,car2go 将其开发运营迁移到托管服务云 并采用了 DevOps 开发模型。 这最终加速了开发周期,缩短了上市时间,并能够面向未来发展不断扩张。
  • 使用电源线可能存在致命危险。 为了确保安全,工程师利用物理标签和挂锁将电气置于“锁定”状态,避免工作场所出现用电问题。 法国能源公司 Enedis(链接位于 ibm.com 外部) IBM Garage for Cloud 合作开发软件, 以检测这些挂锁和标签并将其连接到共享网络 。 每次从工程师的货车上卸下标签和挂锁时都会进行检测,并记录时间和地理位置。 工程师装上挂锁后,其位置将记录在数字地图中。 所有利益相关者共享同一地图视图,以确保安全,减少停机时间,同时便于维修。 IBM Cloud Garage 协作开发方法支持 Enedis 在三个月内便开发出现场就绪型原型。
  • 利用软件开发 来突显品牌并获得竞争优势 要求熟练运用各种技巧与技术,从而加快软件部署,提升质量和成效。

  • 人工智能 (AI): AI 支持软件仿真人类决策和学习过程。 神经网络、机器学习、自然语言处理和认知能力为开发人员和企业带来了机遇,他们可以开发出引发市场变革并使其保持竞争优势的产品和服务。 IBM Watson 为开发人员提供了在其应用程序中通过应用编程界面或 API 连接并使用人工智能服务的方式。 您还可以使用利用 IBM Watson 检查模棱两可、操作者不明确、复合式或消极性需求、缺少单位或容错、需求不完整和数量不具体等问题,从而完善产品需求。
  • 云原生开发: 云原生开发是一种构建应用程序来利用云环境的方式。 云原生应用由不同的可复用组件(称为微服务)组成,旨在集成到任何云环境中。 这些微服务充当构建块,通常打包在 容器 中。 鉴于此架构,云原生应用可以使用云环境来 提高应用程序性能、灵活性和可扩展性
  • 基于云的开发: 正如 IT 组织求助于云来改善资源管理并削减成本,软件开发组织也是如此。 由此,云可以用作一种快速、灵活和具有成本效益的集成开发环境 (IDE) 或开发 平台即服务 (PaaS) 。 基于云的开发环境可支持编码、设计、集成、测试和其他开发功能。 它们还支持访问 API、微服务、DevOps和其他开发工具、服务和专业知识。
  • 区块链: 区块链是一个以安全的数字化方式链接的账本,可避免多方参与所引发的成本和漏洞,如银行银行、监管机构和其他中介机构。 它具备腾出资本、加速交易过程、降低交易成本等诸多优势,因而将逐步实现企业转型。  区块链为软件开发带来巨大机遇。 开发人员正在使用分布式账本和开源 Hyperledger(链接位于 ibm.com 外部) 技术改变企业的运作方式。
  • 少代码: Forrester 将少代码定义为:“产品和/或云服务采用可视化的声明式技术,而非编程方法,进行应用程序开发,适用于资金和培训资源短缺的客户...” 4 简言之,这是一种开发方法,此方法可降低编码需求,并支持非程序员或平民开发者以较低的成本,快速构建或帮助构建应用程序。
  • 分析: 截止 2020 年,数据研究员、数据开发人员和数据工程师的年度需求缺口 将接近 70万 。 需求意味着公司从数据爆炸中获取洞察和价值是何等重要。 因此,软件开发人员正在将高级分析功能整合到其应用程序中。 基于云的服务和 API 支持更加轻松地指导数据探索、自动执行预测分析并创建仪表板,从而交付新的洞察并改进决策。
  • 基于模型的系统工程 (MBSE) :在 MBSE 中,软件建模语言用于执行早期原型制作、模拟以及软件设计分析,以便尽早验证。 MBSE 中的构建设计可帮助您分析和详细阐述项目需求,并快速从设计转移至实施。
  • 移动: 软件开发人员的主要作用是打造与数据深度连接的移动应用,从而丰富和提升用户体验。 Forrester 发现,“深度整合数字/移动客户数据对于客户与品牌的互动方式有很大影响。”
  • 1 软件,Techopedia(链接位于 ibm.com 外部)
    2 嵌入式软件,维基百科(链接位于 ibm.com 外部)
    3 软件工程师与软件开发人员 - 有何区别? Fullstack Academy(链接位于 ibm.com 外部)
    4 Forrester Wave™:Low-Code development Platforms for AD&D Pros,2017 年第 4 季度,John R Rymer,Forrester Research, Inc.,2017 年 10 月 23 日(链接位于 ibm.com 外部)