1.软件工程概述
概述:概念、软件危机、软件工程内容、方法论、UML、发展与挑战等
软件过程:生命周期、传统软件过程模型、敏捷过程模型、过程建模等
软件开发方法(面向对象为主)
需求分析、概要设计、代码生成、详细设计、实现
设计优化:设计原则、架构模式、设计模式
交互设计、软件测试与质量保证
软件开发环境
软件配置管理、项目管理、质量管理
项目人员与沟通等
1.1UML的构成
用例图
(1)用例图:用于表示系统与使用者(或其他外部系统)之间的交互,有助于将需求映射到系统。

(2)活动图:用于表示系统中顺序和并行的活动。
(3)类图:用于表示类、接口及其之间的关系。
(4)对象图:用于表示类图中定义的类的对象实例,其配置是对系统的模拟。
(5)顺序图:用于表示重要对象之间的互动顺序。
(6)通信图:用于表示对象交互的方法和需要支持交互的连接。
(7)时序图:用于表示重点对象之间的交互时间安排。
(8)交互概况图:用于将顺序图、通信图和时序图收集到一起,以捕捉系统中发生的重要
交互情况。
(9)组成结构图:用于表示类或组件的内部,可以在特定的上下文中描述类间的关系。
(10)组件图:用于表示系统内的重要组件和彼此间交互所用的接口。
(11)包图:用于表示类与组件集合的分级组织。
(12)状态图:用于表示整个生命周期中对象的状态和可以改变状态的事件。
(13)部署图:用于表示系统最终怎样被部署到真实的世界中。
1.2视图
描述系统的所有元素的集合及元素之间的关系,构成了模型。图是通往模型的窗口,特定的图会显示模型的某些部分,但不必显示模型的全部,构成了UML的视图,每个视图捕获系统的一个方面。Kruchten的4+1视图:
逻辑视图
进程视图
开发视图
物理视图
用例视图
1.3软件工程的开发方法
软件工程三个要素:方法、工具和过程。
随着软件工程的发展及技术的不断进步,软件工程开发方法从人们分析问题角度和方式的不同,可以笼统的分为传统的和面向对象的两种
传统开发方法又称为结构化方法,是一种静态的思想。
将软件开发过程划分成若干个阶段,并规定每个阶段必须完成的任务,各阶段之间具有某种顺序性;
体现出对于复杂问题“分而治之”的策略,但主要问题是缺少灵活性,缺少应对各种未预料变化的能力,这些变化却是在实际开发中无法避免的;
当软件规模比较大,尤其是开发的早期需求比较模糊或者经常变化的时候,这种方法往往会导致软件开发的不成功或维护困难。
特点:生命周期模型;软件过程划分为若干个阶段;每个阶段有各自的任务;阶段之间有某种顺序性

面向对象方法
对象作为融合数据及在数据之上的操作行为的统一的软件构件。
把所有对象都划分成类(Class)。每个类都定义了一组数据和一组操作。
按照父类(或称为基类)与子类(或称为派生类)的关系,把若干个相关类组成一个层次结构的系统(也称为类等级)。在类等级中,下层派生类自动拥有上层基类中定义的数据和操作,称为继承。
对象彼此间仅能通过发送消息互相联系-封装性。
面向对象特点
面向对象方法学的出发点和基本原则,是尽可能模拟人类习惯的思维方式。
用面向对象方法学开发软件的过程,是一个主动地多次反复迭代的演化过程。
概念和表示方法上的一致性,阶段间平滑(无缝)过渡。
特殊到一般的归纳思维过程;一般到特殊的演绎思维过程。(继承的思想)
最终产品中的对象与现实世界中的实体相对应,降低了复杂性,提高了可理解性,简化了软件的开发和维护工作。
对象是相对独立的实体,容易在软件产品中重复使用,促进了软件重用。
面用对象方法特有的继承性,也进一步提高了面向对象软件的可重用性。

