3.324. 一个例子:为什么我们的信息组织不成设计

这两天有一位同事在给项目其他人讲某个广告推广业务的特征。我们来听他讲这个,主要是要看看我们能卖点什么硬件(主要是服务器)到这个业务上,分析一下我们对于这个业务有什么长板和短板。

于是他分了很多层,从客户端,到推荐前端,然后召回,特征识别,检索,粗排,精排什么的,画了一张颇为复杂的图。但很多听众还是听不懂他说什么。他找我问他这个描述有什么可改进的。

我具体看了以后,说你这个问题关键在于没有目的,只是在科普。什么叫“科普”呢?科普主要是为了“解释”,解释通问题就没有了,基本上不是为了进一步解决什么问题的。

比如我们给小朋友“科普”为什么会下雨,我们会讲水的三种形态,讲水蒸气怎么上升,上方怎么遇冷,从气态又变成液态掉下来……听完这些,你就只能记住它,你不需要拿这个知识去实现什么人工降雨,天气预测什么的。这种都是“学习”阶段才干的事情,是人建立基础世界观的时候才用的方法。

但工程上我们没有时间做这种基础学习,或者说基础学习也不是看几页ppt就能学会的。我们现在是尽快找到我们之间的共识,突出问题的主要矛盾和矛盾的主要方面。所以,我们关心的是“它到底用了多少服务器,这些服务器压力在CPU上,内存上,还是IO上……”这些才决定我们能不能卖服务器进这个市场,或者在这个市场上,我们和竞争对手各有什么优势和劣势。所以你来讲泛泛的先前端,分发,粗排,精排……这些没有意义,因为这些甚至不见得是固定的,一个客户是这样部署,难说其他客户是不是一样部署,也难说随着软件优化更新,很快可以跳过其中一些步骤,决定他们这样部署的核心限制才是我们关心的问题。如果我们无法短时间找到这种核心限制,那至少我们我们关心一些接近的要素。比如:

  • 在典型配置中,前端有多少台服务器?是否需要从一个入口进入再用反向代理分发?还是可以从多个端口进入?

  • 为什么要召回(recall,这个名字其实非常误导,它不是召回商品的意思,而是“简单回忆起可以推荐给这个客户的主要商品”的意思。是一种从大量推荐对象中第一次快速找到相关的大量候选者的过程。)?从哪里召回?被召回的数据以什么形式保存在服务中?所以,这里对业务造成什么压力?是CPU Bound,MEM Bound还是IO Bound?

  • 召回挑出的商品以什么方式表达?进入粗排系统的输入,输出和算法是什么?

  • ……

你看,无论你细谈这些要素的细节,还是总结它们的特征,这些都是听众关心的。听众也许不是做这个领域的,但工程上,每个听众都有自己擅长的一面,要不是互联的专家,要不是OS的专家,要不是服务器调优的专家……他们会从这些总结或者业务场景上推演到他们自己的业务限制。(比如“哦,它这里要实现1000台设备的ZeroMQ命令控制,我这里只有RDMA肯定是搞不定的,还要给他一个控制链路才行”)。你给人家说什么前端发Restful消息给召回模块这种大路货,别人能出什么判断?这种表述可以以任何形式理解,可以是控制面发Restful,背后带着共享内存的数据通道,也可以在需要的时候合并到一个进程,然后这个接口根本不需要。这种泛泛的,让学生记住用来考试的东西,和工程是没有关系的。

所以,我给这位同事一个我做类似业务的调研分析报告作为参考。我的分析是这样组织的:

  • 硬件模型:我这个业务是一个大型的硬件超节点,多台主机用总线连在一起去响应业务,业务被分到16个端口上,背后是不同的独立OS管理的一组资源去响应,不同OS之间没有数据共享。

  • 软件模型:每个独立的OS上有一组业务进程,我用一组圈圈表示这组进程,给出进程间的接口和它们各自占用的CPU和GPU。我通过这样的表达说明压力和瓶颈在什么地方。

这位同事看了这个参考,觉得很有参考价值,回去改了一个版本给我看。我一看,他对着我那个软件模型,画了一幅形式几乎一样的图出来。但这幅图和他之前表达的那幅”科普“式的图包含的信息几乎完全是一样的。甚至这些“圈圈”他也不是代表进程,而是某种“抽象”的概念,可能是进程,可能是一组进程,也可能是一组服务器。

这个同事肯定是真心要参考我的意见来写这个新的版本的,肯定也是用了心的,但这个这个努力基本上是没听懂我的意见。这让我突然有点理解为什么我们很多人的设计文档总是抓不住主要矛盾了。因为我们不觉得“设计”是一种调研分析工作,而是一种“写作”工作。我说的“设计”,是在设计文档中列出我们的目的,然后基于这个目的分解逻辑链,决定达成这个目的需要什么要素,然后我们根据我们需要的要素去进行调研,分析,验证,然后把这个调研,分析,验证的结果放到这个设计文档中。甚至如果某个要素我们一时拿不到结果,我们会在设计文档中标记出:“这一点未定,我们假设它可行(或者我们避开基于它进行决策,或者我们要完整这个调研才能进行下一步决策)”。这才是设计。

但如果把设计文档看作是一种“写作”,这就是另一个故事了:我们不在乎那个目的,我们只是把“我们知道的信息写出来”,写什么不在于“你要什么”,而是“我有什么”。那这样的文档你写多少次,改多少种形式,写来写去都是那些信息,换个形式并没有意义啊。

我觉得这一点非常重要,所以有必要在这里强调出来。