软件与软件工程的概念

(第一部分:软件工程概述,第1章)

李欣

Created: 2022-04-06 Wed 00:50

0.1. 互动课堂

Click to host the seminar.


0.2. 教师简介

教师姓名 李欣
工作单位 北方工业大学 信息学院
电子邮箱 lx@ncut.edu.cn
办公地点 瀚学楼1122
固定电话 010-8880-1685

0.3. 教学安排

  • 学时 :32学时
  • 周数 :16周
  • 考试 :考试周
  • 成绩
    • 期末考试 :60%( 试卷卷面成绩
    • 平时成绩 :40%( 出勤情况课堂表现情况作业完成情况

0.4. 教学内容

  • 第一知识单元 :软件工程概述与软件过程
  • 第二知识单元 :结构化方法
  • 第三知识单元 :面向对象方法
  • 第四知识单元 :软件测试与维护
  • 第五知识单元 :软件项目管理

0.5. 教材

  • 书名:软件工程概论(第3版)
  • 作者:郑人杰,马素霞,殷人昆
  • 出版社:机械工业出版社
  • 教材封面

textbook.jpg

0.6. 参考书

书名 作者 出版社 年份
软件工程实例教程 吴洁明 清华大学出版社 2010
软件工程导论(第5版) 张海藩 清华大学出版社 2008
软件工程(第2版) 齐治昌等 高等教育出版社 2004
软件工程:实践者的研究方法(第7版) 郑人杰等译,Roger S Pressman著 机械工业出版社 2011
软件工程实践教程(面向对象) 谭庆平等 高等教育出版社 2009
UML宝典 耿国桐等译,Tom Pender著 电子工业出版社 2004
UML面向对象分析 吴际等 北京航空航天大学出版社 2002

0.7. 软件与工程

0.7.1. 我们见过的工程有哪些?

  • 鸟巢

building.jpg

  • 张家界玻璃桥

bridge.jpg

  • 台湾屏东县的一条道路

road.jpg

  • 三峡水利工程

water-conservancy.jpg

  • 熟悉的建筑
  • 桥梁
  • 道路
  • 水利
  • ……

0.7.2. 这些工程有什么特点?

  • 质量有保证

0.7.3. 软件和工程之间有哪些相似之处?

  • 从无到有构造一个物体,尽管软件是看不见的
  • 都有基本的组成成分
  • 大规模软件和工程都有很多人参加
  • 都有工期成本限制
  • 都有质量要求
  • ……

0.7.4. 什么叫工程化?

  • 向工程建设一样来开发软件。
  • 借鉴其规范,过程,管理,监督,协作,分工等机制。

0.7.5. 工程化的特点是什么?

  • 流水线
  • 标准化(构件化)
  • 重视质量管理
  • 工种划分明确
  • 过程清晰

0.8. 软件工程的目标

  • 提高软件的质量和生产率
  • 最终实现软件的工业化生产

开发软件要有工程化意识

开发软件远远不只是写代码

0.9. 对软件工程的认识和理解

软件工程主要讲述软件开发的道理, 基本上是软件实践者的成功经验和失败教训的总结。 软件工程的观念、方法、策略和规范都是朴实无华的, 平凡之人皆可领会,关键在于运用。 —知易行难

0.10. 为何要学习本课程

  • 理解和认识“软件”的概念及其特点
  • 理解软件开发面临的问题和挑战
  • 掌握软件工程的原则、方法和思想来系统地开发软件,尤其是开发复杂且规模较大的软件
  • 了解和接触软件开发所需的各种技术手段

0.11. 学习本课程的建议思路

0.11.1. 带着问题学习

  • 什么是软件工程?
  • 为什么需要软件工程,软件工程是怎么出现的?(软件工程的产生背景)
  • 软件工程包括哪些内容,需要解决哪些问题?
  • 如何学习软件工程?

0.11.2. 掌握这些内容

  • 概念
  • 技术
  • 过程
  • 工具

0.11.3. 运用工程化思想指导软件开发

  • 需求分析
  • 软件设计
  • 程序设计
  • 软件维护

0.12. 先导要求

  • 程序设计语言(C、C++、Java、Python、JavaScript…)
  • 一定程度的软件开发经验或项目经验

0.13. 教学日历

教学日历(PDF)

周次 讲课(教学大纲分章和题目名称) 学时
第1周(2.21—2.25) 第一知识单元:软件工程概述与软件过程(软件工程的出现、软件工程的定义) 2
第2周(2.28—3.4) 第一知识单元:软件工程概述与软件过程(软件生命周期和软件过程) 2
第3周(3.7—3.11) 第二知识单元:结构化方法(需求工程) 2
第4周(3.14—3.18) 第二知识单元:结构化方法(结构化分析) 2
第5周(3.21—3.25) 第二知识单元:结构化方法(结构化分析、概要设计) 2
第6周(3.28—4.1) 第二知识单元:结构化方法(概要设计、详细设计) 2
第7周(4.4—4.8) 第二知识单元:结构化方法(详细设计) 2
第8周(4.11—4.15) 第二知识单元:结构化方法(结构化编码) 2
第9周(4.18—4.22) 第三知识单元:面向对象方法(面向对象基础) 2
第10周(4.25—4.29) 第三知识单元:面向对象方法(面向对象分析) 2
第11周(5.2—5.6) 第三知识单元:面向对象方法(面向对象设计) 2
第12周(5.9—5.13) 第三知识单元:面向对象方法(软件体系结构与设计模式、软件重构) 2
第13周(5.16—5.20) 第四知识单元:软件测试与维护(软件测试基础、白盒测试) 2
第14周(5.23—5.27) 第四知识单元:软件测试与维护(黑盒测试、软件维护) 2
第15周(5.30—6.3) 第五知识单元:软件项目管理(软件项目管理概述、项目估算) 2
第16周(6.6—6.10) 第五知识单元:软件项目管理(进度管理、配置管理、质量管理) 2

0.14. 学习要求

0.14.1. 理解

  • 理解知识点和思想,无需死记硬背

0.14.2. 实践

  • 体会软件工程的原则、方法和技术,在实践中提高
    • 培养抽象思维能力
    • 培养独立解决问题的能力
    • 培养合作精神

0.14.3. 思考

  • 阅读相关资料,并结合自身开发经验进行思考

0.15. 本次课的目标

第一部分:软件工程概述

第1章:软件与软件工程的概念

  • 软件的概念、特性和分类
  • 软件危机与软件工程
  • 软件工程的目标
  • 软件生存期
  • 软件工程方法概述
  • 软件工具概述
  • 软件工程知识体系及知识域

1. 软件的概念、特性和分类

1.1. 软件的概念

虽然软件对于现代的人并不陌生,但很多人对于软件的理解并不准确, “软件就是程序,软件开发就是编程序”的这种错误观点仍然存在。

软件 是计算机系统中与硬件相互依存的另一部分,它是包括程序,数据及其相关文档的完整集合。

其中,

  • 程序 是按事先设计的功能和性能要求执行的指令序列;
  • 数据 是使程序能够正确地处理信息的数据结构;
  • 文档 是与程序开发、维护和使用有关的图文材料。

1.2. 软件的特性

  1. 形态特性
  2. 智能特性
  3. 开发特性
  4. 质量特性
  5. 生产特性
  6. 管理特性
  7. 环境特性
  8. 维护特性
  9. 废弃特性
  10. 应用特性
  • 形态特性

软件是无形的、不可见的逻辑实体。 度量常规产品的几何尺寸、物理性质和化学成分对它却是毫无意义的。

  • 智能特性

软件是复杂的智力产品,它的开发凝聚了人们的大量脑力劳动, 它本身也体现了知识实践经验和人类的智慧,具有一定的智能。 它可以帮助我们解决复杂的计算、分析、判断和决策问题。

  • 开发特性

尽管已经有了一些工具(也是软件)来辅助软件开发工作, 但到目前为止尚未实现自动化。 软件开发中仍然包含了相当份量的个体劳动, 使得这一大规模知识型工作充满了个人行为和个人因素。

  • 质量特性

目前还无法得到完全没有缺陷的软件产品。

  • 生产特性

与硬件或传统的制造业产品的生产完全不同,软件一旦设计开发出来,如果需要提供多个用户,它的复制十分简单,其成本也极为有限。

  • 管理特性

由于上述的几个特点,使得软件的开发管理显得更为重要,也更为独特。

  • 环境特性

软件的开发和运行都离不开相关的计算机系统环境, 包括支持它的开发和运行的相关硬件和软件。 软件对于计算机系统的环境有着不可摆脱的依赖性。

  • 维护特性

软件投入使用以后需要进行维护,但这种维护与传统产业产品的维护概念有着很大差别。

  • 废弃特性

与硬件不同,软件并不是由于被“用坏”而被废弃的。

  • 应用特性

软件的应用极为广泛,如今它已渗入国民经济和国防的各个领域, 现已成为信息产业、先进制造业和现代服务业的核心,占据了无可取代的地位。

1.3. 软件的分类

按照软件的作用,一般可以将软件做如下分类:

  • 系统软件
  • 支撑软件
  • 应用软件
  • 可复用软件

1.3.1. 系统软件

系统软件 是能与计算机硬件紧密配合在一起, 使计算机系统各个部件、相关的软件和数据协调、高效地工作的软件。

例如,操作系统、数据库管理系统、设备驱动程序、通信和网络处理程序等。

1.3.2. 支撑软件

支撑软件 亦称为工具软件,是协助用户开发软件的工具性软件, 其中包括帮助程序人员开发软件产品的工具, 也包括帮助管理人员控制开发进程的工具。

  • 纵向支撑软件(生存期某阶段的所需工具)

需求分析工具、设计工具、编码工具、测试工具、维护工具等。

  • 横向支撑软件(整个生存期所使用的工具)

项目管理工具、配置管理工具等。

1.3.3. 应用软件

应用软件 是在系统软件的支持下, 在特定领域内开发,为特定目的服务的一类软件。

例如,商业数据处理软件、工程与科学计算软件、 实时控制软件、智能化软件、事务管理软件、办公自动化软件等。

1.3.4. 可复用软件

可复用软件 最典型的例子是各种标准函数库, 通常是由计算机厂商提供的系统软件的一部分。 后来可复用的范围扩展到算法之外,数据结构也可以复用。

到了20世纪90年代,作为复用的基础, 可复用的范围从代码复用发展到体系结构复用、开发过程复用。

面向对象开发方法的核心思想就基于复用, 为此,建立了可复用的类库,应用程序库,以及可复用的设计模式等。

2. 软件危机与软件工程

2.1. 软件危机

软件危机暴发于上个世纪六十年代末。

主要表现为:软件的发展速度远远滞后于硬件的发展速度, 不能满足社会日益增长的软件需求。 软件开发周期长、成本高、质量差、维护困难。

2.1.1. 软件危机的典型例子

美国IBM公司在1963年至1966年开发的IBM 360机的操作系统。 这个项目的负责人F.D.Brooks事后总结了他在组织开发过程中的沉痛教训时说:

…… 正像一只逃亡的野兽落到泥潭中做垂死的挣扎,越是挣扎,陷得越深。 最后无法逃脱灭顶的灾难, …… 程序设计工作正像这样一个泥潭, …… 一批批程序员被迫在泥潭中拼命挣扎, …… 谁也没有料到竟会陷入这样的困境 ……

2.1.2. 软件危机的典型表现

  • 对软件开发成本和进度的估计常常很不准确。
  • 用户对“已完成的”软件系统不满意的现象经常发生。
  • 软件产品的质量往往靠不住。
  • 软件常常是不可维护的。
  • 软件通常没有适当的文档资料。
  • 软件成本在计算机系统总成本中所占的比例逐年上升。
  • 软件开发生产率提高的速度,既跟不上硬件的发展速度,也远远跟不上计算机应用迅速普及深入的趋势。

以上列举的仅仅是软件危机的一些明显的表现, 与软件开发和维护有关的问题远远不止这些。

2.1.3. 软件危机的发生原因

除了软件本身的特点,软件危机发生的主要原因有:

  1. 缺乏软件开发的经验和有关软件开发数据的积累,使得开发工作的计划很难制定。
  2. 软件人员与用户的交流存在障碍,使得获取的需求不充分或存在错误。
  3. 软件开发过程不规范,缺少方法论和规范的指导,不重视文字资料工作,使得软件难以维护。
  4. 随着软件规模增大,软件复杂性往往呈指数级升高,使得技术和管理难度提升。
  5. 缺少有效的软件评测手段,使得提交给用户的软件质量无法保证。

2.1.4. 如何摆脱软件危机

  • 彻底消除“软件就是程序”的错误观念。
  • 充分认识到软件开发应该是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目。
  • 推广和使用在实践中总结出来的开发软件的成功技术、方法和工具。
  • 按工程化的原则和方法组织软件开发工作。

2.2. 软件工程

为了克服软件危机,1968年10月在北大西洋公约组织(NATO)召开的计算机科学会议上, Fritz Bauer首次提出 软件工程 的概念,试图将 工程化方法 应用于软件开发。

在NATO会议上,Fritz Bauer对 软件工程 的定义是: 软件工程 是为了 经济地 获得 可靠的 且能在实际机器上 有效地 运行的软件, 而建立并使用的完善的工程原理。

2.2.1. 软件工程的定义

1993年IEEE给出的定义:

软件工程 是,

  1. 系统的规范的可度量 的方法用于 软件开发运行维护 的过程,即 将工程应用于软件
  2. 研究1中提到的方法。

2.2.2. 软件工程的概括

概括地说,

软件工程 是指导软件开发和维护的 工程性学科 , 它以计算机科学理论和其他相关学科的理论为指导, 采用 工程化概念原理技术方法 进行软件的开发和维护, 把经过时间考验且证明是正确的 管理技术 和当前能够得到的最好的 技术方法 结合起来, 以较少的代价获得高质量的软件并维护它

3. 软件工程的目标

软件工程的目标 是运用先进的 软件开发技术管理方法 来提高软件的 质量生产率 , 也就是要以 较短的周期较低的成本 生产出 高质量的软件产品 ,并最终实现软件的 工业化生产

生产率成本 密切相关, 生产率的提高往往意味着成本的下降开发周期的缩短

生产率质量 之间也有着内在的联系, 表面上看,追求高质量会 延长软件开发时间 ,并因此 增加了成本 ,似乎降低了生产率。 但如果生产的软件质量差,虽然开发的时间可能缩短,但之后可能会造成返工,总的开发时间可能会更长。 即使不返工,也无疑会增加维护代价。

3.1. 软件的质量特性

  • 功能性 :软件所实现的功能 达到它的设计规范满足用户需求 的程度;
  • 可靠性 :在规定的时间和条件下,软件能够 正常维持其工作的能力
  • 易用性 :为了使用该软件 所需要的能力
  • 效率 :在规定的条件下 用软件实现某种功能所需要的计算机资源 的有效性;
  • 维护性 :当环境改变或软件运行发生故障时,为了使其 恢复正常运行所做努力 的程度;
  • 可移植性 :软件 从某一环境转移到另一环境时所做努力 的程度。

3.2. 软件工程的本质特性

  • 关注 大型软件 的构造
  • 中心课题是 控制 复杂性
  • 软件 经常变化
  • 开发软件的 效率 非常重要
  • 和谐地 合作 是开发软件的关键
  • 软件必须有效地支持它的 用户
  • 在软件工程领域中是由一种文化背景的人替具有另一种文化背景的人创造 产品

3.3. 软件工程的基本原理

  • 按软件生存周期分阶段 制订计划 并认真实施
  • 坚持进行 阶段评审
  • 坚持严格的 产品控制
  • 使用现代软件 开发技术
  • 明确责任
  • 用人 少而精
  • 不断 改进开发过程

3.3.1. 按软件生存周期分阶段制订计划并认真实施

在软件开发与维护的漫长生命周期中,需要完成许多 性质各异 的工作, 这条基本原理意味着,应该 把软件生命周期划分成若干阶段 , 并相应地 制定切实可行的计划 , 按照 计划 对软件的 开发与维护 工作进行控制。

3.3.2. 坚持进行阶段评审

软件的质量保证工作不能等到编码阶段结束之后再进行。 经过大量的统计数据表明,大部分错误是在编码之前造成的, 其中, 设计错误约占软件错误的63%,编码错误占37% 。 在前期改正错误所需要的可能只是橡皮和铅笔, 而在交付后改正错误需要的工作就太多了: 查找出错的代码、重新组织程序结构和数据结构、测试、修改文档。 也就是说, 错误发现与改正的越晚,所需付出的代价也越高 。 因此,在 每个阶段 都应该进行 严格的评审 , 以便尽早发现在软件开发过程中所犯的错误, 是一条必须遵循的重要原则。

3.3.3. 坚持严格的产品控制

一切有关修改软件的建议, 都必须按照严格的规程进行评审和控制, 获得批准以后才能实施修改。 目的是当需求变动时, 其它各阶段的文档或代码随之相应变动, 以保证 软件的一致性

3.3.4. 使用现代软件开发技术

自从提出软件工程概念后,人们一直把主要精力用于研究各种新的程序设计技术。 60年代末提出了 结构化程序设计技术 , 以后又进一步发展出 结构化分析与设计技术面向对象的分析和设计技术 。 实践表明, 采用先进的技术 既可 提高软件开发和维护的效率 ,又可 提高软件质量

3.3.5. 明确责任

软件是一种看不见、摸不着的逻辑产品。 软件开发小组的工作进展情况难于评价和管理。 为更好地进行管理,应根据 软件开发的总目标完成期限 , 明确地规定 开发小组的责任产品标准 , 从而使所得到的产品有明确的标准能清楚地审查。

3.3.6. 用人少而精

软件开发小组成员的素质应该好,人数不宜过多。 素质高的人员 开发 效率高质量好错误少 。 开发小组人员过多,信息交流造成的通信开销会急剧增加。

3.3.7. 不断改进开发过程

遵循上述六条基本原理,就能够按照当代软件工程基本原理实现软件的工程化生产。 但是,仅有上述六条原理并不能保证软件开发与维护的过程能赶上时代前进的步伐, 因此,应 积极主动采纳新的软件技术不断总结经验汲取教训

4. 软件生存期

4.1. 概念

软件 同任何其他事物一样,也有着孕育、诞生、成长、成熟和衰亡的生存过程, 我们称这个过程为 软件生命周期软件生存期

软件生存期由 软件定义软件开发运行维护 3个时期组成, 每个时期又可划分为若干个阶段。

4.1.1. 软件定义时期

主要任务是解决 做什么 的问题,即:

  • 确定工程的 总目标可行性
  • 导出实现工程目标 应使用的策略系统必须完成的功能
  • 估计完成工程需要的 资源成本
  • 制订 工程进度表

通常又分为3个阶段: 问题定义可行性研究需求分析

4.1.2. 软件开发时期

主要任务是解决 如何做 的问题,即

具体 设计实现 在前一个时期定义的软件。 由 概要设计详细设计编码测试 4个阶段组成。

4.1.3. 运行维护时期

主要任务是 使软件持久地满足用户的需要 ,通常有4类维护活动:

  • 改正性维护 诊断和改正在使用过程中发现的软件错误。
  • 适应性维护 修改软件以适应环境的变化。
  • 完善性维护 根据用户的要求改进或扩充软件,使它更完善。
  • 预防性维护 修改软件为将来的维护活动预先做准备。

4.2. 开发过程中的典型文档

  • 软件需求规格说明书 描述 将要开发的软件做什么
  • 项目计划 描述 将要完成的任务及其顺序 ,并 估计所需要的时间及工作量
  • 软件测试计划 描述 如何测试软件 ,使之确保软件应 实现规定的功能 ,并 达到预期的性能
  • 软件设计说明书 描述软件的结构,包括 概要设计详细设计
  • 用户手册 描述 如何使用软件

4.3. 各个阶段所要完成的基本任务

  • 问题定义与可行性研究 : 本阶段要回答的关键问题是: “到底要解决什么问题?在成本和时间的限制条件下能否解决问题?是否值得做?”
  • 需求分析 : 本阶段要回答的关键问题是: “目标系统应当做什么?”
  • 软件设计设计是软件工程的技术核心。 本阶段要回答的关键问题是: “目标系统如何做?”
  • 程序编码和单元测试 : 本阶段要解决的问题是: 如何正确地实现已做的设计,即如何编写正确的、可维护的程序代码?
  • 集成测试和系统测试测试是保证软件质量的重要手段, 本阶段的主要任务是 做集成测试和系统测试
  • 软件运行和维护已交付的软件一旦投入正式使用便进入运行阶段,这一阶段可能持续若干年。 维护可分为, 改正性维护适应性维护完善性维护预防性维护

5. 软件工程方法概述

通常把 软件开发生命周期全过程 中使用的 一整套技术的集合 称为 方法学(methodology) , 也称为 范型(paradigm)在软件工程的范畴,这两个词的含义基本相同Paradigm vs Methodology - What's the difference?

软件工程方法学 包含三个要素:

  • 方法
  • 工具
  • 过程

5.1. 传统方法

传统方法 也成为 生命周期方法结构化范型 。 它采用 结构化技术 来完成软件开发的各项任务。 这种方法学把软件生命周期的全过程 依次划分为若干个阶段 , 然后顺序地 逐步完成每个阶段的任务

5.2. 面向对象方法

面向对象方法从面向对象的程序设计发展起来的 。 面向对象程序设计代表了一种全新的程序设计思路, 与传统的面向过程的开发方法不同, 面向对象的程序设计和问题求解更符合人们日常的思维习惯。

5.3. 面向服务方法

软件系统不断增加的规模复杂度 已经给软件开发工作带来了巨大挑战, 为了提升 快速构建软件系统 以及 响应业务变化 的能力, 充分 复用(重用) 已有资源,以及实现 跨平台数据共享业务协同面向服务的软件工程方法 应运而生。

5.4. 面向数据方法

与传统软件工程方法不同, 面向数据的方法基于数据思维从业务逻辑的角度 ,强调 一切业务“数据化”从体系结构的角度 ,突出 “面向数据和以数据为核心”的思想

5.5. 形式化方法

形式化方法 是一种基于 形式化数学变换 的软件开发方法, 它可将系统的规格说明转换为可执行的程序。

6. 软件工具概述

6.1. 软件工具的概念

软件工具 是指能支持软件生存期中某一阶段的需要而使用的软件。 早期的软件工具主要用来辅助程序员编程,如 编辑程序编译程序 等。

在提出软件工程的概念以后,又出现了软件生存期的概念, 出现了许多开发模型和开发方法,同时软件管理也开始受到人们的重视。 与此同时,出现了一批软件工具来辅助软件工程实施, 因此,软件工具通常也称为CASE (Computer Aided Software Engineering,计算机辅助软件工程)工具。

6.2. 软件工具的发展

6.2.1. 20世纪50年代末

该时期出现了 程序设计语言 ,软件开发主要是 编程 ,出现的工具主要是为了 辅助软件编程活动

  • 编译程序
  • 汇编程序
  • 解释程序
  • 连接程序
  • 装配程序
  • 排错程序
  • ……

6.2.2. 20世纪60年代末

该时期提出了 软件工程 的概念,支持 软件开发维护管理 等过程的工具也应运而生。

  • 支持 需求分析活动需求分析工具
  • 支持 维护过程维护工具理解工具
  • 支持 管理过程中 进度管理活动PERT(Program Evaluation and Review Technique)工具
  • 支持 软件过程质量保证工具
  • ……

6.3. 软件工具的分类

  • 支持软件开发过程的工具需求分析工具设计工具 (概要设计工具、详细设计工具)、 编码工具排错工具测试工具 等。
  • 支持软件维护过程的工具版本控制工具文档分析工具信息库开发工具逆向工程工具再工程工具 等。
  • 支持软件管理过程和支持过程的工具项目管理工具配置管理工具软件评价工具 等。

6.4. 常用软件工具介绍

(参考教材第15页)

7. 软件工程知识体系
及知识域

7.1. 软件工程知识体系指南的目标

SWEBOK(SoftWare Engineering BOdy of Knowledge)指南的目的是 确认软件工程学科的范围 , 并 为支持该学科的本体知识提供指导

SWEBOK指南的目标是:

  1. 促使 软件工程本体知识成为世界范围的共识
  2. 澄清 软件工程其他相关学科 的关系,并且确定 软件工程的范围
  3. 反映 软件工程学科内容的特征
  4. 确定 软件工程本体知识的各个专题
  5. 相应的课程职业资格认证材料的编写 奠定基础。

7.2. 软件工程知识体系指南的内容

swebok.png

软件生存期过程类软件工程管理类 的知识域通常有 软件工程标准 的支持。 从图中还可看到, 管理类基础类 是支持 软件生存期过程类 的。

8. 课后作业

  1. 举出你所知道的传统应用软件的例子。(习题1.1)
  2. “软件就是程序,软件开发就是编程序”这种观点是否正确?为什么?(习题1.2)
  3. 简述软件的分类,并举例说明。(习题1.4)
  4. 请给出你所知道的互联网应用软件的例子。传统应用软件与互联网应用软件有哪些不同之处?(习题1.5)
  5. 什么是软件工程?软件工程要解决的核心问题是什么?(习题1.7)