2015年9月1日火曜日

プログラマの履歴書

コードを書け。それが履歴書だ」という昔の名台詞が目に留まったので、常日頃感じていることを書き出してみることに。

コードが GitHubで公開してあると、まず採用する側の視点としては非常に助かります。プロジェクトを2、3つ眺めるだけでも、この人が普段どんなことを意識してプログラミングしているのかが見えてきます。例えば、性能を重視しているとか、拡張のしやすさを意識してインターフェースをデザインしているとか。さらに本人の興味の方向性、得意な言語などがわかるが何より嬉しい。過去の経験から、自己申告でJavaができます、C++ができますなどと言うだけの人が期待したレベルでコードを書けた試しがありません。

その次にわかるのがコミュニケーションスキル。基礎的な英語力の判断材料にもなるし、チームを組んだ時のイメージがしやすい。問題を共有する能力も大事。自分一人の頭の中でたくさん難しいことを理解して解決できる天才肌タイプの人もいますが、大事なのは頭の中の問題を外に出して、自分以外の人も取り組めるようにすること。そうすることで、自分でコードをメンテナンスしなくなっても(大抵のプロジェクトは遅かれ早かれ自分の手を離れることになります)問題意識が共有されプロジェクトが成長していきます。自分一人でできることというのはたかが知れていて、自分が休んでいるときにでも物事が進んで行く様子を見られるのは非常に幸せなことです。

僕の転職活動での例を出すと、大学での研究者という立場から突然Treasure Dataというビッグデータ解析基盤を提供する会社のエンジニアになったのですが、履歴書として大事だったのはやはり自分のGitHubリポジトリでした。論文を書いていてもプログラミング能力の証明にはならないし、データベース分野の知識があるのと実装ができることはまた別の能力です。転職の相談の際にCTOの太田くんが既に僕のGitHubリポジトリを見てくれていたのでその後の話がとてもスムーズでした。

ただし、普通の研究者や、日々の仕事や子育てで忙しい人がGitHubのリポジトリを充実ささせるのは難しいのではないか、という思いもあります。僕の場合は、仕事で必要になったものをちょこちょこ外に出していたので、Treasure Data創業者の古橋くん(fluentd, MessagePack, embulkなど種々の人気オープンソース製品の開発者)ほど野心を持って出していたわけではありません。彼の凄さは、MessagePackを開発したらアルバイト先の基幹コードにそれを捻じ込んでから帰ってくるというあたり。それも複数の会社に。

僕の作ったものの中ではsqlite-jdbcというSQLiteデータベース(ファイル1つでDBになるお手軽DBMS)をJavaから使えるようにしたコードがあります。最初はGoogle CodeのSubversionで管理され、次はBitBucketのMercurial、その次はGitHubと転々としていて時代を感じますが、開発のきっかけは既存のsqlite用のjdbcドライバだとインストールや設定が必要で大変だな、という点から始まりました。それならsqliteをコンパイルしたライブラリをjarファイルに埋め込んでインストールを自動化したものを配布しようとしたのがきっかけです。これがあると、ゲノムブラウザのようなWebアプリをDBを含めて1つのフォルダにまとめられて非常にポータブルに実装できます。

DBを扱っていると圧縮ライブラリも必要になり手頃なものを探していたのですが、ちょうどGoogleがSnappyという400MB/sec.を超える性能で解凍できるライブラリを公開したばかりだったので、sqlite-jdbcで培ったテクニックを利用できると思い、Snappyの公開から数日でsnappy-javaを作成しました。これはタイミングが非常に良くて、今では、Sparkなどの有名プロジェクトでも使われていたり、Maven Centralで月間10万回以上もダウンロードされています。自分以外の人が自分以上によく使ってくれているコードで、なんだか不思議な感じがします。

逆に多大な労力を割いたけれど、あまり広くは使われていないコードもあります。先に挙げたゲノムブラウザ(UTGB)のコードは、Railsの用に簡単にゲノムブラウザを立ち上げられるフレームワークになっています。これはもう少し普及活動を頑張っても良かったプロジェクトなのだけれど、大学でコードを書ける人を見つけるのに非常に苦労して、自分自身が進めないとどうしようもなくなったので停滞してしまったプロジェクトです。Silkという大規模データ処理用の分散ワークフローエンジンもありますが、これもScalaでたくさんのコードを書きましたが、まだ外のユーザーを捕まえるに至っていません。協力者を得るにも、そもそも分散計算のフレームワークを書けるプログラマはなかなか見つかるものではありません。一方、Silkの開発に必要だったので作成したsbt-pack(Scalaプロジェクトをパッケージングするプラグイン)、sbt-sonatype(ScalaプロジェクトをMaven centralにアップロードするプラグイン)などはよく使われていて、目的がはっきりしていて手軽なものほど普及するというのを実感しています。

このようなツールを作成していたのも、ゲノムサイエンスという、コードを書いてデータを分析しないと仕事が進まない分野にいたからであって、純粋にコンピューターサイエンスやデータベース分野の研究をしていたら、コードを書き続けていたかどうか自信がありません。アカデミアでキャリアを築くには、残念ながら品質の良いコードを書くことが最短ルートではないので、コンピューターサイエンスの学歴があっても、採用の時はそういう目で評価しています。(ただし、コンピューターサイエンスの素養の中には、プログラミングに重要なものも多々あって、オブジェクト指向やコードの安全性、型理論、計算量、ハードウェアのアーキテクチャなど、それを知っている人とそうでない人の書くコードには歴然の差があります。)

「コードを書け。それが履歴書だ」というのは簡単ですが、仕事であれ、日常であれ、身の回りで起こっている日々の問題を、コンピューターの力を使って解こうとすること、また、そうできる環境に身を置くことがまず必要です。そういう意味で、Treasure Dataはコードを書いて問題を解決しようとする人が集まっていて良い職場だと思います。オープンソース活動に専念しているエンジニアもいる(しかも高給!)など、興味がある方はこちら(採用情報)を参考までに。ワークフローエンジンSilkもTreasure Dataに来たおかげで、問題意識を共有する仲間も増え、リニューアルして生まれ変わりそうな雰囲気になってきました。

コンピューターを使ってこんなものを作ったら世の中をほんの少し便利にできる。そう思えること、そして自分がそれを実現できるとコードを書くことを通して自信をつけていくことが、良いプログラマとして自立していくためのきっかけになるのではと思っています。



0 件のコメント:

License

Creative Commons LicenseLeo's Chronicle by Taro L. Saito is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 2.1 Japan License.