系统分析与设计HW1
1简答题
软件工程的定义
软件工程学科诞生后,人们对软件工程提出了不同的定义。
- 最早的定义由德国慕尼黑工业大学的计算机教授F.L.Bauer给出: 软件工程师为了经济地获得能够在实际机器上高效运行的、可靠的软件而建立和应用一系列坚实的软件工程原则。
- 美国梅隆卡耐基大小软件工程研究所给出的定义: 软件工程师以工程的形式应用计算机科学和数学原理,从而经济有效地解决软件问题。
- IEEE对软件工程的定义: 软件工程是(1)将系统化的、规范的、可度量的方法应用于软件的开发、运行和维护,即将工程化方法应用于软件;(2)在(1)中所述方法的研究。其中IEEE给出的定义也是目前普遍使用的。
软件危机software crisis
软件危机,是指落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现的一系列严重问题的现象。
软件危机的表现形式
- 软件开发成本日益增长
- 开发成本超出预算
- 软件开发进度难以控制
- 实际进度比预定计划一再拖延
- 用户对 “已完成” 系统不满意的现象经常发生
- 用户需求不明确
- 软件产品的质量不可靠
- Bug & Patch
- 软件的可维护程度低
- 数量不断膨胀的软件产品缺乏适当的文档资料
- 软件开发生产率跟不上硬件的发展和人们需求的增长
软件危机的原因
- 软件危机的根源
- 软件的大量需求与软件生产力效率之间的矛盾
- 软件系统的复杂性与软件开发方法之间的矛盾
- 软件本身的特点
- 软件是一种抽象逻辑
- 软件是开发人员的智力劳动成果
- 软件具备强烈的个性化特征
- 软件规模日趋庞大,实现的业务逻辑与流程复杂
- 软件开发的客观因素
- 系统需求分析不足
- 开发周期管理不善
- 开发过程缺乏规范 ◌ 软件开发 =?程序编写
- 质量控制标准规程滞后
- 软件维护计划被忽视
- 产业因素
- 软件企业的作坊式管理
- 软件企业规模的急剧膨胀
软件危机的消除
- 解决途径
- 正确认识计算机软件的内涵 (软件≠程序)
- 充分认识到软件开发不是某种个体劳动的神秘技巧,而是一种组织良好、管理严密、协同配合的工程活动
- 采用成熟的软件开发技术和方法
- 开发和使用适当的软件工具
- 实施办法
- 组织管理 ◌ 采用工程项目管理方法
- 技术措施 ◌ 采用软件开发技术、方法与软件工具
COCOMO 模型
COCOMO,英文全称为constructive cost model,中文为构造性成本模型,是一种常见的软件规模估算方法。
- 它是一种精确、易于使用的,基于模型的成本估算方法,最早由勃姆 (Boehm) 于 1981 年提出。从本质上说是一种参数化的项目估算方法,参数建模是把下那个目的某些特征作为参数,通过建立一个数字模型预测项目成本。
- 在COCOMO模型中,工作量调整因子(Effort Adjustment Factor, EAF)代表多个参数的综合效果,这些参数使得项目可以特征化和根据COCOMO数据库中的项目规格化.每个参数可以定位很低,低,正常,高,很高.每个参数都作为乘数,其值通常在0.5到1.5之间,这些参数的乘积作为成本方程中的系数。
不同层次的模型
COCOMO用3个不同层次的模型来反映不同程度的复杂性,他们分别为:
- 基本模型 (Basic Model) 一个静态单变量模型,它用一个以已估算出来的源代码行数 (LOC) 为自变量的函数来计算软件开发工作量。
- 中间模型 (Intermediate Model)。 则在用 LOC 为自变量的函数计算软件开发工作量的基础上,再用涉及产品、硬件、人员、项目等方面属性的影响因素来调整工作量的估算。
- 详细模型 (Detailed Model) 包括中间 COCOMO 模型的所有特性,但用上述各种影响因素调整工作量估算时,还要考虑对软件工程过程中分析、设计等各步骤的影响。
应用开发模式
同时根据不同应用软件的不同应用领域,COCOMO模型划分为如下3种软件应用开发模式:
- 组织模式(Organic Mode)。这种应用开发模式的主要特点是在一个熟悉稳定的环境种进行项目开发,该项目与最近开发的其他项目有很多相似点,项目相对较小,而且并不需要许多创新。
- 嵌入式应用开发模式 (Embedded Mode)。在这种应用开发模式种,项目受到接口要求的限制。接口对整个应用的开发要求非常高,而且要求项目有很大的创新,例如开发一种全新的游戏。
- 中间应用开发模式 (Semidetached Mode)。这时介于组织模式和嵌入式应用开发模式之间的类型。
软件生命周期
软件生命周期的概念
- 计算机软件有一个孕育、诞生、成长、成熟、衰亡的生存过程,即软件的生命周期 (也称软件开发生命周期SDLC或软件开发过程)。软件生命周期被划分为若干阶段,每个阶段有明确的任务,从而使规模、结构和管理复杂的软件开发过程得到适当的控制和管理。
- 软件生命周期包括可行性分析与开发计划、需求分析、设计 (概要设计和详细设计)、编码实现、测试、运行与维护等活动,将这些活动以适当的方式分配到不同的阶段去完成。
软件生命周期的6个阶段
可行性分析与计划阶段
- 确定软件开发的总体目标,给出功能、性能、可靠性以及接口等方面的要求,进行完成可行性分析。
- 估计可利用的资源 (硬件、软件、人力等)、成本、效益、开发进度,进行投资-收益分析,制订开发计划。
- 提交可行性分析报告、开发计划等文档。
需求分析阶段
- 分析用户提出的要求,给出需求详细定义,确定软件系统的各项功能、性能需求和设计约束,确定对文档编制的要求。
- 提交软件需求说明、软件规格说明、数据要求说明等文档和初步的用户手册。
设计阶段
- 概要设计:把各项需求转换成软件的体系结构。结构中每一组成部分都是意义明确的模块,每个模块都和某些需求相对应。
- 详细设计:对每个模块所要完成的工作进行具体的描述,提供源程序编写的直接依据。
- 提交结构设计说明、详细设计说明和测试计划初稿等文档。
实现阶段
- 完成源程序的编码、编译 (或汇编)和排错调试,得到没有语法错误的程序清单。程序结构良好、清晰易读,且与设计相一致
- 编写进度日报、周报和月报 (取决于项目的重要性和规模)。
- 提交用户手册、操作手册等面向用户的文档的编写工作。
- 编制测试计划。
测试阶段
- 全面测试目标软件系统,并检查审阅已编制的文档,提交测试分析报告。逐项评价所生产的程序、文档以及开发工作本身,提交项目开发总结报告。
- 在整个开发过程中 (即前五个阶段中),开发集体需要按月编写开发进度月报。
运行与维护阶段
- 软件提交给用户后,在运行使用中得到持续维护,根据用户新提出的需求进行必要而且可能的扩充、删改、更新和升级。
- 软件维护包括改正性维护 (发现错误)、适应性维护 (适应运行环境变化) 和完善性维护 (增强功能)。
关于SWEBok 的 KA 划分
2001年由IEEE_CS发布的SWEBOK对软件工程学科的边界进行了定义,将软件工程划分为10个知识域,包括软件需求、软件设计、软件构造、软件测试、软件维护、软件配置管理、软件工程管理、软件工程过程、软件工程工具和方法、软件质量。
- 我认为本课程(系统分析与设计)关注的领域有软件需求、软件设计、软件构造、软件工程管理。
CMMI 的五个级别
CMMI 的全称为:Capability Maturity Model Integration,即能力成熟度模型集成或称为软件能力成熟度集成模型。
CMMI有5个级别,分别是:
- Level1:初始级——无序的,甚至是混乱的,对过程几乎没有定义,成功取决于个人努力。是自发生产模式。
- Level2:可管理级——建立了基本的项目管理过程来跟踪费用、进度和功能特性。制定了必要的过程纪律,能重复早先类似应用项目取得的成功经验。
- Level3:已定义级——已将软件管理和工程两方面的过程文档化、标准化,并综合成该组织的标准软件过程。所有项目均使用经批准、剪裁的标准软件过程来开发和维护软件,软件产品的生产在整个软件过程是可见的。
- Level4:量化管理级——分析对软件过程和产品质量的详细度量数据,对软件过程和产品都有定量的理解与控制。管理有一个作出结论的客观依据,管理能够在定量的范围内预测性能。
- Level5:优化管理级——过程的量化反馈和先进的新思想、新技术促使过程持续不断改进。
用自己语言简述 SWEBok 或 CMMI (约200字)
SWEBok,软件工程知识体系,是IEEE计算机学会职业实践委员会主持的一个项目,其目标为促进世界范围内对软件工程的一致观点;阐明软件工程相对其他学科(如计算机科学、项目管理、计算机工程和数学等)的位置,并确立他们的分界;刻画软件工程学科的内容;提供使用知识体系的主题;为开发课程和个人认证与许可材料,提供一个基础。SWEBok V3在2014年2月发布,包括15个知识域,其中有11个软件工程实践知识域和4个软件工程教育基础知识域,还包括7个相关学科。
2.解释 PSP 各项指标及技能要求
- 阅读《现代软件工程》的 PSP: Personal Software Process 章节。 http://www.cnblogs.com/xinz/archive/2011/11/27/2265425.html
- 按表格 PSP 2.1, 了解一个软件工程师在接到一个任务之后要做什么,需要哪些技能,解释你打算如何统计每项数据? (期末考核,每人按开发阶段提交这个表)
1.根据表格PSP2.1,一个软件工程师在接到一个任务后要做的事情首先是计划,即估计这个任务需要多少时间;然后是开发阶段,分析用户需求,生成设计文档,设计复审,制定代码规范,具体设计和编码,代码复审和测试。在这个过程还要记录花费的时间,做好测试报告,计算工作量,进行事后总结,提出过程改进计划。
2.需要技能:软件工程师需要有项目管理经验和风险评估经验,对任务的可行性和SDLC有比较准确的评估;软件工程师还要有良好的沟通能力,理解用户的需求并进行设计;还需要优秀的代码能力和抗压能力,毕竟软件开发过程需要不断地修改优化软件。
3.统计数据:首先小组约定好协作平台比如Google sheet或伙伴云、石墨等,小组各成员在项目进行的每个阶段按约定周期做好相应的记录,比如固定周期的会议记录,小组成员各自的工作进行定期总结,代码不同版本的报告和测试报告。