Categories: Yurii谈开发

“推倒重来”的讲究

本文由Yurii原创,转载请注明来源: Life Sailor

本文链接 “推倒重来”的讲究


上个月,有个以前的同事问我:“你在的时候,为什么不把原来的系统都重做了,我们明明有实力啊”。

我说:“我们也做了很多事情嘛,系统稳定性、安全性、增加冗余、理清各模块职责、API通讯机制的建立、内部分层的整理。”

他说:“对,但我还是想知道,你为什么不把系统重做了呢?”

于是我问:“我离职之后,后来似乎多投了不少人重做系统?结果怎么样呢?”

他说:“结果,结果就是做业务要同时操作三四套系统……”

就我所见,把原有系统“推倒重来”的喜好不只程序员有,使用者更有。拿我几年前的那份工作来说,刚入职老大们就来跟我讨论系统重做的打算:需要多少人,多少钱,多长时间,能把原有系统推翻重来。毕竟大家每天都忍受切肤之痛:速度慢、经常出错、不安全、客户抱怨、架构糟糕…… 所以都想拿出“敢叫日月换新天”的劲头,来个干脆的彻底解决。

这种心情可以理解,但在我任内“重做系统”一直没有被提上日程,整个技术团队所做的都是“改良”的工作,内容就像我上面说的:系统稳定性、安全性、增加冗余、理清各模块职责、API通讯机制的建立、内部分层的整理。这个选择我有充分把握,而且在我看来,如果断然“推倒重来”,我未必能比继任者做得更好,甚至可能更糟糕,因为“推倒重来”绝不是那么简单的事情。

众所周知,软件开发的难点之一就是控制复杂度。但是在不同的领域,复杂度有不同的表现。对于纯互联网业务,或者IT基础架构来说,其复杂度在于软件本身,架构的制定、类库的选择、编码的质量等等。对于其它IT系统——尤其是公司迅速成长,业务不断复杂化的IT系统——而言,其复杂度并不在于软件本身,安全、性能、负载的问题都套用现成的IT解决方案,真正的复杂度来自系统承载的业务本身,比如最简单的:系统里有哪些单据,各种单据承载什么信息,用在什么场景,这些单据是怎样流转的,各种单据存在怎样的约束关系,出现异常情况应当如何处理才能保证业务数据的一致性……这些问题没有准确而稳定的答案,IT再怎样努力也是白搭。

对于已经能在线下规范运行的业务,或者是有经典解决方案的工作(比如财务、仓库管理),这些知识都是现成的,可以直接拿来用。但对于新兴领域、新兴业务来说,往往不存在“经典解决方案”。加上很多公司成长速度飞快,一开始并没有构筑好的IT基础(其实是业务架构基础)。典型的情况就是:业务概念混乱不清,业务逻辑层也是杂乱无章,很多系统里干脆把数据库当作业务逻辑层(这可不是说笑,因为数据库无法推脱责任了)。结果,混乱的业务逻辑依附于糟糕的IT系统,乱上加乱最终成了一锅粥。对IT来说,已有业务的问题层出不穷,每次出问题都需要花费大量精力,寻找蛛丝马迹来“破案”;对业务来说,新增业务往往会影响到原有业务,但谁也不知道会不会影响,会如何影响。系统日渐庞大的另一面是内部日趋无序,复杂度和维护成本飞速增长,远远超过可控范围。

吊诡的是,许多人的解决办法不是针对问题的根本原因,评估业务复杂度、整理业务逻辑、整理业务关系,反而认为“推倒重来”、新做一套系统就能解决。持这种观点的人,通常对系统与业务的关系也有误解。

对希望“推倒重来”的人来说,系统和业务的关系,有点像车辆对人员:一辆车我开了一段时间觉得不好,就想换一辆车来开,这是很自然的。但是在信息化深入工作各个角落的今天,系统和业务的关系远不是“车辆对人员”那么疏远,而更像“心脏起搏器对人”,或者“人造骨骼与肌肉”的关系,已经如胶似漆缠在了一起,系统对业务的支持越多越广(暂时不论质量),双方纠缠得也就越紧密。更换心脏起搏器或者人造骨骼的难度,远远比换车的难度要大,所以需要慎重考虑,不能单纯因为心脏起搏器“不那么好”就轻率决定更换。对系统来说,也是如此。

如果要对基础不好的遗留系统做脱胎换骨的改造,我有几点经验可以参考:

第一,一定要有非常优秀的业务人员和开发人员。

对业务人员来说,不但要熟悉自己手头的操作,还必须明白操作背后的逻辑,并且需要超越本职工作,能从全局角度来思考自己的业务(有时甚至要让自己操作更复杂,来提高系统安全性等收益),这样才能真正把握住业务的复杂度。对开发人员来说,要能够完整理解领域知识,同时必须有高超的编程能力来应对遗留代码,敢于出手而不是畏缩不前,谨慎出手而不是贸然行动——如果原有系统开发人员的技术能力可以打30分,全新开发系统的技术要求是60分,那么要成功改造遗留系统的技术人员,往往需要有80以上的分数才能胜任。

