双重读取、调度算法和洋葱圈

2020-11-14 09:01:47

大多数人认为我做这件事是疯了,但我在空档年的最后几个月里在一家家族快餐店做快餐厨师。(有关这方面的更多信息,请点击此处。)。我的职业是程序员,所以我喜欢从程序员的角度来思考餐厅的系统。下面是关于两个这样的系统的一些想法。

乍一看,人类系统可能看起来是坏的,但由于微妙的人为因素,它们实际上可能工作得很好。

我最好的例子是接受和履行订单的系统。我们从来没有写下任何东西,而且会多次重新要求订单,包括给客户打电话的时候。(在计算机安全中,这被称为双重读取。)。不是很好的服务,理论上可以让客户撒谎,支付更少的钱。

实际上,大多数顾客并不太介意,说谎的人很少,我们可以轻松地察觉到订单似乎有什么不对劲的地方。

写下订单并严格要求一次似乎是最好的,但也有微妙的缺陷。首先,柜台后面没有足够的空间让每个人都走到书面点餐的地方,因此需要更多的内部沟通。当你在订单详细信息上受阻,同事忙得没有时间提问时,这种方法会在紧急情况下失败。顾客总是无所事事;同事则不是。

如果订货单在订单完成后没有扔掉,而且如果你戴着油腻的手套,不想碰钢笔,不想碰食物,那么在后勤上(从字面上看)也很混乱,这可能会增加混乱。最后,我的许多同事年纪较大,非常习惯现有的制度。向新系统的重大过渡将产生比其价值更多的混乱。

虽然我的职责范围很广,包括收银机、奶昔售货机和烤架,但我花在油炸机上的时间最多。我很高兴能从程序员的角度来介绍这种对油炸厨师生活的过度分析。

这张照片有两个油锅,每个油锅都有两个篮子,可以浸入水中,放在下面的热油桶里。在工作中,任何一天只有一个油炸机处于活动状态,这实际上可以让两个项目同时被油炸。

油炸厨师和操作系统有很多共同之处,因为他们都负责日程安排。操作系统将线程安排在有限数量的内核上运行;油炸厨师将食物安排在有限数量的油炸机中进行油炸。不同的食物有不同的优先顺序,烹饪的时间长短也不同。

炸薯条、卷曲薯条和洋葱圈(统称为“薯条”)是油炸机上的主菜。每一份薯条都可以是大的或小的(除了只是大的圈子)和外卖或带走。油炸厨师的工作是:

把它们放到顾客柜台上的托盘上,或者放在他们的行李袋里。

我们的目标是以最快的速度和最高的准确度完成这项工作,而不会丢掉订单。理想情况下,最大限度地减少向客户和同事询问订单详细信息的次数。此外,还有几个需要处理的复杂性来源:

不完全信息:根据迎宾的不同,他们可能会忘记说明是外卖还是外带。你可以随时问顾客,但烧烤大厨过一会儿可能会问同样的问题。您或许可以避免客户询问您是否可以窃听该交互。

时间要求:你需要在烧烤厨师吃完汉堡/热狗之前完成订单,但你不能太早完成。如果你在汉堡还没做好之前就把薯条放在柜台上,它们就会凉了。对于外卖订单来说,这就不那么重要了,你可以立即把它们装进袋子里。

规模:在高峰期间,你每分钟可能会收到很多订单,但每分钟只能处理1-2个订单。一旦迎宾传达了口令,他们就会忘记,所以要记住的就是你了。记住:不要把东西写下来。

避免浪费:有时你或其他厨师会做太多薯条。为了避免浪费,你可以将多余的部分用于未来的订单,方法是稍后用溅起的水花刷新它们,并将它们添加到新的批次中。

改变顺序:顾客有时会在你开始烹饪后改变他们的顺序(例如,从普通油炸到卷曲油炸)。现在你必须弄清楚如何处理目前在油炸锅里的未煮熟的部分。

杂物:除了薯条,还有其他需要放在油炸锅里的食物,包括鸡肉饼、培根、蛤肉条和鱼片。

把订单放在一起批处理。如果有大份和小份的薯条在排队,你可以把它们放在同一个篮子里同时烹调。有些顾客点的薯条是“熟透的”,意思是煮得更久。这使得批量处理变得更加复杂。

“等待n水花”:如果一份油炸食品的烹调时间远远早于其他烧烤食品,而且你没有需要油炸时间的压榨食品,你可以把篮子从油中提起来,但把食物留在里面。当烧烤结束后,你可以快速地把食物泼回油中来刷新它,然后就可以上桌了。这将防止它在柜台上变冷。

不活动的油炸篮子:为熟食留出额外的储存空间是很方便的。如果你有一个“等待n水花”订单等待,但你有更多的订单要炸,你可以使用两个备用篮子从非活动的油炸锅存储等待的订单,并腾出油炸锅槽。当顾客改变他们的订单时,这也是很有用的,你需要快速地把半生不熟的部分藏在某个地方,然后开始调整后的订单。

“汤汁”:如果两个煎锅都在使用,而烧烤厨师递给你要紧急烹调的培根,你可以用钳子夹住培根,然后把它蘸进一个浸入水中的篮子里。这可以让你有效地同时烹调两道以上的食物。

这是我最终使用的系统。当有新的订单到来时,我会停下来,抓起合适的容器,把它放进相应的油炸桶里。这将捕获有关订单的全部3条信息(油炸类型、大小、外卖?)。让我忘了这件事。如果我严格遵循这一点,我就可以像处理队列一样处理存储桶中的容器。然而,我仍然需要记住一种秩序感,因为系统不能捕获全局排序-如果我在油炸、卷曲和洋葱圈桶中有容器,我不知道哪个顺序排在第一位。

我没有解决这个问题的办法。在一个超级繁忙的日子里,这个系统崩溃了,我放弃了订单。像这样的极端负荷只发生过几次,在这种情况下,我只是大批量生产,忘记了与烤架同步,希望最后不会有太多过剩。总体而言,该系统运行良好。

从程序员的角度来思考人类系统(比如餐厅中的系统)是一件很有趣的事情。油炸厨师的工作非常类似于操作系统调度员的工作,有优化点和边缘案例。人们可以试着优化人类系统,就像它们是计算机系统一样,但在评估改进时,理解系统中微妙的人类方面是至关重要的。

你从这篇文章中学到了什么吗?我很想知道这是什么--发推特给我@offline emark!

如果你想知道我什么时候写新帖子,我还有一个邮件列表: