这是本人语雀文章链接原版在此:https://www.yuque.com/docs/share/9716de18-210b-422b-a32e-088209cbfbee《《软件工程导论》笔记》
复习提醒:紫色字体代表必背,红色字体代表是复习重点,80%考察,蓝色字体代表40%考察,粉红色是常识题;

第一章–软件工程学概述
本章目标:
了解软件的概念、特点及主要分类
了解软件危机的产生原因及其表现
掌握软件工程的概念,以及软件工程的基本原则
了解软件开发的方法了解与软件开发项目相关的常用工具
软件的概念及特点
软件=程序+相关文档。
概念:计算机软件是由专业人员开发并长期维护的软件产品。完整的软件产品包括了在各种不同容量和体系结构计算机上的可执行的程序,运行过程中产生的各种结果,以及以硬复制和电子表格等多种方式存在的软件文档
特点:
1)具有抽象性
2)无明显的制造过程
3)存在退化问题
4)对计算机系统有着不同程度的依赖性
5)尚未完全摆脱人工的开发方式
6)软件本身是复杂的
7)成本相当昂贵
8)相当多的软件工作涉及 会因素
软件危机:计算机软件开发维护过程中所遇到的一系列严重的问题。
软件危机的典型表现:
1.对软件开发的成本和进度的估计常常很不准确。
2.用户对以完成的软件系统不满意的现象经常发生。
3.软件产品的质量靠不住。
4.软件常常不可维护。
5.软件常常没有适当的文档资料。
6.软件成本在计算机系统总成本所占比例逐年上升。
7.软件开发生产率提高的速度,远远跟不上计算机应用迅速普及深入的趋势。
软件危机的主要原因有:
(1)软件日益庞大和复杂
(2)软件开发复杂和管理困难
(3)软件开发技术落后
(4)开发工具落后
(5)生产方式落后
(6)软件开发费用不断增加
根本原因:人们对软件产品认识的不足以及对软件开发的内在规律理解的偏差;
消除途径:
①应该对计算机软件有一个正确的认识;
②应该充分认识到软件开发是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目;
③研究探索更好的管理措施和技术措施两个方面解决软件危机;
④应该开发和使用更好的软件工具。
启示:使我们更加深刻的认识到软件的特性以及软件产品开发的内在规律。
软件产品是复杂的人造系统,具有复杂性、不可见性和易变性,难以处理。
个人或小组在开发小型软件时使用到的非常有效的编程技术和过程,在开发大型、复杂系统时难以发挥同样的作用。
从本质上讲,软件开发的创造性成分很大、发挥的余地也很大,很接近于艺术。它介于艺术与工程之间的某一点,并逐步向工程一段漂移,但很难发展到完全的工程。
软件工程
软件工程是指导计算机软件开发和维护的一门工程学科
软件工程的本质特性:
1.软件工程关注于大型程序的构造,
2.软件工程的中心课题是控制复杂度;
3.软件经常变化;
4.开发软件效率非常重要;
5.和谐地合作是开发软件的关键;
6.软件必须有效地支持它的用户;
7.在软件工程领域中通常由具有一种文化背景的人替具有另一种文化背景的人创造产品;
软件工程方法学:
包括传统方法学和面向对象方法学;
传统方法学也称为生命周期方法学或结构化范型。
它采用结构化技术(结构化分析、结构化设计和结构化实现)来完成软件开发的各项任务,并使用适当的软件工具或软件工程环境来支持结构化技术的运用。 这种方法学把软件生命周期的全过程依次划分为若干个阶段,然后顺序地完成每个阶段的任务。问题简单化、便于阶段性审查、有一定应用、便于区别面向对象方法
传统方法学强调自顶向下地完成软件开发的各阶段任务;
面向对象方法学开发软件是一个主动多次反复迭代的演化过程;
面向对象方法学具有下述4个要点:
(1) 把对象作为融合了数据及在数据上的操作行为的统一的软件构件。
(2) 把所有对象都划分成类。
(3) 按照父类与子类的关系,把若干个相关类组成一个层次结构的系统。
(4) 对象彼此间仅能通过发送消息互相联系。
软件生生命周期:(阶段(细讲))
一个软件产品从定义、开发、维护到废弃的时间总和称为软件的生命周期。
软件生命周期每个阶段的基本任务:
1.问题定义:软件定义阶段:该阶段需要回答的问题是”需要软件解决的问题是什么
2.可行性研究:提交” 可行性研究 告 “
3.需求分析:确定目标系统必须具备 那些功能
4.总体设计
5.详细设计
6.编码和单元测试:
7.综合测试
8.软件维护
软件维护维护阶段的关键任务是,通过各种必要的维护活动使系统持久地满足用户的需要。
通常有4类维护活动:
改正性维护,也就是诊断和改正在使用过程中发现的软件错误;
适应性维护,即修改软件以适应环境的变化;
完善性维护,即根据用户的要求改进或扩充软件使它更完善;
预防性维护,即修改软件为将来的维护活动预先做准备。
瀑布模型:

特点:
- 阶段间具有顺序性和依赖性
①必须等前一阶段的工作完成之后,才能开始后一阶段的工作;
②前一阶段的输出文档就是后一阶段的输入文档 - 推迟实现的观点;
优点:
1.为项目提供了阶段划分的检查点。
2.当前一阶段完成后,只需要关注后续阶段。
3.可在迭代模型中应用瀑布模型。
缺点:
1.在项目各阶段之间极少有反馈。
2.只有在项目生命周期的后期才能看到结果。
3.通过过多强制完成日期和里程碑来跟踪各个项目阶段。
快速原型模型:
快速原型的基本思想是快速建立一个能反映用户主要需求的原型系统
**增量模型:(瀑布模型+快速原型模型)**特点就是将待开发的软件系统模块化和组件化

螺旋模型:每个阶段之前都增加了风险分析过程,(瀑布模型与快速原型模型)。

喷泉模型:面向对象的软件过程模型之一。

**基于组件的开发模型:**基于组件的开发模型充分的体现了软件复用的思想,降低了开发成本和风险,并加快了产品开发;

RUP(统一软件开发过程模型)软件开发模型

简述四个阶段的工作目标:
初始阶段:为系统建立业务模型并确定项目的边界;
细化阶段:建立工程计划和合理的体系结构;
构建阶段:开发所有剩余的构建和应用程序功能,把这些构建集成为产品,并进行详细测试;
移交阶段:把开发的产品移交给用户使用
最佳实践:
1、基于UML
2、面向对象
3、迭代和增量递进的开发策略
4、用例驱动、架构优先
敏捷过程:
概念:
1.个体和交互胜过过程和工具;
2.可以工作的软件胜过面面俱到的文档;
3.客户合作胜过合同谈判;
4.响应变化胜过遵循计划;
第二章可行性研究
重点: 可行性的几个方面及 告;
数据流图、成本效益分析;
从哪几个方面开始研究各种解法的可行性/h3>
1.技术可行性,使用现有的技术能够实现这个系统吗br> 2.经济可行性 :这个系统的经济效益能超过它的开发成本吗br> 3.操作可行性,系统的操作方式在这个用户组织内行的通吗/p>
描绘系统时使用基本符 即可:

数据流图(分层)
概念:数据流图是一种图形化技术,它描绘信息流和数据从输入移动到输出的过程中所经受的变换.
命名:
为数据流命名;
为处理命名;

数据流图的符 图:

PS:重点结构化分析方法、需求过程
定义:需求分析是软件定义时期的最后一个阶段,基本任务是准确回答系统具体做什么,确认系统必须完成那些工作,对目标系统提出完整,准确,清晰,具体的要求。
访谈有两种基本形式,正式访谈和非正式访谈;
对软件系统的要求:
逆向需求:
逆向需求说明软件系统不应该做什么;理论上有无数个逆向需求,人们应该选取能澄清真实需求且不存在误解的需求;
例如:”力分析程序无需分析桥梁倒塌数据;
需求分析的任务:
1.确定对系统的综合要求;
2.分析系统的数据要求;
3.导出系统的逻辑模型;
4.修正系统开发计划;
实体-联系图(ER图)的符 :

