WirelessWire News Technology to implement the future

by Category

マジックとプログラミング

2014.11.18

Updated by Ryo Shimizu on November 18, 2014, 14:07 pm JST

スクリーンショット 2014-11-18 14.08.18.png

 実を言うとマジックが好きで好きでたまらないんです。

 なぜ好きかというと、マジックの神髄はプログラミングに多いに関係していると思うからです。

 デッキに差し込んだはずのカードが指をパチンと鳴らすと上がって来る。
 カードが宙を舞う

 本来あり得ないはずのことが目の前で起きる。
 摩訶不思議な体験、それがマジックです。

 

 プログラミングもマジックに似たところがあります。

 例えば、あるシステムの開発をある会社に頼んだら「3ヶ月で1億円」という見積もりが出て来たとします。

 しかし別の会社に頼んだら、「1ヶ月で1000万円」という見積もりになったりします。

 全く同じシステム、全く同じ仕様でも、そういうことが起きえるのです。

 というのも、プログラマー個々人の能力の差は、普通の労働集約業とは異なり、実際に10倍にも100倍にも成りうるからです。

 それは同じ会社の中でも起こり得ます。

 たとえば、私の会社で6年程前に発表したゲームソフトがありました。
 開発期間は約6ヶ月で、ゲームとして完成したプログラムのソースコードは5万行にも及びました。

 それから4年ほど経過して、私たちはenchant.jsという新しいソフトウェア技術を作りました。
 これはゲームを始めとするありとあらゆるフロントエンドアプリケーションの開発を効率化するためのミドルウェア(ソフトウェア開発を補助するためのソフトウェア)です。

 私がenchant.jsを使ってそのゲームを書き直したら、作業時間わずか半日、700行程度のプログラムでほぼ同等のものができあがりました。

 もちろん、データや調整など、完全に生産性を半日と六ヶ月で比較することは困難ですが、同じことを非常に短期間に終えることが出来たわけです。

 これは専門外の人からみれば、驚異的なことで、まるでマジックのようです。

 しかし私たちはコンピュータの持つ計算資源、プログラマーのやる仕事のうち大部分の「似たような仕事」をミドルウェアという形でエッセンスを取り出し、それを最小限の努力で組み合わせることで熟練したプログラマーが何ヶ月もかけてやることが、プログラミングテクニックの工夫で、片手間にできるようになったのです。

 マジックもプログラミングも、テクニックが必要なものと、テクニックが不要なものがあります。
 道具を使ったマジックのなかには難易度の低いものもありますし、難易度が無茶苦茶高いものもあります。

 どちらにせよ必要なのは日々の訓練です。
 そして洞察力だと思います。

 卓越したプログラマーはしばしば「ウィザード(魔術師)」と呼ばれます。

 本当に凄いプログラマーの作ったプログラムは同業者から見てもとんでもない魔法のように見えるのです。

 
 例えば90年代の頃、まさに魔法そのものに見えたのはファイナルファンタジー7でした。
 当時の家庭用ゲーム機ではあり得ないクオリティの3DCGは同業者を多いに驚かせました。

 この困難なプログラミングを担当したのは当時スクウェアに居た橋本和幸氏で、彼はもともとはマサチューセッツ工科大学で開発されたプログラミング言語LISPの達人で、それこそ「他社が半年かかるシステムを一週間で仕上げる」というウィザード級プログラマでした。

 LISPは現在でも広く使われていますが、使いこなすには高度な能力と訓練が必要です。
 従って今でもプログラマー人口全体に対するLISPプログラマー人口は高くありません。

 にもかかわらず、重要なソフトウェアはLISPで書かれて来ました。
 現在、あらゆるマシンで動作しているHTML5で用いられるJavaScriptは、LISPの派生形です。

 LISPを使いこなすことが最もプログラミングの生産性を高める道である、と考える人たちも居ます。

スクリーンショット 2014-11-18 15.12.25.png

 昔は、LISPしか実行できない専用の40ビットCPUを搭載したLISPマシン、「Symbolics」なんていう機械もありました。

 キーボードだけで100万円以上するという高級機です。

 LISPは実際、一度使い慣れてみるとその魅力に圧倒されます。

 ただ、残念なのは実用的なLISP処理系はたいていの場合有料だったりして、気軽に使えないのです。また、書籍も不足しています。あまりに歴史が長い言語なので、周辺情報が古いものと新しいものが混じって混乱しているというのもあります。

 JavaScriptの良さの大部分はLISPからそのまま引き継がれたものです。

 enchant.jsが効率的にゲームなどのアプリケーションを作れるのも、JavaScriptをベースとしているためです。これがJavaなどの環境だとこうは上手く行きません。

 プログラミング言語は、ファンタジー世界の魔法使いが使うルーン文字のようなもので、それぞれ言語によって流儀が異なり、得意なものと不得意なものに別れます。

 それら複数の言語を効率的に使いこなすことでプログラマーはそれぞれ自分なりの魔術(マジック)を身につけていくのです。

 
 マジシャンの友人とお遊びで手品を作ったことが何回かあります。
 手品を作るというのは、手品を覚える、というのと同義です。

 そして手品を見る、というのは手品を覚えるということとやはり同義なのです。

 というのは、同じ手品を何回も見ているとそのタネにだんだん気付いて来ます。
 だから本来、マジシャンは同じ手品を繰り返さないのですが、毎日のように見ていれば、だんだん、トリックの組立てが解って来ます。

 それでもどうしてもわからないことがあったり、わかっていても訓練の賜物で見事に実現されているのを見て驚嘆し、「凄い」と素直に心から拍手するのです。

 コンピュータのプログラミングもこれと似ていて、プログラミングが一定レベルまでできるようになると既存のゲームやアプリを見ただけで瞬時に「あ、だいたいこういう感じで作られているのかな」と想像することができるようになります。その中で「ここは難しいだろうな」と思う部分を触ってみて、それが見事に解決されていると「凄い!」とやはり感動するのです。

 そのへんにある道具をうまく使ってあり得ない現実を起こすマジシャンと、誰の手元にもあるスマートフォンを使って「こんなに面白い使い方があるのか」と発見するプログラマー、やっぱりどこか似ているのだと思います。

WirelessWire Weekly

おすすめ記事と編集部のお知らせをお送りします。(毎週月曜日配信)

登録はこちら

清水 亮(しみず・りょう)

新潟県長岡市生まれ。1990年代よりプログラマーとしてゲーム業界、モバイル業界などで数社の立ち上げに関わる。現在も現役のプログラマーとして日夜AI開発に情熱を捧げている。

RELATED TAG