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

インターンも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日でしたので訂正しました。

はてなインターンの手引き

はてなインターンの id:ninjinkun アサノです。8月4~29日までインターンとしてはてなに勤務しています。

このエントリは、Webアプリケーション未経験者の私が無謀にもはてなインターンに応募し、苦労している視点から書いています。同期のインターンは皆優秀で、私はどちらかというと着いていくので精一杯なのですが、未経験者の視点から書くのも逆に意味があるのかなと思い、インターンに来るまでにやっておいて良かったこと、やっておけば良かったことをメモしておきます。

IMGP2842.PEF

Perlの知識
はてなはPerlの会社です。「初めてのPerl」(リャマ本)と「続: はじめてのPerl」(アルパカアルカパ本)は読んでから行きましょう。特に「続」の方が重要で、リファレンスやオブジェクト指向はもちろんのこと、テスト等も使った課題が待ち受けています。私はスクリプト言語自体にそんなに馴染みがなかったので、この本を読んでいなかったら正直死んでいたと思います。なんらかのLLを常用している方なら「Perlクックブック」とかでも良いのかもしれません。

*NIXシェルの知識
基本的にターミナルを使って作業することになります。はてなの独自フレームワークをローカルに入れて課題をこなすのですが、自分のPCにインストール or インストール済みVMWareイメージをもらって使う、という選択ができます。いずれにしても*NIXのシェル操作は必須です。zsh + screen厨多し。

エディタの知識
Emacs vs Vimの論争に着いて行けるようにしましょう。基本的にはどちらかの陣営につくことになります。便利なEmacs LispやVimscriptを入れて、自慢し合いましょう。どちらも使ったことのないひとは、とにかく入れてみて、キーバインドを覚えましょう。

JavaScript + DOMの知識
ユーザインターフェイスプログラミングをさせられます。これが結構盲点で、DOMに触ったことのなかった私は現在ここで結構ハマっています。同期ではこの周辺に強い人が多いので、助けられながら何とかやっています。JavaScriptの簡単な構文と、DOMを弄る知識は身につけていきましょう。ライブラリなどを少し使ってみるのも良いと思います。ちなみにはてなは自社製ライブラリです。

はてな社員の知識
id:jkondoやid:naoyaはもちろんですが、id:antipopやid:secondlife、id:onishi, id:nagayama、id:motemen 等、京都でエンジニアとして勤務しているひとたちの知識を仕入れておくと良いです。僕に教えてくれるひとしか書いていません。すみません。ここに書かなかったひとも、今度いろいろ教えてください。

最後のはネタですが、会社に来てからでも良いので、どの社員の方がどの分野に強いのかを把握しておくと、いろいろ聞きやすいかも知れません。社員の方は全員恐ろしく優秀なので、どの分野のことでもさっと答えてくれますけどね!

他にも必須ではないですが、バージョン管理システムに多少慣れておくと良いでしょう。社内のバージョン管理システムはgitなので、自分でしばらくgitgitしてみると良いと思います。この辺はすぐになんとかなると思うので、あまり重要ではないです。

id:antipop

Web系アプリやLLの経験なしで、「はてな面白そうだぜ!とりあえず行けばなんとかなるやろ!」という勢いで応募してしまう人がいると思いますが、全くおすすめできません。勢いで応募してしまった私が断言します。同期は皆なんらかの経験を持っていて、さくさく課題を進めて行きますが、私は結構息切れしています。C言語で画像処理をしている人間には、新しいことが多すぎます。

しかしこのエントリにある事柄を予習してから参加されれば、課題についていくことは可能だと思います。まあ、同期は課題にさらに付加機能を付けて提出しているようですが・・・。

実際のインターンのプログラムも公開を検討していると聞いていますので、もしかしたらそのうち応募ページに掲載されるかもしれません。

id:jkondo

最後になりますが、はてなの環境は素晴らしく、社員の方も皆親切です。社長とも気軽に話せるし、手作りのお昼は出るし、冷蔵庫にはドクターペッパーが常備されているし・・・。

そして何より、ゼロベースだった私が飛躍的に成長している感覚があります。上ではおすすめできないと書いたのですが、未経験でもWebアプリケーションに興味を持っている人は、今すぐ応募するべきです。それは、このインターンがWebアプリの開発を学ぶ最短経路だと感じるからです。大学や大学院に通いながら片手間で勉強しているよりも、はるかに早いスピードで知識を身につけることができます。id:umedamochioが言われている、「高速道路」ですね。

はてなのインターンはその辺の「就業体験」とは全く違います。彼らはプロダクションレベルのコードを求めてきます。そして、実際にインターン生のコードがプロダクトに入る可能性があるのです。そのことに、私は今からわくわくしています。

未経験者こそ行くべき、というようなことを言えるほど甘い環境ではありません。しかし、向上心があり、今からインターンに向けた勉強を始められる方なら、飛び込んでみる価値はあると思います。このエントリはそのような方を対象に書きました。Webの世界にわくわくしている、まだ何者でもないひとへ、9月のインターン募集がまもなく始まります。あなたの夏の予定のなかに、はてなを加えてみてはいかがでしょう。

IMGP2909.PEF

IMGP2895.PEF

IMGP2911.PEF

IMGP2914.PEF

IMGP2899.PEF

IMGP2880.PEF

IMGP2878.PEF

8/11 追記
インターンが発表されていますね。デザイナーのインターンもあるようです。
http://www.hatena.ne.jp/company/staff/intern