Kentaro Kuribayashi's blog

Software Engineering, Management, Books, and Daily Journal.

ピラフとエンジニアリング

今晩、同僚との飲みの場で行った会話を、以下に再現する。


きたけー: 週末、炊飯器でピラフ作ったんですよ。

あんちぽ: どういうレシピで作ったの?

きたけー: まず、米をよくといで水を切った後に、溶かしたバターを絡めます。そこにコンソメの素、シーフードミックス、グリーンピースを加えて炊きました。

あんちぽ: なるほどね。美味しそうだね。

きたけー: 美味しかったです。

あんちぽ: ところで、ピラフとチャーハンの違いってなんだろう?

きたけー: (少し考えて)ピラフは材料を加えて米を炊くのに対して、チャーハンは炊いた米と材料を一緒に炒める、ということですかね。

あんちぽ: その通りだね。つまりは、材料と米のコンビネーションのしかたの違いってことだね。

きたけー: なるほど。

あんちぽ: そう考えてみると、ピラフを炊飯器で作るのは当たり前のことだよね。炊飯器は白ご飯を作るだけのものじゃない。

きたけー: そうですね。

あんちぽ: ピラフとチャーハンの例だと、炊く・炒めるという調理法による分類だけど、他にはどういうのがあるのかな。

きたけー: たとえば、味付けのしかたで分類することもできそうですね。それでいうと、会社のカレー好きのひとたちが「麻婆豆腐はカレーだ」といってたことを思い出します。

あんちぽ: スパイスの組み合わせを本質と捉えるなら、そういう認識はあり得るね。また、調理法という意味でも、どちらも煮込んだベースをスパイスで味付けして、それにうわものを足していくという意味では、共通するところがあるね。

きたけー: 確かに。

あんちぽ: では、もうちょっと敷衍して考えてみようか。ピラフの例でいえば、その本質は「炊く」ということ。それは、たとえば「炒める」という本質を持つチャーハンと比較することで立ち位置が見出される。

きたけー: 他にも「焼く」とか「煮る」とかいろいろありそうですね。

あんちぽ: さらにいえば、中華料理だと「炒める」ということにしても、炒・爆・炸・煎・燴の5種類があるように、どんどん細分化できるね(参考: 中華料理 - Wikipedia)。

きたけー: いろいろあるんですね。

あんちぽ: 細分化していくのもひとつの分類法だけど、ここではもっとシンプルに考えてみよう。細分化するのではなく、調理法をもれなく表現する上で必要最小限を考えてみる。それを示しているのが『料理の四面体 (中公文庫)』という本。著者はこういう図を描いてみせる。

f:id:antipop:20150525234505g:plain

サラダの果て、はじまりの料理/新入生のための一人飯ハック 読書猿Classic: between / beyond readersより

きたけー: 味付けという観点を捨象して、調理法に絞って考えているわけですね。なるほど。

あんちぽ: 著者の玉村豊男さんがこの考えを発表した時は、「サラダと刺し身が同じなんてけしからん!」と怒られたというけどね。

きたけー: まあ、そりゃそうですよね。

あんちぽ: しかし、プロにとってはともかく、僕らみたいに自分のために料理してる人間にとってはこれで十分なんだと思うよ。

きたけー: ちょっと納得いかないですけどね。

あんちぽ: でもこういう考え方をしていくと、数ある料理が、それぞれ別個にあるんじゃなくて、数本の軸上をグラデーションを描きつつ配置されているイメージがつくよね。料理が上手なひとってのは、こういうのをパッと認識できるひとだと思うんだよね。冷蔵庫の余り物だけでささっと献立を考えられるってのはそういうことでしょ、きっと。

きたけー: なにか料理をしようと思うたびにクックパッドでレシピを調べるんですけど、それはそれでいいけど、四面体を頭に描いて献立を考えると、バリエーションも広がるし、応用も効きますね。

あんちぽ: そのときの「バリエーション」ってのは、四面体上の点をどれだけ細かく考えられるかっていう解像度で、その精度が高いひとが「料理が上手」とも言い換えられるね。

きたけー: 解像度っていいかた、いいですね。

あんちぽ: てか、チャーハンの話してたら食べたくなったね。

きたけー: 僕もですw (店員さんに)すいませーん、チャーハンくださーい!

あんちぽ: これまではチャーハンと比較した時に見いだされるピラフの本質を考え、そこから必要最小限の調理法による料理の分類にいたったわけだけど、ところで僕らはエンジニアなので、似たような考えがエンジニアリングにも見いだされるのでは?と考えたいところだよね。たとえばどういうのがあるだろうか。

