前々回、前回に続き、本レポートでは、(株)はてなのはてなサマーインターン2009の第二週(2009年8月10日~13日)に行われた、エンジニア向け講義の様子を中心にお届けする。
第二週:6日め~9日め
インターンシップの6日め~9日め(8月10日~8月13日の4日間)のテーマは「大規模化」。はてなのサービス開発で必要になる大規模な環境、大規模なデータへの基本的なアプローチを学ぶ。第二週は、以下のテーマで講義が行われた。
- 第二週の講義:
- 6日め:id:naoya氏の「はてな流大規模データ処理」
- 7日め:id:motemen氏の「はてなのデータでアルゴリズムを実用化する」
- 8日め:id:r_kurain氏の「はてなのデータで検索エンジンを作る」
- 9日め:id:stanaka氏の「はてなのインフラストラクチャ」
いずれも、大規模なWebアプリケーション環境を稼動させる現場であるからこそ本格的に学べる内容である。6日め~8日めの講義では、はてなで実際に動いているシステム/機能をベースとした大規模なWebアプリケーション環境を想定し、そこで必要とされる知識、考え方について、次の2つの面から取り上げられた。
- 大規模なWebアプリケーションシステムを構築する現場でとられる種種の技法、という「実務サイド」からのアプローチ
- アカデミックな場でのセオリーを実際の問題にいかに適用していくのか、という「教科書サイド」からのアプローチ
6日めの講義メモ
6日めの講義は、id:naoya氏による「はてな流大規模データ処理」。はてなにおけるサービス設計、大規模データの規模感、取り扱う感覚および注意点と、その内容は盛りだくさん。Webアプリケーションシステムが大規模になると何が変わるのか? どのように問題を切り分けるのか? 大規模なデータの処理で必要とされる考え方とは? など、さまざまな着眼点を提示しながら、以下の枠組みに沿って丁寧に解説された。
- 大規模なデータとは
- OSのキャッシュのしくみ
- 分散を考慮したMySQLの運用
- 大規模データアプリケーションの開発の第一歩
刻々と変化する大規模なWebアプリケーションシステムを動かし続ける難しさ、おもしろさは、学生の参加者とって未知の領域。低レイヤからアプリケーション設計に至るまで幅広く言及され、大規模なサービス環境となると問題に幅広い関連分野の技術知識が一挙に投入される、その様子を切り取りながら解説され、参加者にとってはかなり刺激になっていた様子だった。
7日めの講義メモ
7日めの講義は、id:motemen氏による「はてなのデータでアルゴリズムを実用化する」。冒頭では「教科書に掲載されているアルゴリズムを製品に応用する楽しみ、考え方を学ぶ」という講義の目的が説明され、以下の流れで解説が進められた。
- アルゴリズムの基礎的な解説
- はてなの中のアルゴリズム
- 課題(はてなキーワードリンク)に関連した解説
Suffix Array(接尾辞配列)やTrie(トライ木)などの基礎知識の解説では、参加者の質問を受けながら図解満載で説明された。また、アルゴリズムの応用例としては、実際にはてなではどのような機能がどのくらいの性能を求められているのか、そこではどのようなアルゴリズムやしくみが使って実現されているのか、などについて事例を交えて解説が進んだ。
途中、アルゴリズムの応用例の解説では、id:birdie7氏が登場し、「うごメモはてな」(※1)を対象として、動画の機械学習による自動判定で実装されている手法について紹介された。実際に用いられているアルゴリズムを中心に、うごメモのカメラ特有で見られる画像の特徴を押さえる検出方法、実験方法や検出結果など、平易に解説された。
8日めの講義メモ
8日めの講義は、id:r_kurain氏による「はてなのデータで検索エンジンを作る」。アプリケーションエンジニアの立場から、大規模データを扱う実装の一例である「検索エンジン」を作ることを目標として、解説が行われた。
午前2時間の講義と午後半日程度の実習と時間が限られることもあり、この日は以下のような一連の処理のうち、
- クロール
- 格納
- Indexing
- 検索
- スコアリング
- 結果表示
「Index」「検索」に焦点が当てられ、基礎知識が説明されていった。講義の序盤では講師のid:r_kurain氏から「形態素解析器を少しでも使ったことがありますか」「N-gramって何かわかりますか」という質問が投げられたところ、それぞれ参加者の半数以上が挙手。8日めの課題は、はてなブックマークの全文検索機能の作成、しかも速度と精度も勝負する、という難題かと思えたが、検索は比較的得意分野とする参加者が多かったようだ。
9日めの講義メモ
講義期間の最終日、9日めの講義はid:stanaka氏による「はてなのインフラストラクチャ」。同氏から提示された、この日の目標は「はてなのバックエンドがどのように動いているかを学び、コミットするコードが動く環境をイメージできるようにする」こと。
講義初日のオリエンテーションでの「はてなの大規模Webサービスの概要」を踏まえつつ、低レイヤからアッパーレイヤへと、より低くより高く解説範囲を拡充し、インフラとサービスの関係について解説が進んだ。キーワードは以下のとおり。
- Webサービス
- はてなインフラ2009
- スケーラビリティ
- 冗長化
- 効率向上
- ネットワーク
現在はてなでは、サービスのディレクション、アプリケーション、インフラまでを、自前で開発/管理している。そんなはてなでのインターンを経験するというのは一つの機会なので、システムの全体像を把握した上でアプリケーション開発に取り組めるという醍醐味を知って、経験を持ち帰ってほしいと述べられた。
第二週のおわりに:後半の新機能開発に向けて
第二週の講師からは講義の途中、後半の新機能開発を視野に入れ、どう後半にあたってほしいかなどについてそれぞれの立場から言及されていた。
id:motemen氏の「新機能の開発では、(参加者それぞれの)学校の専門を積極的に活かしてほしい」、id:r_kurain氏の「(本番サービスを視野に入れた)新機能をフルスクラッチから作れるのは貴重な体験」という二人のエンジニアの言葉は、インターン参加者にとって身近な目標が設定しやすくなるようなメッセージとなったのではないだろうか。
今回のはてなサマーインターンで全体進行ディレクションを担当したid:stanaka氏からは「大規模な環境での開発技法からインフラまで、今回の講義で学んだ技術を総合的に投入して後半に挑んでもらいたい」と、そして、同社CTO(最高技術責任者)のid:naoya氏からは「大規模な環境ではすべきことも、できることも違ってくる。容易ではないけれど、ぜひ開発の感覚を掴み取った上でコードをコミットしてほしい」とそれぞれ述べられ、講義過程を経たインターン参加者による後半の開発へ、大きな期待が込められていた。
以上、3回にわたって、はてなサマーインターン期間のうち、前半2週間のエンジニア向け講義の模様をお届けした。その後、前半2週間に続いて実施された後半2週間の開発を無事完了し、全1ヵ月に及んだはてなサマーインターン2009は、8月末についに最終日を迎えたとのこと。
学校とは違う開発現場を見てみたい、飛び込んでみたいと、インターン参加の動機をそれぞれ語ってくれたインターンの参加者たち。彼らの所期の目標は、十分に達成できたようだ。インターン参加者の活躍、そしてはてなのサービスの今後にも、ますます注目していきたい[1]。
- はてな
- URL:http://www.hatena.ne.jp/