1、软件工程的定义
软件工程是将系统化、规范化、可度量的方法应用于软件的开发、运营和维护上,也就是将工程方法应用于软件上,并对这些方法的研究。
2、软件危机(software crisis)
软件危机(software crisis)是由于计算机能力的快速增长和无法解决的问题的复杂性。随着软件复杂性的增加,很多软件问题由于现有方法的不足够而产生。
软件危机的原因与硬件的整体复杂度和软件的发展过程有关,主要原因是计算机的计算能力超过了程序员有效利用这些计算能力的能力。软件危机主要表现在以下方面:
- 项目运行超过预算、时间
- 软件非常低效、低质量
- 软件通常无法满足需求
- 项目难以管理,代码难以维护
- 软件从未交付
3、COCOMO模型
COCOMO模型(构造性成本模型)是一种精确的、易于使用的、基于模型的成本估算方法,本质上是一种参数化的项目估算方法,模型的参数是使用历史项目的数据拟合回归公式所产生的。
COCOMO模型可以分成以下三个层次:
- 基本COCOMO模型:将所计算的程序大小作为软件开发的工作量和成本,程序大小用估量的源代码行数来表示(SLOC, KLOC)该模型可用于软件成本的快速估计,但是它没有考虑到硬件约束、人员质量和经验、模型工具和技术的使用等方面。
- 中级COCOMO模型:将所计算的程序大小和“成本驱动因素”作为软件开发的工作量,其中“成本驱动因素”包括产品、硬件、人员和项目属性的客观评价。
- 具体COCOMO模型:合并中级模型的所有特点,并对软件工程过程的每个步骤(分析、设计等)的成本驱动因素的影响进行评估。在该模型中,整个软件被分成不同的模块,再将COCOMO模型应用于各个模块中去估量它的工作量,最后将所有的工作量相加作为整个软件的工作量。
4、软件生命周期
软件生命周期是将软件开发工作分成不同的阶段以提高设计、产品管理和项目管理的过程。大多数现代开发过程可模糊地描述成敏捷模型,其他的模型包括瀑布模型、原型模型、迭代和增量模型、螺旋模型、快速应用开发模型等。
生命周期可分成以下几个阶段:
- 问题的定义和规划:主要确定软件的开发目标和可行性分析;
- 需求分析:弄清用户对软件的全部需求,对软件所要实现的功能进行详细分析,并编写需求文档;
- 开发:包括软件的设计、实现和测试;
- 维护:包括改进性维护、适应性维护、完善性维护和预防性维护。
5、按照 SWEBok 的 KA 划分,本课程关注哪些 KA 或知识领域
- 软件需求(software requirements)
- 软件设计(software design)
- 软件构建(software construction)
- 软件工程的模型和方法(software engineering models and methods)
6、CMMI 的五个级别
- 初始级:
软件过程是无序的,混乱的,没有定义的。成功取决于个人努力,管理是反应式的。 - 可管理级:
有基本的项目管理过程来跟踪费用、进度和功能特性,且制定了必要的过程纪律,能够重复早先类似应用项目取得的成功经验。 - 已定义级:
已将软件管理和工程两方面的过程文档化、标准化,并综合成该组织的标准软件过程。所有项目均使用经批准、剪裁的标准软件过程来开发和维护软件,软件产品的生产在整个软件过程是可见的。 - 量化管理级:
分析对软件过程和产品质量的详细度量数据,对软件过程和产品都有定量的理解与控制。管理有一个作出结论的客观依据,管理能够在定量的范围内预测性能。 - 优化管理级:
过程的量化反馈和先进的新思想、新技术促使过程持续不断改进。
7、CMMI
CMMI是软件能力成熟度集成模型,通过建立有效的软件工程过程的基础结构,提供一个单一的有效的、集成化的、自动的、可扩展的框架,能够帮助企业改进对软件工程的管理,让企业能更高效地生产质量更好的软件。
CMMI提供了单一的集成化框架用于改进一个组织的各种过程,新的集成模型框架消除了各个模型的不一致性,减少了模型间的重复,增加透明度和理解,更为自动化、可扩展化,因而能够从总体上改进组织的质量和效率。
CMMI对于企业的价值表现为:保证软件开发的质量和进度;有利于成本控制;有助于提高软件开发者的职业素养;能够解决人员流动带来的问题;有利于提升公司和员工绩效管理水平,以持续改进效益。
8、PSP2.1 的阶段及技能要求
工作任务 | 技能要求 |
---|---|
计划 | 熟悉开发流程,有规划能力 |
估计这个任务需要多少时间 | 对整个项目以及各个阶段有大致的时间观 |
开发 | 分析设计能力,编程能力 |
需求分析(包括学习新技术) | 详细分析用户的需求并结合项目实际,确定最终需求的功能点 |
生成设计文档(设计软件的框架) | 设计能力,表达能力,撰写能力 |
设计复审 (和同事审核设计文档) | 协商能力 |
代码规范 (为目前的开发制定合适的规范) | 掌握通用的代码规范* |
具体设计 | 设计能力 |
具体编码 | 编程能力 |
代码复审 | 细心,审查debug能力 |
测试(自我测试,修改代码,提交修改) | 测试能力 |
报告 | 撰写表达能力 |
测试报告 | 撰写表达能力 |
计算工作量 | 计算能力 |
事后总结, 并提出过程改进计划 | 熟悉整个过程,创新意识,多思考多学习 |