以下笔记内容摘自 中国大学MOOC 北京大学软件工程课程 ,该笔记仅作为要点记录,详细内容请自行查看原视频课程及课件文档,特别感谢 MOOC 及北京大学老师们开设的软件工程课程,以及他们无私奉献的精神,也欢迎广大软件工程师或有意致力于软件开发的朋友一起来学习。
1 软件的定义及特点
1.1 软件的定义
计算机系统中的程序及其文档。
- 「程序」是计算任务的处理对象和处理规则的描述。
- 「文档」是为了便于了解程序所需的阐明性资料。
1.2 软件的特点
- 软件是无形的、不可见的逻辑实体。它的正确与否,一直要到程序在机器上运行才能知道,这也给设计、生产和管理带来许多困难。
- 软件是设计开发的,而不是生产制造的。
- 软件在使用过程中没有磨损、老化的问题。
- 软件是定制开发的。需要根据实际的客户需求定制。
- 软件是复杂的。涉及人类社会的各行各业,软件的开发也常常涉及其他领域的专业知识。
- 软件的开发成本高。
- 软件易于复制。
- 软件质量要求较高。当软件与人类的生命安全息息相关时,需要特别注重软件质量。
- 软件的开发与运行都离不开相关的计算机系统环境。
- 软件开发工作牵涉到很多社会因素,如机构设置、体制和管理方式,以及人们的观念和心理。
不同于一般工程项目的是,在软件项目开发过程中,实际开发(编写代码)的成本只是整个工程成本的一小部分,甚至可以说是“冰山一角”。
而软件测试、系统维护等任务将占据工程的很大一部分成本。
1.3 软件的种类
按照软件的功能划分,软件的种类:
- 系统软件:如编译程序、操作系统...
- 支撑软件:支撑软件的开发、维护与运行的软件。如中间件、环境数据库、各种接口软件和工具组等。
- 应用软件:特定应用领域专用的软件。
2 软件工程的起源和概念
2.1 软件工程的起源
1946 年计算机刚诞生时,人们采用机器码编制程序,而机器码指令只是为了驱动计算机硬件工作。
1947 年,冯·诺伊曼首先提出用流程图描述计算机的运行过程后,软件的开发和研究才逐渐开始独立地进行。
现在人们认为:在信息产业中,微电子是基础,计算机和网络是载体,软件是核心。
2.2 软件开发的三个阶段
- 个人程序时期(1947年-1950年末):硬件价格昂贵,软件完全作为硬件的附属。
- 软件作坊时期(1960年初-1960年末):软件不必附属于特定的硬件,可以作为独立的产品存在。
- 软件工程时期(1970年代初至今):计算机应用领域在扩大,软件的规模和复杂性在增加,导致软件质量差、成本难以控制、开发周期延误,可维护性差,研发费用大幅增加,产生了“软件危机”。(不论是软件开发还是项目管理,都缺乏一套有效的管理机制和方法。)
2.3 软件工程的定义
1968 年,NATO(北大西洋公约组织)的一次会议上首次提出了软件工程的概念。标志着软件工程作为一门学科的正式出现,至今已经有40年的历史了。
软件工程概念的提出,其目的是倡导以工程的原理、原则和方法进行软件开发,以解决软件危机。
计算机百科全书上的软件工程定义
- 应用计算机科学、数学及管理科学等原理以工程化方法制作软件的工程。它借鉴传统工程的原则、方法,创建软件以达到提高质量,降低成本的目的。
- 其中,计算机科学、数学用于构造模型与算法,工程科学用于制定规范、设计范型、评估成本及确定权衡,管理科学用于计划、资源、质量、成本等管理。
- 软件工程是一门指导计算机软件开发和维护的工程学科。软件工程是一门交叉性学科。
首次NATO会议上的软件工程定义:
软件工程是用来建立和使用合理的工程原则,以经济地获取可靠的、且在真实机器上可高效工作的软件。
IEEE[IEE93]中的软件工程定义
将系统化的、规范的、可量化的方法应用到软件的开发、运行及维护中,即将工程化方法应用于软件;
3 软件开发的本质和基本手段
正确认识软件开发,是从事软件开发的思想基础。
3.1 软件开发的含义
软件开发的本质是什么?
问题域到不同抽象层次之间概念和计算逻辑的映射。
软件开发,即实现「问题域中的概念和处理逻辑」到「运行平台的概念和处理逻辑」的映射。
通过分层来降级映射的复杂性:
软件开发的本质:
- 不同抽象层术语之间的“映射”。
- 不同抽象层处理逻辑之间的“映射”。
3.2 实现映射的基本手段:建模
建模:是解决问题的一般途径。
何谓建立问题的模型:运用所掌握的知识,通过抽象,给出该问题的一个结构。
模型是在特定意图下所确定的角度和抽象层次上对物理系统的描述,通常包含对该系统边界的描述,给出系统内各模型元素以及它们之间的语义关系。(去除了大量的不必要的细节,对事物本质的描述)
分层的基本动机是控制开发的复杂性,一个抽象层是由一组确定的术语定义的。
计算机领域有句名言:
计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。
软件开发的本质无非就是将现实世界中的问题通过多层抽象映射成一个解决方案的模型,最终实现一个软件系统来解决这个问题。
待解决的问题➡️需求分析➡️可行性方案验证➡️概要设计➡️详细设计➡️实现软件系统➡️软件测试➡️软件部署维护➡️解决问题
4 软件工程框架
「软件工程框架」描述了软件工程的三要素:软件工程的目标、原则和活动。
4.1 软件工程的目标
生产具有正确性、可用性以及开销合宜的产品。
- 正确性:指软件产品达到预期功能的程度。
- 可用性:指软件基本结构、实现及文档为用户可用的程度。
- 开销合宜:指软件开发、运行的整个开销满足用户要求的程度。
4.2 软件工程的活动
生产一个最终满足需求且达到工程目标的软件产品所需要的步骤。包括需求、设计、实现、确认和支持等活动。
- 需求活动:需求获取、需求定义、需求规约、需求验证;
- 设计活动:总体设计、详细设计;
- 实现活动:把设计结果转换成可执行的程序代码。
- 确认活动贯穿于整个开发过程,包括需求复审、设计复审、软件测试等活动。
- 支持活动:完善性维护、纠错性维护、适应性维护。
4.3 软件工程的原则
- 选取适宜的开发模型;
- 提供高质量的工程支持(合适的软件工具和开发环境);
- 重视开发过程的管理;
4.4 软件工程框架的作用
软件工程可定义为三元组:目标、原则、活动。
- 给出了软件所涉及软件工程的工程要素;
- 给出了各要素之间的关系;
- 给出了软件工程学科所研究的主要内容:
- 软件开发模型
- 软件开发方法
- 软件过程
- 软件工具
- 软件开发环境
- 计算机辅助软件工程(CASE)
- 软件经济学