以下问题和解答来自 SYSU 16 级系统分析与设计课程 week1 的作业实践。

Student ID : 16340186

Student Name : 邱奕浩

Q1: 阐述软件工程的定义。

A1: 软件工程一直以来缺乏严格标准的定义,不过很多学者,组织机构都给出了自己的定义,如:

  1. NATO (1968): 软件工程是研究和应用如何以系统的,规范化的,可定量的过程化方法去开发和维护软件,以及如何把经过实践验证而证明正确的管理技术和当前最好的技术方法综合起来的一门独立学科。
  2. IEEE (1993):软件工程是将系统化的,严格约束化的,量化的工程方法应用于软件的开发,运行,维护过程,即用工程化的方法来打造软件。
  3. 《计算机科学技术百科全书》:软件工程是应用计算机科学,数学,逻辑学及管理科学等原理,来开发软件的过程。
  4. 《信息技术 软件工程术语》: 软件工程是应用计算机科学理论和技术以及工程管理原则和方法,按预算和进度,实现满足用户要求的软件产品的定义、开发、和维护的工程或学科。

从上述各方的定义中,我们可以得出:

  1. 软件工程是一门独立的交叉学科,也是一门独特的工程,综合了理论,工程,技术,管理等方面的知识,同时处于理论与实践水平不断发展的过程。

  2. 软件工程具有系统化,约束化,规范化,过程化,可量化的特点,具备相应的工程管理原则和方法。


Q2: 解释导致软件危机 ( software crisis ) 的本质原因和表现形式,并述说克服软件危机的方法。

A2:

  • 软件危机的本质原因
    • 软件的大量需求与软件生产力效率之间的矛盾,
    • 软件系统的复杂性与软件开发方法之间的矛盾。
  • 软件危机的表现形式

    • 软件开发成本日益增长,开发成本往往超出预算(成本)
    • 软件开发进度难以控制,项目的开发时间往往超出预定的进度时间表(时间)
    • 用户对软件产品不满意的现象经常发生,这是对用户需求的理解不够明确,用户需求多样化的原因(需求)
    • 软件产品的质量不可靠,时常存在 Bug (质量)
    • 软件的可维护性低,数量不断膨胀的软件产品缺乏适当的文档资料 (维护)
    • 软件的开发生产率跟不上硬件的发展,计算能力越大,编程问题越大,软件越复杂。(摩尔定律)
  • 克服软件危机的主要方法

    • 软件从业者必须正确认识计算机软件的内涵(软件 ≠ 程序)。
    • 充分认识到软件开发并不是来自于某种个体劳动的神秘技巧,而是需要依托组织良好,管理严密,协同配合的工程活动。
    • 采用成熟的软件开发技术和方法,比如结构化程序设计面向对象的开发),CMMUML等等
    • 开发和使用适当的软件工具
    • 从业者的专业素养和知识水平必须不断提升

    IBM大型机之父 Brooks 在其著名论文《没有银弹》中断言:“在10年无法找到解决软件危机的灵丹妙药”,在其另外一著作《人月神话》提到:开发软件的困难是天生存在的,我们只能渐进式的改善它。在整体工程环境没有改变之前,对克服软件危机所能做的就是依靠人的素质,培养优秀的软件工程师


Q3: 解释一下软件的生命周期的概念。

