一、软件工程的基本概念
1、软件危机的出现
软件=程序+数据+文档
软件危机指在计算机软件的开发和维护过程中所遇到的一系列严重问题。
2、如何消除
软件工程:管理+技术
软件工程是:
1把系统的、规范的、可度量的途径应用于软件开发、运行和维护过程,也就是把工程应用于软件;
2研究1中提到的途径
3、软件工程的基本原理和知识体系
1.用分阶段的生命周期计划严格管理
2.坚持进行阶段评审
3.实行严格的产品控制
4.采用现代程序设计技术
5.结果应能清楚的审查
6.开发小组的人员应少而精
7.承认不断改进软件工程实践的必要性
4、软件工程方法学
软件工程方法学包含三个要素:方法、工具、过程
方法和过程区别:方法指的是大方向我们怎么做,更多倾向于技术性,过程是指的是一系列任务框架,规定工作步骤,倾向于管理性、计划性
目前使用得最广泛的软件工程方法学是传统方法学和面向对象方法学
(1)传统方法学
传统方法学也称为生命周期方法学或结构化范型。它采用结构化技术(结构化分析、结构化设计和结构化实现)来完成软件开发的各项任务,并使用适当的软件工具或软件工程环境来支持结构化技术的运用。
传统方法学的特点:
传统方法学把软件生命周期的全过程依次划分为若干个阶段,然后顺序地完成每个阶段的任务。
每个阶段的开始和结束都有严格标准,对于任何两个相邻的阶段而言,前一阶段的结束标准就是后一阶段的开始标准。
(2)面向对象方法学
与传统方法相反,面向对象方法把数据和行为看成是同等重要的,它是一种以数据为主线,把数据和对数据的操作紧密地结合起来的方法。
它尽量模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界、解决问题的方法与过程,从而使描述问题的问题空间(也称为问题域)与实现解法的解空间(也称为求解域)在结构上尽可能一致。
(3)敏捷软件开发
- 个体和交互 胜过 过程和工具
- 可以工作的软件 胜过 面面俱到的文档
- 客户合作 胜过 合同谈判
- 响应变化 胜过 遵循计划
敏捷编程即软件行业力图适应现代商业环境的具体表现!以“瀑布模型”为代表的传统软件开发模型针对软件生命周期的各个阶段提供了一套规范,这种基于计划的生命周期的软件开发方法曾极大地促进了软件行业的发展,但现如今却愈感“有心无力”。为了适应现代的商业环境与之对应的“敏捷编程”的开发方法提了出来。包括诸如“极限编程”、自适应软件开发和功能驱动开发等。
5、软件生命周期
软件生命周期由软件定义、软件开发和运行维护(也称为软件维护)3个时期组成,每个时期又进一步划分成若干个阶段。
6、软件过程(软件开发过程)
实际从事软件开发工作时,软件规模、类型、开发环境及技术方法等因素会影响到阶段划分,及各阶段的执行顺序,不可能完全准确就是上述8个阶段,由此了形成不同生存周期模型,又称过程模型。软件过程模型是为了获得高质量软件所需要完成的一系列任务框架,它规定了完成各项任务的工作步骤。通常使用生命周期模型简洁地描述软件过程
(1)瀑布模型
现在仍是应用最广泛的过程模型,主要用于传统软件工程方法学的软件过程
特点:
- 阶段间具有顺序性和依赖性
- 必须前一工作做完才能进行后一工作前一阶段的输出为后一阶段的输入
- 推迟实现的观点
- 瀑布模型在编码之前设置了系统分析与系统设计的各个阶段,分析与设计阶段的基本任务规定,在这两个阶段主要考虑目标系统的逻辑模型,不涉及软件的物理实现。可以将编码测试等物理实现推迟保证前期工作扎实
- 质量保证的观点
- 合格文档的完成是阶段结束的标志,必须完成规定的文档,且每个阶段结束前都要评审所完成的文档。毕竟万一后期有错,修改成本太高
实际上不可能这么理想,所以是带反馈环的,发现不妥就要重新返回修复后再继续
优点:瀑布模型的成功在很大程度上是由于它基本上是一种文档驱动的模型,质量有较大保证
缺点:由于瀑布模型完全依赖于书面的规格说明,很可能导致最终开发出的软件不能真正满足用户的需要。
瀑布模型适用于功能明确、无变化的系统开发,如操作系统、财务系统等
(2)快速原型模型
快速原型是快速建立起来的可以在计算机上运行的程序,它所能完成的功能往往是最终产品能完成的功能的一个子集。
特点:线性开发模型、无反馈环
快速建立一个大致符合要求的可运行程序——》用户评定给出意见修改完善细节需求——》不断重复完善和评定阶段直到认可——》整体实现,维护
快速原型模型使用于需求动态变化,事先难以确定系统
(3)增量模型
使用增量模型开发软件时,把软件产品作为一系列的增量构件来设计、编码、集成和测试。每个构件由多个相互作用的模块构成,并且能够完成特定的功能。使用增量模型时,第一个增量构件往往实现软件的基本需求,提供最核心的功能。
特点:模块化结构化
更具风险的增量模型:
(4)螺旋模型
螺旋模型将瀑布模型和快速原型结合起来强调了其他模型忽视的风险分析。螺旋模型是一种演化软件开发过程的模型,它兼顾了快速原型的迭代特征和瀑布模型的系统化与严格监控。
特点:风险分析
缺点:对风险分析的依赖程度较高
(5)极限编程(eXtreme Programming,XP)
首先,项目组针对客户代表提出的“用户故事” 进行讨论,提出隐喻,在此项活动中可能需要对体系结构进行“试探” 。然后,项目组在隐喻和用户故事的基础上,根据客户设定的优先级制订交付计划。接下来开始多个迭代过程(通常每个迭代历时1~3周),在迭代期内产生的新用户故事不在本次迭代内解决,以保证本次开发过程不受干扰。开发出的新版本软件通过验收测试之后交付用户使用。
几种模型间的对比:
传统的瀑布式开发,也就是从需求到设计,从设计到编码,从编码到测试,从测试到提交大概这样的流程,要求每一个开发阶段都要做到最好。
特别是前期阶段,设计的越完美,提交后的成本损失就越少。迭代式开发,不要求每一个阶段的任务做的都是最完美的,而是明明知道还有很多不足的地方,却偏偏不去完善它,而是把主要功能先搭建起来为目的,以最短的时间,
最少的损失先完成一个“不完美的成果物”直至提交。然后再通过客户或用户的反馈信息,在这个“不完美的成果物”上逐步进行完善。螺旋开发,很大程度上是一种风险驱动的方法体系,因为在每个阶段之前及经常发生的循环之前,都必须首先进行风险评估。
敏捷开发,相比迭代式开发两者都强调在较短的开发周期提交软件,但是,敏捷开发的周期可能更短,并且更加强调队伍中的高度协作。
敏捷方法有时候被误认为是无计划性和纪律性的方法,实际上更确切的说法是敏捷方法强调适应性而非预见性。
(6)其他模型
- 喷泉模型:无缝,可同步开发,提高开发效率,节省开发时间, 适应面向对象软件
- Rational统一过程
- 微软过程
二、可行性研究
摘录:
1、什么是可行性研究
可行性研究是软件开发生命周期中的第一个阶段,是一种分析、评价各种建设方案和生产经营决策的科学方法。它通过对建设项目的主要问题,如市场需求、资源条件、原料、燃料、动力供应条件、建设规模、设备选型等,从技术、经济、工程等方面进行调查研究,分析比较,并对这个项目建成后可能取得的技术经济效果进行预测,从而提出该项目是否值得投资和怎样进行建设的意见,为项目决策提供可靠的依据,进而避免人力、物力和财力上的浪费。
可行性研究的目的:可行性研究的目的不是解决问题,而是确定问题是否值得去解决。用最小的代价在尽可能短的时间内确定问题是否能够解决。简单说,就是它能不能做,值不值得做,怎么做以小换大。
主要研究内容:
(1)经济可行性,经济可行性研究主要进行成本效益分析
(2)技术可行性, 现有的技术能不能实行现在得开发,是否有相应的开发人员
(3)操作的可行性,系统能不能实现客户的要求
(4)法律可行性,例如是否侵权
(5)时间可行性,规定时间内是否能够完成
尤其需要注意技术和经济以及法律三方面的分析
2、可行性研究的过程
1.复查系统规模与目标:确保分析员解决的问题正是要求他解决的问题。
2.研究目前正在使用的系统:花费适当的时间,分析新旧系统的优缺点,现有系统的文档资料和使用手册。
3.导出新系统的高层逻辑模型:使用数据流图和数据字典定义新系统的模型,建造新的物理系统。
4.进一步定义系统:确保分析员对问题没有误解,以及没有用户曾经遗漏的要求。
5.导出和评价供选择的解法:为每个在技术、操作和经济等方面都可行的系统制定实现大致的进度表。
6.推荐行动方针:分析员对于所推荐的系统进行比较详细的成本/效益分析。
7.草拟开发计划:分析员为推荐的方案草拟一份开发计划,具有工程进度表、估计各类开发人员、各种资源需要情况和使用时间、估计系统生命周期每个阶段的成本、给出需求分析的详细进度表和成本估计
8.书写文档提交审查:把上述可行性研究各个步骤的工作结果写成清晰的文档,请用户、客户组织的负责人及评审组审查,以决定是否继续这项工程及是否接受分析员推荐的方案。
3、可行性分析方法
(1)系统流程图
在进行可行性研究的时候,需要了解和分析现有的系统,系统流程图是概括地描绘物理系统的传统工具。它的基本思想是用图形符号以黑盒子形式描绘组成系统的每个部件(程序、文档、数据库、人工过程)等。系统流程图表达的是数据在系统各部件之间流动的情况,而不是对数据进行加工处理的控制过程,因此,尽管系统流程图的某些符号和程序流程图的符号形式相同,但它是物理数据流图而不是程序数据流图。
程序流程图表示对信息进行加工处理的控制过程,也称为控制流
系统流程图表达的是信息在系统各部件之间的流动情况,也称为数据流
常用标记:
其他存储标记:
例如:零件器材的发放和接受称为变更记录,由键盘输入到计算机中。系统中库存清单程序对变更记录进行处理,更新存储在磁盘上的库存清单主文件,并且把必要的订货信息记录写在联机存储上。最后,每天由报告生成程序读一次联机存储,并且打印出订货报告
(2)数据流图(Data Flow Diagram)
数据流图是一种图形化技术,它描绘信息流和数据从输入移动到输出的过程中所经受的变换,表达了信息加工处理的过程。数据流图是结构化分析的主要工具之一
符号表示:
为了表达数据处理过程的数据加工情况,用一个数据流图是不够的,为了表达稍为复杂的实际问题,需要按照问题的层次结构进行逐步分解,并以分层的数据流图反映这种结构关系。
一些原则:
- 数据流图上所有图形符号只限于前述四种基本图形元素
- 数据流图的主图必须包括前述四种基本元素,缺一不可
- 数据流图的主图上的数据流必须封闭在外部实体之间
- 每个加工至少有一个输入数据流和一个输出数据流
- 在数据流图中,需按层给加工框编号。编号表明该加工所处层次及上下层的亲子关系
- 规定任何一个数据流子图必须与它上一层的一个加工对应,两者的输入数据流和输出数据流必须一致。即父图与子图的平衡
- 图上每个元素都必须有名字
- 初画时可以忽略琐碎的细节,以集中精力于主要数据流
(3)数据字典(Data Dictionary)
是关于数据的信息集合,是对数据流图中包含的所有元素(数据流、数据元素、数据存储、处理/加工)定义的集合。它的任务是 对于数据流图中出现的所有被命名的图形元素在字典中作为一个词条加以定义,使得每一个图形元素的名字都有一个确切的解释。
数据字典中记录数据元素的下列信息
- 一般信息(名字、别名、描述)
- 定义(数据类型、长度、结构)
- 使用特点(指的范围、使用频率、使用方式)
- 控制信息(来源、用户、程序的改变和使用权)
- 分组信息(父结构、从属结构、物理位置)
(4)成本/效益分析方法
成本估计
- 代码行技术
- 任务分解技术
- 自动估计成本技术
成本/效益分析的方法
- 货币的时间价值
- 投资回收期
- 纯收入
- 投资回收率