技術者教育の視点で読む「大規模サービス技術入門」

[Web開発者のための]大規模サービス技術入門 ― データ構造、メモリ、OS、DB、サーバ/インフラ

  • 2010/7/7日
  • 伊藤直也,田中慎司 著



この本の冒頭にある「本書について」には以下のように書かれています。
  • 本書は、大規模サービスを開発・運用する技術者のための入門書です。

インフラレベルから(主に全文検索を例とした)アプリケーション開発まで、大規模サービスを構築するために必要な技術が俯瞰的に述べられています。

ところで「はてな」では毎年夏に学生向けの就職体験を目的としたインターンシップを実施しているとのことで、インターンシップ企画を通じて、「はてな」では大規模サービス技術の教育方法が体系化されたとのことです。
  • 本書では、このインターンシップでの講義をベースにして、大規模サービス技術を解説することを試みています。

私はこの本が出版された当時に買って読みました。しかしその時は興味あるところだけつまみ食いしただけで正直言えば印象が薄かったのですが、最近読み返したところ「教育方法の体系化」という点で非常に興味を持ちました。

今となっては少し古めの本かもしれませんが、本書に書かれている具体的な技術以上にとても勉強になり、面白さを感じたため取り上げることにしました。

<本の内容>

はてなインターンシップの講義ベースと書き下ろしで構成されており、授業を受けている感じで進みます。私の学生時代にはこのような機会は無かったのですが、このようなインターンシップを体験できる学生さんが羨ましい。。。

【目次】
  • 第1回 大規模Webサービスの開発オリエンテーション―全体像を把握する
    • Lesson 0 本書の源 ―本書で説明すること,しないこと
    • Lesson 1 大規模なサービスと小規模なサービス
    • Lesson 2 成長し続けるサービスと,大規模化の壁
    • Lesson 3 サービス開発の現場
  • 第2回 大規模データ処理入門 ―メモリとディスク,Webアプリケーションと負荷
    • Lesson 4 はてなブックマークのデータ規模 ―データが大きいと処理に時間がかかる
    • Lesson 5 大規模データ処理の難所 ―メモリとディスク
    • Lesson 6 スケーリングの要所
    • Lesson 7 大規模データを扱うための基礎知識
  • 第3回 OSのキャッシュと分散 ―大きなデータを効率良く扱うしくみ
    • Lesson 8 OSのキャッシュ機構
    • Lesson 9 I/O負荷の軽減策
    • Lesson 10 局所性を活かす分散
  • 第4回 DBのスケールアウト戦略 ―分散を考慮したMySQLの運用
    • Lesson 11 インデックスを正しく運用する ―分散を考慮したMySQL運用の大前提
    • Lesson 12 MySQLの分散 ―スケーリング前提のシステム設計
    • Lesson 13 MySQLのスケールアウトとパーティショニング
  • 第5回 大規模データ処理[実践]入門 ―アプリケーション開発の勘所
    • Lesson 14 用途特化型インデクシング ―大規模データを捌く
    • Lesson 15 理論と実践の両側から取り組む
  • 第6回 [課題]圧縮プログラミング ―データサイズ,I/O高速化との関係を意識する
    • Lesson 16 [課題]整数データをコンパクトに持つ
    • Lesson 17 VB Codeと速度感覚
    • Lesson 18 課題の詳細と回答例
  • 第7回 アルゴリズムの実用化 ―身近な例で見る理論・研究の実践投入
    • Lesson 19 アルゴリズムと評価
    • Lesson 20 はてなダイアリーのキーワードリンク
    • Lesson 21 はてなブックマークの記事カテゴライズ
  • 第8回 [課題]はてなキーワードリンクの実装 ―応用への道筋を知る
    • Lesson 22 [課題]はてなキーワードリンクを作る
    • Lesson 23 回答例と考え方
  • 第9回 全文検索技術に挑戦 ―大規模データ処理のノウハウ満載
    • Lesson 24 全文検索技術の応用範囲
    • Lesson 25 検索システムのアーキテクチャ
    • Lesson 26 検索エンジンの内部構造
  • 第10回 [課題]全文検索エンジンの作成 ―基本部分,作り込み,速度と精度の追求
    • Lesson 27 [課題]はてなブックマーク全文検索を作る
    • Lesson 28 回答例と考え方
  • 第11回 大規模データ処理を支えるサーバ/インフラ入門 ―Webサービスのバックエンド
    • Lesson 29 エンタープライズ vs. Webサービス
    • Lesson 30 クラウドvs.自前インフラ
  • 第12回 スケーラビリティの確保に必要な考え方 ―規模の増大とシステムの拡張
    • Lesson 31 レイヤとスケーラビリティ
    • Lesson 32 負荷の把握,チューニング
  • 第13回 冗長性の確保,システムの安定化 ―ほぼ100%の稼動率を実現するしくみ
    • Lesson 33 冗長性の確保
    • Lesson 34 システムの安定化
    • Lesson 35 システムの安定化対策
  • 第14回 効率向上作戦 ―ハードウェアのリソースの使用率を上げる
    • Lesson 36 仮想化技術
    • Lesson 37 ハードウェアと効率向上 ―低コストを実現する要素技術
  • 第15回 Webサービスとネットワーク ―ネットワークで見えてくるサービスの成長
    • Lesson 38 ネットワークの分岐点
    • Lesson 39 さらなる上限へ
  • 特別編 いまどきのWebサービス構築に求められる実践技術 ―大規模サービスに対応するために
    • Special Lesson 1 ジョブキューシステム ―TheSchwartz、 Gearman
    • Special Lesson 2 ストレージの選択 ―RDBMSかkey-valueストアか
    • Special Lesson 3 キャッシュシステム ―Squid,Varnish
    • Special Lesson 4 計算クラスタ ―Hadoop