A3:软件像一个个生命体一样,具有孕育、诞生、成长、成熟、衰亡的生存过程,即软件的生命周期。软件的生命周期被划分为若干阶段,每个阶段具有明确的任务,从而使规模,结构和管理复杂软件的开发过程得到适当的控制管理。生命周期主要分为以下6个阶段。

  1. 可行性分析与计划阶段

    1. 确定软件开发的总体目标,给出功能,性能,可靠性以及接口等方面的要求,并进行可行性分析。
    2. 估算软件的开发成本,估计可利用的资源,成本,效益,开发进度,进行投资-收益分析,制定开发计划。
    3. 提交可行性分析报告、开发计划等文档。
  2. 需求分析阶段

    1. 分析用户需求,给出需求的详细定义,确定软件的各项功能,性能需求和设计约束,确定对文档编制的要求。
    2. 提交软件需求说明文档,软件规格说明文档,数据要求说明等文档和初步的用户手册。
  3. 设计阶段

    1. 概要设计:将需求转化成软件的体系结构,结构中每一组成部分必须是意义明确的模块,每一个模块必须和需求相匹配。
    2. 详细设计:对模块所完成的任务进行详细具体的描述,提供源程序编写的直接依据。
    3. 提交结构设计说明、详细设计说明和测试计划初稿等文档。
  4. 实现阶段

    1. 完成源程序的编码,编译,调试,得到没有语法错误的程序清单。必须确保程序结构良好,清晰,具有较为良好的可读性,并且与上一设计阶段中的要求相一致。
    2. 根据项目重要性和规模,编写开发进度日报,周报,或月报。
    3. 完成用户手册,操作手册等面向用户的文档编写工作。
    4. 编制初步的测试计划。
  5. 测试阶段

    1. 全面测试目标软件(包括单元测试,集成测试,系统测试等),并检查审阅已编制好的文档,提交测试分析报告。逐项评价所生产的程序,文档以及开发工作本身,提交项目开发总结报告。
    2. 在这个开发过程中,开发集体需要按月编写进度月报。
  6. 运行和维护阶段

    1. 用户使用软件之后,必须在运行使用中加以持续的维护,根据用户新提出的需求进行软件功能的扩充,删改,更新和升级。
    2. 软件维护包括改正性维护(用于发现软件错误),适应性维护(适应运行环境的变化)以及完善性维护(增强功能)。


Q4: SWEBoK 的 15 个知识域(An Overview of the SWEBOK Guide 请中文翻译其名称与简短说明)

A4:SWEBoK 的中文名称为软件工程知识体系( Software Engineering Body of Knowledge),是 IEEE Computer Society 构建软件生产的最佳实践与相关知识的框架,用于指导软件工程人才的培养与学科建设。知识体系分为软件工程实践和基础教育两个部分,共有15个知识域 ( Knowledge Aaras 以下简称 KA )

  1. 软件工程实践(The Practice of Software Engineering)
    1. 软件需求 (Software Requirements) :软件需求知识域主要关注软件需求的协商,谈判,分析,明确。,验证等过程。该 KA 是整个 SWEBoK 中最重要的两个领域之一。经业界实践表明,如果软件需求工作没做好,那么整条软件产品线和软件工程项目将变得极其最弱,所谓 ”牵一发而动全身”。
    2. 软件设计 (Software Design) : 软件设计是定义软件结构,组件,接口,和其他系统特性以及产品结果的过程,该 KA 涵盖了软件的设计过程和目标产品。软件设计在软件生命周期中的主要目的是结合上一阶段的软件需求,做出对软件内部结构,接口和行为的具体描述。和软件需求 KA一样,软件设计KA是 SWEBoK 中最重要的领域之一。
    3. 软件构建 (Software Construction): 软件构建实现主要涉及到了详细的代码设计实现,单元测试,集成测试,调试和验证等工作任务。软件构建 KA 包含的相关主题是满足需求和设计约束的软件程序的发展过程,涵盖了软件构造基础,管理软件构建任务,构建方法论,实用的构建思想和软件构造的工具。
    4. 软件测试 (Software Testing) :软件测试是一项评估软件项目质量以及识别软件缺陷并改善的工作,该 KA 包含了软件测试的基础知识,软件测试的技术,用户界面接口测试,相关的测试措施和实际软件的考虑方法。
    5. 软件维护 (Software Maintenance) :软件维护 KA 涉及了升级现有软件功能(完善性维护),调整软件适应运行环境的变化(适应性维护),以及更正软件缺陷(改正性维护)等方面的工作。
    6. 软件配置管理 (Software Configuration Management) : 系统的配置是硬件,固件,软件或他们组合的功能和物理特征。同时配置还可以看作是硬件,固件,软件,或其组合的特定版本的集合。不同的版本有不同的配置,根据特定的构建过程组合在一起,以服务与特定的目的。
    7. 软件工程管理 (Software Engineering Management) :软件工程管理包括计划,协调,衡量,报告和控制一个项目,以确保软件的开发和维护是系统化的,有纪律的以及可量化的。
    8. 软件工程过程 (Software Engineering Process) : 该KA涉及软件生命周期过程的定义,实现,评估,度量,管理和改进。所涵盖的主题包括过程实现和变更,过程定义,过程评估模型和方法,以及过程测量。
    9. 软件工程模型和方法 (Software Engineering Models and Methods) :该 KA 解决了围绕整个软件生命周期各阶段问题的方法,以及在特定生命周期阶段的其他 KA 所包含的问题的方法。
    10. 软件质量 (Software Quality): 软件质量问题是普遍存在于整个软件生命周期的问题,该 KA 关注软件质量的基础,软件质量管理过程,以及实际的考虑。
    11. 软件工程专业实践 (Software Engineering Professional Practice):该 KA 的理念是对于软件工程师而言,必须具备的知识,技能和态度,要以一种专业的,负责的,和合乎道德的方法来进行实践。
  2. 软件工程教育的需求 (The Educational Requirements of Software Engineering )
    1. 软件工程经济学 (Software Engineering Economics): 该 KA 主要关注的是如何在业务环境中做出决策,以便技术决策与组织的业务目标保持一致。
    2. 计算基础 (Computing Foundations):该 KA 涵盖了提供给软件工程实践所需的计算背景的基础主题。包括问题解决技术、抽象、算法和复杂性、编程基础、并行和分布式计算的基础、计算机组织、操作系统和网络通信。
    3. 数学基础 (Mathematical Foundations) : 该 KA 涵盖了用于软件工程实践所需的数学理论基础,包含的主题有集合、关系、函数、基本的明题和谓词逻辑、证明方法、图、树、离散数学、仿真建模等等。
    4. 工程基础 (Engineering Foundations):该KA主要提供了用于软件工程实践所需的工程背景基础,主题涵盖了经验方法和实验技术、统计分析、测量与指标、工程设计、建模与仿真、以及根本原因分析等方面。

