ちょっとひと言

蒸気ドリル

David Platt

David PlattJohn Henry は親方に言いました。「人間には人間のやり方があるんだ。蒸気ドリルに打ちのめされるくらいなら、ハンマーを握りしめたまま死んだ方がましだよ」

—『John Henry のバラッド』、米国民謡

John Henry は、米国の有名な民間伝承です (bit.ly/3HqIMd)。John Henry は単なる創作だとする人もいますが、実在の人物が元になっていると考える人もいます。John Henry は 19 世紀後半、鉄道のトンネルを通すために、大きなハンマーを鋼製の掘削棒に打ちつけて岩に穴を開ける「ハンマー使い」の仕事をしていました。蒸気ドリルが現れて仕事を脅かすようになると、John Henry は蒸気ドリルに戦いを挑み、勝利しました。「John Henry が掘ったのは 16 フィート、蒸気ドリルはたったの 9 フィート」とバラッドに歌われています。この歌にはさまざまなバージョンがありますが、そのどれもが次のように悲しい結末を迎えます。「あまりに一生懸命働いたので、彼は心臓を壊してしまい、ハンマーを置いて死んでしまった」

皆さんは、このような根っからのハードウェア寄りの人物が、ソフトウェアと何の関係があるのかと思っているでしょう。私自身は、先週 Harvard Extension での "Programming Microsoft .NET" の講義でスレッドについて教えていたとき John Henry のような状況になりました。この講義では、まず受講生に未加工のスレッドについて触れてから、スレッド プールを紹介し、同期とスレッド類似性に関する設計の問題を説明しました。終わりに、スレッド プールを使用したくなるけれども使用してはいけない、難しい課題を出しました (学生: 先生、あなたは鬼ですか。私: うん、それで、何が言いたいの?)。

翌週、私は学生にタスク並列ライブラリ (TPL) の Parallel.For コンストラクトと Parallel.ForEach コンストラクトを説明し、私自身はこのライブラリを信頼していないことを話しました。これは新しすぎるのです。また、制御と透過性を失うデメリットに見合うほど時間と労力を削減できません。このような話をしたところで、自分がとても時代遅れになっていることに気が付きました。

コンピューティングが進歩するたびに、新しい抽象層が生み出されてきました。抽象度が高まるほど、抽象度の低い層をマスターしようと努力したプログラマの機嫌は悪くなります。自分たちが懸命に身に着けたことが、だれでもできるようになったのです。ずるいでしょう。

たとえば、磁気ディスクが初めて登場したときは、"ヘッド 3 をトラック 19 に移動し、セクター 247 が回ってくるのを待って読み取る" など、プログラマはハードウェアに直接命令する必要がありました。その後、ファイルという、論理的に連続したバイトを利用してソフトウェア抽象層にハードウェアを隠す方法が考案されました。

「非効率的な方法です」と頑固者は主張しました。「最近の若者はリソースに関心を払っていません。浪費されているすべてのセクターのことを考えてみてください。それらを何と呼びますか、ディレクトリですか」

「年寄りが何か言ってる」と若者は笑いました。「まだ 1 と 0 だけでプログラミングしているのかい」

私はいつの間に新人から頑固者になったのでしょう。私はスレッド プールについては問題ありません。学生に、いくつかのスレッドがブロックされたらジョブに追加スレッドを割り当てるという、プログラムでスレッドの CPU 使用率を監視する方法を説明しています。ただし、スレッドが隠される TPL とは異なり、この方法ではスレッドが見えています。

内部で実行される処理についての理解に勝るものはないと、私は常々感じています。抽象化には必ず穴があります。ディスクは断片化し、ファイルは不便なクラスターに分散して、メタルの無駄な動きを引き起こします。数年前に私の MFC に関する講義を熱心に聴いていた学生は、Charles Petzold による Windows API の古典的著書を勉強しなさいという私のアドバイスに従いました。私が顧客のスレッドに関する問題を修正する場合、その問題はいつも (例外なく毎回) スレッドの役割や動作についての基本的な誤解に起因しています。

TPL の Parallel.For や Parallel.ForEach を使用しても問題ありません。しかし、動作を理解しないままこれらのテクノロジに頼ることは、泳ぎ方を知らない人が浮き輪でボストン港の真ん中まで泳いでいくようなものです。(私のような) 沿岸警備隊に救助を求めて叫ぶことになるでしょう。さいわい、私たちは警戒しなければならないことがわかっていますから、注意深く構えています。おたくにはおたくのやり方があります。TPL に打ちのめされるくらいなら、スレッド ハンドルを握りしめたまま死んだ方がましです。

David S. Platt は、ハーバード大学の公開講座や世界中の会社で .NET のプログラミングの講師をしています。『Why Software Sucks...and What You Can Do About It』(Addison-Wesley Professional、2006 年) や『Microsoft .NET テクノロジ ガイド』(日経BPソフトプレス、2001 年) などの、11 冊のプログラミング関連の書籍の著者でもあります。2002 年には、マイクロソフトから Software Legend に指名されました。David は、8 進法で数える方法を学べるように、娘の 2 本の指をテープで留めるかどうか悩んでいるところです。連絡先は rollthunder.com (英語) です。