PKU SE note
本文为北京大学软件工程mooc视频笔记个人总结
概论
- 软件=程序+文档
- 特点:
无形不可见的逻辑实体
设计开发的而不是生产制造的
较为复杂涉及多个领域
开发成本高
易于复制 - 分类:
系统软件,支撑软件,应用软件 - 软件危机
软件质量差,可靠性难以保证
成本难以控制
开发进度难以把握,周期拖得长
可维护性差,维护人员和费用增加 - 软件工程:从技术和管理两个方面对软件进行开发运行和维护
- 需求阶段:需求获取,需求定义,需求规约
- 设计阶段:总体设计 详细设计
- 软件生存周期:软件产品或系统一系列活动的全周期,从形成概念开始,历经开发,交付使用,不断修订和演化到最后被淘汰。
- 软件生存周期模型:一个包含软件产品开发,运行和维护中有关过程,活动和任务的框架,覆盖了从该系统的需求定义到系统的使用终止。
- 瀑布模型:将软件生存周期的各项活动规定为依固定顺序而连接的若干阶段工作。规定了每一阶段的是如何本阶段的输出。作为下一阶段的输入。
增量模型:需求可以分段,称为一系列增量产品,每一增量可以分别开发。
他是瀑布模型的变体。 (每一个增量模型内部都相当于一个瀑布模型)
演化模型:针对实现不能玩正定以需求的软件开发。针对用户的核心需求开发。根据用户的反馈,实施活动的迭代。
喷泉模型:特点是迭代,无缝(两者相互融合)。比如面向对象的需求分析和面向对象的设计,是没有明确出哪一部分属于什么的。
软件需求
- 需求分析:确定软件的需求及约束(系统需要做到什么),解决其中的歧义,不一致性等问题。软件需求永远是软件开发中的基础部分。
- 自顶向下:先分析需求,根据需求再设计,给出问题的解决方案,再进行各种编码,测试等等。 整个过程是从上而下的。
自底向上:知道要做什么事但先不去考虑怎么设计。先考虑能用哪些成熟的软件来搭建系统看能否满足问题。根据构件的功能堆积看能否满足。先认识问题同时结合底层的单元,搭建,解决问题。不能满足的再自己搭建。 - 需求分为:功能,性能,外部接口,设计约束,质量属性。
- 需求:小朋友要很可爱;需求规约:不同人对可爱的定义是不一样的。规约要明确这个可爱到底是怎么定义,约束的。
结构化分析/设计方法
-
结构化方法:结构化分析方法,结构化设计方法,结构化程序设计方法(coding)
-
结构化分析的术语:
数据流:数据的流动
数据源:数据流的起点(系统之外的实体)
数据谭:数据流的归宿地(系统之外的归宿地) -
数据流图(DFD图——data flow diagram):表达系统功能模型的工具。
他是一种描述数据变换的图形工具,包含的元素是数据流,数据存储,加工,数据源,数据谭等。 -
数据字典:用于定义数据流和数据存储的结构,并给出构成所给出的数据流和数据存储的各数据项的基本数据类型。(引入了一些逻辑操作符用于定义数据结构)
-
结构化设计:要回答如何解决问题——给出软件解决方案。
-
分为:总体(概要)设计——确定整体模块;详细设计——对于模块内部的设计
-
总体设计层:应用模块和调用两个术语;引入了模块结构图(MSD)用于表达软件系统的静态结构。
任务1:将DFD转化为MSD
任务2:将初始的MSD转化为最终可供详细设计的MSD -
模块:执行一个特殊任务的一组历程和数据结构。模块化:把系统分解成若干模块的过程。
-
为什么要模块化:更方便解决问题。
但不能无限制划分。随着模块数量增长集成也更困难。 -
高内聚低耦合
耦合:不同模块之间相互依赖程度的度量。
如果模块间必须使用耦合,尽量用数据耦合,少用控制耦合,限制公共耦合的范围,坚决避免内容耦合。内聚:一个模块各成分之间相互依赖程度的度量。
好的设计满足:模块功能单一,模块各部分都和模块功能直接相关,高内聚。通过模块的分解和合并,力求降低耦合提高内聚。
-
PAD图:Problem Analysis diagram
-
结构化方法的抽象层:需求分析层,设计层,实现层
UML
- 面向对象方法的世界观:一切系统都是有对象构成的,它们之间的相互作用和影响构成了大千世界的各种系统。
- 对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本组成单位。有自己的静态特征(对象的属性)和动态特征(对对象的操作)。
- 一个对象由一组属性和对这组属性进行操作的一组服务构成。
- 对象的属性和操作合为一体,构成一个独立的实体,对外屏蔽器内部的细节(封装)。
- 对事物进行分类把有相同属性和操作的对象归为一类,类是这些对象的抽象描述。每个对象是类的一个实例。
- 一个类可以有多个属性,也可以没有属性。可以有多个操作,也可以没有操作。
- UML——unified modeling language统一建模语言;它是一种可视化语言。为面向对象开发系统的产品进行说明,可视化和编制文档的一种标准语言。
- 接口只描述外部可见操作,并不描述内部结构。通常只描述一个特定类的有限行为。接口没有实现也没有属性状态或关联,只有操作。
- 包:模型元素的一个分组。
- 关联:类目之间的结构关系,描述了一组具有相同结构相同语义的链。
- 泛华:一般性事物(父类或超类)和他的叫特殊种类(子类)之间的一种关系:is-a-kind-of
- 细化(实现):类目之间的一种语义关系,其中一个类目规约了保证了另一个类目执行的契约。
- 依赖:一种使用关系用于描述一个事物使用另一个事物的信息和服务。
UML图
- 类图(用于静态建模):类,类的的内部结构以及与其他类的联系。可以可视化地表达系统的静态结构模型。通常包括:类,接口,依赖,泛华和关联关系等。
- 用况图—USE CASE图(用于动态建模):对系统行为的抽象。通常包括:主题,用况(use case),参与者(actors),依赖,泛化,关联。
- 一个use case规约了系统可以执行的一个动作序列。
- 顺序图:一组对象以及这些对象之间的关系组成。
- 状态图:显示一个状态机的图,强调了从一个状态到另一个状态的控制流。
- UML针对自顶向下的建模人员来讲,提供了跨越问题空间到目前运行平台之间丰富的建模元素。
- 面向对象方法是一种以对象和对象的关系来创建系统模型的系统化软件开发方法学。给出表达“对象”,“对象关系”的术语,并给出了表达模型的工具。
面向对象的分析(Object-oriented analysis,OOA)
OOA模型的基本模型:类图;需求模型:用况图。
面向对象的设计:OOD(Design/Development)
OOA强调做什么,OOD强调怎么做
OOA强调问题域与系统责任,OOD强调与实现有关的因素
程序设计范型/OOPL(Object-oriented Programming Language)
- 其是一类典型的编程风格,如过程化编程,面向对象编程指令式编程等等为不同的编程范型。
例如在面向对象编程中,程序员认为程序是一系列相互作用的对象。 - 面向过程的程序设计范型:程序设计主要是过程设计。决定所需的过程,设计过程的算法。
- 面向对象程序范型在基本的范型上发展起来,增加了类和继承,用类创建对象实例。
从客观存在的事物出发构造软件系统,运用人类日常思维方式。
使用对象,类,继承,封装,聚合,关联,消息,多态性等基本概念来进行程序设计。
敏捷开发(Agile Development)
- 是一种应对快速变化的需求的一种软件开发能力。其更强调专家之间的紧密协作,面对面的沟通,频繁交付新的软件版本,紧凑的团队等。更注重软件开发中人的作用。强调小而高度自主的项目团队。
- 极限编程(eXtreme Programming——XP):是敏捷方法中最显著的一个。他由一系列简单却相互依赖的实践组成。
- XP使用面向对象方法作为推荐的开发范型。包含:策划,设计,编码,测试。
- Scrum模型(一种敏捷过程模型):
规划纲要阶段——一系列冲刺循环,每个循环开发出一个系统增量——结束阶段进行总结项目,完善需要的文档,总结经验
软件测试
- 定义:检测和评价软件以确定其质量的过程和方法,即评价软件或程序的属性和能力,已确定他是否满足所需结果的过程与方法。
- 分为:
静态测试——只是检查和审阅,对源代码进行分析,在动态测试前进行
动态测试——运行和使用软件,借助输入样例,又分为黑盒测试(功能测试)和白盒测试(结构测试) - 软件测试目标:预防错误,发现错误
- 软件调试:发现所编写软件中的错误,确定错误的位置并加以排除。
- 白盒测试:结构测试或逻辑驱动测试。他是直到产品内部过程,可通过测试来检测内部动作是否按照规格说明书的规定正常进行。主要方法:逻辑覆盖,基本路径测试等。
- 黑盒测试:数据驱动测试。在程序接口进行测试。分为等价类划分,边界值分析,因果图,错误推测等。
- 等价划分:让几个有效等价值共用一个测试用例,可以减少测试次数。但若是几个无效等价类共用一个测试用例,就可能错误漏检。
- 有效等价类是指对于程序的规格说明来说是合理的、有意义的输入数据构成的集合,它能检验程序是否可以实现规格说明中所规定的功能需求。无效等价类是指对程序的规格说明是不合理的或无意义的输入数据所构成的集合,它能检验程序在不符合规则的数据输入下,是否会有异常;无效等价类至少应有一个,也可能有多个,视具体情况而定。因此,设计测试用例时,要同时考虑这两种等价类。因为软件不仅要能接收合理的数据,也要能经受意外的考验,这样的测试才能确保软件具有更高的可靠性。
- 边界值分析:大量错误经常发生在输入或输出范围的边界上,因此设计一些用例使程序运行在边界情况附近,这样揭露错误的可能性较大。
- 软件测试步骤
单元测试(通常使用白盒测试):集中于每个独立模块。
集成测试:集中于模块的组装。目标是发现与接口有关的错误。
确认测试(有效性测试)(通常使用黑盒测试):发现软件实现的功能与需求规格说明书不一致的错误。
系统测试:把确认过的软件纳入实际运行环境,与系统中的其他成分组合在一起测试。
软件项目管理
为了使软件项目能够按照预定的成本,进度,质量顺利完成,而对成本,人员,进度,质量,风险等进行分析和管理的活动。
CMM
- CMM——能力成熟度模型:Capability Maturity Model for Software,英文缩写为SW-CMM,简称CMM。它是对于软件组织在定义、实施、度量、控制和改善其软件过程的实践中各个发展阶段的描述。
按照软件过程的不同成熟度话分了五个等级。其中1级成熟度最低,5级成熟度最高。 - 基本思想:支撑软件质量的三大要素:Process;People;Technology;整个软件任务可以看成是一个过程,该过程可以予以控制测量和改进。
软件开发工具与环境
- 计算机辅助软件工程 CASE(Computer-Aided Software Engineering)=软件工程+自动化工具
他是一类特殊的软件工具,用于辅助开发,分析,测试维护另一计算机程序和文档。 - SDE(Software development environment)软件开发环境。
- SEE(Software engineering environment)软件工程环境 以软件工程为依据,支持大型软件生产的系统。
- 常用的软件开发工具和环境
主流的应用软件类型:
桌面应用
WEB应用
移动应用
其他领域如嵌入式系统应用
主流开发平台
Windows系列
Linux系列
Android
MAC,iOS - Eclipse是跨平台的自由集成开发环境(IDE——Integrated Development Environment)),其设计思想是:一切皆插件。他的核心很小,所有功能都以插件的形式附加于Eclipse核心之上。
- GCC(GNU Compiler Collection,GNU编译器套装),是一套由GNU开发的编程语言编译器。