Q5: 简单解释 CMMI 的五个级别。

A5: CMMI 中文名称为能力成熟度模型集成,是一种过程性的改进训练和评估计划,用于度量一个企业的软件工程能力。其五个级别简单概括如下:

  1. Level 1 - Initial:企业运作处于一种无序,自发生产的模式,过程难以预测,控制性差,反应性弱。
  2. Level 2 - Managed:企业在管理级的水平上处于有序的,项目化的生产模式,具有明确的流程和较好的项目控制程序。
  3. Level 3 - Defined:企业工程水平达到定义级,企业企业管理组织化,流程标准化,体系制度化。
  4. Level 4 - Quantitatively Managed:企业管理水平进一步升级,实现数字化管理和控制。
  5. Level 5 - Optimizing:在优化级别,企业项目管理达到最高水平,能主动改善业务项目流程,不断实现过程优化。

Q6:用自己的语言简述 SWEBok 或 CMMI( 200 字)。

SWEBok (软件工程知识体系)是 IEEE Computer Society 提出来的一套构建软件生产的最佳实践与相关知识的框架,用于指导软件工程人才的培养和学科建设。该体系从软件工程的实践和教育两个方面切入,就这两个方面划分了15个知识域(KA)。

在实践方面,知识体系归纳了 11 种知识域:围绕软件生命周期提出了 5 个知识域:软件需求 KA、软件设计 KA、软件实现 KA、软件测试 KA、软件运行维护 KA;结合工程管理的原则,提出了 6 个 KA:软件配置管理 KA、软件工程管理 KA、软件工程过程 KA、软件工程建模与方法 KA、软件质量 KA、软件工程专业实践 KA。

在教育方面,则是提出了软件工程经济学 KA、计算基础 KA、数学基础 KA、工程基础 KA。

整套知识体系科学完备,教育 KA 是 实践 KA 的基础和支撑,在实践的探索过程中,又不断地给予教育体系层面的反馈和优化。


完。