« GWとは夏を乗り切る体力を養うための休暇である | メイン | 連休真ん中 »

2009年5月 2日

プログラマが料理するときに心がける事~初めての料理編

プログラミングと料理が似ているってのは割と一般的に言われていることだと思うんだけど、じゃあ、どこが似ているのかって事はあまり書かれてないように感じたので、プログラマが料理をするときの心がけをまとめてみた。まずは初級編。

レシピ=サンプルコード

まずはレシピを見て料理を作ることが多いでしょう。それはサンプルコードを書き写すようなものです。料理は非常に寛容なので多少のtypoはものともせず、手順を大雑把に追えば食べられるものが出来上がります。食べられるものを組み合わせて作っているのですから当たり前です。失敗は恐れる必要は全くありません。

ただ、リカバリの効かない失敗として、以下のものがあるので気をつけましょう。

  • 調味料(特に塩)を入れすぎる/入れ間違える※1
  • 焦がす

それ以外の失敗は何とかリカバリが効きます。レシピを誤読して失敗するという可能性もありますが、あまりにも頻繁に発生するようでしたら国語力を磨いた方が良いかもしれません。

と言うことで「レシピどおりに作りましょう」で話は終わってしまいそうなのですが、それだけだと単にレシピどおりの料理が出来るだけ、その後の進歩がありません。以降はプロジェクト管理的な側面も含めて、料理をする上での心がけを書いていきます。

フェーズの切り分けをしっかり行う~ウォーターフォールでおk

どうせ一人で全部やるんだから、ウォーターフォール型開発で充分です。フェーズとしては以下のようになります。

  1. 最初の片付け
  2. 食材・道具を揃える
  3. 下ごしらえ
  4. 調理・味付け
  5. 盛り付け
  6. 食べる
  7. 後片付け

順序が明確になっていると調理がスムーズに進みます。また、フェーズが分かれていることによって、前フェーズでしか使わないものをさっさと片付けられるというメリットもあります。

料理をする上で大事なのは「片付けながら料理をする」と言うこと。そう、これはメモリ管理に通じるものがあります※2。これが出来ていれば、料理が上手いと思ってもらえます。

1. まずは片付けから~開発環境の整備と用件定義

最初のフェーズ。料理をするに当たってまずやる事は台所の片付けです。

本気で開発モードに入るときに、チャットソフト等を落とすようなものです。現実として一般的な台所はそれほど広くないので、余計なソフトを動かしておく余裕(=メモリ)もないと言うのもあります。邪魔なものは徹底的に片付けておきましょう。中途半端な洗い残しも片付けておきましょう※3

少し上級レベルの話になりますが、この工程では、状況の把握をするという目的もあります。まだ作るものが決まっていない場合は、手持ちのリソースからどのような料理を作れるかを考えましょう。足りないものがある場合には何を調達するべきかまとめてみましょう。そして調理全体の流れを把握しておきましょう。

友人宅等で料理をすることもあるでしょう。これは他人のパソコンで開発をするようなものです。片付けとは少し違いますが、

  • コンロの数
  • 電子レンジ・炊飯器の有無
  • 鍋の種類と数
  • 調味料の取り揃え
  • ボウル(またはボウルとして使えそうな容器)の数
  • ゴミの分別(生ゴミやスチロール容器等の廃棄場所)

等を事前に確認してから調理に移ったほうが良いでしょう。

2. 食材・道具を揃える~グローバル変数上等

このフェーズでは、食材と道具を全て取り出して台所(主にまな板周辺の手の届く範囲)に配置します。

これはプログラムの最初に全ての変数を宣言して、全てのモジュールを読み込むような非常に泥臭い方法です。つまり全てがグローバル変数です。

最初はそれで構いません。学校給食やパーティー料理のような大規模開発を行うわけでは無いですし、この方法でも家庭料理レベルであれば不都合はそうそう起こりません。把握しきれないほどの変数(=食材)の数にはなりません※4。まずはこの方法から始めましょう。

