一.基本概念
1.软件就是程序吗?如何定义软件?
答:人们经过长期实践已经逐步认识到,软件≠程序,程序只是软件的关键要素,普遍接受的观点是:软件=程序+数据+文档。
2.文档有何作用?程序代码属不属于文档?
答:文档指的是在软件开发和维护过程中形成的文字记录。从软件计划、分析、设计、实现(编码和测试)、维护等开发活动中形成的各种文件。文档属于软件的一部分,是软件维护和升级的重要依据,并且文档内容要与代码同步更新。没有文档的软件维护不但不能延长反而会缩短软件寿命。
    文档包括需求规格说明书、设计说明书、用户使用说明书、在线帮助等,当然程序代码是必不可少的一种软件文档。
3.什么是软件危机?什么原因产生了软件危机?
答:软件危机指的是在计算机软件的开发和维护过程中所遇到的一系列严重问题。产生的原因是主客观不相适应。见书图1-2。
客观上:软件规模增大、功能要求越来越复杂,需求不断变化等;
主观上:传统的个体化开发观念和方法,无开发过程指导,无开发过程管理;
由于主客观矛盾,必然产生软件质量差、开发超期、超预算、维护困难等现象。
4.软件工程定义有很多说法,用你自己的理解说明软件工程是干什么的?
参考:软件工程是指导计算机进行软件计划、开发和维护的工程学科;
软件工程是为解决软件危机而诞生的,解决的途径是:用工程化的理论、方法和技术来管理软件开发过程。任何产品的工程化就是有计划、有目标、有规范、有文档、有标准。见1.4节。软件工程就是指导软件产品的工程化。
5.软件工程三要素是什么?
答:软件工程三要素是从计算机科学观点看软件工程,即从软件开发的技术层面应该有过程、方法和工具。见图1-4。
(2)“过程”是软件产品加工所经历的一系列有组织的活动,保证能够合理、高质量和及时地开发出软件。过程定义的活动集合及其序列见第2章。
(3)“方法”为软件开发提供“如何做”的技术,它涵盖了项目计划、需求分析、系统设计、程序实现、测试与维护等一系列活动的做法。如经常说的面向结构、面向对象、面向组件等开发方法,项目管理中估算、度量、计划等管理方法。软件工程以介绍方法为主,本书从第3章开始逐步介绍开发过程所用到的方法。
(4)“工具”为过程和方法提供自动的或半自动的支持。这些工具既包括软件也有硬件。软件工具包括编程、建模、管理等开发工具。通过网络环境把这些软件工具集成起来搭建一个支持团队开发的平台,称之为计算机辅助软件工程 (Computer Aided Software  Engineering,CASE)。CASE集成了软件、硬件和一个存放开发过程信息的软件工程数据库,形成了一个软件工程环境。
6.软件工程的目标、过程和原则是什么?
答:目标、过程、原则是一切工程的三维框架,它是以工程的观点来看待软件开发。见书1.5.2节
(1)软件工程的目标:降低成本,及时交付高质量的软件产品(高质量、高效率、高效益)。
2)实现目标的过程:完成产品加工的过程。它包括:基本过程、支持过程和组织过程。(3)进行过程应遵守的原则:原则就是过程中的轨道约束。它包括:选取适宜开发范型、采用合适的设计方法、提供高质量的工程支持、重视开发过程的管理。
7.软件工程原理有哪几条?
答:软件工程的基本原理是指导软件工程实践的思想方法,一共有7条,这7条原理相互支撑,保证软件产品的质量和开发效率。见书1.5.4节。
(1)用分阶段的生命周期计划严格管理 ;
(2)坚持进行阶段评审 ;
(3)实行严格的产品控制 ;
(4)采纳现代程序设计技术 ;
(5)结果应能清楚地审查 ;
(6)开发小组的人员应少而精 ;
(7)承认不断改进软件工程实践的必要性 ;
8.软件发展的第四阶段比第三阶段的显著变化和进步在哪些方面?第五阶段的显著特征是什么?
答:主要参见1.6节
(1)第四阶段的进步体现在:
计算机走进千家万户,计算机软件从面向科研和面向企业走向面向大众。
计算机应用走向网络化;
开发技术以面向对象为主;
软件开发产业化;
(2)阶段的特征是:
企业需求发生巨大变化,由独立的部门管理走向跨部门、跨行业、跨区域、跨平台,软件规模大、功能复杂、技术综合性强。
需求是变化的,因此要求软件结构是开放的、柔性的、松耦合的,做到开发过程分散解决、逐步集成,维护上可任意裁剪,适应需求的变化。
该阶段采用的开发技术发展到面向组件、面向服务。
9.传统软件工程曾起到哪些推进作用?
答:传统软件工程指的是结构化的软件开发方法,尽管比较原始,但在观念突破、解决软件危机方面是个良好的开始,有许多实际作用。见1.7.2节。
遵循了软件开发分阶段、有控制的理论;
树立软件是程序+文档的观念;
把自顶向下、逐步求精的原理贯穿在开发过程中;
软件的估算与度量可以量化开发工作,使计划和控制成为可能;
10.现代软件工程与传统软件工程显著区别是什么?有哪些进步?
答:传统软件工程是基于结构化的软件开发方法,现代软件工程是以面向对象(Object Oriented)技术为标志
不仅在编程技术上发生巨大进步,而且在分析、设计整个开发过程中采用OO思维方式,更加完整、自然地反映客观世界;
采用架构技术,开发效率、产品质量得到极大提高;
更注重团队开发和管理,融入更多、更新的管理理念和手段。如RUP模型、XP模型、过程改进、能力成熟度模型、配置管理等。
二.深入讨论
1.辨析:软件危机是过去发生的事情,现在有了软件工程,软件危机得到有效解决,现在和以后不会再出现软件危机了。数据库是软件吗
参考答案:新的软件危机依然会出现。软件危机是软件开发遇到的严重问题,软件工程的诞生解决了早期软件危机的很多问题。但是任何矛盾事物的解决只是一种暂时的平衡,平衡被打破新的矛盾就会出现。在新的条件下软件危机会有新的表现,比如,针对现代企业数据和业务XXX需要跨行业、跨地区、跨平台的B2B合作方式,原来软件的一次性开发、刚性结构就出现了“危机”,解决这样的危机就要寻求集成式、柔性结构这样新的解决方案,系统分析、设计的方法也要随之改进,软件工程要随之发展。
  目前软件工程自身存在很多问题亟待解决:如开发方法学与技术没有同步发展;组件生产以自我奋斗为主,没有形成市场化;集成与装配化的生产方式无重大转变。
