MapReduce と四身の拳

最近大規模データを処理するのに MapReduce とかがよく使われるのだけど,クラウドなど分散環境を使う人は基礎的なアルゴリズムを書く訓練もした方がいい.そもそも並列・分散系の環境は,最高速のアルゴリズムでも時間がかかる処理を,さらに速くするために使うべきものであって,基礎的なアルゴリズムの高速な実装ができない人が,実装をサボるために使うべきものではない.基礎的なアルゴリズムの差は MapReduce を使っても残る.特にデータが巨大になり,かかる時間が伸びれば延びるほど,基礎的なアルゴリズムの速度差が致命的になる(10分かかる処理が20分かかっても気にならないかもしれないが,1週間かかる処理が2週間もかかったら致命的; 1000台あるマシンを2000台に増やす方法を考える前に,ベースのプログラムの処理速度を2倍にすべし).

こんな例を出すと,年がバレるが,日曜プログラマが1000台のマシンでスクリプト言語で書いたプログラムを走らせている様は,まるで天津飯の「四身の拳」状態ではないか.四身の拳は,使用者が「完全なる実体」として4人に分身できるが,分身した人数に反比例してそれぞれの力が4分の1なるという失笑技.クラウドを管理して課金している側の人達からすれば,クラウドべったりで,使用者のプログラミングレベルが落ちてくれたら願っても無いことなのかもしれないが,同じマシンを共有して研究している研究者からすれば,(無駄に計算機資源を占有されて)迷惑なことこの上ない.界王拳を使った孫悟空が強いのは,ベースがそもそも強いから,ということを忘れてはいけない.クラウドは四身の拳ではなく,界王拳であるべきでしょう.ときどき,データサイズを強調するのに「〜台のマシンで〜日かかって解析した」みたいに書いてる論文を見かけるけど,ベースのプログラムが遅いことを知っている人からすれば,白けることこの上ない.恥ずかしいから書かない方がいいと思う.

注)もちろん,分散系の環境を前提にした技術を否定するわけではありません.基礎的なプログラムを書けない人は,結局並列・分散化できないところをボトルネックにしてしまうという話です(アムダールの法則).スクリプト言語を使えば,実装に時間をかけずに,本質的なところに時間をかけられる,という考えもあるとは思いますが,「そもそも速く書けばどれぐらい速くなるのか」を知らないで,その考えを採用するのは危険だと思います(というか,スクリプト言語C++ で,実装にかかる時間に極端に差が出るプログラムは実はそれほど多くないような気もする).何事にも全力を.