第二,“推倒重来”往往不如“逐步改良”。

所谓“逐步改良”,指的是大家先通过讨论确认未来系统的设计蓝图,然后需要开发用于过渡的接口层。于是,新开发的模块一定要严格按照新的规范开发(这也就是我说的“理清各模块职责、API通讯机制的建立、内部分层的整理”),同时通过过渡的接口层与原有系统对接,原有的模块则在理清业务逻辑的情况下,按需切出合适的接口,逐部分在测试通过的情况下进行迁移。最终新的系统是像拼图一样慢慢拼出来到最后一天才成型的,而不是平底盖楼造起来的。在这个过程中,最关键的是找到合适的切入点,搭建出合适的接口或者接口层。这些工作就像盖房子的脚手架,哪怕之后不会用到,中途也不能省略,还必须仔细对待。当然,这是一个考验人的工作——我曾经遇到过数据库事务里跨库连表的查询,这个糟糕的设计严重阻碍了单数据库实例拆分成多实例的进展,回想起来真是如噩梦一般。

如果你对改造遗留系统有自己的见解,或者在这个过程中有什么有意思的经历,欢迎留言给我。

最后推荐一本有意思的书。其实不管是软件开发还是社会变革,对于不喜欢的现状,大家往往喜欢来个“干脆”、“彻底”的解决方案,但真正成功的往往不是这些方案。在第二次世界大战结束时,世界上到底发生了哪些事情,遇到了哪些问题,又是怎样重建社会秩序的呢?广西师大《理想国》丛书第9册《零年:1945现代世界诞生的时刻》,用翔实的文笔全面记录了“终战”之后的情景,许多画面相信会让读者大吃一惊——很多时候“文明”堪称被打回原形,“零年”这个名字可谓名副其实。

Yurii

View Comments

  • 最近我们的老服务重构项目到尾声了,采取的策略就是:先维护和重构外围接入层的服务,灰度上线和回归来替换掉老服务;后续重构核心业务层;最后才计划动数据库。您的这篇文章值得我经常回顾,谢谢。

    • 血泪的教训啊。我觉得最主要的是先明确定好要做什么以及详细了解清楚现在有什么,然后才是动手。

Recent Posts

德国育儿经验:家长需要和儿童谈论”空气动力学“吗?

家长应当和儿童,尤其是低龄儿童谈论“空气动力学”吗? 我的答案曾经是非常肯定的:不应当。不要说儿童,就是成年人也不见得理解这些抽象的概念,与儿童谈论这些名词,只会让人望而生畏。身为父母,我们应当做的是,以孩子能理解的、感兴趣的方式谈论相关的具体问题,但绝对不要提这些大词。 不过世界的奇妙就在于,父母对教育并没有绝对的权威,总是需要根据实际情况来修正自己的观点。在“空气动力学”的问题上,我就吃到了教训。 那是一个下午,家里小朋友在iPad上看完他最喜欢的Blippi(这个节目我之前介绍过,对80后父母来说,Blippi可以理解为“带你见识各种新鲜玩意的董浩叔叔”),忽然抬起头来问我:“爸爸,你知道什么是aerodynamics吗?” “什么?你问我知不知道什么是aerodynamics?”我的下巴都要掉下来了。“空气动力学”这种词还是上中学时,身为军迷的我们在《航空知识》上知道的。再往后英语好一些,能看原版科普视频了,才知道“空气动力学”的原文就是aerodynamics。可是,我家这个还没上小学的家伙,竟然就能真诚地瞪大眼睛,一本正经地问我“知不知道什么是aerodynamics”。 (more…)

3 months ago

忆孟繁超老师:他从来没有给我上过一堂正式的课,但我永远都是他的学生。

我本来是不应该认识孟老师的。 2001年,我在寝室夜谈里第一次听到孟老师的名字。当时有同学说“公共选修课的《法学概论》讲得真好,那个老师叫孟繁超”,开始我不怎么在意,慢慢才发现这么说的人还不少。那个年月网上的资料正丰富,出版管制也不那么严格,刚进大学不久的我正自由自在地看得过瘾,心想“大学里的法学概论讲再好,能讲些什么,还不是教科书上老一套”,所以这种课,不听也罢。 但生活就在这么奇妙。那年冬天,有天中午我吃过饭正准备午睡,忽然有人敲门问“计算机系有位叫余晟的同学在这里吗?” 大中午的谁会来找我?我正好奇这个问题,门一推开就有同学喊“孟老师,孟老师来了”。 那是我第一次见到孟老师,中年人,国字脸,身材高大,打扮很精神,披在身后的深色大衣让我一下子想起电影里的斗篷。他笑眯眯地说“你是余晟?听同学说你搞电脑很厉害,我家的电脑坏了,想请你去看看。” (more…)

3 months ago

