惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 司徒正美
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Last Week in AI
Last Week in AI
大猫的无限游戏
大猫的无限游戏
博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
爱范儿
爱范儿
The Cloudflare Blog
阮一峰的网络日志
阮一峰的网络日志
博客园 - 叶小钗
博客园_首页
有赞技术团队
有赞技术团队
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
V
V2EX
V
Visual Studio Blog
博客园 - 三生石上(FineUI控件)
S
SegmentFault 最新的问题
量子位
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
美团技术团队

Posts on WKLKEN THINKING

apisix 中的 lrucache apisix 中的服务发现机制 apisix 中的负载均衡 apisix etcd机制 聊聊框架 关于 k8s 的 zero downtime deployment 一些建议 apisix 遇到的一些问题 关于在除夕前一天换了一个洗衣机的故事 Django DRF 性能优化 DRF 的一些实践 Part1: Serializer DRF继承关系图 Better Code: 关于接口的灵活性 新的仓库: wklken/naming 缓存使用的一些经验 Better Code: 抽象: 可扩展性与可维护性的抉择 Better Code: 异常时, 该提示用户哪些信息? Better Code: 更好的异常日志打印 Go: some libs Go: go-redis/cache升级的坑 Go: logrus性能提升 Go: gin validation 远程办公的一点总结 Go: 开发过程中的一些bug 项目管理实践: 风险驱动开发 Go: 一种error wrap调用链处理方式 漫谈技术选型 Go: 基于 apitest 做handler层单元测试 Go: go-sql-driver interpolateparams参数优化 [分享]深度工作 你需要更多的思考时间
读书笔记-遗留系统重建实战
2019-08-11 · via Posts on WKLKEN THINKING

Re-Engineering Legacy software

遗留项目: 任何已存在的, 难以维护或难以扩展的项目

这本书总体来说还不错, 值得一读

第一章: 了解遗留项目中的挑战

特征:

  • 老旧
  • 庞大
  • 继承而来
  • 文档不完善

遗留代码:

  • 没有测试和无法测试的代码: 难以确认
  • 不灵活的代码: 难以修改和扩展
  • 被技术债拖累的代码:

遗留基础设施:

  • 开发环境: 难以搭建/搭建成本高, 构件工具/项目中构件脚本/文档中大量的手工步骤
  • 过时的依赖: 没有定期维护, 带来了后期升级维护的成本和风险
  • 异构环境: 不同环境不能保持一致, 这种环境不一致带来的风险(无法模拟生产环境)

遗留文化:

  • 害怕变化: 缺少信息 1)哪些功能不再使用可以移除? 2)哪些bug可以被安全的修复 3) 改动之前应该咨询哪些用户? -> 结果: 保持现状是最安全的选择; 纯粹的风险, 忽略了带来的好处;
  • 知识仓库: 知识的匮乏; 团队知识的共享和传承; 1) 缺乏面对面沟通 2)代码是我的 3)忙碌的面孔

Re-Engineering Legacy software

第二章: 找到起点

恐惧: 遗留系统带来的不确定性; 对未知的恐惧: 更改了一行代码可能会破坏一些根本不相关的东西

探索性重构: 尝试重命名方法, 在两个类之间移动方法, 引入新的接口, 添加注释等等小变更

好处:

  • 增加你对代码的理解, 了解越多, 掌握的信息就越多, 恐惧越少;
  • 提高的代码的可读性;
  • 在版本控制系统/IDE/编译器/其他开发人员等帮助下, 更简单且安全

特征测试: 验证系统指定部件当前的行为

收集软件的有用数据:

  • 静态代码分析工具 / bug查找工具
  • 性能: 性能测试+生产环境性能监控
  • 错误计数: 例如500错误
  • 对常见的任务计时: 1) 从头开始搭建开发环境时间 2) 发布或部署项目所花的时间 3) 修复一个bug的平均时间
  • 版本库中修改最多的文件

静态分析工具

  • FindBugs: 查找java中潜在的bug -> 修复关键bug
  • PMD: 是否遵循最佳实践 -> 修复
  • CheckStyle: 修复风格问题, 提高可读性

第三章: 准备重构

重构时始终记得组织的目标

两种角色:

  • 传统主义者: 不要碰任何东西, 强烈反对任何形式变化的开发者; 认为重构会带来不必要的风险;
  • 反传统主义者: 所有东西都要重写; 厌恶遗留代码; 热衷于提高代码质量, 但是可能过于激进;

Re-Engineering Legacy software

需要通过沟通, 确保团队每个人对项目有相同的理解, 统一目标及计划;

获得组织的批准

选择重构的目标: 三个维度评估, 难度/风险/价值

  • 容易实现的目标: 风险=低, 难度=低
  • 痛点: 价值=高

重构还是重写?

  • 不应该重写的情况: 1)风险 2)开销 3)任务总是超出预期时间
  • 重写的好处: 自由/可测试性
  • 重写的必要条件: 1) 尝试过重构并且失败了 2) 编程范型的转变
  • 第三种方式: 增量重写, 将重写分成若干个较小的阶段, 每个阶段都应该提供业务价值, 应该可以在任何给定阶段之后停止项目, 并且仍然能获得一些好处.

第四章: 重构

有纪律的重构:

  • 把重构和其他的工作分开
  • 依靠IDE的refactor!
  • 依靠版本控制系统

常见的遗留代码的特征和重构

移除陈旧代码:

  • 被注释掉的代码
  • 死代码: 绝对不会被执行的代码
  • 僵尸代码: 那些功能已经去掉或者不再存在
  • 过期代码: 时间依赖/ab test/活动等

移除有毒的测试:

  • 没有测试任何东西
  • 脆弱的测试:
  • 随机失败的测试

第五章: 重搭架构

重搭架构是比方法和类更高级别的重构. 可以把它想像成大型的重构, 将大型应用拆分为多模块

好处:

  • 通过模块化内建质量
  • 良好的涉及保障可维护性
  • 通过独立达到自治

涉及:

  • 单体应用拆分为多模块
  • 前后端分离
  • 微服务

其他

开发环境自动化:

  • 一个好的README
  • vagrant/ansible/docker等实现开发环境自动化

多环境一致性: 测试环境/预发布环境/生产环境

开发/构建/部署过程自动化

Linux 项目持续成功: 公开和坦诚沟通的文化, 重视CodeReview

主题

1. 源代码并不是项目的全部

2. 信息不能是自由的

文档: 信息丰富/易于编写/易于发现/易于阅读/可信赖

促进沟通: 代码评审/结对编程/技术访谈/向其他团队展示你的项目/黑客日

3. 工作是做不完的

维护代码库质量十一个永无止境的任务; 需要保持警惕并在质量问题一出现就解决它

定期进行代码评审 / 破窗理论

4. 自动化一切

自动化测试/自动化构建/自动化部署等

  • 使你的生活更加轻松
  • 是你的接班人的生活更加轻松

5. 小型为佳

保持代码库小型轻量;