仕事としてOSS開発者をやってきた話

はじめに

わたしは今も昔も仕事としてOSS開発者をしていて、twitterなどでそれなりに名前が知られていることもあって、昔から「どうすればそういうこと(業務としてOSS開発)ができるのか」「どういうキャリアを歩んできたのか」「Linuxカーネル開発者になるにはどうすればいいのか」ということをよく聞かれてきました。当時わたしが置かれた環境と現在の環境では違いがありすぎるので公開に積極的にはなれなかったのですが、一つの過去事例として何らかの意味はあるかもと思って公開することにしました。

書き方が難しかったのですが、うまくまとまらなかったので、自分が書くのが楽な日記みたいになりました。

きっかけ

2000年初頭に学部4年のころにLinuxを触りはじめてから「UNIXとかLinuxってすげえ」「こんなものが無償で使えるのか」「これらのソースコードが全部見られるのか」と感動して、「自分も成果物を公開していきたい!」「この道で食っていきたい!(やりかたしらんけど)」と思ったのがすべての始まりです。

その後「プログラムってどうやって動いているんだろう」というのを掘り下げて行ったらカーネルにたどり着いて、Linuxを使っていたのでLinuxカーネルに興味を持って色々調べていました。ここでも「この道で食っていきたい!(やりかた知らんけど)」になりました。

ありがちですが以下の本なんかも読みました。

インターン

B4の頃、私がその手のことをやっていると知っていた友人が「こういうのがあるらしいよ」と、とあるサーバベンダでLinux開発をやっている部署がインターンの募集をしているということを聞きました。当時はLinuxカーネルなんて本を適当に読んだだけでいじったことはあんまりなかったのですが、「まあなんとかなるやろ、落ちても別にダメージはないし、受かって何もできなくてもその時だけのこと。もしうまくいってここに入れればめっけもの」と思って応募しました。とくにわたしは情報工学情報科学専攻ではなかったので*1、こういう手段をつかわないとなかなかカーネル開発なんて難しいだろうなあという思いはあったので、「これだ!」と思った記憶があります。

エントリーシートの内容はあんまり覚えてないんですが、「実績はまったくないですがプログラミング経験はあります。意欲はあります!」のような勢いだけのものだったと思います。

幸いにもインターンには受かりました。当時は日本のサーバベンダが「これからはIAサーバ*2メインフレームUNIXの置き換えでやるぞ!」と怪気炎を上げていて、とにかく育ててでも人材が欲しかった頃なのでわたしのような怪しい人が入り込む隙間があったのかもしれません。

インターンでは実際にカーネルを触ってみたらなんとなく成果は出せたらしく、後日、無事その部署に配属になりました。インターンでやったことは詳しくは書けませんが、たとえばファームウェアが提供するハードウェアの情報が書かれたテーブルを書き換えてCPUを一個論理的に消すとかそういうことをしました。事前にいろいろ調べてはいたのでなんとかなりました。

ここで重要だったのは次のようなことだと思います。

  • 友人、知人に「俺はこういうことをしている/したい」と話しておくのは重要。ふとしたことからチャンスは降ってくる。前述の友人もとくにコンピュータやLinuxに詳しいわけではなかった
  • 幸いにもインターンで成果を出せるくらいの素養はあったが、応募しなければ何も始まらなかった。やって損はないことはやるといい
  • 「どうせ俺は〇〇だから(自分の場合は「情報系学科ではないから」)」とあきらめない。あきらめなければ必ずできるわけではないが、あきらめたら試合終了

OSS開発、Linuxカーネル開発の実績を積む

入社してからは優しく厳しい先輩方に囲まれてゴリゴリLinuxカーネルに新機能を追加していきました。ここではとくにドラマ性はなく、日々必死に仕事をして、小さな改善パッチから始めて大きな機能の取り込みに、といったステップアップをしていきました。このときにLinuxカーネルそのものの知識に加えて、issueの発行のしかた、自分のパッチの効果に説得力を持たせるために議論する方法などを学びました。土台を固めながらの成長に近道はないです。

なお、優しく厳しい先輩方はmemory cgroupsの(当時)メンテナとかLinuxRubyのデュアルコミッタとか、えげつないかたがたばかりだったので、学べるところがたくさんありました。今思えば、これほど豪華な環境で成長できることはなかなかないのではと思います。ほかにも表には出ないもののダンプの模様が見える超人のような人とか、いろんなすごい人達がいました。

今やってること、OSS開発経験が役立つこと

今は上記サーバベンダは辞めてグループウェアを作っている会社にいます。といってもWebアプリを作ってjsとかを触っているわけではなく、Go言語を使ってKubernetesやらRook/Cephを使ったオンプレインフラ基盤を作っています。

業務はupstreamのRookの開発がいまのところ中心で、メンテナもやってます。ただし最初からupstream Rookの開発をやるために入社したわけではないです。会社が求めていたスキルにマッチしているから入社して、自社インフラを作るにあたってRookにゴリゴリコミットできればいいねということになって、わたしができそうだからやりはじめただけです。

過去の知識についてはオンプレ基盤という性質上、Linuxカーネルの知識はとても役立っています。Rookの開発についてもLinuxカーネル開発で培ったOSS開発の型のようなものがずいぶんと役立っています。LinuxとRookはまったく性質が異なるコミュニティなのですが、型はできていたのですぐに適応できました。この型はなにもOSS開発だけではなく部署間、会社間の交渉にも役立つと思います。

今から業務としてOSS開発するにはどうすれば?

今から業務としてLinuxカーネル開発者になる方法については正直言ってよくわかりません。わたしは5年近く前にLinuxカーネル開発が仕事でなくなって、この界隈の事情に疎くなったからです。他のソフトウェアについてはもっとわかりません。

一般論になってしまいますが、できるところから自分のたずさわりたいOSSについてissue報告したりPR投げたりして実績を積んでおいて損はないと思います。それに加えてイベントなどに顔を出していると関係者の目に留まって…ということは珍しくはないです。実績がなくても界隈の技術者に声をかけるとなんらかのヒントをもらえるかもしれません。

あともう一つ言えるとしたら「企業はOSS開発をしたい人ではなく会社に貢献してくれる人を求めている」というのは重要です。仮にあなたがナントカというOSSのメンテナですと言っても、その企業でそのようなことが求められていなければ仕事としてはできません。そうではなく、そのナントカを使って仕事にしている会社、ナントカの開発によって利益が得られる会社を探す必要があるでしょう。

あやふやな言い方で申し訳ないですが、いい加減なことは言えないのでこのくらいで。

おわりに

なんか抽象的なことばかり書きましたが、わたしが言えるのはこんなところです。まとめると、ありきたりですが「情熱を持つ」「チャンスをつかむ」「実績を出す」「しっかり関係者にアピールする」といったところでしょうか。全部でなくてもかまわないので、できる範囲でやるとよいかと思います。

ついったでメンションとかDMとかしてくれれば追加でなにかお答えしたり、ここに追記したりできるかもしれません。その時々の負荷に応じてベストエフォートで…

*1:なぜかというと入試で落ちたからです

*2:当時はx86ではなくItanium