本記事では、「OSS応援企画」として記事の最初と最後に「応援ボタン」を設置しています。1回の応援につき、Findyが100円をOSS団体などへ寄付し、エンジニアの成長とOSSの発展を応援する取り組みです。開発者の想いや取り組みに共感した気持ちが、OSSの支援にもつながっていく、そんな前向きな循環をFindyは目指しています。「応援ボタン」は、1日1回まで押すことができます。記事を読んで「いいな」と感じたら、ぜひボタンを押してあなたの応援の気持ちを届けてください。
こんにちは。めもりー(@m3m0r7)です。普段はCTO業を担う傍ら、OSS活動をしています。
小学5年生でプログラミングをはじめ、その沼にどっぷりつかりました。その熱は、齢30を超えた今でも衰えることを知りません。
私は、自分の欲求を満たすために、ひたすらコードを書き続けてきました。かれこれ生み出したコードの量は計り知れません。
そんな私が、どのようにOSS活動をするようになったのか、お話ししたいと思います。
より難しい課題を解いて、刺激を欲するようになっていった
遡ること学生時代。2000年代初期はインターネット黎明期、平成真っ只中でした。学校では、面白フラッシュ倉庫の話題はあれど、パソコンの話なんてほとんど出てきません。今話題のアイドル、ドラマ、映画。そういった話が輪の中に入れる時代です。
輪に入れなかった私を救ってくれたのは誕生日に懇願して買ってもらった1台のパソコンでした。当時私はインターネットに魅了され、やがてプログラミングに心を奪われていきました。
最初はHTML/CSSからはじめ、Perlを書こうとするも挫折。調べていくうちに、PHPというマニュアルが豊富なプログラミング言語があることを知ります。
無我夢中になってメモ帳にHTML/CSS/PHPを書き続けました。書くというより、あれは一種の衝動だったのかもしれません。ただ自分の気持ちを、その思いを衝動に任せて、色もない世界に彩りを加えていく。無から何かをつくり出すという行為は、退屈だった人生に色を与えてくれました。人類をつくった創造神もそのように感じていたのかもしれません。
小さな芽を生やしたら、次はもっと大きな木をつくりたくなる。一つつくったら終わりじゃない。私は次第に、もっと難しい課題を解きたいと思うようになります。もっと頭を抱えたい。もっと悩みたい。そして、悩み続けた先で点と点がつながった瞬間に、一気に視界が開ける。あの感覚を、脳が欲するようになっていきました。
周りにプログラミングの話をしている人はいません。両親でさえも例外ではありませんでした。ディスカッションできる相手はいない。それでも、もっと高みを目指したい。その気持ちには拍車がかかる一方でした。
気づけば中学生を超えたあたりから、マニュアルをほぼ見なくてもPHPでウェブアプリを構築できるくらいには、関数やクラスを覚えすらすら書けるようになっていました。あのタイピングすらおぼつかなかった小学生時代、ローマ字の対応表を見ながら必死に打っていた頃からすれば、大きな成長です。
しかし、やがてプログラミングが面白くなくなります。何も閃かない。何もしたくない。面白くない。その刹那は刹那であるのにやけに長い。ひどく退屈でした。いわゆるスランプです。自分自身のコーディングの限界を、うっすらと感じはじめていました。
そんなとき、ネットサーフィンをしているとHTTPサーバー自作の記事が流れてきます。近いようで遠い存在でした。どうせC言語でしかできないでしょ。そう思っていました。
でも記事を読んでいくうちに、PHPでもできそうだとわかりはじめます。stream_socket_server。いつ使うかわからないような関数です。でも私はその存在を知っていました。ここでも点と点がつながったのです。「そうか、stream_socket_serverを使えばつくれるじゃないか」と。
Web専用の言語とさえ言われていたPHPで簡易HTTPサーバーをつくり、「Hello World!」がブラウザに表示されたときの喜びは計り知れませんでした。スランプなんてものを忘れてしまうくらいには、私はまたプログラミングの世界にのめり込んでいきました。
OSS活動だと思っていなかった
2010年。情報科を併設している高校へ進学しました。情報の講義は、私にとってはただの退屈な時間でした。周りが授業で苦しんでいる横で、私は「次は何をつくろうかな」「どんなコードを書こうかな」と、そんなことばかり考えていました。
そして1年ほど経った頃、GitHubという存在を知ります。そこには私の知らない世界が広がっていました。知らない人が、英語で、自分の書いたプログラムを公開しているのです。しかも一人だけではなく、何千、何万の人がです。
私も便乗するために何かしらコードを書いて公開しようと決意します。とはいえ、普通のことをやっても面白くない。悩んだあげく考えたのは「PHPで書かれたCSSパーサーを実装する」ことでした。そして形になったコードをGitHubで初めて全世界に公開した初作品でもあります。この作品は当時の私にとっては初めてのパーサー自作であり難易度の高い取り組みでした。
今でこそコンピュータサイエンスの知識はありますが、当時はそんなものほとんどありません。
そんな中で振り絞った知恵が「正規表現でどうにかこうにかする」でした。気合いです。かなり力技でした。
そして、今思えば、GitHubへの公開は邪な動機でした。OSS活動というより、自分の知識をひけらかしたい、誰かに褒められたい、そんな欲求のほうが大きかったです。
「私はこんなことができるんだぞ、お前らはどうだ?」と言わんばかりに。まわりが自分より劣っているとさえ思っていました。
自分のほうがわかっている、自分のほうが上だと、どこかで思い込んでいたのです。今振り返ると、だいぶ尖っていたと思います。
公開してから数日、CSSのメディアクエリが正式勧告され、入れ子に入れ子を加えることが可能になります。つまり今までの単純な構造では済まなくなります。全くもって想定外でした。でも私の気持ちは絶望というより快楽が上回っていました。
「やるじゃんか……」
強敵を前にしてワクワクする、孫悟空みたいな感じです。正規表現だけでは太刀打ちできないとわかり、トークナイザを自作しはじめます。まさか、このときの経験が後のLexer/Parserの実装に役立つとは想像もしていませんでした。
CSSパーサーと並行して次の目標を探していると、策定中だったWebSocketという技術を発見します。難しいことはわかっていました。でも、見つけた瞬間に思ったんです。
「これだ!!」と。
すぐにNetBeansを起動して、PHPでWebSocketサーバーを書きはじめました。この頃にはもうメモ帳から卒業して、IDEから離れられなくなっていました。NetBeansは重たい。でも、補完やハイライトの恩恵は画期的でした。メモ帳で続けていたら、挫折していたかもしれません。
それでもWebSocketは難しかった。今まで挑戦してきたゴールの比ではありません。RFCは英語で書かれており、中学英語や高校英語レベルでは太刀打ちできない専門用語が往々にして出てきます。英語には若干の自信があったのですが、全く歯が立ちませんでした。
しかも当時のWebSocketは、ブラウザごとに挙動がまるで違いました。Opera、Firefox、Chrome。3種類すべてで、プロトコルレベルから差異がある。AIもなかった時代です。RFCを部分ごとにGoogle翻訳へかけながら、トライアンドエラーを繰り返していました。
学校でアイデアが閃いたら、帰って試す。行き詰まる。もう無理だと思い、しばらく離れる。ある日、ふとまた閃く。その繰り返しでした。そうやって試行錯誤を重ねて、ようやく外部に公開できるところまでこぎつけました。
数日後、GitHubから通知が届きました。なんと、たくさんの方からスターをいただけたのです。OSS活動のつもりでもなく、ただ自己満足でやっていたのに、見てくれていた人がいた。声援をもらえたような気持ちになりました。
「これがOSS活動なんだ」と認識しはじめたのは、この頃です。
PHPで書いたJVMが、色んな方の人生に刺激を与えられた
やっとプログラミングをちゃんと体系的に学べる。自分の知らない世界が、もっと広がる。コンピュータ工学を併設している大学に進学したときは、そんな淡い期待をしていました。
でも、実際に入ってみると、私が感じたのは高揚感ではなく退屈でした。もちろん学びがないわけではない。でも、私が経験した人生のほんのわずかな切り取りを、数年かけてゆっくりなぞっている、そんな感覚だったのです。私が欲しかったのは、もっと一気に世界が開けるような刺激でした。
結局、大学生活にも馴染めず、このまま大学にいても得られることは少ないと考えるようになりました。
そして大学1年の終わり頃、高校時代からアルバイトしていた会社にそのまま就職することを決めました。
仕事はハードで、終電帰りも当たり前。気づけば満身創痍で、食事を摂ることさえ億劫に感じるようになっていました。
それでも唯一継続していたのが、プログラミングです。キーボードに指先が触れたとき、全身にドーパミンが駆け巡り、高揚感が生まれる。蝕まれていた精神が、少しずつ浄化されていく。無機質なのに心を満たしてくれるものは、私にとってプログラミング以外にありませんでした。
色んなアイデアが頭の中に浮かびは消えを繰り返しているうちに、実現したいアイデアを閃きます。「PHPでJVMを書いてみる」ことでした。JVMを書きはじめたのは、WebSocketのときと同じように、実装方法を記載した丁寧なマニュアル、Java Virtual Machine Specificationがあったからです。
もちろん簡単ではありません。スタックマシン、コンパイラ、普段使わないようなJavaの知識。さらにPHPでは、他の言語なら簡単でも素直には表現できないものがたくさんあります。代表例は「符号なし64bit整数」です。PHPの整数はすべて符号ありのため、純粋に半分足りません。
簡単に表現できるはずなのに表現できない。そんなもどかしさは、私にとってむしろよくできたRPGのようでした。ノーマルモードではなく、ハードモードを選ぶ。レベリングを重ね、強い武器を手に入れて、少しずつ先へ進む。そういった感覚に近かったのです。
そして、Hello World!が動くJVMをPHPで書き上げました。しかし、達成した途端にまたスランプに陥ります。ゴールが見えてしまうと、急に興味が薄れてしまう。JVMのカバー範囲を広げることもできたはずなのに、もっとインパクトのあるものをつくれないと「おもしろくない」と思ってしまう。そんな時期が続きました。
それから数年が経ち、転職も経験しました。ある日、上司に背中を押され、PHPカンファレンス仙台2019で初めて登壇することになります。
そこでPHPerKaigi主宰の長谷川さんに、PHPでつくったJVMを「面白い」と思っていただき、人前で発表する機会をPHPerKaigiでいただけました。
何度かJVM関連で登壇すると、バズり、スターも400を超えました。RubyやEmacs、Goで実装するような猛者も現れはじめ、「JVMの資料、面白かったですよ!」と色んな方から声をかけていただけるようにもなりました。
OSSを通じて、自分に近い属性の人と出会い、技術の話が弾み、人生が大きく変わったのです。
昔は、自分の快楽のためにただ衝動的につくっていました。でも今は少し違います。誰かが面白がってくれて、刺激を受けてくれて、そこからまた新しい何かが生まれる。そんな連鎖を信じて、今でもニッチなOSSをつくり続けています。
AIが出ても、自分の手で書いて刺激を求め続ける
がむしゃらにアイデアを具現化していた頃から、長い月日が経ちました。今は当時とは立場も違うし、なにより家族もいるため、自由に使える時間は限られています。
そんな中AI時代に突入しました。思いついたアイデアが実現可能かどうかを試すのは、昔とは比べものにならないほど楽になりました。おかげで、限られた時間でも創作にかける密度を落とさずに済んでいます。
それでも、自分が部分的にでも手を動かすことだけは今も変わりません。AIがどれだけ発展しても、そこだけは譲れないと思っています。
AIの出力は丁寧で合理的です。でも、合理的すぎる。そこに遊びや、試行錯誤の跡や、歴史を感じにくいことがあります。
人は完成品だけでなく、それがどうつくられたか、その過程にこそ価値を感じることがある。「自分でもできそう」「やってみたい」と思えることにも価値がある。合理性だけでは説明しきれない、そういう人間くささを、私はやっぱり大切にしたいのです。
自分のOSSを見てくれた人の人生に刺激を与え続けたい。だからこそAIは活用しつつも、最後は自分の手でつくり、私のカルチャーや歴史が感じられるものを残し続けていきたいと思っています。
OSS活動は自己表現能力を高めてくれる
直近では、PHPで書いたRubyVMであるrubyvm-on-php、OSを実装したphp-os、qemuのようなx86_64エミュレータであるphp-machine-emulatorなどをOSSとして公開しています。最新作は、Rustで書いたWindows 32bit DLLや実行ファイルのランタイムをエミュレートするpe-vmです。
最初はphp-machine-emulatorの延長で考えていたのですが、実際にはWindowsにビルトインされているDLLやレジストリなども扱う必要があり、単なる命令実装では済みませんでした。想定よりも実装範囲はずっと膨大だったのです。
それでも、Hello Worldの出力はもちろん、Vectorで配布されている32bit DLLライブラリを片っ端から試したところ、ほとんど動作しています。他には、まだ公開できていないものとしては、RustでPHPコードを中間コードに変換して実行するnyanpの開発も進めています。部分的ではありますが、PHPランタイムでそのまま実行するよりも15倍ほど高速化できており、自分でも驚いています。
このように、アイデアが尽きることはありません。思いついたらすぐにリポジトリをつくり、AIのサポートも受けながら、OSS活動を続けています。
アイデアは、思いついただけではまだ価値になりません。それを具現化し、誰かに届いて、はじめて価値が生まれます。そのためには学び続け、手を動かし続けるしかありません。挫折やスランプもあります。でも、それを越えるたびに自己表現能力は高まっていきます。
最初は動機が邪でもいいんです。自分の快楽に正直になる。まずはコードを書いて公開する。その一歩が、あなたの人生を変えます。
あるきっかけで、色んな人の目に留まり、OSS活動が報われるときはきっと来ます。
まずは、はじめの一歩を踏み出して、OSS活動に取り組んでみませんか。

