写点什么

如何避免新代码变包袱?阿里通用方法来了!

  • 2019-10-10
  • 本文字数:1884 字

    阅读完需:约 6 分钟

如何避免新代码变包袱?阿里通用方法来了!

前言

即使代码多年的人都会对这两个问题有点蒙圈:什么是设计?什么是架构?


从单词上看:设计是 Software Design,架构是 Software Architecture;分别对应的作者是:Designer 和 Architect:


  • Architect 都是 Designer,但 Designer 未必是 Architect。正如所有的架构设计都是设计,但设计未必是架构设计;

  • Design 关注微观代码(inside component),Architecture 关注宏观软件结构(between components);

  • Architect 应该都是从 Designer 成长起来的。毕业了用 code 编写软件;成长了用 ppt 设计软件;

  • 只会用 ppt 设计,但代码写得不好的 Architect 都是假的 Architect;

  • Architecture 里听到比较多的词语:Serverless、FAAS、Microservice、multi-layer、Event driven、OSGI、NBF…

  • Design 里听到比较多的词语:SOLID、 DDD、正交设计、Design Pattern;

  • 搞不清 SOLID,也不可能把软件的层次分好,也无法理解什么是 OSGI 的价值;

  • 好的 Designer 是通往好的 Architect 的必经之路。

服务化架构的基本原则

New System

从零开始建立一个新的系统,有几个特征:


  • 历史包袱小

  • 上下文简单

  • 设计的约束小

  • 新写的每行代码都可能成为明天的历史包袱


由于调用方还没有,新系统可以比较完美的执行我们预想的架构设计,但是切记,最后那行才是最重要的那行:不要让今天的代码成为明天的历史包袱,新的每行代码都在书写历史。


上图的 1,2,3,4 代表新建系统的顺序:


  1. 由“相”抽象出“心”:先思考,那么多的业务场景下“相”,共同的特征“心”是什么。并反向用更多的相去验证心。

  2. 将“心”具象成领域模型:关注领域模型(Domain Model),解耦数据模型(Persistence Model):将 TUNNEL SPI 化。

  3. 将领域模型中的依赖 SPI 化:解耦对外部系统的依赖,反转依赖控制权。

  4. Mock 所有 spi 实现,确保“心”领域模型包裹的单元测试完全通过

  5. 实现 TUNNEL BUNDLE:设计数据模型(Persistence Model),关注“存”,“取”不关注领域模型。

  6. 实现依赖 SPI 适配 BUNDLE:连接真实依赖服务。

  7. 包装 domain service:模型相关,业务无关。

  8. 根据业务需求组合/编排 domain service 成为 scenario bundle 或者业务 SOP。

Working on legacy

对于一个软件工程师来讲,写代码最痛苦的事情莫过于 coding on legacy,但同时又给了我们各种说辞:


  • 这些代码太烂了,改起来太费劲【需要更多人】

  • 这事做不到,因为以前系统架构问题导致的【责任不在我】

  • 经过我的修改,现在已经好很多了,工单数量大批下降【我功劳显著】

  • 知不知道:接手你代码的人其实也在重复说上述 3 件事情


如何能有效的在遗留代码上工作,业内有本非常不错的书,叫"Working Effectively with Legacy Code",值得精读:



图片来源:书籍《Working Effectively with Legacy Code》


所以我这里的标题可能不准确,我要讨论的更多是"遗留代码的重构",什么时候我们开始讨论需要把现有系统重构:


  • 代码确实腐化到无法正常维护,或者新加一个需求代价很大;

  • 目前代码的技术架构满足不了下一步业务的发展;

  • 很多特性已经下线作废,却跟有用的代码藕断丝连;

  • 业务逻辑随着发展分散到不同的应用里,界限不清;

  • 专家级的未雨绸缪,着眼未来的规划和新技术的应用;

  • 换老大了,需要立新的 flag。


架构的基本原则依然是上面那幅图。但上下文的不同,我们的发力点和优先级有明显的区别。阿里整个体系里的依赖关系错综复杂,要对阿里环境下的系统做重构是件绝对谨小慎微的事情。为了完成在这么复杂体系下的架构及代码重构,我们必须有条不紊的分离关注点以及一如既往的坚持软件卓越。


聚焦与收敛上游调用



解耦下游依赖



以服务为单位切换



老系统下线


经过一步一步的分解,legacy 系统已经完全被重构,并且具备随时切换的准备。这里我给几个建议:


  1. 先把老实现作为 API 的默认实现,新的实现作为老的实现的降级实现,并使用策略分流一部分流量(具体比例跟团队信心相关);

  2. 对于有业务需求变更的部分应尽快实现在新的实现里,并将新实现作为 API 的默认实现,老实现作为新实现的降级实现,策略应该是即时降级,也就是新实现出现问题立刻降级到老实现;

  3. 运行一段时间没有问题后,讲所有默认实现切换为新实现,并将老实现作为新实现的降级实现;

  4. 其实这时就算所有切换完毕:老实现可以永远作为新实现的降级实现,也就是只要我升级一次服务,上一次成功版本就可以作为这次的降级实现,这样,线上问题回滚就是秒级的。

