《软件工程》 课后思考题

第一章 软件工程概述

1. 结合你之前的工程经验以及任正非致员工信,谈谈你对软件工程的看法。

随着科技的发展,软件开发的需求量以及开发规模都在不断地增大,规模越大的软件工程,各方面需要考虑的问题就越多,所耗费的人力物力就越大。我认为软件工程的作用就是运用一系列科学的方法,在满足各方面需求并保证软件效率的前提下,统筹管理好开发过程的每一步,以最少的人力物力耗费来实现期望的目标。

2.软件开发就是编码么?谈谈你对软件开发的本质的认识。

编码是软件开发的一部分,也是程序员们的工作。我认为软件开发的过程中除了编码以外,更重要的是开发人员和客户的一个不断地交流,随着开发过程的进行,客户的需求也许会发生变化,弄清楚了为什么要写代码,要写怎样的代码,实现怎样的功能,才能够更好地实现预期的目标。

3.举例说明软件的特点有哪些?
  1. 软件开发与硬件研制相比,更依赖于开发人员的业务素质、智力、人员的组织、合作和管理。
  2. 大型软件仍然存在着潜伏的错误。
  3. 软件产品开发成功后,只需对原版软件进行复制,即可生产出任意多的同样的产品。
  4. 还有,软件在使用过程中的维护工作比硬件要复杂得多。
  5. 由于软件不是物理产品,所以它不会磨损和老化
4.什么是软件危机?软件危机出现的原因及解决手段有哪些?

软件危机是指落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题的现象。

出现软件危机的原因主要有:

  1. 软件本身独有的特点确实给开发和维护带来了困难
  2. 软件开发和维护过程不规范
  3. 缺乏软件开发的经验和有关软件开发数据的积累
  4. 轻视,人们在制定计划时总会有一些天马行空的想法和要求,轻视是一个最大的错误。
  5. 忽视软件需求分析的重要性、忽视软件的可理解性、文档不完备、轻视软件的可维护性、过分强调编码技巧等等方面。
  6. 用户与开发人员的沟通问题,从而技术人员获取的需求不够全面。

解决手段:
  在软件工程理论的指导下,建立起较为完备的软件工业化生产体系,形成强大的软件生产能力 。软件标准化与可重用性得到了工业界的高度重视,在避免重用劳动,可以缓解软件危机。

5.软件工程的要素有哪些,各有什么作用?

软件工程的三种基本要素是方法、工具过程

  1. 软件工程方法(method)为建造软件提供技术上的解决方法(“如何做”)。目前使用得最广泛的方法是传统方法(结构化方法)和面向对象方法。
  2. 工具为方法的运用提供自动的或半自动的软件支撑环境。
  3. 过程是为了获得高质量的软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。

第三章 软件过程模型

1.简述软件过程、软件生存周期、软件过程模型(软件生存周期模型)三者之间的概念区别。
  1. 软件过程:软件过程为一个为建造高质量软件所需完成的任务的框架,即形成软件产品的一系列步骤,包括中间产品、资源、角色及过程中采取的方法、工具等范畴。
  2. 软件生存周期:指软件的产生直到报废的生命周期,周期内有问题定义、可行性分析、总体描述、系统设计、编码、调试和测试、验收与运行、维护升级到废弃等阶段。
  3. 软件过程模型:是一种开发策略,该策略针对软件工程的各个阶段提供了一套范形,使工程的进展达到预期的目的。
2.软件过程就是软件开发过程么?为什么?

不是,软件过程是指软件整个生命周期,从需求获取、需求分析、设计、实现、测试、发布和维护一个过程模型。一个软件过程定义了软件开发中采用的方法,但软件过程还包含该过程中应用的技术——技术方法和自动化工具。

3.请选择两个常见的软件过程模型,谈谈你对他们的理解?并进行比较
  1. 瀑布模型:就像是瀑布从上往下流一样,必须等前一阶段的工作完成之后,才能开始后一阶段的工作。并且每一个阶段的输出文档就是就是后一阶段的输入文档,因此,只有前一阶段的输出文档正确后,后一阶段的工作才能得到正确结果。同时,早期犯下错误后改正错误的代价更低,越到后期,改正错误的代价就越高。适用于需求确定,无大的需求变更,工作能够采用线性的方式完成的软件。
  2. 增量模型:融合了瀑布模型的基本成分和原型实现的迭代特征,软件开发过程中,将软件系统按功能分解为许多增减构件,并以构件为单位逐个地完成,并都被集成到系统之中。客户对每个增量的使用和评估都作为下一个增量发布的新特性和功能。适用于既定的商业要求期限之前不可能找到足够的开发人员的情况。

