肉とビールとパンケーキ by @sotarok

少し大人になった「肉とご飯と甘いもの」

PFI で2ヶ月のインターンシップに参加してきた

8月の頭から先週10月2日まで,Preferred Infrastructure (PFI)インターンシップに参加してきました.
思えばあっという間でしたが,非常に濃い体験をし,多くのものを得た2ヶ月でした.
インターンでなにをやったのか,何を得たのか,自分なりにまとめたいと思います.長文ですみません.結局うまくまとまらなかった...w

エントリー

日記風(w)に,エントリーから振り返りたいと思います.PFIでインターンの募集が始まった,と聞いたのは, @kzk_mover さんか @ichii386 さんの Twitter でのつぶやきからでした.
で,まあPFIは太田さんを知ってたりして,素敵な会社だなーと思ってたこともあり,募集要項は「レベルが高い」とTwitterやブクマでも話題だったので受かるかどうか自信はなかったんですが,学生最後の年だし,今年やらなかったらもうインターンもできないなあ,などと思って思い切ってエントリー.

で,書類はOKだったんですが(HTMLで送った),面接の連絡で

  • ふたつの質問に答えてもらいます
    • 1つは「検索エンジンのランキングについて,どんな検索エンジンでもいいので調べてきてください」
    • 2つ目はまだヒミツ

おお...これは技術面接だ...などと思いながら,検索エンジンのランキングなんてわからねー,と思いつつ色々調べて面接.

面接うけるとき作っていたメモ:


で,当日面接では,色々勉強したことをしゃべって,なんとなく感触もよかったから,フゥ,と思ったら「じゃあちょっとプログラム書いてもらいます」 ...... ぐーぐる形式キター!*1
ビクビクしてたんですが,minimum 100万 くらいの整数の「集合(set)」があって,要素の追加APIと最小値をpopするAPIを実装して,という感じのお題でした.(たしか)
言語問わず,ということだったのでとりあえずPHPで2分木を実装.(これも,アイデアは全部言えたけど,最後まで書き終わらなかった.で,一応復習もしたよ -> http://d.hatena.ne.jp/strkpy/20090730/1248945359 )

そういうわけで,後日合格通知をいただきました.二つとも,大きくハズレたことを言ってたわけではないんだな,ということで一安心.
ここから僕のインターン生活が始まりました.

テーマ決め

インターンシップ参加者は僕を含めて5人で,それぞれがなにか興味のあることにテーマを決めてプロジェクトを進める,という形.
テーマは.現在 PFI で研究段階にあるようなネタやライブラリを使ってウェブサービス作ったりもいいよ,という感じだったり,今必要としてるものがーみたいな直接製品にかかわるものがあったりと,色々と提示してもらいました.
で,僕はもともとウェブアプリなんかを良く書いてる人間で,多分おかだいさんもそういうことをやるのではないか,というイメージで採用してもらったと思うのですが,せっかく PFI という会社で低レイヤーに詳しい人が集まっているので,そっちの勉強させてほしい!ということで,自分でも割と無茶かなあ,という気持ちはありつつ,以下のテーマに決定!


C++ で,転置インデックスライブラリを作成する*2


PFI では Sedue のインデックスに,主に Suffix Array を使っているということで,転置インデックスを扱うにはバックエンドに Tokyo Cabinet を使った, Tokyo Dystopia を利用している,とのことでした.
で,これがあまり巨大な文書の塊にたいしてのインデックスを作れないので,大きな文書の集合に対しても使える転置インデックスのライブラリを作ろう,ということに.


最初の目標:

  • メモリに乗り切らないほどの文書量でもインデックスを作れる
  • 最終的にできたインデックスは圧縮してファイルサイズを小さくする

インターン

DSC02688

インターンのスケジュールは以下のような形.*3

  • 8月頭 テーマ決め
  • 8月中 実装
  • 8月末 中間発表
  • 9月中 実装
  • 9月末 最終発表

それに加え,週一回全社ミーティング+セミナー(社員だれかがなにかのテーマでプレゼンする.社内勉強会)への参加と,インターンはおかだいさんと個別ミーティングをして進捗の確認や,実装などのアプローチがこれでいいのか,などの相談をしていました.
日々の日報ははてなグループで共有していました. :)


