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

推荐订阅源

P
Privacy International News Feed
I
Intezer
T
Tenable Blog
S
Schneier on Security
Project Zero
Project Zero
G
GRAHAM CLULEY
酷 壳 – CoolShell
酷 壳 – CoolShell
小众软件
小众软件
Know Your Adversary
Know Your Adversary
博客园 - 司徒正美
The Cloudflare Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
N
News and Events Feed by Topic
博客园 - 叶小钗
宝玉的分享
宝玉的分享
L
LINUX DO - 热门话题
aimingoo的专栏
aimingoo的专栏
S
Secure Thoughts
Forbes - Security
Forbes - Security
T
The Exploit Database - CXSecurity.com
D
Darknet – Hacking Tools, Hacker News & Cyber Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 【当耐特】
罗磊的独立博客
IT之家
IT之家
H
Hacker News: Front Page
I
InfoQ
云风的 BLOG
云风的 BLOG
S
Security Affairs
M
MIT News - Artificial intelligence
GbyAI
GbyAI
Jina AI
Jina AI
Help Net Security
Help Net Security
Engineering at Meta
Engineering at Meta
大猫的无限游戏
大猫的无限游戏
Webroot Blog
Webroot Blog
L
Lohrmann on Cybersecurity
A
About on SuperTechFans
Attack and Defense Labs
Attack and Defense Labs
The Register - Security
The Register - Security
V
V2EX
G
Google Developers Blog
D
DataBreaches.Net
Apple Machine Learning Research
Apple Machine Learning Research
C
Cybersecurity and Infrastructure Security Agency CISA
J
Java Code Geeks
W
WeLiveSecurity
Cloudbric
Cloudbric
T
Tor Project blog

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参数优化 [分享]深度工作 你需要更多的思考时间 Django项目重构小结 工作七年小结: 学习,生活及其他 [分享]bash日常: bash-utils 极客时间推广海报 2017总结: 予时光以意义 k8s APIServer源码: api注册详细细节 k8s APIServer源码: api注册主体流程 k8s APIServer源码: 服务启动 k8s APIServer源码: go-restful框架 重构 - 读书笔记(Python示例) 写给新人的沟通建议 vim 杂谈 - 关于快速编辑 vim 杂谈 - 关于移动 读书笔记-重构: 章11 处理概括关系 读书笔记-重构: 章10 简化函数调用 读书笔记-重构: 章9 简化表达式 读书笔记-重构: 章8 重新组织数据 读书笔记-重构: 章7 在对象之间搬移特性 读书笔记-重构: 章6 重新组织函数 Python 代码规范小结 [分享]关于vim ElasticSearch集群部署文档 Logstash+ElasticSearch处理mysql慢查询日志 [分享]关于代码调试DE那些事 Logstash+ElasticSearch+Kibana- 实现相对通用的数据收集分析 ELK维护的一些点(二) [分享]Python源码剖析-数据结构 一些Centos Python生产环境的部署命令 摘录<<6个月学会任何一种外语>> ELK 维护的一些点 也许是一个新的开始 一些vim的个性化配置 读书笔记-调试九法 这段时间的一些想法 Python 源码阅读 - 垃圾回收机制 我为什么要写博客 APUE笔记-第一章 UNIX基础知识 Python源码阅读-闭包的实现 Python源码阅读-内存管理机制(二) Python源码阅读-内存管理机制(一) Python-基础-数据结构小结 '活动'设计的一些trick 一些简单的Python测试题 我的tmux配置及说明【k-tmux】 Review and Restart 工作四周年小结 vim插件: surround & repeat[成对符号编辑] vim插件: gundo[时光机] vim插件: expand-region[区域选中] vim插件: quickrun[快速执行] vim插件: trailing-whitespace[行尾空格处理] vim插件: closetag[成对标签补全] vim插件: ctrlp[文件搜索] vim插件: airline[状态栏增强] vim插件: theme[主题] vim插件: tagbar[大纲式导航] vim插件: nerdcommenter[快速注释] vim插件: rainbow_parentheses[括号高亮] vim插件: syntastic[语法检查] vim插件: delimitmate[符号自动补全] vim插件: matchit[成对标签跳转] vim插件: easy-align[快速对齐] vim插件: multiple-cursors[多光标操作] vim插件: vim-signature[快速标记跳转] vim插件: easymotion[快速跳转] vim插件: vundle[管理插件] Elasticsearch几个问题的解决 分享一份 Vim 简介PPT k-vim 更新9.0版本 关于知识管理工具的思考
读书笔记-遗留系统重建实战
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. 小型为佳

保持代码库小型轻量;