瀑布模型的优点

  • 有利于大型软件开发过程中人员的组织、管理。
  • 有利于软件开发方法和工具的研究,从而提高了大型软件项目开发的质量和效率。

瀑布模型的缺点

  • 开发过程一般不能逆转,否则代价太大;
  • 实际的项目开发很难严格按该模型进行;
  • 客户往往很难清楚地给出所有的需求,而该模型却要求如此。
  • 软件的实际情况必须到项目开发的后期客户才能看到,这要求客户有足够的耐心。

瀑布模型的使用范围

  • 用户的需求非常清楚全面,且在开发过程中没有或很少变化;
  • 开发人员对软件的应用领域很熟悉;
  • 用户的使用环境非常稳定;
  • 开发工作对用户参与的要求很低。

增量模型的优点

  • 采用增量模型的优点是人员分配灵活,刚开始不用投入大量人力资源;
  • 如果核心产品很受欢迎,则可增加人力实现下一个增量;
  • 可先发布部分功能给客户,对客户起到镇静剂的作用。

增量模型的缺点

  • 并行开发构件有可能遇到不能集成的风险,软件必须具备开放式的体系结构;
  • 增量模型的灵活性可以使其适应这种变化的能力大大优于瀑布模型和快速原型模型,但也很容易退化为边做边改模型,从而是软件过程的控制失去整体性。

增量模型的使用范围

  • 进行已有产品升级或新版本开发,增量模型是非常适合的;
  • 对完成期限严格要求的产品,可以使用增量模型;
  • 对所开发的领域比较熟悉而且已有原型系统,增量模型也是非常适合的。
4.根据你当前所在的团队项目,你更倾向于选择哪一种软件过程模型?为什么?

瀑布模型,项目规模比较小,项目的需求也比较清晰,开发过程对用户的依赖较小。

第五章 软件需求分析

1.需求分析的目的是什么,有什么作用?

需求分析的目的:是要求开发人员准确地理解用户需要什么,进行细致地调查分析,将用户的需陈述转化为完整的需求定义,再由需求定义转化为相应的软件需求规格说明。

需求分析的作用:通过需求分析,可以使开发人员深入细致地调研和分析项目,准确理解用户对项目的功能、性能、可靠性等具体要求,从而确定软件开发的方向而少走弯路。

2.需求分析有哪些分类,请举例说明?
  • 业务需求:业务需求就是系统目标,它必须是业务导向、可度量、合理、可行的。业务需求描述了组织为什么要开发一个系统,即组织希望达到的一个什么样的目标。通常来自项目投资人、购买产品的客户、实际用户的管理者、市场营销部分或产品策划部门,比如房地产市场的开发商。
  • 用户需求:用户要求系统必须实现的功能,从产品使用者的用户角度考虑,比如买房的人。
  • 功能需求:开发人员必须在产品中实现的软件功能,用户使用这些功能来满足业务需求。比如房子
    《软件工程》 课后思考题_第1张图片
  • 非功能需求:非功能需求主要与系统的总体特征有关,是一些限制性要求,是对实际使用环境所做的要求。如一个网站完全加载出来的时间必须在1s中之内。