2.讨论:请总结一下你使用过什么类型的软件?本书讨论的软件工程倾向于什么类别的软件开发?
参考答案:应用软件分为桌面软件和企业级软件,两种软件的使用和开发有共同点也各有特点:
(1)在前期的课程学习期间,主要使用过的软件有:办公软件如word、excel等;编程软件如宏汇编-MASM、C编程turbo c和Visual C++、Java集成开发工具Eclipse、建模工具Rose等;媒体播放软件如Windows Media Player图像处理软件photoshop。这些软件都属于桌面软件。
(2) 在日常的生活和交流中,通过网络收发、QQ聊天、网上购物等;在学习中通过校园网进行选课、查询成绩、提交作业、图书查询等。这些属于企业级软件,就是通常说的Web软件,更为学术的名词称分布式计算。
本书讨论的软件开发主要面向应用软件,且侧重于企业级软件。
3.讨论:企业级软件开发有何特点?
参考答案:参考教材 1.1.2节
软件结构为分布式多层结构,它的特点是用于网络、客户不确定、多用户并发操作、操作和传递大量数据、涉及网络和数据安全等
4.讨论:计算机科学方面的基础课程与学习软件工程有何关系?有何不同?
参考答案:  参考书1.5.1节。
(1)计算机有关专业(计算机应用、软件工程)的教育和学习过程是从理解计算机世界开始的,如计算机原理、离散数学、编译原理、数据结构、算法分析、程序设计、数据库等等课程都是围绕计算机科学的,也称为专业基础课。这些基础课是培养学生把给定的计算模型在计算机中得以实现的计算能力。
(2)然而谁来给出这个模型,怎样把错综复杂的客观世界描述出计算机可实现的计算模型,这就是软件开发的重任,是软件工程的研究的学问。
(3)基础课程只是培养个人单打独斗能力,没有培养工程化思维,还缺乏对软件加工的生产过程、资源计划、质量保证、生产效率、工程效益、风险控制以及团队合作等工程意识的培养。因此受到计算机科学方面的基础训练是步入软件工程的基础,深入到软件工程还有很远的路要走。