仓库源文

.. Kenneth Lee 版权所有 2020

:Authors: Kenneth Lee :Version: 1.0

怎样写标准提案


引言

本文是为一个内部培训写的准备材料,因为以后这个培训迟早要对外的,我写在这里。本 文介绍怎么给标准写提案。

我会用一个和技术无关的例子作为类比。这是我在公开的地方写东西惯例。最早的时候是 为了保密,避免技术泄露。但渐渐我发现,这不但可以防技术泄露,还有更大的好处,它 可以让我们更聚焦Pattern(模式),而不是问题本身。

昨天晚上有一个读者私信和我讨论王守仁的“破山中贼易,破心中贼难”是什么意思,说我 也经常谈到这个贼,问我背后有什么深意。我就很好奇,我怎么就喜欢谈“贼”了?然后他 给我发了这幅图:

    .. figure:: _static/偷.jpg

我实在没有想过还可以从这个角度来发现我在“偷”方面这么有心得的。这是一个例子:你 要找Pattern,你怎么都能找到Pattern,要想突出你自己的主题,不是容易的事情,越是 用大家都熟悉的例子举例子,大家就越是看不到你想突出的Pattern,因为他们看见自己熟 悉的东西,总会忍不住想强化自己的熟悉的知识,这样反而离开你本来想强调的东西。比 如你用数据库举例说明接口定义的重要性,熟悉数据库的人会不断纠结于这个SQL语句 where中使用两个index查找性能不高,这反而影响了表达。

所以,我们还是用一个非技术的例子来说明我们的问题,但在关键的地方补上一两个技术 问题作为提示,这样的效果反而更好。

本文用一个连锁加盟奶茶店的认证标准来说明写标准提案的方法,笔者对如何运作奶茶店 没有任何认识,我们大家就用一般吃瓜群众的思维,来一起考量这个问题下,怎么看到标 准提案写作的问题。

什么是标准和提案

标准是一套有目的的,明确的要求。比如我们对所有要加盟同一个品牌的奶茶店进行认证 ,我们就会对它的店面形象,财务方式,原材料获取等等方面,提出要求。这就构成一个 标准。我们通常用一个标准委员会去控制这个标准,允许什么规则可以加进来,不允许什 么规则加进来。

一般标准委员会都是基于技术的,所以通常就叫Technical Steering Committee,简称TSC 。

提案是对标准做出增减的申请文本,用于TSC去决策是否接纳这个修改。在提案通过后,提 出者还需要给出明确的修改内容。这个具体的修改,称为一个Patch。提案是Patch的前提 。

理论上,我们可以认为标准的定义一开始是空的,第一个修改的人提出了第一个提案,然 后提供第一个Patch。但通常TSC是有人写了初稿以后才组建的,所以这里并非那么绝对的 。但大部分提案是基于一个已经存在的标准的,这是一个现实。

标准体现出来是一组原则,但背后是有目的的。比如我们在标准中定义一个要求,全部认 证的奶菜店都需要用绿色的的店面配色,背后可能就有“形成统一的视觉冲击,从而带来群 体效应”这个目的。在标准中不一定会写这个理由,在标准中可能是这样一个定义:

“店面装修必须符合如下配色定义:……”

它不会说明:“这是为了形成统一的视觉冲击”。这一点不写在标准中,但提案中必须呈现 这个目标。(部分标准会包含一些commentary的段落,用于增强读者对定义的理解,这是 一个好的实践,我们也鼓励,但commentary不是标准定义的主体)

目标和防线

这样我们就谈到提案最基本的写法了。很多人发提案前,第一件事找我要Template(模板 )。Template我有,但我一般不会随便提供Template,因为我担心要Template背后的用心— —你必须非常清楚,Template不是我们的重心,我们关注的是你的目标,和你为实现目标采 取的方法。如果你保证不了这一点,即使你填满了Template要求你写的每个章节,这个提 案都是不及格的。

所以,要写提案,别的先不管,请首先把目标大大地,清楚地,明确地写在整个提案的最 前面。TSC没有时间给你猜谜语,TSC成员都很忙,评审你的提案是因为这能增强这个标准 ,能让所有的参与者收益,所以我们首先需要判断的是,你给出的目标是否符合我们的期 望,如果这个目标我们不关心,从一开始这个提案就会被打回,我们互相不要浪费对方的 时间。

