程序员对「压缩」这个词应该很亲切:一个 zip 文件,把几百兆的东西压成几兆,要用的时候再展开。这本书要请你换一个角度看名字——一个好名字,就是一段经验的压缩包。
名字是经验的指针
说「命令模式」这四个字的时候,你的声带只振动了不到一秒。但听到的人脑子里展开的是什么?一整套结构:把「请求」封装成对象,于是可以排队、可以撤销、可以记录日志,以及十几种具体的写法,外加「什么时候别用它」的教训。
四个音节,换来一大坨东西。这笔账怎么算都划算——而之所以能这么划算,是因为「命令模式」这四个字在程序员社群里,像一个指针一样,指向一份大家共享的经验。说话的人不用搬运,听的人自己展开。
人话版:名字不是标签,是超链接。点一下就下载一整包经验。
为什么非得压缩不可:脑子的带宽就这么多
这套「指针」机制不是修辞,它有硬的理由:人的工作记忆小得可怜。心理学里反复验证过,你同一时间能摆弄的东西,大约只有四个组块(chunk,工作记忆里一个可独立操控的信息单元)左右——四个,不是四十个。
这意味着什么?意味着你没法直接思考「我们团队所有的质量问题」。那是几百个具体事件,脑子装不下。你只能思考四个组块。问题的唯一出路是:把几百个事件压缩成少数几个组块——「主要是交接丢东西」「主要是需求没说清」。压完之后,四个组块正好装下,你的思考终于可以运转了。
所以第一章那个方法之所以有效,一半靠排序,另一半恰恰靠的是归类——而归类就是压缩,给每个堆起一个临时的名字。压缩不是命名的副产品,压缩就是命名的本职工作。
压缩的代价:有损
凡是压缩都有损。zip 解压出来的文件和原文件一模一样,因为那是无损压缩;而名字对经验的压缩是有损的——「命令模式」三个字展开不出每一行代码,它只留下骨架,扔掉了血肉。
有损不是缺陷,是设计。扔掉血肉,正是为了腾出带宽去摆弄骨架。但也正因为有损,名字天生带着风险:你手里的压缩包和别人的原文件可能对不上。一个人说「这是敏捷」,他想的可能是「两周迭代」,另一个人想的可能是「别写文档」——同一段压缩码,解压出两套完全不同的东西,后面所有的争吵都由此而来。
这就埋下了一个伏笔:名字既能搬运经验,也能偷换经验。它是全书最有力的工具,也是最常见的陷阱。第七章我们会专门审问它。
好压缩的两个指标
既然名字是压缩,好坏就有标准。软件工程师判断一个压缩算法看两条,挪到命名上惊人地合身:
- 压缩率:一小段符号能展开出多少经验。「沉没成本」四个字能展开出「已经花掉收不回的钱不该影响后续决策」一整条行为准则,压缩率极高。「沉没成本谬误」更是连「这是错的」都编进了码里。
- 解压保真度:不同的人解压出的东西一不一致。「内卷」这个词保真度就差得惊人——有人说它是过度竞争,有人说它是没有产出的竞争,有人干脆拿它当「累了」的同义词。保真度低的名字,搬运经验时必然走样。
顺便说一句,这两个指标之间存在张力:压缩率越狠,保真度越容易掉。「内卷」原本是个精确的学术术语——没有发展的增长,被压进日常语言后就糊了。命名的手艺,很大程度上就是在两者之间找那个甜点。
现在工具备齐了。我们知道了名字是有损压缩、是共享经验的指针,知道了它的带宽理由和好坏指标。可以回到那个悬而未决的问题了:那个「归类排序、逐个击破」的方法,它到底叫什么?