——以终为始,认真不糊弄,敢上不怕事
前些天和人聊天,说到我们大中台系统在疫情三年期间还挺稳定的(关二爷多包涵),虽然几乎到了定速巡航无人驾驶的程度。话虽辛酸,但也带着一丝骄傲。
想想九年前的春节过后,我们一口气启动了 JobCenter (定时任务调度和管理平台)、 NotifyServer (异步消息可靠推送系统)、 Tracing (分布式跟踪)、 ConfigServer (持久化配置中心)等多个中间件服务的开发,其实我心里也没底,毕竟是边开飞机边换发动机。但经过三个月的推广和试用,聂兰彬的 JobCenter 和朱传志的 NotifyServer 上线后非常稳定,开创了我们中间件服务的通天大道,从此后大批中间件服务跨业务线、跨公司推广接入,成为了我们的惯例。
后来的异地双活、IoT平台等中间件服务更是如此,虽说有一些小波折,但稳定性、可靠性和可扩展性还是非常令人满意的,超出了我当初的预期。
为什么它们都这么稳定?(关二爷多保佑)
大概有这么三点:
设计好;
开发测试好;
胆子好。
一.设计好
设计无他,唯以终为始耳。
什么是以终为始?
首先,你一定要先亲手把愿景写下来。
很多老兵的做法恰恰相反,他们会按照一期、二期、三期……逐步推演和编写设计,描述自己心目中的产品或系统,由近及远。
但这是错的。
老兵们总会问自己:“我手头就这点资源,我能做什么?”
通常情况下,现状本身就是问题的一部分。
所以,拘泥于现状,会人为地限制我们的想象力和执行力。
让我们看看亚马逊是怎么做的:
这就是不忘初心。
快速迭代可不代表只能走一步看一步。
过往我经历的每一家公司总是从厘清愿景、使命、价值着手开展工作,所以我也把这个方法论带入到产品研发的具体工作中。
我推荐的系统演进模式是这样的:
第一步,抛开现在(的困境),先预测未来。定义未来将要面对的竞争形态和业务场景,按此设计愿景、使命和价值。
第二步,大家先对这个愿景使命价值的设计达成一致,有没有意义,是不是能解决现在和未来的问题,而不仅仅只解决眼前的问题。
第三步,再回过头来说,现在的系统怎么向这个方向演进。如果某个系统不能平滑演进,但又不能等,那我就开辟一组人马另起炉灶(可能因此扩编)。如果能平滑演进,那就把第一步里愿景设计中最核心、最符合当下利益的部分,拿出来在现有系统里迭代。
即我们是由远及近,而不是由近及远。
如果领导者畏惧系统发生大的改变,只想解决当下问题,只想在现有基础上小步迭代,在螺蛳壳里做道场,是解决不了未来的问题的。我们不能每当谈一个大的变化的时候,就用现在没资源、不好改、会出事来否定,那会永远呆在原地。
举个例子,我曾经这样定义一个叫息壤的系统:
接下来具体怎么做呢?
我在2016年的时候讲过,可以先设计场景, 再总结故事(User Story),通过故事拆解出信息架构,最后构建版本计划,在所有的故事、功能点和版本都确定之后,就进入到迭代开发的过程。
这种做事方式不是让我们的现有资源驱动我们的想象力,而是让我们的想象力驱动现有资源。
其次,借鉴第一性原理。
第一性原理强调的是,你不应把现状视作不变的,而是应该敢于大刀阔斧地改变它;你不应让其他人的愿景塑造你前进的道路,而应该放弃对这些愿景的所有幻想。你要破解现有的假设,直至找出产品或系统的基本组成部分,就好像你在丛林中砍出一条道路那样。
直白地说,我们设计中间件服务,设计大中台体系,不会依据现在有哪些开源软件,有哪些可购买的服务,拼凑出一个可实现的愿景,这叫“用其他人的愿景塑造你前进的道路”。
我们的思路很简单,按照我们写下的愿景,有就拿来用,没有就自己造。
举一个简单的例子,在我们的IoT平台(代号:太空桥)的开发中,就“(所见即所得)远程操控”这个技术细节,开发者并没有选择传统的 adb+openstf+minicap 技术选型(因为会引入太多的不确定性和太大的安全隐患),而是采用第一性原理,既然我们要的是所见即所得,那直接截图、压缩和传图不就完了嘛。
你看,有现成的OpenSTF(Smartphone Test Farm,缩写STF)提供了实时显示设备截图能力,如下图所示,这个过程可以分为三部分:
1)智能设备上不断地使用一个叫minicap的工具截取屏幕,形成图片流;
2)设备端通过Socket协议实时传输图片二进制流至STF服务端;
3)STF服务端通过websocket协议将图像数据传输给STF前端,并进一步渲染图片展示。

图2 STF传输设备截图的原理图
但我们的实现并未参照STF,而是自成一家,工作流程如下图所示。

图3 太空桥传输设备截图的流程图
其中,imserver服务端是一个基于Netty框架和websocket协议实现的消息交换中心,主要目的是分发设备和浏览器端产生的各种图文消息。我们需要保证太空桥管理端浏览器和设备之间的这个长连接在同一个Docker容器里维护和处理,这样就可以用本地缓存来存储设备和浏览器的监控关系,而无需imserver服务节点之间往来通讯。同时我们用Redis存储设备长连接所在容器节点的关系,这样浏览器在发送连接请求的时候,访问任意一个节点都可以获知设备所在节点。
设备端通过IoT平台获悉管理端用户意图开启远程桌面,与imserver建立长连接,之后利用系统自带的screenshot的api完成屏幕快照,如下图代码所示。