图3.2为课本的ER图

数据规范化:
范式:定义消除数据的冗余程度。
从实用角度来说,多数场合使用第三范式;
第一范式:每个属性值都必须是原子值,即仅仅是一个简单值而不含有内部结构;
第二范式:满足第一范式条件,而且每个非关键字属性都由整个关键字决定;
第三范式:符合第二范式的条件,每个非关键字属性都由整个关键字决定,而且一个非关键字属性不能仅仅是对另一个非关键字属性进行进一步的描述;
状态转化图:
在状态图中,初态用实心圆表示,终态用一对同心圆(内圆为实心圆)表示。中间状态用圆角矩形表示,可以用两条水平横线把它分成上、中、下3个部分。上面部分为状态的名称,这部分是必须有的;中间部分为状态变量的名字和值,这部分是可选的;下面部分是活动表,这部分也是可选的。
活动表的语法格式如下:
事件名(参数表)/动作表达式其中,“事件名”可以是任何事件的名称。在活动表中经常使用下述3种标准事件:entry,exit和 do。entry事件指定进入该状态的动作,exit事件指定退出该状态的动作,而do事件则指定在该状态下的动作。需要时可以为事件指定参数表。活动表中的动作表达式描术应做的具体动作


第五章总体设计
概念:需求分析,回答了软件系统能“做什么”的问题
软件设计,回答“怎么做”才能实现软件系统的问题
总体设计包括:
系统设计阶段,(确定系统的具体实施方案)
结构设计阶段(确定软件结构)

从工程管理角度来看,软件设计分两步完成:概要设计和详细设计。
概要设计:将软件需求转化为软件体系结构 ,确定系统级接口, 全局数据结构或数据库模式。
详细设计:确立每个模块的实现算法和局部数据结构 ,用适当方法表示算法和数据结构的细节。
设计原理(简答):
1.模块化
2.抽象(自顶向下由抽象到具体的分配方式控制)
3.逐步求精
4.信息隐藏和局部化
5.模块独立(低耦合,高内聚)
耦合:是模块间互相连接的紧密程度的度量,它取决于各个模块之间接口的复杂度、调用方式以及哪些信息通过接口;
在软件设计中应该追求可能松散的耦合的系统;
启发规则:
1.改进软件结构提高模块化独立性;
2.模块规模应该适中;
3.深度,宽度,扇入,扇出都应适当;
深度(软件结构中控制的层数)、宽度(软件结构中同一层次的模块总数的最大值)、扇出(一个模块直接控制或调用的模块的数目,一般3-4,上限5-9)和扇入(有多少个上级模块调用它。)都应适当
4.模块的作用域应该在控制域内;
5.力争降低接口的复杂程度;
6.设计单入口单出口模块;
7.模块功能应该可以预测;
模块之间耦合性越强,功能独立性越差,这样形成的模块结构界面不好。
非直接耦合(Nondirect Coupling):
两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的。 非直接耦合的模块独立性最强。
内容耦合 (Content Coupling)
如果发生下列情形,模块之间就是内容耦合:
一个模块直接访问另一个模块的内部数据;
一个模块不通过正常入口转到另一模块内部;
两个模块有一部分程序代码重迭(只可能出现在汇编语言中);
一个模块有多个入口。
内聚性:内聚是一个模块内部各个元素彼此结合的紧密程度的度量。
模块内聚性越强,功能独立性越好,对于形成的模块结构有比较好的作用。 要求模块结构达到高内聚,低耦合。
描绘软件结构的图形工具:描述软件结构在常用工具是结构图和层次图。
层次图和HIPO图:
层次图用来描绘软件的层次结构。在图5.2 中已经非正式地使用了层次图。虽然层次图 的形式和第3.7节中介绍的描绘数据结构的 层次方框图相同,但是表现的内容却完全不 同。
方框间的连线表示调用关系而不像层次方框 图那样表示组成关系。层次图中的一个矩形框代表一个模块,最顶层的方 框代表正文加工系统的主控模块,它调用下 层模块完成正文加工的全部功能;第二层的 每个模块控制完成正文加工的一个主要功能.
HIPO图HIPO图具有可追踪性,在H图(层次图)里除了 最顶层的方框之外,每个方 框都加了编 。
结构图
结构图和层次图类似,也 是描绘软件结构的图形工具,图中一个方框 代表一个模块,框内注明模块的名字或主要 功能;方框之间的箭头(或直线)表示模块的 调用关系。尾部是空心圆表示传递的是数 据,实心圆表示传递的是控制信息。
面向数据流的设计方法:
把信息流映射为软件结构,信息流的类型决定了映射方法。
信息流分为变换流和事务流;
设计分析方法分为变换分析和事务分析;
考试题:
层次图和结构图是描述软件的常用工具
第六章 详细设计
结构程序设计
概念:“如果一个程序的代码块仅仅通过顺序、选择和循环这3种基本控制结构进行连接,并且每个代码块只有一个入口和一个出口,则称这个程序是结构化的。
详细设计的任务:
为每个模块确定采用的算法,选择某种合适的工具表达算法的过程,写出模块的详细过程性描述,
确定每一模块使用的数据结构。确定模块接口的细节,包括对系统外部的接口和用户界面,对系统内部其他模块的接口以及模块输入数据。为每一个模块设计出一组测试用例。
/p>
/p>
人机界面设计:系统的响应时间:有两个重要的属性,长度和易变度。
/h2>
程序复杂度的定量度量
McCabe方法
使用万能公式判断流图G的环形复杂度V(G)=P+1,其中,P是流图中判定结点的数目。
(2)流图G的环形复杂度V(G)=E一N十2或者V(G) = P +1 ,其中,E是流图中边的条数,N是点数,其中P为判定节点数在流图中出度 大于等于2的结点,即为判定节点;
下图的环形复杂度为V(G)=11-9+2 =4 或者V(G) = 3 + 1 = 4

