还剩48页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
软件工程教学课件欢迎参加本课程!本软件工程课程旨在为学生提供全面的软件开发方法论和实践知识在当今数字时代,软件工程已成为现代工业的基础支柱,中国软件产业规模已超过8万亿元,显示了该领域的巨大发展潜力和市场需求本课程将系统讲解软件开发生命周期各阶段的理论与实践,包括需求分析、系统设计、编码实现、测试验证及维护优化等关键环节,帮助学生掌握规范化的软件开发方法软件工程的定义与历史软件工程是应用系统化、规范化、可量化的方法来开发、运行和维护软件的工程学科它将工程化的原理和方法应用于软件开发过程,以解决软件危机并提高软件质量软件工程这一术语首次出现在1968年的北大西洋公约组织NATO会议上当时,软件行业面临着所谓的软件危机——软件开发项目普遍超预算、超时限,且质量难以保证这促使人们开始思考如何将工程方法应用于软件开发过程随后几十年,软件工程经历了从结构化方法到面向对象方法,再到敏捷开发的演变历程,每一次变革都旨在更好地应对不断增长的软件复杂性和市场需求从1968年至今,软件工程历经了多次方法论的重大变革,包括结构化编程、面向对象设计、组件化开发、敏捷方法以及如今的DevOps等,每次变革都带来了软件开发效率和质量的提升软件与硬件的区别硬件特性硬件是实体存在的物理组件,由电子元件构成•有形可见,具有物理属性•一经制造,结构相对固定•随时间会发生物理磨损•功能改变通常需要替换实体部件•生产成本高,批量生产软件特性软件是逻辑实体,由指令和数据组成•无形,只能通过运行效果间接感知•高度可变性,容易修改和扩展•不会磨损,但会逐渐过时或出现缺陷•功能改变通过代码修改实现•主要成本在开发阶段,复制成本几乎为零软件工程目标提高软件质量提高生产效率通过规范化开发流程和标准,减少缺陷,增强可通过先进工具和方法,优化开发流程,提高团队靠性,确保软件满足用户期望协作效率,缩短交付周期•减少软件缺陷和错误•优化开发流程和工作方式•提高系统可靠性和稳定性•提高团队协作和沟通效率•改善用户体验和满意度•缩短软件交付周期降低维护成本降低开发成本通过良好的设计和文档,提高代码可维护性,降采用合理的架构设计和代码复用,降低开发和后低后期维护难度和成本续维护的总体成本•提高系统可维护性•减少不必要的功能开发•降低修复缺陷的难度•提高代码复用率•简化系统升级和扩展•优化资源分配软件的本质与特点软件的基本特点复杂度高现代软件系统通常包含数百万行代码,具有大量模块和复杂的交互关系,这种复杂性远超过许多物理工程产品软件的复杂性不仅体现在规模上,还体现在逻辑结构的复杂程度上不可见性软件是无形的逻辑产品,其内部结构和运行机制对用户和开发者都不直接可见,这增加了理解和维护的难度我们只能通过间接方式(如代码、文档、运行效果)来感知软件易变性软件修改成本相对较低,用户期望软件能够持续变化以适应新需求,这导致软件在整个生命周期中不断演化大多数软件系统的50%以上代码是在初始版本发布后添加的一次性开发每个软件项目往往具有独特性,很少有完全相同的软件系统,这使得经验和最佳实践的积累和复用变得困难即使是相似的系统,其内部实现也可能完全不同软件系统的复杂性和不可见性使得软件工程必须采用系统化方法来管理开发过程上图展示了现代软件系统的复杂架构,这种复杂性需要通过规范的工程方法来控制信息化与软件工程的关系现代信息化工程与软件工程有着密不可分的关系信息化是将信息技术应用于各行各业以提高效率和创新能力的过程,而高质量的软件系统是实现信息化的核心支撑电子政务政府部门通过软件系统实现行政管理数字化,提供在线公共服务,简化办事流程,提高政府透明度和服务效率这些系统需要高度安全、可靠的软件工程实践支持智慧交通利用传感器、大数据和人工智能技术优化交通流量,减少拥堵,提高交通安全性这些复杂系统的开发和维护离不开先进的软件工程方法和技术智慧医疗医疗信息系统、远程诊疗、电子病历等软件系统改变了医疗服务模式,提高了医疗资源利用效率和服务质量,这些系统的开发需要严格遵循软件工程规范软件工程的学科体系软件工程作为一个综合性学科,涵盖了软件开发全生命周期的各个方面IEEE计算机学会IEEE-CS和ACM联合制定的《软件工程知识体系指南》SWEBOK将软件工程划分为多个知识领域需求工程收集、分析、规格说明和验证软件需求的过程包括需求获取、分析、规格说明和验证等活动软件设计定义软件结构、组件、接口和其他特性的过程包括架构设计、详细设计等活动软件构建通过编码、验证、单元测试和集成创建工作软件的详细过程包括编程风格、构建实践等软件测试评估和改进软件质量的活动,包括测试计划、测试用例设计、测试执行和结果分析等软件维护软件交付后的修改活动,包括纠错性维护、适应性维护、完善性维护和预防性维护等软件生命周期总体介绍软件生命周期Software LifeCycle是指软件从概念形成到最终退役的整个过程理解软件生命周期对于有效管理软件项目至关重要软件生命周期通常分为四个主要阶段开发阶段从需求分析开始,经过设计、编码、测试等活动,最终产生可交付的软件产品这个阶段通常占用大量资源,是软件工程的核心阶段部署阶段将开发完成的软件安装到目标环境中,配置系统参数,培训用户,并进行初始数据迁移和系统切换运行阶段软件生命周期中各个阶段的活动并非完全线性,而是可能重叠和迭代的现代软件开发方法软件在生产环境中正常运行,同时进行必要的维护活动,包括修复缺陷、适应环强调快速迭代和持续改进,使得开发周期更加灵活和适应变化境变化和增强功能这是软件生命周期中最长的阶段软件生命周期管理的目标是确保软件在其整个生命周期内保持高质量、高效率和满足用户需求,同时控制成本和风险淘汰阶段当软件无法满足用户需求或维护成本过高时,进行系统退役和数据迁移,完成软件生命周期的闭环瀑布模型瀑布模型Waterfall Model是最早的软件开发过程模型之一,由WinstonW.Royce于1970年提出它的特点是将软件开发过程划分为明确的、顺序的阶段,每个阶段完成后才能进入下一个阶段瀑布模型的特点•线性顺序执行各个阶段•每个阶段有明确的输入和输出文档•回溯难度大,修改成本高•适合需求明确、变化小的项目•流程简单,易于管理和控制瀑布模型的局限性尽管瀑布模型有其局限性,但在一些特定领域仍有应用价值,如嵌入式系统、•不适应需求变化航空航天、军事系统等对安全性和可靠性要求极高的领域这些领域通常需求相对稳定,变更成本高,因此更适合采用瀑布模型•风险集中在后期•用户反馈滞后如今,即使是使用瀑布模型的项目,也通常会对其进行改进,如引入适当的反•难以应对复杂项目馈机制和适度的迭代,以弥补原始瀑布模型的不足增量模型与迭代模型增量模型Incremental Model迭代模型Iterative Model增量模型将软件系统分解为多个增量,每个增量都实现系统的一部分功能每迭代模型通过多次迭代来开发整个系统,每次迭代都是对系统的改进和完善,个增量都经历完整的开发周期,最终集成为完整系统而不是添加新功能•特点先开发核心功能,再逐步添加新功能•特点多次迭代完善整个系统,逐步提高质量•优势用户可以早期使用部分功能,降低集成风险•优势及早发现问题,降低风险,适应需求变化•适用系统可自然分解为独立功能模块的项目•适用需求不明确、技术风险高的项目•挑战增量间接口管理和版本控制复杂•挑战需要高效的变更管理和配置管理两种模型适用于规模较大、需求迭代的项目场合现代软件开发方法如统一过程RUP和敏捷方法通常结合了增量和迭代的特点,形成更加灵活和适应性强的开发模型螺旋模型螺旋模型Spiral Model是由Barry Boehm于1988年提出的,是一种风险驱动的软件开发过程模型它将原型实现的迭代特性与瀑布模型的系统化和可控性相结合,特别适合大型、复杂、高风险的软件项目螺旋模型的四个象限活动规划确定目标、约束和替代方案风险分析评估替代方案,识别和解决风险开发开发和验证本轮迭代的产品评估评审成果并规划下一轮迭代螺旋模型的每一轮都包含这四个活动,随着项目的进展,螺旋从内向外扩展,每轮迭代都会增加项目的完整性和成熟度螺旋模型的特点•风险驱动优先处理高风险因素•强调原型通过原型验证决策•渐进细化从粗略到详细,逐步完善系统•集成评审每轮迭代结束时进行评审•灵活性可以整合其他开发模型的元素螺旋模型特别适合具有高风险、高复杂性的大型系统开发,如航空航天系统、国防系统等然而,它也需要较高的风险评估和管理能力,实施成本较高,不适合小型或低风险项目敏捷开发()思想Agile敏捷开发是一种以人为核心、迭代、循序渐进的开发方法它的核心思想体现在2001年发布的《敏捷宣言》中个体和互动高于流程和工具工作的软件高于详尽的文档客户合作高于合同谈判响应变化高于遵循计划敏捷开发的核心特点•小团队、高沟通效率•短周期迭代(通常2-4周)•持续交付可工作的软件•拥抱变化,快速响应需求变更•持续改进开发过程•强调技术卓越和简洁设计主流敏捷方法Scrum最流行的敏捷框架,以Sprint为周期,包含产品待办列表、Sprint计划会议、每日站会、Sprint评审和回顾等关键实践极限编程XP强调编程实践的方法,包括测试驱动开发、持续集成、配对编程、简单设计等技术实践看板Kanban源自精益生产的方法,通过可视化工作流程、限制在制品数量、管理流程来优化交付软件开发原则总览软件开发原则是指导软件设计和编码的基本准则,它们帮助开发人员创建高质量、易维护和易扩展的软件系统以下是一些核心软件开发原则SOLID原则DRY原则由Robert C.Martin提出的面向对象设计五Dont RepeatYourself不要重复自己大原则强调通过抽象和模块化消除代码重复,提高维Single Responsibility单一职责护性和一致性当修改某个功能时,只需要修改一处代码,而不是多处Open/Closed开闭原则Liskov Substitution里氏替换Interface Segregation接口隔离Dependency Inversion依赖倒置KISS原则Keep ItSimple,Stupid保持简单强调设计应该尽可能简单,避免不必要的复杂性简单的设计更容易理解、测试和维护,也更不容易出错这些原则不是绝对的规则,而是设计决策的指导方针在实际应用中,开发人员需要根据具体情况平衡这些原则,有时甚至需要在不同原则之间做出权衡开闭原则()OCP开闭原则定义软件实体(类、模块、函数等)应该对扩展开放,对修改关闭开闭原则是SOLID原则中最核心的一条,由Bertrand Meyer在1988年提出它的本质是通过抽象和多态等机制,实现在不修改现有代码的情况下扩展系统功能实现方式•使用抽象类和接口•利用多态性•采用设计模式(如策略模式、装饰器模式等)•依赖注入和控制反转开闭原则的优势降低维护风险修改现有代码可能引入新的缺陷,而扩展新代码风险较小提高复用性设计遵循开闭原则的模块更容易被复用增强可读性代码结构更清晰,意图更明确支持并行开发不同团队可以在同一个稳定基础上开发不同的扩展开闭原则是软件工程中追求的一种理想状态,在实际应用中需要权衡开发成本和未来扩展的可能性过度设计可能导致系统过于复杂,反而增加维护难度单一职责原则()SRP单一职责原则定义违反SRP的症状一个类应该只有一个引起它变化的原因•类过于庞大,方法众多•类的方法涉及多个业务领域单一职责原则是SOLID原则中的第一条,由Robert C.Martin提出它强调每个模•修改一个功能可能影响其他不相关功能块或类应该只负责软件功能的一个部分,只完成一个明确的任务•类的内聚性低,耦合性高判断标准遵循SRP的好处如果可以想到多于一个的理由来修改一个类,那么这个类就具有多个职责,应该被拆分为多个类,每个类只负责一个职责提高内聚性类的功能更加集中和单一降低耦合度减少类之间的相互依赖提高可维护性变更影响范围小,降低修改风险提高可测试性职责单一的类更容易进行单元测试提高可复用性单一职责的类更容易在不同上下文中复用依赖倒置原则()DIP依赖倒置原则定义高层模块不应该依赖低层模块,两者都应该依赖抽象抽象不应该依赖细节,细节应该依赖抽象依赖倒置原则是SOLID原则中的第五条,由Robert C.Martin提出它的核心思想是通过抽象来解耦高层模块和低层模块,使系统更加灵活和可扩展传统依赖关系在传统的依赖关系中,高层模块直接依赖低层模块,形成自上而下的依赖结构这种结构的问题在于当低层模块变化时,高层模块也必须跟着变化,导致系统难以维护和扩展倒置的依赖关系在依赖倒置的结构中,高层模块和低层模块都依赖于抽象接口这种结构的优势在于低层模块的变化不会影响高层模块,只要接口保持稳定,系统就能保持稳定接口隔离、迪米特法则接口隔离原则ISP迪米特法则LoD客户端不应该被迫依赖于它不使用的方法一个对象应该对其他对象有最少的了解接口隔离原则强调接口应该小而精,而不是大而全一个类对另一个类的依赖应该建立在最小的接口上迪米特法则也称为最少知道原则,它要求一个对象只与直接的朋友通信,而不与陌生人通信实现方式实现方式•将臃肿的接口分解为多个特定的小接口•只与直接关联的对象通信•接口应该只包含客户端需要的方法•减少对象之间的依赖关系•避免胖接口,即包含太多方法的接口•避免知道太多导致的紧耦合•使用中介者模式等设计模式降低对象间的直接依赖项目需求分析需求分析是软件开发生命周期中至关重要的阶段,它决定了要做什么,而不是怎么做高质量的需求分析能够显著降低后期变更成本和项目风险需求获取通过访谈、问卷、观察、头脑风暴等方式从用户和相关方收集需求信息•用户访谈和调查•现有系统分析•业务流程分析•市场调研和竞品分析需求分析对收集到的需求进行分析、理解、分类和优先级排序,确保需求的完整性、一致性和可行性•功能性需求与非功能性需求分类•需求优先级排序(如MoSCoW方法)•需求冲突识别与解决•需求依赖关系分析需求规格说明将分析后的需求形成正式文档,作为后续设计和开发的基础•软件需求规格说明书SRS•用例描述和用例图•用户故事User Story•原型和界面模型需求验证确保需求文档准确反映用户需求,并且需求本身是正确、完整和一致的•需求评审会议•原型验证•可追溯性分析•形式化验证方法需求建模工具需求建模工具帮助分析人员和开发人员更清晰地理解和表达系统需求,促进沟通和共识达成以下是常用的需求建模工具UML图表用例图描述系统功能和用户(参与者)的交互活动图描述业务流程和算法的控制流时序图描述对象之间的消息交互和时间序列状态图描述对象在生命周期中的状态变化非UML工具数据流图DFD描述系统中数据的流动实体关系图ERD描述数据实体及其关系业务流程建模标注BPMN描述业务流程原型工具创建用户界面原型上图是一个用例图示例,展示了系统的主要功能和用户角色用例图是最常用的需求建模工具之一,它直观地表达了谁使用系统做什么软件设计基础软件设计是将需求转化为可实现的规格说明的过程,它关注系统的结构、组件、接口和其他特性良好的软件设计是构建高质量软件的基础模块化Modularity将系统分解为相对独立的模块,每个模块完成特定功能模块化设计的核心是高内聚、低耦合,即模块内部元素之间关系紧密,模块之间依赖关系最小•降低系统复杂度,使大系统易于理解和管理•支持并行开发,提高开发效率•提高可维护性和可重用性抽象Abstraction抽象是通过识别对象的核心特性而忽略细节的过程在软件设计中,抽象帮助我们专注于问题的本质,而不被实现细节分散注意力•数据抽象定义数据类型及其操作•过程抽象定义函数签名而隐藏实现•控制抽象封装复杂的控制结构信息隐藏Information Hiding信息隐藏原则要求模块的内部实现细节对外部不可见,只通过定义良好的接口与外部交互这一原则由David Parnas于1972年提出•减少模块间依赖,增强系统稳定性•支持独立修改,降低变更影响范围•提高安全性,防止非法访问内部数据面向对象与面向过程面向对象设计以对象为中心,将数据和操作封装在一起;而面向过程设计以流程和功能为中心,将数据和操作分离两种范式各有优势,适用于不同类型的问题•面向对象适合模拟现实世界、变化频繁的系统•面向过程适合数据处理、算法为主的系统•现代系统通常混合使用两种范式简介UML统一建模语言Unified ModelingLanguage,UML是一种用于可视化、规约和构建软件系统的标准化建模语言它提供了一套标准符号和图表,用于描述软件系统的各个方面UML的历史UML由Grady Booch、James Rumbaugh和Ivar Jacobson(被称为三剑客)于1990年代中期开发,并于1997年被对象管理组OMG采纳为标准目前最新版本为UML
2.
5.1(2017年)UML的九大图表分类结构图类图、对象图、组件图、部署图、包图、复合结构图行为图用例图、活动图、状态机图交互图序列图、通信图、时序图、交互概览图常用UML工具Rational RoseIBM的专业UML工具,功能强大StarUML开源的UML建模工具,界面友好Visual Paradigm全功能UML工具,支持代码生成Lucidchart基于Web的图表工具,协作能力强Draw.io免费在线图表工具,支持基本UML图软件体系结构软件体系结构(Software Architecture)是系统的骨架,它定义了系统的高层结构,包括主要组件、它们之间的关系以及与外部环境的交互方式选择合适的架构风格对系统的质量、性能和可维护性有重大影响分层架构将系统分为多个水平层,每层只依赖于其下层典型如三层架构(表现层、业务逻辑层、数据访问层)优点是关注点分离、易于理解;缺点是可能引入性能开销微服务架构将应用拆分为一组小型服务,每个服务运行在自己的进程中,通过轻量级机制通信优点是独立部署、技术多样性;缺点是分布式系统复杂性单体架构将所有功能模块打包为单个应用程序优点是开发简单、部署方便;缺点是随着规模增长变得难以维护和扩展适合小型应用或初创阶段事件驱动架构组件通过事件的生产、检测和消费进行通信优点是松耦合、高扩展性;缺点是调试和测试复杂适合需要高响应性的系统选择架构风格应考虑系统规模、性能需求、团队技能、开发和维护成本等因素现代系统通常采用混合架构,结合多种风格的优点设计模式基础设计模式是软件设计中常见问题的典型解决方案,它们是经过反复验证的设计经验的总结设计模式提供了一种共享的词汇表,帮助开发人员更有效地沟通和解决问题设计模式的分类Gang ofFourGoF在《设计模式可复用面向对象软件的基础》一书中定义了23种经典设计模式,分为三大类创建型模式处理对象创建机制,增加灵活性和代码复用结构型模式关注类和对象的组合,形成更大的结构行为型模式关注对象之间的通信和责任分配常用设计模式示例单例模式Singleton确保一个类只有一个实例,如日志记录器工厂模式Factory定义创建对象的接口,让子类决定实例化哪个类观察者模式Observer定义对象间一对多的依赖关系,当对象状态改变时通知所有依赖者策略模式Strategy定义一系列算法,使它们可以互相替换MVC模式将应用分为模型、视图和控制器,实现关注点分离设计模式不是银弹,过度或不适当使用可能导致系统过于复杂优秀的开发人员知道何时应用设计模式,何时采用更简单的解决方案面向对象设计实例分析Java课程选课系统架构示例以下是一个简化的课程选课系统的面向对象设计示例,展示了主要类、关系和设计模式的应用领域模型层包含系统的核心业务实体和关系学生Student类包含学号、姓名、年级等属性课程Course类包含课程编号、名称、学分、容量等属性教师Teacher类包含工号、姓名、职称等属性选课记录Enrollment类关联学生和课程,包含成绩等属性业务服务层实现业务逻辑和操作选课服务EnrollmentService处理选课、退课、查询等操作学生服务StudentService处理学生信息管理课程服务CourseService处理课程信息管理成绩服务GradeService处理成绩录入和统计控制层处理用户请求和响应选课控制器EnrollmentController处理选课相关的Web请求学生控制器StudentController处理学生相关的Web请求课程控制器CourseController处理课程相关的Web请求认证控制器AuthController处理用户登录和权限验证编码规范与开发环境编码规范的重要性编码规范是一系列指导性建议,旨在提高代码的可读性、一致性和可维护性统一的编码风格可以•提高代码可读性,降低理解成本•减少错误,提高代码质量•便于团队协作和代码评审•简化维护和重构工作常见编码规范Java GoogleJava Style、Oracle JavaCode ConventionsPythonPEP
8、Google PythonStyle GuideJavaScriptAirbnb JavaScriptStyle Guide、Google JavaScriptStyle GuideC++Google C++Style Guide、LLVM CodingStandards主流开发环境Java开发环境IntelliJ IDEA功能丰富、智能提示强大的Java IDEEclipse开源、插件丰富的Java开发平台Maven/Gradle主流的Java项目构建工具Python开发环境PyCharm专业的Python IDE,提供全面的开发支持VS Code+Python扩展轻量级但功能强大的编辑器Jupyter Notebook交互式Python开发环境,适合数据分析版本管理与协作Git基础命令团队分支管理模型Git是当前最流行的分布式版本控制系统,以下是一些基础命令GitFlow一种严格的分支管理模型,包含主分支master、开发分支develop、功能分支feature、发布分支release和热修复分支hotfix适合有计划的发布周期#初始化仓库git init#克隆远程仓库git clone[url]#添加文件到暂存区git add[file]#提交更改git commit-m commitGitHub Flow简化的工作流,只有主分支main和功能分支feature功能开发完成后通过Pull Request合并到主分支适合持续部署message#查看状态git status#查看提交历史git log#创建分支git branch[branch-name]#切换分支git checkout的项目[branch-name]#合并分支git merge[branch-name]#推送到远程仓库git pushorigin[branch-name]#从远程仓库拉取gitpull origin[branch-name]Gitlab Flow结合了GitFlow和GitHubFlow的特点,增加了环境分支如production、staging的概念适合需要多环境部署的项目Trunk BasedDevelopment所有开发者直接在主干trunk上工作,通过短周期提交和功能开关控制功能发布适合CI/CD实践的团队持续集成与自动化构建持续集成Continuous Integration,CI是一种软件开发实践,团队成员频繁地将代码集成到共享仓库中,每次集成都通过自动化构建和测试来验证,从而尽早发现集成错误持续集成的核心实践•维护单一的源代码仓库•自动化构建过程•自动化测试•每天多次提交代码到主干•每次提交都触发构建•保持构建快速•在生产环境克隆上测试•让构建结果对所有人可见•自动化部署主流CI/CD工具Jenkins开源的自动化服务器,支持构建、部署和自动化任务基本流程单元测试与TDD单元测试基础测试驱动开发TDD单元测试是对软件中最小可测试单元(通常是方法或函数)进行验证的测试良好的单元测试应该是TDD是一种开发实践,要求在编写功能代码之前先编写测试代码TDD的工作流程是自动化可以自动执行,无需人工干预红色Red编写一个失败的测试,描述期望的功能独立不依赖于其他测试,可以单独运行绿色Green编写最简单的代码使测试通过可重复多次运行结果一致重构Refactor在保持测试通过的前提下,改进代码质量快速执行时间短,通常毫秒级TDD的优势明确测试目的清晰,结果明确•确保代码有足够的测试覆盖率常用单元测试框架•引导开发者关注需求和接口设计JUnit Java最流行的单元测试框架•减少调试时间,提早发现问题•鼓励简单设计和模块化@Testpublic voidtestAdd{Calculator calc=new Calculator;•提供安全网,支持持续重构assertEquals5,calc.add2,3;}•产生自文档化的测试pytest Python的功能强大的测试框架def test_add:calc=Calculator assertcalc.add2,3==5集成测试与系统测试集成测试系统测试集成测试是验证软件各个组件或模块之间交互是否正常的测试它关注的是组系统测试是对整个软件系统进行的端到端测试,验证系统是否满足需求规格说件之间的接口和通信明中的功能和非功能需求集成测试策略系统测试类型自底向上Bottom-Up先测试底层模块,再逐步集成上层模块功能测试验证系统的功能是否符合需求自顶向下Top-Down先测试顶层模块,使用桩模块stub模拟底层模块性能测试评估系统在不同负载下的响应能力压力测试确定系统的极限和崩溃点大爆炸Big Bang所有模块一次性集成测试可用性测试评估系统的易用性三明治Sandwich结合自顶向下和自底向上的混合策略安全测试检查系统的安全漏洞接口测试兼容性测试验证系统在不同环境下的工作情况恢复测试验证系统从故障中恢复的能力接口测试是集成测试的一种,专注于验证系统对外提供的API或服务接口的正确性常用工具包括Postman、SoapUI、REST Assured等软件质量特性软件质量是软件产品满足明确和隐含需求的能力ISO/IEC25010标准定义了软件产品质量的八个主要特性,每个特性又包含若干子特性功能适合性性能效率软件提供满足用户需求的功能的程度软件性能相对于所用资源的程度•功能完备性功能覆盖所有指定任务•时间行为响应和处理时间•功能正确性提供正确结果的精度•资源利用率使用资源的类型和数量•功能适当性功能促进特定任务的程度•容量产品和系统的最大限制安全性兼容性软件保护信息和数据的程度软件在共享环境中与其他产品交换信息的能力•机密性防止未授权访问数据•完整性防止未授权修改数据•共存性与其他软件共享资源•不可否认性证明操作或事件已发生•互操作性与其他系统交换信息•责任性能够追踪实体的行为可靠性可用性5软件在指定条件下执行指定功能的程度软件被指定用户有效、高效和满意地使用的程度•成熟性在正常操作下满足需求•可学习性容易学习使用产品•可用性系统可操作和可访问的程度•操作性产品易于操作和控制•容错性硬件或软件故障时继续运行•用户错误防护防止用户出错的能力•可恢复性故障后恢复数据和状态的能力代码质量保障代码评审Code Review代码评审是一种系统性检查代码的过程,旨在发现错误、改进代码质量,并确保代码符合项目标准代码评审的类型正式评审按照固定流程进行的全面评审,如走查、审查会议轻量级评审更灵活的评审形式,如结对编程、随机评审工具辅助评审通过代码评审工具进行,如GitHub PullRequest、GitLab MergeRequest代码评审的最佳实践•小批量提交代码,便于评审•使用检查清单指导评审过程•关注设计和功能,而不仅是格式•提供建设性反馈,避免个人攻击•将评审作为学习机会,而非批评会静态分析工具静态分析工具通过分析源代码而不执行它来发现潜在问题,如bug、安全漏洞、代码气味和违反编码标准的情况常用静态分析工具SonarQube多语言支持的代码质量平台,可分析代码问题、测试覆盖率、重复代码等ESLint JavaScript代码检查工具,可自定义规则Checkstyle Java代码风格检查工具PMD源代码分析器,可检测常见编程缺陷FindBugs/SpotBugs Java字节码静态分析工具Pylint Python代码分析工具软件质量保证机制质量保证QA与质量控制QC质量控制活动质量保证Quality Assurance是一种预防性活动,专注于过程改进,确保产•各级测试(单元、集成、系统、验收)品开发过程符合质量标准QA回答的是我们是否正确地构建系统?•代码评审和检查质量控制Quality Control是一种检测性活动,专注于识别产品中的缺陷,•静态和动态分析确保产品符合质量要求QC回答的是我们是否构建了正确的系统?•缺陷跟踪和管理质量保证活动•质量门控和发布标准质量双路径方法•建立和维护质量标准和流程•项目审计和流程评估有效的质量管理应该结合QA和QC两个方面•培训和指导团队遵循质量标准
1.QA建立预防缺陷的过程和标准•过程改进和最佳实践推广
2.QC通过测试和评审发现缺陷•质量度量和报告
3.根据QC的反馈,QA改进过程以预防类似缺陷
4.形成持续改进的循环常用测试类型白盒测试黑盒测试白盒测试White BoxTesting是一种测试方法,测试人员了解系统的内部结构和代码实现,基于代码逻辑设计测试用例黑盒测试Black BoxTesting是一种测试方法,测试人员不了解系统的内部结构,只关注输入和输出,验证系统功能是否符合需求白盒测试技术黑盒测试技术语句覆盖确保每行代码至少执行一次等价类划分将输入数据分为有效和无效等价类,从每类选择代表值分支覆盖确保每个分支(如if-else)都被测试边界值分析测试边界值和极限情况路径覆盖确保所有可能的执行路径都被测试决策表测试使用决策表表示复杂的业务规则和输入组合条件覆盖确保每个条件表达式的所有可能结果都被测试状态转换测试测试系统在不同状态间的转换循环覆盖测试循环的边界条件和典型情况用例测试基于用例场景进行测试白盒测试主要由开发人员或测试开发人员进行,常用于单元测试和集成测试阶段灰盒测试灰盒测试Gray BoxTesting结合了白盒和黑盒测试的特点,测试人员对系统有部分了解,能够设计更有针对性的测试用例常用于集成测试和系统测试阶段软件文档管理软件文档是软件开发过程中产生的各种描述性材料,它们记录了软件的需求、设计、实现、测试和使用等方面的信息良好的文档管理对于项目的成功至关重要软件文档的类型需求文档需求规格说明书SRS详细描述软件功能和非功能需求用例文档描述系统与用户的交互场景用户故事敏捷开发中描述用户需求的简短描述设计文档软件架构文档描述系统的高层结构和组件详细设计说明书描述模块和组件的详细设计数据库设计文档描述数据模型和表结构接口规格说明描述系统对外和内部接口技术文档代码注释解释代码的目的和工作原理API文档描述编程接口的使用方法开发指南指导开发人员如何参与项目用户文档用户手册指导用户如何使用软件安装指南指导如何安装和配置软件常见问题解答FAQ解答用户常见问题配置管理与版本控制软件配置管理SCM软件基线Baseline软件配置管理是一种系统化管理软件变更的方法,它涉及识别配置项、控制变更、维护基线是在特定时间点上,经过正式评审和同意的一组配置项,作为后续开发的基础常完整性和可追溯性见的基线包括软件配置项SCI功能基线经过确认的需求规格分配基线系统和软件设计文档软件配置项是需要受控管理的系统元素,包括开发基线完成的代码和相关文档•源代码文件和库产品基线最终发布的软件和文档•文档(需求、设计、测试等)版本控制系统VCS•数据文件和数据库结构•构建脚本和配置文件版本控制系统是配置管理的核心工具,用于跟踪和管理代码和文档的变更•第三方组件和工具常用的VCS工具软件配置管理的核心活动Git分布式版本控制系统,最流行的VCS配置识别确定和标识系统中的配置项SubversionSVN集中式版本控制系统变更控制管理对配置项的变更请求和实施Mercurial分布式版本控制系统,类似Git配置状态记录记录和报告配置项的状态Perforce商业版本控制系统,适合大型项目配置审计验证配置项的完整性和一致性版本控制管理配置项的不同版本构建管理管理系统的构建和发布过程软件项目管理基础软件项目管理是计划、组织和控制软件项目资源,以实现特定目标的过程有效的项目管理是软件项目成功的关键因素之一项目管理的核心知识领域根据项目管理知识体系PMBOK,项目管理包括以下核心知识领域项目整合管理协调各项目管理活动项目范围管理确保项目包含所需的全部工作项目进度管理确保项目按时完成项目成本管理确保项目在预算范围内完成项目质量管理确保项目满足质量要求项目资源管理组织和管理项目团队和物质资源项目沟通管理确保及时有效的信息交流项目风险管理识别和应对项目风险项目采购管理管理外部资源的获取项目相关方管理识别和管理相关方的期望软件项目管理的四大约束软件项目管理需要平衡以下四个主要约束范围Scope项目要交付的功能和特性进度Schedule项目完成的时间框架成本Cost项目执行所需的预算和资源质量Quality项目交付物必须满足的标准工作分解结构()WBS工作分解结构定义WBS在软件项目中的应用工作分解结构Work BreakdownStructure,WBS是一种层次化的项目组成模在软件项目中,WBS通常基于软件开发生命周期的阶段或系统的主要功能模块来型,它将项目工作分解为更小的、可管理的部分,直到工作包级别WBS是项目组织例如规划和控制的基础工具基于阶段的WBS需求分析、设计、编码、测试、部署WBS的特点基于功能的WBS用户管理模块、订单处理模块、报表模块混合WBS结合阶段和功能的分解方式•层次化结构,通常以树形图表示•每个层级代表项目工作的不同抽象级别WBS的应用价值•最低层级是工作包,可直接分配给个人或团队任务细化将复杂项目分解为可管理的小任务•包含项目的全部工作,不重不漏责任分配明确各工作包的责任人•以可交付成果为导向,而非活动进度规划为进度计划提供活动定义WBS的创建步骤资源估算为资源分配提供基础成本估算为预算编制提供结构
1.确定主要可交付成果和项目阶段风险识别帮助识别各工作包的潜在风险
2.逐层分解工作,直到适合估算和分配的级别进度跟踪提供项目监控的框架
3.检查分解的完整性和正确性
4.为每个工作包分配唯一标识符
5.验证工作包的粒度是否适当软件项目估算方法功能点分析FPA COCOMO模型功能点分析是一种基于功能规模的估算方法,通过计算系统提供给用户的功能数量来估算项构造性成本模型COnstructive COstMOdel,COCOMO是一种算法成本估算模型,由目规模Barry Boehm开发COCOMO II是其现代版本功能点计算步骤COCOMO的层次
1.识别和计数五类功能组件基本COCOMO使用简单公式进行粗略估算•内部逻辑文件ILF中级COCOMO考虑成本驱动因素进行更精确估算•外部接口文件EIF详细COCOMO在各开发阶段应用不同估算方法•外部输入EI基本COCOMO公式•外部输出EO工作量人月=a×代码行数KLOCb•外部查询EQ
2.根据复杂度对每个组件赋予权重开发时间月=c×工作量d
3.计算未调整功能点数UFP其中a,b,c,d是基于项目类型(有机型、半分离型、嵌入型)的常数
4.评估14个技术复杂度因素TCF其他常用估算方法
5.计算最终功能点数FP=UFP×TCF专家判断基于经验进行估算功能点的优势类比估算基于相似项目进行估算•与编程语言无关,可跨项目比较自下而上估算汇总各组件估算•基于用户功能,而非技术实现参数模型使用数学模型进行估算•可在早期阶段应用,需求还未详细三点估算最乐观、最可能、最悲观时间的加权平均软件项目进度安排甘特图Gantt Chart里程碑Milestone甘特图是一种常用的项目进度可视化工具,它以横条图的形式展示项目活动的开始、里程碑是项目中的重要事件或成果,标志着某个阶段的完成或重要目标的实现里程持续时间和结束时间碑通常没有持续时间,只表示一个时间点甘特图的组成元素软件项目常见里程碑任务条表示任务的时间跨度•项目启动会议里程碑表示重要事件或成果•需求规格说明书批准依赖关系表示任务之间的前后关系•设计评审完成资源分配表示任务的责任人•原型演示进度状态表示任务的完成情况•编码完成•系统测试开始甘特图的优势•用户验收测试完成•直观展示项目时间线和进度•系统上线•易于理解和沟通•项目结束评审•帮助识别潜在的进度问题关键路径法CPM•便于跟踪项目执行情况关键路径法是一种识别项目中最长路径的技术,这条路径决定了项目的最短完成时间关键路径上的任务没有浮动时间,延误将直接影响项目完成时间软件项目风险管理风险管理过程软件项目常见风险软件项目风险管理是识别、分析和应对可能影响项目目标的不确定性因素的过程有效的风险管理可以降低项目失败的可能性技术风险风险识别•技术复杂性和不成熟•技术集成问题确定可能影响项目的风险,并记录其特征•性能和可靠性问题•头脑风暴、专家访谈•安全漏洞•核对表、情景分析•历史数据分析管理风险•SWOT分析•不切实际的进度和预算•资源不足或不稳定风险分析•沟通不畅评估风险的概率和影响,确定风险等级•团队协作问题•定性分析高/中/低评级需求风险•定量分析数值概率和影响•风险矩阵概率-影响图•需求不明确或变化频繁•需求遗漏或冲突风险应对•用户参与不足•范围蔓延制定应对风险的策略和行动计划•规避消除威胁或保护项目业务风险•转移将风险影响转移给第三方•市场变化•减轻降低风险概率或影响•商业模式转变•接受承认风险存在但不采取行动•竞争对手行动•法规变更风险监控跟踪已识别的风险,监控残余风险和新风险•定期风险评审•风险触发事件监控•风险应对计划实施跟踪•风险状态报告软件运维与持续交付DevOps概念DevOps在企业中的应用实例DevOps是一种文化、实践和工具的组合,旨在打破开发Development和运维案例一电商平台Operations之间的壁垒,提高组织交付应用和服务的速度和质量•实施微服务架构,每个服务独立部署DevOps的核心原则•使用Jenkins构建CI/CD流水线•采用Docker容器化应用自动化自动化构建、测试、部署和基础设施•通过Kubernetes进行容器编排持续集成/持续交付CI/CD频繁集成代码并自动部署•使用ELK堆栈进行日志管理和监控基础设施即代码IaC以代码形式管理和配置基础设施•通过蓝绿部署实现零停机更新监控和反馈持续监控系统并反馈问题协作和沟通打破团队间的孤岛,促进协作案例二金融机构持续交付CD实践•引入自动化测试,提高代码覆盖率•建立自动化安全扫描和合规检查
1.持续集成频繁合并代码并进行构建和测试•实施GitOps工作流,通过Git管理基础设施
2.自动化测试单元测试、集成测试、端到端测试•建立特性开关系统,支持灰度发布
3.部署流水线自动化代码从提交到生产的过程•开发自动化回滚机制,降低部署风险
4.环境一致性确保开发、测试和生产环境一致•实施24/7监控和自动化事件响应
5.版本控制所有内容(代码、配置、环境)都纳入版本控制软件过程改进CMMI成熟度模型能力成熟度模型集成Capability MaturityModel Integration,CMMI是一个用于评估和改进组织软件过程能力的框架CMMI定义了五个成熟度级别初始级(第1级)过程无序,结果不可预测,成功依赖于个人能力已管理级(第2级)建立了基本的项目管理过程,能够重复以前的成功经验已定义级(第3级)过程标准化和规范化,组织有一套统一的开发过程量化管理级(第4级)持续改进机制使用定量方法控制过程,过程性能可预测持续改进是一种系统化方法,通过不断识别和消除浪费、提高效率和质量来改进组织的过程优化级(第5级)PDCA循环持续改进过程,采用创新方法提高过程性能计划-执行-检查-行动Plan-Do-Check-Act循环是一种常用的持续改进模型计划Plan识别问题,分析原因,制定改进计划执行Do实施改进计划,收集数据检查Check评估结果,确定是否达到目标行动Act标准化成功的改进,解决未解决的问题其他软件过程改进方法SPICE ISO/IEC15504软件过程改进与能力评估标准Six Sigma基于数据的质量改进方法精益软件开发专注于消除浪费,增加价值主流开发平台与工具IDEA EclipseJetBrains公司开发的Java集成开发环境,以其强大的代码分析、智开源的集成开发环境,主要用于Java开发,但通过插件系统可支持多能补全和重构功能著称支持Java、Kotlin、Groovy等JVM语言,种语言和平台Eclipse基金会维护,拥有庞大的插件生态系统优势以及前端开发技术提供社区版和付费的旗舰版在于免费、开源、高度可定制Gitee Docker中国领先的代码托管平台,类似于GitHub,提供Git仓库管理、问题开源的容器化平台,可将应用及其依赖打包到一个可移植的容器中跟踪、代码评审等功能对中国开发者友好,访问速度快,支持私有仓Docker容器保证了应用在不同环境下的一致性运行,简化了部署流库免费使用适合企业和个人开发者使用程,提高了资源利用率是现代DevOps实践的基础VS CodeMaven微软开发的轻量级代码编辑器,支持多种编程语言,具有丰富的扩展生Apache软件基金会的项目管理工具,主要用于Java项目自动处理态系统因其高性能、易用性和强大的调试功能而广受欢迎支持智能依赖关系、构建、测试和部署,通过XML配置文件管理项目使用中代码补全、语法高亮和集成终端央仓库机制管理第三方库,简化依赖管理微服务与容器技术Spring BootSpring Boot是一个用于构建独立、生产级Spring应用程序的框架它简化了Spring应用的初始化和开发过程,提供了自动配置、内嵌服务器等特性SpringBoot的核心特性自动配置根据类路径自动配置应用起步依赖简化依赖管理内嵌服务器无需部署WAR文件健康检查和监控通过Actuator提供外部化配置支持多环境配置@SpringBootApplicationpublic classDemoApplication{public staticvoid mainString[]args{SpringApplication.run DemoApplication.class,args;}}Docker与容器化Docker是一个开源的容器平台,它使开发人员能够将应用打包到标准化的单元中进行开发、发布和运行Docker的基本概念镜像Image应用及其依赖的只读模板容器Container镜像的运行实例Dockerfile构建镜像的脚本Docker Hub共享和管理镜像的仓库KubernetesK8sKubernetes是一个开源的容器编排平台,用于自动部署、扩展和管理容器化应用Kubernetes的核心概念Pod最小部署单元,包含一个或多个容器行业典型案例分析互联网企业高并发系统架构电商系统架构以某大型电商平台为例,其系统需要处理每秒数万次的并发请求,特别是在促销活动期间现代电商系统通常采用微服务架构,以应对复杂的业务需求和高并发场景关键架构特点典型电商系统组件服务拆分将系统拆分为数百个微服务,每个服务负责特定功能前端服务多级缓存客户端缓存、CDN、分布式缓存Redis、本地缓存•Web前端React/Vue.js构建的SPA读写分离主库负责写操作,多个从库负责读操作•移动端原生App和H5混合应用数据分片按用户ID、地理位置等维度分片•API网关统一接口管理,权限控制消息队列使用Kafka处理峰值流量,实现系统解耦限流熔断保护系统不被过载请求击垮核心业务服务多机房部署实现地理冗余,提高可用性•用户服务注册、登录、个人信息管理•商品服务目录、搜索、详情、库存•订单服务创建、支付、履行、退款•支付服务支付渠道集成、交易记录•物流服务配送管理、物流跟踪支撑服务•搜索服务基于Elasticsearch的全文搜索•推荐系统个性化商品推荐•数据分析用户行为分析、销售报表•消息服务通知、邮件、短信发送软件工程伦理与法律软件工程伦理软件法律法规软件工程伦理涉及开发人员在设计、开发和维护软件过程中应遵循的道德准则和价值观知识产权保护IEEE计算机协会和ACM联合制定了《软件工程行为准则》,指导软件工程师的专业行为著作权保护源代码、文档等创作物软件工程师的基本责任专利权保护软件发明和创新公共利益优先软件工程师的行为应符合公共利益商标权保护软件产品的品牌和标识客户和雇主利益保护客户和雇主的合法权益商业秘密保护非公开的技术和商业信息产品质量确保产品和相关修改达到最高专业标准职业诚信维护个人和职业的完整性和独立性开源许可终身学习不断学习和提高专业知识和技能GPL要求衍生作品也必须开源同行评价公平对待同行,促进同行评审MIT宽松许可,允许商业使用和修改Apache允许商业使用,保护专利权BSD简单宽松,要求保留版权声明行业合规数据保护如GDPR、CCPA等隐私法规行业标准如医疗HIPAA、金融PCI DSS可访问性如W3C的WCAG标准安全合规如NIST网络安全框架软件工程师职业发展软件工程师的职业发展不仅限于技术能力的提升,还包括软技能、领导力和对行业的贡献持续学习和适应行业变化是成功的关键持续学习技术快速发展,软件工程师需要不断学习新知识和技能•关注技术趋势和新兴技术•参加线上课程和认证(如Coursera、Udemy)•阅读技术书籍和博客•学习新编程语言和框架•参加研讨会和技术大会开源贡献参与开源项目是提升技能、建立声誉和回馈社区的有效方式•贡献代码到开源项目•提交错误报告和功能请求•改进文档和编写教程•参与代码评审和讨论•创建和维护自己的开源项目技术社区积极参与技术社区可以扩展人脉、分享知识和学习他人经验•参加线下技术聚会和用户组•在技术论坛上解答问题(如Stack Overflow)•发表技术博客和文章•进行技术演讲和分享•组织或参与黑客马拉松活动职业路径软件工程师可以选择不同的职业发展路径技术专家路径高级工程师→技术专家→架构师4管理路径团队负责人→技术经理→技术总监→CTO创业路径利用技术知识创办自己的公司咨询路径成为技术顾问或独立咨询师教育路径技术培训师、讲师或教授国内外经典教材推荐国际经典教材中文原创与翻译作品《软件工程实践者的研究方法》《代码整洁之道》《软件开发的201个原则》《软件架构模式》Roger S.Pressman著,这本书是软件工程领域的经典教Robert C.Martin UncleBob著,这本书详细讲解了如这本书汇集了软件开发过程中的重要原则和最佳实践,涵Mark Richards著,这本书简明扼要地介绍了五种常见的材,全面介绍了软件工程的各个方面,包括过程模型、需何编写易于阅读、理解和维护的高质量代码作者提出了盖编码、设计、测试、项目管理等多个方面,是一本实用软件架构模式,包括分层架构、微内核架构、基于空间的求工程、设计、测试等书中结合了大量实例,使理论与许多实用的原则和实践,帮助开发人员提高代码质量的指南架构、事件驱动架构和微服务架构实践紧密结合《重构改善既有代码的设计》《设计模式可复用面向对象软件的基础》Martin Fowler著,这本书详细介绍了重构的概念、原则Erich Gamma等四位作者Gang ofFour著,这本书是和具体方法,帮助开发人员改善既有代码的质量和结构,设计模式的开山之作,详细介绍了23种经典设计模式,对而不改变其外部行为面向对象设计有深远影响课程回顾与考核说明课程重点回顾本学期我们系统学习了软件工程的基本概念、方法和工具,涵盖了软件开发全生命周期的各个方面以下是本课程的核心内容软件工程基础定义、历史、软件特性和开发原则软件过程模型瀑布模型、增量模型、敏捷方法等需求工程获取、分析、规格说明和验证软件设计架构设计、设计模式、UML建模软件实现编码规范、版本控制、持续集成软件测试测试策略、测试类型、测试自动化软件项目管理范围、进度、成本和风险管理软件质量保证质量特性、质量控制和质量改进软件维护类型、过程和最佳实践新兴技术微服务、DevOps、容器化等考核形式说明本课程的考核采用多元化评估方式,全面评价学生对软件工程知识和技能的掌握情况40%课后思考与未来展望软件工程的未来发展趋势未来十年软件行业新方向量子计算软件AI辅助软件工程随着量子计算硬件的发展,量子软件工程将成为新的专业领域,需要全新的算法、编人工智能正在改变软件开发的各个方面,从需求分析到编码和测试程模型和开发工具•AI辅助编程GitHub Copilot等•自动化测试生成和执行可持续软件工程•智能缺陷预测和预防关注软件的能源效率和环境影响,开发更节能的算法和系统,减少碳足迹,符合绿色•代码自动优化和重构计算理念•自然语言需求转代码自适应智能系统低代码/无代码开发能够自我学习、自我修复和自我优化的软件系统,减少人工干预,提高可靠性和适应通过可视化工具和预构建组件,使非专业人员也能参与软件开发性•企业应用快速开发平台•业务流程自动化工具边缘计算与分布式智能•可视化应用构建器将计算能力从云端转移到边缘设备,开发能在资源受限环境下高效运行的软件架构和•领域特定语言的兴起算法•公民开发者的崛起作为未来的软件工程师,你们将面临这些挑战和机遇希望本课程为你们打下坚实的基础,培养持续学习的能力,以适应这个快速变化的行业。
个人认证
优秀文档
获得点赞 0