写代码与做菜

2025-02-27
4分钟阅读时长

过去的几年里,由于长期在家远程办公,多了很多自己做菜的机会,厨艺也精进了不少。目前一些普通的家常菜,即便我之前没有做过,但是可以根据网上的视频教程就能还原大体的风味出来。究其原因,我想是写代码中模块化的思想,用在了做菜上。

不妨把做菜大体分为三个阶段:

  • 准备阶段:包括一些预处理,如改刀、腌制、去腥等等;
  • 烹饪阶段:使用日常说的煎炒烹炸等手段对材料进行烹制,包括煮、红烧、煎、炒、清蒸等等;
  • 收尾阶段:烹饪阶段完毕之后,还要对菜进行一些收尾工作,例如收汁、清蒸鱼时的泼油等等。

做菜三阶段

按照写代码模块化的思想,当把这些阶段划分成具体的模块之后,模块之间进行排列组合之后,就可以做成不同的菜,举例来说,红烧鱼和清蒸鱼是两种不同的料理鱼的方式,但是却有着相同的预处理阶段:

  • 准备阶段:鱼去腥、鱼背花刀方便入味
  • 烹饪阶段:
    • 清蒸鱼:清蒸
    • 红烧鱼:调入酱料红烧
  • 收尾阶段:
    • 清蒸鱼:倒掉蒸鱼容器中的水(太腥),切葱丝放于鱼身上,烧热油淋上;
    • 红烧鱼:大火收汁。

两种不同的鱼料理

从这里可以看出,不论哪种做鱼的方式,预处理阶段是大体一致的。用程序设计的话来说:这个模块是可以复用的。也就是说,一旦学会了如何预处理一条要清蒸的鱼,换做其它方式料理的鱼,也可以使用同样的办法类似处理。

类似的,其它阶段也有类似可以复用的模块:例如在我看来,红烧鱼和红烧肉中烹饪的红烧阶段,就大体一致,都是要调入一些酱料对食物进行烹煮,只不过由于食材的不同,选料不同以及烹饪时长不同。所以当学会如何红烧鱼以后,稍微了解也能够学会如何红烧大肉。

可见,对菜的烹饪进行阶段划分之后,可复用的模块多了,就能在不同的菜里排列组合不同的模块,这就能组合出不同的菜来。

所以,现在看各种教做菜的视频时,可以有意的这样来看:

  • 这道菜的三阶段分别有哪些?哪些我还没有掌握,哪些又是和之前类似的流程,可以稍加改动就能复用;
  • 菜的调料有哪些,比例如何?
  • 菜的火候要求到什么程度?

可以看到,从阶段划分以及模块复用的思想再来看菜的制作,就会清晰很多。

除此以外,在具体的模块实现时,还能参考面向对象的思想。例如,红烧肉中有一道工序是“给食物上色”,做法有:

  • 加糖用油或者水来炒制糖色;
  • 使用老抽上色;

用面向对象的思想来说,“给食物上色”是一个接口,有以上两种不同的实现。以我而言,我总是把握不住炒糖色的火候,所以同样的接口我选择了对我而言更容易实现的老抽上色。这并不影响大局,因为程序设计里又有另一句话:完成比完美更重要。

食物上色

类似的,把做菜分为多道工序以后,如果某些工序并不熟练,可以尝试交给别人,或者使用只需要简单加工的半成品。例如,如果不会宰杀鸡鸭,那么有以下几种选择:

  • 可以将这道工序外包给摊贩,让他们帮忙;
  • 或者买袋装的冰鲜鸡,味道稍差一些。

以下这幅图里,就以吃披萨为例,来解释各种AAS(As A Service)的区别,本质上把不同的工序外包出去,就是使用了某种服务:

pizza as a service

做一个简单的总结:

  • 熟练掌握做菜中经常用到的“模块”,红烧、清蒸、腌肉等,因为这些模块会在多个菜品中被复用;
  • 将一道菜划分为几个不同的阶段,方便模块复用,这样就能组合起以前掌握的模块,来完成还不会的菜;
  • 将自己不熟练的模块,外包出去,寻找合适的服务替代;
  • 完成比完美重要,能够独立借助不同的服务来完成一道菜,就可以慢慢累积在这方面的自信心。

这几年在做菜上的投入,也让我有了另外的领悟。在中文里,“火候”这个词真的很妙,“火”强调了要对食物做功,“候”说明了要耐心等待时间。似乎在英文里找不到关于“火候”一词非常信达雅的翻译,如果直译过去是“Fire Control”,但是这一个翻译丢掉了中文语境里时间的部分。另一个词“功夫”也是,英语里“KongFu”只有武功的含义,而在中文里并不单指“武功”,在现在更多说的是在某件事情上投入时间。