進んで参加していたっていう感じです。
そのあたりの話をするうえで、私のWebとの馴れ初めを語らせてください。初めてWebに触れたのは小学生のころで、兄のノートPCを使ってオンラインコミュニティに参加していました。そのうち自分でもそういう場を作りたいと思い、CGIを使ったWebページを作ったのがソフトウェアエンジニアになるきっかけでした。その流れで大学は情報工学科に進みました。
大学では2冊の本にとても影響を受けました。1冊目が梅田望夫さんの『ウェブ進化論』( ちくま新書)で、Webの可能性に感銘を受けました。もう1冊が『Googleを支える技術 』( 技術評論社)で、そこで並列分散システムに興味を持ち始めたのが転機となりました。
大学院ではRubyの高速化やプロセス間通信機構の研究をしていました。最近Ruby 3でGuild [3] が盛り上がっていますね。RubyのスレッドってGiant Interpreter Lockによって実質1スレッドしか動かないのですが、それを踏まえて新しい並列処理機構を入れていこうという流れがあって、その前身となるような研究をしていました。具体的には軽量で安全なプロセス間通信機構があれば、スレッドじゃなくてもプロセスを使った並列処理が効率的に行えるんじゃないかっていうものです。
竹馬: 最近中川さんがやっているService WorkerやWorkletってそういう感じですよね。
中川: ほんとそう(笑) 。Webへの期待や大学での研究、システムソフトウェアへの興味が合わさった先、それがWebブラウザだったっていう感じですね。
Chromiumの開発により参加しやすく
竹馬: Chromiumってすごい巨大なプロジェクトじゃないですか。どういうところが大変ですか。
中川: 最新動向を把握するのが大変ですね。調べたところ、この1週間で1,800コミットされていました。本当に巨大で動きの速いプロジェクトです。
竹馬: 外野として見ていると、機能で検索すればたしかに出てきて、なんとなくはわかるんですが、手もとでビルドするのが大変だからパッチを書くところまで至らないってのが感想です。実際どうやっていますか。
中川: プロジェクトにはさまざまな会社や個人が集まっているのですが、みなさんいろんな高速化手法を使われていますね。たとえばGoogleはGomaというクラウドコンパイラを使っていますし、ほかの会社でも並列分散コンパイルしているようです。最近だとJumboという高速ビルドのしくみが導入されたり、いろいろ工夫しています。
竹馬: 読むときの勘所ってありますか。
中川: レンダリングエンジンに興味があるのであればBlinkを読めばよいと思いますし、プロセスモデルに興味があるのであればContent [4] と呼ばれている部分ですね。たしかに初めての人には難しいと思います。私自身苦労しているので、自分の知見や経験はなるべくブログ記事に残すようにしています。あとは標準化周りのキーパーソンをウォッチするのが一番かなって。私の周りだとDomenic とかですかね。
Chromiumコミュニティはすごいインパクトのあるおもしろいコミュニティなので、できる限りみんなが参加しやすいような環境を整えたいなと思っていますね。
新しい一歩を踏み出すことの難しさ
竹馬光太郎氏
竹馬: ServiceWorkerとかWorkletってブラウザに新しい概念を足す、新しい一歩を踏み出すものじゃないですか。その特有の難しさがありそうだと思っています。
中川: そのとおりで、ServiceWorkerは今までとはまったく違うライフサイクルを持ち込むので、心配ではありました。その分たくさんテストを書いたり、ブラウザベンダ共通のWeb Platform Test っていうしくみがあって、そこにみんながコントリビュートする中で、仕様レベルや実装レベルでの問題が潰されていきました。
竹馬: 自分が作った機能が使われているのってどういう気持ちで見ていますか?
中川: 反応はいろいろありますよね。称賛してくれる人もいれば、こんな機能はいらないっていう人もいる。そういうの全部ひっくるめて楽しみのひとつではありますね。世界の見知らぬ人が自分の作った機能についてプレゼンしてくれている資料を見かけると、とてもうれしくなります。
竹馬: Chromiumへのバグ報告、どうやってよいかっての悩むことがあるんですが、中の人的にはどう思っていますか。
中川: バグレポートってレポーターの人ももっと讃えられるべきだと思っていて、その人のプレゼンスを上げる方向に働くとよいなと思っています。それが行き着いた先がバグバウンティプログラム[5] だと思うんですよね。そこまで専門的なものじゃなくても、見つけたものはその人の成果なんです。ただ、自分がバグを見つけたときの立場に立ってみると、やっぱりバグトラッカーに書くのって心理的な障壁が高いと思うんですよね。
竹馬: そうですね。僕もたぶん書けるバグがいくつかあるはずなんですけど、書いてしまうと責任を持たないといけない気がして、ちょっと避けたい気持ちがあるっていうのは正直なところですね。
中川: 何も書かれないよりは何か怪しい挙動を見つけたらどこかに書いてもらうのがうれしいです。たとえちょっとしたことでも、みなさんからのフィードバックはとてもありがたいです。
注目はOff-the-main-thread
中川: Extensible Web Manifesto によってローレベルAPIが出そろい、今度はそれらをもとにハイレベルなAPIを提供しようじゃないかという動きがあります。これをLayered APIs と呼んでいます。試験実装として今のところVirtual ScrollerとAsync Local Storageがあります。よく使われるライブラリはブラウザ内部で持っておくことでローディングのコストを抑えるっていうのがモチベーションのひとつですね。
竹馬: たしかに、browserify/webpackが出て、複雑なものが作れるようになった反面、バンドルサイズが肥大化する一方で、同じような課題感はあります。スクリプトの評価実行コストが重くなってきて、貧弱なCPUのモバイル環境が厳しいってのがあります。
中川: トレンドが2つあって、ひとつが今言ったExtensible WebからのLayered APIsで、もうひとつがPWA(Progressive Web Apps )です。もともとWebはドキュメントプラットフォームだったものがアプリケーションプラットフォームへと進化してきたのですが、PWAによってその流れが一段と強くなりました。もちろん「これからはPWAを作らなきゃいけない」という話ではなく、あくまでも目的を達成する手段を増やすところが大事だと考えています。
竹馬: 開発者として、速度と実現するものの複雑さという2つのゴールを両立させるのが難しいと思っているんですが、そのあたりはどうですか。
中川: PWAでWebの機能面はかなり進歩しました。それと並行して最近話題に挙がるのがWebのパフォーマンスやクオリティを高めたいという話で、Off-the-main-threadというのがそのひとつのテーマになっています。JavaScriptは基本的にシングルスレッドで動くわけですが、あらゆる処理が同じスレッドで動いちゃうんでスレッドが忙しくなってUI(User Interface )が止まる。それを排除する手段として別スレッドを使えるように整備していくっていうムーブメントです。マルチスレッド化することが目的というより、メインスレッドを空けたいというのがモチベーションです。
竹馬: 重い処理はWorkerに逃がしたいですよね。ただ、そのWorkerを使うプラクティスがコミュニティ側で成熟していないのが実情だと思います。でも、何か1つブレイクスルーがあったら、たとえば2005年のDOMに対するjQueryみたいなもの、Workerに対する取り回しの良いラッパーがあれば流行るかも、ぐらいの気持ちがありますね。
中川: 使いやすさを向上させたいっていう話があって、今はWorkerを起動するのにファイルを指定したり、データを渡すのに使うpostMessageが使いづらいって
話があります。それに対してJavaScriptで構文的なブロックとして実行すべきタスクを渡す仕様の提案とかもありますね。JS blocks というんですけど、別の仕様提案と併せることで、クロージャを渡すような感じで別スレッドでタスクが実行できる。処理系自体がネイティブにスレッド間で環境を送る手段をサポートするというのは良いと思いますね。JavaScriptってWorkerとドキュメント側で完全にオブジェクト空間が分かれていて、そうなるとどうしてもシリアライズして送らざるを得ない。そういう特殊な環境の中でJS blocksっていうのは結構良いアイデアなんじゃないかと思いますね。
竹馬: そうですね。それ欲しいなって(笑) 。この前、Off-the-main-thread、まさに直面して、大きなモジュールを2つ呼ぶ必要があって、もちろんその間ブロッキングしちゃうんですよね。だから裏に回したい、みたいな。
中川: JavaScriptにも並列処理を書きやすくするためのパーツがいろいろそろい始めています。たとえばPromise[6] やStream ですね。JS blocksはまだ提案段階の機能ですけど、それも入るかもしれません。それらを組み合わせていくと使いやすいAPIができるんじゃないかって期待しています。
竹馬: Promiseが標準化されてAsync/Awaitが来たっていうのはやっぱ大きかったですよね。
中川: Promiseはさっき話したWeb Platform Testにも多用されていて、「 テストがすごい簡単に書けた」って開発者も喜んでいます。
古典的なもの、視野を広げるもの
竹馬: 最近はどんな技術に注目してますか。
中川: 私、子どもが2人いるんですけど、一緒に遊んでいると自分のために使える時間が少なくなる。プログラミングによるリターンってかなりの時間をかけないと得られないと思うんですよね。なので、なるべく古典的なものや自分の視野を広げるものを中心に追うようにしています。竹馬さんの仮想DOMの記事[7] で、Reactを使わなくともコンセプトを学ぶことはGUI開発に役に立ちますって言っていたじゃないですか。その視点すごく大事だなって。
それを踏まえて今興味ある技術は、いきなりWebじゃないですけど、ハードウェアに興味があります。GPUやTPU[8] 、あと不揮発性メモリですね。最近だと機械学習でGPUの価値が再認識されているじゃないですか。CPUはシングルコア性能が頭打ちになってマルチコア化が進んでいますが、それもいずれ限界が来る。そうなると特定用途向けのチップみたいなのを載せたプロセッサが流行ってきて、じゃあ、その上のアプリケーションやWebブラウザはどうあるべきなのか、っていうのは興味ありますね。
竹馬: それらってモバイルでの物体認識とかARのために積まれているのでしょうけど、あれで新しいGUIプラットフォームができるのかも、なんて僕も考えます。AR上のGUIではUIが3次元に拡張されるから、今のうちにそういう概念を身に着けないとなー、とか。
中川: おもしろいですよね、今までフラットに見せていたものをいかにAR/VRで見せていくかっていうのは。それらを生まれたときから身近にする人は、それが当たり前になってくるはずですし。
ちなみにそのほかには「宇宙」に興味があります。宇宙空間でお店を開くっていう話があるそうなんですが、惑星間通信だと光速でも時間がかかっちゃうので、きっとECサイトは地球上とは違ったものになるんだろうなって妄想したりします。
竹馬: ちょっと違うけど、ノーベル経済学賞をとったクルーグマン(Paul Krugman)もそういう論文、出していましたね 。僕もSF、特にサイバーパンクが好きなんですけど、最近現実がサイバーパンクすぎて(笑) 。昔イメージした2018年より、今は先に進んでいるイメージがある。でも人間の歴史とか体制とか慣習が追いついていないなと思うところがまだあって、そこを変えるために何したらよいかっていうのは考えたいですね。
中川: 今年32才になるんですが、30代は情報科学に限らず昔から自分が興味あることをやりたいと思っていました。意図的に「中川はこういう分野の人」みたいなのを崩すような方向に進みたいと思っています。
特集1
イミュータブルデータモデルで始める
実践データモデリング
業務の複雑さをシンプルに表現!
特集2
いまはじめるFlutter
iOS/Android両対応アプリを開発してみよう
特集3
作って学ぶWeb3
ブロックチェーン、スマートコントラクト、NFT