一、软件工程
什么是软件?
程序、数据、文档
软件的分类?
按功能划分:系统软件、支撑软件、应用软件
软件的特点?
抽象、复杂、系统
软件危机
软件在研发、运行、管理过程中出现的一系列严重问题的现象。
是由于需求不清晰、项目开发没有明确规划和管理、程序设计和编码缺乏规范化和系统化、缺乏合适的工具支持
软件工程
工程、技术、管理
目的:高效,高质量,低成本开发软件产品
软件生命周期
从软件开始研发到停止使用,内容包括:问题的定义,可行性分析,需求分析,总体设计,详细设计,编码,测试,运行,维护
软件开发环境
在基本硬件和宿主软件的基础上,为支持系统软件和应用软件工程化开发和维护而使用的一组软件。
软件质量保证
软件质量保证是建立一套有计划,有系统的方法,来向管理层保证拟定出的标准、步骤、实践和方法能够正确地被所有项目所采用。
过程模型
瀑布模型:瀑布模型是一种线性的,顺序的模型方法,每一个阶段任务依赖上层的任务质量和文档。
优点:结构清晰,容易理解控制
缺点:周期长,不灵活,难变更。
原型模型:在任务开始之前,首先快速构建一个原型,以此与客户沟通,便于充分理解需求,适用于需求不清晰和有较多变化的项目。
优点:效率高,风险低,直观,可以得到客户反馈提高满意度。
缺点:原型的构建往往是高速的产物,意味着可能并不是最佳技术方案,很多细节上也没有过多顾及,后期难维护。
增量模型:增量模型是将系统模块化,通过分析设计编码测试这些系统组件,逐步实现系统的完整性。
优点:灵活,低风险,进度可控,用户满意,人员配置灵活。
缺点:系统的整体性较差,要具备科学的,规范的开发管理方法,严格的测试和管理,以及小组成员间的充分交流沟通,使各模块正确衔接。
螺旋模型:它基于螺旋的概念,螺旋的每一圈都代表一个完整的软件开发周期,每一轮都要作出分析并形成大量文档,可以很好地应对需求变化。
优点:灵活,可变更,适合大型复杂项目以及不确定性大的项目。
缺点:需要大量的风险评估和文档分析,成本高,周期长。如果有未经发现的潜在风险,将造成巨大损失。
敏捷开发:敏捷开发是一种快速高效构建软件的方法,能应对需求变更,旨在以最短时间创造最高价值软件。通过冲刺以及设置一系列里程碑,高效迭代,提高效率。
优点:构件形式,灵活可变更。进度可控,客户满意度高。时间短,效率高。
缺点:适用中小型项目,成本高,缺乏文档,难以维护。人员多沟通效率极低。
二、可行性分析
问题的定义
明确任务以及问题的边界
可行性分析
从技术、经济、社会等方面分析研发的可行性,确定软件的特点、规模、应用、目标,明确约束和限制。回答了,是否能够开发,是否值得去开发的问题。
可行性分析的任务
确定可行性后,构建逻辑模型,选择恰当的技术手段
可行性分析具体操作
分析系统规模和任务目标
研究国内外研究现状,总结优劣
可行的基础上建立模型
初步确立技术方案
书写文档
系统流程图:描述系统结构的物理模型,是分析依据
组件图
UML中描述系统的各个组件,隐藏内部设计细节
三、需求分析
需求分析任务:确定要求、逻辑模型、需求文档
确定要求
功能需求:功能结构图、用例图
非功能需求:性能需求、接口列表、系统环境和界面
数据
逻辑模型
结构化分析:功能模型、数据模型、行为模型。
自顶向下逐步求精,抽象与分解,简单实用,不适用于大型项目。
功能模型:数据流图DFD、数据字典DD
数据模型:E-R图
行为模型:状态转换图
面向对象分析
功能模型:用例图
对象模型(总体设计):类图
动态模型(详细设计):时序图、活动图、状态机图
需求文档
编写文档
其他概念
需求分析的描述工具有哪些 ?
数据流图、数据字典、判定表、判定树、结构化自然语言、 层次方框图、Warnier图、 IPO 图和需求描述语言等。
数据流图:以图形化的方式表示系统逻辑、数据流向以及加工处理的过程。
数据字典:数据字典是对数据流图中的元素的定义集合。包括数据项、数据流、数据存储和加工处理。
E-R图:描述实体之间联系的图,包括实体、属性、联系三个内容,分别用长方形、椭圆、菱形表示。
四、总体设计
总体设计的任务
总体设计的任务是完成软件结构的设计 ,确定系统的模块及其模块之间的关系。
模块化思想
以系统的逻辑模型为基础,借助于一套标准的设计准则和图表等工具,逐层地将系统分解成多个大小适当、功能单一、 具备一定独立性的模块,把复杂的系统转换成易于实现、易于维护的模块化结构系统。
模块设计的准则:
(1) 高内聚,低耦合
(2) 大小适中 :大约 50 行语句的代码。
(3) 软件结构图的深度、 宽度、扇入和扇出要适当。 一般模块的调用个数不要超过 5 个。
(4) 尽量降低接口的复杂程度,尽量单入,单出。
(5) 模块的作用域应在控制域之内。
高内聚:工序通过 时间 逻辑检验,偶然成功了
低耦合:飞 鼠 特 控的外 公 内容耦合了
模块化优点
①结构清晰,容易设计也容易理解。
②容易测试,提高软件的可靠性。
③降低修改成本
④便于组织管理。
模块HIPO图
类图
+公有
- 私有
#保护
~包内可访问
五、详细设计
详细设计任务
编写软件的 “详细设计说明书 ”.软件人员要完成的工作 :
(1) 确定算法,写出模块的详细过程
(2) 确定数据结构 .
(3) 确定模块细节 ,包括接口、界面和数据
(4) 设计测试用例 ,在编码阶段进行预测试
基本原则
单入口、单出口
控制结构只有:顺序、选择、循环
结构流程图(盒图、N-S图)
问题分析图
活动图
序列图(顺序图)
六、编码
编码的任务
使用选定的程序设计语言,把模块的过程性描述翻译为程序设计语言书写的源程序
源程序要求:正确可靠、简明清晰、高效。
七、软件测试与维护
软件测试的一般步骤 ?
单元测试、子系统测试、系统测试、验收测试、平行测试。
单元测试
是指对软件中的最小可测试单元进行检查和验证。C语言中单元指一个函数,Java里单元指一个方法,一个类,图形化的软件中可以指一个窗口或一个菜单等
黑盒测试:等价类划分、边界值分析法、错误推测法、因果图。
对被测试系统的功能和接口进行测试,而不考虑内部实现细节。
在黑盒测试中,测试人员只关注系统的输入和输出,通过检查系统的响应和结果来验证其是否符合预期行为。
等价类划分:将输入类划分为有效等价类、无效等价类。选取其中一部分用于测试。
错误推测法
错误推测法是一种基于经验和直觉的测试用例设计方法,利用判定表或判定树为工具,旨在通过推测程序中可能存在的错误,有针对性地设计测试用例。
白盒测试:路径测试、事务处理、逻辑测试。
白盒测试的着眼点是内部,通常关注结构、逻辑、循环和路径,目的是发现程序编码过程中的错误。
路径测试
1、所有独立执行路径至少测试一次
2、逻辑判断的真假均测试一次
3、检查数据结构,确保有效性
4、测试循环边界
软件维护必要性
有一些错误在软件开发过程中难以察觉,并且随着用户需求和运行环境的变化软件也需要做出相应调整,软件的维护不可避免。
软件维护分类
改正性维护:满足性能与运行环境提高的要求
适应性维护:对程序使用期间发现的错误进行诊断和改正的过程
完善性维护:增加新的功能或修改已有功能
预防性维护:为了改善未来的可维护性或可靠性而修改软件的工作。
六、软件项目管理
软件工程管理内容
(1) 费用管理 : 对软件开发进行成本核算 ,使软件生产按照商品生产的规律办事。包括 :以简单、科学方法估算软件开发费用 ,作为签定开发合同的根据; 管理开发费用的有效使用 ,即用经济手段来保证产品如期按质完成。
(2) 质量管理 : 按项目的质量保证计划 ,确保各个开发阶段的开发和维护工作全
部按软件工程的规范进行 ,保证软件产品的质量。
(3) 配置管理 :通过对于程序、文档和数据的各种版本所进行的管理,保证资料
的完整性与一致性。
(4) 项目管理:制定《项目实施计划》,按照计划的内容组织和实施软件的工程
化生产。最终目标是以合理的费用和进度,圆满完成计划所规定的软件项目。
软件成本估算方法:自顶向下,自底向上
自顶向下估计 : 首先估算出项目总的开发成本,然后在项目内部进行成本分配。由少数专家参与, 依靠他们过去的经验, 将要开发的软件与过去开发过的软件进行 "类比 ",以估计新的软件开发所需要的工作量和成本。
自底向上估计 : 将开发任务分成若干子任务 ,子任务又分成子子任务 ,直到每一个单元内容足够明确为止;把各个任务单元的成本估计出来 ,汇合成项目的总成本。该方法得到的结果比较接近实际。
影响软件质量的主要因素
(1) 产品运行 :正确性、风险性、效率、完整性、健壮性和可用性;
(2) 产品修改 :可理解性、可维护性、灵活性、可测试性;
(3) 产品转移:可移植性、可重用性和互运行性。