3.需求分析过程有哪些步骤?
  1. 沟通:业务领域的共利益者(如业务管理人员、市场营销人员、产品管理人员)定义业务用例、确定市场的范围、初略的进行可行性分析、确定项目范围的工作说明。
  2. 导出需求:该步骤中应该分析和理解三个问题——范围问题、理解问题、易变问题。可采用会谈、调查、场景分析、快速原型法等多种方法来导出目标系统的高层逻辑模型。
  3. 与客户和用户协商:通过协商来调节冲突和问题,对需求进行排序,识别和分析每项需求相关的风险,开发工作量、成本和交付时间。
  4. 可行性研究:输入一个框架描述和高层逻辑模型,输出一份可行性研究报告。
  5. 精化需求:开发一个精确地技术模型,用以说明软件的功能、特征和约束,该模型定义了问题的信息域,功能域和行为域。可以使用结构化分析方法和面型对象分析方法来构建模型。
  6. 编写软件需求规格说明:软件需求规格是需求分析任务的最终产品,是客户、管理者、分析工程师、测试工程师、维护工程师交流的标准和依据。软件需求规格说明描述了系统的数据、功能、行为、性能需求、设计约束、验收标准、以及其他需求相关的信息。
  7. 验证需求:验证需求对需求分档和制品进行质量评估,确保需求说明准确、完整。包括正确性、一致性、完整性、可行性、必要性、可检验性、需求的可跟踪性,最后确认签字。
  8. 管理需求:需求一般会发生变更,可以通过建立需求跟踪矩阵来保存需求和后继工作成果的对应关系,建立和维护“需求-设计-编程-测试”之间的一致性,确保所有的工作成果符合用户需求。
4.需求获取方法有哪些?
  • 会谈技术:分为非正式会谈和正式会谈,提出一些可自由回答的问题和事先准备好的议题,从不同的角度,与不同的角色进行会谈,以了解不同用户的需求。
  • 调查技术:通过非正式会谈、调查问卷等调查方式来获取用户需求,注意检验调查结果的可信度。
  • 场景分析技术:分析用户和软件系统交互的过程,捕获这些场景的细节。
  • 快速原型法:快速建立软件原型的核心是用交互的、快速建立起来的原型取代了形式的、僵硬的(不易修改的)规格说明,用户通过在计算机上实际运行和试用原型而向开发者提供真实的反馈意见。

第六章 结构化分析

1.结构化分析的特点是什么?
  • 采用自顶向下、逐层分解的方法求解复杂问题。
  • 方法简单、清晰,易于学习掌握和使用。
  • 结构化分析的实施步骤是先分析当前环境中已存在的人工系统,在此基础上再构思即将开发的目标系统,这符合人们认识世界改造世界的一般规律,从而大大降低了问题的复杂程度。
  • 结构化分析采用了图形描述方式,用数据流图为即将开发的系统描述了一个可见的模型,也为相同的审查和评价提供了有力的条件,才上到下把大问题分解成若干个小问题,然后分别解决问题。
2.数据流图的建模元素有哪些?如何构建数据流图?有哪些注意事项?

2.1 数据流图有以下几种主要元素

  • 数据流:数据流是数据在系统内传播的路径,因此由一组成分固定的数据组成。如订票单由旅客姓名、年龄、单位、身份证号、日期、目的地等数据项组成。由于数据流是流动中的数据,所以必须有流向,除了与数据存储之间的数据流不用命名外,数据流应该用名词或名词短语命名。
  • 数据源或宿(“宿”表示数据的终点):代表系统之外的实体,可以是人、物或其他软件系统。
  • 对数据的加工(处理):加工是对数据进行处理的单元,它接收一定的数据输入,对其进行处理,并产生输出。
  • 数据存储:表示信息的静态存储,可以代表文件、文件的一部分、数据库的元素等。

2.2 构建数据流图的步骤

  1. 先确定系统的输入输出,构建顶层DFD。
  2. 对顶层DFD细化,构建0层DFD。
  3. 对0层DFD的每个加工进行细化,分别构建1层DFD,依次类推,逐层精化,纸质构建出底层图。

2.3 注意事项

  1. 注意数据流图中每个元素命名合理。
  2. 数据流图需要反映系统“做什么”而不是“如何做”。
  3. 每个加工至少有一个输入数据流和一个输出数据流,反映出此加工数据的来源于加工的结果。
  4. 按层给加工编号。
  5. 保持父图和子图的平衡
3.数据字典有哪些要素(条目)定义?
  • 数据流条目:通常列出该数据流的各组成数据项
  • 数据项条目:数据流的组成成员是数据项,数据项条目是不可再分解的数据单位。
  • 数据存储条目:与数据流条目一样。对存储数据的定义用数据存储条目。
  • 加工处理条目:通常采用输入——处理——输出(IPO,Input-Progress-Output)视图描述。

第七章 软件设计

1.软件设计的目标及主要任务有哪些?

