专题课程
【课程简介】
软件重构面临的背景都是相似的,程序员们为了快速完成需求和上线而写出了最基本的代码。然后在功能的不断扩充过程中,以打补丁的方式对代码进行扩充,中间还会面临着开发人员的变更和离职。逐渐地,代码就会变得越来越臃肿,渐渐地变得难以维护。
很多开发人员对重构有着严重的误解,错误的认为重构是专门安排一个阶段来进行的。但是,我们认为重构是持续进行的,而不是在项目结束时、发布版本时、迭代结束时,甚至不是每天快下班时才进行的。重构是我们每隔一个小时或者半个小时就要去做的事情。通过重构,我们可以持续地保持代码尽可能干净、简单并且具有表达力。因此,重构成为了每个开发人员必备的基本技能,可是国内的开发人员却很少去做。
那么,糟糕的软件代码会有什么样的影响呢?首先是开发效率的降低,在糟糕架构下加入新功能,会受之前代码的影响,可能存在意想不到的改动点和问题点,开发和调试时间都会大大增加;其次是故障率的提升,在质量低下的代码中,总是容易隐藏着很多不易发现的坑,这些都会成为故障的隐患;同时,架构也会使得需求的完成大打折扣,使得设计好的目标,因为架构限制或者性能等原因,只能完成80%甚至更低。
大多数软件开发方面的培训都是关于新系统的设计和开发,讲师教你如何从无到有创建出一个新的应用来。然而,在真实的项目中,许多产品如今往往依然运行在基于复杂架构设计和传统技术实现的遗留系统上,并依赖着它们。如何摸索出有效方法应对这些遗留系统,已经成为我们最需解决的问题之一。
随着不同产品的推出,不同客户、不同版本的发布,需要维护的遗留代码越来越多,重构也就在所难免。不仅如此,所有的软件系统,经过一段时间的维护,都会逐渐变成遗留系统,并且都遭遇了缓慢而不可抗拒的腐化。因此,软件开发人员不得不面对既有系统的混乱代码。而本课程正是告诉你如何重构既有的遗留系统,如何重构代码、重构设计、重构架构。
本课程教你如何扭转系统腐化,重构复杂遗留系统,减低维护成本。在面对一个错综复杂的、不透明的、令人费解的系统时如何慢慢地、逐步地将其变成一个简单的、有良好组织和设计的系统。
【培训特色】
本课程注重实战,采用案例贯穿方式完成实践,收集了大量的真实案例,针对项目过程中技术人员常犯的错误进行了汇总、研讨,并形成培训教程。本次培训从程序员的编程思维开始讲解,通过大量的真实案例,详细地介绍了重构需要注意的要点以及难点,这些知识都是讲师十几年经验的总结。
本次课程1/3时间讲解核心思想,1/3时间动手重构实践,1/3点评分析总结。
【学员基础】
学员学习本课程应具备下列基础知识:
l. 目前正在面临复杂遗留系统,必须需要维护和重构
2. 具有面向对象基本概念,熟悉基本设计模式
【培训对象】
各类软件研发中心的软件设计师、架构师、项目经理、技术总监、质量部门经理。对于重构技术怀有疑问和困惑,需要梳理解答的团队和个人,效果更佳。
|
代码重构 |
设计重构 |
软件腐烂监控 |
重构管理 |
程序员 |
必须精通 |
需要了解 |
需要了解 |
需要了解 |
设计师 |
必须精通 |
必须精通 |
需要了解 |
需要了解 |
架构师 |
必须精通 |
必须精通 |
必须精通 |
必须精通 |
数据库工程师 |
需要了解 |
需要了解 |
/ |
/ |
质量管理 |
/ |
/ |
必须精通 |
必须精通 |
管理者 |
/ |
/ |
需要监控 |
需要了解 |
【培训时长】
3天
【课程大纲】
以下大纲内容较多,实际授课时根据学员课前调查进行调整,并且实际授课不一定按此顺序。
|
授课内容 |
第一部分 为什么软件需要及时重构 |
|
第一单元 剖析软件质量不断下降的源头 |
质量不断下降的表现: 1. 程序代码越来越乱 2. 软件维护成本越来越高 3. 软件变更越来越困难 4. 无法进行新技术的改造 以往采取的措施: 1. 头痛医头,脚痛医脚 2. 抛弃掉重新编写 3. 因担心未来变化而做的过度设计 带来的问题 1. 团队成员越来越多但效率却越来越低 2. 测试变得越来越困难而任务繁重 3. 软件系统越来越笨重而不适应未来变化 分析与反思
案例分析:一个遗留系统的演化过程 1. 起初的设计 2. 随后的变更 3. 质量不断下降的过程 软件质量下降的根源: 1. 软件总是因变更而变得越来越复杂 2. 软件结构已经不再适应复杂的软件需求 3. 必须要调整软件结构以适应新的软件需求
软件是因需求变更而质量下降吗? 案例分析:推演软件变更的设计过程 应对软件变更的更佳方式:两顶帽子 1. 重构原有代码以适应新的需求 2. 实现新的需求 案例:演示两顶帽子的设计过程 案例:财务凭证生成程序的设计过程
|
第二单元 高质量的软件设计过程 |
以往软件设计的过程: 1. 演示以往软件设计的过程 2. 剖析以往软件设计的问题与风险
小步快跑模式的开发过程: 1. 用较快的速度开发一个最核心的功能 2. 让第一个版本运行起来并可以验证 3. 在第一个版本的基础上不断添加功能: a. 每次只添加一个很简单、很单一的功能 b. 每次以两顶帽子的方式添加新功能 c. 运行、调试与验证 d. 重复这个过程添加下一个功能 4. 复杂的系统就是由一次次正确开发的不断积累而成
案例:演示小步快跑的开发过程 小步快跑解决的问题: 1. 复杂功能有效地解耦 2. 代码编写总是可测试与验证 3. 简化设计与思考的复杂度 4. 适时重构以避免软件退化 案例:数据推送程序的设计过程 案例:标签库的设计变更过程
测试驱动设计 1. TDD vs. 后测试开发 2. 案例:演示测试驱动设计的过程 3. 测试驱动设计的优势 4. 实践测试驱动设计的难题 讨论:自动化测试脚本应当由谁来写?
|
第二部分 重构的概念 |
|
第三单元 何为重构 |
软件重构的概念 1. 重构是一系列代码的等量变换 案例:一个Hello World重构过程 2. 重构的保险索:自动化测试 案例:Hello World的自动化测试过程 3. 软件修改的四种动机——重构的价值 4. 一个真实的谎言——重构的误区 5. 重构的主要方法与技巧
案例分析:重构一个大型遗留系统 1. 重构第一步:分解大函数 超级大函数及其危害 案例:演示大函数产生的过程 案例:演示抽取方法操作步骤 实践抽取方法会遇到的问题和解决方案 2. 重构第二步:拆分大对象 超级大对象及其危害 案例:演示超级大对象的产生过程 案例:演示抽取类的操作步骤 讲解单一职责设计原则 案例:演示“分久必合,合久必分”的重构过程 3. 重构第三步:提高复用率 讲解顺序编程及其危害 “不要重复代码”原则 案例:提高代码复用的6个方法 案例:演示新增代码时的代码复用过程 用静态检查工具检查重复代码 4. 重构第四步:可扩展设计 过度设计 vs. 恰如其分的设计 讲解“开放-封闭”的设计原则 案例:讲解可扩展设计的4个方法 案例:讲解新增代码的可扩展设计过程 5. 重构第五步:降低耦合度 案例:讲解接口、实现与工厂模式 案例:讲解外部接口解耦与适配器模式 案例:讲解继承泛滥问题与桥接模式 案例:讲解方法解耦与策略模式 案例:讲解过程解耦与命令模式 案例:讲解透明扩展与组合模式、装饰者模式 6. 重构第六步:系统分层 反思软件架构需要怎样的分层结构 遗留系统如何拥抱需求变化 遗留系统如何应对技术变革 7. 重构第七步:领域驱动设计 领域驱动设计的概念 讲解领域模型分析方法 讲解原文分析法与领域驱动设计
讨论:如何制定重构项目计划 练习:重构一个小程序并编写测试脚本
|
第四单元 关于重构的讨论 |
什么时候重构 1. 重构是一种习惯 2. 重构让程序可读 3. 重构,才好复用 4. 先重构,再扩展 5. 紧急任务时的重构
测试的困境 1. 重构初期的困局 2. 解耦与自动化测试 3. 建立自动化测试体系
重构的评价 1. 评价软件质量的指标 2. 评价软件质量的工具 |
第三部分 系统级的重构项目 |
|
第五单元 在敏捷框架中开展重构 |
现在大家都在探讨SAFe规模化敏捷 1. 以较小的资源投入,创造出更多的价值,及时为用户提供服务 2. 更快地交付,更快地反馈,更早地产生价值 3. 增量构建系统,动态制订里程碑
企业敏捷实践遇到的较大挑战 1. 敏捷开发:每个迭代都是在上一个版本的基础上变更 2. 软件退化: a) 每变更一次,软件质量就下降一次 b) 变更得越频繁,软件质量下降的速度就越快 c) 敏捷开发的软件变更是频繁的 结论:不解决软件变更的质量问题,敏捷开发就不能真正落地
分析软件退化的根源 1. 软件总是从简单向复杂转变 2. 简单软件有简单软件的设计 3. 复杂软件有复杂软件的设计 4. 当软件由简单软件向复杂软件转变时,重构成为必然
保证高质量软件开发的关键:两顶帽子 1. 高质量软件开发的关键在于每次变更的设计 |