プログラミングを中学生で始める

池澤あやか氏(以下、池澤):本日のゲストはRubyの生みの親である、まつもとゆきひろさんです。どうぞよろしくお願いします。

菅澤英司氏(以下、菅澤):よろしくお願いします。今画面を観ているんですが、後ろにけっこう大量の本が置いてありますね。ご自宅ですか?

まつもとゆきひろ氏(以下、まつもと):はい、自宅ですね。

菅澤:自宅とのリモート中継で、話をしていけたらと思います。さっそくRubyの話などいろいろ聞いていきたいんですが、Ruby言語を開発されて、今もプログラミングをされているんですよね?

まつもと:そうですね。

菅澤:言語を作るというのは、本当に究極の開発だと思うんですが、どう作ろうと思ったんですか?。

まつもと:私がプログラミングを始めたのは中学生のときだったんですけど。

菅澤:中学生!?

まつもと:80年代なので、BASICという言語でやっていたんですけど、ストレス溜まるんですよね。それしかないのでこういうものだと思っていたんですけど、本屋さんで本や雑誌を見ていたら、世の中にはBASICの他にもっとマシな言語があるということに気づきました。世の中にはいっぱいプログラミング言語があって、それぞれが意図をもって設計されているわけですよ。

日本語や英語という言語は設計されていないですよね。たぶんいつの間にかできていたと思うんですよ。だけど、プログラミング言語は「こういうことがしたい」「こういう機能があったら便利」みたいに設計されているんですよね。言語を設計するというのにピンと来て、言語を作りたいなと思ったんですよ。高校生ぐらいのときなんですけど。

池澤:高校生で!?

菅澤:すごいですね。僕は高校生のとき、(言語を)作れるとは思っていなかったですよ。

まつもと:(言語を作りたいと)思ったんですけど、1980年代はインターネットがないんですよ。手に入る情報にすごい限りがあって。

菅澤:当時だと雑誌とかですかね。

まつもと:がんばっても雑誌や本しかないので、ぜんぜんスキルが身に付かないんですよね。作りたいと思っても作れないという。高校卒業して、大学に入ってコンピューターサイエンスを専攻して、いろいろ勉強したら言語を作れるかもしれないと思って、習作みたいな言語は、大学にいたときに作りました。

菅澤:習作というのは?

まつもと:試しに小さいおもちゃみたいな言語を作ったんですけど。

菅澤:なるほど。それで作れそうだと思ったんですか?

まつもと:そうですね。作れそうな感触をもてました。実際に卒論でも1個言語を作って、卒業して就職してエンジニアとして働いて2年目ぐらいになって、スキルも身に付いたし「いっちょ作るか!」と作ったのがRubyなんです。

菅澤:めちゃくちゃ若いですね。

まつもと:Rubyを作ろうと思ってから実際に作れるようになるまでに10年ぐらい。

菅澤:2年目に作ろうと思って10年ぐらい準備した感じなんですね。

まつもと:そうですね。17歳ぐらいの高校生のときに作りたいと思って、実際に作ったのが27歳だからそうですね。

池澤:ちなみにRubyの前に作っていた2つの言語はどういう名前の言語だったんですか?

まつもと:名前!?

(一同笑)

まつもと:名前は恥ずかしいので筑波大の情報学類の展示を見にいける人しか教えないということにしているんですけど。

(一同笑)

菅澤:けっこうしっかり動いていたんですか?

まつもと:動いていたのは動いていました。学部の4年生が作ったものなので、今見たらオモチャみたいなものですけど。

Perlを参考にして自分が満足するものを作る

菅澤:Ruby自体はPerlから派生していますか?

まつもと:Perlを参考にしましたね。

菅澤:Perlをけっこう使っていたんですか?

まつもと:いや、あまり使っていなくて(笑)。

菅澤:そうなんですか。

まつもと:私はどちらかというとシェルスクリプトのほうが多くて、Perlをあまり書いていなかったんです。実際にPerlを書けると便利だなとは思ったんだけど、言語的にあまり好きになれなくて。いろいろなきっかけで言語を作ろうという話になったときに、Perlみたいなジャンルを作ったら自分が使うし、作ったはいいけど誰にも使われないのはいやなので、せめて自分だけは使いたいと思って。

池澤:設計をする時に一番気を使った点は何ですか?

まつもと:自分が使っていて満足感がある。結局自分のために作っているので(笑)。

池澤:書いていて気持ちいいみたいな?

まつもと:そうそう! みなさんにそう言ってもらいましたけど、結局は自分がそう思いたいから作ったところがあるので、そう感じる人は私と感性が近いところがあるんですかね。

