インタビュー

新規のテーマより“自分が作りたいもの”を ―歴代卒業生とメンターが語る「サイボウズ・ラボユース」10年間の軌跡

この記事を読むのに必要な時間:およそ 6.5 分

新規性にとらわれず,熱中できるテーマに取り組める

各氏の研究テーマについて,ラボユースの応募前から行っていた活動や,試行錯誤の内容を交えてお話を伺いました。

hikalium:第1期というと手探りな面もあったと思いますが,当時はどんな雰囲気だったんですか?

光成:新屋さんのほかにもう一人,鈴木勇介さんという方が「世界で一番仕様に忠実なJavaScript処理系の作成」というテーマで応募されて,凄まじい人たちが入ってきたなという印象でしたね。新屋さんは正規表現のJIT化(実行時に与えられた正規表現をx64バイナリコードに変換して実行することで,実行速度を稼ぐ)をやっていて,鈴木さんも同じくJavaScriptのコードをJIT化するという,当時ChromeのV8がやっていたことを自力で実装するという試みをしていました。

ちなみに,Intelや富嶽のAIエンジンで利用されているXbyakというJITアセンブラがありますが,それを使ってお二人とも自身のプロジェクトでJIT化を行っていました。その関係で私がメンターについていました。

hikalium:なるほど。新屋さんは「最速の正規表現エンジンを作る」というテーマでしたが,slankさんはどんなテーマでしたっけ?

城倉:僕は当時,パケット解析用のC++フレームワークを書いていて,それが初めて作った500行以上のプログラムでした。ARP(Address Resolution Protocol)というレイヤ2とレイヤ3を結びつける最も初歩的なプロトコルがあって,それを利用して,パケットレベルでの中間者攻撃をセキュリティ系の疑似攻撃ツールで再現したりしていました。そのうち,これは(ツールを使わなくても)自分で作れそうだと思うようになって,そこからは「ARPのパケットだけでなく,一般的なパケット解析をプロトコルごとに拡張しやすく実装する」という研究をC言語やC++を使ってやっていました。

独学でプログラミングを始めていろいろと作法もわかっていない中,C++のクラスの作り方や継承のテクニックを,C++の標準化委員会でもある光成さんにコツコツ教えてもらっていました。そこからさらにプロトコルの勉強がしたくなって,後半はiperf(回線の負荷試験)だけができるような,簡易的なTCP/IPを作っていました。

光成:城倉さんがラボユースに応募してきたとき,プログラミングを始めてまだ1年目という事実になかなか衝撃を受けましたね。

城倉:「関数の中にあるstatic変数が,C++のバージョンによってスレッドセーフになったりならなかったりする」というのが,光成さんに教えてもらった最初の⁠意味不明なこと⁠だった記憶がありますね。あのときは「よくわからないけど,なるほど」と思っていましたが,後々「たぶんこういうことを言っていたんだろうな」と理解していきました。C++のクラスの作り方や,スレッドプログラミングの基本からコツコツ教えてもらっていたのは良い経験ですね。

hikalium:そう考えると,お二人は実用的なものを作ってたと思うんですけど,私はそこまでゴールは明確ではなくて。⁠自作OSのプロジェクトをやっていたのかな」と思われるかもしれないですが,実はメンターの川合さんがやっていたのは「言語自作ゼミ」で,私はそこでプログラミング言語を自作していました。⁠いつ電源を切っても変数などが残ったままになる」というインタプリタ言語を川合さんが作られていて,それを拡張するかどうかという話をもらっていたのですが,拡張するくらいだったら自分で一から作り直したいということで,試行錯誤しながら自作する道を選びました。

かなり本格的な言語処理系を作ったのは,そのときが初めてでした。それ以前も言語処理系を作ったことがありましたが,⁠動かしたいプログラムが動けばそれでOK」みたいなところがあって,あまりちゃんと作っていませんでした。このラボユースを通じて,ある程度まともに動くものを作ることが学べたと思います。

ラボユースはきっちりとした作業計画を出さなくても応募ができるので,応募が通ってから具体的な方針をメンターの方や,他のサイボウズ・ラボ社員の方と話し合うのですが,方向性が二転三転するんですよ。これが面白くて,いろいろ試行錯誤しながらほかに無いものを作るっていうのが楽しかったです。

あとは,社内で行われている勉強会に参加するのも面白かったですね。機械学習の勉強会とかも行われていたような記憶があるのですが,その分野にかなり強い方から詳しい説明をいただけるので,非常にためになりました。

城倉:サイボウズの社内勉強会と,サイボウズ・ラボの社員が有志でやっている勉強会と,どちらにも参加できましたよね。たとえば,Go言語のハンズオンがあったり,数学の基礎についての勉強会があったりとか。

hikalium:光成さんが講師を務めた,暗号についての講義もありましたね。⁠RSAの鍵を実際に見てみよう」という内容で,OpenSSLのコマンドを使っていろいろと遊んだ記憶があります。

光成:新屋さんがいた第1期のときは「最適化勉強会」を開催していました。そこで新屋さんに発表していただいたのですが,その中で一番受けたというか,面白かったのが「車輪の再発明だが最速だ」というキャッチコピーでしたね。

新屋:ちょっと恥ずかしいですね。⁠笑)

光成:ラボユースのテーマが自由というのもありますが,基本的に新規性が要求されるわけではなくて,自分がやりたければ既存のテーマをやってもよいのです。新屋さんはラボユースの前半は実装を頑張っていましたが,後半はモデルを考えたり,論文を書いたりしていましたよね。

