Preferred Infrastructureの夏期インターンに行ってきました

8月の上旬から9月の下旬までの2ヶ月間、Preferred Infrastructure(PFI)の夏期インターンに参加してきました。
今回のインターンを振り返りつつ、ブログ記事を書きたいと思います。

PFIでのインターン

PFIインターンでは、インターン生1人1人が各自に定めたテーマに沿って開発を行うというスタイルをとっており、この点で講義や課題形式で行われるインターンとは大きく異なるところだと思います。
2ヶ月間のインターン中に、一定の成果を出すことが目標となります。
各自が取り組むテーマは、インターン生のバックグランドやPFIの事業分野を前提とした上で、インターン生の希望に合わせて定められます。
例として、PFIで現在提供しているソフトウェアを改良するために、今取り組むべき問題を解決する、またはPFIで過去に開発したライブラリを利用して、新しいソフトウェアやサービスを創り上げる事を目指す、といった課題に取り組むことになります。
また、インターン1名に対して、インターン生の取り組むテーマや専門分野に精通したメンターが1〜2名つき、インターン生の取り組む課題について指導や議論を行ってくれます。
このメンター制度は、今年のインターンから導入されたものらしいです。

インターン面接

はじめに書類選考、次にPFIでのインターン面接となりました。
本郷三丁目にあるオフィスを訪問し、面接開始。
プログラムをホワイトボードもしくはPCでコーディングする技術面接でした。
出題されたのは、花札シャッフルの問題。
緊張していたせいか、幾つかミスを犯してしまいながらも何とかホワイトボードにプログラムを記述することが出来ました。
ほっと一息ついていたところで、「では、次にオプション問題なのですが…」(゚Д゚;)エッ
オプション問題は、花札の枚数がメモリに載り切らないほど大きな数の場合に、正しい解を返すプログラムを、コードは書かなくても良いので説明してくださいというものでした。
幾つかヒントを頂き、うにゃうにゃ考えているうちに、何とか答えを出すことが出来ました(たぶん)。
こういう問題はもっとサクっと解けるように、アルゴリズムやデータ構造の知識は自分の物にしておかなければなりませんね。
そして、面接数日後にインターン内定の連絡を頂き、PFIでのインターンに正式に参加することが決まりました。

インターン開始

8月上旬にインターン開始。
tkngさん/jnishiさんのお二方がメンターとして指導していただけることになり、始めの1週間にこれからの方針を議論したり既存のコードをいくつか読んだりしながら、
インターン期間中に取り組むテーマの設定を行ないました。
元々僕は機械学習自然言語処理を専門として大学で研究をやっていることと、元々インターンではその分野に関連した開発を希望していたことから、今回は機械学習系ライブラリの一部であるクラスタリングライブラリの拡充(主に、様々な種類のクラスタリングアルゴリズムの実装とその評価)を行うことに決まりました。
実際にクラスタリング手法をいくつか実装していくうちに、「クラスタリングをするなら、それぞれのクラスタがどのような性質を持ったクラスタなのか一目でわかると良いよね」
「ただ、データをいくつかのグループに分けるだけじゃなくて、グループの近さとかを可視化できたら便利だよね」といった形にクラスタリングへの夢が膨らんでいき、ただクラスタリングアルゴリズムを実装するだけではなくて、クラスタリングに付随する機能を色々と実装してみようか、という流れになりました。
今回のインターンでは、クラスタの階層化やクラスタ代表単語の抽出、クラスタリングデモの作成等、クラスタリングをより便利かつ素晴らしいものにするための様々なテーマに手を出すことになりました。

最終的には、インターン2ヶ月間で、以下の機能を開発しました。

9/30に行われた最終発表で、インターン2ヶ月間の成果を紹介しました。
この時の発表スライドを下に掲載します。

上記のタスクの中でも特に困難であったのが、

でした。
上記の問題に対しては、色々な工夫や試行錯誤を行った結果、今回のインターンではそれなりの速度や精度を出すところまで、なんとかこぎつけることが出来ました。
しかし、この2つのタスクは、今後改良する余地が非常に大きなタスクであると思います。

インターン全体を通して

僕は、情報系の大学院に進学することが決まった去年の秋頃からコンピュータサイエンスの世界に入ったばかりの新米だったこともあり、今回のインターンほどの大きな規模のライブラリの開発を行った経験はなかったので、プログラミング技術を含めかなり初歩的なレベルの勉強から始めることになりました。
とはいっても、メンターの方々をはじめ、PFIの社員のみなさんに質問をすれば丁寧かつ的確な答えを返して頂けるので、分からないことや困ったことが発生してもすぐに解決出来るという安心感がありました。
特に、社内チャットでいつでも技術的な質問が出来る(しかも、すぐに誰かから返答が帰ってくる)という環境は、自分にとって凄く有難かったです。
2ヶ月間のインターンを通して、論文を読んで長所・短所・特徴を理解した上で、そこに記載されている擬似コードを実際のプログラムに落としこむ力がかなり鍛えられたと感じています。
「この論文のアルゴリズムは、今やりたい事には良い性能が出ないだろうなー」とか、「実装にかなり時間がかかりそうだけど、このやり方なら素直に動いてくれそうだなー」といったように、論文を読むときにそれを実現できるかどうかを判別する嗅覚が、2ヶ月前より段違いに効くようになっていると実感しています。
また、このプログラムならメモリやCPUがボトルネックとなりそうとか、何か問題が発生したときにこの部分を修正すると上手く動きそうとか、この規模のプログラムだとmapを使うのは危ないだろうなとかいった感覚も多少なりとも養うことが出来たのかなと思います。

まとめ

PFIという会社で、技術力の高い社員・インターンに囲まれながら2ヶ月間インターンをすることが出来て、とても楽しかったです。
また沢山の貴重な経験を積む事ができました。
改めてPFIの皆様、また一緒にインターンに参加した3名の方へお礼申し上げます。
Red Bullもたくさん飲むことができて、本当に幸せでした。
自分も含め、インターン生が段々各メンターの色に染まっていく様子が見られたのもとても面白かったです。

今後も、アルバイトとしてお世話になることが出来るようなので、まだまだ勉強しきれていない事を貪欲に吸収していきたいと思います。
今後もPFIではインターンを募集する機会があると思うので(ありますよね?)、興味のある学生の方々はどしどし応募して、PFIでのソフトウェア開発を経験してみてください!