菅澤:記事でも拝見したんですけど、言語を作っている最中は孤独な戦いでしたか。

まつもと:うーん...孤独。共感はあまり得られないですよね。普通の人は言語を作ろうなんて思わないので(笑)。

菅澤:使うもので作るものではないですよね。

まつもと:「言語をこう直そうと思うんだけど」と言うと、「何言ってるのあんた」と言われるわけですよね。だいたいの人はどんな言語がほしいかと聞くと、存在する言語を言うわけですよ。Pythonがほしいとか、Perlがほしいとか。その中で新しい言語を作って、「その言語には好きな言語機能が入れられるんだけど、どうしたらいいと思う?」と聞かれても、「は?」という感じなんですよね。

(一同笑)

池澤:確かに言語に不満があるときに「本当にいいと思うんだけど、あそこが不満なんだよね」という話はできますけど、「まるっきり新しいデザインの言語を作りたいんだけど、どんな機能がほしい?」と言われても、「へ!?なんで作るの?」という。

菅澤:不満は言えるけど、どうしたらいいかというのはなかなか思いつかないですよね。

まつもと:職場の人と不満の話をしていると、すでにある言語なんだけどちょっと違うものがほしいという話になるわけですよね。そういう話をしているんじゃないんだけど…みたいなことにはなりがちですね。

半年かけてやっと動いた"Hello, World!"

菅澤:そのあとの10年間で、ちょっとずつアイデアとか着想を得ていたんですか?

まつもと:そうですね。プログラミング言語はもともと好きだったので、こんな機能があったらいいなというのはいくつか残っていて、今のRubyにつながるものはたくさんありますね。例えば、オブジェクト指向という考え方はすごくいい考え方だなと思っていたので、これを取り込みましょうとか。ここまで技術の話をしてもいいんですかね?

池澤:いいですよ。

菅澤:ガンガン。

まつもと:言語のネタの話をすると誰も付いていけないところまでいきそうな気がするんですけど(笑)。

菅澤:いきましょう。

まつもと:RubyにはMix-inというモジュールをincludeする機能があります。この機能はバイト言語のCommon Lispというか、Flavorsという名前のLISPの方言から来ているんですけど、このアイデアはすごくいいから自分の言語に取り込もうとかですね。

池澤:確かにRubyは書いていてすごく気持ちがよくて、気持ちよさの原因の1つが私もオブジェクト指向にあるのかなと思っています。例えばcase文とかif文とかあるじゃないですか。あれがオブジェクトになっているので、そのまま変数に代入できるんですよ。

菅澤:説明が難しいな(笑)。

池澤:case文で出力するべき結果が、その変数に代入できるので、テンポラリの変数を使わなくてもすごくきれいなプログラムが書けるんです。

菅澤:なるほど。けっこう昔のルールでは、宣言とか何とか余計なことをいっぱい書かないといけないみたいのがありましたが。

池澤:〇〇-tmpみたいな謎の変数がいらないのは、すごく書きやすくてありがたい。

まつもと:その辺はたぶんLISPという言語から受け継いでいるんです。

池澤:へー。

まつもと:LISPが全部式なので、LISPもifとかに値があるんですよ。そういう値がない言語だと、ifの両方で同じ変数に代入しないといけないんですけど。

池澤:そうなんですよ。「めっちゃ汚い」ってよく。

(一同笑)

菅澤:半年ぐらいかけて作られたと書いてあったんですけど。

まつもと:"Hello, World!"が動くまで半年(笑)。

(一同笑)

菅澤:"Hello, World!"が動くまで半年!?

まつもと:1993年の2月に作り始めたんですけど、print "Hello, World!"というのが動くためには、"Hello, World!"は文字列だから、文字列がいるんですけど、文字列はオブジェクトなんですよ。まずはオブジェクトを作る機能がいるし、それからStringクラスがいるんですね。Stringクラスはオブジェクトのサブクラスだから、オブジェクトのクラスを作らないといけないし。

(一同笑)

まつもと:他にも、printはRubyだとメソッドなので、メソッド呼び出しの機能がいるんですよね。言語があってprint "Hello, World!"と書くのは10秒かからないですけど、自分で言語を作り始めるとそれが半年ぐらいかかっちゃう(笑)。

菅澤:"Hello, World!"が書ける言語設計まで、それで何割ぐらいですか?

まつもと:print "Hello, World!"でできることは本当に何もないですしね。半年の時点で2割、3割、そのぐらいかな。

池澤:え!? でもそんなにできていたんですね。

