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

インターンも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

はてなnaoyaさん「はてなを支えるバックエンドシステム」

京都で行われたオープンソースカンファレンス2008 Kansaiに行ってきました。

OSC KANSAI

はてなのCTO naoyaさんの発表を聞いて来たのですが、創業時から現在までのインフラ構築の工夫や苦労を語られていました。

はてなnaoyaさん
はてなを支えるバックエンドシステム
関西のエンジニア業界を盛り上げたい

OSC KANSAI

アジェンダ
はてなのサービスを支えるバックエンドシステムを解説
創業時からこれまでの変遷

はてな
ハードウェア350台
14ラック
トラフィックはピーク時は200Mbps

OSC KANSAI

はてなの2001年創業時
人力検索
PentiumsIIIの自作PCで動していた
CGIがボトルネック
CGI->Apache::Registryに変更

mod_perlサーバのメモリ消費が多い
mod_perlが必要ないリクエストもmod_perlが応答する
staticな情報もmod_perlが応答してしまう
Reverse Proxyで三層構造に
静的ファイルはmod_perlなしのフロントが
動的ページはバックエンドが返却

アクセス増加に伴いリソースが不足
Web/DBでハードを分けて分散
PostgreSQL->MySQLへ変更
Web+DB PressでMySQLがおすすめされちた
監視用にNagios導入−>ケータイへメールして監視

Webサーバ自体のリソースの不足
Reverse Proxyとバックエンドのハードウェアを分離

当時のはてな
会社を支えるだけの収益はまだ見えず
受託開発を開始
同じようなプログラム開発の繰り返し
Hatenaフレームワーク作成
MVCフレームワーク
Perlオブジェクト指向
DB操作、mod_perl API

OSC KANSAI

OSC KANSAI

はてなアンテナ開発
複数の異なるサービスをひとつのサイトで運営
Reverse Proxyで振り分け

試行錯誤により徐々に三層構造に
フレームワークにより開発が効率化->はてなアンテナ
はてなアンテナのヒットによってサーバが増え始める

負荷が増大
mod_perlを増設
mod_reireのRewriteMapで振り分け
DBをテーブル単位で分割
巡回サーバを追加
結合していないテーブルを別のサーバに振り分けていた

増え続けるハードウェア
形がバラバラのPCケース
場所

メンテナンス性

商用サーバは高品質だが効果的

サーバーケースを設計
ケースを設計
サーバーは自作
エアフローも考慮

MySQLが過負荷
MySQLレプリケーション
レプリケーションでレプリカを増やす
参照クエリはスレーブへ、更新はマスタへ
レプリケーションはサポートされたばかりで少し危なかった
振り分けロジックはフレームワークで吸収

mod_perlサーバを継続的に追加
MySQLスレーブを継続的に追加

ルータもLinuxボックス

サービスは週末に開発

2003年はてなダイアリーサービス開始
はてなダイアリーのバックエンド
過去の反省を活かしたテーブル編成

Revese Proxyが接続集荷場に

サービス毎に一つ以上配置
一部はDNSラウンドロビン
ロードバランサを買うお金がなかった
2004年2月東京移転
サービスを一日停止してトラックで搬送
当時のサーバー台数は50台
配送の様子をリアルタイム配信したりしていた

続々サービス追加
フレームワークのバージョンアップ
設計の見直し、UTF-8対応

サーバー追加
トラフィック追加

続くブログブーム
予測不可能なトラフィックの伸び
商用サーバ納期数週間では間に合わない

自作サーバの利点
早い、うまい、安い
柔軟に構成変更可能

mod_perlサーバが落ちると数分の一の確率で繋がらなくなる
Rverse Proxyはフェイルオーバー機能を持っていないため
mod_proxy_balancer追加

開発合宿でブックマークが開発

エンジニアが増加、サービス追加が続く

当時の運用の問題点
SPOF多数
まともにフェイルオーバーしていたのはmod_prxy_balancerのみ

人力対応の限界
回線飽和
ベストエフォート100Mbps回線
太い商用回線を借りるほどのお金がない
電力不足
サーバを追加したらブレーカーが落ちる
運用担当の踏ん張りに依存
消耗戦

運用の複雑化
属人的な運用体制の限界

Klabさんとの出会い
DSASオープンソースで完璧な可用性
こんなに簡単!Linuxでロードバランサ
ほとんどお金をかけずに耐障害性を上げていた

DSAS構築の経験からアドバイスを頂く
安心して寝たいから頑張る
データセンターを見学させていただく

LVS+keepalived
Linuxでロードバランサ
VRRPを使ってサーバの入れ替えを自答でやってくれるm
MySQLの手前にLVSを導入
内向けロードバランス
多数のSPOFが解消される

