软件工程徐汉川xhc@hit.edu.cn2014年9月11日软件工程第一章软件工程概论1-2软件工程核心思想1-2软件工程核心思想主要内容1软件工程的本质:不同抽象层次之间的映射与转换2软件工程所关注的目标3软件开发中的多角色4软件工程=昀佳实践5软件工程的四个核心理论概念软件工程1软件工程的本质1-2软件工程核心思想一个小例子你要开发一段程序,输入班级所有人的成绩,按成绩由高到低的次序进行排序;你该如何去做?方法1:直接写程序;方法2:先设计算法,然后再用程序语言实现;方法3:先建立数学模型,然后转换为算法,然后编程实现;现实问题成绩排序系统现实问题成绩排序系统特定排序算法现实问题成绩排序系统特定排序算法数学模型1-2软件工程核心思想映射与转换任何软件系统开发的共同本质在于:–从现实空间的需求到计算机空间的软件代码之间的映射与转换;现实空间的需求Business软件系统IT实现途径:映射与转换1-2软件工程核心思想单步映射与多步映射现实空间的需求Business软件系统IT单步映射中间状态1中间状态21/22/21/32/33/3问题:单步映射与多步映射的优缺点分别都是什么?1-2软件工程核心思想单步映射与多步映射现实空间的需求Business软件系统IT正确的实现途径实际的实现途径需求与软件实现的偏差1-2软件工程核心思想单步映射与多步映射现实空间的需求Business软件系统IT中间状态1中间状态2实际的实现途径正确的实现途径正确的实现途径实际的实现途径需求与软件实现的偏差需求与软件实现的偏差1-2软件工程核心思想软件工程的作用现实空间的需求Business软件系统IT中间状态1中间状态2需求与软件实现的偏差需求与软件实现的偏差软件工程的本质:用严格的规范和管理手段来缩小偏差,通过牺牲“时间”来提高“质量”。1-2软件工程核心思想软件工程的两个映射之一:概念映射概念映射:问题空间的概念与解空间的模型化概念之间的映射例如:–“学生”ClassStudent(No,Name,Dept,Grade)–“计算机学院大三学生张三”ObjectStudent(120310101,张三,计算机,大三)–“学生成绩”StructStudentScore(StudentNo,CourseNo,Score)–“张三的软件工程课成绩为85分”ZS_SE_SCORE(120310101,软件工程,85)1-2软件工程核心思想软件工程的两个映射之二:业务逻辑映射学生平均成绩算法1计算学生平均成绩科目+年级/班学生成绩文件映射之后的处理逻辑业务逻辑映射:问题空间的处理逻辑与解空间处理逻辑之间的映射例如:–计算某班学生的平均分数doublecalculateAverageScore(Struct[]scores){冒泡排序法;}1-2软件工程核心思想软件工程的作用为了实现以上两个映射,软件工程需要解决以下问题:–需要设置哪些抽象层次——单步映射?多步映射?几步?–每一抽象层次的概念、术语与表达方式——公式?图形?文字?–相邻的两个抽象层次之间如何进行映射——需要遵循哪些途径和原则?1-2软件工程核心思想软件工程:不同抽象层次之间的映射过程问题空间需求模型设计模型实现模型部署与运行模型需求建模语言设计建模语言编程语言部署与运行配置语言验证/确认软件(解)空间需求分析方法系统设计方法程序设计方法部署与维护方法1-2软件工程核心思想软件工程:不同抽象层次之间的映射过程需求分析:在一个抽象层上建立需求模型的活动,产生需求规约(RequirementSpecification),作为开发人员和客户间合作的基础,并作为以后开发阶段的输入。现实空间的需求需求规约软件设计:定义了实现需求规约所需的系统内部结构与行为,包括软件体系结构、数据结构、详细的处理算法、用户界面等,即所谓设计规约(DesignSpecification),给出了实现软件需求的软件解决方案。需求规约设计规约1-2软件工程核心思想软件工程:不同抽象层次之间的映射过程现实空间的需求需求规约设计规约代码现实空间的需求需求规约设计规约代码实现:由设计规约到代码的转换,以某种特定的编程语言,对设计规约中的每一个软件功能进行编码。设计规约代码验证/确认:一种评估性活动,确定一个阶段的产品是否达到前阶段确立的需求(verification),或者确认开发的软件与需求是否一致(validation)。BadsmellGoodsmell软件工程2.2软件工程所关注的目标1-2软件工程核心思想软件工程所关注的对象产品:各个抽象层次的产出物;过程:在各个抽象层次之间进行映射与转换;软件工程具有“产品与过程二相性”的特点,必须把二者结合起来去考虑,而不能忽略其中任何一方。软件需求软件系统软件工程方法1-2软件工程核心思想软件工程所关注的目标功能性需求(FunctionalRequirements):软件所实现的功能达到它的设计规范和满足用户需求的程度–功能1、功能2、…、功能n。–完备性:软件能够支持用户所需求的全部功能的能力;–正确性:软件按照需求正确执行任务的能力;–健壮性:在异常情况下,软件能够正常运行的能力•容错能力;•恢复能力;——正确性描述软件在需求范围之内的行为,而健壮性描述软件在需求范围之外的行为。–可靠性:在给定的时间和条件下,软件能够正常维持其工作而不发生故障的能力。1-2软件工程核心思想软件工程所关注的目标非功能性需求(Non-FunctionalRequirements):系统能够完成所期望的工作的性能与质量–效率:软件实现其功能所需要的计算机资源的大小,“时间-空间”;–可用性:用户使用软件的容易程度,用户容易使用和学习;–可维护性:软件适应“变化”的能力,系统很容易被修改从而适应新的需求或采用新的算法、数据结构的能力;–可移植性:软件不经修改或稍加修改就可以运行于不同软硬件环境(CPU、OS和编译器)的能力;–清晰性:易读、易理解,可以提高团队开发效率,降低维护代价;–安全性:在对合法用户提供服务的同时,阻止未授权用户的使用;–兼容性:不同产品相互交换信息的能力;–经济性:开发成本、开发时间和对市场的适应能力。–商业质量:上市时间、成本/受益、目标市场、与老系统的集成、生命周期长短等。1-2软件工程核心思想课堂讨论针对特定的NFR特性,根据你的经验,阐述其典型的设计决策,分析你所给出的设计决策为何有用,如何验证该NFR可以达到期望?–完备性、正确性、健壮性、可靠性、etc–效率、可用性、可维护性、可移植性、清晰性、安全性、兼容性、经济性、商业质量、etc1-2软件工程核心思想当系统不再提供其规格说明中所描述的服务时,就出现了系统故障,即表示系统的可用性变差。关注的方面:–如何检测系统故障、故障发生的频度、出现故障时的表现、允许系统有多长时间非正常运行、如何防止故障发生、发生故障后如何消除故障、等等。典型NFR举例:可用性(availability)1-2软件工程核心思想典型NFR举例:可用性(availability)错误检测(FaultDetection)–命令-响应机制(ping-echo)、心跳(heartbeat)机制、异常机制(exception);错误恢复(Recovery)–表决、主动冗余(热重启)、被动冗余(暖重启/双冗余/三冗余)、备件(spare);–Shadow操作、状态再同步、检查点/回滚;错误预防(Prevention)–从服务中删除、事务、进程监视器。1-2软件工程核心思想典型NFR举例:可修改性(modifiability)可以修改什么——功能、平台(HW/OS/MW)、外部环境、质量属性、容量、等;何时修改——编译期间、构建期间、配置期间、执行期间;谁来修改——开发人员、昀终用户、实施人员、管理人员;修改的代价有多大?修改的效率有多高?1-2软件工程核心思想典型NFR举例:可修改性(modifiability)目标:减少由某个修改所直接/间接影响的模块的数量;常用决策:–高内聚/低耦合、固定部分与可变部分分离、抽象为通用模块、变“编译”为“解释”;–信息隐藏、保持接口抽象化和稳定化、适配器、低扇出;–推迟绑定时间——运行时注册、配置文件、多态、运行时动态替换;1-2软件工程核心思想典型NFR举例:安全性(security)安全性:系统在向合法用户提供服务的同时,组织非授权使用的能力–未经授权试图访问服务或数据;–试图修改数据或服务;–试图使系统拒绝向合法用户提供服务;关注点:抵抗攻击、检测攻击、从攻击中恢复。1-2软件工程核心思想典型NFR举例:安全性(security)抵抗攻击——对用户进行身份认证、对用户进行授权、维护数据的机密性、限制暴露的信息、限制访问;检测攻击——模式发现、模式匹配;从攻击中恢复——将服务或数据回复到正确状态、维持审计追踪。1-2软件工程核心思想不同目标之间的关系——折中(tradeoff)不同类型的软件对质量目标的要求各有侧重:–实时系统:侧重于可靠性、效率;–生存周期较长的软件:侧重于可移植性、可维护性;多个目标同时达到昀优是不现实的:目标之间相互冲突软件工程2.3软件开发中的多角色1-2软件工程核心思想软件开发中的多角色在软件开发过程中同样需要多种角色之间紧密协作,才能高质量、高效率的完成任务。顾客企业(Client,甲方):–决策者(CxO)、终端用户(EndUser)、系统管理员;软件开发公司(Supplier,乙方):–决策者(CxO);–软件销售与市场人员;–咨询师、需求分析师;–软件架构师、软件设计师;–开发人员:开发经理/项目经理、程序员;–维护人员。1-2软件工程核心思想视角不同,需求各有不同易集成性易集成性易用性易用性功能性功能性价格价格开发成本开发成本按时交付按时交付性能性能稳定性与可维护性稳定性与可维护性易调试性易调试性可修改性可修改性可测试性可测试性结构清晰性结构清晰性易安装性易安装性终端用户终端用户销售人员销售人员开发经理开发经理开发人员开发人员系统管理员系统管理员维护人员维护人员顾客顾客不同的角色,他们所关心的非功能需求都有哪些?不同角色的关注点之间,是否有重叠的情况?不同角色的关注点之间,是否有冲突的情况?高度决定视野角度改变观念尺度把握人生1-2软件工程核心思想视角不同,需求各有不同Logical/DesignView(逻辑/设计视图)ImplementationView(开发视图)ProcessView(进程视图)Deployment/PhysicalView(配置/物理视图)UsecaseView(用例视图)昀终用户:功能需求系统集成人员:运行时性能、可扩展性、吞吐量等编程人员:静态软件模块(源代码、数据文件)的组织与管理系统部署人员:运行时系统拓扑、安装、通信等架构师:体系结构的设计与发现一人包打天下团队协作完成任务软件工程2.4软件工程=最佳实践1-2软件工程核心思想软件工程=最佳实践软件系统的复杂性、动态性使得:–高深的软件理论在软件开发中变得无用武之地;–即使应用理论方法来解决,得到的结果也往往难以与现实保持一致;因此,软件工程被看作一种实践的艺术:–做过越多的软件项目,犯的错误就越少,积累的经验越多,随后作项目的成功率就越高;–对新手来说,要通过多实践、多犯错来积累经验,也要多吸收他人的失败与教训与成功的经验。——当你把所有的错误都犯过之后,你就是正确的了。1-2软件工程核心思想软件工程=最佳实践在软件工程师试图解决“软件危机”的过程中,总结出一系列日常使用的概念、原则、方法和开发工具;这些实践经验经过长期的验证,已经被证明是更具组织性、更高效、更容易获得成功;大部分的这些实践都没有理论基础。1-2软件工程核心思想最佳实践的例子软件工程的七条原理(B.W.Boehm,1983)–用分阶段的生命周期计划严格管理–坚持进行阶段评审–实行严格的产品控制