一年前,在公司大佬的指点之下,我开始写系统级重构工具 Coca (https://github.com/phodal/coca) 。哦,不,不对,是刚开始学习 Golang,因为我的第一次提交是从一个 Go 的 hello, world 写起的。

commit a685d69080a7abde684e1d0707cbf410092e3173
Author: Phodal HUANG <h@phodal.com>
Date: Tue Oct 22 23:01:19 2019 +0800
first commit
commit c6b5a0c7f174c6a0ba233a1356aca5c370ba4315
Author: Phodal HUANG <h@phodal.com>
Date: Tue Oct 22 23:06:04 2019 +0800
learn: add hello world

时过境迁,这个小工具已经不小了 —— 即使是这个项目的作者,我也要看我写的 README,才会想起来有这么一些功能。这一年来,根据我的一些工作上的需要,陆陆续续地也添加了一些颇为有意思的特性。这些小特性除了不限制编程语言:

还可用于指导重构:

还可以用于写 PPT 的时候讲述故事:

  • 高频修改文件查找

  • 包结构分析(不限于 Java,大部分的语言是以目录划分包结构的)

  • Todo 分析(可结合历史)

当然了,如果你的系统是 Java 语言主导的话,那么 Coca 能提供更强有力的支撑,具体见:https://github.com/phodal/coca

只是呢,不管我们使用的是什么工具,我们方法论都是类似的。也因此《系统重构与迁移指南》(https://migration.ink/) 成为了系统重构不可多选的材料,Google 『系统重构』 和 『重构工具』会有惊喜。

系统的必然之路:系统重构 or 重写

没啥说的,部分的系统都是要被重构或者重写的。那么另外一部分呢?他们被淘汰了——要么是产品,要么是公司,笑~。

系统变成了一个大泥球,需求已经越来越难以实现:

真相就是这么简单。如果系统不被指南,和进行频繁的代码级重构的话,那么系统被取代的速度就更快了。

重构 vs 重写

关于系统级别的重构,我们先要讨论的第一个问题其实蛮简单的:我到底是要重构还是重写?选择哪个主要取决于:你要的是技术挑战,还是业务挑战?

哦,不,不对,它取决于你要的是 KPI 是技术 KPI,还是非技术 KPI?说白了,就是价值决定了一切。

对于重构而言,我们所要面对的是技术挑战;对于重写而言,我们所面对的是业务挑战。

重构的技术挑战

我们所面临的主要技术挑战是:

  1. 是否能确保过程的安全性?如何设计测试防护网

  2. 是否能想到更好的设计来取代现有的方案?

  3. 如何做一次有效的分析与评估?

  4. 如何渐进式的重构系统?如何保持小的、快速的提交

  5. 怎样支持未来业务的可扩展?即,支撑业务可扩展性

  6. 是否寻找最合适的重构技巧?比如通过 IDEA 的重构

  7. 如何让重构技能被传承?即,多数团队成员都能快速上手

  8. ……

重写的业务挑战

与重构不同的事,重写时的挑战主要是来自于梳理现有业务:

  1. 如何体系化的整理现有的业务?

  2. 如何剔除已淘汰的业务?

  3. 如何确保主干业务的完整性?

  4. 是否能确保细小的业务功能不被遗失?

  5. 能否设计出更完善的业务知识管理体系?

系统重构的未来

在 Coca 编写完成之后,我发布了《系统重构与迁移指南》一份短小、精悍的重构手册。从这个手册快速的自然增长率(GitHub star 指标,没有经过大量宣传),并且已经在 Google 的相关关键字下(如系统重构、重构策略等)排名第一,我发现了人们缺少一份这样的指南和工具。

所以,在未来一定会有更多的相关工具诞生,并配套有大量的实践指南。

方法论支撑

在开始重构之前,我们需要设计出可行的重构方案,这也就是方法论的支撑。

对于重构的方法论来说,实现上我们已经可以在市面上找到大量的相关书籍,只需要结合起来看就可以了:

  • 《重构与模式》

  • 《设计模式:可复用面向对象软件的基础》

  • 《重构:改善既有代码的设计》

  • 《领域驱动设计:软件核心复杂性应对之道》

  • 《修改代码的艺术:构建易维护代码的 9 条最佳实践》

  • 《代码整洁之道》

  • 《架构整洁之道》

  • 《数据库重构》

  • 《遗留系统重构指南》

  • 《前端架构:从入门到微前端》

工具支撑

市面上,已经充斥着大量代码级重构的工具,如 JetBrians 系列的 IDE。但是,对于系统级重构来说,基本上很少有工具可以直接能支撑现有的系统,哪怕是 Coca 也是有限的支持。主要原因就是:大部分的内部系统都绑定了组织中的模式。特别是对于大型组织来说,它们往往配套开发了自己的底层架构和 API。

也因此,对于系统级别的重构来说,我们要优先考虑的是定制一个工具,又或者是基于开源工具进行扩展。

操作指南支撑

同样的,我们也很难在市面上找到这样的指南,因为对于大部分的公司和团队来说,重写是更好的 KPI,而重构并不会带来如此丰富的价值。除此呢,对于有过重构经验的团队来说,他们也不一定会共享出自己的经验——受能力和保密协议影响。

其它

软件开发总成本 = 开发成本 + 维护成本;软件维护成本 = 理解成本 + 修改成本 + 测试成本 + 部署成本。—— Ken Beck

系统重构的未来:重构工具 Coca 一周年相关推荐

  1. 分子重构技术_分子影像重构精准未来:百名专家云端共筑 One MI 生态圈

    原标题:分子影像重构精准未来:百名专家云端共筑 One MI 生态圈 5 月 16 日下午 15:00, 由 GE 医疗分子影像产品部主办的「智微天眼,MI 向未来」2020 精准医学·分子影像峰会, ...

  2. 阿里资深技术专家:如何对复杂的业务系统进行解耦和重构?

    要明白实际上微服务后续出现的诸多问题往往都是一开始微服务模块划分就不合理导致,对于具体的模块划分方法和原则,我在上面文章里面给出了以下几点. 原则1:划分为<10个微服务模块 原则2:强数据关联 ...

  3. 活动报道 | “E起午餐会”(第二期)袁老师访谈录(第二十二期)【碳达峰碳中和重构企业未来】成功举办...

    6月18日中午,香港科大校友及合作伙伴齐聚京城俱乐部,香港科大EMBA"E起午餐会"(第二期)&袁老师访谈录(第二十二期)成功举办!环境政策领域的专家.香港科大公共政策研究 ...

  4. [系统安全] 四.OllyDbg动态分析工具基础用法及Crakeme逆向破解

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  5. 【Java设计模式 规范与重构】 一 重构的目的、内容、时机、方法

    从本篇Blog开始,在学习具体的设计模式之前,先学习高质量代码的达成路径的实践部分代码重构和编程规范. 重构的目的 什么是重构,重构是一种对软件内部结构的改善,目的是在不改变软件的可见行为的情况下,使 ...

  6. [转载]用JBuilder 2005实现重构之认识重构

    用JBuilder 2005实现重构之认识重构 为什么要重构 从Martin Fowler所著的<重构--改善既有代码的设计>一书连续两年成为最畅销的计算机图书之一,就可以知道重构给程序员 ...

  7. 为什么要代码重构?如何重构?常见重构技巧,值得收藏!

    >>号外:关注"Java精选"公众号,回复"2021面试题",领取免费资料!"Java精选面试题"小程序,3000+ 道面试题在 ...

  8. 代码重构与体系结构重构

    介绍 每个人都知道重构的含义: 敏捷编程的基础,以及不断提高代码质量的最佳途径. 但是重构并不总是相同的,可以定义两个不同的类别: 代码重构 架构重构 代码重构与体系结构重构 过去几年开始使用&quo ...

  9. 应用在核电站DCS系统的代码自动生成工具ModelCoder

    对标航空航天领域,核电新型号作为典型复杂系统在未来的发展趋势和任务变得十分明确,即正规化.标准化地应用MBSE从概念设计.初步设计.持续贯穿至详细设计.施工.调试.运维.退役的全生命周期各阶段,开发出 ...

最新文章

  1. Introduction to Django(The Definitive Guild to Django)
  2. 【转载】中文输入法下onKeyPress不能触发的问题
  3. Centos-7.4_安装_Redis_4.0.8
  4. MySQL查询语句中的IN 和Exists 对比分析
  5. Linux sed工具用法
  6. replace使用案例--替换空格
  7. VB 二进制文件的操作
  8. extjs4 grid 刷新数据时不改变滚动条位置
  9. Elastic Stack之Elasticsearch 5.6.12 集群部署实战
  10. 使用wireshark对HTTPS解密
  11. 开发imageJ插件失败经验
  12. win10操作系统使用IE8浏览器仿真环境
  13. #九、江恩、四维理论方法从古人那里得到的启发(一)来自星空的启示
  14. firefox金山词霸取词
  15. The Bean Validation API is on the classpath but no implementation could be found 项目启动报错解决
  16. ViewData与ViewBag的区别是什么
  17. SVN拉取、提交文件
  18. facebook、twitter、facebook登录、whatsapp分享、微信分享
  19. 吉米_王:浅谈深拷贝和浅拷贝异同点
  20. 深入浅出C++ ——初识C++

热门文章

  1. 对输入进行MD5加密
  2. jmeter循环和计数器
  3. 网络拓扑abor.js库---力导向
  4. Linux操作系统的基本使用(ubuntu)
  5. 运行于老虎证券开放api的一个小小策略
  6. Android P userdebug模式获取adb root adb remount 无权限 remount失败
  7. Orthogonal Arrays(正交法测试)amp;Pairwise Testing (成对法测试)
  8. 包装大小与商品价格问题
  9. Third season eighteenth episode,hypnotic recording(maybe you can remember 吕子乔)
  10. 微信小程序毕业设计 基于微信小程序的物业维修报修系统开题报告