運用の効率化
アプリケーション担当とインフラ担当の仕事の分離が可能に
インフラ側はアプリケーションのことをあまり知らなくてもLVSの操作で切り替えができるようなった
さーくらインターネットiDCへ
DC分の収益は確保できるまでに成長
一年がかりでデータセンター移行
また車で移動・・・
データセンターで体を動かすとなぜか充実感

データセンター移行に伴い
インフラチームを発足、体制強化
古いサーバーをリプレース
CentOS、64bit化
Web+DB部分はほぼ冗長化

故障後のリカバリが面倒な箇所を一部商用サーバに
商用サーバはメモリの故障なども検知可能なのが助かった
メモリが壊れてビット反転、テーブルが壊れるなどあったので・・・

64bt化の追い風
メモリ4GBの壁を突破
メモリが安くなった
DBデータの大部分をOSがキャッシュできる
テーブル分割の必要性が下がる

MySQLのマスタがSPOF

マルチマスタ化
お互いにお互いのスレーブの関係

ファイルサーバがSPOF

DRBDの導入
ブロックデバイスのドライバ
ネットワーク経由でRAIDのようなことが出来る
DRBDで画像保持
lighttpdで画像は信
Squidでキャッシュ
大容量ファイルはMogileFS

新しいインフラが出来るまで
はてなインフラのターニングポイント
klabさんに感謝
チーム体制の役割分担
DC移転タイミングでの再設計
オープンソースでも高可用性インフラ

攻めのインフラ

フレームワークの刷新
Rails, Catalystと比べると古い
自社開発のPerlフレームワーク
Ridge+DBIx::MoCo
ORマッパDVIx::MoCoは近藤社長が開発
メソッドチェインが実装されている
ローカルで開発可能

自分たちで作る意味
コアの設計を自分たちで変えられる
サーバーリソースを使い切れない多数のホスト
バッチ処理専用サーバ
メルサーバ
トラフィックの少ないサーバ

仮想化技術の導入
Xen
1台のハードウェアで複数のOS
現在450ホスト中100ホストが仮想環境で動作中

仮想ホストをディスクレスサーバーで
中央のファイルサーバからOSのイメージを転送

ログ解析が終わらない
大規模データ処理に時間がかかる
Hadoopの導入
GoogleのMapReduceのOSS版
分散ファイルクラスタ

さらなる運用の効率化
OSの自動インストール
PXE Bootでインストール
はてな内RPMレポジトリ
Perlモジュール、カスタマイズしたソフト、自社ライブラリ

Puppet
Capistrano

数百台規模のサーバー情報の管理
スペック、用途、ラック番号、負荷グラフ
サーバー管理ツールの開発
サーバーホストの情報はサーバーから自動取得
負荷状況調査
他ツールとの連携
Nagios設定ファイルの自動生成Capistranoへデプロイ先を自動配信

バックアップツールNotch

はてなと風力発電

試行錯誤のうちに定番手法に行き着くことが多い

守りから責め攻めに転じることができた
インフラの仕事はとてもクリエイティブ
自分たちの得意技を活かして運用効率化できる

インターン募集中

はてな訪問してきました

4月24日に知人のおしりにくっついて、はてなの京都本社を訪問してきました。知人はビジネスプランを売り込みに来たようですが、成功したかは・・・。

僕はただの好奇心で見に行ったのですが、id:jkondoさんやid:naoyaさんとお話しできて楽しかったです。(自分のやってきたことを多少プレゼンする機会もあって少し焦った)スタッフの方も非常に親切で、お昼までごちそうになってしまいました。

大きな炊飯器でご飯が炊かれていたのがなんだかアットホーム。id:reikonさんとid:jkondoさんのあうんの呼吸な掛け合い何度か目撃し(特にごはんのタイミング)、この会社がどう成長してきたかの一端を垣間見た思いでした。パートナー大事ですね、パートナー。

はてな京都本社

烏丸御池の駅からすぐ近くのオフィス

はてな京都本社

透明なパーティションで区切られた空間

はてな京都本社

中央のテーブルの端にはpolycomがあって東京オフィスと常時接続されています

はてな京都本社

噂の卓球台だ!

オフィスはイメージより広くはなかったのですが、アクリルのパーティーションのおかげもあって狭さはない感じ。固定されたデスクトップPCで広いモニタを使っている人、ノートPCで好きに動き回っている人など様々でした。このあたりは自分の好みで選べるようです。エンジニアはデスクトップが多めとのこと。

何度かメディアやブログで拝見していたオフィスですが、実際に行ってみても快適そうな。はてなの皆さんありがとうございました!