新屋:そうですね。最初はJITだけで単に1つのCPUを使った高速化っていうのをやっていました。でも複数のCPUを使ってパラレルに正規表現のマッチングができるということに気づいて。それで,JITで生成したコードをスレッド上で走らすみたいな,デバッグ作業がすごく大変になるようなことをやっていて。

光成:後半はひたすら論文の査読や添削を延々とやっていましたね。

新屋:そうそう,散々に言われた記憶があってすごく覚えてるんですけど,⁠よくこんな読みにくい文章を書けますね」って言われました。⁠笑)

実装か,設計か

ラボユースには実装を目的としたケースや,卒業論文の題材にするケースなど,テーマ選びにさまざまなパターンがあるようです。実装と設計の関係性についての話題も盛り上がりを見せました。

城倉:ラボユースの研究テーマってさまざまなパターンがあると思っていて,hikaliumさんの自作言語や,僕のパケット解析といった「試行錯誤を重ねて上手く作ってやるぞ」というような実装面にフォーカスするようなテーマに対して,論文の題材になるような学術的なテーマもあると思うのですが,そういったテーマは大体どれくらいの割合であるのでしょうか? 僕らの同期でも,赤間さん※5「ユーザーが構文を自己拡張しながら勝手に動くプログラミング言語」みたいなテーマをやったりしていましたけど。

光成:割合はわからないですが,1~2年に1人くらいでしょうか。昨日の成果発表会※6でも,修士論文のテーマとして機械学習系の発表がありましたし,データ系でトップカンファレンスを通した人も居たりして,そういうケースも時々あるという感じですかね。

hikalium:成果発表で思い出したのですが,ラボユースの「成果物をオープンにする」という条件がすごく好きで。成果をオープンにするっていうのは大変だけど,めちゃくちゃいいことだと思います。私が今の仕事を選んだのも「オープンソースのプロジェクトに関われるから」というのが大きいです。

成果物を公開するって最初はやり方がわかりづらいのですが,そこをラボユースで教わることができたと思っています。たとえば,定期的に中間発表をしてプレゼン資料を作ったり,一般の人も招いて最終発表をしたりとか。あとはそうですね,それこそ光成さんがされていたように,論文の査読や添削をしてもらったりと,かなり勉強になったと思っています。

城倉:あと,ラボユースのありがたいところは,テーマや新規性に固執しないでやりたいことができて,しかも「こういったことをいろいろ指摘してほしい」と思っているところに対して指導してくれる点ですね。

新屋:私は,修士のときに正規表現エンジンの高速化に取り憑かれていたんですけど,ラボユースの卒業後は博士過程に進みました。今は大学で理論研究をやっていて,自分がプログラミングを教える立場になっています。何かを実装する,何かを極めるといったことについてどう指導すればよいか,ラボユースの経験が大いに参考になっていると思います。

城倉:僕はソフトウェア開発の仕事上,何千行や何万行のコードを一気に書いたり消したりすることがあります。新屋さんはそういったコーディングから,どちらかというと離れていっているように思うのですが,自分でプログラムを書くことがなくなってくると,見ている景色が変わるような感覚ってないですか? たとえば,僕はシステムの要件を考えたり設計する仕事もしているのですが,そういった仕事をする中で,一週間の大部分を図を書いたり,検証をやったりすることに時間を費やしていると,⁠プログラムを書いていない=仕事していない」というような感覚に陥ることがあったりしました。

新屋:(正規表現エンジンの)高速化って結構特殊で,コードが大きくなっていくというよりも,コードを書いては消してを繰り返して,小さな変更がたくさん積み重なるようなイメージが近いです。ラボユースではさまざまなバグのパターンや,デバッグの深いところまで教えてもらっていたので,たとえば学生に相談を受けたときも「こういうエラーが出ました」⁠うまく動きません」と言われたときに,大抵そこまでコードを読まなくても,エラーの原因などが十通りくらい思いつきます。そういう感覚はまだまだありますね。

自分でJITコンパイラを書いたり,エンジンを一から書くとなるとコーディングは以前より遅くなっているとは思いますが,重要な部分はそんなに抜けていないのかなと思います。

光成:城倉さんとはラボユースで,どういうふうにクラス設計をするかを一時期議論していましたね。城倉さんがひたすらコードを書きたがっていたのに対して,私が「これはどう作るか図に起こさないと作れないよ,我慢しなさい」というようなやりとりがありました。

「どのような要素を分割してどのように結合すればいいか」というところを一度きちんと学ぶと,一生モノとは言わないまでも,一度自転車に乗れたらいつまでも乗れるように,⁠このコンポーネントをこういうふうに繋げたら実装できるよね」というように,自分の中で判断がブレなくなって素早く考えられるようになるのではないかと思います。⁠今は何千行,何万行書ける」といったような絶対的・相対的なコーディング速度は違っても,目的に向かってそんなにブレずに進んでいくこと。これは変わらないんじゃないかなと思います。

hikalium:そうですね。どの言語で何を書くかというよりも,それで何を作るか,どういうふうに作るかというのが重要なところですね。それこそ「どの自転車に乗るかじゃなくて,どう自転車に乗るか」っていうところを,ラボユースでは知るきっかけになったんじゃないかと思います。

※5)
ラボユース第5期で「ユーザが構文を自在に変更できるプログラミング言語」のテーマで開発に取り組んだ赤間 仁志氏。
※6)
3/30(火)に開催された第10期生の成果発表会

著者プロフィール

宮島幸太(みやじまこうた)

Software Design編集部所属。技術評論社2018年入社。

バックナンバー

2021

  • 新規のテーマより“自分が作りたいもの”を ―歴代卒業生とメンターが語る「サイボウズ・ラボユース」10年間の軌跡