总结

本文基于借助 NBF 提供的远程多态,服务编排等能力下基础资料,商品,组网等系统新建,重构的经验及方法论总结。仅供遇到架构重构,解耦等问题困扰的技术团队参考。


本文转载自公众号阿里技术(ID:ali_tech)


原文链接


https://mp.weixin.qq.com/s/1nFNAtpDPKzv2TyRd3UOjg


2019-10-10 08:003934

评论

发布
暂无评论
发现更多内容

掌握行业全球新闻,实现产业研究/内容聚合分发/情报采集

八爪鱼采集器︱RPA机器人

爬虫 采集

HPE Aruba Networking连续七年蝉联Gartner SD-WAN魔力象限领导者

科技热闻

阿里架构师:天天高并发,这个时代达不到百万以上的并发量都不叫高并发!!!

程序员高级码农

多线程 架构师 Java高并发 Java’ 高并发‘’

第三届OpenHarmony技术大会硬件生态分论坛圆满举办

科技热闻

见证 RTE 的新篇章丨 RTE 年度场景 Showcase 暨第四届 RTE 创新大赛开幕

声网

YouTube 上线「用相机拍摄」标签为真实视频「验明正身」;美国被曝考虑限制向中东国家出口 AI 芯片丨 RTE 开发者日报

声网

CAE和CAD的区别

智造软件

计算机 CAE cad 仿真技术 辅助设计

采集医药行业数据,赋能企业创新与决策

八爪鱼采集器︱RPA机器人

爬虫 采集

采用众包方法进行红队测试 (Red Teaming)

澳鹏Appen

red team 大模型幻觉

如何对 GitLab 老旧版本进行升级?

极狐GitLab

gitlab 安全漏洞

如何在鸿蒙 NEXT 中使用 @Builder 装饰器优化 UI 组件的复用?

威哥爱编程

huawei HarmonyOS ArkTS HarmonyOS框架 HarmonyOS NEXT

人工智能机器人

天津汇柏科技有限公司

AI 人工智能

精彩回顾 | KaiwuDB 携手信通院举办能源行业数据库研讨沙龙

KaiwuDB

人机识别到底难在哪?

芯盾时代

身份安全

盘点15款国内外社交聆听工具

八爪鱼采集器︱RPA机器人

爬虫 采集

产品负责人对干系人说‘不’的6条准则

ShineScrum

政务公告数据的应用与八爪鱼的实践

八爪鱼采集器︱RPA机器人

爬虫 采集

GitLab 安全漏洞CVE-2024-9164、CVE-2024-8970 等的修复方案

极狐GitLab

gitlab 安全漏洞 CVE CVE 漏洞

阿里Java面试手册-Java面试题总结(附答案)——互联网大厂都在问的Java面试题,而你从没看过!

程序员高级码农

Java 面试 架构师 Java’ Java 面试题 春招‘

分布式电商项目:天猫 Java 亿级高并发架构设计笔记

程序员高级码农

数据库 高并发 电商 分布式, 消息列队

采集新闻数据,助力产业研究/内容聚合分发/行业研究/舆情监控

八爪鱼采集器︱RPA机器人

爬虫 采集

全面洞察商业情报,助力企业破解增长难题

八爪鱼采集器︱RPA机器人

爬虫 采集

八爪鱼采集在国央企产业大脑的应用:以智慧水务大脑为例

八爪鱼采集器︱RPA机器人

爬虫 采集

原型设计软件:Axure RP 9(Win&Mac)中文版

你的猪会飞吗

Axure RP 9汉化 Axure RP 9破解版 Axure RP 9授权

第三届OpenHarmony技术大会应用生态实践分论坛成功举办

科技热闻

近期,除了“纯血鸿蒙公测”,校园开发者还有这件事要知道!

YG科技

Java程序员真的还有未来吗?如何备战2025春招Java面试?并狂拿大厂offer?(java高级岗)

程序员高级码农

Java 面试 架构师 Java’ 面试‘ Java 面试题

行业融媒体平台建设与八爪鱼

八爪鱼采集器︱RPA机器人

爬虫 采集

鸿蒙 NEXT 如何使用 @Styles 装饰器来优化我的组件代码?

威哥爱编程

华为 HarmonyOS ArkTS HarmonyOS框架 HarmonyOS NEXT

如何避免新代码变包袱?阿里通用方法来了!_文化 & 方法_辉子_InfoQ精选文章