.. Kenneth Lee 版权所有 2019-2020
:Authors: Kenneth Lee :Version: 1.0
做事,做名,绩效主义,以及架构战略
本文的目的是和人讨论一个架构策略的问题,但写出来呢,就变成对这个问题的一个注释 :
in nek:道具体是指什么?
所以呢,请读者有点耐心,我可能需要绕一个大圈来说明我的观点的。
前段时间有产品让我看看他们的开源做得怎么样。我看了他们的相关策略,手段和效果后 。我给出的结论是:你们这不是在做事,你们这是在做名。
为了说明做事和做名有什么不同,我举个例子:
比方说,你要你要在抖音上给人展示一个你无与伦比、超级好吃的水煮鱼。你可以选择这 样做:你原来该怎么做水煮鱼就怎么做水煮鱼,在你做的时候,找你尊夫人拿着手机在旁 边拍,拍完了,上传,搞定。
这是做“做水煮鱼”——这件事。
但你也可能不是这样做的,因为这是要给人看的,你可不想让人看到你廉价的锅,脏兮兮 的围裙,所以呢,为了这件事,你特别大扫除了一个星期,买了新的衣服,新的厨具,戴 上萌萌的兔子耳朵。一边做一边叨叨着:各位观众,看好了,我要起骨了,起骨了……看到 我的刀子没有,刚从德国买回来的双立人……
这是做“做水煮鱼”——这个名。
我说明白我的意思了吗?你要做开源,你把代码放出去就可以了,你也可以选择在内部开 源,把你的svn的库密码去掉,让自己人都可以访问,这就是开源了。你把SVN换成git,把 评审变成Gerrit,把原来的模块负责人叫做maintainer,这和开源一毛钱关系没有。
这是为了“呈现”,为了体现出你干了“开源”这件事,所以你就不是在花工夫在开源,你花 工夫“告诉别人你在开源”。名是道的其中一个表征(“事情”是我们看到的道的一个子集, 其实也是名,只是通常包含更多的名)。离开了道本身,名就仅仅是一个名。开源是代码 的其中一个属性,离开了代码本身,开源这个属性就仅仅是一个名。抖音水煮鱼对于好吃 的水煮鱼来说,是一个名,离开了好吃的水煮鱼,它什么都不是。所以,只有你的心思在 事情上,你才有可能推动这个事情,你心思在“名”上,就会有大批食名的乌鸦来收你的智 商税。所以,圣人无名。正因为无名,不见可欲,所以“智者不敢为也”。
否则,你可以做水煮鱼这个名,不会做水煮鱼的人也可以做,分分钟用的厨房比你更大, 厨具更好,介绍用的普通话比你更标准,配乐比你更震撼,在抖音上获得的点赞更多。这 件事请就彻底变成了“名”的盛宴。你水煮鱼做得好有个屁用,在做名这件事上,做水煮鱼 (这件事)根本就不是重点。
这也是大部分企业“绩效主义”的问题。要绩效就会要指标,给出指标就可以变成一个名, 把力量放在“名”上比放在“事情”上容易多了。最终做事就会变成做名。
做好一个产品是包括方方面面的,但做好一个“指标”就不一定了。你要销售额,我可以放 弃利润,你要利润,我可以收缩销售群给你利润率,你两者都要?哼哼,我还可以做假呢 。你发现我作假?——那你换人干,反正现实是这个事情谁干都是一样的。
编程一样的,你要代码量,我可以制造冗余,可以机器生成代码,你要测试覆盖率,我可 以制造大量完全没有效果只有覆盖作用的用例,你要编程规范,我可以写大量格式正确的 代码,但让这些代码不处理那个功能。你要加快速度,我可以放弃质量。你再压我,我还 可以推锅给其他同事……
所有管理,架构控制的难处,就在这个地方,你以为你是领导,可以为所欲为,你在乎“我 为所欲为”,“我已经尽力了”这个名,产品也不会变得更好。你可以要求下属加班,可以要 求他们用你要求的工具,可以要求他们满足你设定的所有的指标……你好像什么都行,但你 就是做不出一个好产品。这就是道和名的区别。
因为名只是道的一层皮,你扯着这层皮,道会跟着你走,但你用力去扯,只会把皮扯下来 ,道并不会跟着你走。
架构的所有问题,都是这个问题,未知是你工作的常态,因为如果你做完了所有事情,你 其实不需要架构,一个软件写完,所有代码都在代码仓库里了,还架构啥?你是在事情没 有发生的时候,决定做一些事情,然后让其他事情按你预期的方向来发展。架构师设置5个 原则,建立一套框架代码,引入了二个第三方工具,规定了3个编程规范。这些,统统是“ 指标系统”的一部分,都是“名”,但“名”不是“道”,不是所有的细节,当事情开始推进的时 候,细节会跳出来冲击你的“名”,你必须通过这种冲击的力度(基于暴露出来的新细节判 断),对你的“指标系统”进行调整,这个过程就叫“道法自然”。道(路)循着每个暴露的 细节进行综合演进在决定如何前进(因为道的很多细节不影响我们关心的那个逻辑,比如 我在做饭,屋外下雨这个逻辑不影响我在这个角度的道的发展,但停电这个细节就不一定 了),这些构成细节的所有的东西,就叫“自然”,自然而然,在你的欲望(当初定义的名 )之外。
架构设计定义的名是重要的,但名在发展过程中和现实的互相冲击这件事情本身是更重要 的的。你开始只是做一个申请,释放内存的开发库,很容易。开始拿去使用,竞争中就会 发生碎片问题,你用best fit的算法解决碎片问题。接着就有numa的时延问题,靠numa节 点的概念解决掉时延问题。接着是SMP互斥的问题,你靠hash解决了SMP互斥问题,又会有 hash间的内存不能共用的问题,你解决的hash间内存迁移的问题,又会有死锁的问题……
你说你很有经验,这些问题都提前考虑到了,但你的库最近只在单核的市场上大卖,你提 前解决的这些问题统统是“过度设计”!
看见没有?道真的不是你可以控制的。架构师控制不了他的代码,代码长什么模样,是市 场,团队,形势和你们的选择……共同决定的,写小说你可以控制结局,做事情……它有“淘汰 ”这个利剑悬在你的头顶的。
所以,其实我们考虑架构,看着想的是未来,其实我们只是不断在决定一些小的短期计划 ,推着团队往前走。而我们看别人的架构,我们也从不看他们说他们要干什么的,因为这 个东西不由他们决定的。我们看的是他们的“德”。所谓“德”,是这个系统被“需要”的程度 。比如说DPDK吧,DPDK的名是什么呢?根据最初我看他们的材料,他们提出的核心优势是 用polling取代了中断驱动的一般网卡驱动。这是个名,号称而已。
但运作起来,它的“德”是什么呢?是什么让别人选择它,而不是其他的协议栈呢?我看根 本就不是因为PMD,而是这个平台删掉了多余的协议。你想想,你要做一个转发引擎。写在 Linux中,各种限制,不能破坏这个框架,要保证这里可以复位,那里可以统计,一堆的框 架回调,难以理解的各种flags,累死你。这些限制统统对你进行锁的实施,同步算法的应 用产生影响。走这条“道”明显充满荆棘。选在DPDK呢?尼玛给你的就是网卡上来的包,这 个限制对Linux协议栈的限制是一样的。换句话说,你和Linux协议栈的起跑线相同,但 Linux协议栈身上挂着ethtool,protocol 这一堆装备,你一个用不上,你傻才走Linux那 条路线呢。
Linux的优势就是它的劣势,这种事实,是所有弯道超车的基本原因。
所以DPDK最初提出的名,和它最终获得的“德”,根本就是两回事。但雪球滚起来了,它可 以走到的高度就是不一样的。
所以,我们运作一个软件构架的时候,最初的时候肯定会设计方向,但这个方向其实不那 么重要,更重要的是这个过程中你是不是一次次可以用你的优势,捕获一组应用场合,你 嵌入到这个场合中,你的德就高一点,等你高到一定的程度,就不是你推着系统走了,而 是系统逼着你走,那个时候,架构师的工作就会变成彻底的“道法自然”,这就是“无私”的 境界了,因为在那个场合,无私就是私的唯一方法了。就好比一个大公司的决策,每个动 作都是影响一堆人的前途,家庭,市场竞争态势,那里的决策,要保证公司不倒,哪里还 有个人情绪的余地?但又正因为公司这么大了,老板就有机会在公司决策之外“为所欲为” 。比如可以,买两辆车,一辆用来开,一辆用来砸,这就成了私本身了。
而很多人可能对“优势”的理解有误。这又涉及我老说的“守弱”这个观点了,你以为的强, 其实是个名,“弱”才是你的强。因为那个是“道”,是事情。你写一个内存管理,好吧,很 简单,first fit,什么碎片,Endian,多核,多线程,统统没有考虑。你的强是什么?不 是“你很牛,以后很快就会做出多线程支持来”,而是,“你已经可以分配内存了”,这是你 所有宣传中最短的“名”,但他是事实,是你可以用的,而不是可以用来说的。它说出来不 强,但如果它真得没有用,你为什么要写?肯定是有某个理由的,也许是它小?它快?它 bug少?它的版权符合要求?反正你能做它,必然在做这件事情上,它是有优势的,那个优 势,才是你可以凭借的筹码,你要用这个筹码来压动雪球滚动。比如我做它就是因为某个 产品要在非多线程环境里面需要一个没有GPL义务的库,好,这个产品用了。用的过程中碰 到要调试啦,要realloc啦这些问题,你就这这些问题进行架构改进,这个库就“打过仗”了 (面对了一波细节的洗礼)。这它会成为你打下一场仗的资本(其他那些还在吹牛多牛逼 呢,一点问题没有出过的,谁敢用?)。你一直这样走下去,你就一直都背负骂名(用就 会有人骂),但这根本不重要,这些已经用起来的产品敢换吗?你和它已经一体了,这就 叫“德高”。当你德高的时候,骂不骂什么的,你在乎吗?
所以,我们做架构,不要太在乎“满足产品需求”,“产品很满意我们的性能”这样的“名”, 因为在乎这个名,会让你选择性地选择“不让用户骂”,但那个恰恰是你损德的原因,你也 许获得名了,但这个产品本身将死无葬身之地。
所以,我们发展一个软件平台,也不要老是想解决用户所有问题,而是看你投入的工作量 ,是否是完全无效的——只要你做好的东西“有效”,即使它再小——这个世界很少人会愿意随 便重复投资的。你写了一个很小的库,没有设计什么限制,功能不多,很弱,但别人肯定 不会因为它弱而不用它,只会因为它“不合适”而不用它,这种情况下,你没有任何理由去 改变你的计划去满足那个“更高的目标”,你是要削掉那些影响别人使用的要素,去保证你 成为对方系统的一部分。缺乏这种思维,轻易放弃自己真正的筹码,结果就是所谓的“进寸 而退尺”,看着在前进,其实已经失去根本了。