はてなインターンのカリキュラム

インターンも2週間が終了し、これからが後半戦です。僕は合格点ぎりぎりでしたが、後半に進むことが出来ました。その前半全10日、OOPからMapReduceまでの模様を振り返りたいと思います。

IMGP3134.PEF

 
1日目: はてなイントロダクション
id:jkondoからはてなの概要とインターンの趣旨について、id:naoyaからはてなの大規模システムについて、それぞれプレゼンテーションがありました。その後はウェルカムパーティー。

メンバーがかなりすごいバックグラウンドの人ばかりで、気後れするも、ビールの力でわいわいやっているうちに時間は過ぎていきました。

 

2日目: Perlオブジェクト指向プログラミング
id:antipopからPerlでのOOPについて解説。OOPとは何か、なぜOOPかという説明からはじまって、実際のコードを使った解説へと進みます。デザインパターン、テスト駆動開発等についても触れていきます。(テストがない状態でのリファクタリングは、すぐに泥沼化すること等)

恥ずかしながら普段はC言語しか使わないので、OOPには馴染みが薄かったのですが、一応Objective-CとC++を使ったことがあるので、その知識を動員してなんとか乗り切りました。Observerパターンを使う課題があって、とりあえず本の通りに実装したら綺麗に動いて感動。この日は割と遅くまで残って課題をこなしました。

 

3日目: ORマッパー
id:onishiからはてなの内製ORマッパーであるDBIx::MoCoについて解説。MoCoはid:jkondo開発とのこと。社長がライブラリを作っている会社・・・。ライブラリを自作すると、必要な機能をコンパクトに実装できて良いらしい。対応DBはMySQL。名前の由来は、近藤家にあるいい感じのクッションらしいです・・・適当!

この日はTodoリストを管理するCLIアプリケーションを作成。この日の課題を5日目まで使い回すので、もう少し頑張っておくべきだったか・・・。

IMGP3140.PEF 

4日目: MVCによるWebアプリケーション作成
昨日の課題をModelとして、ViewとControllerを実装します。これまた自社フレームワークであるRidge (id:naoya作) を使う方法を、id:motemenのご指導のもとで学んでいきます。Ridgeには簡易サーバも付いているので、自分のローカル環境で試すことが可能です。ViewにはTemplate Toolkitが使われていました。

昨日のORマッパに比べて結構簡単に感じたのですが、画面遷移のセオリーがわからず、アクションがごちゃごちゃのまま設計したところ、厳しく採点されてしまいました。また、ちょっとつっこんだことをやろうと思うとすぐにControllerが汚くなってしまうので、Modelをまた弄り直して・・・と結構手戻りが発生して意外と消耗。

 

5日目: ユーザインターフェイス
この日の講義はid:secondlifeから。JavaScriptを使って、昨日までの課題のUIを改良します。言うまでもなく自社ライブラリのTen.jsを使います。このTen.jsも、社内に様々なJSライブラリが氾濫していることを憂慮した社長が勉強しまくって(id:onishi曰く、id:jkondoは非常な頑張り屋とのこと)作ったそうです。

先週も書きましたが、JSとDOMの概念を全然知らなかったので、僕はここで結構躓きました。。id:GemmaにHello Worldから教えてもらって頑張ってみたのですが、その日のうちに課題終わらず。一応完成した人も、土日で完成度を上げていたようで、どうやらみんな土日に休むという概念はないらしい。

IMGP3120.PEF 

6日目: ThriftでRPC
この週から発展課題に入り、はてなの中でも割と導入してから日が浅い技術を扱います。この日はFacebookによるRPC実装Thriftが題材。異なる言語や処理系の間でRPCできるのですが、IDLをちょろちょろ書くと(サポートがあれば)スケルトンを生成してくれて、そこに処理を書くだけになっている親切設計。これは研究でも活用できるかも。

課題は異なる言語でサーバとクライアントを書くもの。呼び出す処理自体はただの加算と乗算なので簡単だったため、余った時間でいろいろな言語に走る人が多かったです。人気はC++とRubyでした。Scalaでサーバを実装したcho45さんやCocoaでクライアントを実装したhakobeさんのような猛者も現る。

この日は時間が余ったため、先週終わらなかった課題を実装・・・。

 

7日目: 大規模データ設計
id:naoyaから、大規模なデータを扱うシステムについての講義。DB設計や、Linuxのキャッシュについての話が前半で、後半は課題で使うアルゴリズムの説明でした。

課題は2つから選択可能で、僕ははてなブックマークから抽出したキーワードの転置インデックスを用いて、キーワードからブックマークの検索を行う課題をチョイス。Cosine Similarityという尺度を使って検索するのですが、データファイルが数百MBあるため、ナイーブに実装するとメモリ消費量が大変なことになります。そこで・・・というところまで含めて課題です。

IMGP3123.PEF

8日目: HadoopによるMapReduce
id:stanakaからMapReduceを使ったデータ処理について講義を伺いました。GoogleのMapReduceのオープンソース実装Hadoopを使って、実際にMapReduceプログラミングをするところまでが内容です。Java以外の言語でHadoopを使うHadoop Streamingについても詳しい解説アリ。

課題では、RFC仕様書のテキストデータすべてを読み込んで転置インデックスを作り、検索まで実装。僕はn-gramを使って順位付けを行う方法でやりました。MapReduceを二回回せば、n-gram入りの転置インデックスができます。MapとReduceの進行表示を見てにやにやする、異様な一日。ほとんどの人がMapReduce初体験だったので、盛り上がりました。

 

9日目: はてなを支えるインフラストラクチャ
id:hideokiからはてなのインフラについての講義。冗長化でいかにSPOF (Single Point of Failure) を回避するかという話や、ロードバランサ等のお話を伺いました。また、分散ファイルシステムMogileFSや、内製のサーバ管理ツールについても説明。1OSしか搭載しないサーバでも仮想化しておくと、ゲストOSがコケた際にホストOSから再起動できて便利、などのノウハウも。

この日は課題はなしで、昨日までの課題の再提出や、復習に充てる日になりました。僕はこの隙に課題を再提出して、なんとか及第点に到達。

IMGP3149.PEF 

10日目: 結果発表、配属決定
この日までの課題の評価で、後半に進むことが出来るかが決定されます。残念ながら10人のうち、1人が後半に進むことができませんでした。

その後、後半で配属される各チームのプレゼンテーションを見てから自分の希望するチームを選び、人数調整のあと晴れて配属先が決定となります。みんなそれぞれこだわりがあるので、この作業が結構難航。15分くらいわいわいやった末に、無事チームが決定。

僕ははてなダイアリーキーワードチームに配属になり、id:nmy, id:antipop, id:motemenにお世話になることになりました。id:nanto_viとはチームメイトです。皆さん、来週からよろしくお願いします!

IMGP3155.PEF 

以上までがこの2週間の流れでした。インターンのページにカリキュラムがなかなか出てこないので、日報を頼りに書いてみました。読み返してみると、やはり相当詰め込まれてますね (^^;) これでインターンのイメージが多少なりとも伝わると良いな、と思います。9月のインターンは明日が8/20が申込み〆切のようなので、迷っている方はお早めに! 

インターンが課題でどういうものを作ったかは、id:Gemmaの日記で見られます。
http://d.hatena.ne.jp/Gemma/20080814/1218709185

IMGP3105.PEF 

IMGP3159.PEF

IMGP3132.PEF 

IMGP3160.PEF 

IMGP3126.PEF

後半もよろしくお願いします!

 

8/17追記

インターンの申込み〆切は18日ではなく20日でしたので訂正しました。

Discussion Area - Leave a Comment