で,自分はというと,C++ はこの春に文法を勉強した程度で実践的アプリやライブラリは書いたことがなく,Cも学校の課題ではるか昔にやった程度しかかけずの自分だったので,まずはそのあたりの勉強...w
とはいえ,社員のみなさん(多分本当にほぼ全員に質問をしたと思いますw)も,隣の席にいた達人インターンの id:viver も,初歩的なことも丁寧に教えてくれるし,日報にコードを張ればアドバイスをくれるしで,至れり尽くせりな感じでした.

自分のライブラリは,当初 Tokyo Cabinet をバックエンドに使い(Tokyo Dystopia と同じ)*4,文書中の出現位置情報も保持する完全転置インデックスを作る形で作成して,中間発表前になんとか,手元の10万件程度の Wikipedia の文書を検索できる程度まで作ることができました.

しかし中間発表後,Wikipedia 英語文書すべてでインデックスを作っていたところ,文書数が増えるにつれて,だんだんデータを入れるのに現実的ではない時間がかかるようになってきてしまいました.*5
そこでまたnobuさんやkzkさんにアドバイスをもらい,アプローチと最終目標をもう一度確認.


最終目標:

  • 英語 Wikipedia 全件を最低目標として,資源の許す限りスケールして巨大なデータを扱えるアプローチでインデックスを作成する

という形になり,インデックス作成過程もMapReduce風になりわりと将来性のあるアプローチになりました(が,コードはほどんと書き直しでしたが!)

最終発表

そして,最終発表会が先日,2日にあり,途中の方向転換にもめげずに,実装は完成!
このライブラリが果たして有用なのか,という問題はおいておいて(でも,kzkさんたちにも,「使えるよ」と言ってもらえたので,少なくともおバカな出来上がりではないでしょう!!),当初予定していた目標よりも一段格上げし,それを達成することができました.
まだまだコードや実装には甘い部分があったのでツッコミもうけましたがw,ひとまずインターン中の目標は達成することができました.

最終発表のときの資料:

PFI という会社

DSC02680

