[Web開発者のための]大規模サービス技術入門 ―データ構造,メモリ,OS,DB,サーバ/インフラ
Special Report:はてなサマーインターン2009
2009年8月,(株)はてなの「はてなサマーインターン2009」が,京都の本社で開催されました。今回のインターン生はエンジニア6名,デザイナ4名。参加した学生の方々,講師の方々は,どのような姿勢で臨み,何を得たのでしょうか? 本レポートでは,個別のインタビューの模様をお届けします。
インターンシップ概要
2009年8月3日(月)から1ヵ月間,京都で開催された(株)はてなの「はてなサマーインターン2009」(strong>注1)。講義・演習を行うトレーニング,および本番サービスへの投入を視野に入れた実践的な開発実習の二本柱で,実際の「はてなのWebサービス」をテーマとしたインプット/アウトプットを体験できる盛りだくさんの内容でした。エンジニア向けプログラムは,表1,表2のようなカリキュラムおよびスケジュールで進められました。
本レポートでは,前半2週間の講義・演習終了後に行った,エンジニアインターン生6名,はてな最高技術責任者(CTO)伊藤 直也氏(id:naoya),今年のインターンシッププログラムのディレクター田中 慎司氏(id:stanaka)へのインタビューの模様をお届けします。
表1 エンジニア向けのインターンシップカリキュラム
日程 | 概要 |
---|---|
前半2週間 講義と演習 | |
第一週 | テーマ「はてなのサービス基本形,はてな流開発の作法」 |
1日め | id:stanaka(田中 慎司)氏によるオリエンテーションとインフラ概論,id:naoya(伊藤 直也)氏による開発体制の説明,id:ninjinkun氏による開発環境指南 |
2日め | id:cho45氏による「Perlによるオブジェクト指向プログラミング」 |
3日め | id:onishi氏による「ORマッパによるデータベース操作」(DBIx::MoCo) |
4日め | id:nanolia氏による「MVCによるWebアプリケーション開発」(Ridge) |
5日め | id:chris4403氏による「ユーザインターフェースプログラミング」(Ten.jsとRidge+MoCoでAjaxアプリ) |
第二週 | テーマ「大規模データ処理,基礎と実践」 |
6日め | id:naoya氏による「はてな流大規模データ処理」 |
7日め | id:motemen氏による「はてなのデータでアルゴリズムを実用化する」 |
8日め | id:r_kurain氏による「はてなのデータで検索エンジンを作る」 |
9日め | id:stanaka氏による「はてなのインフラストラクチャ」 |
後半2週間 新機能開発 |
表2 1日のスケジュール(前半2週間の講義・演習期間)
時間帯/流れ | 内容 |
---|---|
午前 | 2時間程度の講義 講義の最後 毎回のテーマに合わせた課題を3問程度出題 |
午後 | 演習時間 |
翌日10:30 | インターン生は演習答案のソースコードをgitリポジトリにpush |
翌日13:00過ぎ | 講師は演習の評価ならびに講評を参加者にフィートバック |
- 注1)
- 同社インターンシップに関するページはこちら。
インターン生インタビュー
エンジニアインターン生はid:nyanp氏,id:mi_kattun氏,id:mrorii氏,id:syou6162氏,id:mechairoi 氏,id:yaotti氏の6名(写真1)で,それぞれ情報系専攻の出身者,Webアプリケーション開発のアルバイト経験者,ICPC(Information and Communications Policy Conference)のコンテスト参加経験者をはじめ,さまざまなバックグラウンドを持つ強者ぞろいのインターン生たち。今回のインターンで技術的に学べた点を中心に,話しをうかがいました。
写真1 はてなサマーインターン参加者
(後列左より)id:mi_kattun,id:hxmasaki(はてなインフラ部から参加の聴講生),id:nyanp,id:yaotti,(前列左より)id:syou6162,id:mechairoi,id:mrorii。
- Q:学校と比べて,インターンに来てみて感じた違いはありましたか?
id:mrorii:学校では,やはり理論の勉強してとくに研究では論文読んで頭の中でこうすればいいを考え抜くというスタンスで,もっぱら理論中心に考えています。一方,はてなだと何より実際にサービスを運用していくことが常に先にありますから,それこそまったく違いました。プログラミングレベルの話もそうですし,インフラレベルの話も新鮮でした。
- Q:講義で,技術的におもしろ味を感じた点は?
id:yaotti:大規模なデータ処理を実際自分でやったことがなかったので,そこを体験できたのがよかったです。たとえば,良さそうなアルゴリズムを思いついてそれを実装したら一気に速くなる,考え方によってうまく作ればマシン数は少なくて済むなど,アイディアが結果につながるというあたりはわくわくしました。
- Q:おもしろかった課題は?
id:nyanp:全部おもしろかったのですが,検索エンジンを作る課題が8日めにありました。最初にカリキュラムを見たときに「1日で検索エンジン作るんだ!?」とびくびくしていたのですが,実際に連日の講義を通して理解を重ねて,8日めでは自分で考えながら動く検索エンジンを作成できました。作れたときは,感慨深かったですね。あー,ここまでできたなって。
id:yaotti:講義6日めの大規模データ処理や圧縮,8日めの検索がおもしろかったです。検索は,圧縮などその前に作ったプログラムを活用するという感覚があり,一連のプログラムを作り込んでいくような楽しさがありました。たとえば,圧縮を学んだ後だと,扱うデータが大きい場合,少し余計な処理入れただけでそこは何回も使われて重くなるという問題が直観的に理解できます。問題個所を実際に自分で調べてそこを外しても動くかを調べて,実際試して処理が速くなったりコンパクトになったりと,検証して実際に変化が見えるのがおもしろかったですね。
- Q:プログラミング環境や経験について教えてください。
id:nyanp:研究室ではWindowsプログラミングで,基本的にC♯などVisual Studioが中心です。なので,自分の場合,はてなに来てからまずLinuxやEmacsの環境整備して,.emacsいじってあれこれ,そこから始まりました。
id:mechairoi:自分はいろいろ使ってきましたが,研究ではないところだと学校の授業の影響もありつつ趣味丸出しでSchemeで書いているプログラムがあります。引き継ぎが必要なプログラムなので,引き継ぎのために書き直さないといけないのですが,進んでいない状態です(笑)。
id:mi_kattun:学校とは別になりますが,Webプログラマのアルバイト経験があります。フレームワークだと,PHPのsymphonyやPythonのDjangoなどを使って開発していました。
- Q:開発全般で,苦戦した部分はありましたか?
id:mechairoi:自分はPerlにそれほど慣れてないこともあって,はまるところが多かったです。あれあれ,こんなところで? というような個所で(笑)。Perlって省略できるカッコなどが多くて省略し過ぎてはまるとか,単純なタイプミスも出てしまって,たとえば単語の途中で文字がよくスワップしていて,この行でエラー出てるけどなんで? と見ると,入れ替わってることに気づかないことがありました。JavaScriptだとエラーも出ずに新しいプロパティができて,ということもありました。演習ではけっこう大量にコードを書いてきているので,慣れると違ってくるかもしれません。
- Q:講義を通して,もっと詳しく知りたくなったトピックはありましたか?
id:mrorii:6日めのid:naoyaさんの講義のときに,MySQLで実践的なテクニック,インデックスの部分のノウハウなどに話しが及んでいたので,そのあたりはもっと知りたいと思いました。現場ならではの技のような,書籍や雑誌には取り上げられていない実践的なテクニックについて,もっと詳しくなりたいと思いました。
id:mechairoi:去年のカリキュラムを見て,HadoopやThriftを使った分散処理などの講義があったというのを見ました。大規模な分散処理は実際に触ってみたい部分でしたので,もっと詳しく知りたいと思っています。実際に作ってみるとどうなるのか,とても興味があります。
- Q:インターンに来てみて,予想外だったことはありますか?
id:syou6162:毎日10時間以上,ひたすらコーディングしていますから,すごい密度だと思いました。講義第一週はある程度イメージしていたWeb アプリケーション開発の中身どおりでしたが,第2週の大規模データ処理では,Webアプリケーションとは? という範疇(はんちゅう)にとどまらず根本的なアルゴリズムやデータ構造に関する深い知識も要求される点について実感が沸いてきました。また,はてなのエンジニアの方々はそのあたりをしっかり持たれているというのを,間近で認識できたというは収穫でした。
- Q:現時点で,将来的にWebアプリケーションエンジニアになりたい度はどのくらいですか?
id:mi_kattun:まだ定まっていません。どの業界でもそうかもしれませんが,この業界が行く行くどうなるのかっていうと……。直近の短いスパンで考えるとプログラマとしてやってみたいと思いますが,将来どうなるかはよく考えたいと思っています。プログラマ35歳定年説もよく聞く話ですから体力も落ちていった中でできるのかというのもあり,また今の自分としてはマネジメントよりプログラムを書くほうに興味がありますがそもそもやっていけるのかというのもあり……。そのようなところを,はてなのエンジニアの方々にお話を聞きたいと思ってたのも,今回の参加理由の一つでした。インターン期間途中の今は,課題が忙しくてそれどころじゃないですけれど(笑)。機会があったらお聞きしたいですね。
伊藤直也氏インタビュー
伊藤直也氏は,初日の開発体制,および6日めの大規模データ処理の講義に講師として登壇しました。講義ならびにインターン前半2週間の総評について,うかがいました。
- Q:ご担当なさった初日の開発体制,6日めのはてな流の大規模データ処理,2つの講義について,ここを理解しておいてもらいたいという意図についてお聞かせください。
伊藤氏(以下,伊):まず講義の位置付けについてお話しすると,インターンカリキュラムの後半2週間では新機能の開発体験がありますので,後半の開発がスムーズに進むように,前半では講義期間を設けました。
そこで,初日の開発体制の講義では,どんなツールを使ってどのようなチーム編成で開発しているのかがわからないと,後半の開発時にインターン生各自がチームに入ったときに自分の役割をうまく認識できないと思いましたので,開発の流儀を含めて話しをしました。
次に,大規模データの講義は,実際にサービスを運用することを想定してコードを書き始めると,第一週の講義で取り上げたようなHow-toとは別にわからないことが出てきます。たとえば,非常に大きいデータがあって,メモリの中で全部処理できれば問題のないデータが少しでもはみ出たときにパフォーマンスがいきなり落ちる。そのような問題が起きることをつかんでおかないと,いきなりコードをコミットして動かしたらシステムがダウンしてしまうケースがありますので,そのようなポイントを理解してもらうことを目指しました。
- Q:ご担当分の講義後の課題について,出題や評価はどのあたりに重点を置かれたのでしょうか。
伊:第一週の講義は,保守性の高いアプリケーションを複数人数で開発するときに,キレイに書いておけば拡張性が高く作れますという点が主題でした。
一方,たとえば検索エンジンのコアの部分を実際に作ろうとすると,保守性をある程度犠牲にしてスピードとかサイズを優先しなくてはならない場面に必ずあたる,可読性や速度のトレードオフは,エンジニアが考えなくてはならない点としてあると思っています。
第二週の講義からは大規模データの扱いに主題が切り替わりました。その中で,可読性を重視するインターン生,重視していなかったインターン生のコードと比べたときに,今回はキレイなほうが速度が遅くなっていました。自分の講義では作法にならって書いてほしいというよりは,ほかの人と比較することで必ずしも抽象化すればいいわけではないという点を理解してもらいたいと思っていました。実感として自分が書いたコードがどのくらいのスピードが出て,ほかの人と比べると速いのか遅いのかとか,あるいはそれを速くするためにはどこを潰さなきゃいけないのか,というのを探ってもらいたいと考えました。
- Q:可読性と速度のトレードオフについて,具体的に習得のヒントはありますか?
伊:速くするための方法というのは,いろいろ存在します。ただ,それは詰まるところHow-Toですので,あまりそこを一生懸命覚えても仕方ありません。大切なのは,コードのどこが遅いかという点を正しく把握することです。プロファイラツールを用いてきちんとプロファイリングをして,コードのこの行がこのくらいの時間がかかっているという問題を正確に追えれば,どこを直せばいいかっていうのは自明です。とにかく,それをトライしてほしいと考えていたら,インターン生の中にはちゃんとやる人が出てきました。その人のコードは速いですね。推測しないで計測する,という姿勢を理解してもらえたように思います。
- Q:最後に,今年のインターンの講義や雰囲気についてお聞かせください。
伊:課題では難しいという声が多く上がりましたが,見ているとみんな順調に解けているのでよかったのではないかと思います。また,インターン生から大学の授業だけだとわからないような話を体系的に知れて密度が非常に濃いという感想ももらっていまして,今までのところはお互いにうまく進んでいるようです。
講義期間は,学生と社員同士の交流の役割も果たしていると感じています。最初からいきなりチームに入ってチームの中で開発してねというとそのチーム内では仲良くなりますが,チーム以外の社員と触れ合う機会がどうしても少なくなってしまいます。そこで,はてなという会社にコミットする,そんな意識を高めてもらうために,最初に講義でいろんな人と触れ合ってもらえたらと考えていました。ここに来て,打ち解けてきて良い雰囲気が作れてきた感じています。これからの後半の開発では,存分に力を発揮していってほしいですね。
田中慎司氏インタビュー
初日オリエンテーション&インフラ概論,9日めにインフラについての講義の一方,今年のインターンシップ全体のディレクションを担当された田中慎司氏。講義とインターンシッププログラム全体の手応えについて,うかがいました。
- Q:ご担当分の講義で,インターン生にキャッチしてほしかったポイントはどのあたりでしたか?
田中氏(以下,田):今年のインターン生は,全体的には,情報系の人が多くコンピュータというものには触れているけど,Webサービスという応用は未経験というレベル感でした。
初日のインフラ概論の講義では,まずコンピュータそのものはある程度知った上で,Webサービスというシステムをどうやって組み上げるかについて話をしました。次にオリエンテーションでは,最近はインターネットで技術情報は世の中に溢れていてネットの情報で日々収集・勉強していると思いますが,技術知識を一挙に理解して集中的にカリキュラムとしてやるというインターンシップの効果を高めるために,メンタル的にモチベーションを高く持ってもらって,いわゆる高速道路を突っ走ってもらおうという意図やそのための心構えについて話しました。
9日めのインフラの講義は2週間にわたった講義の最終日で,インターン生はもうずっと詰め込まれてきたので,最後にもう少しゆるい感じで聞いてもらえるように解説をまとめていきました。今回の担当したのは,アプリケーションエンジニア向けのカリキュラムでした。自分が主にやっているインフラとはレイヤが違いますので,Webアプリケーションエンジニアとしてコードを書く上で,知ってほしいインフラ周りの知識を紹介しました。
- Q:反応を見てどうでしたか?
田:講義中の質問,反応からの感触になりますが,インフラ系のトピックは最近よく話題に上がっています。たとえばSSDのような新しいハードウェアですとか,あとはクラウドコンピューティングのような新しい概念,新しいサービス形態などの話を織り交ぜつつ話したんで,そのあたりでインターン生から逐一反応があったはよかったと思います。
- Q:広くこれから業界へ来る方に向けてのメッセージとして,実務を通して掴んでいってほしいというポイントをお聞かせください。
田:はてなのWebアプリケーションの特徴やサービスの規模を想定してお話しすると,アプリケーションエンジニアは,システムのレイヤとしてもいろいろなレベルで,品質という面でもいろいろなコードに触る機会があり,扱うデータ,システムの規模にもさまざまな段階があります。たとえば,サービスの立ち上げの段階でプロトタイプを作ったり,それがどんどん成長していって大規模なシステムとなるところまで進めたり,すでに大規模なサービスへの機能追加をしたり,さまざまなフェーズでさまざまな規模のコードを触ることになります。
一方で,自社でサービスを抱えているとサービスが生み出される瞬間から,そのサービスがどんどん大規模になっていく過程を追ってコードのメンテが必要になります。とくに初期の変化の激しいころのコードをスピード感を持って追加する,あとは後半になってきてシステムが大きくなってシステムを安定させたり品質を高めたりするなど,同じアプリケーションでもフェーズの異なるコードを触ることがあり,幅広い状況に対応できるようなスキルが求められます。
学生の間はあまり大規模なサービスに触ることはなく,多くの人にとって学生のころに作ったコードはわりとコンパクトで,大規模で動かすこと,何年もメンテされることを想定してコードを書くことはないと思います。はてなのシステムでは,インターン生が書いてくれたコードも,この後,年単位で動き続けることは珍しくはないでしょう。
スピード感を持った開発をすることと,何年間も使われ続けてその風化に耐えるコードを書く,その両立は難しいのですが,2つの面があることを知ってほしい。合わせて,システムが大規模になったときには,インフラでの課題とアプリケーションでの課題,その境界領域がどんどん曖昧になってきます。そこで両サイドからアプローチしながら解決していく,その過程で何をどう作っていくのかという点を総合的に掴んでいってもらえたら,というのが私の考えですね。