如果老板让你重构系统 你就这样跟他说
【大咖・来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》
上个月,有个以前的同事问我:“你在的时候,为什么不把原来的系统都重做了,我们明明有实力啊”。
我说:“我们也做了很多事情嘛,系统稳定性、安全性、增加冗余、理清各模块职责、API 通讯机制的建立、内部分层的整理。”
他说:“对,但我还是想知道,你为什么不把系统重做了呢?”
于是我问:“我离职之后,后来似乎多投了不少人重做系统?结果怎么样呢?”
他说:“结果,结果就是做业务要同时操作三四套系统……”
就我所见,把原有系统 “推倒重来” 的喜好不只程序员有,使用者更有。拿我几年前的那份工作来说,刚入职老大们就来跟我讨论系统重做的打算:需要多少人,多少钱,多长时间,能把原有系统推翻重来。毕竟大家每天都忍受切肤之痛:速度慢、经常出错、不安全、客户抱怨、架构糟糕…… 所以都想拿出 “敢叫日月 换新天” 的劲头,来个干脆的彻底解决。
这种心情可以理解,但在我任内 “重做系统” 一直没有被提上日程,整个技术团队所做的都是 “改良” 的工作,内容就像我上面说的:系统稳定性、安全性、增加冗余、理清各模块职责、API 通讯机制的建立、内部分层的整理。这个选择我有充分把握,而且在我看来,如果断然 “推倒重来”,我未必能比继任者做得更好,甚至可能更糟糕,因为 “推倒重来” 绝不是那么简单的事情。
众所周知,软件开发的难点之一就是控制复杂度。但是在不同的领域,复杂度有不同的表现。对于纯互联网业务,或者 IT 基础架构来说,其复杂度在于软件本身,架构的制定、类库的选择、编码的质量等等。对于其它 IT 系统——尤其是公司迅速成长,业务不断复杂化的 IT 系统——而言,其复杂度并不在于软件本身,安全、性能、负载的问题都套用现成的 IT 解决方案,真正的复杂度来自系统承载的业务本身,比如最简单的:系统里有哪些单据,各种单据承载什么信息,用在什么场景,这些单据是怎样流转的,各种单据存在怎样的约束关系,出现异常情况应当如何处理才能保证业务数据的一致性……这些问题没有准确而稳定的答案,IT 再怎样努力也是白搭。
对于已经能在线下规范运行的业务,或者是有经典解决方案的工作(比如财务、仓库管理),这些知识都是现成的,可以直接拿来用。但对于新兴领域、新兴业务来说,往往不存在 “经典解决方案”。加上很多公司成长速度飞快,一开始并没有构筑好的 IT 基础(其实是业务架构基础)。典型的情况就是:业务概念混乱不清,业务逻辑层也是杂乱无章,很多系统里干脆把数据库当作业务逻辑层(这可不是说笑,因为数据库无法推脱责任了)。结果,混乱的业务逻辑依附于糟糕的 IT 系统,乱上加乱最终成了一锅粥。对 IT 来说,已有业务的问题层出不穷,每次出问题都需要花费大量精力,寻找蛛丝马迹来 “破案”;对业务来说,新增业务往往会影响到原有业务,但谁也不知道会不会影响,会如何影响。系统日渐庞大的另一面是内部日趋无序,复杂度和维护成本飞速增长,远远超过可控范围。
吊诡的是,许多人的解决办法不是针对问题的根本原因,评估业务复杂度、整理业务逻辑、整理业务关系,反而认为 “推倒重来”、新做一套系统就能解决。持这种观点的人,通常对系统与业务的关系也有误解。
对希望 “推倒重来” 的人来说,系统和业务的关系,有点像车辆对人员:一辆车我开了一段时间觉得不好,就想换一辆车来开,这是很自然的。但是在信息化深入工作各个角落的今天,系统和业务的关系远不是 “车辆对人员” 那么疏远,而更像 “心脏起搏器对人”,或者 “人造骨骼与肌肉” 的关系,已经如胶似漆缠在了一起,系统对业务的支持越多越广(暂时不论质量),双方纠缠得也就越紧密。更换心脏起搏器或者人造骨骼的难度,远远比换车的难度要大,所以需要慎重考虑,不能单纯因为心脏起搏器 “不那么好” 就轻率决定更换。对系统来说,也是如此。
如果要对基础不好的遗留系统做脱胎换骨的改造,我有几点经验可以参考:
***,一定要有非常优秀的业务人员和开发人员。
对业务人员来说,不但要熟悉自己手头的操作,还必须明白操作背后的逻辑,并且需要超越本职工作,能从全局角度来思考自己的业务(有时甚至要让自己操作更复杂,来提高系统安全性等收益),这样才能真正把握住业务的复杂度。对开发人员来说,要能够完整理解领域知识,同时必须有高超的编程能力来应对遗留代码,敢于出手而不是畏缩不前,谨慎出手而不是贸然行动——如果原有系统开发人员的技术能力可以打 30 分,全新开发系统的技术要求是 60 分,那么要成功改造遗留系统的技术人员,往往需要有 80 以上的分数才能胜任。
第二,“推倒重来” 往往不如 “逐步改良”。
所谓 “逐步改良”,指的是大家先通过讨论确认未来系统的设计蓝图,然后需要开发用于过渡的接口层。于是,新开发的模块一定要严格按照新的规范开发(这也就是我说的 “理清各模块职责、API 通讯机制的建立、内部分层的整理”),同时通过过渡的接口层与原有系统对接,原有的模块则在理清业务逻辑的情况下,按需切出合适的接口,逐部分在测试通过的情况下进行迁移。最终新的系统是像拼图一样慢慢拼出来到***一天才成型的,而不是平底盖楼造起来的。在这个过程中,最关键的是找到合适的切入点,搭建出合适的接口或者接口层。这些工作就像盖房子的脚手架,哪怕之后不会用到,中途也不能省略,还必须仔细对待。当然,这是一个考验人的工作——我曾经遇到过数据库事务里跨库连表的查询,这个糟糕的设计严重阻碍了单数据库实例拆分成多实例的进展,回想起来真是如噩梦一般。
如果你对改造遗留系统有自己的见解,或者在这个过程中有什么有意思的经历,欢迎留言给我。
***推荐一本有意思的书。其实不管是软件开发还是社会变革,对于不喜欢的现状,大家往往喜欢来个 “干脆”、“彻底” 的解决方案,但真正成功的往往不是这些方案。在第二次世界大战结束时,世界上到底发生了哪些事情,遇到了哪些问题,又是怎样重建社会秩序的呢?广西师大《理想国》丛书第 9 册《零年:1945 现代世界诞生的时刻》,用翔实的文笔全面记录了 “终战” 之后的情景,许多画面相信会让读者大吃一惊——很多时候 “文明” 堪称被打回原形,“零年” 这个名字可谓名副其实。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Facebook如何降低应用中的FOOMs
【大咖・来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》 在 Facebook,我们一直致力于让应用稳定、快速、可靠。在 Facebook 的 iOS 应用上,我们已经做了很多工作去减少应用的崩溃率以及全面提高应用的稳定性。此前,大多数的崩溃都是由于常规性错误,一般都会伴随着相应代码行的栈回溯信息,并且提供了可能导致问题所在的提示信息。 当我们继续解决崩溃问题时,我们观察到需要解决的崩溃比例正在下降,但是我们注意到 App Store 指出社区继续出现令人失望的应用崩溃。我们深入研究了用户报告,并且从理论上说明内存不足(out-of-memory events (OOMs))可能正在发生。OOMs 一般发生在系统运行在低内存的环境下,OS 为了回收内存而终止应用。它既可能发生在前台,也可以是后台。我们在内部称之为 FOOMs 和 BOOMs — 当我们说应用爆炸(BOOM)了,好像很好玩的样子。 从用户的角度来看,一个前台内存不足导致的崩溃和常规的崩溃是不好分辨的。一般分为几种情况,应用异常终止,似乎消失,以及用户返回设备主屏幕。如果内存的消耗速度急速增长,那么应用会在不...
- 下一篇
库克为PC判死刑:有了iPad Pro谁还关注PC?
【大咖・来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》 11月10日消息,据外媒报道,苹果希望彻底更改人类工作的方式。为了取代传统计算机,苹果周一在英国伦敦考文特花园(Covent Garden)的旗舰店举办了大屏幕平板电脑iPad Pro的发售仪式。 出席发售仪式的苹果***执行官蒂姆·库克(Tim Cook)表示,“如果你们关注PC,我想问你们为什么还要再关注PC?真的,你们为什么还要购买PC?”华尔街和整个世界目前都痴迷于苹果的主导产品iPhone。不过这家公司依然相当的自信,该公司的新平板电脑和流媒体播放器能够帮助公司继续的增长。库克表示,“对许多人来说,iPad Pro是笔记本电脑或台式机的替代品。一旦这些人开始使用iPad Pro,他们就没有必要再使用除了手机意外的其它设备。” 在发布大屏幕的iPhones 6和6S Plus,以及大屏幕的iPad Pro之后,一些市场分析师认为,小屏幕iPad Mini的生存空间会受到挤压。对于iPad Mini的销售是否会因这些产品受到影响,库克表示,“我想如果消费者拥有了大屏幕的手机,他们可能不会再去购买iPad Mi...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- 设置Eclipse缩进为4个空格,增强代码规范
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS关闭SELinux安全模块
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案