きたけー: (10秒ほど考えて)うーん、思いつきませんね。

あんちぽ: 僕らにとって身近な例をあげると、CPU・アドレッサブルな記憶装置・それらをつなぐバス・ストアドプログラムという要素から構成されるノイマン型アーキテクチャってのは、そうした抽象の一例じゃないかな。

きたけー: そうですね。ジョン・フォン・ノイマンがEDVACの実装を抽象して一般化したのがノイマンアーキテクチャで、それは現代のコンピュータの共通の基礎になってますね。

あんちぽ: それを、現に存在する実装から離れてひとつのフレームワークだと考えてみた時に、たとえばOOP関数型プログラミングの違いみたいな、定期的に話題になる問題についても整理できるかもしれないね。

きたけー: どういうことですか?

あんちぽ: ノイマンアーキテクチャフレームワークで見た場合、OOP関数型プログラミングも、アーキテクチャ内の要素の利用という意味ではほとんど同じだけど、さっきの4つの軸上における状態に対する考え方の違いと観ることもできる。

きたけー: メモリの使い方の違いということですか?

あんちぽ: 物理的な層における現象としては最終的には同じものになったとしても、その抽象のしかたが違うということ。OOPが状態を操作することで結果を算出するのに対して、関数型プログラミングは計算を積み上げることでそれを行う。

きたけー: その説明が正しいのかわからないですけどw

あんちぽ: そういう風に見ることもできるだろうということで……。

きたけー: それで、そうするとどうなるんですか?

あんちぽ: さっきの料理の例でいうと、カレーを作るのと肉じゃがを作るのとで、料理があまり上手でないひとは、それぞれに全然別個のものだと認識するかもしれないけど、「料理の四面体」のフレームで考えると、それらはどちらも「煮物」という点では同じといえるよね。

きたけー: そうなりますね。

あんちぽ: そうすると、ひとつ上のレイヤで料理について考えられるから、バリエーションを増やすことも容易になる。同じことがエンジニアリングにもいえて、プログラミングの初学者が、たとえばTwitterみたいなものを作りたいと考えて、Twitterのエンジニアに質問したとしよう。その時「Twitterは、以前はRubyを使ってたけど、いまはScalaを使っているよ」といわれたとして、「なるほど、Twitterを作るにはScalaという言語が必要なんだな!」と思ったとしたら、それは違うよね。

きたけー: そうですね。Twitterというサービスの特性上Scalaがよいという判断はあったんだろうけど、Webサービス一般を作ることと言語が何であるかとは本来的には関係ないことですね。

あんちぽ: 僕らはWebエンジニアだからそういう風にわかるけど、じゃあたとえば料理の話になったらどうかというと、それはわからないかもしれないでしょ?

きたけー: 「料理の四面体」を知って、そういう考え方もあるんだと思いました。

あんちぽ: どんな分野でもそうだと思うけど、そういう抽象化がないと、場当たり的に知識を積み上げるだけになってしまって効率がよくない。料理の例でいえば、なにか作るたびにレシピを調べるのだけど、それを応用することができない。

きたけー: 料理に関しては、僕はけっこうそんな感じですね……。

あんちぽ: 要するに、何か知識を積み上げていくというのはそれはそれでいいんだけど、時には経験を振り返ってシンプルなフレームワークにしてみて、そこから敷衍していくというのも必要なんじゃないかなと思うんだよね。

きたけー: そしてそれは、料理にもエンジニアリングにもあてはまる、と。

あんちぽ: そうそう。

きたけー: 知識を積み重ねるのも大切だけど、考え方を身につけるというのも大切ということですね。

あんちぽ: 「教養」といった時にふつうイメージされるのは、知識をいかにたくさん持っているかということだろうし、それはそれで大事だろうけど、考え方を身につけた上でそうする方が効率的だし、さらにはそれこそが「教養」といわれるべきものかもしれない。まあ、そんな大げさな言い方をしなくても、知識の積み上げと考え方のバランスが大事なんだろうね。それはこないだスライドの中で話したことだけど。

きたけー: しかし、ピラフを作ってる時にそんなことまで考えませんよw

あんちぽ: (出てきたチャーハンを食べながら)では、この石焼きビビンパ風チャーハンについて、作り方を考えてみよう。

きたけー: (もぐもぐ)美味しいですね、これ。コチュジャンが効いている……。他には……(略)


料理の四面体 (中公文庫)

料理の四面体 (中公文庫)