图4 反射获取图片-SurfaceControl screenshot-截屏方法
为了不影响智能设备的正常收单业务,我们还在减轻设备的负担和减少网络流量的传输上做了优化,主要涉及以下两点:
1)在源数据取样频率上做了很大的优化,同时如果屏幕数据未发生变化就不会取样。
2)很多安卓设备,特别是高分屏,采集到的原始宽高非常大,如果仍推送原始分辨率,则编码和回传的压力非常大,所以做了图像缩放和压缩。
二.开发测试好
认真,我觉得我们技术团队的特点就是认真。
说到认真,我讲一个医学上的例子。其实,IT科技里解决BUG和排查故障,与医学上的急诊解决疑难杂症有很多相通之处:
一,都有时间上的要求(越快越好),有空间上的要求(不能太折腾),有金钱上的要求(不能太花钱)。
二,线索都可能很多,往往问题现象与根本原因相隔十万八千里。
三,理念上一致,比如“首先考虑常见病原则”,即首先考虑可以引起这种临床表现的最常见的疾病,作为假设诊断,然后寻找证据来支持自己的假设。
四,如果不能快速定位、妥善解决、举一反三,如果反反复复,一个是要了公司的命,一个则是要了人命。
我曾看过一本医学小说,那里面有一个科室主任,在病例点评例会上他这么说道:
“这个病例为什么拿出来讨论?我只想讲两个字,认真,我们对待任何问题要认真,不要认为一个关节痛而已?好多查不出原因,常规的检查治疗全来过一遍,出院就是了。协和医院为什么在医疗界的大哥位置无法撼动,就是因为严谨,这个最大的传统一直延续至今。
我国第一例艾滋就是协和诊断的,这个过程可以写一本书。当时大家没见过这种病,只能通过文献报道了解它,诊断上也没有成熟的生物试剂,全靠医生自己组合资源,进行开拓性的工作。这种例子数不胜数。
一个甲状腺功能亢进的病人,引起全身的骨钙丢失,在多家医院诊断为骨癌晚期。病人不死心,费尽周折挂了协和的门诊,教授看了半天说:这个我经验不足,还不能下结论,我得查查资料,过一周你不用挂号,直接来门诊找我。
当时病人一肚子气,等几个月就等你这句话:不知道?差点没当场发飙,病人丢下一句协和也不过如此嘛,悻悻离开。
一周后,这个病人想来想去,还是去找那个教授了。那个时候,甲状腺功能亢进性骨矿盐疾病,国际上的研究刚刚起步,很多人不认识这种疾病。这个教授下班后拼命查资料,跟国内外的同行通电话商量。一个星期后,诊断出来了:是甲状腺功能亢进,不是骨癌。这个病人以后无论什么病,都去协和看,宁愿等几个月也要到协和看。
以前世界卫生组织儿童基金会秘书到我国访问,提到自己三十年代在协和医院出生的,结果协和医院把他的出生病历调出来,他那个出生时的足印都保留完好,他母亲每天几次母乳喂养的时间都记录得清清楚楚。这是一种怎样的严谨。”
在我们团队里,认真就体现在“定位准确、机理清楚、问题复现、措施有效、举一反三”二十字口诀上,认真就体现在打破沙锅问到底的一份份翔实的RCA报告上,认真就体现在一个个不看手机、不开笔记本、激烈争论的设计评审会上。
三.胆子好
胆子大,敢边开飞机边换发动机。
但是为什么胆子大?
因为我们允许失败。如果瞻前顾后,但凡团队有一个顾及个人利益打退堂鼓的,这事儿就办不成。
曾经有一位马老师说过,“有一种愚蠢的观点认为,在NASA不允许失败。但在这里(注:指SpaceX),失败是可以选择的。如果你没有把事情搞砸过,说明你的创新能力不够强。”
我对高级的错误见猎心喜,越扑朔迷离越开心,这说明我们又到了一个新境界。我只反对低级错误,尤其是反复犯低级错误。
每一个立志成为本行业第一优秀的技术团队的管理者,都可以试着去创造一种环境:允许聪明人失败。
你可以允许人们承担高质量的风险。
你用不着容忍那些草率的失败——所谓草率的失败,指的是因为心不在焉而反复犯同样的错误或反复失败。
你可以奖励那些“聪明人的失败”行为,惩罚“草率的失败”行为。
当你正在打造那些可能会失败但对未来很重要的东西时,必须要接受一些无法避免的错误。人们不应该为聪明的失败承担责任,而应该为没有从中学到经验承担责任。
那些不愿意公开谈论失败的团队,那些对“总结经验教训”敷衍潦草的团队,注定将一事无成。
一旦你偶然间加入了一个愿意明确承诺支持“聪明人的失败”,并愿意为此承担风险的团队,请珍惜它,因为真的不多见。更多的是前怕狼后怕虎,宁愿在螺蛳壳里做道场,用其他人的愿景限制自己前进道路的团队。
小结
最后总结一下,无人值守的情况下核心系统依然稳定(托了关二爷的福),关键在于,第一,以终为始,坚持第一性,第二,从上到下认真不糊弄,第三,敢上不怕事,允许失败,有问题改问题,不惩罚做事的人。
-EOF-
谢谢关二爷