2.软件开发过程
软件开发过程(software development process)又叫做软件开发生命周期(software development life cycle,SDLC),是软件产品开发的任务框架和规范,又可以简单的称为软件生命周期及软件过程。
2.1软件生命周期与开发过程
4种不同类型的生命周期:顺序式、迭代式、增量式以及敏捷式
过程管理主要采用的是一种“分而治之”的思想,即将整个软件的生命周期划分成软件定义、软件开发和运行维护三个主要的时期,每个时期再细分为具体的阶段,分别对应明确的任务。
2.2传统生命周期模型
传统生命周期模型顺序的将生命周期阶段组织起来,严格按照需求、分析、设计、编码和测试的阶段进行。
传统的生命周期模型,其中具有代表性的包括瀑布模型、原型模型、增量模型等。
按照传统的瀑布模型来开发软件,有如下特点。
– 阶段间具有顺序性和依赖性,文档驱动
– 推迟实现,不急于编写代码
• 尽可能的理解和掌握系统需求,
• 清楚地区分逻辑设计与物理设计,尽可能推迟程序的物理实现。
瀑布模型– 质量保证的观点
• 每个阶段都必须完成规定的文档,没有交出合格的文档就是没有完成该阶段的任务。
• 每个阶段结束前都要对所完成的文档进行评审,以便尽早发现问题,改正错误。
快速原型模型(Rapid Prototype)的主要作用是在用户和开发者之间起到“桥梁”的作用。
增量模型也称为渐增模型。把软件产品作为一系列增量构件来设计、编码、集成和测试。
螺旋模型的基本思想是使用原型及其它方法尽量降低风险。
喷泉模型是典型的面向对象生命周期模型,迭代是OO开发过程的主要特性。
2.3敏捷生命周期模型
敏捷软件开发:迭代式开发、增量交付、开发团队和用户反馈推动产品开发、持续集成、开发团队自我管理。
极限编程(XP):主要目的是降低需求变化的成本
Scrum 是一个敏捷开发框架,与 XP 相比,其更注重软件开发的系统化过程。它由一个开发过程、几种角色及一套规范的实施方法组成。它可以被运用于软件开发、项目维护,也可以作为一种管理敏捷项目的框架:开发过程分为多个冲刺(Sprint)周期、燃尽图(burn down)是一个公开展示的图表显示当前冲刺中未完成的数目、产品增量 Increment:最终交付给客户的内容


DevOps:开发(Development)和运维(Operations),源于敏捷开发过程,遵从基本的敏捷宣言,强调了“个体和交互胜过流程和工具”的作用,但却不受限于某一种软件过程,甚至是在瀑布模型中也会发挥作用。
3.需求分析
需求分析的目标就是搞清楚用户真正想要的系统是什么以及存在哪些约束条件。
由客户为主导制定的需求文档称为用户(业务)需求
由开发者为主导制定的需求文档称为系统需求
涉众(Stakeholder)是与目标系统相关的一切人和物,他们对目标系统的构建会有一定的影响。
3.1用例
用例(Use case)使用一种交互的方式来描述系统的场景,借以“捕获”用户的需求。





3.2活动图




3.3数据流图
数据流图(DFD) 描绘信息流和数据从输入移动到输出的过程中所经受的变换。


4.软件架构的构建
软件架构设计就是建立系统所需的数据结构和程序构件
软件架构为软件系统提供了一个结构、行为和属性的高级抽象,由构成系统的元素的描述、这些元素的相互作用、指导元素集成的模式以及这些模式的约束组成。
4.1软件架构模型

构件是具有某种功能的可重用的软件模板单元,表示了系统中主要的计算元素和数据存储
连接件表示构件之间的交互
配置表示了构件和连接件的拓扑逻辑和约束
4.2软件架构风格
数据流风格:批处理序列、管道与过滤器等。

调用/返回风格:层次结构、正交软件结构、客户机/服务器结构、浏览器/服务器结构等。




独立构件风格:进程通信、事件系统、MVC 结构等。

虚拟机风格:解释器、基于规则的系统等。
数据中心风格:数据库系统、超文本系统、仓库/黑板系统等。

4.3软件架构设计
可能涉及包图

5.类的分析与设计
5.1基本类的确定
在系统分析与设计阶段,类通常分为实体类(Entity Class)、控制类(Control Class)和边界类(Boundary Class)
5.2类图
类图是uml图中的重点,也是考察重点。

类图的六种关系






5.3顺序图与通信图


6.代码生成
软件开发环境指支持软件开发的工具及其集成机制,用以支持软件开发的过程、活动和任务,为软件的开发、维护及管理提供统一的支持,也即计算机辅助软件工程(CASE)。
7.类的详细设计
详细设计是以概要设计说明书作为基础,完成各模块的算法设计、用户界面设计以及数据结构设计的细化等。
结构化的程序:如果程序的代码块仅仅通过顺序、选择和循环三种控制结构进行连接,并且每个代码块只有一个入口和一个出口,则称这个程序是结构化的。(目的是简化设计过程)
程序流程图

盒图

问题分析图(PAD)

判定表



PDL
程序设计语言(Programming Design Language,PDL)是一种用来进行详细设计的语言类工具,又称为结构化语言或伪代码。
状态图

OCL

8.设计优化
“小即是美”体现出设计思想的灵活性、完整性与轻量性,是优化的基础。
• KISS(Keep It Simple Stupid):人们应该总是选择那些尽可能简单的实现方案,因为它们既能够全面解决问题,且具有较好的可理解性。
• YAGNI(You Ain’t Gonna Need It):这条原则的含义是“你不会需要它” ,是指开发者自以为有用的功能,实际上都不会需要。
8.1设计的基本原则






8.2模式











9.实现技术
10.交互设计
11.软件测试
11.1白盒测试、灰盒测试和黑盒测试

11.2McCabe指标



11.3LCOM*指标

11.4等价类测试

11.5基于控制流的测试







12.软件项目级管理

工程网络图


挣值分析




13.软件过程管理与改进
软件企业组织需要建立一个统一的、明确定义的组织级软件过程,使得所有的项目遵照执行,同时在实用执行中不断地改进和完善组织级过程体系