前几章我们一直在跟「点单之后」较劲:怎么排队、哪口锅是瓶颈、过载了怎么限流。这一章我们把镜头往前挪,挪到客人还没进门、票还没打出来的那段安静时间。因为龙餐馆真正的秘密,藏在这段没人看的时间里。
先甩一句反直觉的话,本章其余部分都在解释它:一家出菜又快又好的店,在你点单之前,八成的活已经干完了。你以为的「现炒」,其实只是整道菜的最后一步——临门一脚的快炒。剩下九成——切、腌、汆、吊汤、调汁——早就趁没客人的时候悄悄做好了,堆在手边等着。
备料,本质上是一次缓存
第三章我们把备料当成流水线最靠前的一段工序讲过。这一章换个角度:备料其实是缓存——把慢的、重复的操作提前做好存着,下次要用直接取,不用现算。
翻译成人话:糖醋汁你要现兑得一分钟,可你开市前一次调一大盆放着,单子来了直接舀一勺——那一分钟你「预付」了,客人一秒都不用等。备料就是把结果提前算好存起来,用的时候白捡。
写程序的人天天跟这打交道:一个查询很慢,就把结果算一次存进内存,下次同样的查询直接从内存取,不再碰数据库。网页加载慢,就把渲染好的页面提前生成、扔到离用户最近的机器上(CDN、预渲染)。这些和后厨那盆提前调好的汁,是同一件事:拿「提前做」换「当场快」。
关键路径:省在点单之后的每一秒才金贵
为什么非得提前做?因为不是所有时间都一样值钱。
关键路径——从客人点单,到菜摆上桌,这一整段计时。客人心里那根「等太久了」的弦,只绷在这段路上;开市前你切了多久的葱,客人一无所知,也一点不在乎。
翻译成人话:客人只给「点单到上桌」这段掐表。这段之外你干多久的活,都算「免费时间」——因为没人在等。备料的全部聪明之处,就是把耗时的工序从这段掐表的路上,挪到没人掐表的时段去。
把耗时的活提前干掉,工程上叫预计算(提前把结果算好存着)或者预热(趁没请求的时候先把该准备的准备好)。腌一夜的肉、吊了三小时的高汤,都是预计算的成果。它们在关键路径上花掉的时间:零。客人点单那一刻,这些慢活的账早就结清了。
所以「现炒二十秒起锅」不是厨子手快,是这道菜身上只剩二十秒的活没提前做。快的从来不是那口锅,是那盆早就备好的料。
锅气:那一小块没法缓存的东西
那为什么不干脆全提前做完,连炒都省了?因为有些东西提前做就废了。
现炒才有的镬气、青菜下锅那一下的脆、鱼片汆熟那一秒的嫩——这些东西的价值就在「刚做好」这三个字里,隔十分钟就塌了。它们没法缓存,只能等你点了,现做。
缓存未命中——你要的东西缓存里没有(或者存了也不能用),只好老老实实走一遍完整的慢流程,现算一次。锅气就是龙餐馆里天然的缓存未命中:这一步绕不过去,非得占用关键路径不可。
翻译成人话:备料能命中的地方全命中了,唯独「起锅那一下」谁也替不了你,客人点了才能开火。好厨房的本事,是让绝大多数工序都命中缓存,把这块非现做不可的「未命中」压到最小——小到只剩二十秒。
一句话收住:备料策略的目标,不是消灭现做,而是让现做只剩那一口没法替代的锅气。
备多少:缓存是要押注需求的
缓存不是无脑存越多越好,你得猜「接下来会用到什么」。备料一模一样:开市前你得赌今天各道菜大概卖多少,才知道每样备几份。
命中率——你备的料里,正好被点中、真用上了的比例。今天备的三十份鱼片卖光了、还差点不够,命中率高;备了三十份只卖出五份,命中率就惨。
翻译成人话:备料备得准不准,就是「你猜今天卖什么」猜得准不准。猜对了,客人点啥手边都有,出餐飞快;猜错了,要么该有的没有(现做,慢),要么备一堆没人点(占地方,浪费)。
命中率高,出餐就快、损耗就小。而命中率靠的是预测——看天气、看星期几、看上周同一天的账、看隔壁写字楼今天是不是发工资。好的备料师傅,脑子里跑的其实是一个需求预测模型。
缓存不是免费的:占地方,还会过期
缓存有两笔隐性成本,备料一分不少地都要付。
第一,它占地方。备好的料要冰箱、要台面、要盒子。存得越多,占用越多,这本身就是资源。
第二,也是更狠的一笔——它会失效。缓存失效指的是存着的东西过期了、不能用了,占着位置却成了废物。备多了卖不掉、食材放过夜坏掉扔进垃圾桶,就是活生生的缓存失效:你为一份从没被点中的菜,付了原料、付了工、付了冷藏,最后一分钱没收回来。
翻译成人话:备料的代价,就是损耗。缓存从来不是白拿的——你用「提前做 + 承担一点扔掉的风险」,换关键路径上的那点速度。
至于「备多了到底亏多少、这笔损耗压在哪道菜头上、这家店到底还赚不赚」——那是要摊开算的账,我们留到第九章。这里你只要钉死一句:缓存不是免费的,备料的代价就叫损耗。
新鲜度 vs 速度:哪些能缓存,哪些绝不能
缓存还有一个躲不掉的毛病:存得越久,越不是原来那个东西了。
陈旧——缓存里的数据放久了,和真实情况对不上了、过时了。隔夜的料、蔫掉的绿叶菜、回锅第二次的汤,都是「陈旧」在餐桌上的样子。你越是把一样东西提前做、做得越彻底,它就越快、也越陈旧——预制到底的料一分钟上桌,代价是它离「刚做好」越来越远。
于是每样食材都得回答一个问题:你更能忍它慢,还是更能忍它旧?
- 放心缓存的:高汤、酱汁、腌料、炸好的花生米——它们本来就靠时间入味,提前做甚至更好,陈旧的代价极低。
- 绝不能缓存的:生鱼片、现切的牛肉、下锅即熟的时蔬——它们的全部价值就是新鲜,一旦提前做,快是快了,菜也毁了。这些只能留在关键路径上现做。
翻译成人话:能提前做的尽量提前做(省时间又不掉价),不能提前做的死守着现做(宁可慢也不能塌)。一张菜单该缓存什么、绝不缓存什么,就是这家店品质和速度之间那条看不见的线。
把这一章拧成一句话
备料这件事,从头到尾都是同一个动作:时间是压不掉的成本,那就用「提前做,外加承担一点损耗」,把它挪出客人掐表的那条关键路径。这和内存缓存、CDN、预渲染、预计算是一模一样的思路——它们全都在拿存储和一点过期风险,去换关键时刻的那点速度。
可你有没有发现,这一章我们绕来绕去,全在两件事之间摇摆:备多了会烂在冰箱里,备少了客人得干等。备多备少是一道题,往前翻,菜单开长开短、瓶颈松还是紧,其实也都是同一道题。它们最后都会收敛到一个字上——钱。多备一份的成本、少备一份丢掉的生意,都能换算成数字。那么下一章,我们就摊开账本,认真算一算:这家龙餐馆,到底赚不赚钱?