【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

Raffi Krikorian 为“在运行中进行架构重写”提供了指南

  • 2015-04-19
  • 本文字数:2741 字

    阅读完需:约 9 分钟

O’Reilly 软件架构大会的开幕致辞中, Raffi Krikorian 为那些承担了重写某个系统重任的技术领导与架构师分析了相关的策略与战术。凭借着他在担任 Twitter 工程团队的副主裁期间所学到的经验,Krikorian 对于重新设计架构这一流程的管理提出了 12 点计划,包括定义“完成”、检测现有系统,以及维持代码的质量。

Krikorian 目前是 Uber 高级技术中心的工程领导,之前也在 Twitter 工程团队担任副主裁,他在致辞中首先表示,重写、或对某个系统的架构进行重组背后的原因与流程往往会因为一系列问题的出现而备受折磨:人们往往会低估复杂性、人们永远不会做到完全理解客户、系统的需求不断地在改变、而且整个流程所需的时间通常远远超出人们的预期。

Krikorian 认为,重写架构的原因通常是由于现有的应用程序无法再满足客户的需求、无法实现规模的扩大、或是无法实现类似产品所具有的特性。在演讲中列举了一系列的系统重写案例学习、着重指出了一些常见的陷阱,并为承担一次成功的系统重写架构任务提供了一些策略。一个核心主题贯穿了整个演讲,那就是尽量避免完整的重写,但如果已经选择了走这条路,那么应当事先对以下 12 点内容进行思考,并在系统重写架构过程中不断调整。

  1. 坚定方向(为了业务的提高)
  2. 定义“完成”
  3. 渐进式前进
  4. 找到起跑线
  5. 不要忽略数据
  6. 更好地管理技术债务
  7. 远离那些虚荣的东西(例如使用“热门”的技术栈)
  8. 做好准备面对压力
  9. 了解业务
  10. 做好面对政治因素的准备
  11. 对于代码质量有所掌握
  12. 让团队做好准备

Krikorian 随后依次对这些要点进行了探讨,他首先表示,在应用程序的重写过程中,业务产品经理会表现得非常焦虑,但技术领导必须对这一点加以控制。业务与技术方面的干系人必须在共同的努力下对什么是“完成”进行定义,这样才能够实现一次成功的架构重写。可以在定义需求时使用一些现有的需求规格分析技术,但不应将现有的代码作为整个新系统的规格说明。

Krikorian 同时也表示,要保持新系统与现有系统的功能 100% 的等价是非常困难的。当现有的系统在生产环境上运行的过程中,有可能会加入新的功能,以应对某些问题或边界情况,而这些修改也许没有被很好地记录在文档中。

你真的清楚这套系统在做些什么吗?

“让新的系统能够实现现有系统的能力”这一点比你想象中要困难。

大多数程序员甚至都不知道应当问些什么问题,而如果他们并非系统最初的设计者,那他们就更加摸不着头脑了。

实现特性是一件困难的事,因此更应当采用渐进的方式进行重写。最合适的方式是采取一种敏捷式的、集成的、并且基于持续交付的流程。在每次迭代结束之后,都应当能够做到随时准备发布新的系统,并且应该定期地为业务干系人展示经过重写的功能。Krikorian 同时也对在重写中混入新特性的做法进行了警告:

混入新的特性是相当诱人的行为,尤其是新特性的开发在旧系统中停止的前提下。

但这种做法可能会要了你的命。

在常规的开发中,你也会尽量避免这一点,那么为什么现在又一次犯错呢?

与应用程序的代码相比,某个软件系统底层的数据的变化往往显得十分缓慢。但 Krikorian 警告说,在重写过程中使用虚构的、或是人为的数据会造成安全性方面的错觉。必须尽快使用真实数据进行测试,有时可以使用类似于摸黑启动(dark launching)或模拟流量(traffic shadowing)之类的技术。必须有计划地决定如何在现在系统与新的应用程序中保持数据的一致性。对现有系统必须进行全面检测(包括性能与数据处理两方面),然后根据这部分检测结果在系统重写中进行决策。

在任何一次系统重写的过程中,对技术债务的管理都是一个核心部分,如果对这部分视而不渐,会不断增加软件的熵。造成技术债务的原因通常是来自于业务的压力、缺乏流程、缺乏一种定义良好的架构、以及缺乏工程上的导师制度。

Krikorian 表示,组织应该培养一种保证设计质量的文化。应当鼓励重构、同时也应当鼓励持续设计以及其它有关代码质量的实践。在开发时间中应当专门抽出一部分以解决技术债务。如果没有合适的照料,那么真实世界中的代码会变得越来越复杂难懂。由于开发者通常会将更多的时间放在阅读而不是编写代码上,因此应当通过代码审查的方式保证代码结构的“可读性”。

Krikorian 同时也建议,在重写过程中应当尽量避免“虚荣的东西”,例如选择某种“热门”的新语言或技术栈。虽然这种选择很有诱惑,能够在短期内提高开发团队的动力,或将其用做一种招聘工具,但技术领导应当做出对团队的长期利益有益的选择。

在重写的过程中,很有可能会招致客户的强烈不满。外部的客户无法获得新的特性,而内部的客户也因为重写而不得不停下工作。

在整个工程中可能会出现政治性的斗争,并且由于最后期限几乎总是被推迟,因此受挫的情绪可能会在在整个组织中蔓延开。

