一、软件工程
什么是软件?
程序、数据、文档
软件的分类?
按功能划分:系统软件、支撑软件、应用软件
软件的特点?
抽象、复杂、系统
软件危机
软件在研发、运行、管理过程中出现的一系列严重问题的现象。
是由于需求不清晰、项目开发没有明确规划和管理、程序设计和编码缺乏规范化和系统化、缺乏合适的工具支持
软件工程基本概念
工程、技术、管理
目的:高效,高质量,低成本开发软件产品
软件生命周期
从软件开始研发到停止使用,内容包括:问题的定义,可行性分析,需求分析,总体设计,详细设计,编码,测试,运行,维护
软件开发环境
在基本硬件和宿主软件的基础上,为支持系统软件和应用软件工程化开发和维护而使用的一组软件。
软件质量保证
软件质量保证是建立一套有计划,有系统的方法,来向管理层保证拟定出的标准、步骤、实践和方法能够正确地被所有项目所采用。
过程模型
瀑布模型 :瀑布模型是一种线性的,顺序的模型方法,每一个阶段任务依赖上层的任务质量和文档。
优点:结构清晰,容易理解控制
缺点:周期长,不灵活,难变更。
原型模型 :在任务开始之前,首先快速构建一个原型,以此与客户沟通,便于充分理解需求,适用于需求不清晰和有较多变化的项目。
优点:效率高,风险低,直观,可以得到客户反馈提高满意度。
缺点:原型的构建往往是高速的产物,意味着可能并不是最佳技术方案,很多细节上也没有过多顾及,后期难维护。
增量模型 :增量模型是将系统模块化,通过分析设计编码测试这些系统组件,逐步实现系统的完整性。
优点:灵活,低风险,进度可控,用户满意,人员配置灵活。
缺点:系统的整体性较差,要具备科学的,规范的开发管理方法,严格的测试和管理,以及小组成员间的充分交流沟通,使各模块正确衔接。
迭代模型 :迭代模型是一种逐步演绎,循序渐进的过程。首先完成程序的最基本功能,满足客户需求,其后再经过不断迭代,完善出整个产品。
优点:进度可控,需求明确,用户满意。
缺点:需要系统的规划和管理,并且与客户要做高频度的沟通。
螺旋模型:它基于螺旋的概念,螺旋的每一圈都代表一个完整的软件开发周期,每一轮都要作出分析并形成大量文档,可以很好地应对需求变化。
优点:灵活,可变更,适合大型复杂项目以及不确定性大的项目。
缺点:需要大量的风险评估和文档分析,成本高,周期长。如果有未经发现的潜在风险,将造成巨大损失。
敏捷开发 :敏捷开发是一种快速高效构建软件的方法,能应对需求变更,旨在以最短时间创造最高价值软件。通过冲刺以及设置一系列里程碑,高效迭代,提高效率。
优点:构件形式,灵活可变更。进度可控,客户满意度高。时间短,效率高。
缺点:适用中小型项目,成本高,缺乏文档,难以维护。人员多沟通效率极低。
DevOps :DevOps方法灵感基于敏捷开发,他进一步强调了团队合作的重要性,并鼓励跨团队交流,比如开发和运营之间。除此之外,他强调端到端的思想,也就是软件开发生命周期的自动化,尽量减少手动操作以引入错误。其次就是将重复任务和高频度任务的自动化,降低成本提升效率,提供了一系列软件开发支持工具,比如版本控制,配置管理,容器化技术等。他也强调以客户为中心,通过不断地反馈来优化开发流程。
优点:交付速度快,效率高,风险低。
缺点:对团队的全能性有要求,要同时懂开发,运营,测试的知识。其次就是涉及到的工具和技术的决策有学习成本。
二、可行性分析
问题的定义
明确任务以及问题的边界
可行性分析
从技术、经济、社会等方面分析研发的可行性,确定软件的特点、规模、应用、目标,明确约束和限制。回答了,是否能够开发,是否值得去开发的问题。
可行性分析的任务
确定可行性后,构建逻辑模型,选择恰当的技术手段
可行性分析具体操作
分析系统规模和任务目标
研究国内外研究现状,总结优劣
可行的基础上建立模型
初步确立技术方案
书写文档
系统流程图:描述系统结构的物理模型,是分析依据
组件图
UML中描述系统的各个组件,隐藏内部设计细节
三、需求分析
需求分析概念:
需求分析是软件开发和项目管理过程中的重要环节,核心在于需求明确和深入理解上,包括明确需求内容,形成需求文档,保证需求质量几个方面。
需求分析重要性:
需求分析至关重要,需求分析是否准确直接关系软件开发项目成败。通过需求分析可以降低项目风险,提高客户满意度,提高开发效率。
需求分析任务:确定要求、逻辑模型、需求文档
确定要求
功能需求:功能结构图、用例图
非功能需求:性能需求、接口列表、系统环境和界面
数据
逻辑模型
结构化分析:功能模型、数据模型、行为模型。
自顶向下逐步求精,抽象与分解,简单实用,不适用于大型项目。
功能模型:数据流图DFD、数据字典DD
数据模型:E-R图
行为模型:状态转换图
面向对象分析
功能模型:用例图
对象模型(总体设计):类图
动态模型(详细设计):时序图、活动图、状态机图
需求分析的描述工具有哪些 ?
数据流图、数据字典、判定表、判定树、结构化自然语言、 层次方框图、Warnier图、 IPO 图和需求描述语言等。
**数据流图DFD:**以图形化的方式表示系统逻辑、数据流向以及加工处理的过程。
**数据字典:**数据字典是对数据流图中的元素的定义集合。包括数据项、数据流、数据存储和加工处理。
UML图:
类图:描述类与类之间的关系的图。
用例图:描述系统的功能与外部实体的交互的图。
时序图:描述对象之间的动态交互,关注消息传递顺序。
部署图:描述系统的物理架构,关注硬件和软件组件的部署。
构件图:描述系统的软件组件结构,关注模块化和复用性。
活动图:描述系统的业务流程,关注活动的顺序和条件分支。
E-R图:描述实体之间联系的图,包括实体、属性、联系三个内容,分别用长方形、椭圆、菱形表示。
四、总体设计
软件设计:软件设计是指在软件开发过程中,根据用户需求,定义软件系统的架构、组件、接口和数据,以满足系统的功能、性能、可维护性等要求。它是连接需求分析和编码实现的桥梁。
总体设计的任务
总体设计的任务是完成软件结构的设计 ,确定系统的模块及其模块之间的关系。
软件体系结构基础概念
软件体系结构是软件系统的基本组织结构和设计框架,它定义了系统的组件、组件之间的关系、组件与环境之间的交互方式,以及设计原则和约束条件。
模块化思想
以系统的逻辑模型为基础,借助于一套标准的设计准则和图表等工具,逐层地将系统分解成多个大小适当、功能单一、 具备一定独立性的模块,把复杂的系统转换成易于实现、易于维护的模块化结构系统。
软件体系结构风格
常见的软件结构有:分层架构(controller控制层、dao数据访问层、service服务层,model类层)、C-S架构、微服务架构 等
微服务:将系统功能划分成一个个独立的微服务,他们之间具备独立性,可以单独部署,彼此间通过通信机制交互信息。
软件体系结构设计准则
(1) 高内聚,低耦合
(2) 大小适中 :大约 50 行语句的代码。
(3) 软件结构图的深度、 宽度、扇入和扇出 要适当。 一般模块的调用个数不要超过 5 个。
(4) 尽量降低接口的复杂程度,尽量单入,单出。
(5) 模块的作用域应在控制域之内。
**高内聚:**工序通过 时间 逻辑,偶然成功了
功能内聚:模块内部元素紧密相关,功能高度集中
顺序内聚:元素之间存在顺序依赖关系
通信内聚:元素之间通过数据联系。
过程内聚:元素之间存在逻辑顺序,但不一定紧密相关。
时间内聚:元素之间功能可能不相关,但需要在同一时间执行
逻辑内聚:元素之间通过逻辑条件联系,功能上不相关。
偶然内聚:模块内的元素之间没有明显联系,只是偶然组合在一起。
低耦合 :飞 鼠 特 控 外 公 内容 耦合了
非直接耦合:模块之间没有任何直接联系,完全独立。
数据耦合:模块之间只传递简单必要的数据,不涉及控制信息和复杂数据结构
特征耦合:模块之间传递的数据结构包含多余信息,且需要了解其数据结构
控制耦合:模块之间传递控制信息
外部耦合:模块的行为受外部环境的影响。
公共耦合:多个模块共享公共内存,联系复杂
内容耦合:一个模块直接访问或修改另一个模块的内部数据或代码

