3.114. 做事,做名,绩效主义,以及架构战略
本文的目的是和人讨论一个架构策略的问题,但写出来呢,就变成对这个问题的一个注释:
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啦这些问题,你就这这些问题进行架构改进,这个库就“打过仗”了(面对了一波细节的洗礼)。这它会成为你打下一场仗的资本(其他那些还在吹牛多牛逼呢,一点问题没有出过的,谁敢用?)。你一直这样走下去,你就一直都背负骂名(用就会有人骂),但这根本不重要,这些已经用起来的产品敢换吗?你和它已经一体了,这就叫“德高”。当你德高的时候,骂不骂什么的,你在乎吗?
所以,我们做架构,不要太在乎“满足产品需求”,“产品很满意我们的性能”这样的“名”,因为在乎这个名,会让你选择性地选择“不让用户骂”,但那个恰恰是你损德的原因,你也许获得名了,但这个产品本身将死无葬身之地。
所以,我们发展一个软件平台,也不要老是想解决用户所有问题,而是看你投入的工作量,是否是完全无效的——只要你做好的东西“有效”,即使它再小——这个世界很少人会愿意随便重复投资的。你写了一个很小的库,没有设计什么限制,功能不多,很弱,但别人肯定不会因为它弱而不用它,只会因为它“不合适”而不用它,这种情况下,你没有任何理由去改变你的计划去满足那个“更高的目标”,你是要削掉那些影响别人使用的要素,去保证你成为对方系统的一部分。缺乏这种思维,轻易放弃自己真正的筹码,结果就是所谓的“进寸而退尺”,看着在前进,其实已经失去根本了。