WASMによって公開できる境界が変わった

5 min read

Image

RubyKaigiに参加してから、WASMが少し気になる存在になっていた。

以前の自分にとってWASMは、ブラウザ上でRustやGoを動かすための技術くらいの認識しかなかった。便利そうではあるけれど、どちらかといえば特殊用途寄りのものだと思っていた。

ただ、今年のRubyKaigiではWASM関連の話題をかなり多く見かけた。

AIやpicorubyも印象に残っているが、個人的には「WASMが普通に使われ始めている」という空気感のほうが強く残っている。

特定の発表に影響を受けたというより、イベント全体を通して「もうこれは一部の実験的技術ではないのかもしれない」と感じた。


実際に色々試していく中で、WASMは自分が思っていたよりかなり扱いやすかった。

特に面白かったのが、Railsと組み合わせたときの構造だった。

自分は普段、Railsを使ってスクレイピング系のアプリケーションを書くことが多い。ただ、この手のアプリケーションはOSS化がかなり難しい。

もちろん、Railsアプリケーション自体を公開するだけなら誰でもできる。

実際GitHubには大量のRails製OSSがある。ただ、その多くはtutorialをなぞったような構成だったり、未完成だったり、あるいは独自実装が強すぎて他人が理解しづらいものだったりする。

個人的には、RailsのOSSとして本当に価値があるのは、37signals系のプロダクトのような「お手本ではあるけれど、教科書的すぎない実装」だと思っている。

癖が少なく、設計が整理されていて、他人が読んだときに「こう書けばよかったのか」と自然に理解できるようなコードである。

それはかなりセンスが問われる。

少なくとも自分は、これまでずっとそういうRailsの実装を探し続けていた。


ここ数年で、その状況も少し変わってきた。

以前はDHHの書くRailsコードというのは、ブログ記事や断片的な紹介から想像するしかなかった。

しかし最近は、Basecamp系のOSSが実際に公開され始めている。

FizzyやWritebookのコードを見たとき、自分が長年「Railsっぽさ」として追いかけていたものに、かなり近い感覚があった。

サービスクラスやPresenterのような、いわゆる“Railsらしい設計論”を延々と追い続けてきたけれど、実際のコードを見ることでようやく少し輪郭が掴めた気がした。1


ただ、自分自身のRailsアプリケーションをそのままOSS化したいかというと、正直そこまで強い気持ちはない。

特にスクレイピング系の実装は難しい。

スクレイピングという言葉にはかなり強い拒否感を持つ人も多いし、公開することで余計なリスクも増える。

たとえば、特定サイト向けのスクレイピング実装をそのまま公開するのは、かなり危うい。

もちろん相手サーバーに過度な負荷をかけないようにsleepを入れたり、同時アクセス数を制御したりはしている。それでも、誰でも実行可能な形で配布されると話が変わってくる。

スクレイピング自体というより、「特定サイトを対象にした実装」を配布可能にしてしまうことが問題になる。

だから自分としても、その部分までは公開したくなかった。


ただ、WASMを試している中で、公開できる境界を分離できることに気づいた。

今の構成では、Rails側にWASM pluginをアップロードできるようにしている。

スクレイピングの実装そのものはWASI pluginとして分離し、RailsはHTTPクライアントで取得したHTMLをWASMに渡す。WASM側はHTMLを解析してJSONを返すだけでいい。2

TinyGoを使うとHTMLパーサーはかなり簡単に書けた。

そして、この構成は想像以上によかった。

以前はRailsとGoを連携するために、それぞれ別サーバーを立てていた。Goのデプロイ自体はかなり簡単だけれど、手動デプロイを自動化するためにCIを設定する必要がある。

でもWASMにすると、Goサーバー自体が不要になる。

HTTP通信もgRPCもいらない。

Railsが直接WASMを実行し、文字列を渡して文字列を受け取るだけで成立する。

かなり衝撃的だった。


そして、この構造が面白かったのは、単に実装が軽くなったことではない。

「公開できる部分」と「公開したくない部分」を自然に分離できたことだった。

Rails本体や実行基盤は公開できる。

一方で、特定サイト向けのスクレイピング実装はWASM pluginとしてローカルに保持できる。

つまり、「スクレイピングサイト」を公開するのではなく、「スクレイピングを実行する仕組み」を公開できる。

この境界設計は、今まで自分が抱えていた問題にかなり綺麗にはまった。


もちろん、今すぐOSS化したいわけではない。

そもそも需要がない状態で公開しても、個人的にはあまり意味がないと思っている。

ただ、以前より「公開可能な構造」が見えるようになったのはかなり大きい。

全部をオープンにする必要はないし、全部を隠す必要もない。

その間に、ちょうどよい境界を作れる。

最近のWASMは、そういうことができる技術になってきている気がする。


それと同時に、最近は「何をOSSとして公開する価値があるのか」も少し変わってきた気がしている。

個人的には、Railsアプリケーション全体を公開するより、CSSやJSのコンポーネントのような、小さくて再利用しやすいもののほうが、今は嬉しい気がしている。

アプリケーション全体はどうしても文脈に依存する。

でもUIコンポーネントは、もっと気軽に使える。

だから今後もし何か公開するとしたら、むしろそういう方向なのかもしれない。

まだ考えはまとまりきっていないけれど、少なくともWASMを触り始めてから、「公開できる境界」について考えることはかなり増えた。