软件设计的目标:软件系统设计是把软件需求“变换”为用于构造软件的蓝图,“输入”是需求分析各种模型元素,“输出”是软件设计模型和表示,软件设计阶段的基本目标是构造系统“怎么做”的模型描述 ,“设计先于编码”,这是软件工程“推迟实现”的基本原则。

主要任务:主要有以下几类设计活动

  • 总体设计:也称为概要设计,软件结构设计,或高层设计。
  • 体系结构设计:定义软件模块(构件)及模块之间的关系。
  • 接口设计:包括用户接口(界面),外部接口,内部接口。
  • 数据设计:软件涉及的数据结构,文件系统结构,数据库的表结构等。
  • 软件详细设计:也称为模块过程设计,或低层设计。
  • 模块内部细节设计:包括模块所需的算法和数据结构等。
2.什么是模块(构件)化设计思想
  • 模块是一个独立命名的,拥有明确定义的输入、输出和特性的程序实体。
  • 把一个大型软件系统的全部功能,按照一定的原则合理地划分为若干个模块,每个模块完成一个特定的子功能,所有的这些模块以某种结构形式组成一个整体,这就是软件的模块化设计。
  • 软件模块化设计可以简化软件的设计和实现,提高软件的可理解性和可测试性,并使软件更容易得到维护。
  • 分解、抽象、逐步求精、信息隐蔽和模块独立性,是软件模块化设计的指导思想。
3.模块独立性的两个度量标准是什么?
  1. 模块自身的内聚:也称为模块内联系,指一个模块内部元素彼此结合的紧密程度。
  2. 模块之间的耦合:也称为块间联系。

模块独立性愈高,则块内联系越强,块间联系越弱,即高内聚,低耦合。

4.内聚和耦合的含义是什么?各有哪些种类?请举例说明每一类型。
  1. 内聚的含义:内聚性是从功能的角度对模块内部聚合能力的量度。高内聚是模块独立性追求的目标。

  2. 内聚的种类(从上到下内聚性依次减弱):

    1.功能性内聚:模块各个成分结合在一起,完成一个特定的功能,功能性模块具有内聚性最强,与其它模块联系少的特点。例如:解析XML文档模块(解析XML元素,解析XML属性,解析XML注释等)。

    2.顺序性内聚:模块内的各个任务是顺序执行的。通常,上一个任务的输出是下一个任务的输入。例如:规则引擎:一个任务读配置,输出执行计划,另一个任务以执行计划为输入,执行该计划。

    3.通信性内聚:模块内部的各个任务靠公用数据联系在一起,即都使用同一个输入数据,或者产生同一个输出数据。例如:学生管理系统的数据库CRUD操作,都对学生信息进行增删改查操作。

    4.过程性内聚:模块内个各个任务必须按照某一特定次序执行。例如:读/写文件操作:判断文件是否存在,判断文件是否有相应权限,打开文件,读,写文件。

    5.时间性内聚:模块内的各个子任务由相同的执行时间联系在一起。例如:初始化模块,异常处理模块,某个异常处理模块封装了“释放资源”,“记录日志”,“通知用户”等几个任务。

    6.逻辑性内聚:模块通常由若干个逻辑功能相似的任务组成,通过模块外引入的一个开关量选择其一执行。这种内聚增大了模块间的耦合。例如:一个输出设备模块将打印机类和显示器类封装到同一个包里,该包即输出设备模块。打印机类和显示器类虽然都具有输出功能,但是具有不同的职责。

    7.偶然性内聚:模块内的各个任务在功能上没有实质性联系,纯属“偶然”因素组合子块内各个互不相关的任务。例如:一个处理正方形的模块有两个功能,计算面积,画出这个正方形。

    内聚性总结:在软件设计中,应力求做到高内聚、尽量少用中内聚,不用低内聚。一般来说,在系统较高层次上的模块功能复杂,内聚要低一些;而较低层次上的模块内聚程度较高,达到功能内聚的可能性比较大。

  3. 耦合的含义:耦合性是对一个软件结构内不同模块之间的互连程度的度量。耦合性的强弱取决于模块间接口的复杂程度,以及通过接口的数据类型和数目。弱耦合是模块独立性追求的目标。

  4. 耦合的种类(从上到下耦合性依次增强):

    1.非直接耦合:同级模块相互之间没有信息传递,即没有耦合。非常底层的模块,自给自足,可以无耦合。较高层的模块,通常需要重用其他模块的功能,产生耦合。

    2.数据耦合:调用下属模块时,如果交换的都是简单变量,便构成数据耦合。

    3.特征耦合(数据结构耦合):调用下属模块时,如果交换的是数据结构,便构成数据特性耦合。由于传递的是数据结构,不仅数据量增加,而且会使模块的相关性增加。

    4.控制耦合:模块间传递的信息不是一般的数据,而是作为控制信息的开关值或标志量。

    5.外部耦合:若允许一组模块访问同一个全局变量,可称他们为外部耦合。

    6.公共耦合:若允许一组模块访问同一个全局性的数据结构,则称他们为公共耦合。全局性的数据结构可以是共享的通信区,公共的内存区域,任何存储介质文件,物理设备等。

    7.内容耦合:若一个模块可以直接访问为另一个模块中的内部数据,或者一个模块直接转到另一个模块的内部,或者一个模块有多个入口,则称为内容耦合。

    耦合性总结:耦合是影响模块结构和软件复杂程度的一个重要因素,应该遵循如下的设计原则:尽量使用数据耦合,少用控制耦合,限制公共耦合,完全不用内容耦合。

