10x程序员工作法
郑晔
火币网首席架构师,前ThoughtWorks首席咨询师 ,TGO鲲鹏会会员
立即订阅
7975 人已学习
课程目录
已完结 56 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 程序员解决的问题,大多不是程序问题
免费
思考框架 (1讲)
01 | 10x程序员是如何思考的?
以终为始 (11讲)
02 | 以终为始:如何让你的努力不白费?
03 | DoD的价值:你完成了工作,为什么他们还不满意?
04 | 接到需求任务,你要先做哪件事?
05 | 持续集成:集成本身就是写代码的一个环节
06 | 精益创业:产品经理不靠谱,你该怎么办?
07 | 解决了很多技术问题,为什么你依然在“坑”里?
08 | 为什么说做事之前要先进行推演?
09 | 你的工作可以用数字衡量吗?
10 | 迭代0: 启动开发之前,你应该准备什么?
答疑解惑 | 如何管理你的上级?
划重点 | 关于“以终为始”,你要记住的9句话
任务分解 (11讲)
11 | 向埃隆·马斯克学习任务分解
12 | 测试也是程序员的事吗?
13 | 先写测试,就是测试驱动开发吗?
14 | 大师级程序员的工作秘笈
15 | 一起练习:手把手带你分解任务
16 | 为什么你的测试不够好?
17 | 程序员也可以“砍”需求吗?
18 | 需求管理:太多人给你安排任务,怎么办?
19 | 如何用最小的代价做产品?
答疑解惑 | 如何分解一个你不了解的技术任务?
划重点 | 关于“任务分解”,你要重点掌握哪些事?
沟通反馈 (12讲)
20 | 为什么世界和你的理解不一样
21 | 你的代码为谁而写?
22 | 轻量级沟通:你总是在开会吗?
23 | 可视化:一种更为直观的沟通方式
24 | 快速反馈:为什么你们公司总是做不好持续集成?
25 | 开发中的问题一再出现,应该怎么办?
26 | 作为程序员,你也应该聆听用户声音
用户故事 | 站在前人的肩膀上,领取属于你的高效工作秘籍
27 | 尽早暴露问题: 为什么被指责的总是你?
28 | 结构化:写文档也是一种学习方式
答疑解惑 | 持续集成,一条贯穿诸多实践的主线
划重点 | 一次关于“沟通反馈”主题内容的复盘
自动化 (12讲)
加餐 | 你真的了解重构吗?
29 | “懒惰”应该是所有程序员的骄傲
30 | 一个好的项目自动化应该是什么样子的?
31 | 程序员怎么学习运维知识?
32 | 持续交付:有持续集成就够了吗?
33 | 如何做好验收测试?
34 | 你的代码是怎么变混乱的?
35 | 总是在说MVC分层架构,但你真的理解分层吗?
36 | 为什么总有人觉得5万块钱可以做一个淘宝?
37 | 先做好DDD再谈微服务吧,那只是一种部署形式
答疑解惑 | 持续集成、持续交付,然后呢?
划重点 | “自动化”主题的重点内容回顾汇总
综合运用 (7讲)
38 | 新入职一家公司,怎么快速进入工作状态?
39 | 面对遗留系统,你应该这样做
40 | 我们应该如何保持竞争力?
答疑解惑 | 如何在实际工作中推行新观念?
划重点 | “综合运用”主题内容的全盘回顾
总复习 | 重新审视“最佳实践”
总复习 | 重新来“看书”
结束语 (1讲)
结束语 | 少做事,才能更有效地工作
10x程序员工作法
登录|注册

加餐 | 你真的了解重构吗?

郑晔 2019-03-15
今天(3 月 15 日),Martin Fowler 《重构》第二版的中文版正式发布。前不久,人邮的杨海灵老师找到我,让我帮忙给这本书写推荐语,我毫不犹豫地就答应了,有机会为经典之作写推荐语,实属个人荣幸。
不过,我随即想到,在专栏里,我只是在谈 TDD 的时候提到了重构,并没有把它作为一个专门的话题来讲,于是,我决定给我的专栏读者加餐,专门谈谈重构,毕竟重构是几乎每个程序员都会用到的词汇。但你真的了解重构吗?

每个程序员都要做的事