まつもと:いっぱいオブジェクトを作るとメモリをたくさん使ってしまうので、使わなくなったオブジェクトを回収する、いわゆる“ゴミ集め”をするためのライブラリがあるんですけど、そのライブラリをincludeしたら落ちちゃったんですね(笑)。

菅澤:集めきれなかった感じか(笑)。

まつもと:僕の書いた言語のプログラムと、ゴミ集めライブラリの相性がすごく悪かったみたいで、どうやってもそのバグが直せなかったので、「仕方ない、自分で書くか」といって"Hello, World!"の次はガベージコレクタを書き始めて。

職場でこっそりRubyを開発

菅澤:その半年間は"Hello, World!"にかかるじゃないですか。心が折れなかったですか。

まつもと:止まっても誰にも迷惑をかけないので。

菅澤:そうなんですよね(笑)。

まつもと:誰も知らないので。

菅澤:誰も待っている人がいないんですよね。

まつもと:やめても誰にも迷惑かけないですよね。今日はこのprint "Hello, World!"までやろうとか、今日は文字列をもうちょっと長く続くようにしようとか、ちょっとずつやろうみたいな。それを2年ぐらい続けていたら使えるレベルになりました。

菅澤:27歳から2年かけて。

まつもと:正確に言うと1年10ヶ月ぐらいである程度は動くようになって、インターネットで何人か人を集めて限定公開したんですよ。その人たちの意見を聞きながらRubyを改善していって、それからちょうど1年後の1995年の12月にインターネットで「Rubyという言語を作ったんですけど公開します」と言いました。

菅澤:3年がかりなんですね。

まつもと:約3年ですね。

菅澤:その間、昼間も普通の仕事はあるんですよね。

まつもと:そうですね。開発の途中で転職しましたけど。

菅澤:そうなんですね(笑)。

池澤:むしろけっこうその会社のサーバーを使って公開をしていたという話をお聞きしたことあります。

菅澤:そうなんですか(笑)。

まつもと:もう時効だから言いますけど。

(一同笑)

まつもと:新卒で就職した会社でRubyを作り始めたんですけど、バブル崩壊のちょっと前ぐらいの就職なんですよ。すごく景気が悪くて仕事がないんですよ。もともとは開発したプログラムのメンテナンスをするという触れ込みでプロジェクトに配属されたんですけど、そのプロジェクトもキャンセルになって、チームも全部変わっちゃって、2人だけ残された内の1人になってしまって、正直あまりやることないんですよね。

新規に開発しちゃいけないと言われていたし、何するのかといったら待つだけですよね。たまに「お宅のチームのソフトが動かないんだけど」という電話がかかってきて。

菅澤:そういう感じなんですね。

まつもと:状況を聞いて、「はい、わかりました。じゃあコンピューターの電源を入れ直してください」。以上、終わり。

(一同笑)

まつもと:しかも電話は2日か3日に1回ぐらいしかかかって来ないんですよ。

(一同笑)

池澤:めっちゃ暇やん!

まつもと:めっちゃ暇なので、インターネットでネットニュースを見ているか、あとは自己研鑽といって勉強しかやることがないので、時間はあるし何かやろうかなと思って。

コンピューターは取り上げられなくて、目の前にUNIXワークステーションというのが1個あったので、それで何かやるかといってこっそり開発したのがRubyだった。だけど、あまりにも景気が悪いので、この会社は危ないんじゃないかと思って転職をして、転職をするときに上司のところに行って「すみません、今までこんなソフトウェアをこっそり開発していたんですけどどうしましょうか?」と言ったら「わかった。見なかったことにするからもっていけ」と言われて(笑)。

(一同笑)

菅澤:なるほど(笑)。

池澤:その上司が「ダメ」と言っていたらRubyはなかったかもしれない(笑)。

まつもと:それで、それをもって次の会社に行って、そこでインターネット公開したという感じですね。当時はまだ1995年とかなので、新しいプロジェクトを作ったときにWebページがいるという話になっても、誰もちゃんと見ていなかったんですね。管理者にお話をして「ごめん、ディレクトリを1個作って自分のためにちょっと使ってもいい?」と言ったら「うん、いいよ」と言ってくれて、それはすごくよかったですね。

(一同笑)

池澤:ゆるい!

菅澤:いい時代ですね。

まつもと:その下に会社名/Rubyというディレクトリを作って、Rubyのことを紹介するページを作ったらそれなりにアクセスが集まって会社の上司が喜んでいるんですよ。「なんかうちの会社のホームページのアクセス数が急に伸びたんだけど」と。「たぶん半分は僕です」と。

(一同笑)

菅澤:後半は、その辺りがどう広まっていったかという話をもう少し聞けたらなと思います。