软件=程序+数据+文档
在计算机软件开发和维护过程中所遇到的一系列严重问题。
如何开发软件,以满足对软件日益增长的需求
如何维护数量不断膨胀的已有软件
对软件开发成本和进度估算不准确
用户对已完成软件不满意
软件质量不可靠
软件不可维护
没有适当文档资料
软件成本在计算机系统中所占比例逐年上升
软件开发生产率低
估不准、不满意、靠不住、难维护、缺文档、成本高、需求大
软件工程是指导计算机软件开发和维护的一门工程学科。采用工程的概念、原理
技术、和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前
能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维
护它,这就是软件工程。
软件工程是从管理和技术两方面研究如何更好地开发和维护软件的一门学科。
分阶段、坚评审、严品控、用现技、果清查、少而精、要改进
把在软件生命周期全过程中使用的一整套技术方法的集合称为方法学,也称为泛型。
软件工程方法学包括三个要素:方法、工具和过程。
◆采用结构化技术完成软件开发各项任务
◆把软件生命周期的全过程依次划分为若干阶段
◆每个阶段开始和结束有严格标准
◆每个阶段结束后进行严格审查
◆把对象作为融合了数据及在数据上的操作行为的统一的软件构件
◆把所有对象划分为类
◆按照父类与子类关系,把若干类组成层次结构的系统
◆对象彼此间仅能通过发送消息互相联系
把软件的开发分成软件定义、软件开发、运行维护三个时期。一个软件从立项起,到废弃不用,统称为软件生命周期。
各时期文档
推迟编码的实现(提前逻辑设计); 瀑布模型是文档驱动的模型
1、瀑布模型的优点(强迫开发人员使用规范的方法,严格规定了每个阶段必须提交的文档,要求每个阶段)
可以强迫开发人员采用规范的方法:
严格规定了每个阶段必须提交的文档;
每个阶段的开发质量得到保障。
在软件开发的初期阶段就要求做出正确、全面完整的需求分析。
**(不适应需求的变化)**在需求分析阶段,当需求确定后,无法及时验证需求是否正确、完整。
**(开发风险大)**以整体开发的瀑布模型,由于不支持产品的演化,缺乏灵活性,对开发过程中很难发现的错误,只有在最终产品运行时才能暴露出来,从而使软件产品难以维护。(由于开发模型是线性的,用户只有等到整个过程的末期才能见到开发成果,从而增加了开发风险。)
(开发周期长)用户可能需要较长等待时间来获得一个可供使用的系统,
实际的瀑布模型是带"反馈环"的。如图所示(图中实线箭头表示开发过程,虚线箭头表示维护过程),当在后面阶段发现前面阶段的错误时,需要沿图中左侧的反馈线返回前面的阶段,修正前面阶段的产品后再回来继续完成后面阶段的任务
快速建立可运行的程序,它完成的功能往往是最终产品功能的一个子集。
快速原型模型不带反馈环,软件产品的开发基本上是线性顺序进行的
一旦需求确定了,原型将被抛弃
若原型未满足需求说明的要求,说明对需求说明存在不一致的理解或实现方案不够合理,根据明确的要求迅速修改原型
原型系统已经得到用户验证。
产品质量低
快速建立起来的系统结构加上连续的修改可能会导致产品质量低下
限制开发人员创新
用前提是要有一个展示性的产品原型,一定程度上可能会限制开发人员的创新
把软件产品分解成增量构件时,唯一必须遵守的约束条件是,当把新构件集成到现有构件中时,所形成的产品必须是可测试的
瀑布模型或快速原型模型目标是一次就把一个满足所有需求的产品提交给用户
增量模型把整个软件产品分解成许多个增量构件,分批地逐步向用户提交产品,把瀑布模型的顺序特征与快速原型法的迭代特征相结合
在每个阶段之前都增加了风险分析过程的快速原型模型。看作增加了风险分析的快速原型模型。
靠风险驱动
典型的面向对象软件过程模型。体现迭代和无缝的特性。
以用户需求为动力,以对象为驱动的模型,
图中代表不同阶段的圆圈相互重叠,这说明表示两个活动之间存在交迭;而面向对象的方法在概念和表示方式上的一致性,保证了在各项开发活动之间的无缝过渡
事实上,用面向对象方法开发软件时,在分析、设计和编码等项开发活动之间并不存在明显的边界。
图中较小的圆圈代表维护,圆圈较小象征着采用了面向对象范型之后维护时间缩短了。
该模型的各个阶段没有明显的界限,开发人员可以同步进行开发。其优点是
可以提高软件项目开发效率,节省开发时间,适应于面向对象的软件开发过程。
由于喷泉模型在各个开发阶段是重叠的,因此在开发过程中需要大量的开发人员,因此
不利于项目的管理。此外这种模型要求严格管理文档,使得审核的难度加大,尤其是面对可
能随时加入各种信息、需求与资料的情况。
可行性研究实质上是要进行一次大大压缩化简了的系统分析和设计过程,也就是在较高层次上以抽象的方式进行的系统分析和设计的过程。
用最小的代价在尽可能短的时间内(5%-- 10% )确定问题能否被解决。(这楼到底能不能盖)
1.技术可行性
使用现有的技术能实现这个系统吗?
2.经济可行性
这个系统的经济效益能超过它的开发成本吗?
3.操作可行性
系统的操作方式在这个用户组织内行得通吗?
4.社会可行性
会不会违背道德、伦理、法律?
(不要求会画)
要求会画
是关于数据的信息集合,即对数据流图中包含的所有元素定义的集合。
数据流、数据流分量(数据元素)、数据存储、处理。
由数据元素组成数居的方式:顺序、选择、重复、可选
符号表示:= + [ ] { } ( )
等价 连接 选一 重复 可选
北京某高校可用的电话号码有以下几类:校内电话号码由4位数字组成,第一位数字不是0。校外电话又分为本市电话和外地电话两类。拨校外电话需要先拨0,若是本市电话则接着拨8位数字(第一位不是0),若是外地电话则拨3位区码后再拨8位电话号码(第一位不是0)。
从经济角度分祈新系统的开发是否能盈利,帮助使用部门正确故出是否投资的决定。
软件成本三每行代码的平均成本 * 源代码行数
按开发阶段将系统划分成任务
每个任务的成本 =人力*人平均工资
软件成本= ∑ 独立任务的成本 (求和)
1.估计开发成本、运行费用和新系统带来的经济效益。
2.比较新系统的开发成本和经济效益。
**1.货币的时间价值F=P(1+i) ** 重要
2.投资回收期
3.纯收入
4.投资回收率
需求内容:
1.功能需求
2.性能需求
3.可靠性需求(与可用性区分)
4.出错处理需求
5.接口需求
6.约束
7.逆向需求〔系统不该做什么)
8.未来可能提出的要求
速记:功性靠出口
访谈
面向数据流自顶向下求精
简易的应用规格说明技术
快速建立软件原型
数据模型(实体-联系图 E_R):描绘数据对象及数据对象之间的关系。
功能模型(数据流图):描绘数据在系统中流动时被处理的逻辑过程,指明系统具有的变换数据的功能。
行为模型:(状态转换图):描绘系统的各种行为模式在不同状态间转换的方式。
要求会画
一致性:所有需求必须是一致的,任何一条需求不能和其他需求互相矛盾。
完整性:需求必须是完整的,规格说明书应该包括用户需要的每一个功能或性能。
现实性:指定的需求应该能用现有的硬件和软件技术可以实现。
有效性:必须证明需求是正确有效的,确实能解决用户面对的问题。
PSL/PSA问题陈述语言/问题陈述分析程序)系统**
设计过程包括系统设计阶段和结构设计阶段
模块:能够单独命名,由边界元素限定的程序元素的序列,是构成程序的基本构件。
模块化:把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求。
抽出事务的本质特性而暂时不考虑它们的细节。
逐步揭露出底层细节。Ailler法则:注意力集中在(7±2)上
信息隐藏:指一个模块内包含的信息对于不需要这些信息的模块来说,是不能访问的。主要是指模块的实现细节。
局部化:指把一些关系密切的软件元素物理地放得彼此靠近,它有助于实现信息隐藏。
模块独立性:是模块化、抽象、信息隐蔽和局部化概念的直接结果。
模块独立是好设计的关键,设计是决定软件质量的关键环节。
度量标准:耦合、内聚
是对一个软件结构内不周模块之间互连程序的度量。
耦合强度取决于模块接口的复杂程度、通过接口的数据等
耦合性越高,模块独立性越弱。
无直接耦合=》数据耦合=》标记耦合(特征耦合)=》控制耦合=》外部耦合=》公共耦合
是用来度量一模块内部各个元素彼此结合的紧密程度的。
偶然内聚=》逻辑内聚=》时间内聚=》过程内聚=》通信内聚=》顺序内聚=》功能内聚
同其它模块强耦合的模块意味着弱内聚;强内野模块意味着与其它模块间松散耦合
软件设计目标高内聚、低耦合
改进软件结构提高模块独立性
·模块规模应该适中
·深度、宽度、扇入和扇出应适当
深度:表示软件结构中控制的层数。
宽度:软件结构内同一个层次上的模块总数的最大值。
扇出:一个模块直接控制(调用)的模块数目,扇出过大意味着模块过分复杂。一般一个设计的好的典型系统的平均扇出是3或4,扇出的上限是5到9.
扇入:指有多少上级模块调用它,扇入大说明上级模块共享该模块的数目多。
好的软件结构顶层扇出比较高,中层扇出比较少,底层扇入到公共的实用模块中,即底层模块有高扇入。
模块的作用域应该在控制域之内
作用域:指受该模块内一个判定影响的所有模块的集合。
控制域:是这个模块本身以及所有直接或间接从属于它的模块的集合。
力争降低模块接口的复杂程度
设计单入口单出口的模块
·模块功能应该可以预测
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UjsWicrM-1668871871530)(C:\Users\User\AppData\Roaming\Typora\typora-user-images\image-20221118212951775.png)]
确定怎样具体地实现所要求的系统。得出对目标的精确描述。
只用三种基本的控制结构就能实现任何单入口单出口的程序。
选择结构(a)、顺序结构b)、循环结构©
常见问题:
1、系统响应时间 (重要属性:长度(响应时间)和易变性)
2、用户帮助设施
3、出错信息处理
4、命令交互
程序流程图
盒图
PAD图
判定表/树
过程设计语言(伪码PDL)
过程复杂度的度量
软件生命周期中的编码和测试统称为实现。
产出文档:编码产生《程序清单》
软件测试是为了发现错误而执行程序的过程。
编码阶段(单元测试)
测试阶段(各种综贪测试)
(1)所有测试都应该能追溯到用户需求。
(2)应该远在测试之前就制定测试计划。
(3)Pareto原理:80%的错误是由20%的模块造成的。
(4)应该从“小规模”测试开始,并逐步进行大规模测试。
(5)穷举测试是不可能的;测试只能证明程序有错误,但不能证明程序无错误。
(6)为了尽最大可能的发现错误,应该由独立的第三方担任测试工作。
将软件看作一个黑盒子,不考虑其内部结构和处理过程,只按照规格说明书的规定
测试软件是否能够正确接收输入数据,产生正确的输出数据。即测试程序是否正确
的实现了其功能。又称为“功能测试”。
完全知道程序的内部结构和处理算法,因此可以将程序看作一个透明的白盒子,根
据程序内部的逻辑结构测试程序内部的主要执行通路是否能够按照预定的要求正确
工作。又称“结构测试”。
单元测试(模块测试):将每个模块作为一个单独的实体进行测试。发现的错误编码和详细设计阶段的错误(常用白盒测试)
子系统测试:将模块集成为一个子系统进行测试。着重测试模块的接口。
系统测试:将子系统组装为一个完整的系统进行测试。
子系统测试和系统测试总称为**“集成测试”**。
验收测试(确认测试):在用户的参与下,往往使用实际的数据进行的测试。发现需求说明中的错误
平行运行:
同时运行新开发出来的系统和将被它取代的旧系统,以便比较新旧两个系统的处理结果。
详细设计文档
(设计测试用例的方法):白盒测试技术
1.模块接口
2.局部数据结构
3.重要的执行通路
4.出错处理通路
5.边界条件
发现与接口有关的问题
独立的测试机构或第三方人员
上层模块使用自顶向下方法
下层模块采用自底向上方法
重新执行已经做过测试的某个子集,以保证程序的变化没有带来非预
期的副作用。
又称为确认测试,目标是验证软件的有效性。
为了保证软件正确的实现了某个特定要求而进行的一系列活动。
为了保证软件确实满足了用户需求而进行的一系列活动。
(1)Apha测试:用户在开发者的场所,在开发者指导下进行。
(2)Beta测试:,用户在用户场所进行,遇到问题报告给并发者,开发者进
行修改。
选择,顺序,条件
程序在给定时间间隔内,按照规格说明书的规定成功运行的概率
程序在给定时间点,按照规格说明书的规定成功运行的概率
是在软件已经交付使用之后,为了改正错误或满足新的需要而修改软件的过程。
需要付出很大的代价(浪费精力并且遭受挫折的打击),这种
方式是因为设有使用良好定义的方法学开发出来的软件的必
然结果。(由于没有文档,代价大)
有一个完整的软件配置存在,那么维护工作从评价设计文档开
始,确定软件重要的结构特点、性能特点以及接口特点。
作用:能减少精力的浪费,并且能提高维护的总体质量。
①定义
软件可理解性表现为外来读者理解软件的结构、功能、接
口和内部处理过程的难易程度。
②影响因素
ā.模块化(模块结构良好,高内聚,松耦合);b.详细的设
计文档;c.结构化设计;d.程序内部的文档;e高级程序设
计语言等。
诊断和测试的容易程度取决于软件【容易理解】的程度。
对于程序模块来说,可以用程序复杂度来度量它的可测试
性。模块的环形复杂度越大,可执行的路径就越多。
因此,全面测试它的难度就越高。
和启发原则直接有关。耦合、内聚、信息隐藏、局部化、控
制域与作用域的关系等,都影响软件的可修改性。
软件可移植性是指把程序从一种计算环境(硬件配置和操
作系统)转移到另一种计算环境的难易程度。
重用是指同一事物不做修改或销加改动就在不同环境中多
次重复使用。
可重用构件越多,软件的可靠性越高,改正性维护需求就
越少。
文档是影响软件可维护性的【决定因素】
软件系统的文档可以分为【用户文档】和【系统文档】两类。
主要描述系统功能和使用方法,并不关系这些功
能是怎样实现的。
描述系统设计、实现和测试等各方面的内容
面向对象=对象+类+继承+消息(选、填)
对象抽象出共同特征就是类,类实例就是对象
继承是继承父类原本就拥有的属性和功能。
消息是指对象之间靠消息沟通。
1、和人们认识世界的角度一致
2、稳定性好
(1)为什么传统的不好?
一–因为传统的软件结构紧密,需求变化时会引起整体修改
(2)为什么面向对象就好?
----可以灵活应对需求变化,软件整体不会发生太大修改
3、可重用性好
4、较易开发大型软件产品(可以把大软件拆成多个小的
5、可维护性好
SRS(需求规格说明书)
OOA (面向对象分析)的关键是识别出问题域内的类知时象。
静态模型(对象模型)
交互次序(动态模型)
数据变换(功能摸型)
总体设计+详细设计
系统设计+对象设计
两者几平可以类比了解,约等但不完全等。
1、模块化
2、抽象
3、信息隐藏
4、强内聚+松耦合
5、可重用
传统的没有抽象和可重用
1、设计结果应该清晰易懂
2、一般-特殊结构的深度应适当
重用也叫再用或复用,是指同一事物不做隆改或稍加改动
就多次重复使用。
软件成分的重用级别(3个级别)
(1)代码重用
(2)设计结果重用
(3)分析结果重用
编玛+测试
编码就是编码,和传统的知识点一样
测试是从小型测试开始逐步过渡到大型测试
测试步骤也是:
单元测试(白盒)—集成测试—确认测试(黑盒)
软件项目管理先于任何技术活动,贯穿软件生命周期始终。
有历史数据做支撑可以大致估算出规模
肯定是不可靠的,因为每种语言的代码行数不同
把项目划分成多个功能点,分开计算进度计划
不清楚彼此间的依赖关系;不清楚哪个是主攻任务,造成潜力的浪费
软件质量是软件与明确地和隐含地定义的需求相一致的程度”软件满足明确描述的需求,但不满足【隐含需求】,那么软件的质量
是值得怀疑的。
软件配置管理是在软件的整个生命周期内管理变化的一组活动。说白了就是管理SC1(软件配置项目)变化的一组活动。
SC=程序+文档+数据
1、标识变化
2、控制变化
3、确保适当的实现了变化
4、向需要知道这类信息的人报告变化
1、为软件项目招标做依据。
2、改进自身软件过程活动。
初始级、可重复级、已定义级、已管理级、优化级
速记:初重定管优(先可后已)
出:
SRS(需求规格说明书)
OOA (面向对象分析)的关键是识别出问题域内的类知时象。
静态模型(对象模型)
交互次序(动态模型)
数据变换(功能摸型)
总体设计+详细设计
系统设计+对象设计
两者几平可以类比了解,约等但不完全等。
1、模块化
2、抽象
3、信息隐藏
4、强内聚+松耦合
5、可重用
传统的没有抽象和可重用
1、设计结果应该清晰易懂
2、一般-特殊结构的深度应适当
重用也叫再用或复用,是指同一事物不做隆改或稍加改动
就多次重复使用。
软件成分的重用级别(3个级别)
(1)代码重用
(2)设计结果重用
(3)分析结果重用
编玛+测试
编码就是编码,和传统的知识点一样
测试是从小型测试开始逐步过渡到大型测试
测试步骤也是:
单元测试(白盒)—集成测试—确认测试(黑盒)
软件项目管理先于任何技术活动,贯穿软件生命周期始终。
有历史数据做支撑可以大致估算出规模
肯定是不可靠的,因为每种语言的代码行数不同
把项目划分成多个功能点,分开计算进度计划
不清楚彼此间的依赖关系;不清楚哪个是主攻任务,造成潜力的浪费
软件质量是软件与明确地和隐含地定义的需求相一致的程度”软件满足明确描述的需求,但不满足【隐含需求】,那么软件的质量
是值得怀疑的。
软件配置管理是在软件的整个生命周期内管理变化的一组活动。说白了就是管理SC1(软件配置项目)变化的一组活动。
SC=程序+文档+数据
1、标识变化
2、控制变化
3、确保适当的实现了变化
4、向需要知道这类信息的人报告变化
1、为软件项目招标做依据。
2、改进自身软件过程活动。
初始级、可重复级、已定义级、已管理级、优化级
速记:初重定管优(先可后已)