<感想>

大規模システムの構築に関する本というと、分散処理やインフラに関するものが多いと思います。この本もその点はちゃんと押さえた上で、主に全文検索を題材にデータ処理に関する話題も取り上げています。

つまりインフラからソフトウェアの処理まで、大規模なサービスを構築するための課題と技術を俯瞰的に取り上げています。

とはいっても技術的選択肢を網羅的に取り上げているのではなく、「はてな」で利用している技術を中心に取り上げています。

これはインターンシップという性質上そのような構成になると思いますが、大規模なサービスが抱える基本的な課題はおさえられているので、検討事項のインデックスとして本書を利用することもできます。

また入門書という位置付けになっていますが、これは初心者向け、というよりは、基礎的な課題を押さえるための本と考える方が良い気がします。

そして網羅的に浅く広く技術を取り上げるよりも、規模が大きくなるにつれ、どのような問題が生じ、どのように解決していったかというストーリー仕立ての流れになっているためリアリティがあり、経験的知識も得られるため、頭に残りやすい気がします。

ところでこの本を読んで、インターンシップにおいて(社員教育でもよいですが)、興味や得意分野ごとにチーム分けしてそれに特化した教育を行うのに比べて、サービス構築の全体像を教えるメリットはどこにあるのかなど、いろいろと考えてみました。

3つほどメモ書きします。
  • T型人材の育成
    • T型人材
      • https://jinjibu.jp/keyword/detl/271/
      • 「T型人材」とは、特定の分野を究め、その深い専門知識と経験・スキルの蓄積を自らの軸に据えつつ、さらにそれ以外の多様なジャンルについても幅広い知見を併せ持っている人材のことです。アルファベットのTの文字のタテ棒を専門性、ヨコの棒を視野の広さに見立てて、こう呼びます。
    • いろいろな観点があるようですが、「幅広い知識を基盤とした高い専門性」こそが、これからの時代の研究者に必要とされる「真の専門性」である、というような観点で人材の育成を考えると、幅広く知識を習得することは大事と思います。もっともこれを言い始めると技術以外の領域にも広がり、収拾がつかないところも感じます(年相応に広げればよい?)。
  • チーム全員でサービスを支える意識の醸成
    • 会社あるいはチームで仕事をするという事は複数の人が連携して目標を目指すものですが、実際の仕事では自分の範囲以外は無関心になってしまうことが多いように思えます。一体感のあるチームを作ろうとすると、同じ目標の共有が大事だと思いますが、これには自分以外の仕事に対するリスペクトのようなものも必要だと思います。そのためには自分以外の仕事が抱える課題もある程度知っている必要があります。その意味で広く学習することは、個々のチームメンバーの意識向上に役立つように思います。
  • 経験(体験)を教える
    • 一般に新しい何かを生み出すことは何らかの苦痛を伴うものです。これを乗り越える要因はいろいろあると思いますが、一つは成功体験のように思います。成功体験を実感できる機会はそうそうありませんが、経験者が語ることはリアリティがあり、疑似体験になるように思えます。

年齢を重ねたり役職が上がると、知識や技術の伝承とか教育について考えることも多々あります。そういう中でこの本を読むと、本書で触れられている技術よりも、教育のような観点で印象深かったです。

私には教育はこうあるべき、といった高尚な信念はありませんが、単に技術の説明をするよりも、全体像とかストーリとして経験を語ることは、次の何かを生み出すための教育になるような気がします。

その意味で、この本は今読んでも技術の実用書の枠に収まらない面白さを感じました。


コメント

このブログの人気の投稿

Google Document AIで画像から表形式データを抽出する(Vision API OCRとの違い)

VirtualBoxのスナップショット機能

Ubuntu/Colab環境でPDFファイルのページを画像化する(pdf2image、pdftoppm、pdftocairo)