## 今月の進捗 12345…… 678910…… そのとき僕はたまたま聴いていた、知らない国のジャズ・ドラマーが陽の落ちるマリブ山脈のてっぺんで、どこまでも広がる空へ打楽器を打ち鳴らしまくる野外ライブ録音の、一曲目の出だしのスネアドラムが何発叩かれているかを心の中で数えながら、ドブみたいな臭いのする地下鉄の階段を下りようとしたところだった。 123……456789…… IT系企業のオフィスが多いその街は、やたら巨大液晶画面が屋外に設置されており、上空から騒々しい音と熱を発しながら夜の暗がりを無差別に照らし続けていたが、地上の人々はそれがまったく見えもしないし聞こえもしない、といった感じで、「とくになし」といった表情で行き交っている。 12345678910111213..14..15... 急いでいるわけでもなく、緩んでいるわけでもなく、急いだところで全く同じ明日が来るのでどっちでもいい、みたいな淡々とした速度の、平日夜の人。酸素薄めな空気。遠くで車が走る音。光。音。光。 12345678910111213………… そのとき突然、後ろから声をかけられ、振り返ると、いつのまにか目の前に、べろんべろんに酔っ払った男が立っていた。 「やあ」「おっす」「へろー」 ごちゃごちゃの繁華街の中にあって、男はただ一人、見たことも聞いたこともない外国の銘柄の缶ビールを片手に、まるでたったいま温泉旅館で浴衣に着替えたばかり、といった陽気さで、幻覚みたいにそこに立っていた。 「きみ、さっきの『Rubyベンキョー会』に来てた人でしょ?」 唐突に、酔っ払いはそう言った。たしかに僕は、ある小規模なRubyベンキョー会に参加した帰りだった。会場にこの酔っ払ってる男もいたのかもしれないけど、見覚えはない。 「ここで帰っちゃうのはもったいない」 酔っ払いは熱を込めて言った。 「君はITギョーカイの経験が浅いから知らないかもかもかもだけど、実は勉強会っていうのはね、酔っ払ってからが本番なんだ」 彼はなんだか瞳をうるませているようにさえ見えた。たぶん、街の空気がマリブ山脈の五百倍は汚染されているためだろう。 「俺も初心者の頃はね、もしかして勉強会って勉強になるのかな? なんて、思っていた頃もあったんだ。だけど、勉強会が勉強になったことは、まあ、一回もなかったね。知らない人の真面目な発表を真剣に聞いてみても、まじでなに言ってんのか全くひとつもわからないか、オフィシャルサイトに書いてあることをわざわざお経みたいに読み上げてるだけか、大抵はそのどっちかさ」 「そんなことないと思うけど」 「ところがどうだろう? 酒を飲みまくり、前頭葉を痲痺させまくることによって、通常の意味ではまったく勉強にならないが、ある意味では非常にベンキョーになる状態へと入ってゆけるんだ。 つまり、初心者の多くは、プログラミングというものはなんかしらんけど海外の偉い人物の書籍や論文、ありがたい経典を紐解くことで上達していくもの、夜寝る前にお祈りとかをしていれば勝手に技術が進歩していくもの、という先入観を持っている。だけど、実際、ソフトウェアエンジニアリングの大部分は、人間が頭の中でだけこしらえた概念を頭の中でもてあそんでるだけ、みたいなところがあるでしょ。誰かのもっともらしい理屈が、いくらつじつまが合っているように見えても、くその役にも立たないことがよくある。いや、むしろ、くその役にも立っていないことに誰も気がついてない、ということさえよくある。 勉強会が勉強にならない理由の一つはそこだね。頭の中で完結した真面目な話をしすぎるせいだ。真面目な話はどれも正しいけど、同時にどれも間違ってる。小説や漫画やフィクションの世界のは、その中ではつじつまが完璧に合っているように感じるけど、現実にはまったく適用できない。そういうものさ。つまりさ、プログラミングっていうのは各々のフィクションが重なり合ってできているわけで、実際にそういうものをベンキョーをするには、五分や十分の真面目な話を一方的に聴くだけじゃだめなんだ。必要なのはこれだよ」 男はまったく、自分でもどこまで本気で言っているのかわからない、といった感じで笑うと、持っていた缶ビールをぐいっとあとった。その缶には、山水画のような繊細な色合いの絵が描かれていた。一本千二百円くらいしそうなそのビールを、彼は明日世界が終わるみたいにぐびっと飲んだ。 ともかく彼が言うには、すぐ近くでベンキョー会の参加者らと一緒にビールを飲むというベンキョーをしており、よかったら一緒にどうか、ということらしかった。今夜は久しぶりに、Ruby界隈でかなりのすごいエンジニアーが同席しており、しかも、そのすごすぎるエンジニアーは既にかなり酒が入っている、つまりかなりベンキョーになる状態に仕上がっている、とのことであった。 大抵の場合において、この業界の人々は、自分への自信のなさの裏返しなのか、知り合いや所属組織などのことをことさら「すごい」「めちゃすごい」などと持ち上げがちである。酔っ払っているならなおさらだろう。そのため「知り合いのすごいエンジニアー」とか言われても一概に鵜呑みにしてはいけない。 しかし、わざわざ追いかけて声をかけてくれた熱意を断る理由が咄嗟に思いつかなかったし、誘ってくれるからにはたぶん、向こうも僕のことや、僕のRuby関連の活動のことを多少は知ってくれているのだろう、などと想像し、自分の取り組みについて意見を聞きたいような、別に聞きたくないような。そんな気になった。 一分後、僕は、壁一面に缶ビールの大型冷蔵庫が設置された、世界中の知らない缶ビールが最後に集まってきた、みたいな、ビールが飲める店の中にいた。天井にはかなり良いかんじのスピーカーが良いかんじの角度で設置されており、環境音のような不思議な音楽が流れていた。 案内された席には、Rubyベンキョー会でみかけた二人の(有名らしい)エンジニアーがいて、僕を連れてきた酔っ払いと合わせて、全員が全員、既にかなり酔っ払っているように見えた。 「やっぱりビールだよね。ビールが一番ベンキョーになる」酔っ払いAが言った。 「ワインは思い出したくないことを思い出しそうになるからだめ。日本酒は言ってはいけないことを言ってしまいそうな危険水域にすぐ達するからだめ。やっぱりビールがいちばんベンキョーになるよね」酔っ払いBが言った。 「好きなビールを冷蔵庫から選ぶといいよ」酔っ払いCが教えてくれた。 ビールの種類はよくわからなかったし、とくに説明が書かれているわけではなかったので、缶の絵がかっこいいかどうか、という基準で選ぶしかない。僕は『ひみつビール』という名前の缶を選んだ。 ぺらぺらぺらぺらぺら。 いずれの酔っ払いもプログラミングを生業とする者として非常に熟練している、あるいは熟練しているような気持ちになっており、なんだかよくわからないがそれぞれの一家言を惜しげもなく披露していた。 しばらくは一方的に「ふーん」「へー」と話を聞いていたのだが、そのうちに 「君は最近はなにをやっているの?」 と、僕にも質問が向けられた。誰も僕の活動とかは知らなかったようである。 「さいきんは、実はC# で mruby VM を実装しているんです」 と、自分のmrubyプロジェクトのことを話に出してみる。 「ほう」 「ふむむ」 「なるほどね」 酔っ払いたちは一体なんのことを言っているのかさっぱりわからない、といった感じで頷いていた。 実は、同じプログラミング言語とはいっても、彼らの慣れ親しんでいるRubyと、話に出したC#とでは、少林寺拳法とコナミスポーツクラブくらいの文化的な隔たりがある。一般に、Rubyユーザーの多くはWeb業界に近いところにいるらしいのだが、実はC#というのは、ある種のWeb業界では存在しないものとして扱われているのである。 その主な理由は、C#の開発母体であるMicrosoftのWebサイトの日本語がたまに壊れていることがまず挙げられるだろう。加えて、Microsoftといえばなんだかやたら有料の契約を勧めてくる感じが鼻につくことの影響も無視できない。かもしれない。 MicrosoftとWebといえば、昔のことが思い起こされる。言い伝えによれば、かつてWeb2.0とか言われた時代、Webサービス周辺技術というのは、自由で開かれたフロンティアーであり、カウンターカルチャーであり、おもしろTシャツを着たハッカーや頭の上で鳥が巣をつくっている仙人たちの牽引する、ファンボーイたちの楽園だったと言われている。そしてその昔、Microsoftは、そうしたカルチャーとは別の、商業主義、独占主義の企業、敵、という雰囲気があったそうだ。 もちろん、現在のMicrosoftは、CEOがナデラとかいう人になって以降、Githubのオーナーになり、クラスプラットフォームなプロダクトを出すようになり、Azure のインフラを Windows Server から自社製 Linux ディストロへ移行するようになり、オープンソースなエコシステムにあれこれ貢献もしている。C#もTypescriptもオープンソースである。 ところが以前として、ある種の人達にとってのMicrosoftは、崩壊した銀河帝国が当時の権威のみで壊れた自動翻訳で辺境ビジネスをしている、という感じのイメージであるそうである。 ちなみに、なぜ、C# が無視されているのに、同じアンダーヘルスバーグ氏の手によるTypeScript のほうはweb業界で普及しているのか、というと、TypeScriptがMicrosoftの手によるものだと知られてないから、というのが定説である。 ともかくこういう場合、一応、十数種類以上はまともにプログラミング言語を使ってきた人間として、不当に評価されがちなC#の良さを一応は伝えてみることにしている。 「いやC#って鬼のように速いんですよ。gRPCベンチマークでRustにすら勝ったことで有名でして、汎用言語の仕様としてはかなりパフォーマンス最適化の余地があるデザインになっている、かつ、言語仕様がまともで書きやすいんです。僕はこのまえ、C#で読み取り専用組み込みDBを書いたらSQLiteの110倍速くてLMDBよりも数倍速くてびびりました」とか、 「いやC#って、2019年くらいに全部書き換えられて、Linuxファーストで、標準ビルドツールでDocker(OCI)メージ焼けるし、非同期I/Oエコシステムは出来あがっているし、僕の知る限り現代のWebの文脈でもモダンなランタイムなんです」とか、 「いやC#って、GoogleがGoをつくってるのと同じで、Microsoftが言語デザインからライブラリから一応、統合的にやっているので、大規模とかクラウドネイティブ文脈の機能を取り込むにも敏感で、実用性高しです」とか、 「いやC#って、書き味と静的解析をバランスしたORMがあるんです。RubyだとActiveRecordが人気ですけど、同じアプローチですね。ほかの言語だとsqlc とかdbファーストアプローチに行ってたりしますけど、C#もRubyみたいなコードファーストでオールインワンなアプローチをトップダウンでやりきってたりするんですよ」とか、 「いやC#て、コンパイラツーツチェインが開発体験を意識してつくられているので、IDEの精度とか、依存ライブラリの解析しやすさとか、けっこうほかと比べても出来が良いんです」とか、とか…… C#の良さについて言いたいことの選択肢がいくつか頭に思い浮かぶ。このときは、どれを選んだのかよく覚えていないが、実はとくに正解の選択肢はなく、Web業界で一方的にこういうことを早口でまくしたてても話が広がることは少ない。 また、その場の全員が酔っ払っていたため、とくに反応は鈍く、 「へー。そうなんだ。しらんけど。なんか急に真面目な話になりすぎじゃない。まだ夜は長いんだから。もっと楽しくビールを飲もうよ」 という空気が場に流れた。 「C#ってぜんぜん聞かないけど、どこで使われているの?」 と、酔っ払いのうちの誰か。 「まあ、そうですね。日本でもゲーム開発だとけっこう使われてます。歴史的に、MicrosoftのDirectXが発達していたことも影響してると思いますが、今はUnityとかGodot とか、人気の汎用ゲームエンジンでC# でゲームを書けるから…」 「ゲームってC++とかちゃうの」 「たしかに」 「むかしからのコンソールゲームは C++ で書かれていたので、その流れを汲む開発者はC++でやってるとは思います。でもたしか、カプコンの内製エンジンもC#でアプリケーション書くやつだったりとかしますし、最近、中国のモバイルゲームは見た目の出来が良いって言われますけど、改造したUnityが使われてるらしいですね」 「ふうん」 「ふうん」 「中国ってよくわからないけど独自のエコシステムだよねえ」 「よくわからない中国語のライブラリに一万スターくらいついてることあってびびるよね」 そんなこんなで話は広がっていき、今日も、Web界隈の人達のもっている、C#とか自分達には関係ないしどこか他所で使われているけどWebでは使えなそう、というイメージを拭うことはできなかった。いつものことである。 やがて話は二点三点し、世間話から業界の話、採用の話、新人育成の話など、酔っ払っているが故の、他人事みたいな真面目な話を経たあと、またプログラミングの話になり、今Webサーバーをつくるときならなんの言語が流行ってるのか? といった、ありがちな話題になった。 Ruby、Python、TypeScript、Go、なぜかRust、といった名前が挙がる。もちろんここにC#の名前が挙がって来ないことは常である。 「TypeScript はそれなりにサーバサイド言語としては欠点がある」 「なんか、Goが一番無難みたいになってるけど、極端に簡素すぎて好き嫌いは分かれがち」 「なんかRustっていうのが流行ってるらしいけど、極端に値のライフタイムを意識しないといけけないからアプリケーション書く言語じゃない」 「JVM は安定しているっていうけどフレームワークがRuby Wayのほうが好きなんだよねえ。まあKotlinはよさそうだけど、使われてるんですかねえ…」 なんら意外性もなく面白みもない、どこでもされているようなつまらないコメントが積み上がっていく。ちなみに最近は、Rubyの新規採用は少ないと思っていたが、使われているところではけっこう使われているらしい。 「Rubyもかなり速くなっているし、相変らずRubyで統一された世界観は他と比べても良さを感じるんだよねえ」 と、酔っ払いCが言った。僕はこの『速い』という部分になぜか反応してしまった。けっこう酔っ払っていたのかもしれない。 「なんか、C10K 問題とか言われてた時代にそれを解決したGolangとnode.jsがなぜか『速い』ってことになってるわけですけど、あれって速いっていうより『Webサーバー書くときI/Oでブロックしない』能力を持っているから普通に書くだけでスループットが出る、ていう話ですよね。だからRubyはJITとかでCPUバウンドな最適化をするんじゃなくて、もっとそういう機能について考えてほしいんですけど……」 「うーん。まあでもべつに大規模なアプリとかべつに書かんしのう」 「わしはリアルタイム性の高い機能とかまったくなくてもなんとかなるしのう」 ビールを飲みまくった結果、全員の脳みそがおじいちゃんになっており、知らないもの、新しいもの話への反応が全体的に鈍い。 「ゲーム界隈だとサーバーってなにで書かれてるのじゃ?」と、誰かが言った。 「まあ、どうなんでしょうね。Web業界の流れを汲んでる人はGoとかもけっこう使うみたいですけど、ゲーム開発に限って言えばサーバサイドC#の事例もけっこうあります」 「ふむ」 「クライアントをC#で書いているケースだと、サーバーもC#で書くメリットはけっこうあったりするんです。いや、メリットというより、言語が統一されることを前提にすると、通信のインターフェイスの考え方を変えることができるんです。 たとえば、TypeScript界隈でも同じことが起きてますよね。tRPCとか、hono RPCとか..? TypeScript型定義をそのまま通信のスキーマ定義として使える、みたいなやつが出てきてます。 つまりそうなるのが自然なんです。 むかしと違って、いまって別に、『誰でもhttpクライアントさえあれば使えるAPIを全世界に公開』みたいなことって、重要じゃないわけです。仮にしたとしても、httpクライアントでAPI叩くとかいうより、APIスキーマからクライアントコードを生成してそれを使うわけじゃないですか。だったら、もはやHTTP仕様にこだわる意味は薄いわけで、もうちょっと現代のアプリケーション層における複雑な動詞をサポートできるRPCのほうがAPIデザインが素直にいきます。HTTPとしてのレイヤーを無視すると、RPC的な発想、つまりマシンをまたいだやりとりも、言語のインターフェイスで定義するコードファーストアプローチが威力を発揮するのです」 なぜか未だにRESTが信仰されているWeb業界において、通常はあまりこういう意見は大して賛同されないし、いろいろと反論も考えられるのであるが、このときはその場の全員の前頭葉が痲痺していたために、そういった文化の壁をすりぬけ、なにかが通じるものがあったらしい。 「なるほどねえ」 酔っ払いAが、遠い故郷を思い出すように天井を見上げた。 「Rubyでも、あれなんだよ。DHHていう人がおってのう」 「あの、Rubyの稼ぎでスポーツカーに乗ってる人だのう」 「うむ。青いスポーツカーじゃのう」 「そのスポーツカーに乗っているDHHも、これだけJavaScript界隈が賑っている現代においても、ぜんぶRubyで統一することをやっていて、開発体験としてはいろいろ別世界の扉を開いているのじゃ」 振り返ると、この瞬間がもっとも酔っ払い達にC#の話が通じた瞬間であったのかもしれない。その後、僕はC#のパフォーマンスについての話などをし始めたような気がするのだが、最終的には、 「ぜんぜんわからんわ。まじで君がなにを言っているのかまったくわからない」 みたいな感じになった、と記憶している。 以上が今月の主な進捗です。 ## MRubyCS 0.50 今月は、MRubyCSにいろいろとアップデートが入りました。 - Procの組み込みメソッドがmruby本家と同等になった - Time,Random、あたりを追加した - コンパイラがmruby-compiler2(prism)になった mruby-compiler2を採用しようとしたら、テストが通らなかったり、コンパイル時にクラッシュするなどの事象に見舞われ、一時保留状態にしていたんですが、なんとLチカは情操教育([@hasumikin](https://x.com/hasumikin))さんが 僕のPostを見てくれて、わずか一日ですべてのバグを修正してくれた。仕事早ーー。大感謝です m(_ _)m そろそろ1.0にしようと思っているのだが、 - cliコマンドラインツールをリネームして repl機能を入れるかどうか迷ってる - パフォーマンスもうちょっと良くしたい といった辺りが気になっている。 とくに前者は破壊的変更になるので 1.0 になる前に決めたい。 あと、最適化を進めています。 何れかのベンチマークでmruby本家に勝ち、C# の本来の実力を示したいところ。 現在、メソッド呼び出しのないベンチマークではかなり良い結果が出始めてます. 四則演算のベンチマーク ``` | Method | Mean | Error | StdDev | Allocated | |------------ |---------:|----------:|----------:|----------:| | MRubyCS | 4.196 ms | 0.2143 ms | 0.1418 ms | 182 B | | mruby/mruby | 4.344 ms | 0.0305 ms | 0.0160 ms | - | ``` マンデルブロ集合のベンチマーク ``` | Method | Mean | Error | StdDev | Allocated | |------------ |---------:|---------:|---------:|----------:| | MRubyCS | 849.8 ms | 8.21 ms | 4.29 ms | - | | mruby/mruby | 874.0 ms | 19.01 ms | 12.58 ms | - | ``` うーんでもメソッド呼び出しのオーバヘッドがなあ。 ## RubyKaigi 2026 Ruby Kaigi 2026 にプロポーザルを出してみたところ、採択されてしまったようです。登壇してきます(たぶん)。 mruby VM の実装の話と、C# と mruby 間の言語間通信の話いろいろ、ゲームと非同期とasync/awaitの話、ゲームでのmruby事例の話、いろいろ話したいことがあります。持ち時間は30分みたいです。本当は5時間くらい話したいんですけど。あと、せっかくなのでRuby/mrubyってもっとこうなったらいいんだけどなあ。みたいな話とかもけっこう色々したいんですよね。 ## そんなかんじなんですが 来月こそ…