最近、社内で関わるプロジェクトが移り、当然と言えば当然だが生産性が低下している。ついでに、長いビルドの暇な時間に、プログラマの生産性ってなんだろうな、ってなことをぼんやり考えたりしている。スーパーエンジニアは凡百なエンジニアの数十倍とか数百倍という生産性があるという。数十倍かはわからないけど確かにものすごく生産性の高いエンジニアというのはいる。いるのだけど、何故彼らは生産性が高いのか。いうか、そもそも生産性、ってなんだろう。一般的にプログラマの生産性というとコーディングスキルだと思われている気がする。それだけなんだろうか。そりゃ優れたコードを書くのは才能だし、スピードも才能で、ぼくにはそんなものはない。言語も開発環境も大同小異なプロジェクトのメンバー同士でも、かなり生産性には差がある。この差がコーディング能力だけでつくとはとても思えない。高林さんの文章で、プログラマの生産性についての考察があった。いちいちうなずくこと然り。レスポンスが異常に速いとか、フットワークが軽いとか、終わらせるとか......。あるんじゃないかと思った。コンテキストスイッチのコストが低い人は総じて生産性が高い。プログラマの仕事というのは、意外と待ちの時間があるものだ。ビルドに費やしている時間、データをダウンロードしたりアップロードしたりする時間。解析プログラムが巨大なデータを処理している待ち時間。レビューやメールの返事待ち。いう細かい空き時間をどう使うかというのは生産性に大きく寄与している。複数の作業を効率良く並列に進められるか。関連するコードを読んでみたり、論文に軽く目を通してみたり、メールの処理時間に使ったりもできる。私はコンテキストスイッチのコストが高めなので、ビルドのログが流れていくのを眺めながら、比較的どうでもいいこと(プログラマの生産性ってなんなのか、みたいなこと)をあれこれ考えたりしてしまう。ビルド中にメールでも書こうか、とメールの画面に移って、書いていたら意外と手間取ってしまって送信してほっと一息ついたら実はとっくの昔にビルドが終わってて、本当はその後にテストを実行させないといけなかったのだが......みたいなあるあるネタを実際にやっちまったりして。......あるよね?コンテキストスイッチのコストはどうやったら下げられるのだろう。そんなことが分かっていたら、こんな文章を書いているはずがないので(笑)、私にもよくわからない。ひとつ仮説として考えているのは、自分の作業フローを見通す能力なのではないかということだ。今からメールの返事を書くのにどれぐらいの時間がかかるのか。ビルドはどれぐらいの時間で終わって、その間にできることは何か。作業時間の予測とか、比較的短いスパンで何ができて何をどの順番でやるか、というのを把握していれば、テンポよく作業を進めることもできる。レスポンスが速いというのもそういうことだ。メールやチャットで連絡が来たときにプライオリティ付けがきちんとできないと、連絡したのにいつまでも返信ができない。逆に、チャットで相談に乗っていてひととおり解決したところでさっきまで何をしてたっけ......とならずにすぐ復帰できる人は生産性が高いし、自分はすぐ復帰できるからこそ連絡にきめ細かく対応できる。いう知識や優先順位づけは一般化しづらく、プロジェクトやチームによっても往々にして変わるから、プロジェクトが変わると生産性がいったん落ちたりするのだと思う。プログラマの界隈ではよく「フローに入る」という表現がある。それがどういう意味なのか正確に把握している自信はないけど、少なくともコンテキストスイッチをよしとしないということだ。人間、コンテキストスイッチのコストは決してゼロにはならないので、それを減らして作業に集中するというのもひとつの作戦だ。それが全てでもないのでは、と思う今日この頃。このへんはプロジェクトの性質にも関わっている。ビルドにどれぐらいの時間がかかり、テストの実行やレビューや各種のプロセスがどうであるか、というのにもよる。個人プロジェクトに近いものほどフローが重視され、大きなプロジェクトではコンテキストスイッチは避けられないものとして対峙する必要があるのかも。いずれにしても、コードを書くパワーだけが生産性ではない。コードを書いて生活しているように思っているので、そこを頑張ってしまいがちなのではないか、とちょっと思っている今日この頃です。Pinterest2012-01-25テキストフォーマットからの脱却ありのさんにPowerShellの話の要望を出したら運良く書いていただいたのだが、これが面白い。私のざっくりとした把握では、PowerShellではテキストだけじゃなくてオブジェクトも直接パイプを使って受け渡しできるみたいなシステムだったかと思うけど、やっぱしそういうのは面白いなと思う。興味はあるけどWindowsはもうずっと使ってないからなぁ。似たようなことを考える人は、たぶんほかにもいて、たとえばTermKitはJSオブジェクトを受け渡すような感じになっているし、きっと似たようなことを考えて、UNIXな世界に持ち込もうとした人はほかにもいたのだと思うが、今のところ全滅な気がする。なんでUNIX系のシステムではこういう考え方が普及しないのか。個人的には、UNIXの世界の根底に流れる思想がテキスト志向だからだと思う。UNIXの開発の名目は文書処理システムだった、といった神話があるが、真偽はさておき、UNIX系システムには共通のフォーマットというものがない。データは基本的には行志向のhuman-readableな文字列で、それぞれのプロセスがそれぞれなりに文字列処理をするという文化になっている。そんななかで成長してきた便利ツールも、ファイルも、そういった文化を受け継いでいる。単純な空白区切りやタブ区切りでも、よっぽど変な場合を除いてはだいたいうまく動くし問題ないわけ。その文化を反映するようにUNIXではテキスト処理のツールというのがものすごく充実している。catやheadやtailを使って人間が目で見て、簡単なエディタ(ed/sed/vi)でちょちょっといじれて、cutやheadやtailやuniqやsortやgrepで処理できる世界がもうそこに展開されている。nokunoさんがテキスト処理用のUNIXコマンドまとめという記事を書いているが、これがまさにUNIXなのだと思う。そんな世界をPowerShellみたいな世界観にもっていくのは大変だ。できるのはほぼ同じ事なうえに、過去の資産を生かせない。ここでいう過去の資産ってのは別に各種ツールの実装の問題だけじゃなくて、今まで持っていたデータファイルなども含まれる。いったものをうまく扱えるようにしつつ、過去の資産と比べて実利がなければうまくいかないし、UNIXの世界はよく言えば自由、悪く言えばカオスなので、オブジェクトの形式を揃えるなんて夢のまた夢だろう。psやtopのようなコマンドを簡単に処理できればいかに楽かと思う時もあるのだけど、そういうのはperlとかpythonとかrubyとかで、直接APIを叩くほうがいいってことになってしまう。実際、こういうツールの代わりに、irbを立ち上げっぱなしにして、何かあったらrubyを使うという人はわりといると思う。それはまぁ、合理的な選択でもある。環境というものがあるWindowsだからだったのだと思うし、UNIXとは「文化がちがーう」という奴なのでこれはまあ仕方ないというしかない。いうテクノロジーの可能性を見るのはとても面白いなーと。Pinterest2012-01-20甘酒づくり去年唐突にやってみた甘酒づくりを今年もたまにやっています。麹から作る甘酒は、自然な甘さがあって美味。初詣などで買える甘酒は酒粕から作ったものであることが多いのですが、これは文字通り別物というか、別種の飲み物といったほうがいい感じ。お酒のような匂いもなく、ただ甘いのです。甘酒の作り方は、検索するといっぱい出てくるのですが、私の場合はだいたい以下のとおり。麹をどこかから入手します。スーパーで売ってるとのことですが、私の場合、近くを適当に見て回ったら見当たらなかったので、けっきょくamazonで買いました。分量はそんなに多くなくても大丈夫。米の分量ですが、この時は半カップほどでした。これで完成後の分量は、お椀に2−3杯分できます。普通の紙コップで飲むなら4-5杯分ぐらい?けっこうな量ができます。あと、麹もほぼ同量用意します。麹の量は、米と同量だとかなり甘くなって贅沢な雰囲気になるというのですが、ぼくや皆さんの場合、どうせそのために麹を買ったのだし、盛大に使いましょう。用意した麹は水につけておきます。ぬるま湯(20-30度ぐらい)にするといいという話もあります。米の方は、おかゆにします。おかゆは炊飯器でもできますが、ここでは鍋で作っています。鍋に米と3倍の量の水を足して、中弱火ぐらいで温め始めて、沸騰する頃に弱火にしていきます。頻繁にしゃもじなどでかき混ぜてやらないと底に焦げ付くことがあるので注意。鍋で作るおかゆの作り方も、ネットを探せばいっぱい出てきます。おかゆが完成したら、まず冷ます必要があります。完成直後のおかゆは熱すぎるので、そのままでは麹が澱粉を分解して糖になる反応ができません。要するに全然甘くならないわけです。甘酒づくりの好適温度は50-60度と言われています。厳密である必要はないので温度計で図るほどでもなくて、私は適当にやっています。小指を突っ込んでみて、我慢はできるけどちょっとつらいというレベルですね。お風呂よりはかなり熱いけど、すぐ引っ込めたくなるほどでもないというか......。放置しているだけではおかゆはなかなか冷めないので、適宜水を足したりして温度を調整します。この辺は適当で大丈夫。温度が適温になったら、先程水につけておいた麹をそのまま投入し、全体的によく混ぜます。混ぜ終わったら保温します。甘酒を作るのはだいたい6-8時間ぐらい、簡単に言うと一晩ぐらいかかりますから、そのまま放置すると冷めてしまいます。冷めてしまうと好適温度から外れて甘くはなりません。保温の方法は、炊飯器を使う方法や、こたつを使う方法などいろいろありますが、私のオススメは湯たんぽを使う方法です。湯たんぽをあらかじめあたためておいて、その上に鍋を置きます。この状態で、保温のためにさらに周囲をタオルでぐるぐる巻きにしておけば、それほど熱が逃げることもありません。これを作ったのは夜中だったので、ここまでできたらひとまずオヤスミナサイ、また明日〜。一晩して出来たのが右の写真。見た目はあんまり変わっていませんが、これで完成です。一晩放置しておくと、さすがにけっこう冷めてしまっているので、そのまま飲んでもそんなに甘みを感じません。火にかけてあたためてから飲みます。火にかけるのは、混入した雑菌を除く意味もあるようで、放置すると酸っぱくなるという話も見かけました。完成した甘酒は、コップとかだと米粒が残ってしまうので、私はお椀でいただいています。