Krikorian 警告说,在开始重写之前“没有人会考虑到这些问题”。这些斗争对重写可能会产生破坏性,而技术领导必须对可能出现的决心动摇的情况进行管理。

在重写过程中,将一个开发团队划分为两个团队的做法并不罕见,由其中一个团队负责维护旧的系统,另一个团队负责重写架构的工作。虽然这能够成为一种有效的做法,但技术领导需要做好准备,以应对可能出现在这两个团队之间的压力。修复 bug 与救火是很有压力的工作,而某一个团队必须要承担这一任务,而另一个团队则可以置之不理。Krikorian 建议,技术领导必须在负责维护现有系统的团队中维持或建立一种支持的角色。在团队之间应当定期进行项目进度方面的沟通,并且保证重写过程中的所有工作保持透明度。

在重写开始之前,技术领导要指出所有的业务干系人,这一点十分重要。同时也要指出在重写任务背后的非技术动力并加以管理,例如增加特性交付的速度,或减少硬件方面的成本。Krikorian 表示,整个重写的流程以及相应的流程报告并须由数据驱动,其中可以包含成本节约、特性交付速度、可靠性、性能以及稳定性方面的指标。必须避免将此当作一件趣事的想法,而是必须展示这些实验的成果。

Krikorian 在演讲的最后结尾时表示,承担了系统重写任务的技术领导或架构师经常会处于一个危险的位置上。在重写中使用了大量的工程资源,而同时又不能在业务上交付任何新特性。在保持系统运行时进行重写的工作必须尽量保持在很小的范围内,并且必须使用例如持续集成和持续交付这样的技术定期地进行整合。同时对重写的系统中的代码质量并须加以密切关注。

按照康威定律,理想的架构与团队的结构也必须一致,正如 Krikorian 所说:

架构影响了团队的结构,后者又反过来影响了前者……

在 slideshare 上可以找到 Raffi Krikorian 的这场“在运行过程中进行架构重写”演讲的幻灯片。 O’Reilly 软件架构大会于 2015 年三月在波士顿举办,在会议的网站上可以找到更多的细节,其中包含了这些演讲录像的链接。

查看英文原文 Raffi Krikorian Provides Guidance for “Re-architecting on the Fly”

2015-04-19 08:121820
用户头像

发布了 428 篇内容, 共 172.0 次阅读, 收获喜欢 38 次。

关注

评论

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

HTML学习笔记

虾仁疙瘩汤

html 前端 10月月更

华为云对象存储服务OBS教你一招轻松解决存储难题

路过的憨憨

华为

生产数据实时分析,产品质量高效管控|打造面向工业4.0的智能工厂02

EMQ映云科技

云原生 物联网 IoT 边云协同 10月月更

你好

小东

第一次

一文读懂云渲染“串流”全链路时延及优化策略

阿里云视频云

阿里云 云渲染 云游戏 串流

开发者原来都是健身猛男?

InfoQ写作社区官方

热门活动

HTTP 常用的状态码及使用场景

孙铭

HTTP 10月月更 200

View层、Controller层、Service层、Dao层的区别以及对应的功能

孙铭

service DAO 10月月更

华为云数据灾备方案,撑起一把企业的保护伞

路过的憨憨

华为

华为云数据灾备方案助力企业安全,守住企业底线

路过的憨憨

华为

华为云数据灾备方案如何成为企业的坚实后盾

路过的憨憨

华为

InfluxDB Cluster - InfluxDB Enterprise 集群的开源替代方案

奇小在

Influxdb 时序数据库 分布式存储, InfluxDB Cluster

持续引领产业发展,华为云桌面连续6年位居国内市占率第一

路过的憨憨

华为

华为云CDN联手OBS桶,帮助企业更好降本增效!

路过的憨憨

华为

分布式事务-事务补偿(TCC)

zarmnosaj

10月月更

Vuex在uniapp中的使用

孙铭

Vue vuex 10月月更

华为云数据灾备,如何让企业数据无忧

路过的憨憨

华为

华为云灾备,保护企业信息数据势在必行!

路过的憨憨

华为

助力企业资源的合理利用,华为云数据库RDS for MySQL使用经济更省心!

路过的憨憨

英特尔“四维发力”系统级代工:晶圆制造、封装、芯粒、软件

科技之家

SAP | 聊一聊必不可少的Debug

暮春零贰

debug SAP 10月月更

LeaRun低代码开发平台 助推物联网应用快速落地

力软低代码开发平台

软件测试面试真题 | 显式等待与隐式等待的区别?与强制等待的方式分别是什么,有什么区别?

测试人

软件测试 面试题 测试开发 测试工程师

华为云对象存储OBS,助力企业高效解决存储问题

路过的憨憨

华为

CSS学习笔记1

虾仁疙瘩汤

CSS html 10月月更

华为云桌面,安全可靠的云上办公首选

路过的憨憨

华为

Wallys /IPQ4019 IPQ4029 ,HTTPS / all the modules of Quectel/Indoor Aluminium alloy material

wallys-wifi6

IPQ4019 ipq4029

rdd pair reduce

小东

华为云大数据BI解决方案,如何帮助企业精准营销

路过的憨憨

华为

HTML基本知识学习笔记

虾仁疙瘩汤

html 前端 10月月更

4000字深度总结!Pipeline五大性能实践,招招制敌

极狐GitLab

DevOps CI/CD 持续交付 pipeline 极狐GitLab

Raffi Krikorian 为“在运行中进行架构重写”提供了指南_研发效能_Daniel Bryant_InfoQ精选文章