模块化优点
①结构清晰,容易设计也容易理解。
②容易测试,提高软件的可靠性。
③降低修改成本
④便于组织管理。
模块HIPO图
HIPO图是一种用于描述系统模块结构的工具,有助于清晰地展示系统的模块划分、模块之间的关系,以及每个模块的功能和数据处理流程。
HIPO图由两部分组成:层次结构图,IPO图(输入-处理-输出图)
五、详细设计
详细设计基本概念:详细设计是将总体设计中确定的系统架构和模块进一步细化,明确每个模块的内部结构、算法、数据结构和接口的细节,为编码实现提供详细的指导。
详细设计任务
编写软件的 "详细设计说明书 ".软件人员要完成的工作 :
(1) 确定算法,写出模块的详细过程
(2) 确定数据结构 .
(3) 确定模块细节 ,包括接口、界面和数据
(4) 设计测试用例 ,在编码阶段进行预测试
基本原则
单入口、单出口
控制结构只有:顺序、选择、循环
程序流程图:描述程序流程和数据流向的图,输入输出用平行四边形,处理用矩形,判断用菱形,起止用椭圆形。
结构流程图(盒图、N-S图):盒图是表示控制逻辑的图,正如它的名字一样盒图,用矩形表示,对于判断语句在其中用三角形分割,循环语句就用小矩形隔出一块,外部是循环条件,内部是循环体。
判定表 :以表格的形式将每个可能的条件列出
判定树:以树的结构呈现选择,每个节点是一个条件
软件设计模式
问题分析图
六、编码
编码的任务
使用选定的程序设计语言,把模块的过程性描述翻译为程序设计语言书写的源程序
源程序要求:正确可靠、简明清晰、高效。
面向对象分析与设计(OOAD) :
抽象:提取对象的本质特征,忽略无关细节。
封装:将数据和行为绑定在一起,隐藏内部实现。提高安全性、模块化和可维护性。
继承:子类继承父类的属性和方法,实现代码复用。
多态:同一个方法调用,根据对象类型执行不同的实现。提高灵活性和可扩展性。
面向对象与面向过程区别
七、软件测试与维护
软件测试基本概念:软件测试是通过一系列活动,来发现程序和系统中的问题,或评估实际结果与预期结果之间的差异,以验证软件是否满足规定的需求。目的在于发现缺陷,提高质量,降低风险。
软件测试的一般步骤 ?
单元测试、子系统测试、系统测试、验收测试、平行测试。
单元测试
是指对软件中的最小可测试单元进行检查和验证。C语言中单元指一个函数,Java里单元指一个方法,一个类,图形化的软件中可以指一个窗口或一个菜单等
黑盒测试 :等价类划分、边界值分析法、错误推测法、因果图。
对被测试系统的功能和接口进行测试,而不考虑内部实现细节。
在黑盒测试中,测试人员只关注系统的输入和输出,通过检查系统的响应和结果来验证其是否符合预期行为。
等价类划分:将输入类划分为有效等价类、无效等价类。选取其中一部分用于测试。
错误推测法
错误推测法是一种基于经验和直觉的测试用例设计方法,利用判定表或判定树为工具,旨在通过推测程序中可能存在的错误,有针对性地设计测试用例。
**白盒测试:**路径测试、事务处理、逻辑测试。
白盒测试的着眼点是内部,通常关注结构、逻辑、循环和路径,目的是发现程序编码过程中的错误。
语句覆盖 :所有独立执行路径至少测试一次
判定覆盖 :逻辑判断的真假均测试一次
条件覆盖 :每个条件的每种可能结果至少出现一次
判定条件覆盖 :每个判定的每种可能结果以及判定中的每个条件的每种可能结果都至少出现一次。
条件组合覆盖 :判定中每个条件的所有可能组合都至少出现一次
Alpha测试:Alpha测试是一种验收测试,模拟真实环境进行操作,发现问题。
软件维护必要性
有一些错误在软件开发过程中难以察觉,并且随着用户需求和运行环境的变化软件也需要做出相应调整,软件的维护不可避免。
软件维护分类
改正性维护:满足性能与运行环境提高的要求
适应性维护:对程序使用期间发现的错误进行诊断和改正的过程
完善性维护:增加新的功能或修改已有功能
预防性维护:为了改善未来的可维护性或可靠性而修改软件的工作。
六、软件项目管理
软件工程管理基本概念 :
软件工程管理是指在软件开发过程中,通过系统化的方法、工具和流程,对人员、资源、进度和质量进行有效管理,以实现软件项目的成功交付。
按时交付:确保项目在预定时间内完成。
控制成本:在预算范围内完成项目。
保证质量:交付满足用户需求的软件产品。
管理风险:识别并降低项目风险。
软件估算模型 :软件估算模型是用于预测软件开发成本的数学模型,它基于历史数据、经验公式或统计分析,帮助项目管理人员在项目初期对软件开发的成本有一个大致的了解。
功能点估算模型:通过统计软件的功能点数量来估算成本。功能点是衡量软件规模和复杂性的一个指标,通常基于软件的输入、输出、查询、文件等要素进行计算。
代码行估算模型:通过统计或预测软件代码的行数来估算成本。这种模型假设代码行数与开发工作量成正比,但需要注意的是,代码行数可能受到编程风格、代码复用等因素的影响。
基本COCOMO模型:是一个静态单变量模型,主要关注项目规模和工作量,不考虑成本驱动因素。
中间COCOMO模型:在基本模型的基础上,考虑了产品、平台、人员、项目等方面的成本驱动因素,通过工作量调节因子(EAF)修正对工作量的估算。
详细COCOMO模型:适用于大型项目,考虑了更多的项目因素,如技术难度、团队经验等,提供了更精确的估算结果。
Putnam模型:由Putnam在1978年提出,是一种动态多变量模型。它考虑了软件开发过程中的多种因素,如生产率、项目规模、开发时间等,通过数学公式进行量化计算。
项目进度安排 :涉及对项目任务、资源、时间等进行全面规划和协调,以确保项目能够按时、按质、按量完成。
制定项目时间表,设定里程碑,制定风险管理计划,建立沟通机制
CMM :软件能力成熟度模型,用于评估并提升其软件开发过程的成熟度,从而提高软件质量、增强竞争力和降低开发成本。
CMM将软件开发过程的成熟度划分为五个等级:初始级、可重复级、已定义级、已管理级和优化级。
每个等级都代表了组织在软件开发和管理方面的能力水平,并有相应的关键过程和关键实践。
RUP:RUP则提供了一种结构化的软件开发方法,通过明确角色和责任、流程的迭代开发,帮助团队快速适应变化,早期识别风险,改善沟通和保持与客户需求的一致性。
软件工程管理内容
(1) 费用管理 : 对软件开发进行成本核算 ,使软件生产按照商品生产的规律办事。包括 :以简单、科学方法估算软件开发费用 ,作为签定开发合同的根据; 管理开发费用的有效使用 ,即用经济手段来保证产品如期按质完成。
(2) 质量管理 : 按项目的质量保证计划 ,确保各个开发阶段的开发和维护工作全
部按软件工程的规范进行 ,保证软件产品的质量。
(3) 配置管理 :通过对于程序、文档和数据的各种版本所进行的管理,保证资料
的完整性与一致性。
(4) 项目管理:制定《项目实施计划》,按照计划的内容组织和实施软件的工程
化生产。最终目标是以合理的费用和进度,圆满完成计划所规定的软件项目。
软件成本估算方法:自顶向下,自底向上
自顶向下估计 : 首先估算出项目总的开发成本,然后在项目内部进行成本分配。由少数专家参与, 依靠他们过去的经验, 将要开发的软件与过去开发过的软件进行 "类比 ",以估计新的软件开发所需要的工作量和成本。
自底向上估计 : 将开发任务分成若干子任务 ,子任务又分成子子任务 ,直到每一个单元内容足够明确为止;把各个任务单元的成本估计出来 ,汇合成项目的总成本。该方法得到的结果比较接近实际。
影响软件质量的主要因素
(1) 产品运行 :正确性、风险性、效率、完整性、健壮性和可用性;
(2) 产品修改 :可理解性、可维护性、灵活性、可测试性;
(3) 产品转移:可移植性、可重用性和互运行性。
重点图汇总(未完待续)