目标确定以后,后面的所有东西都是证明这个目标。这涉及到我们的第二个要求:请首先 保证你的每步证明都是“没有破绽”的,然后才开始进入细节。

所以,不要用写标准的写法来写提案,比如你的目标是解决加盟店互相竞争导致员工都不 能放假问题,不要上来就说:“所有加盟店都要星期二放假,如果当周有法定假日,分两种 情况,如果法定假日在星期二,则如此如此,如果法定假日不是星期二,则这般这般……”, 我们看提案,看到这里逻辑链就已经断开了,根本就没有兴趣去看你的细节。

正确的写法是:为了让加盟店员工都能得到有效放假,我们采取如下策略:

  1. 统一开门和关门时间

  2. 统一放假时间,避免互相竞争

这是你的第一层逻辑,我们从这一层开始就开始挑你的破绽了。比如说,有人会挑这个刺 :如果这样做,我们统一放假的时候,竞争对手正好就在这个阶段填补我们的市场空白怎 么办?

那这个策略就没有这么简单了,它需要变成这样:

  1. 店面分成A、B、C、D四个时间段类别,覆盖不同客户群的要求

  2. 根据地域分配A、B、C、D加盟店的类别,不同类别的加盟费用不同,同一个店面不得属 于两个类别

  3. 不同类别加盟店必须严格按规定所定义的时间段类别营业,否则将按详细定义的罚则进 行处罚

这个定义也有可能有破绽的,而且不一定是暴露在这一层,可能在定义时间段的时候,细 节上触犯国家劳动法等等,所以,这是一个经验和权衡的工作,TSC根据自己的专业经验, 判断这一层的定义是否还有破绽,才会进入下一层。所以TSC才需要由来自不同背景和利益 体的人组成,这最后都是为了保证最后落实为细节的时候,这些原则仍可以成立。

所以,每层的逻辑定义,本质上是围绕目标建立一个防线,防住所有包括TSC成员在内的所 有标准成员的攻击,直到没有破绽了,这个提案才会被接纳。

所以提案可以分次提交,第一次提交的提案可以只包含一层逻辑防线,等你防住了第一波 攻击了,可以再补充第二层的逻辑防线。直到满足要求。当然,如果你对整个设计有信心 ,一次完成所有定义再拿出来讨论,这也没有问题。

简单总结:请保证明确定义你的目标和分层定义你的逻辑链,保证每层包含定义全集,不 要在某层定义没有覆盖全部可能性的时候,就开始进入细节讨论,因为在高层逻辑还有破 绽的时候,底层逻辑定义可能全部都是浪费的。

概念空间

这个小结我们讨论撰写的具体细节,第一个要求,请确定你使用的概念空间,减少使用你 自己专业领域的专用概念。标准本身也是一个逻辑链,只是不一定给理由。所以标准会定 义自己的概念空间。比如奶茶店这个问题,什么是店面UI,什么是配方,什么是一级加盟 店,什么是二级加盟店,什么是午餐类食物,什么是零食类食物,这都有定义。这些定义 在不同的上下文中,会形成非常细致的要求(比如“下午三点后不得在二级加盟店销售午餐 类食物”),它们的引入,都是为了解决之前提案中各个目标的问题。

所以,你要加新的提案,要尽量使用已经存在的概念,如果这些概念不够你用,你要加入 新的概念,就必须详细定义这个概念的意思。我们这里不是要求无限度去为定义而定义。 但如果你用到的概念涉及到和别人的定义相关的部分,你轻易不要引入你的概念,因为这 些概念已经和每个具体的要求密切相关了。比如你平常在店面经常把食物分成堂食和 Takeaway,这个甚至我们都知道,但如果你定义“堂食的零食不打折”,你这个怎么叫堂食 就不能随便用,因为我完全可以打包以后坐下来吃,这都不容易说清楚。但说不清楚就很 难确定这个设计到底是否可以接纳了。所以,事实中可以用的概念,不见得在“标准”中可 以用。我们不是要求你像老学究那样无限细化去定义所谓“严格”的定义,但你至少要知道 ,现有的定义已经被很多细节所控制了,它无法允许你随意去发明新的定义,特别是不允 许你的定义和已有的定义有半重叠,半区别的含义。

