ホーム  >   ブログ  >   "Designing Data-Intensive Applications"は濃密すぎる一冊だったので2018年の自分にも読んでもらいたい

2017-12-30

"Designing Data-Intensive Applications"は濃密すぎる一冊だったので2018年の自分にも読んでもらいたい

  寄付で活動を支援する   一杯のコーヒーを贈る

このエントリーをはてなブックマークに追加

分散システムに関する理解を整理するための一冊として素晴らしい、という声があり気になっていた "Designing Data-Intensive Applications" を一通り読んだ:

https://twitter.com/frsyuki/status/846431130437890049

僕のような「用語としては知っている」程度の新人に「なぜそれが大切なのか」「なにが難しいのか」といったポイントを丁寧に説明してくれる、学びの多い充実の一冊だった。

冒頭では『早すぎる最適化(不要不急のスケーラブルなシステムの構築)は制約が増えてシステム設計が不自由になるだけなので無駄』という事実に触れ、適切なツールを選択することの重要性を説いている。本書が500項超を費やして伝えようとしているのは、そういったツールを取捨選択する際のエッセンスであり、具体的には、昨今の大規模なデータシステムを支える原理、モデル、ツール群の背景とその長所・短所である。

ddia-poster

ddia-references/ddia-poster.jpg より

本書は大きくわけて "Foundations of Data Systems," "Distributed Data," "Derived Data" の3パートから構成される。

Part I. Foundations of Data Systems

第1部では、データシステムの信頼性、スケーラビリティ、保全性を担保することの大切さと難しさを伝え(第1章)、特にストレージに焦点をあてて、データモデル(リレーショナルモデル vs ドキュメントモデル)と代表的なDB、クエリ言語を紹介していく(第2章)。このあたりの内容は "Seven Databases in Seven Weeks" に通じるところもあった。データの一対多 (one-to-many) と多対多 (many-to-many) の関係が丁寧に比較されていて、リレーショナルデータベース、ドキュメント指向データベース、列指向データベースそれぞれの必要性や強み、弱みについて直感的な理解を与えてくれる。

いろいろなストレージの世界を俯瞰したら、次は実際にデータを保持・探索することを考える(第3章)。この章がまぁ素晴らしい。この本のインデックスの説明は、これまでに読んだいかなる解説よりも分かりすかったと言っても過言ではない。だって、"the world's simplest databse" を作って $\mathcal{O}(n)$ で検索するところから話が始まるんですよ?

#!/bin/bash

db_set() {
  echo "$1,$2" >> database
}

db_get() {
  grep "^$1," database | sed -e "s/^$1,//" | tail -n 1
}
$ db_set 123456 '{"name":"London","attractions":["Big Ben","London Eye"]}'
$ db_get 123456
{"name":"London","attractions":["Big Ben","London Eye"]}

ここから議論を初めて、B-tree や Bloom filter といった具体的なデータ構造、アルゴリズムに言及していく。

データの保持に関しては、高可用性やレイテンシがキモでサービスの核を担う OLTP (On-line transaction processing) と、ETLや分析用途で利用される集約操作が主の OLAP (On-line analytical processing; データウェアハウス) の比較が易しい。

そして第1部を締めくくるのは、保持され、やり取りされるデータの“実体”、すなわちデータのシリアライズ(エンコーディング)とメッセージパッシングに関する話題(第4章)。MessagePackがシリアライゼーションフォーマットの1つとしてしっかり取り上げているのをみてニヤニヤしたり、gRPCへの言及から今っぽい流れを感じたりできて楽しい。

データシステムの構築に際して、第1章で挙げたデータシステムの信頼性、スケーラビリティ、保全性の点で、それぞれの選択肢がどのように優れて(劣って)いて、各々の使いドコロはどこなのか。本書では、最初から最後まで一貫してこのような流れで話が進む。

Part II. Distributed Data

第2部の話題はデータの分散処理。個人的には、ここが一番「用語としては知っているけど、理解が及んでいない」というポイントだったので、舐めるように読んだ。

特に、Replication, Partitioning, Consistent Hashing などについては、並行して読んでいたAmazonのDynamoDBの原論文の内容と絡めて別の記事でまとめた:

このような話題に加えて、(まだ十分に咀嚼できていないけれど)トランザクション、Consensusアルゴリズム、Linearizability などを解説しているのがこの第2部。『分散システムの難しさ(=面白さ!)』がギュッと凝縮されているところだと言えよう。

Part III. Derived Data