/p>
/p>
/p>
/p>
/p>
过程设计的 工具
描述程序处理过程的工具 称为过程设计的工具,它们可以分为图形 、表格和语言3类。
程序流程图:又称为程序框图,它是历史最悠 久、使用最广泛的描述过程设计的方法,然 而它也是用得最混乱的一种方法。
程序流程图中用箭头代表控制流,程序流程图不易表示数据结构。
盒图:N-S图
出于要有一种不允许违背结构程序设计精神的图形工具的考虑,Nassi和Shneiderman 提出了盒图,又称为N-S图。
特点:
(1)功能域(一个特定控制结构的作用域 )明确,可以从盒图上一眼就看出来。
(2)不可能任意转移控制。
(3)很容易确定局部和全程数据的作用域。
(4)很容易表现嵌套关系,也可以表示模块 的层次结构。
ackson方法和Warnier方法是最著名的两个面向数据结构的设计方法,层次图表现的是调用关系,而Jackson图表现的是组成关系。
程序复杂程度的定量度量:McCabe方法,Halstead方法,
第七章 实现
业务应用编程语言是 Java
前端编程语言 JS / TS
云计算编程语言 GoAI
热门编程语言 Python / C艹
Web 建站编程语言 PHP
大数据应用编程语言 Scala
区块链新宠编程语言 RustAndroid
应用开发语言 Java / KotliniOS
应用开发语言 ObjC / Swift
实现:通常把编码和测试统称为实现;
软件测试的基本概念
软件测试是发现软件中错误和缺陷的主要手段。
软件缺陷的产生是不可避免的,软件测试的工作是必需的。
在软件开发过程的任何阶段都可能引入缺陷。
缺陷被引入的阶段越早,在软件开发的后期修复这些缺陷带来的成本损失就越大。软件测试工作应该贯穿于整个开发过程。
V模型

W模型

H模型:

单元测试
那些方面进行测试br> 1.模块接口;
2.局部数据结构;
3.重要的执行通路;
4.出错处理通路;
5.边界条件;
集成测试:
自顶向下集成:深度优先,宽度优先,辅助模式;
自底向上集成:三明治策略;
回归测试:
是指重新执行已经做过测试的某个子集,以保证上述这些变化没有带来非预期的副作用;
/p>
回溯法和回归测试作比较
回溯是一种调试方法,而回归是一种测试方法;
回溯与回归的对比还是要归结于调试与测试的区别:
测试是为了发现程序中的错误;
调试是在测试发现错误之后找出错误,排除错误的过程.
/p>
Alpha测试由用户在开发者的场合所进行,并且在开发者对用户的指导下进行测试活动;
Beta测试由软件的最终用户们在一个或者多个客户场所进行;
/p>
黑盒测试:功能测试,如果已经知道了产品应该具有的功能,可以通过测试来检验是否每个功能都能正常使用;
分析方法:
等价划分
边界值分析
错误推测
白盒测试:结构测试,如果知道产品的内部工作过程,可以通过测试来检验产品内部动作是否按照规格说明书的规定正常进行。
Alpha和Beta测试:
【Alpha测试】由用户在开发者的场所进行, 并且在开发者对用户的“指导”下进行测试。开发者负责记录发现的错误和使用中遇到的问题。总之,Alpha测试是在受控的环境中进行的。
【Beta测试】由软件的最终用户们在一个或多个客户场所进行。与Alpha测试不同,开发者通常不在Beta测试的现场,因此,Beta 测试是软件在开发者不能控制的环境中的“真实”应用。
软件可靠性:
软件可靠性是程序在给定的时间间隔内,按照规格说明书的规定成功运行的概率;
第八章维护
软件维护的基本概念
软件维护:就是在软件已经交付使用之后,为了改正错误或满足新的需求而修改软件的过程。
四种维护类型:
改正性维护
适应性维护
完善性维护
预防性维护
第九章 面向对象方法学导论
面向对象 = 对象 + 分类 + 继承 + 消息通信
面向对象即使用对象又使用类和继承等机制,而且对象直接仅能通过传递消息实现彼此通信,
面向对象方法学的优点:
与人类习惯的思维方法一致。
稳定性好。
可重用性好。
较易开发软件产品。
可维护性好。
面向对象的概念:
对象:
对问题域中某个实体的抽象,设立某个对象就表示系统具有保存有关它的信息与它进行的交互能力。特点:以数据为中心,对象是主动的,实现了数据的封装,本质上有并行性,模块独立性好。
特点:
1.以数据为中心;
2.对象是主动的;
3.实现了数据封装;
4.本质上具有并行性;
5.模块独立性好;
其他概念:
类:具有相同数据和数据操作的一组相似对象的抽象。
实例:由某个实例的类所描述的一个具体的对象。
消息:要求某个对象执行在定义它的那个类中所定义的某个操作的规格说明,接收消息的对象,消息选择符,零个或多个变元。
方法:对象所能执行的所有操作,就是类中所定义的服务。
属性:类中所定义的数据,即对客观世界所具有的性质的抽象。
封装:有清晰的边界,有确定的接口(协议),受保护的内部实现,
继承:直接获得已有的性质和特性。
多态性:在类等级的不同层次中可以共享一个行为的名字。
重载:是指一个类中有多个同名的方法,但在操作数个数或类型上有区别;
第十章面向对象分析:
3种形式的模型:
第一是描述系统数据结构 的对象模型(UML类图),

第二是描述系统控制结构的动态模型(状态转化图);
第三是描述系统功能的功能模型(用例图)。

对象模型::表示静态的、结构化的系统的“数 据”性质。 它是对模拟客观世界实体的对象以及对象彼 此间的关系的映射,描述了系统的静态结构。
类与类之间通常有关联、泛化(继承)、依赖和 细化等4种关系。
第11章面向对象分析
系统分解

第十三章
软件配置管理是在软件的整个生命期内管理变化的一组活动。
具体地说,这组活动用来:
(1)标识变化。
(2)控制变化。
(3)确保适当地实现了变化。
(4)向需要知道这类信息的人 告变化。
/p>
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!