在有了概念以后,请注意描述一套原则或者设计的时候,不要切换主语。这是我经常看到 有人犯的错误,他们喜欢说“原料配送车从总部出发,先遍历所有一级加盟店,一级加盟店 接收原料后,交给后厨,后厨先加水放冰箱中存储……”,这个设计的主语一直在切换:配送 车,一级加盟店,后厨……

这样的写法就会出现前一个小节我们提到的“破绽”问题,因为这样的表述方法下,要求每 个对象都是“乖孩子”,随时都准备好了支持你这个规则定义。问题是,每个实体都有其他 的规则在左右的,比如加盟店还要遵循放假原则,还是需要遵循清洁规定,不是等在那里 等你来送货的。

在真正的技术方案中,每个处理器,每个总线控制器,每个中间件,每个Socket,甚至每 个变量都是有自己的设计原则的,你的方案行不行,关键在于这些实体每个的状态机是否 仍可以维持自恰,不是单独你这个流程行还是不行。

我们可以看你某个流程,但在挑破绽的时候,我们是看每个实体的独立状态机是否仍能保 持原来的切换的。你不对每个实体单独建模,这个工作其实就是抛给读者了。这个提案相 当于没有完成,这种提案是无法被接纳的,除非你的提案带来巨大的利益,值得TSC给你投 入时间,帮你完成这个建模。

使用继承和泛化

每个提案,都是一个设计,每个设计,就会破坏一组已经存在的原则。一个相对成熟的方 案,里面包含大量的细节,修改这里面的原则其实是非常困难的。

所以轻易不要发明全新的概念和原则,而复制已有的概念去做变更。比如说,我们给出了 一级加盟店和二级加盟店的概念,这背后有利益平衡的问题(多给钱多收益,少给钱也能 收益),也有法务的定义在里面(多少保证金才不会被认为非法集资),也有财务的定义 在里面(如何操作资金才会最少)。所以,如果你想改变利益平衡,你尽量不要再定义新 的概念,比如“金牌客户联盟”,然后定义一组新的原则给它,这样你原来定义好的财务和 法务策略就全都没法实施了,这个成本非常高。这种定义对架构是毁灭性的,这样的提案 很难被接受。

所以,更应该考虑的是增加一种“0级加盟店”,这是一种特殊的“一级加盟店”,这样,就比 较容易加入到原来的概念空间,而不会产生巨大的冲击。

用好继承和泛化来在名称空间中增加细节和独立逻辑,这是能正常增加新概念到标准中的 基本方法。

撰写Patch

撰写Patch其实就是写标准本身。我们首先要求写作者先下载最新的的标准版本,因为在你 发出提案的时候,其他人也在准备提案和修改标准。所以,保持你在提案的邮件列表中, 我们不要求你阅读所有的提案,但请知道谁和你同时在修改相关的部分,请提前和他沟通 ,保证你们的修改是不会冲突的。

同时,请仔细阅读一次当前的标准描述,保证你知道标准作者所处的立场。你写提案的时 候,你是站在你自己(和你的利益相关方)的角度来写你的观点的,但当你开始写标准, 你是站在整个领域的领导者的角度来写这个标准的,保证你的修改仍保持这个角度,保证 这仍是一个人的文档,而不是一个“七嘴八舌”的大杂烩。

写在最后的话

最后,欢迎大家都提交提案。但也请大家主意,提案的折损率是非常高的。每个提案提出 来,需要面面俱到分析很多很多的场景和细节,到最后写到标准中,很可能仅仅是寥寥几 句话。而且也许你的提案做了很多设计,但最后有一个细节过不去,这个提案就会被否决 。

但您的工作不会白费,一个成功的标准,就是大量这种“失败”的推演去支撑的,您的工作 是支持这个标准成功的一份力量。我们备份每个提案和相关的讨论(所以我们要求所有正 规的讨论都必须在邮件列表中),TSC非常不愿意否决一个付出巨大工作量的推演和分析, 但TSC为架构成功负责,不敢收入会动摇整个定义逻辑空间的或者限制未来发展的提案,这 需要每个提案的作者理解和支持。

Welcome to join the party!