目录
一、概论
1. 软件的基本概念
(1)什么是软件
![](https://i-blog.csdnimg.cn/blog_migrate/a966b3933079e685fc566cf34c5d326c.png)
(2)软件的发展
1960-70年代:结构化方法——结构化程序设计方法、瀑布模型、螺旋模型等,好比建平房或用建平房的技术建造复杂建筑
1980:面向对象的方法——面向对象方法、面向对象模型及建模工具等,好比建高楼,可以更方便地构建复杂建筑
1990:构件化方法——软构件方法、Web Services、软件复用方法等,好比堆积木、造预制件等,可以批量地、快速地构建更为复杂的建筑
2000:面向服务的体系结构SOA方法——基于Internet与云计算的软件开发方法
1950-1960年代:
软件 = 程序(Program)
面向过程的软件 = 算法(Algorithm) + 数据结构(Data Structure)
1970年代:
软件 = 程序(Program) + 文档(Document)
软件 = 程序(Program) + 文档(Document) + 数据(Data)
1980-1990年代:
面向对象的软件 = 对象(Object) + 消息(Message)
1990年代-至今:
面向构件的软件 = 构件(Component) + 框架(Framework)
面向服务的软件 = 服务(Service) + 消息(Message) + 总线(Bus)
2. 软件工程的基本概念
(1)软件工程产生的历史根源
软件危机(Software Crisis):计算机软件的开发和维护过程所遇到的一系列严重问题;
(2)软件工程的基本概念
(3)软件工程的知识体系
3. 软件工程工具
计算机辅助系统工程工具 - CASE
制图、建模工具:Rational Rose / Microsoft Visio / StarUML
原型制作工具:Balsamiq Mockups / ExtJS / jQuery / EasyUI /墨刀
集成开发环境:Visual Studio.NET / Eclipse
数据库设计工具:PowerDesigner / ERWin
代码生成工具:Rational Rose(含)
项目管理工具 - Microsoft Project
二、软件工程核心思想
1. 软件工程的本质:不同抽象层次之间的映射与转换
任何软件系统开发的共同本质在于:从现实空间的需求到计算机空间的软件代码之间的映射与转换
单步映射与多步映射
软件工程本质:用严格的规范和管理手段来缩小偏差,通过牺牲“时间”来提高“质量”
概念映射:问题空间的概念与解空间的模型化概念之间的映射
业务逻辑映射:问题空间的处理逻辑与解空间处理逻辑之间的映射
为了实现以上两个映射,软件工程需要解决以下问题:
1. 需要设置哪些抽象层次——单步映射?多步映射?几步?
2. 每一抽象层次的概念、术语与表达方式——公式?图形?文字?
3. 相邻的两个抽象层次之间如何进行映射——需要遵循哪些途径和原则?
需求分析:在一个抽象层上建立需求模型的活动,产生需求规约(Requirement Specification),作为开发人员和客户间合作的基础,并作为以后开发阶段的输入
软件设计:定义实现需求规约所需的系统内部结构与行为,包括软件体系结构、数据结构、详细的处理算法、用户界面等,即所谓设计规约(Design Specification),给出实现软件需求的软件解决方案
实现:由设计规约到代码的转换,以某种特定的编程语言,对设计规约中的每一个软件功能进行编码
验证/确认:一种评估性活动,确定一个阶段的产品是否达到前阶段确立的需求(verification),或者确认开发的软件与需求是否一致 (validation)
现实空间的需求 → 需求规约 → 设计规约 → 代码
2. 软件工程所关注的目标
产品:各个抽象层次的产出物
过程:在各个抽象层次之间进行映射与转换
软件工程具有“产品与过程二相性”的特点,必须把二者结合起来去考虑,而不能忽略其中任何一方
功能性需求(Functional Requirements):软件所实现的功能达到它的设计规范和满足用户需求的程度(功能1、功能2、…、功能n)
完备性:软件能够支持用户所需求的全部功能的能力
正确性:软件按照需求正确执行任务的能力,正确性描述软件在需求范围之内的行为
健壮性:在异常情况下,软件能够正常运行的能力,包括容错能力和恢复能力。健壮性描述软件在需求范围之外的行为。
可靠性:在给定的时间和条件下,软件能够正常维持其工作而不发生故障的能力
非功能性需求(Non-Functional Requirements):系统能够完成所期望的工作的性能与质量
效率:软件实现其功能所需要的计算机资源的大小,“时间-空间”
可用性:用户使用软件的容易程度,用户容易使用和学习
可维护性:软件适应“变化”的能力,系统很容易被修改从而适应新的需求或采用新的算法、数据结构的能力
可移植性:软件不经修改或稍加修改就可以运行于不同软硬件环境(CPU、OS和编译器)的能力
清晰性:易读、易理解,可以提高团队开发效率,降低维护代价
安全性:在对合法用户提供服务的同时,阻止未授权用户的使用
兼容性:不同产品相互交换信息的能力
经济性:开发成本、开发时间和对市场的适应能力
商业质量:上市时间、成本/受益、目标市场、与老系统的集成、生命周期长短等
不同类型的软件对质量目标的要求各有侧重:
实时系统:侧重于可靠性、效率
生存周期较长的软件:侧重于可移植性、可维护性
3. 软件开发中的多角色
客户单位(Client,甲方):
决策者(CXO)、终端用户(End User)、系统管理员(Administrator)
软件开发公司(Supplier,乙方):
决策者(CXO)
软件销售与市场人员
咨询师、需求分析师
软件架构师、软件设计师
开发人员:开发经理/项目经理、程序员
维护人员
(曾经的我还会负责地把右下角的东西P掉,现在的我只想要躺平摆烂)
4. 软件工程 = 最佳实践
软件系统的复杂性、动态性使得:高深的软件理论在软件开发中变得无用武之地。即使应用理论方法来解决,得到的结果也往往难以与现实保持一致
因此,软件工程被看作一种实践的艺术。做过越多的软件项目,犯的错误就越少,积累的经验越多,承接项目的成功率就越高。对新手来说,要通过多实践、多犯错来积累经验,也要多吸收他人的失败与教训与成功的经验。
在软件工程师试图解决“软件危机”的过程中,总结出一系列日常使用的概念、原则、方法和开发工具。这些实践经验经过长期的验证,已经被证明是更具组织性、更高效、更容易获得成功。大部分的这些实践都没有理论基础!
5. 软件工程的四个核心理论概念
核心概念:概念和形式模型、抽象层次、大问题的复杂性:分治、复用、折中、一致性和完备性、效率、演化
分而治之
将复杂问题分解为若干可独立解决的简单子问题,并分别独立求解,以降低复杂性。然后再将各子问题的解综合起来,形成最初复杂问题的解
核心问题:如何的分解策略可以使得软件更容易理解、开发和维护?
复用
在一个新系统中,大部分的内容是成熟的,只有小部分内容是全新的,构造新的软件系统可以不必每次从零做起。复用已经成功使用的架构、框架、同类经验的团队,直接使用已有的软构件,即可组装成新的系统,复用已有的功能模块,既可以提高开发效率,也可以改善新开发过程中带来的质量问题。
折中
不同的需求之间往往存在矛盾与冲突,需要通过折中来作出的合理的取舍,找到使双方均满意的点
核心问题:如何调和矛盾(需求之间、人与人之间、供需双方之间、…)
演化
软件系统在其生命周期中面临各种变化
核心问题:在设计软件的初期,就要充分考虑到未来可能的变化,并采用恰当的设计决策,使软件具有适应变化的能力
即:可修改性、可维护性、可扩展性