サイボウズ・ラボ(株)が運営する若手エンジニア育成プログラム「サイボウズ・ラボユース」(以下ラボユース)が3月31日に設立10周年を迎えました。これを記念して、プログラム卒業生の秋田大学理工学部 助教 新屋良磨氏、LINE(株)シニアソフトウェアエンジニア 城倉弘樹氏、osdev-jpなどで活動するhikalium氏、そして設立からラボユースのメンターを務め続けるサイボウズ・ラボ(株) 光成滋生氏の計4名をお呼びし、ラボユースの魅力を語ってもらいました。
応募の決め手となったのはメンターの存在
最初にラボユース応募に至るまでの経緯、そして応募の決め手となった要素を伺いました。
新屋:学部4年生のころに卒業論文や学会で正規表現エンジンの研究をしていて、Twitterで技術的な話をつぶやいていると、サイボウズ・ラボに当時所属していた竹迫さんから「こういう制度が始まります」と紹介を受けました。1期生なので少し経緯が特殊かもしれませんが、修士1年でお金をもらいつつ[1]自分の好きな研究ができるのは良いなと思い、応募させてもらいました。
新屋 良磨
秋田大学 助教
サイボウズ・ラボユース1期生。学部4年生のころに正規表現の魅力に取り憑かれ、それから現在まで11年ほど正規表現の研究にハマりつづけている。サイボウズ・ラボユース第1期プロジェクト「世界最速の正規表現JITエンジンの実装」や、正規言語の組合せ構造の研究(日本学術振興会特別研究員DC2)を経て、現在は正規言語・オートマトンの基礎理論(科研費若手研究)を研究中。とくに言語と代数と論理の繋がりや、正規・非正規の「壁」に興味を持っている。
城倉:セキュリティ・キャンプ全国大会[2]を卒業した後に、セキュリティ・キャンプのコミュニティで集まってオープンソースカンファレンス(OSC)にブースを出していたところ、川合さん[3]がブースに訪れて、ラボユース制度に関して教えてくれたのがきっかけでした。ちょうどそのときは独学でプログラムを書いていた時期で、ラボユースでアドバイスを貰ってブラッシュアップしたいと考え応募しました。
新屋さんが仰ったことと同じで、僕も学生で金銭面に苦労していました。当時はテニスコーチのアルバイトをしていたので、プログラミングの独学に使える時間が限られていました。ラボユース制度のおかげで、学生生活の100%をプログラミングの独学に費やすことができて嬉しかった記憶があります。
ただ、どちらかというとお小遣いがもらえることより、光成さんとか、川合さんといった方々をメンターにつけることができて、その人にほとんどマンツーマンでいろいろ教えを乞えるところが良かったと思います。「どちらかというとお金を払って教えてもらうようなケースなんだけど、なぜかお金をもらっている」というような、不思議な気持ちでしたね。
城倉 弘樹
LINE株式会社シニアソフトウェアエンジニア
Tier1 ISPのR&D部門にて高速なソフトウェアルータの開発に従事し、2019年より現職。LINEのサービスを収容するプライベートクラウド部門にてネットワークサービス開発に従事。ネットワークや分散システムの設計、コーディング、SRE業務まで幅広く従事。IPA未踏事業スーパークリエイター認定、セキュリティ・キャンプ講師。
hikalium:私はラボユースの第6期と第7期に両方参加したのですが、もともとのきっかけはslankさん[4]と同じで、2015年の10月ぐらいにオープンソースカンファレンスで初めて川合さんにお会いしたときに、ラボユース制度について教えてもらったのが始まりでした。
川合さんとはインターネット掲示板で話をする機会などはありましたが、直接会ったことはありませんでした。実際に会ったときはめちゃくちゃ感動したのですが、そこでラボユースに応募してみたらどうかと誘われました。
私は金銭的な目的はあまりなくて、どちらかというと、尊敬している「強いエンジニア」の方々が大勢いらっしゃるサイボウズ・ラボで自分の好きなことをできるっていうのが一番のキーポイントでした。大学だとプログラミングの仕方を教えてもらう機会はほとんどなかったのですが、その最初の機会がラボユースでした。
hikalium
Software Engineer
サイボウズ・ラボユース第7期卒業生。小学生のころにOS自作というテーマに出会ってしまったことで道を踏み外し、現在に至る。Non-volatile DIMMを活用した自作OS“liumOS”を開発中のほか、2020年より、オープンソースのオペレーティングシステムであるChromium OSの開発に従事している。自作OS以外にも、自作コンパイラや自作CPU等、低レイヤ全般に手を出している。
城倉:ちなみに僕は、hikaliumさんが川合さんと対面でやりとりされているのを真横で見ていました。そこでhikaliumさんとも初めて知り合ったのですが、「なんだこの、前から知り合いな感じは。初めて会ったような感じではない!」と思ったら、実はインターネット上で長く付き合いがあったんですよね。
光成:私も、新屋さんの活動はTwitterで先に知っていました。新屋さんが「最速な正規表現エンジンを作った」とツイートされていたのですが、公開されたコードを見て「自分のほうが速いものを書けるな」と思い、自分でコードを書いて試していました。そうしていると実際に本人が応募してきたので、「これは面白そうだ」ということで採用しました。
光成 滋生
サイボウズ・ラボ
さまざまなCPUや特殊プロセッサ向けのmp3やMPEG4などのコーデック開発に関わったあと2007年サイボウズ・ラボ入社。ペアリングライブラリの世界最速実装をしたり、Ethereumなどのブロックチェーン系プロジェクトで利用されているBLS署名ライブラリの開発をしたりしている。Xbyakは入社前からの一人プロジェクト。
新規性にとらわれず、熱中できるテーマに取り組める
各氏の研究テーマについて、ラボユースの応募前から行っていた活動や、試行錯誤の内容を交えてお話を伺いました。
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:そうですね。どの言語で何を書くかというよりも、それで何を作るか、どういうふうに作るかというのが重要なところですね。それこそ「どの自転車に乗るかじゃなくて、どう自転車に乗るか」っていうところを、ラボユースでは知るきっかけになったんじゃないかと思います。
ラボユースを起点に、つながりが生まれた
各氏にラボユース卒業後のご活躍について伺いました。
城倉:パケット解析プログラムの話を外部にしたときに、そのイベントの参加者の方がDPDKについて教えてくれて、「DPDKという単語を教えてもらいました」と光成さんに言ったら、インテルのカンファレンスでDPDKの話が聞けると教えてもらいました。さっそくカンファレンスに参加してIntelのプロモーションを聴講していると、Xeon PhiというメニーコアCPU上で「caffeという機械学習のライブラリを使うと、機械学習の計算が高速化できます。caffeはXbyakで最適化されていて、計算機的にすごく良くできているんです」という解説が流れてきたので、帰ってきて光成さんにわざと「Xbyakが使われてるらしいですよ」と言ってみたら、開発者本人がつらつらとXbyakの説明をしだすというエピソードがありました。「光成さんすごい」と感じた出来事の1つでしたね。
その後、また別のDPDK関連のカンファレンスでNTTコミュニケーションズ(以下NTT Com)のR&Dチームがセッションに登壇すると光成さんに教えてもらって、ラボユースが終わった後はNTT Comで共同研究をさせてもらい、そのまま社員となりました[7]。そこから1年が経ち、最近はパケットを卒業することになりました。もちろん片手間ではやっていますけど、クラウドのコンポーネント開発に携わるようになったので、「パケット度」は昔から30%ぐらい落ちてしまっています。
光成:slankさんは当時いろんなところにアンテナを張っていて、勉強会に行ったりしていたので「じゃあこっちの会社に行ってみたらいいんじゃないか」という話も持ち上がっていました。そういう意味ではインターンなどと違ってラボユースは「うちの会社に来なさい」というのがゴールではないので、あっちの会社はどうか、こっちの会社はどうかと気軽に言えて、コネクションが広がりやすいのはあったかもしれないですね。
光成:話は変わりますが、新屋さんが(正規表現の)理論寄りに進んでいった経緯をもう少しお伺いしたいです。
hikalium:理論ではなく、実装寄りの方向に進むっていうことは検討されたんですか?
新屋:いえ、考えていなかったと思います。修士2年ぐらいからオートマトンの理論にどっぷりはまっていたので。あと、同期の鈴木さんには影響を受けましたね。
光成:鈴木さんはラボユースの契約手続きの際に、事務の方に40分くらい延々とJavaScriptの規格について語り続けて「何を言っているのか全然わからないけど、熱意はわかりました」と言われていたのですが、それぐらいプログラミングが大好きな人で。
新屋:タガが外れるとすごいんですよね。僕はその当時まで自分のことをプログラミングが好きだと思っていたんですけど、彼には及ばないと思いました。といってもネガティブな意味ではなくて、熱意のある面白い人が同期にいるなという印象でした。あとは、正規表現って実は理論も奥深くて面白いので、どんどん傾倒していきましたね。
光成:新屋さんが『正規表現技術入門』(※8)を書かれたのは凄いと思いました。鈴木さんとの共著だったんですよね?
新屋:そうですね、JavaScriptにおける正規表現のJITについて執筆してもらいました。
光成:理論をあそこまできちんと書いている書籍もなかなかないと思いました。理論だけじゃなくて既存のライブラリの解説もあってすごくいい本だなと。
新屋:hikaliumさんも書籍を書かれていましたよね?
hikalium:『WEB+DB PRESS』の特集記事を何回か書かせていただいたりしました[9]。いろいろと活動をしたおかげだと思います。
新屋:どんどんつながってきますよね。
hikalium:そうですね。ひとたび活動し始めると、いろいろなつながりが生まれますよね。
新屋:私は沖縄から上京してきて知り合いもいなかったので、ラボユースでいろんな人と知り合えて発信できてよかったです。
思わず人に話したくなるような、お気に入りの技術はあなたにありますか?
最後に、「どのような人にラボユース制度を勧めたいか」を各氏に回答してもらいました。
hikalium:すごく熱意がある人とかじゃないですか。
新屋:そうですね。エンジニアでない事務の方にも40分ぐらい話せるみたいな。
hikalium:そうそう、まさにその表現はすごくわかりやすいと思います。ほかの人にも自分のテーマを好きになってほしい、みたいな熱さを持ってる人が合っている気がします。
新屋:「既存の技術だったとしてもあらためて自分で極めたい」「確固たる作りたいものがある」という方が向いているんじゃないでしょうか。
城倉:僕らは何か作りたい(実装したい)ものがあって応募したと思うのですが、逆に、「学術上がりでプログラミングはあんまりやって来なかったけど、これを機にいろいろやってみよう」という人も割とはまるのではないかと思っています。
インターネットアーキテクチャの研究をしている渡邊さん[10]というPh.D.学生の方と仲良くしていて、今も毎日slackで議論しています。彼はラボユースで、ネットワーク研究者が検証用に使うようなプログラマブルなプロトコル・スタックを作っていました。
渡邊さんは、どちらかと言うと実装よりもアーキテクチャを考えたり「これはこういった本質的な機能があったからうれしかったんだね」というような洞察を得たりするのが上手い人で、そういった人がラボユースで実装に取り組むことで、視野が広がるのではないかと思います。逆に、僕のほうはクラウドのアーキテクチャを考える必要があって、最近は研究側に寄っています。
ふだん論文を書きまくっているような人が、そのコンセプトを実装してみようと思ったとき、割とこういう機会がないと、結局ずっと論文だけを書き続けてしまうみたいなケースも結構ありそうな気がしていて。実装するか研究するか、どちらも選択できるっていうのはラボユースのとても良い価値だと思います。
光成:新屋さんの例で言うと、もともと正規表現の一般論をやっていて、実装がしてみたくなってラボユースに来たという経緯ですが、実際に自分で手を動かす経験は大事だったのではないかと思います。
hikalium:ちょうどラボユースってエンジニアリングと学術の中間に位置していて、プログラミングができる人にとっては、そのアイデアをどう練ればより良くできるかを学べる場所だし、逆にアイデアを持っている人にとっては、どう手を動かせばそれを実現できるかを学べる場所だと思うんですよね。だからすごくバランスのいい人材になれるというか、その両方をつかむために、いろいろ教えてもらえる場所なのかなと思いました。
光成:そう言っていただけるとありがたいです。これからも頑張りたいです。
研究テーマへのこだわりや熱意を何より尊重し、各技術分野のプロフェッショナルがメンターとして名を連ねるサイボウズ・ラボユース。2021年も参加者を 通年で募集しています。我こそはと思う学生は、第11期生としてぜひ門戸を叩いてみてください。