PFI という会社は,普段はわいd...くだらない話で盛り上がっている,学生のような人たちです(ぉw
でもひとたび技術や研究の話題になると,次々と議論が展開される,生粋の技術者・研究者たちの集まりでした.

社内セミナーで西川さんが PFI(とベンチャーと起業) についての話をしたとき,「この会社は,最新の研究を最短路で実用化するために作った」と言っていました.これは,しびれる.

全体を見ると,西川さんがちゃんと会社の舵取りをして*6,渡辺さん(唯一の営業さん!)がバシバシ仕事をとってきてくれるのでエンジニアとしては安心してエンジニアリングができるなあ,などと思いつつ,エンジニアはエンジニアで,それぞれがそれぞれの分野でスペシャリストで,皆さん素敵でした.

また,特にやはりkzkさんの存在は偉大だ,と,同い年ながら関心ばっかりしていました(おっさんか...w)
なぜかkzkさんに「できるっしょ」とか「まぁ,できるよね」とか言われると,難しいかな,と思ったこともできてしまう気がしてw,安心して挑戦することができました(いや,なんか,この人ができるって言うならできるんだろう,という安心感と,できるって言われてできないなんて言えないよね,というプライドみたいなものがせめぎあってた感じで,良い方向に向かったのかな,と)


これまでバイトなどでちょくちょくベンチャー企業を見てきましたが,その中で一番のびのびと仕事をしている,と感じました.ものすごく遅くまで残ってるわけでもない,でも仕事はちゃんとできてて,製品も作れている.ある意味ものすごく理想的な働き方をしているし(田中さんとか,「日が暮れてからじゃないと力がでない」とか言ってるしw),それでそれぞれパフォーマンスが出ているなんて,やっぱりすごいなあ,と思います.


いや,もうなんていうか僕なんかが言葉であらわせないオーラみたいなものがありました(などという適当なまとめ...)

インターンに参加して

DSC02681

プログラマとしての自分の中におきた一番の変化は,「どういうデータ構造を使ってどういうアルゴリズムを使うとき,どういうコスト(IO/システムコール/メモリなど)がかかっているのかを意識するようになった」という点です.
いや,まあコンピューターサイエンスを学んでいるなら意識してろよ,というツッコミもあるかもしれませんが,どうしてもアプリケーション寄りのことばかりやっていると普段は見えていないものですね..
*7


記憶に残っているのが3つあって,1つは,「裏で何回mallocが呼ばれていることか...!」と kzkさんが言ったことです.w
たしか文字列の話をしていて,PHPなどのLLで文字列連結は平気でしているけど,その裏ではC言語さんたちが malloc しまくっているんだよねという話です.そうか,そんなこと考えもしなかったなあ,などとちょっと反省.


それと,昼飯に出かけたとき, PHPserialize 関数は,その変数を文字列に変換するという話をしていたときです.(ふるはしくんもいたので,msgpackがらみの話をしていたときですね).まあ,普通に考えてバイナリじゃないとかありえないよね,どんだけ富豪だよ,という話になり,ここでもちょっと反省(いや,別に僕が反省することでもないんですが,疑問にも思わなかったなあ,というのがなんとなくイカン気分になりましたw).


さて,もう1つが,インターンの最後のほうになり,おかだいさんとのミーティング中に,データ量が多くなるとディスクに書き出す以外の,メモリに保持するデータ(キーワード <-> キーワードID のマッピング情報とか) でメモリ結構食うようになってしまうよね,という話になったとき.「intのvectorなら4バイトの要素倍だけど,mapだとまーだいたい10倍くらいの40バイトくらいは見といたほうが」という話をしていました.そのときに「40バイトですか..デカいですね」と僕が言ったのに対し,「40バイトをデカいと言うようになったか」という話になり,僕がそんなことを言うようになったことがなにかおかしい気分でしたw


また,今回は転置インデックスを保存するファイルは最終的にはバイナリ形式で自分で形式を決めて作ったのですが,TCで行き詰ったとき,さらっと「自分でやっちゃえばそこ」と皆さんに言われました.データ構造が決まっているとき,汎用的なライブラリを使うよりも自分で管理するものを作ったほうがうまくいったりする,というのも1つ教訓です.

最終発表後の飲み会でおかだいさんに「低レイヤーのことやりたいと言うとは思わなくて,まあとりあえずやらせてみるのもいいかなとおもってやらせてみて,途中でもーいやだーとか言うかと思ったけど嬉々としてやっていておどろいた」 と,言われたので,そう思われたということは僕のインターンは成功したということでしょう :p


たった2ヶ月でしたが,ほかのインターンのみんなも社員さんもみんなレベルが高くて,本当に刺激的で勉強になるインターンシップでした.参加して本当によかった!めちゃくちゃ楽しかったです!

ということで


PFI,めっちゃ素敵な会社ですよ.来年の夏とか,もしかしたら冬とか,春とか,インターンまたやりたいね,と言っていたので,学生はふるって応募すべし!有意義な時間をすごせること間違いなしです.

ありがとうございました! *8

*1:ああ,そうそう,3月にGoogleで面接うけたんですが,そのときもホワイトボードにプログラムを書いたりしました.で,僕はもともとアプリケーション寄りの人間なのでこれが凄く苦手で.

*2:将来的に [http://preferred.jp/prd_sedue.html:title=Sedue](PFIの主力製品!)にも組み込める形を意識しつつ

*3:ただし,5人全員がこうではなく,それぞれのみなさん活躍されてる人ばかりだったので,期間などにも違いがありました!

*4:まあ,そうするとTokyo Dystopiaと比べてどこが良くなるのかというと,圧縮する,くらいの点だったのですが

*5:このあたりは,TCをちゃんと使えてるのかとか,チューニングがちゃんとできてるのかとか,自分のプログラムの書き方に問題がないか,など色々な話はありましたが,結局,アプローチの問題で,このままではある程度まではいけても一定以上スケールしないということは明らかでした.

*6:普段はただの声y うわなにをするやm

*7:おかげでバスケ中にmallocとか考えるようになりました(違

*8:で,僕は卒業までもう少しアルバイトとしてお世話になることになりました...w インターンでやりのこしたことと,新しくやりたいネタを,やらせていただく予定です!