软件工程概述
首先让我们了解一下软件工程的含义。该术语由两个词组成:软件和工程。
软件不仅仅是程序代码。程序是可执行代码,用于某些计算目的。软件被视为可执行编程代码、相关库和文档的集合。为满足特定要求而制作的软件称为软件产品
工程则完全是关于使用明确定义的科学原理和方法开发产品。

软件工程是与使用明确定义的科学原理、方法和程序开发软件产品相关的工程分支。软件工程的成果是高效、可靠的软件产品。
定义
IEEE 将软件工程定义为:
(1) 应用系统、规范、可量化的方法进行软件的开发、运行和维护;即工程在软件中的应用。
(2) 如上文所述方法的研究。
德国计算机科学家 Fritz Bauer 将软件工程定义为:
软件工程是建立和使用合理的工程原理,以经济的方式获得可靠且在真实机器上高效工作的软件。
软件演进
使用软件工程原理和方法开发软件产品的过程称为软件演进。这包括软件的初始开发及其维护和更新,直到开发出满足预期要求的所需软件产品。

演进从需求收集过程开始。之后,开发人员创建预期软件的原型,并在软件产品开发的早期阶段将其展示给用户,以获得他们的反馈。用户建议进行更改,随后进行多次连续的更新和维护。这个过程会改变原始软件,直到完成所需的软件。
即使用户手上有所需的软件,技术的进步和不断变化的需求也会迫使软件产品进行相应的更改。从头开始重新创建软件并一对一满足需求是不可行的。唯一可行且经济的解决方案是更新现有软件,使其符合最新要求。
软件演进定律
雷曼给出了软件演进定律。他将软件分为三个不同的类别:
- S 型(静态型) - 这是一种严格按照定义的规范和解决方案工作的软件。解决方案和实现解决方案的方法在编码之前都可以立即理解。S 型软件最少受变化影响,因此是最简单的。例如,用于数学计算的计算器程序。
- P 型(实用型) - 这是一种具有程序集合的软件。这由程序可以做什么来定义。在这种软件中,可以描述规范,但解决方案不是立即显而易见的。例如,游戏软件。
- E 型(嵌入式型) - 这种软件与现实世界环境的要求紧密相关。由于现实世界中的法律、税收等存在各种变化,因此这种软件具有很高的进化程度。例如,在线交易软件。
E 型软件演进
雷曼为 E 型软件演进提出了八条定律 -
- 持续变化 - E 型软件系统必须持续适应现实世界的变化,否则其用处将逐渐减少。
- 增加复杂性 - 随着 E 型软件系统的发展,其复杂性趋于增加,除非进行维护或降低复杂性的工作。
- 保持熟悉度 - 必须不惜一切代价保留对软件的熟悉度或有关软件开发方式、以特定方式开发的原因等知识,以实施系统中的更改。
- 持续增长 - 为了使 E 型系统能够解决某些业务问题,其实施更改的规模将随着人们生活方式的变化而增长业务。
- 降低质量 - 除非严格维护并适应不断变化的运营环境,否则 E 型软件系统的质量会下降。
- 反馈系统 - E 型软件系统构成多环、多级反馈系统,必须如此处理才能成功修改或改进。
- 自我调节 - E 型系统演进过程是自我调节的,产品和过程度量的分布接近正常值。
- 组织稳定性 - 不断发展的 E 型系统中的平均有效全局活动率在产品的整个生命周期内保持不变。
软件范式
软件范式是指在设计软件时采用的方法和步骤。目前已提出了许多方法,并且正在实施中,但我们需要了解这些范式在软件工程中的地位。这些可以组合成各种类别,尽管每个类别都包含在另一个类别中:

编程范式是软件设计范式的一个子集,而软件设计范式又是软件开发范式的一个子集。
软件开发范式
此范式称为软件工程范式,其中应用了与软件开发有关的所有工程概念。它包括各种研究和需求收集,有助于构建软件产品。它包括 –
- 需求收集
- 软件设计
- 编程
软件设计范式
此范式是软件开发的一部分,包括 –
- 设计
- 维护
- 编程
编程范式
此范式与软件开发的编程方面密切相关。这包括 –
- 编码
- 测试
- 集成
软件工程的需求
软件工程的需求是由于用户需求和软件运行环境的变化率较高而产生的。
- 大型软件 - 建一堵墙比建一栋房子或建筑物更容易,同样,随着软件规模的扩大,工程必须采取措施使其具有科学的过程。
- 可扩展性 - 如果软件过程不是基于科学和工程概念,那么重新创建新软件将比扩展现有软件更容易。
- 成本 - 随着硬件行业展示其技能,大规模制造已经降低了计算机和电子硬件的价格。但是,如果没有采用适当的流程,软件的成本仍然很高。
- 动态特性 - 软件不断增长和适应的特性在很大程度上取决于用户的工作环境。如果软件的性质总是在变化,则需要在现有软件中进行新的增强。这就是软件工程发挥良好作用的地方。
- 质量管理 - 更好的软件开发流程可提供更好、更优质的软件产品。
优秀软件的特征
软件产品可以通过其提供的功能和使用效果来判断。该软件必须满足以下条件:
- 可操作性
- 过渡性
- 可维护性
精心设计和制作的软件应具有以下特征:
可操作性
这告诉我们软件在操作中的运行情况。它可以通过以下方面进行衡量:
- 预算
- 可用性
- 效率
- 正确性
- 功能性
- 可靠性
- 安全性
- 安全
过渡性
当软件从一个平台移动到另一个平台时,这一方面很重要:
- 可移植性
- 互操作性
- 可重用性
- 适应性
维护性
这一方面简要介绍了软件在不断变化的环境中维护自身的能力:
- 模块化
- 可维护性
- 灵活性
- 可扩展性
简而言之,软件工程是计算机科学的一个分支,它使用明确定义的工程概念来生产高效、耐用、可扩展、符合预算且按时完成的软件产品。