还剩48页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
软件工程课程介绍欢迎各位同学参加清华大学软件工程课程本课程旨在培养学生系统掌握软件开发全生命周期的理论与实践技能,为未来成为优秀的软件工程师奠定坚实基础课程主要围绕软件工程基本概念、开发模型、需求分析、系统设计、编码实现、测试验证以及项目管理等核心知识展开,注重理论与实践相结合通过团队项目实践,学生将有机会应用所学知识解决实际问题软件工程发展历史年软件工程诞生1968在德国加米施举办的NATO会议上,首次提出软件工程概念,标志着软件工程学科的正式诞生与会专家讨论了软件开发中面临的严重问题,并探索系统化解决方案软件危机爆发20世纪60-70年代,随着计算机应用范围扩大,软件开发面临严重的质量、进度和成本问题,导致多个大型项目失败这一系列问题被称为软件危机,促使人们反思软件开发方法方法学确立70-90年代,结构化方法、面向对象方法等相继提出,软件工程逐渐发展为系统科学CMM/CMMI等成熟度模型建立,为软件过程改进提供了框架和标准敏捷时代什么是软件工程软件的定义与特性工程性思维学科交叉性软件是计算机系统中与硬件相互依工程性思维强调系统化、规范化和软件工程与计算机科学、管理科存的另一部分,是一系列按照特定可度量的方法解决问题软件工程学、数学等多学科密切相关它不顺序组织的计算机数据和指令的集将工程原理应用于软件开发,使开仅关注技术问题,还涉及团队管合与硬件不同,软件不会磨损,发过程可控、产品质量可靠、成本理、成本控制、风险评估等多方面但会过时,需要不断维护和更新合理内容,是一门综合性学科软件工程师必备素养技术能力团队协作扎实的编程基础,熟练掌握至少一种主流有效沟通与倾听能力编程语言责任心与时间管理能力良好的算法与数据结构知识版本控制工具的熟练使用理解软件架构设计原则持续学习文档能力跟踪技术发展趋势清晰准确的技术文档编写能力自我驱动的学习能力需求分析与转化能力解决问题的创新思维API文档与注释规范软件系统分类嵌入式系统信息管理系统嵌入式系统是一种专用的计算机系统,信息管理系统主要处理数据的存储、检作为装置或设备的一部分这类软件通索、分析和展示,是企业和组织管理的常需要实时响应、高可靠性和资源受限重要工具这类系统强调数据一致性、的环境下运行事务处理和用户界面•汽车电子控制单元ECU•企业资源规划ERP系统•智能家电控制系统•客户关系管理CRM系统•医疗设备软件•学校教务管理系统人工智能与大数据软件随着技术发展,AI和大数据软件成为新兴类别这类系统处理海量数据,应用机器学习算法,为用户提供智能决策支持和自动化服务•推荐系统•智能客服机器人•数据分析与可视化平台软件生命周期总览需求分析确定系统功能和约束与用户沟通,捕获期望系统设计架构和详细设计定义系统结构和接口编码实现按设计编写程序单元测试验证功能测试验证系统集成和测试确保满足需求维护支持修复缺陷和功能增强适应环境变化软件生命周期代表软件从概念形成到最终退役的完整过程不同的开发模型(如瀑布模型、增量模型、敏捷方法等)对这些阶段的顺序和侧重点有不同安排每个阶段都有明确的输入、活动、控制点和输出,确保软件开发过程可控、可管理软件工程的基本原则抽象化关注本质,忽略细节模块化功能划分为独立模块信息隐藏封装内部实现,提供接口稳健性异常情况下稳定运行可维护性便于理解和修改这些基本原则构成了软件工程实践的基础抽象化帮助我们处理复杂问题,模块化使大型系统变得可管理,信息隐藏减少模块间依赖,稳健性确保软件在各种条件下可靠运行,而可维护性则关注软件的长期演化遵循这些原则有助于开发出高质量、易于维护的软件系统在实际项目中,工程师需要灵活平衡这些原则,根据项目特点和约束条件做出合理决策软件开发模型概述软件开发模型是指导软件开发过程的方法论框架,它定义了软件开发的阶段、活动和交付物选择合适的开发模型对项目成功至关重要,它影响着团队协作方式、风险管理策略和产品质量瀑布模型增量模型螺旋模型敏捷模型阶段线性顺序进行,每阶将系统分解为多个增量,迭代的方式进行,每次迭短周期迭代,持续交付,段完成后才进入下一阶段逐个开发交付代都包含风险分析强调适应变化适用场景需求稳定,项适用场景需求明确但允适用场景大型复杂项适用场景需求频繁变目规模适中,技术成熟许分阶段实现,需要提前目,风险高,需求不稳定化,需要快速响应市场交付核心功能瀑布模型模型特点瀑布模型是最早的软件开发模型之一,由Winston Royce于1970年提出它将软件开发过程划分为线性顺序的阶段,包括需求分析、系统设计、编码实现、系统测试和运行维护每个阶段必须完成并通过评审后才能进入下一阶段,就像水流向下一样,故称瀑布模型优势与局限瀑布模型的主要优势在于结构清晰、易于管理,每个阶段有明确的里程碑和文档;适合需求稳定、技术成熟的项目其局限性在于缺乏灵活性,难以应对需求变化;用户反馈被推迟到项目后期,可能导致开发产品与用户期望不符应用场景瀑布模型适用于需求明确稳定、技术路线清晰的项目,如嵌入式系统、航空航天等关键任务软件在这些领域,过程的规范性和严谨性比快速迭代更为重要清华大学软件工程课程中,我们将通过小型项目实践,帮助学生理解瀑布模型的应用与局限原型模型需求收集原型开发与用户沟通,收集初步需求快速构建可演示的系统原型改进原型用户评价根据反馈调整优化原型用户体验原型并提供反馈原型模型强调在正式开发前通过构建原型来验证需求的可行性和用户体验这种模型特别适合用户界面丰富或用户需求不明确的系统,通过早期反馈减少后期变更风险原型可分为抛弃型原型和演化型原型抛弃型原型仅用于需求确认,之后会被丢弃;而演化型原型则作为系统的基础,逐步完善成最终产品例如,清华大学学生开发的校园服务APP,就采用了原型模型,通过多轮用户测试不断优化界面和功能,最终获得了良好的用户满意度螺旋模型螺旋模型是由Barry Boehm于1988年提出的,它将瀑布模型的系统性与原型模型的迭代性结合起来,并特别强调风险分析该模型以螺旋形式展开软件开发过程,每次迭代包含四个阶段制定计划、风险分析、工程实现和客户评估螺旋模型的核心优势在于将风险管理纳入开发流程,尤其适合大型复杂系统的开发通过每轮迭代的风险分析,团队可以及早识别并解决潜在问题,降低项目失败风险例如,国防工业和航空航天领域的许多项目采用螺旋模型,既保证了开发过程的规范性,又能灵活应对技术挑战和需求变更敏捷开发基础敏捷宣言框架Scrum2001年,17位软件开发专家在美国Scrum是最流行的敏捷方法之一,犹他州共同制定了《敏捷宣言》,它将开发过程分为若干个短周期提出了敏捷开发的四个核心价值观(称为Sprint,通常2-4周),每个个体和互动高于流程和工具;工作Sprint都会交付可用的产品增量的软件高于详尽的文档;客户合作Scrum团队包括产品负责人、高于合同谈判;响应变化高于遵循Scrum Master和开发团队,通过每计划这一宣言为软件开发提供了日站会、Sprint计划会和回顾会等新的思维方式仪式保持高效协作极限编程XPXP强调编程实践,包括结对编程、测试驱动开发、持续集成等技术实践它特别重视代码质量和技术卓越性,通过频繁的反馈和持续改进来适应需求变化XP的实践使团队能够以稳定的步伐交付高质量软件,同时保持对变化的响应能力敏捷开发实践案例腾讯敏捷转型阿里巴巴敏捷实践腾讯从2011年开始探索敏捷方法,最初在微信团队试点阿里巴巴从2008年开始推行敏捷开发,特别是在淘宝、支付Scrum,取得显著成效后逐步推广到其他产品线转型过程宝等核心业务中广泛应用阿里的敏捷模式强调小步快跑中,腾讯注重适应中国文化特点,形成了腾讯敏捷模式和持续交付•建立了站会-周会-月会的多层次沟通机制•建立了产品-设计-开发-测试紧密协作的小团队机制•推行需求-开发-测试三位一体的质量保障模式•实行双周迭代,提高产品迭代速度•构建了完善的持续集成和持续交付平台•引入用户参与的开放测试机制这些成功案例表明,敏捷方法在中国互联网企业取得了显著成效成功因素包括管理层的坚定支持、团队文化的转变、工具链的完善支撑,以及对敏捷方法的本地化调整清华大学软件工程课程中,我们将邀请业界专家分享这些实践经验,帮助学生理解敏捷方法的实际应用理念DevOps计划与编码构建与测试需求管理、版本控制自动化构建、持续测试监控与反馈发布与部署性能监测、用户反馈自动化部署、环境一致性DevOps是Development(开发)和Operations(运维)的组合词,代表一种文化、一组实践和工具,旨在打破开发与运维之间的壁垒,实现高效协作DevOps强调自动化和测量,促进软件更快速、稳定地交付现代DevOps实践依赖于完整的工具链,包括Git(版本控制)、Jenkins/GitLab CI(持续集成)、Docker(容器化)、Kubernetes(容器编排)、Ansible(配置管理)、Prometheus(监控)等这些工具相互配合,形成了端到端的自动化流水线,大幅提高了软件交付效率和质量清华大学的软件工程课程将提供实验环境,让学生亲身体验DevOps工具链的使用持续集成与持续部署代码提交开发人员频繁提交代码到版本控制系统自动构建与测试触发自动化构建和各级测试质量门禁静态代码分析、安全扫描、覆盖率检查自动部署自动部署到测试或生产环境持续集成CI是指开发人员频繁地将代码集成到主干,并通过自动化构建和测试验证代码质量持续部署CD则进一步将验证通过的代码自动部署到生产环境CI/CD实践极大地提高了软件交付速度和质量,减少了集成问题在现代软件企业中,CI/CD已成为标准实践通过频繁集成,团队可以更早发现问题;通过自动化测试,保障每次变更的质量;通过自动化部署,消除人工操作的风险和延迟例如,蚂蚁金服的移动应用可以实现每天多次发布,而保持服务稳定性,这正是得益于完善的CI/CD流程软件需求分析方法需求获取通过访谈、问卷、观察等方式收集用户需求需求分析识别、分类、优先级排序,解决需求冲突需求规格说明编写正式的需求文档,建立需求基线需求管理跟踪需求变更,确保需求的可追溯性软件需求是指用户对系统功能、性能、约束等方面的期望需求分析是软件开发的基础性工作,直接影响项目成功率需求分析的目标是明确做什么而非怎么做,确保各方对系统期望达成共识有效的需求分析需要运用多种方法和技术,包括结构化分析、面向对象分析、原型法等在清华软件工程课程中,我们特别强调需求分析的实践训练,通过真实项目练习帮助学生掌握需求获取、分析和管理的方法与技巧需求文档撰写规范标准用例描述示例IEEE-830IEEE-830是软件需求规格说明书SRS的国际标准,提供了需用例是描述系统功能的有效方式,一个标准用例描述通常包求文档的结构和内容指南一份完整的SRS通常包括以下主含要部分•用例编号和名称UC-001用户登录
1.引言目的、范围、定义、参考资料和概述•参与者注册用户
2.总体描述产品前景、功能、用户特征、约束和假设•前置条件用户已注册账号
3.特定需求功能需求、性能需求、界面需求等•基本流程用户输入账号密码→系统验证→登录成功
4.附录数据字典、分析模型等•替代流程验证失败→提示错误→重新输入•后置条件用户成功登录系统在清华大学软件工程课程中,我们强调需求文档的准确性、完整性、一致性、可验证性和可追溯性好的需求文档应避免模糊语言,使用精确的描述,并且易于理解和测试学生将通过团队项目实践,掌握需求文档的编写技巧和质量控制方法需求分析工具建模工具需求管理系统UML统一建模语言UML是可视化需求和设计的专业的需求管理工具提供需求收集、分析、强大工具,包含多种图表类型追踪和变更控制功能•用例图描述系统功能和参与者•IBM DOORS企业级需求管理解决方案•类图展示系统静态结构和关系•Jama Connect协作式需求和测试管理平台•时序图表示对象间的交互顺序•ReqView轻量级需求管理工具•活动图展示业务流程和算法流程•JIRA+Confluence敏捷开发中的需求管常用工具Enterprise Architect、StarUML、理组合Visual Paradigm原型设计工具原型工具帮助快速可视化需求,促进用户反馈•Axure RP高保真交互原型设计•Sketch+InVision UI设计与原型协作•Figma实时协作的界面设计平台•Balsamiq快速创建线框图用户故事与用例建模用户故事格式用例图实例用户故事是敏捷方法中描述需求的常用形式,采用简洁的语用例图是UML中用于可视化系统功能和参与者的图表它言描述用户期望实现的功能标准格式为展示了系统与外部参与者的交互,以及系统提供的服务用例图的主要元素包括作为[角色],我希望[功能],以便[价值/目的]•参与者Actor使用系统的人或外部系统例如作为在线购物用户,我希望能够保存我的收货地址,以便未来下单时不必重复输入•用例Use Case系统提供的功能•关系包括关联、包含、扩展等用户故事通常在故事卡上记录,并附带验收标准,用于验证故事是否完成INVEST原则(独立、可协商、有价值、可在清华软件工程课程中,学生将通过实际项目练习绘制用例估算、小、可测试)是评估用户故事质量的重要标准图,掌握用例分析方法课程还将介绍如何将用户故事转化为用例,以及两种需求表达方式的比较和适用场景需求变更管理变更申请提交正式的需求变更请求CR,描述变更内容、原因和预期效果影响分析评估变更对进度、成本、质量的影响,分析技术可行性和风险变更评审变更控制委员会CCB评审变更请求,决定接受、拒绝或推迟实施与跟踪更新需求基线,调整项目计划,跟踪变更实施情况需求变更是软件项目中的常态,有效的变更管理是项目成功的关键因素变更管理的目标不是阻止变更,而是确保变更在控制下进行,平衡业务需求与项目约束在清华软件工程课程中,我们将通过案例分析和项目实践,帮助学生理解需求变更的影响和管理策略特别强调需求可追溯性矩阵的建立,确保变更影响的全面分析同时,学生将学习不同开发方法(如瀑布模型与敏捷方法)中的变更管理差异软件架构设计方法表示层用户界面,处理用户交互应用层业务逻辑,协调业务流程数据访问层数据增删改查、持久化基础设施层通用技术服务和资源软件架构是系统的骨架,定义了系统的主要组件、它们之间的关系以及与外部环境的交互方式良好的架构设计能够满足功能需求,同时支持可靠性、性能、安全性等质量属性除了经典的分层架构,现代系统还采用多种架构风格,如MVC/MVP模式(分离界面与业务逻辑),微服务架构(将系统拆分为独立服务),事件驱动架构(通过事件实现松耦合)等在清华软件工程课程中,学生将学习各种架构风格的优缺点和适用场景,掌握架构设计的原则和方法架构设计工具与标准架构设计需要使用专业的工具和标准来表达和沟通设计思想UML(统一建模语言)是最广泛使用的架构建模工具,其中类图用于表示系统的静态结构,时序图展示对象间的交互顺序,组件图描述系统的物理结构和依赖关系架构设计文档是沟通架构决策的重要工具IEEE1471/ISO42010标准提供了架构描述的框架,推荐从多个视图(如逻辑视图、进程视图、物理视图、开发视图)描述架构优秀的架构文档不仅记录了设计决策,还解释了决策背后的考量和权衡,帮助团队理解架构意图在清华软件工程课程中,我们将训练学生编写规范、清晰的架构文档设计原则与模式原则创建型模式SOLIDSOLID是面向对象设计的五个基本原则的首字母缩写,包括单一职责原创建型模式关注对象的创建机制,试图在系统使用哪些对象以及如何创建则SRP、开放封闭原则OCP、里氏替换原则LSP、接口隔离原则ISP和这些对象之间增加一层抽象主要包括工厂方法模式、抽象工厂模式、依赖倒置原则DIP这些原则旨在使软件设计更加灵活、可维护和可扩单例模式、建造者模式和原型模式这些模式帮助系统独立于对象的创建展应用SOLID原则可以减少代码的脆弱性和耦合性,提高可重用性过程,提高了系统的灵活性和可复用性结构型模式行为型模式结构型模式关注如何组合类和对象以形成更大的结构主要包括适配器行为型模式关注对象之间的通信和责任分配主要包括观察者模式、策模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式和代理模略模式、命令模式、模板方法模式、迭代器模式、状态模式等这些模式式这些模式通过识别对象之间简单关系来简化设计,使系统更加灵活和定义了对象之间的交互方式,增强了系统的灵活性和扩展性,同时降低了高效对象间的耦合度编码规范与实践清华课堂代码规范代码可读性与维护性清华大学软件工程课程推行严格的代码规范,包括代码不仅是写给计算机执行,更是写给人阅读高质量代码应具备•命名规范采用有意义的名称,类名使用大驼峰,方法名使用小驼峰,常量全大写•自文档化代码本身清晰表达意图,减少注释依赖•注释规范类、方法必须有Javadoc注释,关键算法需要•简单性避免过度设计,保持逻辑简单直接详细解释•一致性在整个代码库中保持一致的风格和模式•格式规范统一缩进(4空格),行宽不超过80字符,括•模块化功能独立,高内聚低耦合号使用KR风格•可测试性便于单元测试和自动化测试•异常处理明确异常类型,提供有意义的错误信息代码质量直接影响软件的可维护性和长期成本在课程实践中,我们将通过代码评审、静态分析工具(如SonarQube、PMD)和结对编程等方式,培养学生编写高质量代码的能力学生将了解技术债务的概念,认识到前期代码质量对后期维护的重要影响现代开发语言简介Java PythonC++Java是一种广泛使用的面Python以简洁的语法和强C++是一种强大的系统编程向对象编程语言,以一次大的库生态系统闻名,特语言,结合了高级语言特编写,到处运行的特性著别适合快速开发和数据科性和底层内存控制能力称Java虚拟机JVM使其学应用其batteries它广泛用于性能关键型应具有出色的跨平台能力included理念提供了丰富用,如游戏引擎、操作系Java生态系统丰富,包括的标准库,加上NumPy、统和实时系统现代Spring、Hibernate等流行Pandas、TensorFlow等第C++C++11/14/17/20引入了框架,广泛应用于企业级三方库,使Python成为人智能指针、lambda表达式应用、Android开发和大数工智能和数据分析的首选等特性,提高了安全性和据处理语言生产力除了传统的编程语言,近年来出现了许多新兴语言,如Rust(内存安全的系统编程语言)、Go(并发友好的云基础设施语言)、Kotlin(现代JVM语言,Android官方支持)、Swift(iOS开发语言)等这些语言针对特定领域的需求,提供了更高效、安全和易用的解决方案在清华软件工程课程中,我们关注语言特性背后的设计思想和适用场景,培养学生根据项目需求选择合适编程语言的能力版本控制系统基础操作GitGit是目前最流行的分布式版本控制系统,由Linux之父Linus Torvalds创建与集中式版本控制系统(如SVN)不同,Git的每个工作副本都是一个完整的代码仓库,支持离线工作和分布式协作Git的核心概念包括仓库repository、提交commit、分支branch、合并merge和远程仓库remote常用命令包括git init/clone、git add、git commit、git pull/push、gitbranch/checkout等学生需要熟练掌握这些基本操作,理解工作区、暂存区和版本库的概念分支管理策略有效的分支管理是团队协作的关键常见的分支模型包括Git Flow(主分支、开发分支、特性分支、发布分支和热修复分支)、GitHub Flow(基于主分支和特性分支的简化模型)和GitLab Flow(结合环境部署的模型)在清华软件工程课程的团队项目中,我们采用改进的Git Flow模型,要求学生明确分支命名规范,理解各类分支的生命周期,并通过Pull Request进行代码评审学生将学习解决合并冲突的技巧,以及如何使用交互式变基rebase保持提交历史的清晰平台应用GitLab/GitHub除了基本的版本控制功能,现代协作平台如GitLab和GitHub还提供了项目管理、持续集成、代码评审等丰富功能学生将学习如何利用这些平台功能提高团队协作效率,包括使用Issue跟踪任务、设置CI/CD流水线、创建Wiki文档等课程将介绍钩子hook和Action的概念,教授学生如何通过自动化脚本实现提交验证、代码风格检查、自动构建等流程,提高开发质量和效率软件测试基础用户验收测试确认系统满足用户需求界面测试验证用户界面功能和易用性集成测试3验证模块间交互正确性单元测试验证最小代码单元的功能软件测试是评估软件质量、发现缺陷的系统性过程测试的目标包括验证功能正确性、评估性能和安全性、确保用户体验等测试可以按照目的分为验证测试(确保软件满足规格说明)和确认测试(确保软件满足用户需求)测试金字塔模型建议在底层进行大量的单元测试,中层进行适量的集成测试,顶层进行少量的UI和端到端测试这种分层策略能够在保证测试覆盖率的同时,提高测试效率和可靠性在清华软件工程课程中,学生将学习各类测试技术和测试设计方法,如等价类划分、边界值分析、决策表测试和路径测试等测试驱动开发()TDD实现功能2编写最简代码使测试通过编写测试先写失败的测试用例重构优化改进代码结构保持测试通过测试驱动开发TDD是一种开发方法,要求在编写功能代码之前先编写测试代码TDD的核心理念是红-绿-重构循环先编写一个会失败的测试(红),然后编写最简单的代码使测试通过(绿),最后重构代码提高质量(重构)这种方式有助于澄清需求,设计出可测试的代码结构在清华软件工程课程中,我们将通过实际案例演示TDD的应用例如,实现一个简单的计算器功能先编写测试验证加法操作,编写代码实现加法,然后重构;接着为减法、乘法等功能添加测试并实现学生将亲身体验TDD如何帮助发现设计问题、减少缺陷,以及在代码演化过程中保持功能稳定自动化测试工具单元测试框架工具中的自动化测试Mock CI单元测试框架是自动化测试的基础设Mock工具用于创建测试替身,隔离被持续集成系统自动执行测试,及早发施,提供用例定义、断言、测试运行测单元与其依赖现问题和报告生成功能•Mockito Java中流行的Mock框架•Jenkins可配置测试作为构建流•JUnit Java生态系统中最流行的程的一部分•unittest.mock Python标准库中单元测试框架的Mock模块•GitLab CI与代码仓库集成的•pytest Python的灵活测试框架,CI/CD平台•Sinon.js JavaScript测试中的支持参数化测试Mock/Stub/Spy工具•GitHub Actions基于事件触发的•GoogleTest C++的测试框架,支自动化工作流通过Mock,测试可以专注于被测单元持丰富的断言和夹具的逻辑,不受外部系统或复杂依赖的这些工具生成测试报告和覆盖率统这些框架支持测试夹具fixture设影响计,帮助团队监控产品质量置、参数化测试、异常测试等高级功能缺陷管理与追踪缺陷报告测试人员或用户发现并记录缺陷,包含描述、重现步骤、严重程度等信息缺陷分类与分配项目经理或质量负责人确认缺陷,评估优先级,分配给开发人员缺陷修复开发人员分析问题根源,实现修复方案,更新代码和相关文档验证与关闭测试人员验证修复效果,确认无新问题后关闭缺陷缺陷(Bug)管理是软件质量保证的重要环节一个完整的缺陷生命周期包括新建、确认、分配、解决、验证和关闭等状态有效的缺陷管理不仅要跟踪当前问题,还应积累经验,预防类似缺陷再次发生在实际项目中,团队通常使用专业的缺陷管理平台,如JIRA、Bugzilla、Redmine等这些工具提供缺陷记录、状态跟踪、统计分析等功能,支持与版本控制系统和CI/CD平台集成,实现缺陷与代码变更的关联在清华软件工程课程的团队项目中,学生将使用这些工具进行实践,体验完整的缺陷管理流程软件重构与维护重构的时机常见重构技术重构是在不改变软件外部行为的前提下,改善内部结构的过程马丁·福勒在《重构改善既有代码的设计》中系统化了重构技以下情况通常需要考虑重构术,包括•添加新功能前,改善相关代码结构•提取方法将代码片段提取为独立方法•发现代码异味,如重复代码、过长方法•移动方法将方法移到更合适的类•代码评审发现设计问题•替换条件表达式为多态•测试覆盖率达到理想水平,为优化创造条件•提取类/接口分离职责•引入参数对象简化参数列表重构应是持续、小步进行的活动,而非一次性大规模改造现代IDE提供了自动化重构工具,降低了重构风险软件维护占据了软件生命周期成本的60%-80%,包括纠错性维护(修复缺陷)、适应性维护(适应环境变化)、完善性维护(添加新功能)和预防性维护(提高质量)良好的设计和持续重构可以降低维护成本,延长软件生命周期在清华软件工程课程中,我们将通过实际代码案例,演示如何识别代码异味,应用重构技术改善代码质量,同时利用自动化测试确保重构过程不引入新的缺陷项目管理基础项目经理职责团队角色分工制定项目计划与目标产品经理需求分析与优先级协调资源与任务分配架构师技术方案与标准跟踪进度与风险管理开发工程师功能实现与利益相关方沟通测试工程师质量保障项目生命周期管理活动启动构建团队,明确目标范围管理明确边界计划详细规划与资源分配进度管理确保按时交付执行开发与控制质量管理满足要求收尾验收与总结风险管理预防与应对进度管理与计划工具甘特图敏捷看板甘特图Gantt Chart是最常用的进度可视化工看板Kanban源自丰田生产系统,在软件开发具,以横条表示任务持续时间,直观展示任务中用于可视化工作流程和限制在制品数量典顺序、依赖关系和项目关键路径甘特图特别型的看板分为待办、进行中、完成等列,适合展示里程碑和阶段性成果,帮助团队理解团队成员通过拖拽卡片反映任务状态项目时间线•Trello直观的看板工具,支持卡片、清•Microsoft Project功能强大的专业项目管单和标签理软件•Jira企业级敏捷项目管理平台,支持看•GanttPRO简洁易用的在线甘特图工具板和Scrum•TeamGantt协作式项目管理平台•Asana结合看板和时间线的团队协作工具中国本土工具许多中国企业开发了适合本土团队协作特点的项目管理工具,融合了甘特图、看板等多种视图•腾讯TAPD一站式敏捷研发协作平台•阿里云效覆盖需求、开发、测试的研发管理平台•禅道国产开源项目管理软件成本与质量管理软件项目成本构成预算编制方法软件项目成本主要包括常用的预算估算方法包括•人力成本通常占总成本的60%-70%,包括开发、测试、管•类比估算基于类似历史项目的数据理等各类人员薪资•参数模型如COCOMO构造性成本模型•基础设施成本硬件、软件许可、云服务等•自下而上估算累加各组件详细估算•培训与支持成本技术培训、用户支持等•三点估算最乐观、最可能、最悲观估计的加权平均•管理成本项目管理、质量保证等间接成本在清华软件工程课程中,学生将学习这些估算方法,并在项目值得注意的是,软件生命周期中,维护成本通常远高于初始开实践中应用发成本投资于高质量开发,可以显著降低长期总成本质量管理是控制成本的关键因素软件质量保证SQA体系包括过程质量和产品质量两个方面过程质量关注开发过程的规范性,通过评审、检查和改进活动确保;产品质量关注软件的功能性、可靠性、易用性等属性,通过各级测试活动验证质量成本理论将成本分为预防成本、评估成本和失效成本投资于预防和评估活动,可以大幅降低失效成本,特别是外部失效成本(产品发布后发现的问题)这种左移的质量保障思想,是现代软件工程的重要理念风险管理方法风险识别通过头脑风暴、德尔菲法、访谈、历史项目分析等方法,识别可能影响项目目标的不确定性因素常见的软件项目风险包括需求变更、技术风险、人员风险、进度风险和外部依赖风险等识别阶段应尽可能全面,不遗漏重要风险风险评估对已识别的风险进行定性和定量分析,评估其发生概率和影响程度通常使用风险矩阵(概率×影响)确定风险等级,帮助团队确定优先处理的风险高概率高影响的风险需要重点关注,而低概率低影响的风险可能只需要监控风险应对针对重要风险制定应对策略,包括规避(消除风险)、转移(将风险转给第三方)、减轻(降低概率或影响)和接受(接受并准备应急计划)每种应对策略都有其成本和效果,需要根据风险特性和项目约束选择合适的策略风险监控持续跟踪已识别风险的状态变化,评估应对措施的有效性,并识别新出现的风险定期的风险评审会议是常用的监控手段,团队可以更新风险登记册,调整应对策略,确保项目风险在可控范围内沟通与会议管理需求评审会议日常站会需求评审是确保需求文档质量的关键活动源自Scrum的日常站会Daily Standup是参与者通常包括产品经理、开发团队、测一种简短、高效的团队同步机制会议通试团队和领域专家会议目标是检查需求常在每天固定时间举行,每人限时回答三的完整性、准确性、一致性和可测试性,个问题昨天完成了什么、今天计划做什识别潜在问题和风险有效的需求评审可么、是否遇到阻碍站会的核心是信息同以大幅降低后期变更成本,会议结果应形步而非问题解决,发现的问题应安排会后成明确的行动项,并追踪到解决讨论站会应控制在15分钟内,保持专注和高效迭代回顾会议迭代回顾Retrospective是项目团队持续改进的重要机制在每个迭代或阶段结束时,团队反思做得好的方面、需要改进的方面和下一步行动计划关键是创造安全的环境,鼓励坦诚交流,避免指责文化有效的回顾会议应产生明确的改进措施,并在下一迭代中实施和评估效果有效的沟通是项目成功的关键因素除了正式会议,团队还需要建立畅通的日常沟通渠道,包括即时通讯工具、项目管理平台和文档协作系统等在清华软件工程课程的团队项目中,学生将练习各类会议的组织和参与,培养高效沟通的能力软件度量与统计分析80%代码覆盖率目标行覆盖率指标,衡量测试执行的代码比例10圈复杂度上限方法的最大圈复杂度限制,确保可测试性
1.5%缺陷密度标准每千行代码的缺陷数量控制目标85%客户满意度用户反馈评分,衡量产品质量和价值软件度量是通过定量方法收集、分析软件产品和过程的数据,为管理决策提供客观依据度量指标可分为过程度量(如开发效率、缺陷修复率)和产品度量(如代码规模、复杂度、可靠性)常用的代码度量指标包括代码行数LOC、圈复杂度McCabe、耦合度和内聚度等这些指标可以通过静态分析工具自动收集,如SonarQube、PMD等项目管理度量则包括进度偏差、成本偏差、需求变更率等,帮助评估项目健康状况在清华软件工程课程中,学生将学习如何设定合理的度量目标,解释度量数据,并基于数据指导改进活动过程改进模型初始级Level1过程不可预测,缺乏形式化管理已管理级Level2建立基本项目管理流程已定义级Level3标准过程得到定义和应用量化管理级Level4过程基于度量进行控制优化级Level5持续过程改进能力成熟度模型集成CMMI是一个过程改进框架,为组织提供了改进软件开发能力的路径CMMI定义了5个成熟度级别和22个过程域,包括需求管理、项目规划、配置管理等关键实践领域在清华大学计算机系的实际实践中,软件工程教研室与多家企业合作开展过CMMI导入与评估项目这些项目帮助企业系统化改进软件过程,提高产品质量和开发效率课程将分享这些真实案例,包括成功经验和挑战,帮助学生理解过程改进的实际应用和价值用户体验与交互设计用户研究理解用户需求与行为用户访谈与观察信息架构组织内容与功能结构用户流程设计交互设计定义界面元素与行为线框图与原型视觉设计创建界面视觉风格色彩、排版与品牌可用性测试评估设计效果收集反馈并迭代用户体验UX设计关注用户与产品交互的整体感受,包括易用性、可访问性、情感反应等多个维度良好的UX设计基于深入理解用户需求和行为,通过迭代设计过程不断优化产品体验在软件工程中,UX/UI设计不再是开发后期的装饰,而是整个开发流程中的关键环节早期的用户研究和原型设计有助于验证产品概念,降低开发风险可用性测试则帮助发现用户实际使用过程中的问题,指导设计改进清华软件工程课程将邀请专业UX设计师分享实践经验,并组织学生参与简化版的用户研究与可用性测试活动开源与商业软件开发差异开源软件开发特点商业软件开发特点开源软件的开发模式具有明显的特点商业软件开发则有其独特方面•分布式协作全球开发者自发贡献•目标导向明确的商业目标和期限•透明性代码和决策过程公开•资源约束预算和人力资源控制•社区驱动功能由社区需求决定•保密性核心技术和决策不公开•精英治理贡献者影响力基于技术能力•客户关系直接响应付费客户需求•持续集成频繁合并,小步迭代•质量保证严格的测试和验收流程Linux内核、Apache服务器等都是这种模式的成功案例商业软件更关注商业价值和客户满意度在现代软件工程实践中,开源与商业开发模式的界限正在模糊许多商业公司积极参与开源项目,同时在其中融入商业元素,如云服务、专业支持等增值服务例如,Red Hat通过为开源软件提供企业级支持服务实现商业成功;微软拥抱开源,将GitHub收入麾下并成为Linux基金会白金会员清华软件工程课程将探讨如何在商业环境中有效利用开源资源,以及如何在企业内部推行类似开源的协作机制,实现敏捷高效的项目管理学生将了解开源许可证的类型和选择,以及如何合规使用开源组件软件工程与人工智能工程与传统工程的交集新实践AI MLOps人工智能系统开发结合了传统软件工MLOps机器学习运维是AI系统开发的程实践和AI特有的方法两者共享需新兴实践,融合了DevOps思想和机器求分析、架构设计、测试验证等基本学习工程特点MLOps关注模型的持流程,但AI系统特别强调数据管理、续训练、验证、部署和监控,解决AI模型训练与评估等环节AI工程需要系统特有的挑战,如数据漂移、模型更加敏捷和实验性的方法,以应对模解释性和公平性等清华软件工程课型优化过程中的不确定性程将介绍MLOps工具链和最佳实践赋能软件开发AIAI技术正反过来改变软件开发本身代码智能补全如GitHub Copilot提高编程效率;自动化测试生成工具降低测试成本;智能缺陷预测系统帮助发现潜在问题;自然语言需求分析工具辅助需求提取这些工具正成为现代软件工程师的得力助手在清华软件工程课程中,我们将探讨AI系统开发中的独特挑战,如数据质量管理、模型版本控制、AI伦理与合规等学生将通过小型实践项目,体验AI驱动的开发工具,理解它们对软件开发流程的影响,并思考软件工程在AI时代的演进方向互联网与大规模软件开发+微服务架构云原生开发微服务架构是当代互联网软件开发的主流范式,它将复杂系统云原生是一种构建和运行应用的方法,充分利用云计算模型的分解为小型、自治的服务,每个服务负责特定业务功能并可独优势云原生的关键技术包括立部署微服务的核心特点包括•容器化应用及其依赖封装成容器•服务自治每个服务拥有独立的数据存储和业务逻辑•服务网格管理服务间通信•按业务划分服务边界遵循业务领域边界•不可变基础设施基础设施定义为代码•去中心化治理不同服务可以使用不同技术栈•声明式API使用声明而非命令管理应用•弹性扩展服务可以根据负载独立扩展Kubernetes成为云原生应用的事实标准平台,CNCF云原生计阿里巴巴、腾讯等中国互联网巨头都采用微服务架构支撑其大算基金会推动相关技术的发展与标准化规模应用大规模软件开发面临的挑战不仅是技术问题,还包括组织和协同问题康威定律指出系统设计反映组织结构,因此大型互联网公司通常采用与微服务相匹配的小团队自主组织模式在清华软件工程课程中,我们将分析大规模开发的最佳实践,探讨技术架构与组织架构的协同演进大数据系统软件工程数据获取从多源收集数据ETL处理与清洗数据存储分布式文件系统NoSQL数据库数据处理批处理计算流式处理数据分析机器学习模型商业智能报表大数据系统的软件工程实践与传统应用开发有显著差异大数据系统特别关注数据的可扩展处理、分布式计算、容错机制和实时性能Hadoop生态系统为大数据处理提供了完整解决方案,包括HDFS分布式文件系统、MapReduce分布式计算框架、Hive数据仓库等组件Spark是当代大数据处理的主流框架,提供了统一的批处理和流处理API,内存计算显著提升性能在许多实际项目中,Spark与Hadoop组件结合使用,形成完整的大数据平台例如,某电商平台使用Kafka收集用户行为数据,Spark Streaming进行实时处理,Spark MLlib构建推荐模型,最终通过HBase支持个性化推荐服务移动及嵌入式开发前沿移动应用开发流程车载软件特殊性现代移动应用开发已形成成熟的工程化流程,车载软件作为嵌入式系统的重要分支,具有特包括殊要求•跨平台框架选型Flutter、React Native•功能安全ISO26262标准遵循,确保系统等降低开发成本安全性•UI/UX适配针对不同设备尺寸和操作系•实时性能毫秒级响应要求,尤其是统的界面优化ADAS系统•持续交付通过AppCenter、TestFlight等•环境适应性应对温度、振动等极端条件平台实现频繁发布•长生命周期10年以上的维护与升级支持•性能优化针对电池、内存、网络等移动环境的限制物联网开发趋势IoT系统开发融合了嵌入式和云技术•边缘计算将部分处理能力下沉到设备端•低功耗通信LoRa、NB-IoT等技术支持远距离低功耗连接•OTA更新远程固件更新确保设备长期安全•设备管理平台集中管理海量设备的状态和配置安全性与隐私保护设计安全设计威胁建模实施安全控制措施识别潜在安全威胁1安全编码遵循安全编码规范3安全监控安全测试运行时安全监测漏洞扫描与渗透测试安全开发生命周期SDL是一种系统化方法,旨在将安全性融入软件开发的各个阶段SDL的核心理念是安全左移,即尽早识别和解决安全问题,降低后期修复成本微软、阿里巴巴等公司都建立了完善的SDL实践在隐私保护设计方面,隐私设计Privacy byDesign原则要求在系统设计之初就考虑隐私保护具体实践包括数据最小化收集、用户知情同意、匿名化处理、数据加密存储和传输、访问控制等随着《中华人民共和国个人信息保护法》等法规实施,隐私保护已成为软件开发必须重视的环节新趋势DevSecOps安全自动化DevSecOps将安全实践整合到DevOps流程中,实现左移安全自动化安全工具在CI/CD管道中发挥关键作用,包括静态应用安全测试SAST检查源代码缺陷,动态应用安全测试DAST模拟攻击行为,软件成分分析SCA识别第三方组件风险这些工具与版本控制和构建系统无缝集成,确保每次代码变更都经过安全验证合规即代码现代DevSecOps实践将合规要求转化为可执行的策略代码,称为合规即代码通过定义安全策略规则,自动检查基础设施和应用配置是否符合安全标准,如CIS基准、NIST框架等这种方法使合规状态可持续监控,避免了传统的点对点审计方式配置扫描工具可以持续评估云资源、容器镜像和应用设置,及时发现安全风险安全可观测性DevSecOps强调运行时安全监控和响应,构建安全可观测性系统现代安全监控结合了日志分析、指标监控和分布式追踪,全面捕获安全相关事件异常检测算法可以识别潜在的安全威胁,如异常访问模式或数据外泄尝试安全信息与事件管理SIEM系统整合多源数据,提供集中的安全态势感知,支持快速响应和威胁狩猎软件工程教育与认证清华工程师能力培养专业认证与资格证书清华大学软件工程教育注重培养学生的综合能力软件工程领域的主要认证包括•技术能力扎实的编程基础、算法设计和系统架构能力•项目管理专业人士PMP全球认可的项目管理资格•工程能力项目管理、质量保证和团队协作能力•软考中国计算机技术与软件专业资格考试•创新能力发现问题、提出解决方案的创造性思维•敏捷认证如CSM认证Scrum Master、SAFe认证•沟通能力有效表达、倾听和文档编写能力•架构师认证如TOGAF、AWS/Azure解决方案架构师课程设计融合理论讲授、案例分析和项目实践,帮助学生构这些证书在不同程度上得到业界认可,对职业发展有一定帮建完整的知识体系和实践能力助清华软件工程课程鼓励学生根据自身职业规划选择合适的专业认证,同时强调认证只是能力证明的一种形式,真正的专业素养需要在实践中不断积累和提升课程安排了行业专家讲座,分享职业发展经验,帮助学生建立职业生涯规划产业合作与案例分享清华大学计算机系与国内领先企业建立了深入的合作关系,包括联合实验室、产学研项目和实习基地等多种形式这些合作为学生提供了接触前沿技术和实际问题的宝贵机会,也促进了科研成果的产业化转化具体合作案例包括与华为合作的鸿蒙操作系统开发实践,学生参与轻量级操作系统组件开发;与阿里巴巴联合的电商系统高并发架构研究项目,探索大规模交易系统的技术解决方案;与腾讯合作的社交网络信息流推荐算法,结合学术理论和实际应用场景这些项目不仅丰富了学生的工程实践经验,也促进了企业技术创新与人才培养的良性循环国际软件工程前沿动态学术研究热点工业实践趋势国际软件工程领域的研究热点正在从传国际知名科技公司正引领软件工程实践统的编码与测试转向更广阔的范围的变革Google的软件工程实践强调ICSE、FSE等顶级会议近年关注的前沿代码评审、测试自动化和大规模单体仓领域包括AI系统工程化、自动化程序库管理;Facebook的连续部署实践实修复、软件安全与隐私、低代码/无代现了每天多次安全发布;Netflix的混码开发平台、量子软件工程等中国学沌工程方法通过主动注入故障测试系统者在这些领域的贡献度正逐年提升,清韧性;微软的内源开发将开源协作模华大学在自动化程序修复和AI系统工程式引入企业内部这些实践经验正通过方面已有国际领先的研究成果开放分享逐渐影响全球软件产业开源生态系统开源软件已成为全球软件基础设施的核心组成部分Linux基金会、Apache基金会等组织孵化的项目塑造了现代软件技术栈Kubernetes在容器编排领域的成功,TensorFlow和PyTorch在AI框架领域的竞争,Rust语言在系统编程领域的崛起,都代表了开源创新的活力中国企业正从开源用户向贡献者和领导者转变,如华为在OpenHarmony、OpenEuler项目中的主导作用课程总结与展望知识体系构建形成软件工程全生命周期的系统认知实践能力提升掌握主流开发方法和工具的应用团队协作体验3经历完整的团队项目开发流程创新思维培养具备解决复杂软件问题的能力通过本课程的学习,各位同学已经掌握了软件工程的核心概念、方法和实践技能从需求分析到系统设计,从编码实现到测试验证,从项目管理到质量保证,这些知识和技能将成为你们未来职业发展的坚实基础软件工程正处于快速变革的时代,人工智能、云计算、物联网等新技术不断推动软件开发方法的创新未来,软件工程师需要更加敏捷地学习和适应新技术,同时保持对基本原则和最佳实践的坚守希望大家能够保持好奇心和学习热情,在软件工程的道路上不断探索和成长,为中国软件产业的发展贡献力量!。
个人认证
优秀文档
获得点赞 0