足りないものがあった場合でもこの時点で気づく事ができますし、全てが手の届く範囲に揃っているので、いったん調理を始めたら、後はスムーズに進むと言うのも大きなメリットです※5

そして、この方法の一番大きなメリットは、「調理開始時が一番調理場(=メモリ)を占有している」というところです。

一見メリットには思えないかも知れません。しかし、調理開始時点で領域が十分に確保されているので、後はメモリを開放する事だけを考えながら調理を進めれば良く、メモリリークが起こる心配も無いと言うのは大きなメリットです。

後は「片付けながら料理」をすれば良いのです。調理開始時は散らかっていても、出来上がっていたときは片付いているというのが理想です。

3. 下ごしらえ~Modelの実装

このフェーズでやる事は、材料を切り、下味をつけるところです。取り出してきた材料を整える段階なので、MVCにおけるModelのフェーズといえば分かりやすいかもしれません。

この際大事なのは、「材料を切る前にどこにストアするかを考えておく」事です。余裕を持ってボウルをいくつか準備しておき、切り終わった食材はさっさと入れてしまいましょう。もちろんボウルの置き場所も事前に考えておきましょう。

空になった容器はさっさと捨て、中途半端に残った食材も冷蔵庫等に閉まってしまいましょう。「後で必要になるかも」とか考えて、いつまでも台所に残しておいてはいけません。後で必要になったらそのときに取り出せば良いのです。データベースへのコネクションをいつまでも張っておく必要が無いのと同様です。

また、まな板はあくまで一時的な作業場(キャッシュ)なので、切った食材をいつまでも放置するようなことをしてはいけません。

慣れてくるとまな板の上で食材を捌きながら鍋に順次放り込んでいくなんて技が出来るようになりますが、そんな芸当が出来るのはプロの領域なので、そんなことをしようと考えてはいけません。Perlで一時変数を使わず、デフォルトの$_を多用するようなものです。

このフェーズが終わったら、包丁・まな板は使わなくなるので、次のフェーズ「調理」に移る前に洗って片付けてしまいましょう※6。まな板を置いていたスペースにボウルを並べることが出来るので、「調理」をスムーズに進めることができます。まな板の上にボウルを並べるような事はしない方が良いでしょう。

4. 調理・味付け~Controllerの実装

料理を火にかけます。レシピの順番どおりに材料を放り込んで、後は待つのみです。味付けは、料理人としては腕の見せ所になりますが、とりあえずはこれもレシピ通りにやっておけば間違いはありません。中級編を書くことがあれば細かく言及しようと思います。

前フェーズがしっかりできていれば、はっきり言って、このフェーズは楽です。3分クッキングがちゃんと10分以内に終わるのも下ごしらえがちゃんとできているからに他なりません。

MVCモデルからすると、Modelが出してきたデータをViewに受け渡すController部分の実装にあたります。Modelがしっかり実装されていればControllerに書くコードが少なくて済むのは衆知のとおりです。

ただし、焦がす事だけは無いように注意をしてください。火をつけている間はかならず火のことを意識下においておくようにしましょう。楽ではありますが一番集中力を切らしてはいけない時間帯とも言えます。

複数品作る際には火にかけるタイミングをなるべく揃えるように努力した方が良いでしょう。あっちこっちで火をつけるのはスパゲッティーコードみたいなもので美しくありません。複数品同時に火をかけ※7、火に留意する時間帯を集中出来れば、焦げのリスクを逓減できますし、何より温かい料理を一斉に並べる事ができます。

さて、いくら楽だからと言って怠けてはいけません。楽だからこそこのフェーズにやっておくべきことがあります。それはもちろん片付けです。

鍋を火にかけている間がチャンスです。火に留意しながら、まずは前段階までに片付けられなかったものを片付け、材料を投入して空になったボウルを洗いましょう。

そうしてスペースが空いたら、盛り付けるための皿を並べておきましょう。

5. 盛り付け~Viewの実装

