还剩48页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
软件工程导论欢迎来到《软件工程导论》课程本课程基于清华大学教材主线,旨在为学生提供软件工程的基础知识和实践技能我们将系统地介绍软件开发的各个阶段、方法和工具,帮助大家理解软件工程的核心原理软件危机的提出软件危机的起因危机的表现世纪年代,随着计算机硬件能力的快速提升,软件开软件危机主要表现为开发成本超支、进度延迟、质量低下、维护2060-70发却面临着严重的质量、效率和成本问题软件项目频繁超出预困难等问题这些问题源于软件系统日益增长的复杂性与传统开算,延期交付,且充满缺陷,导致了软件危机这一概念的提发方法之间的矛盾,使得软件项目的失败率居高不下出软件工程的定义定义工程学科性质经济性与质量IEEE应用系统的、规范的、可量化的方法软件工程强调将工程学科的原理、方核心目标是在有限资源条件下,经济来开发、运行和维护软件,即将工程法应用于软件开发,以解决软件危机高质地开发和维护软件,平衡成本与化应用于软件带来的问题质量的关系软件工程的基本特征抽象性复杂性软件是逻辑实体而非物理实体,无法直接观软件系统结构复杂,组件之间交互关系多察和测量,需要通过抽象的模型和方法来理样,且难以通过简单组合预测整体行为解和描述过程性与团队协作可变性软件开发是一个持续演进的过程,需要多人软件易于修改,但修改可能产生连锁反应,协同工作,良好的沟通和协作至关重要导致难以预测的影响和新的问题软件工程的三大要素过程框架与活动安排方法2技术与开发范式工具软件开发辅助手段软件工程的三大要素相互支撑,形成完整的软件工程体系工具是方法的实现手段,如各种集成开发环境和计算机辅助软件工程IDE工具;方法指导过程执行,提供具体的技术手段;而过程则是软件开发的组织框架,定义了各阶段的任务和顺序CASE软件工程发展简史1年1968北约科学委员会在德国召开会议,首次提出软件工程概念,标志着软件工程学科的诞生2年代1970-1980结构化方法兴起,形成了瀑布模型等经典软件开发模型,建立了软件工程的基础理论和方法3年代1990面向对象方法成为主流,统一建模语言出现,软件复用思想深入人心UML4年后2000敏捷开发流派兴起,强调响应变化、拥抱需求变更,理念逐渐形成DevOps软件工程的发展历程反映了对软件开发认识的不断深入从最初的危机应对,到结构化方法的规范化,再到面向对象的抽象与复用,直至现代敏捷开发与的持续交付,软件工程理论与实践不断演进DevOps软件生命周期概念生命周期模型价值生命周期阶段生命周期模型为软件开发提供了框架,指导开发团队定义与意义典型的软件生命周期包括需求分析、设计、编码实有序地开展工作,促进沟通,控制风险,确保质量软件生命周期是指软件从概念形成到最终废弃的整个现、测试、部署和维护等阶段,每个阶段有明确的输过程,涵盖软件产品的全生命历程了解生命周期有入、活动和输出助于系统化管理软件开发和维护活动软件生命周期的概念帮助我们从宏观角度理解软件开发的全过程不同的生命周期模型反映了不同的开发理念和策略,适用于不同类型的项目和团队无论采用哪种模型,都需要明确各阶段的任务、责任和交付物,建立有效的沟通和协作机制传统软件生命周期模型需求分析确定系统目标和功能,形成需求规格说明书系统设计制定系统架构和详细设计方案程序编码将设计转化为实际可执行的程序系统测试验证软件功能和性能是否符合需求运行维护处理运行中发现的问题,适应环境变化瀑布模型是最早提出的软件生命周期模型,特点是阶段间的顺序性和文档驱动性每个阶段都有明确的输入、活动和输出,只有前一阶段完成并通过评审后,才能进入下一阶段增量模型与演化模型增量模型演化模型增量模型将系统分解为多个增量,每个增量实现系统的部分功演化模型允许开发人员逐步细化软件需求和实现通过原型化和能开发团队首先开发核心功能,然后在后续增量中逐步添加新迭代,系统不断发展和完善,以适应不断变化的需求和环境功能,直至完成整个系统特点特点•每个增量都是可操作的系统•特别适合需求不明确的项目•用户可以早期使用系统•通过原型收集用户反馈•降低了整体风险•系统持续演进和改进•可以更好地适应需求变化•更加灵活,但可能缺乏整体规划螺旋模型目标确定风险分析明确本次迭代的目标和限制条件识别风险并制定减轻风险的策略规划下阶段开发验证评审成果并规划下一循环开发产品并进行验证螺旋模型由于年提出,结合了瀑布模型的系统性和原型模型的迭代性,特别强调风险分析该模型将软件开发过程表示为一个螺Barry Boehm1988旋,从内向外扩展,每次循环代表开发过程的一个阶段敏捷开发模型敏捷宣言核心价值框架Scrum•个体和互动高于流程和工具•产品待办列表()Product Backlog•工作的软件高于详尽的文档•冲刺()Sprint•客户合作高于合同谈判•每日站会()Daily Scrum•响应变化高于遵循计划•冲刺评审和回顾极限编程()XP•结对编程()Pair Programming•测试驱动开发()TDD•持续集成()Continuous Integration•简单设计和重构敏捷开发模型是对传统重量级方法的反思和改进,强调适应性而非预测性,人员而非流程敏捷方法认为,软件开发是一个经验过程,需要通过迭代、增量和自组织团队来应对不确定性和变化软件过程改进模型初始级()Level1过程无序,成功依赖个人能力已管理级()Level2建立基本项目管理流程已定义级()Level3标准过程得到定义和执行量化管理级()Level4过程绩效可量化管理优化级()Level55通过持续改进提高过程能力能力成熟度模型集成()是一个过程改进方法,通过评估组织当前过程的成熟度,并指导组织如何改进过程,提高软件开发效率和产品质量将组织的过程成熟度分为五个等级,从CMMI CMMI初始级到优化级,每个等级都有特定的过程域和实践目标可行性研究方法经济可行性分析项目的成本效益,评估经济回报成本估算•技术可行性2效益分析•评估技术风险和技术条件是否满足项目需求•投资回报率计算•技术成熟度评估操作可行性•技术能力和资源分析•技术风险评估评估系统能否被用户接受和有效使用•用户接受度分析•组织影响评估•法律法规合规性可行性研究是软件项目早期的关键活动,旨在评估项目是否值得投入资源进行开发通过系统的可行性分析,可以帮助决策者判断项目是否应该继续,以及应该采用什么样的开发策略软件需求分析目标明确问题域准确理解用户当前面临的问题和需要解决的业务挑战,定义系统的边界和范围确定功能需求详细描述系统应该提供哪些功能,包括数据处理、用户交互、系统响应等方面的具体要求识别非功能需求明确系统的质量属性和约束条件,如性能、安全、可靠性、可用性、可维护性等验证需求的完整性确保需求覆盖所有利益相关者的期望,且内部一致、无冲突、可验证需求分析是软件开发的基础,直接影响后续设计和实现的质量良好的需求分析能够清晰定义做什么(而非怎么做),为开发团队提供明确的目标和方向通过与用户的密切合作,需求分析师需要挖掘真实需求,并以结构化的方式记录和表达这些需求需求获取方法访谈法问卷调查原型法用例分析通过与用户和利益相关者的直设计问卷收集大量用户的反馈快速构建系统的可视化模型,从用户视角描述系统功能,关接交谈,了解他们的需求、期和意见,适合获取统计数据和让用户通过交互体验提供反注用户与系统的交互过程,包望和痛点可分为结构化访谈普遍需求,但难以深入了解具馈,特别适合界面和交互设计括正常流程和异常情况处理(按预定问题进行)和非结构体需求细节的需求获取化访谈(自由讨论)需求获取是一个反复迭代的过程,需要运用多种方法相互补充用户故事是敏捷开发中常用的需求表达方式,通常采用作为角色,我希望功能,以便价值的格[][][]式,简洁明了地表达用户需求和期望价值需求规格说明书()SRS引言目的、范围、定义、参考文献、概述总体描述产品前景、功能、用户特征、约束、假设和依赖具体需求功能需求、性能需求、设计约束、外部接口需求附录术语表、分析模型、支持信息需求规格说明书是正式记录系统需求的文档,是开发团队与用户之间的契约是IEEE830-1998一个广泛使用的标准,提供了需求规格说明书的内容框架和质量特性良好的应该是完整的、SRS SRS一致的、无歧义的、可验证的、可修改的、可追踪的需求表示方法数据流图其他表示方法DFD数据流图是一种图形化工具,用于描述系统中数据的流动、处理数据字典是对中数据元素的详细描述,定义了数据的组DFD和存储它包括四种基本元素外部实体、处理、数据存储和数成、格式和意义它是理解系统数据结构的重要工具据流可以分层表示,从顶层图层逐步细化到详细的底DFD0状态转换图用于描述系统或对象在不同状态之间的转换关系,特层图别适合描述实时系统和控制系统的行为例如,电梯控制系统的的优点状态可能包括停止、上升、下降等,状态转换图清晰地展DFD示了各状态间的转换条件和动作•直观地展示数据如何在系统中流动•易于与用户沟通•可以逐步细化系统功能需求变更与管理需求变更的原因需求变更是软件开发中的常态,主要来源于业务环境变化、用户认知深入、技术约束发现、市场竞争压力等因素研究表明,大多数项目在开发过程中至少会有的需求发生变更25%变更管理流程有效的需求变更管理包括变更申请提交、影响分析、变更评审、变更决策、实施与验证、文档更新等环节建立正式的变更控制委员会可以确保变更决策的合理性CCB需求跟踪与回溯需求跟踪矩阵是一种重要工具,用于建立需求与其他开发制品如设计、代码、测RTM试之间的双向映射关系这种映射关系有助于分析变更影响范围,确保需求的完整实现和验证需求变更管理的核心是平衡变更的价值与成本过于僵化的变更控制可能导致系统无法满足用户真实需求;而过于随意的变更则可能导致范围蔓延,影响项目进度和质量合理的变更管Scope Creep理应建立在对项目目标、资源约束和风险的全面理解基础上软件系统设计总览需求分析明确做什么1概要设计系统架构与组件划分详细设计具体实现算法与数据结构软件设计是将需求转化为可实现规范的过程,是连接需求分析和编码实现的桥梁设计活动通常分为概要设计和详细设计两个层次概要设计关注系统整体结构,确定主要组件及其关系;详细设计则聚焦于组件内部实现,定义具体的算法和数据结构架构设计与模式分层架构模型MVC•表示层(用户界面)•模型()数据和业务规则Model•业务逻辑层(应用处理)•视图()用户界面展示View•数据访问层(持久化)•控制器()处理用户输入Controller•优点关注点分离,易于维护•优点解耦显示和业务逻辑常用设计模式•创建型工厂方法、单例模式•结构型适配器、装饰器•行为型观察者、策略模式•优点复用经验,解决常见问题软件架构是系统的骨架,定义了系统的基本结构和组织方式良好的架构设计能够满足系统的功能需求,同时保证系统的质量属性,如性能、安全性、可靠性、可扩展性等架构决策往往是权衡的结果,需要考虑各种因素和约束条件接口设计与数据设计人机交互界面设计数据设计人机界面设计关注用户如何与系统交互,目标是创建易用、高数据设计关注系统中数据的组织和存储方式,包括内存中的数据效、愉悦的用户体验主要原则包括结构和持久化的数据库设计良好的数据设计应考虑•一致性保持界面元素和行为的一致•数据抽象识别核心实体及其属性关系•简单性减少用户认知负担•效率支持高效的数据访问和处理•反馈提供清晰的操作反馈•完整性确保数据的一致性和正确性•容错预防错误并提供恢复机制•安全性保护敏感数据不被未授权访问•用户控制用户应感觉在掌控系统•可扩展性适应数据量和类型的变化接口设计不仅包括用户界面,还包括程序接口()、硬件接口等良好的设计应遵循简单、一致、可扩展的原则,提供清晰的API API文档和错误处理机制在系统集成日益重要的今天,接口设计对系统的可组合性和互操作性有着决定性影响模块化与高内聚低耦合模块化原则高内聚低耦合将系统分解为相对独立的内聚性描述模块内部元素耦合性描述模块之间的依模块,每个模块完成特定之间的联系紧密程度高赖关系低耦合意味着模功能,有明确的接口良内聚意味着模块中的元素块之间的接口简单,依赖好的模块化可以提高系统都紧密相关,共同完成单关系少,一个模块的变化的可理解性、可维护性和一功能,没有不相关的责对其他模块的影响最小可重用性任模块划分的标准包括功能划分、数据封装、信息隐藏等一个好的模块应该有单一的责任,提供清晰的抽象,隐藏内部实现细节在面向对象设计中,类就是一种模块形式,通过封装、继承和多态实现高内聚低耦合的设计目标软件开发技术基础语言Java是一种跨平台、面向对象的编程语言,以一次编写,到处运行著称拥有强大的类库和框架生态,如、等,广泛应用于企业级应用、移动开发和大数据处理领JavaJava SpringHibernate Android域语言Python以简洁易读的语法和丰富的第三方库著称,强调代码的可读性和开发效率在数据科学、人工智能、开发和自动化脚本等领域有广泛应用,是初学者和专业人士都喜爱的语言Python Pythonweb语言C++是一种高性能的编程语言,支持过程式、面向对象和泛型编程等多种范式因其高效的执行速度和对硬件的细粒度控制能力,常用于系统软件、游戏开发、嵌入式系统等对性能要求高的场景C++C++除了编程语言,开发环境和工具也是软件开发的重要组成部分集成开发环境如、、等,提供了编辑、编译、调试、版本控制等一体化功能,大大提高了开发效率IDE VisualStudio IntelliJIDEA Eclipse编码规范与代码质量命名规范良好的命名应该清晰表达意图,遵循一致的风格变量名应使用有意义的名词,函数名应表示动作,类名应表示对象的特性避免使用缩写和单字母变量(除非是约定俗成的,如循环中的、、)i jk注释规范注释应解释为什么而非是什么,代码本身应该清晰表达其功能避免过度注释和注释与代码不一致的情况使用标准的文档注释格式(如、)记录JavaDoc PyDocAPI格式化规范一致的代码格式有助于提高可读性包括缩进风格、大括号位置、空格使用、行长度限制等团队应采用统一的格式化规范,并可通过自动化工具强制执行静态分析工具使用静态代码分析工具可以自动检测潜在问题,如未使用的变量、复杂度过高的函数、可能的内存泄漏等常用工具包括、、等SonarQube ESLintFindBugs代码质量不仅影响系统的可靠性和性能,也直接影响后续的可维护性和可扩展性高质量的代码应该是清晰、简洁、一致的,遵循不重复自己和保持简单等原则代码复杂度是衡量代码质量的重要指标,过高的复杂度往往DRYKISS意味着更多的缺陷和更难的维护编程常见错误及预防空指针异常是最常见的编程错误之一,发生在试图访问空引用指向的对象时预防措施包括空值检查、使用类型、设计时避免返回、使用注解标记可空性等Optional APInull现代语言如通过区分可空和非空类型从设计上减少了这类问题Kotlin数组越界访问是另一类常见错误,可能导致程序崩溃或安全漏洞预防措施包括总是验证索引有效性、使用安全的集合类代替原始数组、使用迭代器而非索引遍历等并发控制问题则更为复杂,包括死锁、竞态条件、不一致读取等,需要通过合理的锁策略、不可变对象、线程安全集合、原子操作等技术来预防软件单元测试框架框架模拟对象JUnit pytest是生态系统中最是中强大而灵模拟框架如、JUnit Javapytest PythonMock Mockito流行的单元测试框架,提供活的测试框架,以简洁的语等,可以创建测EasyMock了简单的注解和断言机制法和丰富的插件生态著称试替身,隔离被测单元与其引入了更强大的功相比标准库中的依赖这使得测试更加聚焦,JUnit5Python能,如嵌套测试、参数化测,提供了更不受外部系统或复杂依赖的unittest pytest试、标签过滤等,进一步提简单的测试编写方式和更强影响,提高了测试的可控性升了测试效率和灵活性大的断言功能和稳定性单元测试是验证代码最小单元(通常是方法或函数)功能正确性的测试良好的单元测试应该是自动化的、独立的、可重复的单元测试不仅能发现缺陷,还能促进良好的设计,因为可测试性往往与低耦合、高内聚等良好设计特性相关集成测试与系统测试单元测试验证单个模块功能正确性集成测试验证多个模块协同工作系统测试验证整个系统满足需求验收测试4用户确认系统满足业务需求集成测试关注模块间接口和交互,验证不同组件组合在一起是否正常工作集成策略可分为自底向上(先测试低层模块,再逐步集成高层模块)、自顶向下(先测试高层模块,使用桩代替低层模块)和三明治法(同时从顶层和底层开始集成)每种策略都有其优缺点,选择哪种取决于系统特点和项目约束验收测试与验收标准验收测试计划确定验收测试的范围、方法、环境、时间表和参与人员验收标准制定基于需求规格说明书,明确定义系统必须满足的条件验收测试执行用户参与测试,验证系统功能和性能是否满足业务需求评估与决策评估测试结果,决定是否接受系统或需要进一步修改验收测试是软件测试的最后阶段,由用户或客户执行,目的是确认系统是否满足业务需求,是否可以交付使用验收测试通常在类生产环境中进行,使用真实数据,关注系统的功能完整性、易用性和业务适用性软件测试流程与策略测试计划测试设计确定测试目标、范围、方法和资源创建测试用例和测试数据结果评估测试执行4分析测试结果,报告缺陷3运行测试并记录结果软件测试可分为静态测试和动态测试静态测试不执行代码,包括代码评审、静态分析等;动态测试则通过运行程序来发现问题完整的测试策略应包括两者,静态测试可以早期发现问题,动态测试则能验证系统在真实条件下的行为缺陷管理与测试工具缺陷跟踪系统禅道项目管理系统自动化测试工具JIRA Selenium是一款流行的问题跟踪工具,提供了强大的缺陷管禅道是一款国产的项目管理工具,集产品管理、项目管是一款强大的应用测试工具,支持多种浏JIRA SeleniumWeb理功能,包括创建、分配、跟踪和报告缺陷还支理、测试管理于一体在缺陷管理方面,禅道提供了完整览器和操作系统它允许测试人员编写自动化测试脚本,JIRA持自定义工作流程,可以适应不同团队的需求其丰富的的生命周期管理,从创建、确认、分配、解决到验证和关模拟用户交互,验证应用的功能Web Selenium报表和仪表盘功能使团队能够全面了解项目质量状况闭其简洁的界面和中文环境使其在国内团队中广受欢支持多种编程语言,如、WebDriver APIJava迎、等,使其能够集成到各种测试框架中Python C#缺陷生命周期描述了缺陷从发现到解决的完整过程典型的缺陷生命周期包括新建()、分配()、修复中()、已修复()、验证中(New AssignedIn ProgressFixed In)、关闭()或重新打开()有效的缺陷管理需要清晰的状态定义、责任分配和流程控制Verification ClosedReopened软件维护类型与挑战版本控制与配置管理分布式版本控制Git是当今最流行的分布式版本控制系统,每个开发者都拥有完整的代码仓库副本的分支模型使并行开发变Git Git得简单高效,通过、、、等操作,团队可以灵活协作,同时保持代码历史的commit branchmerge pullrequest完整追踪集中式版本控制SVN是一种集中式版本控制系统,所有代码仓库存储在中央服务器上的简单性和线性历史使SubversionSVN SVN其在某些场景下仍有应用,特别是对大型二进制文件的管理和严格的访问控制要求分支管理策略有效的分支策略对于团队协作至关重要、、等是常见的GitFlow GitHubFlow TrunkBased Development分支模型,各有特点选择合适的分支策略需要考虑团队规模、发布频率、项目复杂度等因素配置项管理配置管理不仅包括代码,还包括文档、库、环境配置等所有影响系统行为的项目识别配置项、控制变更、记录状态和验证完整性是配置管理的核心活动版本控制是软件配置管理的基础,提供了对软件变更的跟踪和管理现代版本控制系统不仅管理源代码,还可以管理文档、配置文件、构建脚本等通过版本控制,团队可以协同工作,追踪变更历史,在需要时回滚到之前的状态运维与持续集成编码提交开发人员将代码提交到版本控制系统自动构建服务器检出代码并执行构建CI自动测试运行单元测试、集成测试等自动部署将验证通过的代码部署到环境持续集成是一种软件开发实践,团队成员频繁地(通常每天多次)将代码集成到共享仓库,每次集成都通过自动化构CI建和测试进行验证的核心价值在于尽早发现集成问题,避免集成地狱,提高软件质量和开发效率CI工具如、、、等,提供了构建、测试和部署的自动化支持这些工CI/CD JenkinsGitLab CICircleCI GitHubActions具可以监控代码仓库,在检测到变更时自动触发构建管道,执行编译、测试、代码分析、打包和部署等步骤现代管道通常采用基础设施即代码方式配置,使管道本身也成为可版本控制、可测试的代码CI/CD软件文档管理需求文档设计文档需求规格说明书、用户故事、用例描述等,定义软架构设计、详细设计、数据模型等,描述软件如何件应做什么实现•功能需求规格1•系统架构文档•用户故事地图•数据库设计说明•原型设计文档•接口设计规范测试文档用户文档测试计划、测试用例、测试报告等,验证软件是否用户手册、安装指南、等,指导用户如何使用FAQ正确•操作手册•测试策略•培训材料•测试用例集•在线帮助•缺陷报告软件文档是软件产品的重要组成部分,承载了软件的知识和信息良好的文档不仅支持当前的开发和使用,还为未来的维护和演进奠定基础文档应具备准确性、完整性、一致性、可读性和可维护性等特性项目管理核心35项目管理三大约束项目管理过程组范围、进度、成本构成项目管理的铁三角,三者启动、规划、执行、监控、收尾是项目管理的五个相互制约主要过程10知识领域定义的项目管理十大知识领域,覆盖各个PMBOK管理方面项目管理是应用知识、技能、工具和技术于项目活动,以满足项目需求的过程软件项目管理面临特殊挑战,如软件的无形性、复杂性、可变性等有效的项目管理需要平衡范围、进度、成本和质量等多个维度,确保项目成功交付软件项目计划制订里程碑计划关键路径法甘特图里程碑是项目中的重要时间点,标志着阶段性成果的关键路径法通过分析项目网络图,识别出影响甘特图是最常用的项目进度可视化工具,直观地展示CPM完成有效的里程碑计划应明确定义每个里程碑的交项目总工期的关键活动序列关键路径上的任务没有任务的开始时间、持续时间和结束时间,以及任务之付物、验收标准和时间节点,为项目提供清晰的进度浮动时间,任何延误都会导致整个项目延期,因此需间的依赖关系现代项目管理软件如Microsoft参考和检查点要重点管理和控制、等都提供了强大的甘特图功Project OmniPlan能项目计划制订是项目启动后的关键活动,它为项目执行提供了路线图良好的项目计划应包括工作分解结构、进度计划、资源分配、成本预算、风险管理计划WBS等内容将项目分解为可管理的工作包,是其他计划的基础WBS人员管理与团队协作团队角色与分工有效沟通策略•项目经理整体规划和协调•定期会议每日站会、迭代评审•产品经理需求分析和产品规划•文档共享知识库、设计文档•架构师系统设计和技术决策•即时通讯团队聊天工具•开发工程师功能实现和单元测试•可视化工具看板、进度报告•测试工程师质量验证和缺陷报告•面对面交流解决复杂问题•运维工程师部署和运行维护冲突管理技巧•直面冲突及时识别和解决•关注问题避免人身攻击•寻求共识找到平衡点•清晰决策明确责任和期望•持续反馈建立改进机制人员是软件项目的核心资源,人员管理的质量直接影响项目成功软件开发是知识密集型工作,需要团队成员的创造力和协作能力良好的团队应具备互补的技能、共同的目标、明确的责任和有效的沟通机制风险管理策略风险识别系统地识别和记录可能影响项目目标的风险常用方法包括头脑风暴、德尔菲法、核对表、专家访谈等风险分类有助于全面覆盖各类风险,如技术风险、管理风险、商业风险等风险评估评估每个风险的发生概率和影响程度,计算风险暴露值(概率×影响)通过风险矩阵可视化高中低风险,优先关注高风险项定性和定量分析相结合,提供全面风险画像风险应对制定风险应对策略,包括规避(消除风险)、转移(分担风险)、减轻(降低风险)和接受(接纳风险)四种基本策略针对每个重要风险,明确应对措施、责任人和触发条件风险监控持续跟踪已识别风险的状态变化,监控风险触发条件,定期重新评估风险,并识别新的风险建立风险报告和升级机制,确保风险得到及时处理风险管理是项目成功的关键因素,特别是在软件项目中,由于其特有的复杂性和不确定性有效的风险管理不是一次性活动,而是贯穿项目全生命周期的持续过程,需要团队全员参与和管理层的支持软件质量保证活动审查活动走查与检查质量度量正式审查是一种结构化的评估走查是由作者主导的非正式评通过客观的度量指标评估软件方法,由多名专家系统地检查审,向同事展示工作并收集反质量,如代码复杂度、缺陷密工作产品,识别缺陷和改进机馈检查则是更正式的过程,度、测试覆盖率等度量数据会包括技术评审、走查、检参与者提前准备,按照特定标可用于识别质量趋势、预测潜查等形式,适用于需求、设准和清单进行细致检查,记录在问题、评估改进效果计、代码等各类制品所有发现的问题工具化检测自动化工具可以持续监控代码质量,检测潜在问题静态分析工具检查代码风格、常见错误;动态分析工具监控运行时行为;覆盖率工具评估测试充分性软件质量保证是一系列系统化活动,旨在确保软件产品符合预定的质量标准有效的应该是预防性的而非仅仅检测SQA SQA性的,贯穿软件开发的全过程研究表明,越早发现和修复缺陷,成本越低在需求阶段修复缺陷的成本可能只有在生产环——境中修复的1/100标准与规范简述软件安全基础安全需求分析威胁分析与建模在需求阶段识别和定义安全需求,包括保密性、完整性、可用性、认证、授权、系统地识别潜在威胁和弱点,评估其风险级别常用方法如欺骗、篡STRIDE审计等方面安全需求应基于威胁建模和风险评估,明确定义系统的安全目标和改、否认、信息泄露、拒绝服务、特权提升和模型帮助团队从攻击者角DREAD策略度思考系统安全安全设计原则安全编码实践遵循纵深防御、最小权限、默认安全、失效安全等原则进行系统设计安全不应采用安全编码规范和最佳实践,预防常见漏洞如注入攻击、跨站脚本、不安全的是事后添加的功能,而应该是设计阶段就考虑的基本要素,融入系统架构中反序列化等静态分析工具可以帮助检测潜在的安全问题软件安全不再是可选项,而是现代软件开发的基本要求数据泄露、勒索软件和其他网络攻击的频繁发生,使得安全从开始就必须融入开发过程安全左移Security ShiftLeft理念强调将安全活动前移到开发周期的早期阶段,而非仅在发布前进行安全测试可信软件与高可用性
99.999%MTBF MTTR五个九可用性平均故障间隔时间平均修复时间全年仅允许分钟的计划外停机时间衡量系统可靠性的关键指标系统从故障恢复所需的平均时间
5.26可信软件是指能够在预期条件下持续、可靠地执行预定功能的软件可信软件的关键属性包括可靠性(长时间无故障运行)、可用性(服务持续可访问)、安全性(防止未授权访问和攻击)、完整性(数据和功能不被破坏)以及可维护性(易于修复和更新)高可用性系统通过冗余设计、故障隔离和快速恢复机制,最大限度地减少服务中断常见的高可用架构包括负载均衡、集群、热备份、地理分布式部署等金融系统通常采用双活或多活数据中心架构,确保即使整个数据中心故障,服务仍能继续电信核心网络则采用冗余模式,容忍多个组件同时失效N+M软件度量与分析规模度量进度与成本度量软件规模是估算工作量和成本的基础常用的规模度量包括项目进度和成本监控是项目管理的核心活动关键指标包括•代码行数直观但依赖语言和编码风格•计划偏差实际进度与计划的差异LOC•功能点基于用户功能而非技术实现•挣值分析结合进度和成本的综合评估FP•用例点面向对象系统的规模估算•生产率单位工作量产出的功能量•故事点敏捷项目中的相对规模估算•燃尽图敏捷项目的进度可视化软件度量为管理决策提供客观依据,帮助团队了解当前状态,预测未来趋势,识别改进机会有效的度量应该是有意义的(与业务目标相关)、经济的(收集成本合理)、客观的(不依赖个人判断)和可比较的(可在不同项目间比较)软件重用与开源组件重用库管理开源协作软件组件是可复用的软件单元,具有明确定义的接口现代软件开发大量依赖第三方库和框架库管理工具开源软件通过社区协作开发,代码公开可访问,在特和依赖关系组件重用可以显著提高开发效率,降低如、、等,提供了依赖解析、版本控定许可证下可自由使用和修改开源模式促进了知识Maven npmpip错误率成功的组件重用需要良好的设计、充分的文制和构建集成功能,极大简化了外部代码的使用和管共享和创新,也为企业提供了减少开发成本、加快上档和有效的版本管理理这些工具自动处理依赖关系,确保兼容性和一致市时间的机会参与开源项目可以提升个人技能,扩性大职业网络软件重用的层次从简单的代码复制到框架和产品线不等代码级重用简单但维护困难;函数类级重用提供了更好的封装;组件级重用支持黑盒复用;框架级重用提/供了整体架构;而产品线则支持一系列相关产品的定制化开发高层次的重用虽然初始投入大,但长期回报更高软件工程前沿趋势辅助开发AI人工智能正在改变软件开发的各个方面代码生成工具如可以根据注释和上下文生成代码片段;智能GitHub Copilot代码补全提高了编程效率;自动化测试生成减少了手动测试工作;缺陷预测帮助开发者关注高风险区域与自动化DevOps文化和实践打破了开发与运维之间的壁垒,通过自动化和协作加速软件交付持续集成持续部署管DevOps/CI/CD道实现了从代码提交到生产部署的自动化;基础设施即代码使环境配置可版本化和可重复IaC云原生开发云原生应用专为云环境设计,利用云平台的弹性和服务能力微服务架构将应用拆分为松耦合的小型服务;容器技术提供了轻量级的隔离环境;等编排工具管理容器的部署和扩展;服务网格简化了服务间通信的管理Kubernetes低代码无代码平台/低代码平台通过可视化界面和预构建组件,减少了手写代码的需求,使非专业开发者也能参与应用创建这些平台加速了应用开发,缩小了技术鸿沟,但也带来了定制化和性能方面的挑战软件工程正经历数字化转型的推动,向更智能、更自动化、更协作的方向发展将安全融入流程,确保安DevSecOps DevOps全性从开始就被考虑;利用人工智能优化运营,通过预测分析和自动化响应提高系统可靠性;数字孪生技术为物理系AIOps IT统创建数字模型,支持模拟和优化工业案例分析铁路售票系统企业级系统金融核心系统12306ERP中国铁路是世界上最大的在线票务系统之一,每企业资源规划系统整合了企业各部门的业务流程和银行核心系统是金融机构的神经中枢,处理账户管理、交12306ERP天处理数百万次查询和交易,特别在春运期间面临极端的数据,是典型的复杂信息系统项目面临的主要挑战易处理等核心业务这类系统对可靠性、安全性和性能有ERP并发压力系统采用了分布式架构、集群技术和多级缓包括需求获取困难(涉及多部门、流程复杂)、定制化极高要求,通常采用双活或多活架构确保高可用性传统存,以支持高并发访问系统经历了从早期不堪重负到现与标准化平衡、数据迁移和集成、组织变革管理等成功核心系统面临技术老化和业务灵活性不足的问题,现代化在相对稳定的演进过程,反映了大型系统不断优化的实的实施需要高层支持、有效沟通、全面培训和渐进式改造往往采用微服务架构和领域驱动设计,在保证稳定性ERP践实施策略的同时提高系统敏捷性这些工业案例展示了软件工程原理在实际项目中的应用和挑战大型系统开发不仅是技术问题,还涉及组织、管理和业务多个维度成功的项目往往具备清晰的业务目标、合理的技术选择、有效的风险管理和强大的团队协作经典失败案例警示参考书目与学习资源张海藩的《软件工程导论》第六版是本课程的主要教材,系统介绍了软件工程的基本概念、原理和方法其他推荐的经典书籍包括的《代码大全》,Steve McConnell讨论代码质量和编程实践;等人的《设计模式》,介绍面向对象设计的经典模式;的《代码整洁之道》,强调可读性和可维护性;Gamma RobertMartin Frederick的《人月神话》,探讨软件项目管理的本质挑战Brooks期末复习总览560%重点章节概念题比例软件生命周期、需求分析、设计方法、测试技术、定义、解释、比较等理解性问题项目管理40%应用题比例案例分析、方法应用、设计评估等期末考试将全面检验对软件工程核心知识的理解和应用能力重点章节包括软件生命周期模型(比较各模型的特点和适用场景)、需求分析方法(需求获取、分析和规格说明)、软件设计(架构设计、详细设计、评估方法)、软件测试(测试策略、方法和流程)以及项目管理(规划、跟踪和控制)总结与答疑工程思维系统化、规范化、可量化的方法解决软件开发问题权衡取舍在质量、成本、进度等多维度中寻找平衡点持续学习适应技术快速发展,不断更新知识和技能团队协作沟通、协调、分工是项目成功的关键通过本课程的学习,我们系统地探讨了软件工程的基本概念、方法和实践软件工程的核心思维是将工程化的思想应用于软件开发,通过系统化、规范化的方法提高软件质量和开发效率软件工程不仅是技术问题,还涉及管理、沟通、团队协作等多个维度展望未来,软件工程面临诸多机遇和挑战人工智能将进一步改变软件开发方式,提高生产力但也带来新的问题;云计算和边缘计算的发展要求软件架构的创新;数字化转型推动软件系统更深入地融入各行业;安全和隐私保护变得日益重要在这样的环境下,软件工程师需要不断学习和适应,既掌握基础理论和原则,又能灵活应用新技术和方法。
个人认证
优秀文档
获得点赞 0