作为程序员,我们都希望自己的代码是完美的。但没有代码是完美的,因为只要你的代码还有生命力,一定会有新的需求进来,而新的需求常常是你在编写这段代码之初始料未及的。
很多人直觉的选择是,顺着既有的代码结构继续写下去,这里添一个 if,那里加一个标记位,长此以往,代码便随时间腐坏了。
如果用一个物理学术语描述这种现象,那就是“熵增”,这也就是大名鼎鼎的热力学第二定律。如果没有外部干预,系统会朝着越来越混乱的方向发展。对抗熵增的一个办法就是引入负熵,让系统变得更加有序。而在代码中引入负熵的过程就是“重构”。
调整代码这件事是程序员都会有的习惯,但把这件事做到比较系统,上升为“重构”这个值得推广的实践是从一个小圈子开始的,这个小圈子的核心就是我们在专栏里前面提到过的两位大师级程序员:Ward Cunningham 和 Kent Beck。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《10x程序员工作法》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(23)

  • 非鱼
    函数式编程有什么推荐书籍吗?

    作者回复: 有几本可以了解一下,《计算机程序的解释与构造》(Structure and Interpretation of Computer Programs,SICP),还有《Haskell 趣学指南》(Learn You a Haskell for Great Good!),《函数式编程思维》(Functional Thinking)。

    2019-03-15
    13
  • 旭东
    重构是“改革”,重写是“改朝”

    作者回复: 这个比喻…有点道理

    2019-04-03
    4
  • 重构不仅是愿景(名词),也不仅是行为(动词),还应该成为程序员必备的习惯和工作方式。但要成为习惯,甚至是深入骨髓的那种,是需要有积极意识和大量联系的。
    有程序员会说,先把功能实现了,后面我再去重构,但后来的情况往往是不重构,或是债务过多重构代价太大,原因也大多是之前课程中提到的诸如任务分解不到位,微操作缺失,缺乏合理有效的单元测试等等,所以程序员的自我修养也是要体系化的,所谓功到自然成。与诸君共勉之!

    作者回复: 观察和解释都很到位。

    2019-03-17
    3
  • 我行我素
    在之前的理解中一直认为重构就是将看着别扭或者影响性能和可能出现问题的代码进行调优,

    作者回复: 如果你看到了差异,我的目的就达到了。

    2019-03-16
    2
  • 西西弗与卡夫卡
    不少人把重构望文生义或者扩大到成重新构造、重新构建甚至推倒重来了吧

    作者回复: 是的,典型的标题党式理解问题。:)

    2019-03-15
    2
  • Lyam📵
    维护别人的“旧代码”,可以从重构开始。

    作者回复: 重构,从理解重构开始。

    2019-03-24
    1
  • hua168
    我用idea建立了一个spring写了一个简单的MVC,按您的方法搞了半天终于搞定了。
    但有一个问题,代码如下
    package com.hualinux;

    import org.springframework.stereotype.Repository;

    @Repository
    public class T1Dao {

        public void printName(String name){
            System.out.println("Dao层的name");
        }
    }
    我光标放在方法行,按F6,会弹出如下提示:
    All candidate variables have types that are not in project.Would you like to make method 'printName' static and then move
    非要静态化才行,要不不给操作~~

    作者回复: 你没有在这个类里面添加新类的实例。

    public class T1Dao {
        private NewCommon target;
        ...

        public void printName(String name) {
            System.out.println("Dao层的name");
        }
    }

    2019-03-16
    1
  • hua168
    老师,我有点疑惑:
    文中 重构的手法就会把它做一个分解:
    ●添加一个新的通用类,用以放置这个方法;
    ●在业务类中,添加一个字段,其类型是新添加的通用类;
    ●搬移实例方法,将这个方法移动到新的类里面。

    最后服务类中有一个通用的方法是不是要在服务类中删除或注解掉?
    如果删除或注解那不是一样引起大批量操作?那跟重写不是差不多了?
    如果没删除那不是有2处可以引用相同的方法?不是产生冗余了吗?

    作者回复: 最后一步叫“搬移”,就是把服务类的方法删除,在通用类里增加。用 IDE 的“重构”动作完成,它会替你搞定所有问题。

    2019-03-15
    1
  • Time
    上次去面试,我说我们公司用的项目是ssm的,技术比较老,然后面试官问我没有想过重构嘛?使用新的框架。请问他这个'重构'的意思 其实是 '重写' 了吧?

    作者回复: 确实,他的理解是错的。

    2019-03-15
    1
  • 丁丁历险记
    讲个段子,身为公司首架(自己封的) 我和其他开发人员的最根基差别就在于重构。
    2019-11-17
  • 丁丁历险记
    步子一定要小。
    2019-11-17
  • 丁丁历险记
    分享里面一句对我影响很大的话, 将意图与实现分离。
    2019-11-17
  • 码农Kevin亮
    一直以为重构是要重新调整结构。学习了任务分解的概念才知道原来我一直在重写

    作者回复: 恭喜你认清了一个概念

    2019-08-29
  • 小钟
    买了十来个专栏从来没有写过留言,读到这里很认同之前看过的几个留言,郑老师的这个专栏是看过对我帮助最大的一个,可以用高级来形容,将软件工程,agile,,精益创业的一些概念结合的很好,谢谢老师。
    2019-06-29
  • helloworld
    知道什么是代码坏味道,分步骤消灭坏味道
    2019-05-02
  • 刘晓林
    时隔三天,总感觉自己没有理解这一章的内容,尤其是文中举的把一个通用方法挪到一个通用类的例子到底是在说明什么。今天走在路上的时候突然好像“顿悟”了,于是又回来把文章看了一遍,总结如下:
        1.重构是专业的。重构不是简单的把一堆代码挪到另一个位置,然后再去调整它,使得它能够编译通过和顺利运行。重构应该是一个具体的可以描述和追踪的任务,是由一个一个具体的、有逻辑关系的步骤组成的,不是一锅粥。
        2.重构是微操作。既然是任务,那么就可以做任务分解,把重构分解成一个个很小的微操作,这些微操作做完任何一个都是可以停下来的。这样,重构就变成了可计划、可追踪的任务线,还可以方便地用项目管理工具管理起来。
    不知道“顿悟”得对不对,望老师指点。
    2019-04-18
  • enjoylearning
    我所理解的重构是在原有代码的基础上,无论是让代码clean,还是重构成模式,在有代码测试覆盖率保证的前提下,让其变得humanread和易维护。
    2019-03-27
  • 旭东
    重构到重写也是个量变到质变的过程。个人理解。但重写不一定是从重构做到的

    作者回复: 重写和重构是两个套路,重写基本上需要重新设计,重构一方面可以在日常工作中应用,一方面可以用以发现代码中的结构。

    2019-03-26
  • Matrix
    最近就在重写一个系统,因为我觉得重构已经救不了它了。。

    作者回复: 重写不是问题,别说重构就好。

    2019-03-20
  • Haile
    计算机程序构造与解释是神书哇……
    2019-03-17
收起评论
23
返回
顶部