课程简介
一个人不可能在地面上学会游泳!本课程采用完全现场实战的方式,帮助团队快速体验和学会高级面向对象技术,编写出高质量、易维护的代码。
学员分为若干小组(最好是实际工作组),每个小组都有2~3个核心参训人员人
核心参训人员提供总计3000回车行实际工作代码
对其中1000行代码,讲师会在课上现场讲解并改写(改写量一般在300~500行左右)
改写完成后达到极高的标准,包括:
零常数,零for(int i),零else/case(代码中没有任何else和case关键字)、每个函数均小于30回车行
编码有效率在13~15LOC/FP左右(世界纪录级别)
另外每组准备2000行较差代码作为课堂练习
注意:本课程不涉及性能优化、安全性、多线程等特殊技术。
目标收益
培训对象
技术经理,开发骨干,资质高的新员工,重点产品、新产品、重构团队的全体开发人员
课程大纲
微观编码 |
初级篇 此阶段注重语句级别的编程技能,基本上不需要面向对象基础 讲师现场对某个团队的代表性产品进行代码审查重点包括: 变量命名 函数命名 全局变量处理 消除常数 冗余语句的处理 FFT结构(false-false-true) foreach循环 var/auto关键字 所有团队现场对剩余代码进行重构,讲师点评 |
中级篇 |
此阶段注重函数级别的编程技能,需要函数封装、模板(泛型)等知识 讲师现场对某个团队的代码进行走读,指出以下问题: 代码克隆 如何消除结构相同、类型不同的if-else或case 模板 Map 三元表达式 所有团队现场对剩余代码进行重构,讲师点评 |
宏观编码 |
CCI代码混沌指数 CCI是4个数据的平均值:超长类占比(>250逻辑行),超长方法占比(>30回车行),不良分支密度((else+case+default)/逻辑行),不良常数密度(数字或字符常量/逻辑行)。 CCI与测试缺陷密度有0.78~0.80的相关系数,与生产率有-0.52~-0.75的相关系数,对提升生产率和质量具有显著意义。 据对30多个代码样本的研究(约500个文件),CCI工具与人类高手的主观评价几乎完全相同。 CCI可由工具自动扫描获得,不受人数、代码数量的限制(约10万行/秒),可用于对组织级、大规模、长周期代码的整体度量与控制。 CCI实战 使用CCI对现场代码进行扫描 扫描结果判读 高级篇(基于CCI结果) 此阶段注重封装、继承、多态等传统面向对象的知识 初级概念讲解 代码克隆 圈复杂度与圈复杂密度 讲师现场对某个团队的代码进行走读,修改代码以降低CCI数值(越低越好) 消除超长类 消除超长方法 消除结构大为不同的大段if-else或case 基类,虚函数 多态与虚函数 接口与多继承 基类vs接口:扩展与实现 消除常数 封闭与非封闭取之空间的常数 所有团队现场对剩余代码进行重构,讲师点评 质量篇 此阶段注重防范开发中、维护中可能产生的编码质量问题 注:实际上此章节所述内容,均会在上述课程中遇到问题时随时提到,此处仅做总结 讲师现场对某个团队的代码进行走读,指出以下问题: 易读性问题 看似技术含量很高的“半截子科技”代码 可维护性问题 成对出现的编码 常数封装位置 多分支结构的处理 If-else与case的8种消除方法比较 常见缺陷预防 空指针 数组越界 所有团队现场对剩余代码进行重构,讲师点评 |
设计模式 |
设计模式解读 由于设计模式种类繁多,此内容不固定,而是以根据两件事情进行选择性演示 代码中存在的问题类型 对代码重构可能用到的模式 预计会演示23种中的约10种典型的设计模式 心法篇 此阶段注重实际开发动态过程中,人们由于编码次序的差异而造成的思维差异,进而导致的编码质量差异;解决了明明懂设计模式但却想不到要用的问题 讲师现场对某个团队的一部分代码进行重写,并展示以下编程心法: 从外向内分解问题出 先编写调用者,后编写底层函数(准TDD开发) 每5~10分钟进行一次编译和测试(TDDB,Test Driven De-Bug测试驱动的调试) 随时将问题控制在最近2~5行代码内 内建的质量 随时避免各种不良编程问题,而不是编写后再进行重构 一次性写成“上帝代码” “上帝代码”是在语言框架内,多一行则多,少一行则少,无意中删除或添加任何一个字符将会出现编译错误的代码 首次编写即不包括“陈旧语法” 在第一次编写代码时,按照特有的心法和顺序,从来不需要if-else if/switch case等语法,也不会想到它们 重构 重构时机 重构控制 通过度量CCI和CCR防止重蹈覆辙 CCR编码消耗率是每功能点(Function Point)需要的代码行数,其数值大致=逻辑代码行数/(api数*5.4),业界Java中值为27。由于多数被重构的旧产品都有100~300以上的CCR数值,通过每个迭代持续度量和控制重构代码的CCR数值,可以防止重蹈覆辙。 高级话题 单元测试覆盖率的提升 代码行覆盖率 分支覆盖率 通过减少分支来提升分支覆盖率 超越语言的语法边界 C,C++,C#,Java,Python语法进化对比 通过5种语言实现同一个功能的对比,观察人类语言向编码终极奥义的逼近过程 |
微观编码 初级篇 此阶段注重语句级别的编程技能,基本上不需要面向对象基础 讲师现场对某个团队的代表性产品进行代码审查重点包括: 变量命名 函数命名 全局变量处理 消除常数 冗余语句的处理 FFT结构(false-false-true) foreach循环 var/auto关键字 所有团队现场对剩余代码进行重构,讲师点评 |
中级篇 此阶段注重函数级别的编程技能,需要函数封装、模板(泛型)等知识 讲师现场对某个团队的代码进行走读,指出以下问题: 代码克隆 如何消除结构相同、类型不同的if-else或case 模板 Map 三元表达式 所有团队现场对剩余代码进行重构,讲师点评 |
宏观编码 CCI代码混沌指数 CCI是4个数据的平均值:超长类占比(>250逻辑行),超长方法占比(>30回车行),不良分支密度((else+case+default)/逻辑行),不良常数密度(数字或字符常量/逻辑行)。 CCI与测试缺陷密度有0.78~0.80的相关系数,与生产率有-0.52~-0.75的相关系数,对提升生产率和质量具有显著意义。 据对30多个代码样本的研究(约500个文件),CCI工具与人类高手的主观评价几乎完全相同。 CCI可由工具自动扫描获得,不受人数、代码数量的限制(约10万行/秒),可用于对组织级、大规模、长周期代码的整体度量与控制。 CCI实战 使用CCI对现场代码进行扫描 扫描结果判读 高级篇(基于CCI结果) 此阶段注重封装、继承、多态等传统面向对象的知识 初级概念讲解 代码克隆 圈复杂度与圈复杂密度 讲师现场对某个团队的代码进行走读,修改代码以降低CCI数值(越低越好) 消除超长类 消除超长方法 消除结构大为不同的大段if-else或case 基类,虚函数 多态与虚函数 接口与多继承 基类vs接口:扩展与实现 消除常数 封闭与非封闭取之空间的常数 所有团队现场对剩余代码进行重构,讲师点评 质量篇 此阶段注重防范开发中、维护中可能产生的编码质量问题 注:实际上此章节所述内容,均会在上述课程中遇到问题时随时提到,此处仅做总结 讲师现场对某个团队的代码进行走读,指出以下问题: 易读性问题 看似技术含量很高的“半截子科技”代码 可维护性问题 成对出现的编码 常数封装位置 多分支结构的处理 If-else与case的8种消除方法比较 常见缺陷预防 空指针 数组越界 所有团队现场对剩余代码进行重构,讲师点评 |
设计模式 设计模式解读 由于设计模式种类繁多,此内容不固定,而是以根据两件事情进行选择性演示 代码中存在的问题类型 对代码重构可能用到的模式 预计会演示23种中的约10种典型的设计模式 心法篇 此阶段注重实际开发动态过程中,人们由于编码次序的差异而造成的思维差异,进而导致的编码质量差异;解决了明明懂设计模式但却想不到要用的问题 讲师现场对某个团队的一部分代码进行重写,并展示以下编程心法: 从外向内分解问题出 先编写调用者,后编写底层函数(准TDD开发) 每5~10分钟进行一次编译和测试(TDDB,Test Driven De-Bug测试驱动的调试) 随时将问题控制在最近2~5行代码内 内建的质量 随时避免各种不良编程问题,而不是编写后再进行重构 一次性写成“上帝代码” “上帝代码”是在语言框架内,多一行则多,少一行则少,无意中删除或添加任何一个字符将会出现编译错误的代码 首次编写即不包括“陈旧语法” 在第一次编写代码时,按照特有的心法和顺序,从来不需要if-else if/switch case等语法,也不会想到它们 重构 重构时机 重构控制 通过度量CCI和CCR防止重蹈覆辙 CCR编码消耗率是每功能点(Function Point)需要的代码行数,其数值大致=逻辑代码行数/(api数*5.4),业界Java中值为27。由于多数被重构的旧产品都有100~300以上的CCR数值,通过每个迭代持续度量和控制重构代码的CCR数值,可以防止重蹈覆辙。 高级话题 单元测试覆盖率的提升 代码行覆盖率 分支覆盖率 通过减少分支来提升分支覆盖率 超越语言的语法边界 C,C++,C#,Java,Python语法进化对比 通过5种语言实现同一个功能的对比,观察人类语言向编码终极奥义的逼近过程 |