ここまで来れば、もうプロジェクトは成功です。後は好きなように盛り付ければ良いでしょう※8。せっかくの料理なのでキレイに盛り付けてあげましょう※9

鍋がまだ熱いうちのほうが油汚れが落ちやすいので、空になった鍋はキッチンペーパーで汚れをふき取っておいたりすると後の洗い物が楽になります。

ただ、他の人に食べてもらう場合はなるべく早く次のフェーズに移行する事を考えましょう。ある程度片付けてから食べるフェーズに移りたい気持ちも分かります。でも他の人が待ちわびているので、この段階では片付けよりも食べる事を優先しましょう。

6. 食べる

プロジェクトの成功を皆で祝いましょう。もしくは反省しましょう。この段階で大事なのは「全部食べること」と「みんなで食べること」です。

作ったものは全部食べましょう。例え失敗したとしても。むしろ失敗した時こそ全部食べるべきです。成功していたら自然と料理はなくなります。多少失敗していても自分の作った料理は美味しいものです。

また、複数人で食べるときはちゃんとみんなで一斉に食べましょう。食べているときにはついつい並行して後片付けをしたくなってしまいますが、食べるときはそんなことを気にせずにみんなで食べた方が美味しく食べられます。そして、他の人に美味しく食べてもらうためにも一緒に食べましょう。他の人もあなたを働かせている間に食べるのは気が引けるでしょうから。

食べてもらった人には感想を聞きましょう。きっと「美味しい」と言ってくれるはずですが、それ以上の感想も引き出せると後々の参考になるはずです。

7. 後片付け

あともうひとふん張りです。鍋や各人が使った食器を洗いましょう。次回自分が料理をしやすいように片付けることが大切です。デスクトップのファイルを片付けてしまうようなものです。

料理はなるべく余らないように作るのがベストですが※10、余った料理は保存容器に入れて冷蔵庫に入れておきましょう。

保存した料理は得てして保存しっぱなしでダメにしてしまう可能性が高いので、どのように再利用するかも考えながら後片付けをすると良いでしょう。

お疲れ様でした。

  • ※1 私も昔上白糖のつもりでケーキにたっぷり塩を入れたことがあります
  • ※2 個人的にはここが料理の醍醐味とも言えると思っています。そういう意味じゃ、私はCは書けませんが、「メモリ管理も出来ないプログラマはダメだ」とか「GCが自動で行われるスクリプト言語はつまらない」とか言う一部のCプログラマの気持ちも分かる気がします。
  • ※3 まだ洗っていない鍋があるので、その代わり別の鍋を調理に使う、なんてのは最悪です。自分の首を絞めているだけです。
  • ※4 それでもやはり「サラダにも入れる予定だった玉葱を全部カレーに突っ込んでしまった」と言ったミスは起こりえるので、グローバル変数には限界があります。ゆくゆくはスコープを意識する事は大事になってきます。
  • ※5 起動には時間がかかりますが、その後の処理は早いプログラムのようなものです。また、材料の欠損は処理の上で大きなボトルネックになります。足りない材料を探しているうちに料理を焦がしてしまったら目も当てられません。
  • ※6 調理の段階で「鍋を火にかけて放置する時間が長い」というような見通しが立つようであれば、その時に洗ってしまうという手もあります。また、ぺティナイフくらいは片付けないで残しておいても良いかもしれません
  • ※7 中華料理の場合は同時と言うより直列的に一斉に処理する感じと言えるかもしれません。
  • ※8 ただ、人間の感覚は曖昧なので見た目は味に少なからず影響するようです。不味い物が劇的に美味くなること(もしくはその逆)は無いだろうとは思うので必要以上に心配する必要はありませんが。ただ、意図的にグロテスクに盛り付ければ、美味いものを不味くする事は可能でしょう。
  • ※9 一人で食べるときなんかは盛り付けせずに鍋から直接食べてしまったりしますが、それもまた良し。
  • ※10 会社に持っていくお弁当用に余るように作るという上級テクもあるようです。

投稿者 Songmu : 2009年5月 2日 23:07