简介
管理者最担心听到开发人员这样抱怨:“不能再增加功能了!我们得停下来重写代码。代码库一团糟,就像纸糊的老虎,根本应付不了持续增加的用户。我们实在维护不下去了!最好推倒重写吧”
这一幕在很多公司上演过,现在依然在不断重演。一旦公司陷入这种困境,以前版本的开发者往往沦为替罪羊。新的开发者一般就会骂前人怎么写这么烂的代码。他们准备推倒重来,准备重写系统。在重写代码的过程中,用户无法看到产品的任何改进。你可能认为重写代码至多也就几个月,但是实际花费的时间无一例外要多得多。你只能坐在一旁,眼睁睁看着用户投奔竞争对手,而这个时候,竞争对手恰恰在不断地改进产品。
因此我们认为软件质量,不但依赖于架构及项目管理,而且与代码质量紧密相关。这一点,无论是敏捷开发流派还是传统开发流派,都不得不承认。干净整洁的代码,既在质量上较为可靠,也为后期维护、升级,架构演进奠定了良好基础。在最近几年的业界,大家都把精力花费在了软件需求,架构,过程和管理等,反而代码构建这个与软件开发骨肉相连的环节反而被忽视了。
我们认为”代码是债务而不是资产”。最开始,团队会编写代码,做出产品,并用它来赚钱,但是,之后团队应该尽可能地寻找减少代码的方法和使代码尽量整洁,从而降低成本。软件界有一个真理,你拥有的代码越多,添加新内容所要付出的成本就越高。更坏的情况是,你所添加的所有内容都会堆在代码的顶端,接下来要添加内容的时候会成本会更高。如果你的代码结构越好,你做了越多的单元测试,你使用的数据库模式越好、越小、耦合越松,那么添加新代码所需要付出的成本就越少。因此OOP大师 Craig Larman: “最好维护的代码就是没有代码,好的程序员的代码产量是负的,因为他通过减少代码来增加功能”。对比现实中,很多人以为,LOC(line of code)越多的feature越大,写LOC越多的程序员越牛。这其实是极其错误的观念。
因此我们必须有全面的管理制度让我们保持代码少而整洁。所以软件大师Michael Feathers认为"未来属于知道如何有策略地删除代码的公司”。持有代码的成本要比我们想象的大。意识到这一点的公司更具有竞争优势。
为了切实帮助软件企业降低企业项目开发成本,大面积提高软件工程师编程能力和代码质量管理能力,我们特别推出了实战训练营. 分享多家大型研发中心代码管理经验给大家. 该课程适应于各个阶段的开发群体.初级工程师能够透过大师的眼睛来看待编程,了解编程的价值观和原则;具有丰富经验的设计师和架构师可以通过模式进行反思,探究成功实践背后的意义.把价值观,原则和开发实践结合;管理者通过学习业界著名研发中心的管理经验和失败的教训,来制定自己公司的代码管理策略。
你该参加吗?
各类软件企业和研发中心的程序员、软件设计师、架构师, 项目经理,质量部门员工。
如果你不重视代码质量, 请不要参加. 本课程面向重视代码质量的管理者.
如果你不认为写好代码是一件重要,困难并且有趣的事情,请你不要参加.
本课程面向追求卓越的程序员,我们认为编程是一种态度.如果你已经多年不写代码,最好不要参加,本课程面向一线还在编程的程序员/设计师/架构师
课程时长
3天(18H)
受众人群
课程根据著名编程大师的理论:
编程是一种态度,编程是一种技艺,编程是一种习惯。
面向以下不同的人群,有不同收获。
角色 | 收获 |
技术负责人/技术总监 | - 树立代码质量意识 - 代码的两面性,静态结构与动态功能 - 软件技术债务和代码腐化 |
项目经理/项目管理人员/架构师 | - 学习其他研发机构的代码管理思想 - 代码管理手段 - 代码管理相关流程和相关工具 - 代码审查 |
测试部门/质量管理部门 | - 代码审查 - 代码检查列表 - 代码管理手段 - 代码管理制度的建立 |
资深开发人员 | - 编程技艺和相关编程实践 - 重构手段 |
一般开发人员 | - 编程技艺和相关编程实践 - 重构手段 - 代码坏味道 |
分享提纲
第一篇: 编程是一种态度-------价值观 | 第1单元 软件代码腐烂 | 内容一:软件业者的反思: 软件腐烂 1.软件腐烂(Software rot),也叫做代码腐烂(code rot)或软件腐朽(software decay)。它描述了随着时间的逝去感知到软件的缓慢衰退,其将最终导致它变得不完善、不可使用或难以维护。 2.软件腐烂(Software rot)有两种形式: 3.1)隐匿的腐烂:软件逐渐不再(仍)被使用随着剩余的应用程序的改变变得不能用。它已经被观察到不再被使用的软件有可能一年的半衰期; 4.2) 活动的腐烂:软件随着不断地被修改趋向于失去它的完整性。 5.破窗效应与技术债务 6.案例演示1-通过演示大型项目,随着客户需求的变化,导致软件结构混乱,大家反思,为什么? 你认为软件腐烂的原因? 反思你们公司的软件系统也面临这样的问题吗? |
内容二:软件维护性定律—软件从业者必须知道的定律 1.软件变化定律:软件存在的时间越久,它的某个部分需要变化的可能性越大 2.软件缺陷定律:在软件中新增缺陷的可能性与代码修改量成正比 3.软件简洁定律:软件任何一部分的维护难度,反比于该部门的简洁程度 4.软件可维护方程式 D=V/E D代表变化的合意程度,V代表价值,E维护成本,也就是说明,相对减低实现成本,降低维护成本更重要。 5. 软件设计定律:相比降低开发成本,降低维护成本更加重要。维护成本正比于系统的复杂程度。 案例演示-通过大型项目,介绍这些基本的软件维护定律?也许大家都明白,但是我是否真的关注这些了吗? | ||
第二篇: 编程是一种技艺-------实践篇 | 第2单元 代码重构 | 内容一:重构 1.重构概述 2.何时重构 3.重构的误区 4.重构是持续进行的,不要先编写烂代码,再抽出重构 5.如何发现哪些地方需要重构 6.如何保证重构的正确 7.如何测试重构 8.通过一个小案例演示重构的基本思想(什么时间重构,如何发现重构点,如何保证重构的正确性,最后如何验收) |
内容二:案例—通过实际项目演示重构 1.介绍项目需求情况,进行设计 2.阅读代码指出代码坏症状 3.通过重构逐步改善代码质量 4.通过该案例演示重构的过程,我们遇到的难处,如何解决? | ||
内容三:重构关键—代码的坏味道 1.代码坏味道概述 2.代码坏味道的分类 3.识别代码坏味道,是重构的最重要一步 4.所谓重构,无非就是嗅到坏味道,然后,一小步一小步的改了它。问题是,很多人对坏味道的容忍度让他们嗅不到坏味道, 5.案例分析—通过真实项目的代码,分析代码坏味道 | ||
第3单元 高质量函数 | 内容一:函数的重构 1.函数的重构 2.巨型函数的种类 a)项目列表式巨型方法 b)锯齿状巨型方法 3.分解函数 4.助手方法提取 5.利用自动重构对付巨型方法 6.利用手工重构对付巨型方法 7.引入感知变量 8.函数依赖收集 9.分解助手方法和方法对象 10.通过案例介绍长函数的重构最佳实践 | |
内容二:函数灵活/易可扩展---函数接缝 1.历史遗留代码维护问题 2.某电信研发中心的维护问题—开发维护的效率问题。 3.增加一个功能特性的成本并不单单是为这些功能编码所花费时间的成本,还应该包括特性扩展的障碍成本。 4.代码的可维护成本分析—通过大量案例分析 a)确定需要修改哪些部分有多难 b)必要的改动有多少 c)实现改动对系统其他部分的影响有多大 5.如何实现代码的易扩展—函数接缝 6.接缝(seam),指程序中的一些特殊的点,在这些点上你无需做任何修改就可以达到改动程序行为的目的 7.通过案例分析,如何实现函数的灵活/易扩展。 | ||
内容三:函数参数 1.函数参数过长 2.最理想的参数数量是零,其次是一,再次是二,有足够的理由才能使用三个以上参数. 3.函数参数重构之道-引入参数对象(introduce parameter object 4.函数参数的顺序. 5.不要把程序参数当做工作变量/临时变量 6.函数参数模式-collecting parameter 7.函数返回值 8.通过大量项目代码是函数参数问题 9.演示函参数的重构 | ||
内容四:变量 1.“一旦了解在程序设计中如何使用变量,他就掌握了程序设计的精华。”-Dijkstra 2.为什么需要变量—变量的引入的理由 3.单一变量用途 4.变量与方法 5.变量作用域 6.变量声明与初始化 7.通过案例分析, 函数的变量如何处理与控制。 | ||
内容五:函数代码重复 1.重复的危害 2.强加的重复/无意的重复/无耐心的重复/开发者之间的重复 3.不要重复自己DRY—Don't Repeat Yourself Principle 4.Make It Easy to Reuse(让复用变得容易) 5.魔法数(Magic number) 6.重复性代码(Duplicated Code) 7.接口不同的相似类(Alternative Classes with Different Interfaces) 8.系统分离关注点 9.系统架构的基础通用服务组件 10.通过某项目代码是介绍重复编码问题 11.演示研发过程之中的常见重复问题,以及如何解决 | ||
内容六:函数组织 1.尽管组织直线代码是一个相当简单的任务,代码结构上的不合理会对代码的质量,正确性,可读性和可维护性带来影响。 2.把函数代码分成“段落” 3.选择一个有意义的顺序,始终一致的使用它 4.应该把代码组织得一次只做一件事情 5.组织直线型代码。嵌套可以,但是不应该交叠 6.系统应该由许多短小的函数而不是少量巨大的大函数组成! 7.系统应该由许多短小的类而不是少量巨大的大类组成! 8.把子程序提取另一个程序,不会降低整个程序的复杂度,只是把决策点转移到其他地方。 9.但是可以降低你在同一时间必须关注的复杂度水平。重点是要降低你需要在头脑中同时考虑的项目的数量,所以一个给定子程序的复杂度是有价值的。 10.通过大量真实案例的代码进行分析函数的代码的组织技术 | ||
内容七:函数的错误处理和异常管理 1.函数的错误处理 2.使用异常而非返回码 3.依赖磁铁(Dependeny magent) 4.主体流-明确表达控制流的主体 5.异常流-尽可能清晰地表达异常控制流,而不干扰对主体流的表达 6.标准的异常处理9种方法 7.通过大量真实案例的代码进行分析函数的错误处理和异常处理 | ||
第4单元 高质量函数10个一 | 内容一:函数10个一 1.每个变量只用于单一用途 2.每一个行代码只表达一件事 3.一个循环只做一件事 4.单一抽象层次原则 5.代码组织得一次只做一件事情 6.函数体内只关注一种变化的原因(动机) 7.函数应该遵守单一职责 8.函数圈复杂应该小于一十 9.函数第一原则是必须要短小 10.编写函数时必须一心一意,专注,怀有谦卑的心态 11.通过大量真实案例的代码进行分析函数的错误处理和异常处理 | |
第5单元 高质量类 | 内容一:高质量类 1.类的基础:抽象数据类 2.需要用到ADT的场景 3.使用ADT的益处 4.基本类型依赖坏味道 5.数据泥团坏味道 6.案例—通过电信项目介绍数据的抽象 7.通过大量项目代码演示数据抽象类型解决的问题 | |
内容二:面向对象设计----职责分配 1.单一职责原则 2.RDD-职责驱动的面向对象设计方法 3.上帝类,代码之中的大量的上帝类 4.通过案例分析,如何进行设计高质量类和重构 | ||
第三篇: 编程是一种习惯-------管理篇 | 第6单元 修改遗留系统代码 | 内容一:修改遗留项目代码 1.必须修改遗留的代码起因 2.遗留代码修改危险事项 3.如何对依赖代码做测试 4.依赖代码的感知与分离 5.依赖代码修改的接缝技术 6.修改依赖代码的工具 7.降低风险的措施 8.接依赖技术 9.通过多个大型项目案例分析,如何修改遗留代码,分析如何解耦 |
内容二:拒绝退化-如何修改遗留系统,而不破坏现有系统结构 1.拒绝退化—“首先不要伤害” 2.Sprout Method 3.Sprout Class 4.Wrap Method 5.Wrap Method 6.通过案例分析,如何修改遗留代码,而不破坏现有系统代码结构 | ||
内容三:安全代码维护与重构 1.重构的恐惧心里 2.重构勇气 3.安全重构和祈祷式重构 4.安全重构保证 a)依赖编辑器 b)签名保持 c)单一目标 d)依赖编译器 e)个人的能力 f)代码审查 g)单元测试 h)验收测试 i)人工测试 5.通过案例如何保证重构的正确性 | ||
第7单元 代码质量体系最佳实践 | 内容一:代码质量管理4个现代化 1.代码管理的4个现代化 a)质量量化(如何设置质量指标) b)工具化(如何寻找合适的工具 c)自动化(把流程自动化,忘记流程) d)持续优化(反思与优化) 2.多家电信研发中心,如何实现4个代码现代化 |
Mace Liu
百林哲咨询(北京)有限公司专家团队成员
Mace Liu
百林哲咨询(北京)有限公司专家团队成员
Mace Liu
百林哲咨询(北京)有限公司专家团队成员
Mace Liu
百林哲咨询(北京)有限公司专家团队成员
Mace Liu
百林哲咨询(北京)有限公司专家团队成员
Mace Liu
百林哲咨询(北京)有限公司专家团队成员
Mace Liu
百林哲咨询(北京)有限公司专家团队成员