第3部では、ここまでの内容を総合してデータシステムを構築することと、その際のアーキテクチャについて考える。

バッチ処理 (MapReduce) と、ストリーム処理(イベント処理)の2つの切り口から、HDFSやメッセージブローカについてかなり踏み込んだところまで解説を試みている印象があった。

ここまで打ってきた布石の上に成り立つ重厚なパートであることは確かなのだけど、エッセンスを上手く伝えてくれた第1部、第2部と比較すると、中途半端に踏み込みすぎている感が否めなかった。これなら他の文献をあたるかな、という気分。

ちなみに、ストリーム処理の“気持ち”は以前まとめたことがある:

このときの知識と、その実践の間にあるエンジニアリング的な部分とのギャップを埋めるのがココ(第11章)の内容だろう。

そして最終章 "The Future of Data Systems" ではデータシステムの一部としての機械学習に触れ、なかなかエモい話が展開されていた:

Data and models should be our tools, not our masters.

(思わず赤線でマークしてしまった。)

全体として

緻密なサーベイと丁寧な構成の上に成り立っている一冊であることが手に取るように分かり、安心して読み進められる。

なにより、この本はリファレンスがすごい。ブログ記事からGitHubリポジトリ、論文まで、大量の外部ソースを逐一参照しているので説得力がある。さすが、著者が現役の研究者だけのことはある。すべての参考文献は github.com/ept/ddia-references にもまとまっている。

そして、進化の早い分野なので "At the time of writing, ..." といった記述が多々あったのも印象的。データシステムの“イマ”のスナップショットとして、素直にワクワクできる一冊でした。

あと余談ですが、同時期にこの本を読んでいたエンジニアの友人が2〜3人いて、話題の一冊という感じでした。それぞれ会社も役割も違うのに、飲んだときにこの本の内容についてイロイロ話すことができた、というのは嬉しい体験だった。それくらい、広く程よく書かれた、次の一歩につながる有意義な本だったということ。

2018年、もう一度読みたい

2017年ももう終わりです。Data Science Engineerというポジションで働き始めて9ヶ月、良かったこと、悪かったこと、達成感、焦燥感いろいろありましたが、この本の内容を『自分ごと』として読めるようになったことが何よりの収穫であり、喜びでもあります。

学生のときはスケーラビリティに言及した本や論文を読んでも、どこか他の世界の話のように感じていたのです。もちろん、それが大切だということは頭ではわかっているのだけど。

2018年は、こうして現実感をもって向き合うことが出来るようになった文献やコードをさらに深掘りしてゆきましょう。

そのために、一度では消化しきれないほどの充実っぷりだった本書ももう一度(二度、三度)読んで、世界地図を頭に焼き付けたいですね。

おつかれさまでした。

  シェアする

このエントリーをはてなブックマークに追加

  カテゴリ

読書記録 コンピュータシステム

  あわせて読みたい

2017-12-22
"Dynamo-style" に学ぶ Replication, Partitioning, Consistent Hashing の気持ち
2017-12-09
AmazonのDynamoDB論文を眺めた
2015-12-08
ストリームデータ解析の世界

  もっと見る

最終更新日: 2022-09-02

  書いた人: たくち

たくちです。長野県出身、カナダ・バンクーバー在住のソフトウェアエンジニア。これまでB2B/B2Cの各領域で、Web技術・データサイエンス・機械学習のプロダクト化および顧客への導入支援・コンサルティング、そして関連分野のエバンジェリズムに携わってきました。現在はフリーランスとして活動を続けつつ、アフリカ・マラウイにて1年間の国際ボランティアに従事中。詳しい経歴はレジュメ を参照ください。いろいろなまちを走って、時に自然と戯れながら、その時間その場所の「日常」を生きています。ご意見・ご感想およびお仕事のご相談は [email protected] まで。

  寄付で活動を支援する   一杯のコーヒーを贈る

  免責事項

  • Amazonのアソシエイトとして、当サイトは amazon.co.jp 上の適格販売により収入を得ています。
  • 当サイトおよび関連するメディア上での発言はすべて私個人の見解であり、所属する(あるいは過去に所属した)組織のいかなる見解を代表するものでもありません。
  • 当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、個人ブログという性質上、誤情報や客観性を欠いた意見が入り込んでいることもございます。いかなる場合でも、当サイトおよびリンク先に掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。
  • その他、記事の内容や掲載画像などに問題がございましたら、直接メールでご連絡ください。確認の後、対応させていただきます。