架构师化繁为简,执行者化简为繁

一、一个让我坐在食堂里想了很久的中午

前阵子中午吃饭,我拿起手机看了下公司群的消息,有一条让我很震惊。

公司表扬了一个技术攻关项目里的人员------有硬件的,有测试的,唯独没有软件

我第一反应是不对劲,直接找攻关负责人问:一个产品的技术攻关,怎么会没有软件的人?那它还算个产品吗?

我又把疑问转给了老板,他回了我一句:"确实没看到软件有什么动静",然后劝我别激动。

我当时回了:不能这么说。如果没有软件的修改和调参,不可能达到现在的效果。

我坐在食堂里想了很多。

这个攻关已经不是第一次了,前前后后历经一两年。最初的状态是------距离稍远就卡得没法用。现在做到了流畅稳定。中间软件那一部分,恰恰是我做的。

而我做的事情是什么?是分析出问题的几个方向,是在其中一端做重连机制,是调参数,是判断某个功能应该放在哪一端改。最后的改动很小。

小到"没看到软件有什么动静"。

委屈和愤愤不平涌上心头。但冷静下来之后,我觉得有必要好好捋一下自己,捋一下这个事件背后,关于软件的认知

二、我为什么会走上架构这条路

我工作很多年,也换过一些公司,但有件事始终没停:思考和学习。我也没有停止追逐内心的那个目标------成为一名优秀的架构师。

想成为架构师,是源于中间那家工作了九年的公司。

在那里,我把 NVR 从 128 路提升到 200 路,把跨平台 NVR 从无到有重构出来。我第一次感受到自己具备了一定的架构设计能力------我觉得可以往这个目标冲了。

当时我已经认识到:重构最重要的是思路和模块化,而思路说到底就是抽象,抽象就是把各种表象找到规律、提炼出来。 C++ 面向对象的核心之一,也正是抽象。

于是我在重写回放模块的时候,系统地使用了虚拟继承,把这个思想贯彻下去。带来的结果是------后来要加"即时回放"这个功能时,变得非常简单、非常自然。

而在这之前一年,我维护老版本(只支持单一系统的)NVR 时也加过类似功能,那个痛苦劲儿至今还历历在目------牵一发动全身的那种。

前后一对比,我真实地感受到了:设计有多重要。

三、那句话,让我把零散的想法串成了一条线

从那家工作了九年的公司出来后,我在网上学习,也找过架构师的培训课程。有一家大数据云计算机构抛出了这么一句话:

优秀的架构师把复杂问题简单化,把简单问题解决掉;反之,拙劣的架构师把简单问题复杂化,复杂问题把自己给解决掉。

我一下子就 get 到了其中的精髓------不就是化繁为简吗?

这不正是验证了我之前的所思所想吗?

思路进一步打开后,我一方面跟着他们学习 Kafka 开源库的设计思想,另一方面开始有意识地研究 MySQL 的实现,写了一系列总结博客,其中《MySQL InnoDB 技术内幕:内存管理、事务和锁》就是探秘内部原理的。

写那篇总结时我非常兴奋,因为我的软件认知又升华了一个档次 。为什么要死磕 MySQL?一方面我的 NVR 重构用了它,另一方面它的优秀早有耳闻------想搞清楚它为什么优秀,就得学它的精髓。

后来我如愿去了一家科技公司当架构师,师从一位从腾讯出来的架构师,从理论上又升华了一次。当时做得最多的就是画架构图。那位主管兼导师说得最多的一句话是:

未来无论你们去哪里、做什么工作,都不要忘了架构的思维。

四、回到开头那个疑问

后来我又回到了安防行业,也回到了文章开头那个疑问:我到底做了什么没有?

我想通过前面的唠叨,答案应该很简单------

我肯定做了事情。只是我做的事情是化繁为简,简单到最后,领导以为我没有动静。

这恰恰说明了:架构的重要性,设计的重要性,思路的重要性。

五、那化简为繁又是什么?

化繁为简是设计阶段的事,那执行阶段呢?

时间拨回到去年,我们需要做一个新形态的客户端,开始找第三方合作,进展很慢。可我们内部一直说这个简单------因为主体产品都出来了,Web 端、APP 端都已完成,接口早就定义好了。

那为什么还这么慢?

我反思后突然意识到:我们就是因为它"太简单",而轻视了。

于是我反馈给领导:战术上一定要重视,一定要分解。

这就是开发时要做的------化简为繁

  • 每个功能模块要分开想,该怎么具体实现

  • 关键点在哪儿

  • 真正需要关注的细节在哪儿

  • 哪些细节容易出问题

  • 要反向思考

六、两者的关系:一个硬币的两面

写到这儿,我想把这件事讲透。

化繁为简,是设计阶段的能力------面对一堆混乱的表象,抽象出结构,找到规律,定下层级。产出是:一个判断、一个结构、几行关键改动。

事实上,很多公司的架构师,就是接口定义,即接口开发工程师。如果你能把模块接口都定义出来,也就是对产品功能理解透彻。我在最近一家做某个业务模块时也是这样的,把接口写好了,实现就交给了小伙伴。

化简为繁,是执行阶段的能力------面对一个看起来简单的任务,反过来把它拆开,把细节想透,把风险前置。产出是:一份分解清单、一堆被提前发现的坑。

它们不是对立的,是同一个人需要的两种能力,甚至是一件事的两个阶段。

先化繁为简,才知道劲该往哪儿使;再化简为繁,才知道这一脚踩下去会不会塌。

七、为什么化繁为简的人最容易被低估

这是我最想说的一段,也是我坐在食堂里想明白的。

因为这两种能力的产出,"可见度"完全不同。

  • 化简为繁的产出是看得见的:分解清单、讨论记录、改了一堆问题、忙了很久

  • 化繁为简的产出是看不见的:它最后只留下"几个参数的调整""一个否决""几行改动"

于是出现一个残酷的等式:

你把难事做简单了,别人就以为这事本来就简单。

而"想清楚"那一段,不留痕迹,不产生提交记录,无法被度量。它发生在你坐在食堂的时候,发生在你散步的时候,发生在你盯着现象发呆的时候。

更残酷的是:化繁为简做得越纯熟,这个效应越明显。 新手要改三天,你改三行------反而是你显得更不重要。

我想了很久怎么破,目前有三条:

第一,把"想"的过程留下来。 文档、评审记录、方案对比。不是为了邀功,是为了让认知成本变得可见。我很庆幸自己早年养成了写博客和写专利的习惯------它们在我说不清的时候,替我说了话。

第二,把结果量化。 "优化了无线"没有力量,"从卡顿到流畅、稳定性提升数倍"才有力量。认知价值必须翻译成别人看得懂的单位。

第三,别等别人来发现。 等待是最差的策略。要么自己讲出来,要么找一个看得懂的地方。

八、写在最后

化繁为简是慢功夫。因为"想清楚"这一段,看不见、说不清,也没人给你计时。

但它是唯一不会返工的路。

我在《如何做到慢即是快》里写过,慢不是目的,不返工才是 。这篇算是它的续篇------所谓慢,很多时候就慢在这里:你花在"想清楚"上的时间,跟别人花在"反复改"上的时间其实一样多,只不过你的那一段没人看见。

另外,把我那篇《自以为是与思考》也一并推荐。化繁为简最大的敌人 不是技术难度,是自以为已经想清楚了

而对执行者来说,化简为繁最大的敌人同样如此------自以为很简单,于是掉以轻心,于是轻敌,于是进度一拖再拖。

一个提醒自己多想一层,一个提醒自己多拆一层。

多想一层再动手,多拆一层再下手。