5.为什么要高内聚低耦合?高内聚低耦合是否意味着内聚越高越好,耦合越低越好?

高内聚,低耦合的好处体现在系统持续发展的过程中,高内聚,低耦合的系统具有更好的重用性,维护性,扩展性,可以更高效的完成系统的维护开发,持续的支持业务的发展,而不会成为业务发展的障碍。

1.并不是内聚越高越好,耦合越低越好,真正好的设计是在高内聚和低耦合间进行平衡,也就是说高内聚和低耦合是冲突的。

2.最强的内聚莫过于一个类只写一个函数,这样内聚性绝对是最高的。但这会带来一个明显的问题:类的数量急剧增多,这样就导致了其它类的耦合特别多,于是整个设计就变成了“高内聚高耦合”了。由于高耦合,整个系统变动同样非常频繁。

3.对于耦合来说,最弱的耦合是一个类将所有的函数都包含了,这样类完全不依赖其它类,耦合性是最低的。但这样会带来一个明显的问题:内聚性很低,于是整个设计就变成了“低耦合低内聚”了。由于低内聚,整个类的变动同样非常频繁。

4.真正做到高内聚、低耦合是很难的,很多时候未必一定要这样,更多的时候“最适合”的才是最好的,不过、审时度势、融会贯通、人尽其才、物尽其用,才是设计的王道。

第八章 结构化设计

1. 软件结构图的形态特征有哪些指标?各有什么含义?

深度:指结构图控制的层次,即模块的层数。

宽度:指一层中最大的模块个数。

扇出:指一个模块直接下属模块的个数。

扇入:指一个模块直接上属模块的个数。

《软件工程》 课后思考题_第2张图片

2. 软件结构有哪些优化原则?
  1. 模块独立性准则:划分模块时,尽量做到高内聚低耦合,保持模块相对独立性,以此原则优化初始的软件结构。
  2. 软件结构的形态特征准则:软件结构的深度、宽度、扇入数和扇出数都要适当。
  3. 模块的大小准则:按模块的独立性,即根据模块的功能来决定模块的大小,过大的模块应进行分解,过小的模块应适当合并,但不应降低模块的独立性。
  4. 控制域和作用域之间的准则:一个模块的作用域应在其控制范围之内,且条件判定所在的模块应与受其影响的模块在层次上尽量靠近。
  5. 模块的接口准则:模块的接口要简单、清晰、力求降低模块接口的复杂程度,设计单入口,单出口的模块。
3. 数据流模型的类型有哪些?各有什么特点?
  1. 变换流:整个数据流体现了以输入、变换、输出的顺序方式,沿一定路径前行的特征,这就是变换型数据流,简称变换流。

《软件工程》 课后思考题_第3张图片

  1. 事务流:当数据经过一个具有“事务中心”特征的数据处理时,它可以根据事务类型从多条路径的数据流中选择一条活动通路,这种根据条件选择处理不同事务的数据流,就是事务型数据流。

