课程前言
核心词:重构,复用,低代码,面向变更的设计,设计模式,面向对象,代码漏洞
卓越设计:面向对象,开闭原则,设计模式 微观编码:编码规范,极简版本
编码改善:重构,重构的量化管理与步骤 宏观编码:CHI代码健康指数,编码消耗率CCR
技术管理:1-3-9团队,L型代码结构,松结对编程,代码审查,TDD,技术团队的招聘与试用
配套工具:CHM代码健康管理工具(可智能识别代码中设计模式漏用、重构等问题。
应用场景
重点项目:重点项目建立代码度量体系,保证项目成功。
崇拜项目:重构前,建立量化目标;重构中,实时监控防止重蹈覆辙。
体系建设:对中大型企业(100+程序员)的大量团队建立代码度量体系,对代码质量进行横向对比和纵向跟踪。
企业文化:配合“代码大赛”等活动促进工程师文化的建立,并通过代码度量体系来保证其传承。
员工招聘:跟踪使用期内新员工的代码质量,为去留决策提供依据。
软件外包:评价和跟踪供应商人员的编程水平与代码质量。
课程受众
编程人员全员参与(包括初级人员)
技术经理,开发骨干,资质高的新员工
重点产品、新产品、重构团队的全体开发人员
课程特色
本课程使用讲师开发了一款CHI代码健康指数(原CCI代码混沌指数)扫描工具来配合教学。
此工具已在多家民品及军工企业实战使用,不仅扫描代码漏洞,还可扫描代码中潜在的违反面向对象、设计模式(尤其是开闭原则)地方,并根据三种权重规则进行评分 注:业界的sonar等工具一般只扫描变量、语法级别的问题。
课前,可根据评分为课程提前准备练习素材
课上,可直观观察修改前后的评分变化;或反之,理解评分差异所代表的软件不同实现
课后,可通过工具保证培训内容落地
CHI代码健康指数工具(及其前身)已在中国航空信息、杭州恒生电子、四川信通网易、广州ASL等IT企业,及某些军工企业的总计40多个团队中使用。
最早成型于1994年的设计模式随着新的序列化、反射等技术的出现,已经不再完全适合当前语言的开发,课程中使用了全新的分类法,并增、删、重命名了部分模式。
课程思路
课程分为三个模块:
1.微观编程素养
a.对标图书《代码简洁之道》
b.面向典型敏捷团队(5~10人),以肉眼可见的形式改善代码
c.主要内容包括
i.极简编码规范:包含6~10条最核心的规范,简洁但真正可以落地
ii.代码审查及其组织结构
2.编程技能(设计模式+重构)
a.对标图书《设计模式》《重构》
b.面向团队中的核心人员,他们未来承担着控制代码质量的核心任务
c.主要内容包括
i.常用设计模式实例,使用设计模式的心法
ii.重构时机、决策、与TDD的配合、防止重蹈覆辙等
iii.重构的量化管理
3.宏观编码质量管理
a.讲师独创内容
b.面向大团队(大于100人),长周期(年度级),大型软件(单个软件10万行以上,无上限当前最大记录157万行)的实时、全面质量监控
c.主要内容包括
i.利用Chi检测和修改单个文件中的架构问题
1.核心是设计模式中实现开闭、解耦、消重原则的几个保健类模式
ii.利用Chi检测软件整体的可扩展性问题,以8020原则定位问题模块
iii.利用Chi横向对比产品、团队、平台带来的差异
课程大纲
以下内容按时间顺序描述了训练营的整体脉络。除整体脉络外,各个阶段还会穿插相应知识的讲授。
以下描述仅针对其中一个团队,其他团队也各自选定自己的产品代码,并按顺序执行实践。
注意:由于是直接贴合现场所提供代码的实际情况开展课程,所以以下内容的顺序可能会因为在实际代码中的顺序、严重程度而有变化,但最终都将被覆盖。
开篇:编码终极奥义
编码即信息
等量原则:编码的与描述其需求的自然语言的信息量大致相同
自然原则:编码的内容、顺序与其自然语言需求的描述大致相同
最简原则:任何信息本体只存在一处,其他均为镜像
“终极奥义”看似很虚,但后面的所有内容均是这三条原则的产物
中级技术篇
初步审核代码环节(约1小时)
直接拿出客户准备的代码,逐行审核并指出存在的问题
具体问题在下面的章节中
在发现问题之处,讲解问题的现象、问题的危害以及发生危害的场景、造成问题的原因、可能的解决策略以及最佳策略(1最佳策略=1编程规范)
此阶段仅聚焦微观编码问题的初中级,高级问题会留在后面讲
微观编码
初级篇
此阶段注重语句级别的编程技能,基本上不需要面向对象基础
讲师现场对某个团队的代表性产品进行代码审查重点包括:
变量命名
函数命名
全局变量处理
消除常数
冗余语句的处理
FFT结构(false-false-true)
foreach循环
var/auto关键字
练习:所有团队现场对剩余代码进行重构,讲师点评
中级篇
此阶段注重函数级别的编程技能,需要函数封装、模板(泛型)等知识
讲师现场对某个团队的代码进行走读,指出以下问题:
代码克隆
如何消除结构相同、类型不同的if-else或case
模板
Map
三元表达式
练习:所有团队现场对剩余代码进行重构,讲师点评
设计模式
以下学习内容实际使用了辅助教学工具“CHI代码健康指数”,但未防止内容交叉,相关内容放在最后
设计模式原理
设计模式的6大原则
设计模式新分类法(按用途而非实现分类)
保健类设计模式
开闭模式,解耦模式,消重
优化类设计模式
运行时绑定模式,友好的陌生人模式,性能模式
开闭型设计模式(重点,持续约4~5小时,与提升软件可维护性关系最大)
描述:功能开放,代码封闭(代码只加不修)
模式
模板模式
策略模式
装饰器模式
工厂模式
抽象工厂模式
此类模式的漏用检测
实战练习:从代码中识别漏用之处并使用相关模式实现(3~4个)
解耦型设计模式(重点,持续约3~4小时)
描述:易变模块分离,独立修改(多个相关改变聚在一起)
模式
工具模式(原建造者模式)
观察者模式
适配器模式
桥模式
此类模式的漏用检测
实战练习:从代码中识别漏用之处并使用相关模式实现(2~3个)
消重型设计模式(重点,持续约2~3小时)
描述:信息只有一处,其他皆为镜像(单个改变只改一次)
模式
降维模式(原状态模式)
分型模式(原组合模式/局部整体模式)
泛型模式(新增)
反射模式(新增)
常量模式(新增)
此类模式的漏用检测
实战练习:从代码中识别漏用之处并使用相关模式实现(2~3个)
运行时绑定设计模式(重点,持续约1~2小时)
描述:动态适应,灵活多变(代码不写死)
模式
命令模式
责任链模式
句柄模式(新增)
实战练习:从代码中识别漏用之处并使用相关模式实现(1~2个)
陌生人模式(持续约1~2小时)
描述:友好而有警惕(不用学,玩不坏)
模式
外观模式
代理模式
实战练习:从代码中识别漏用之处并使用相关模式实现(1~2个)
性能优化模式(持续约1小时)
描述:牺牲其他,获得性能
模式
单例模式
原型模式
享元模式
实战练习:从代码中识别漏用之处并使用相关模式实现(1~2个)
CHI代码健康指数进阶课程
评分原理
CHI有4个评分项:超长类占比(>250逻辑行),超长方法占比(>30回车行),不良分支密度((else+case+default)/逻辑行),不良常数密度(数字或字符常量/逻辑行)。
CHI与测试缺陷密度有-0.78~-0.84的负相关系数,与生产率有0.52~0.75的正相关系数,对提升生产率和质量具有显著意义。
据对30多个程序员代码样本的深入研究(约500个文件),CHI工具与人类高手的主观评分几乎完全相同(在修正尚未引入的灰色常数和代码克隆后,两者相关系数高达0.91),这意味着使用工具代替人可以得到高度近似评分结果。
CHI代码健康指数可由工具自动扫描获得,不受人数、代码数量的限制(约1万回车行/秒),几乎可以完成对任意规模代码的每日度量,可用于对组织级、大规模、长周期代码的整体度量与控制。
CHI实战
使用工具对现场代码进行扫描
扫描结果判读
高级技术篇(基于CHI结果)
面向对象回顾
此阶段注重封装、继承、多态等传统面向对象的知识,回归面向对象本体
初级概念讲解
代码克隆
圈复杂度与圈复杂密度
讲师现场对某个团队的代码进行走读,修改代码以降低CCI数值(越低越好)
消除超长类
消除超长方法
消除结构大为不同的大段if-else或case
基类,虚函数
多态与虚函数
接口与多继承
基类vs接口:扩展与实现
消除常数
封闭与非封闭取之空间的常数
所有团队现场对剩余代码进行重构,讲师点评
动态设计模式(演示内容)
独创内容:传统的设计模式仅关注静态代码的形态,而“动态设计模式”关注编程本身的心法和过程,包括听到需求后的心理分析、对未来变更点的预测、宏观与微观编程的次序、调试与测试的准自动化。掌握“设计模式心法”后,使用设计模式将逐渐成为编程的自然第一感,而不再是冥思苦想的结果。
注:此部分内容无法在课程时长内习得,需要学员在未来2~5年内持续训练。
讲师现场对某个团队的一部分代码进行重写,并展示以下编程心法:
从外向内分解问题出
先编写调用者,后编写底层函数(准TDD开发)
每5~10分钟进行一次编译和测试(TDDB,Test Driven De-Bug测试驱动的调试)
随时将问题控制在最近2~5行代码内
内建的质量
随时避免各种不良编程问题,而不是编写后再进行重构
一次性写成“上帝代码”
“上帝代码”是在语言框架内,多一行则多,少一行则少,无意中删除或添加任何一个字符将会出现编译错误的代码
首次编写即达到CHI健康指数满分(100)
在第一次编写代码时,按照特有的心法和顺序,从来不需要if-else if/switch case等语法,也不会想到它们
其他高级话题
性能优化
性能优化要义
性能优化步骤
单元测试覆盖率的提升
代码行覆盖率
分支覆盖率
通过减少分支来提升分支覆盖率
超越语言的语法边界
C,C++,C#,Java,Python语法进化对比
通过5种语言实现同一个功能的对比,观察人类语言向编码终极奥义的逼近过程编程团队管理
高级管理篇
重构及其管理
重构时机
重构技术
重构技术回顾(已在之前设计模式、CCI等处讲解)
重构目标与计划
基于待重构代码,对工期、工作量、代码行数、测试缺陷率进行估算
重构控制
通过迭代开发确保重构目标与计划达成
通过度量CHI代码健康指数和CCR(编码消耗率)防止重蹈覆辙
CCR编码消耗率是每功能点(Function Point)需要的代码行数,其数值大致=逻辑代码行数/(api数*5.4),业界Java中值为27。由于多数被重构的旧产品都有100~300以上的CCR数值,通过每个迭代持续度量和控制重构代码的CCR数值,可以防止重蹈覆辙。
团队管理
编程团队的招聘流程
笔试,面试,试用
代码审查的频率与形式
1-3-9师徒团队(学习型团队)
团队职责与层级
团队工作方式
团队的提拔机制
松结对编程
高手的时间管理策略
L型代码结构
可复用库的开发策略
高手在代码结构中的位置
附录
代码质量的个体水平层级表(逐级上升)
1.能完成可用代码
2.能自己完成高质量代码(代码中没有已知缺陷)
3.经过反复,能最终完成精美代码(本次课程的学员学成后目标)
4.能将他人的代码,修改为精美代码(本次课程的学员学成后目标)
5.首次编码,即可完成精美代码(课堂中仅由讲师演示)
6.多次编写相同功能,得到结果接近的精美代码(发现了最佳实现方案而非随兴所至)
7.多次编写相同功能,编程的次序、过程相近(发现了达到最佳实现方案的最短路径并固化)
本课程的讲师要求在5级水平以上,并能在课堂中以学员的随机(可理解)需求进行演示。学员甚至可在过程中引入“变更”,观察高质量代码对变更的响应过程。
代码质量的管理水平层级表(逐级上升)
1.建立了编码规范
2.建立了代码审查机制
3.高手定期对审查中发现的问题组织专项学习和改进
4.使用高低搭配的团队(师徒团队/学习型团队)开发产品,以应对高低不同的质量需求
5.对代码质量建立了量化度量体系
6.对代码的量化管理是日常的(本次课程的学员学成后目标)
7.根据度量数据分析找到改进点,并加以改进(课堂中仅由讲师演示)
8.基于度量数据的改进是可预测的,且最终达成效果与预测相符
本课程的讲师要求在7级水平以上,并能展示实际度量数据的分析结果。