最近我遇到了一位以前公司的同事。他提到了数年前我在那个公司曾经开发过的项目。他说这个项目现在已经变成了“职业杀手”。基本上,任何接触过这个 “职业杀手”项目的人最终都会离开这个公司。如果公司想让名下的程序员人数>0,唯一的办法就是花数月时间完全重构这个系统。

对于这事我有两点要说。首先,在我离开这个公司前,这个系统的单元测试覆盖率已经达到了85%,所以,不要责备我。第二,这么大规模的重构?肯定会出问题。

每 一个系统里都至少有一个成为人民公敌、让所有人害怕的组件。它承载了太多的任务,它拥有太多状态,太多的其它组件调用它。当时间到了偿还技术债务的时候, 人人都会把目光投向这个组件。然而,如果你对这个组件只有一个不全面的理解,你放下所有工作来完全重构它,那你成功的几率会很小。这个组件,就就它表现出 来的令人恐怖的程度和复杂相比,它的实际情况会比你想象更复杂,更恐怖。

你认为这个组件是如何发展成这样一个不幸的状态的?是因为公司雇用 了一个笨蛋,让他肆无忌惮的往系统里增加复杂度?或是因为这个组件最初设计的太抽象,由于多年来需求的变更,它的责任范围不断的扩大?(出于个人的自尊, 我宁愿相信这个“职业杀手”属于后者)。十有八九,这个组件变成如今这个恐怖的状态,都有由“聪明人”的一些“好意”造成的。如果你决定做一次大的重构, 你实际是欠下了另一笔技术债务留给后人。

为了能真正的彻底偿还这笔债务,你需要去分解这个系统的复杂度。你需要花时间寻找所有调用这个组件 的客户端。你需要花时间跟你的同事交流,了解这个这个组件的历史和它是如何被使用的。你需要简化这个组件的周边环境,看看它是如何运作的。每周,你都需要 花更多的时间来更清楚的了解这个组件的业务。只要有足够长的时间跨度,你最终能理清所有复杂的问题。

从实际方法上说,这个问题应该怎么办?与其现在花3个整月的时间做一次完全的重构,不如先用一个季度的时间做清理工作。最后还是要重写,但有了3个月的计划准备,你有了时间去分析和设计。你有了时间来理清业务。

[英文原文:It's Not Refactoring, It's Untangling ]

你需要的不是重构,而是理清业务逻辑(转)相关推荐

  1. 模板方法模式详解附有代码案例分析(包含模板方法模式重构JDBC操作业务代码示例)

    模板方法模式 一.模板方法模式的概念和角色 (一).模板方法模式的概念 (二).模板方法模式的角色 二.模板方法模式的应用场景 三. 模板方法模式的代码示例 四.模板方法模式重构JDBC操作业务 五. ...

  2. Java用观察者模式重构复杂的业务代码

    1. 定义一个统一的回调接口 public interface CallerInter {void call(Param param); } 2. 定义观察者接口 public interface O ...

  3. 代码重构(四):条件表达式重构规则

    继续更新有关重构的博客,前三篇是关于类.函数和数据的重构的博客,内容还算比较 充实吧.今天继续更新,本篇博客的主题是关于条件表达式的重构规则.有时候在实现比较复杂的业务逻辑时,各种条件各种嵌套.如果处 ...

  4. 【原】移动web资源整理

    [原]移动web资源整理 回顾2014年,刚转来到新的部门,非常渴望做出一个所谓的成功产品,心态几乎变了,每天都忙忙碌碌在项目中,把原来阅读和学习的习惯给忽视了,作为一个技术人员,没有通过学习新的知识 ...

  5. 程序员必备的思维能力:结构化思维

    凌云时刻 在日常工作中,我们时常会碰到这样的情况,有的人讲一件事情的时候逻辑非常混乱,说了很多事情的罗列,却说不到重点.有的人写代码,本身的业务逻辑并没有多复杂,但呈现出的代码却像一堆线团,混乱不堪, ...

  6. 外刊IT网站经典计算机开发,评论,总结文章汇总共享

    全部文章 ·        2013年十二月 (19) ·        25: 辞掉你的工作,去开发一个应用:我的创业故事 (5) ·        24: 你是一个努力工作的程序员吗?还是一个懒惰 ...

  7. 太原理工大学软件学院信息安全方向软件安全技术重点

    2019级信息安全方向软件安全技术课 代课教师为王星魁 一.书上重点: 第一章 1.零日攻击 什么是零日攻击? 零日漏洞是指未被公开披露的软件漏洞,没有给软件的作者或厂商以时间去为漏洞打补丁或是给出解 ...

  8. uml通信图画法_UML 交互图 (顺序图、通信图、鲁棒图、定时图)

    交互与交互图 交互的概念 一次交互就是指在特定语境中,为了实现某一个目标,而在一组对象之间进行交换的一组消息所表示的行为 消息 UML中的4种交互图 顺序图:顺序图是一种强调消息时间顺序的交互图,为读 ...

  9. Oracle的PL/SQL编程前奏之基础技能实战一(匿名子程序)

    Oracle的PL/SQL编程之基础技能实战一 一>基础代码检查检查以bm_开头的系统初始化编码表是否有空值.与业务系统相关的编码项不能存在空值,会导致系统业务无法办理.为初始化数据表.在做测试 ...

最新文章

  1. 机器学习在热门微博推荐中的应用
  2. 移植uboot第一步:下载,编译,烧到板子上试验
  3. 「软件测试基础」理论篇之软件测试概论
  4. Android开发中高效的数据结构用SparseArray代替HashMap
  5. python中argsort,sort 和 sorted,operator.itemgetter函数
  6. Cannot resolve corresponding JNI function
  7. 设为首页、加入收藏 兼容代码
  8. ORACLE 实现 ID 自增
  9. python车牌识别系统开源代码_TensorFlow车牌识别完整版代码(含车牌数据集)
  10. 数电4_4——常见组合逻辑电路(3)数据选择器
  11. 淘宝店铺所有商品API接口(店铺所有商品列表接口)
  12. apple id邮箱停止服务器,Apple ID被大范围停用,你可以看看这个帖子。
  13. dotnet core error 0x80070057
  14. 变量消元(Varible Elimination)和概率边缘化(Marginalization)的关系
  15. 第九届玲珑轻院校赛随笔
  16. TCP 的那些事 | SACK
  17. SqlConnection,SqlDataAdapter,SqlCommand,SqlParameter
  18. 深入解析ThreadLocal源码
  19. GD32F4上使用HAL库实现USB虚拟串口通讯
  20. 【爬虫 | Python】解决‘Requests Max Retries Exceeded With Url‘报错的问题

热门文章

  1. [20180306]关于DEFERRED ROLLBACK2.txt
  2. CentOS学习日记:PostgreSQL篇
  3. Android 应用程序集成FaceBook 登录及二次封装
  4. Linux搭建SVN(CollabNet Subversion)服务器 可视化界面
  5. 为什么选用 React 创建混合型移动应用?
  6. Select模型原理
  7. Mysql 乱码的解决
  8. 使用java.util.zip对字符串进行压缩和解压缩
  9. Navicat数据库备份还原
  10. C++深入理解虚函数