这是系统分析与设计的第一次作业.

1. 简答题

1.1 软件工程的定义

软件工程是一门应用计算机科学理论和技术以及工程管理原则和方法,按预算和进度,实现满足用户要求的软件产品的定义、开发、和维护的工程或进行研究的学科。

1.2 阅读经典名著“人月神话”等资料,解释 software crisis、COCOMO 模型。

1.2.1 软件危机

是指在软件开发过程中遇到的一系列可能导致产品寿命缩短甚至夭折的问题。主要表现在

  • 项目超出预算
  • 项目时间成本过高
  • 软件质量低下
  • 软件通常不符合需求
  • 项目无法管理且代码难维护

1.2.2 COCOMO模型

构造性成本模型(COCOMO模型)是一种在软件项目中估计工作量、成本和时间表的模型。

基本COCOMO

基本COCOMO模型用每千行代码数(KLoC)来计算软件开发的工作量及成本的。计算等式如下:

其中E是用“人月”来计算的工作量,D是指累积的开发时间(月),KLOC是指对最终发布的代码行数的估计(千行代码),P指需要的人数。参数$a_b$、$b_b$、$c_b$和$d_b$根据不同类型的项目变化。

中级COCOMO

中级COCOMO中考虑了项目的15个属性,并对这15个属性进行一个综合评估,得出一个评估值$EAF$,等式如下:

其中E是以“人月”来计算的工作量,“KLoC”是产品发布的代码行数(千行代码),“EAF”是评估因子。参数$a_i$、$b_i$根据不同类型的项目变化。

详细COCOMO

详细COCOMO加入了对不同软件开发阶段影响的考量,进一步优化了模型。

1.3 软件生命周期

软件生命周期又称为软件生存周期或系统开发生命周期,是软件的产生直到报废的生命周期,周期内有问题定义、可行性分析、总体描述、系统设计、编码、调试和测试、验收与运行、维护升级到废弃等阶段。

1.4 按照 SWEBok 的 KA 划分,本课程关注哪些 KA 或 知识领域?

  • 软件需求(Software requirement)
  • 软件设计(Software design)
  • 软件构造(Software construction)
  • 软件工程管理(Software engineering management)
  • 软件工程模型和方法(Software engineering models and methods)

1.5 解释 CMMI 的五个级别。例如:Level 1 - Initial:无序,自发生产模式

  • Level1 - Initial:无序,自发生产模式。
  • Level2 - Repeatable:建立了基本的项目管理过程,制定了必要的过程纪律。
  • Level3 - Defined:将软件管理和工程两方面的过程文档化、标准化,并综合成该组织的标准软件过程。所有项目均使用经批准、剪裁的标准软件过程来开发和维护软件,软件产品的生产在整个软件过程是可见的。
  • Level4 - Managed:分析对软件过程和产品质量的详细度量数据,对软件过程和产品都有定量的理解与控制。
  • Level5 - Optimizing:过程的量化反馈和先进的新思想、新技术促使过程持续不断改进。

1.6 用自己语言简述 SWEBok 或 CMMI (约200字)

能力成熟度模型集成(Capability Maturity Model Integration,简称CMMI)是一个过程改进方法,它的目的是帮助组织改进他们的绩效。

CMMI由来自行业、政府和卡内基·梅隆大学的一组专家所开发,开始的CMMI为开发或改进一个软件工程项目的过程提供指导,但是随着时间的推进,现在的CMMI已经被高度一般化,逐渐渗透其他领域,比如硬件产品的开发、所有种类的业务的交付,以及产品和服务的采购。

CMMI能帮助组织集成传统和独立的组织功能,设置过程改进目标和优先级,为质量过程提供指引,并为评价当前过程提供参考。

三个方面

CMMI有三个覆盖的方面,包括

  1. 产品服务和开发(CMMI for Development)
  2. 服务创建、管理和交付(CMMI for Service)
  3. 产品和采购服务(CMMI for Acquisition)

五个级别

即 1.5 中提到的五个级别。

2. 解释 PSP 各项指标及技能要求

根据PSP 2.1 我们可以得知,在拿到一个任务之后,程序员应该

  1. 首先开始计划,估计一下完成这个任务需要的时间。这里可以使用前面提到的COCOMO模型来预估任务的工作量和成本。
  2. 然后着手开发
    • 开发首要的事情就是分析需求。分析需求需要大量的数据,个人觉得可以委托第三方调查公司帮忙获取数据。
    • 根据需求生成设计文档,这里的文档应该只提取需求较大的几个功能加入项目,以节省成本。
    • 审查文档,确认设计文档的合理性
    • 代码规范,根据设计文档指定合适的代码规范
    • 具体设计
    • 具体编码
    • 代码复审
    • 代码测试
  3. 记录时间花费
  4. 测试报告
  5. 计算工作量
  6. 事后总结
  7. 提出过程改进计划