1、软件工程 (Software Engineering),引子,回答最重要的问题,Q1-什么是软件工程?,软件工程是一种工程形式,它运用计算机科学和数学原理,针对软件问题获得一种经济有效的解决方案 用系统的、规范的、可度量的方法,开发、运行和维护软件,软件工程是采用系统工程学和管理学相结合的原理、方法和技术来指导、管理和实施软件的各种活动,包括软件开发、运行、维护和服务等,Q2-软件工程的基本目标是什么?,高质量就是最大程度地满足客户需求、帮助客户获得成功 高生产力就是以最小的成本获得最好的收益,即在规定的时间和预算之内完成软件开发、维护和服务等任务,高质量 &高生产力,Q3-为什么要讨论软件工
2、程?,软件危机的出现和加剧 软件系统越来越复杂 软件环境变化很快 软件用户的需求越来越高,Q4-软件工程带来的益处又是什么?,规范软件开发的行为,从而提高软件的可维护、可移植性和可靠性 提供许多科学的方法、最佳实践和工具,帮助人们高效地、系统地、正确地构造软件 帮助我们建立有效的、平稳的并能持续改进的软件过程,预防缺陷、降低成本,最终多快好省地提供优质的软件产品或服务,为组织赢得利润、获得竞争力,Q5-软件工程的基本思想是什么?,将软件看成一个系统 通过迭代来完善软件系统,逐渐逼近客户的需求 软件开发是工程和艺术的统一、创造性和规范性的统一 过程决定产品,持续改进过程 质量以预防为主、重在文化
3、建设 以顾客为导向、软件即服务 个人和团队并重 向传统的成熟工业学习 适合自己的,才是最好的,软件工程学科构成,计算机科学 工程学 管理学 用工程学的方法来进行软件开发,并通过良好的管理来控制开发,软件工程组成部分,软件需求分析 软件设计与体系结构 软件编码技术 软件测试 软件过程与管理,几个误区,1、软件开发就是编程 2、软件工程是高层的事 3、软件工程等工作了再学 4、软件工程都是理论的东西,软件工程课程性质,计算机学科的专业必修课,软件工程专业的核心必修课 以其为导论形成了一系列软件工程类课程 软考中占分最多的课程 软件人才定位的分界线 软件工程是目前计算机科学领域最活跃的研究方向,是获
4、得工业界支持最多的研究热点,也是学科交叉最活跃的领域,CC2001,CS-AR计算机体系结构与组织 CS-AL算法与复杂性 CS-HC人机交互 CS-OS操作系统 CS-PF程序设计基础 CS-SP社会与职业问题 CS-SE软件工程 CS-DS离散结构 CS-NC以网络为中心的计算 CS-PL程序设计语言 CS-GV图形学与可视化计算 CS-IS智能系统 CS-IM信息管理 CS-CN数值计算科学,SE2004,SE-CMP 计算基础 SE-FND 数学和工程基础 SE-PRF 职业实践 SE-MAA 软件建模与分析 SE-DES 软件设计 SE-VAV 软件验证与确认 SE-EVO 软件进化
5、 SE-PRO 软件过程 SE-QUA 软件质量 SE-MGT 软件管理,软件工程课程,2、课程的安排1)课堂教学2)小组课题3)专题讨论4)课堂发言,软件工程的教学目标,从根本上改变编程即开发的错误思想 学会设计软件 了解软件开发的全过程 对软件开发的非技术因素有充分的认识 初步建立软件标准化的思想,学生可以系统了解软件项目开发与维护的一般过程,掌握开发高质量软件的方法,以及能够有效地策划和管理软件开发活动,为今后从事计算机大规模开发与维护打下坚实的基础。 熟悉软件工程活动内容 掌握面向对象的分析、设计方法、UML建模 掌握测试的基本原则和技术 了解软件计划,管理,维护等内容,教材和参考书,
6、教材 软件工程 清华大学出版社 钱乐秋、赵文耘等编著 参考书 软件工程:实践者的研究方法 机械工业出版社 roger s.pressman编著 软件工程导论清华大学出版社 朱少民编著 人月神话,课程安排,1 软件工程概述 2 系统工程 3 需求工程 4 设计工程 5 人机界面设计 6 软件测试 7 软件项目管理,课程安排(实验),用UML进行面向对象分析与设计建模,成绩评定,平时成绩 30%(点名 ,课堂作业,小组报告) 实验 20% 期末考试 50%(闭卷笔试),关键词,规范 思想,第一章 概论,计算机软件 软件工程 软件过程 软件过程模型 敏捷软件开发 CASE工具与环境*,1.计算机软件
7、,定义 特点 分类 软件语言 发展 软件危机,1. 软件的定义,计算机软件指计算机系统中的程序及其文档 程序是计算任务的处理对象和处理规则的描述 文档是为了便于了解程序所需的阐明性资料,文档一般是给人看的,不一定装入计算机,软件 = 程序+文档 程序 = 算法+数据结构+数据,软件的特点,软件是一种逻辑实体,而不是有形的系统元件,其开发成本和进度难以准确地估算 软件是被开发的或被设计的,它没有明显的制造过程,一旦开发成功,只需复制即可,但其维护的工作量大 软件不会磨损和老化 其他特点 软件的开发和运行常受到计算机硬件的限制,对计算机硬件有着不同程度的依赖性 软件的开发至今尚未完全实现自动化 软
8、件成本相当昂贵 相当多的软件工作涉及到社会因素,软件的分类,系统软件 属于计算机系统中最靠近硬件的一层,其它软件一般都通过系统软件发挥作用,它与具体的应用领域无关。 如操作系统、编译程序等 支撑软件 支持软件的开发和维护的软件。 如数据库管理系统、网络软件、软件开发环境等。 应用软件 特定应用领域专用的软件。,软件语言,软件语言是用于书写计算机软件的语言。 它主要包括: 需求定义语言(requirements definition language ) 用来书写软件需求定义 软件需求包括功能需求和非功能需求 功能性语言(functional language ) 用来书写软件功能规约(func
9、tional specification) 软件功能规约只刻画软件系统“做什么”的外部功能,而不涉及系统“如何做”的内部算法。 设计性语言(design language ) 用来书写软件设计规约(design specification) 软件设计规约刻画软件“如何做”的内部算法,是软件实现的依据 实现性语言(programming language) 文档语言(documentation language ) 用来书写软件文档,软件的发展,1946-1956年 从计算机问世到实用的高级程序语言出现前 没有系统的软件开发方法和管理机制、自定义软件、批处理、有限分布 1956-1968年 从实
10、用的高级程序语言出现到软件工程出现前 产生人机交互的新概念、多用户、实时、数据库。 1968年-至今 从软件工程出现到现在,软件危机,含义 计算机软件的开发和维护过程中所遇到的一系列严重问题 许多软件项目不能满足客户的要求 许多软件项目超出预算和时间安排典型表现 产生原因 克服途径,软件危机,典型表现 对软件开发成本和进度的估计常常很不正确 用户对“已完成的”软件系统不满意的现象经常发生 软件产品的质量往往靠不住 软件常常是不可维护的 软件通常没有适当的文档资料 软件成本在计算机系统总成本中所占的比例逐年上升 软件开发生产率提高的速度远远跟不上计算机应用迅速普及深入的趋势,软件危机,产生原因
11、软件是逻辑产品,开发进度、成本难以估计 缺乏或不完整、不一致的文档给维护带来困难 用户对软件需求的描述往往不够精确,有遗漏,有二义 软件开发人员对需求的理解与用户的本来愿望有差异 大型软件项目需多人协同完成,缺乏管理经验 开发人员不能有效地、独立自主地处理大型软件的全部关系 缺乏有力的方法学和工具的支持 软件项目的特殊性和人类智力的局限性 克服途径 消除错误的概念和做法 推广使用成功的开发技术和方法 使用软件工具和软件工程支持环境 加强软件管理,2.软件工程,软件工程定义 软件工程框架 软件工程基本原理 软件工程方法,软件工程定义,Fritz Bauer:软件工程是为了经济地获得可靠的和能在实
12、际机器上高效运行的软件而建立和使用的好的工程原则 IEEE: 软件工程是(1)将系统化的、规范的、可度量的方法应用于软件的开发、运行和维护的过程,即将工程化应用于软件中;(2)(1)中所述方法的研究 计算机科学技术百科全书:软件工程是应用计算机科学、数学及管理科学等原理,以工程化的原则和方法制作软件的工程,软件工程框架,目标 生产具有正确性、可用性以及价格合宜的产品 过程 生产一个最终满足需求且达到工程目标的软件产品所需要的步骤 原则 选取适宜的开发模型 采用合适的设计方法 提供高质量的工程支持 重视软件工程的管理,软件工程基本原理,确保软件储安平质量和开发效率原理的最小集合7条基本原理 用分
13、阶段的生命周期计划严格管理 坚持进行阶段评审 尽早发现在软件开发过程中犯的错误 实行严格的产品控制 在软件开发过程中不应随意改变需求 采用现代程序设计技术 结果应能清楚地审查 规定开发组织的责任和产品标准,从而使得说得到的结果能够清楚地审查 开发小组的人员应该少而精 承认不断改进软件工程实践的必要性,软件工程方法学,方法学(也称范型):软件生命周期全过程中使用的一套技术的集合 三要素:方法、工具和过程 传统方法学(结构化范型) 要么面向行为,要么面向数据 自顶向下顺序完成各阶段任务 面向对象方法学 对象+类+继承+用消息通信 多次反复迭代的演化过程 降低软件产品的复杂性,提高其可理解性,简化软
14、件开发和维护工作,促进软件重用,3.软件过程,软件过程是软件生存周期中的一系列相关的过程。 过程是活动的集合,活动是任务的集合。 软件工程过程是为了获得高质量软件所需完成的一系列任务框架,它规定了各项任务的工作步骤,软件生存周期,软件生存周期是指软件产品或软件系统从产生、投入使用到被淘汰的全过程。 大体可分为6个阶段: 计算机系统工程 需求分析 设计 编码 测试 运行和维护,计算机系统工程,确定待开发软件的总体要求和范围,以及它与其它计算机系统元素之间的关系 进行成本估算,做出进度安排 进行可行性分析,即从经济、技术、法律等方面分析待开发的软件是否有可行的解决方案,并在若干个可行的解决方案中作
15、出选择。,需求分析,主要解决待开发软件要“做什么”的问题 确定软件的功能、性能、数据、界面等要求,生成软件需求规约,设计,主要解决待开发软件“怎么做”的问题。 软件设计通常可分为系统设计(也称概要设计或总体设计)和详细设计。 系统设计的任务是设计软件系统的体系结构,包括软件系统的组成成分、各成分的功能和接口、成分间的连接和通信,同时设计全局数据结构; 详细设计的任务是设计各个组成成分的实现细节,包括局部数据结构和算法等。,编码、测试、运行和维护,编码用某种程序设计语言,将设计的结果转换为可执行的程序代码。 测试 发现并纠正软件中的错误和缺陷。测试主要包括单元测试、集成测试、确认测试和系统测试。
16、 运行和维护 在软件运行期间,当发现了软件中潜藏的错误或需要增加新的功能或使软件适应外界环境的变化等情况出现时对软件进行修改。,4.软件过程模型,软件过程模型是软件开发全部过程、活动和任务的结构框架 也称软件开发模型或软件生存周期模型,软件过程模型,典型的软件过程模型有: 瀑布模型(waterfall model) 演化模型(evolutionary model) 增量模型(incremental model) 原型模型(prototyping model) 螺旋模型(spiral model) 喷泉模型(water fountain model) 基于构件的开发模型(component-ba
17、sed development model) 形式方法模型(formal methods model),瀑布模型,主要思想 软件开发过程与软件生命周期是一致的 相邻二阶段之间存在因果关系 需对阶段性产品进行评审,文档驱动,瀑布模型,优点 软件生命周期模型,使软件开发过程可以在分析、设计、编码、测试和维护的框架下进行; 软件开发过程具有系统性、可控性,克服了软件开发的随意性 。 缺点 缺乏灵活性,难以适应需求不明确或需求经常变化的软件开发 开发早期存在的问题往往要到交付使用时才发现,维护代价大,演化模型,演化模型适用于对软件需求缺乏准确认识的情况 演化模型的开发过程就是从构造初始的原型出发,逐步
18、将其演化成最终软件产品的过程。 在获取了一组基本的需求后,通过快速分析构造出该软件的一个初始可运行版本,称之谓原型(prototype),然后根据用户在试用原型的过程中提出的意见和建议、或者增加新的需求,对原型进行改造,获得原型的新版本,重复这一过程,最终得到令客户满意的软件产品。 典型的演化模型有:增量模型、原型模型、螺旋模型。,增量模型融合了瀑布模型的基本成分(重复地应用)和演化模型的迭代特征 增量模型强调每一个增量都发布一个可运行的产品,增量模型,增量模型,适用于: 需求经常变化的软件开发 市场急需而开发人员和资金不能在设定的市场期限之前实现一个完善的产品的软件开发 早期阶段使投资得到明
19、显回报 易于维护 要求软件具有开放式结构,原型模型,原型(prototype)是预期系统的一个可执行版本,它反映了系统性质(如功能、计算结果等)的一个选定的子集。一个原型不必满足目标软件的所有约束,其目的是能快速、低成本地构建原型。 原型方法从软件工程师与客户的交流开始,其目的是定义软件的总体目标,标识需求。然后快速制订原型开发的计划,确定原型的目标和范围,采用快速设计的方式对其建模,并构建原型。 被开发的原型应交付给客户试用,并收集客户的反馈意见,这些反馈意见可在下一轮迭代中对原型进行改进。在前一个原型需要改进,或者需要扩展其范围的时候,进入下一轮原型的迭代开发。,原型模型,原型模型,优点
20、通过与用户交互而得到验证,据此产生的规格说明文档正确描述用户需求 后续阶段发生错误的可能性也比较小 原型的快速建立可以加速软件开发过程,节约软件开发成本 缺点 只关注需求不注重系统内部结构 可能导致系统设计差、效率低,难于维护,螺旋模型,是瀑布模型和演化模型的结合,并增加了风险分析 螺旋模型沿着螺线旋转,在四个象限上分别表达四个方面的活动 制定计划 风险分析 工程实施 客户评估 螺旋模型指引的软件项目开发沿着螺线自内向外旋转,每旋转一圈,表示开发出一个更为完善的新软件版本。 多数情况下沿着螺线的活动会继续下去,自内向外,逐步延伸,最终得到所期望的系统。,螺旋模型,主要适应于内部开发的大规模软件
21、项目 风险驱动,要求软件开发人员具有丰富的风险评估经验和专业知识,喷泉模型适是合于面向对象开发的模型 体现迭代和无间隙特征 迭代:各开发活动常常重复工作多次,相关的功能在每次迭代中随之加入演进的系统 无间隙:开发活动之间不存在明显的边界,喷泉模型,支持软件复用(reuse) 利用预先包装好的软件构件(包括组织内部开发的构件和现存商品化构件COTS)来构造应用系统,基于构件的开发模型,领域工程的目的是构建领域模型、领域基准体系结构和可复用构件库 应用系统工程的目的是使用可复用构件组装应用系统。,形式方法模型,形式化方法(formal methods)是建立在严格数学基础上的一种软件开发方法。软件
22、开发的全过程中,从需求分析、规约、设计、编程、系统集成、测试、文档生成、直至维护各个阶段,凡是采用严格的数学语言,具有精确的数学语义的方法,都称为形式化方法。 形式化方法用严格的数学语言和语义描述功能规约和设计规约,通过数学的分析和推导,易于发现需求的岐义性、不完整性和不一致性,易于对分析模型、设计模型和程序进行验证。通过数学的演算,使得从形式化功能规约到形式化设计规约,以及从形式化设计规约到程序代码的转换成为可能。,思考,假设你要开发一个软件,它的功能是把73624.9385这个数开平方,所得到的结果应该精确到小数点后4位。一旦实现并测试之后,该产品将被抛弃。你打算选用哪种软件生命周期模型?
23、请说明你做出这样选择的理由。 假设你要为一家生产和销售长统靴的公司开发一个软件,该产品 将监控该公司的存货:跟踪从购买橡胶开始,到靴子生产,发货给各个连锁店,直至卖给顾客的全过程,你为这个项目选择生命周期时使用什么模型? 你为靴类连锁店开发的存货监控很受欢迎,你所在的软件开发公司决定把它重新写成一个通用的软件包,适用于各种生产并通过自己的连锁店销售产品的公司,因此,这个新产品必须是可移植的,并且应该能够很容易地适应新的运行环境,满足不同用户的需求,你在选择生命周期模型时使用的准则与第二题使用的准则有哪些不同?,敏捷软件开发( Agile ),软件开发的新挑战 快速的市场进入时间,要求高生产率
24、快速变化的需求 快速发展的技术 传统的软件开发方法 强调过程 强调文档 开发人员负担过重 称为重载(Heavyweight)方法,Agile方法的价值观,个人和交互高于过程和工具 可运行软件高于详尽的文档 与客户协作高于合同(契约)谈判 对变更及时做出反应高于遵循计划,Agile方法的指导原则,(1)最优先的是通过尽早地和不断地提交有价值的软件使客户满意 (2)欢迎变化的需求 (3)以几周到几个月为周期,尽快、不断地发布可运行软件 (4)在整个项目过程中,业务人员和开发人员必须天天一起工作 (5)以积极向上的员工为中心建立项目组,给予他们所需的环境和支持,对他们的工作予以充分的信任 (6)项目
25、组内效率最高、最有效的信息传递方式是面对面的交流 (7)测量项目进展的首要依据是可运行的软件 (8)敏捷过程提倡可持续的开发 (9) 应时刻关注技术上的精益求精和好的设计,以增强敏捷性 (10)简单化是必不可少的,这是尽可能减少不必要工作的艺术 (11)最好的构架、需求和设计出自于自我组织的团队 (12)团队要定期反思怎样才能更有效,并据此调整自己的行为,Agile方法的适用范围,适合采用Agile方法的情况: 需求不确定、易挥发(Volatile,意指今天的要求明天就不需要了) 有责任感和积极向上的开发人员 用户容易沟通并能参与,Agile的典型方法,Extreme Programming
26、(简称XP) SCRUM Crystal Methodologies (简称Crystal) Feature Driven Development(简称FDD) Dynamic Systems Development Methodology(简称DSDM) Adaptive Software Development(简称ASD) Pragmatic Programming等,XP方法,广泛用于需求模糊和挥发性强的场合 适用于10人以下项目组、开发地点集中的场合 4个价值观 交流(Communication) 简单(Simplicity) Just enough 思想 反馈(Feedback)
27、非正式的评审(走查,Walkthrough)、小发布等 勇气(Courage) 信任合作的同事,也相信自己;只有在绝对需要的时候才创建文档;让业务人员制定业务决策,技术人员制定技术决策;用可能的最简单的工具;相信程序员能制定设计决策,不需要给他们提供过多的细节等。 12个核心实践(P29-31),XP方法的12个核心实践,1.完整的团队(Whole Team) 所有的小组成员应在同一个工作地点工作 成员中必须有一个现场用户(On-site User)由他提出需求,确定开发优先级 通常还设一个“教练”(Coach)角色教练指导XP方法的实施,以及与外部的沟通和协调 2.计划对策(Planning
28、 Game)包括两类:发布计划和迭代(Iteration)计划 3. 系统比喻 (Metaphor)系统比喻是待开发软件的一个每个成员都熟悉的形象化比喻,相当于一个粗略的软件体系结构,4. 小发布(Small release)经常、不断地发布可运行的、具有商业价值的小软件版本,供现场用户评估或最终使用 5. 测试(testing)XP方法提倡测试优先,即先写测试后编代码(testing then coding) 6. 简单设计(Simple Design) 设计只考虑当前定义的功能而不考虑以后需求的变化 该设计是完成目前功能所需的最简洁的设计 7. 结对编程(Pair Programming)
29、一个程序员编程的同时,另一个程序员负责检查程序的正确性和可读性结对的伙伴可以动态调整 8. 设计改进(Design Improvement)在不影响程序的外部可见行为的情况下,按高内聚低耦合的原则对程序结构进行改进,保持代码简洁、无冗余,XP方法的12个核心实践,持续集成(Continuous Integration)每完成一个模块的开发(包括该模块的单元测试)后,立即将其组装到系统中,并进行集成测试,完成该集成测试后才能进行下一次集成 10. 代码全体共有(Collective code Ownership)团队中的任何人可以在任何时候修改系统任何位置上的任何代码团队的成员都可以参加模型的开
30、发,又有系统比喻、结对编程、编码标准、持续集成等实践,这些都为代码全体共有提供了支持 编码标准(Coding Standard)XP方法强调制订一个统一的编码标准,包括命名、注释、格式等编程风格 12. 可持续步调(Sustainable Pace)每周40小时工作制,XP方法的12个核心实践,XP方法的开发过程,1)探索阶段 探索阶段的主要工作是开发初始的用户故事(User Stories )和体系结构骨架(architecture spike)。 用户故事描述了系统高层的需求,它是制订发布计划的输入。 在探索阶段,试探找到系统中固定不变的部分(体系结构骨架),并找出一种形象的比喻,这种比喻
31、描述了你打算如何构建系统,起到概念框架的作用。 探索阶段还应根据用户故事编制相应的测试用例,供以后验收测试时使用。,2)计划阶段 计划阶段的任务是根据用户故事描述的需求、系统体系结构骨架和系统比喻来制订迭代计划和发布计划。 使用你最熟悉的形式为用户故事建模,这个模型描述了用户故事的任务以及这些任务之间的关系。 通常图形方式(可以是草图)比文字描述更直观。 尽可能精确地估算工作量,这是制订计划的重要依据。对于那些不能确切估算其工作量的难点部分,要进一步作分析,直至能确定其工作量估算。,3)迭代到发布阶段 迭代到发布阶段根据迭代和发布计划,开发满足指定用户故事需求的软件,并与前面已完成的软件版本集
32、成,得到软件的一个新版本。 根据在探索阶段编写的测试用例,进行验收测试。一旦发现错误或者通过验收测试想进入下一轮迭代时,就重复迭代开发的工作。 在这一阶段当客户提出新的用户故事,或者根据项目的进展情况认为有必要时,可以回到计划阶段,对迭代和发布计划做出修改或调整。,4)产品化阶段 产品化阶段的工作主要是确认迭代开发的软件已经做好进入产品化的准备。 在此阶段可进行更多的测试,如系统测试、负载测试、安装测试等。 另一个工作就是整理文档。虽然敏捷软件开发的价值观中强调“可运行软件高于详尽的文档”,但是,必要的文档仍是需要的。 可能要写的文档:系统文档操作文档支持文档操作文档,5)维护阶段 维护阶段涵盖了计划阶段、迭代到发布阶段和产品化阶段 通常这个阶段主要包括面向产品的活动,如系统的运行和支持。,6. CASE( Computer Aided Software Engineering)工具与环境,CASE工具是用来辅助计算机软件的开发、运行、维护、管理、支持过程中的活动或任务的软件 软件开发环境是支持软件产品开发的软件系统,由工具集和环境集成机制构成 环境集成机制主要有数据集成机制、控制集成机制、界面集成机制、方法与过程集成、平台继承,