《软件工程》 课后思考题_第4张图片

  1. 混合流:将事务流和变换流组合出现,就是混合型数据流。

《软件工程》 课后思考题_第5张图片

4. 简述面向数据流的变换以及事务设计方法的步骤。

变换设计方法

  1. 确定数据流图中的变换中心,逻辑输入和逻辑输出。
  2. 设计软件结构的顶层和第一层。
  3. 设计中、下层模块。
  4. 设计的优化。

事务设计方法

  1. 确定数据流图中事务中心和加工路径。
  2. 设计软件结构的顶层和第一层——事务结构。
  3. 进行事务结构中、下层模块的设计、优化等工作。
5. 结构化详细设计工具有哪几种?各有什么特点?
  1. 图形工具:把过程的细节表示成一个图的组成部分,在这个图上,逻辑构造用具体的图形来表示。

    流程图、盒图、PAD图

  2. 列表工具:用一个表来表示过程的细节,这个表列出了各种操作及其相应的条件,即描述了输入、处理和输出信息。

    判定表、判定树

  3. 语言工具:用伪代码来表示过程的细节,这种伪代码很接近于编程语言。

    PDL语言

第十一章 面向对象设计

1. 面向对象的分析与设计方法与结构化的分析设计方法有什么不同?
  1. 结构化方法首先关心的是功能,强调以模块(即过程)为核心,采用模块化、自顶向下、逐步求精设计过程,系统是事项模块功能的函数和过程的集合,结构清晰,可读性好,是条软件开发质量的一种有效手段。结构化设计从系统的功能入手,按照工程标准和严格规范将系统分解为若干功能模块。然而,由于用户的需求和软、硬件技术的不断发展变化,作为系统基本成分的功能模块很容易受到影响,局部修改甚至会引起系统的根本性变化。开发过程前期入手快而后期频繁改动的现象比较常见。
  2. 面向对象方法则从所处理的数据入手,以数据为中心来描述系统,数据相对于功能而言,具有更强的稳定性,这样设计出的系统模型往往能较好地映射问题域模型。对象、类、继承性、多态性、动态定连概念和设施的引入使用,显然另面向对象的设计方法具有一定的优势,能为生产可重用的软件构建和解决软件的复杂性问题提供一条有效的途径。面向对象的设计过程就是指通过建立一些类以及它们之间的关系来解决实际问题,这就需要对问题域中的对象作整体分析,类和类间关系的设计要求较高,否则设计出的并不是真正意义上的面向对象的软件系统,而只是一些类的堆砌而已,不能体现出面向对象设计方法的优势之处。
  3. 同时,系统的分析设计是一个注重实践的领域,不仅仅依赖于一整套核心的概念与原理,要想设计出一个成功的系统来,还需要相应的语言、工具和技术的有力支持。在这方面,经过多年的实践和发展,适应结构化方法的技术和开发环境已经相当稳定成熟,而面向对象方法而言,虽然近时期涌现了大量的新工具和新技术,但仍有待于不断的完善和改进,特别是面向对象的数据库技术。
2. 面向对象的分析与设计之间有什么样的联系?

面向对象分析的输入是用户的功能需求,输出是简单的、理性化的分析模型,此阶段的工作更多侧重于如何了理解软件的功能需求。

面向对象设计的输入是面向对象分析的结果,输出最终的细化后的设计模型,此阶段的工作更多侧重于如何得到一个合适的、完整的解决方案。

主要区别:

  1. 在侧重点上,面向对象分析侧重于理解问题,描述软件要做什么,而面向对象设计侧重于理解解决方案,描述软件要如何做。
  2. 面向对象分析一般只考虑架构设计,不关心技术和实现层面的细节,而面向对象设计需要得到更具体、更详尽、更接近于真实的代码的设计方案。
  3. 在设计结果的描述方式上,面向对象分析阶段侧重于描述对象的行为,而面向对象设计侧重于描述对象的属性和方法。
  4. 面向对象分析只关注功能性需求,而面向对象设计既关注功能型需求,也关注非功能性需求。
  5. 面向对象分析产生的系统模型通常规模较小,而面向对象设计产生的系统模型规模较大,内容也比较详尽、完整。

参考书籍:《软件工程方法与实践》 窦万峰

你可能感兴趣的:(软件工程,软件开发,软件架构)