“历史照进现实”,这似乎不太现实

中国人大概都对历史有一些特别的偏好。对我们普通人来说,历史首先是文化的象征,一个人“懂历史”,基本等于这个人“有文化”;历史也是民族自豪感的来源,哪怕考古上仍然存在争议,但是“五千年文明”的说法是普通人都耳熟能详的。 不过等我长大之后才发现,这种偏好大概还有更深层次的原因,那就是历史看起来有种道德的意味,因为我们从小就熟悉“以史为鉴”的智慧,也熟悉各种“历史的选择”:每当我们对现实感到失望、困惑的时候,我们经常去历史——而不是先贤的智慧中——中寻找解答。找到曾经发生的类似的故事,就可以预言未来的结局。 于是乎,失望也好、困惑也罢,总归会有光明的未来,历史总会给我们支撑的信念。 我曾经很相信,熟谙历史是种智慧,而且是深层次的智慧。但是看得越多、经历得越多,我就越觉得,这很难称之为“智慧”。 为什么? (more…)

3 months ago

无人出租车,是技术进步的一粒灰,还是普通人头上的一座山?

“无人出租车要来了”。以百度“萝卜快跑”为代表的无人出租车,眼看就要在国内多个城市成规模运营。 熟悉IT的人都知道,IT的独特优势就在于“大规模扩展时边际成本极低”。在软件时代,微软开发的Windows,多卖一份的成本只是多刻录一张光盘而已。在无人驾驶时代,从10辆车到10万辆车的成本,也遵循同样的规律。换句话说,一旦模式“跑通”了,就可以迅速大规模铺开。无人出租车的大规模应用,也是“指日可待”了。 只不过,新技术这一次似乎没有那么激动人心,反而引起了很多争议——无人驾驶出租车大规模推广,会不会影响广大出租车、网约车车主的收入甚至生计?如果是,这样的技术进步,真的是我们所需要、所期待的吗?对于这个问题,不同的人有相差迥异的答案。 按照我的观察,许多人对此是相当乐观的。理由在于,“技术的每一次飞跃发展,虽然有阵痛,最终都创造了更多的新岗位”。既如此,无人出租车短期“看似”抢了许多人的饭碗,但也只是短期的“阵痛”而已。看看历史,纺织机的发明,蒸汽机的改良,汽车的诞生,无不证明了“阵痛说”的正确性。 坦白说,这种观点我是怀疑的。 (more…)

3 months ago

回国感受:松弛一点,愉快一点

因为小朋友放暑假,近期带小朋友回国待了几个礼拜。最深的感受就是标题所说的:松弛一点,愉快一点。 我第一次突出意识到这点,是在上海下飞机乘地铁。当时我们乘的直梯就要关门,远远看见有个年轻小伙子跑过来,我连忙按住开门按钮,并招呼他”别着急,慢慢来“,等他进了轿厢才关门。本来我以为大家起码会打个招呼,露个笑脸,因为我已经习惯如此,但完全出乎我意料的是,他进来之后对我们完全视若不见,自顾自掏出手机,盯着看得入迷。 我继而发现,不管是在电梯里,站台上,还是车厢里,虽然四下里都是广播”请扶好站稳,抓好扶手,不要看手机“,但是似乎人人都盯着自己的手机。年轻人在打手机游戏,年纪大一点的在滑各种小视频,还有不少人在聊天软件里打字如飞……对着屏幕的表情都很生动,可是一旦抬起头来,似乎马上又换了个人。 后来又有一次,我乘地铁的时候,因为比较拥挤,一个小伙子倒退时踩了我一脚,他大概意识到了,很快把脚挪开,脸上闪过一丝不安,马上又恢复正常,我也没有计较。不幸的是,过了十来分钟,他又踩了我一脚,同样是先有一点不安,很快又恢复正常。 这次我忍不了了,于是我开口告诉他:“小伙子,你已经踩了我两脚了。” (more…)

3 months ago

First name, last name, middle name,浅谈外国人名

前几天,国内朋友发来一条消息,原来是乌克兰F-16坠落,飞行员丧生的新闻。我本来以为他要讨论此事的真假和原委,他真正的问题却完全出乎我的意料: 新闻里说,飞行员叫阿列克谢·“月鱼”·梅斯,对应原文是Alexei “Moonfish” Mes,为什么会有人把“月鱼”写在自己的名字里,而且还打引号。 之前看新闻,乌克兰还有一个著名的飞行员叫安德烈·“果汁”·皮尔希科夫(Andrii “Juice” Pishchykov),怎么“果汁”也是正式的名字? 未必Moonfish和Juice之类,还有什么特别的含义吗?…… 这堆问题看的我有点想笑,因为自己以前也很苦恼外国人的名字,只有在国外长期生活,才逐渐搞清楚这其中的名堂。所以,除了解答朋友的问题,我也把自己的解释写下来,搞清楚两个最不容易理解的点,就不会对外国人名有那么多问题了。 (more…)

3 months ago