kuwana-kbの開発/学習ブログ

プログラミング、クラウドインフラのWeb開発/学習ブログ

「オブジェクト指向のこころ」 書評

みなさんこんばんは、kuwana-kbです。

前回に引き続き、今回もソフトウェア設計に関する書籍です。 今回はデザインパターンについて学びました。 「オブジェクト指向のこころ -デザインパターンとともに学ぶ-」という本です。

早速まとめていきます。

オブジェクト指向のこころ (SOFTWARE PATTERNS SERIES)

オブジェクト指向のこころ (SOFTWARE PATTERNS SERIES)

ざっくりと3行でいうと

この本の紹介

この本は、デザインパターンを通じて変更に強いソフトウェアの設計を学習できる本です。 デザインパターンとは、簡単にいうとソフトウェア設計のカタログです。 繰り返し発生するソフトウェアの問題に対して、過去の開発者たちの経験から生まれた解決方法をまとめたようなものです。

本書では、パターンの解説の際にサンプルコードとしてJavaが使われています。 私はJavaを使ったことがなく、Goの経験しかありません。 Javaのサンプルコードを流し見しつつ、自分の慣れ親しんだ言語でもパターンを探してみるとより理解が深まると思います。 デザインパターンをGoで解説してくださっている方を見つけたので、Goがメインの方は参考になると思います。

この本の3つのポイント

1.デザインパターンオブジェクト指向設計の初心者でも大丈夫

本書の説明は、オブジェクト指向とはなにかから始まります。 オブジェクト指向がなぜ必要で、過去にどういう扱われ方をしたか、どう勘違いしやすいか、といった解説がなされています。

デザインパターンは、先にも説明したように「ソフトウェア設計のカタログ」のようなものですが、 その利点として、「解決策の再利用」と「共通用語の確立」が挙げられています。 特に「共通用語の確立」はエンジニアとしての会話の幅を広げてくれる可能性を持つという意味で、意外と盲点でした。

著者は、デザインパターンオブジェクト指向設計は同時に学ぶことが理解の近道だといっています。 いわば一粒で二度美味しい内容です。 私は、オブジェクト指向を理解してからでないとデザインパターンを理解するのは難しいと考えていましたが、実際に読んでみると著者の言うことに一理あると感じました。 具体的には次の項目で説明したいと思います。

2.デザインパターンを通じてオブジェクト指向設計の原則を学べる

本書では多数あるデザインパターンを1つずつ解説しているのですが、デザインパターンの利点や経緯が読者にとってイメージしやすいように工夫されています。

まず、具体的なソフトウェア開発事例とその問題点の説明から始まります。 そして、オブジェクト指向設計を適用しなかった場合の解決策を示し、その後にデザインパターンによる解決策も提示した上で、比較を行っています。 この比較があることによって、そのパターンが成り立つ経緯を理解でき、有効性がわかりやすくなります。 最後に、こうしたデザインパターンの有効性からオブジェクト指向設計の原則を抽出しているのです。

本書で解説されるデザインパターンは、過去のソフトウェア開発で生じた問題から抽出した解決策のカタログであり、それ自体が有用だと私は感じました。 しかし、著者はパターンそのものよりも、パターンのアプローチとそのオブジェクト指向設計の原則こそが有効といっています。

パターンそのものが最も重要なことではない…パターンによって、特定のコンテキストにおける特定の問題についてのフォース、動機、関連を描写することができ、また、こういった関心事に取り組むためのアプローチが示される(オブジェクト指向のこころ P.345)

過去に私の周りで「デザインパターンはちょっと昔の考え方」という意見を聞いたことがあります。 パターンそのものの評価は私にはできないのですが(本書に載っているパターンよりも新しい考え方があるか存じ上げないです…)、 少なくともデザインパターンの学習を通じて設計の原則を学べる点は評価できると感じました。

イムリーなことに、前回書評を書いた「現場で役立つシステム設計の原則」の著者である増田さんもパターンについて言及されていました。

3.ソフトウェア設計とは変更に強いソフトウェアを導き出すこと?

本書では、「変更に強い設計とは何か」について終始言及しています。 私としては、変更に強い設計も考えなきゃいけない要素の1つだよな〜くらいにしか考えていなかったので、この強調ぶりには少し驚きました。 確かに現在のビジネスの変化の速さを考えるだけでも、その重要性は明白です。 中には「一度作ったら終わり」なソフトウェアもあるかもしれませんが、事業として継続的に提供するソフトウェアは現実世界の変化の影響を避けては通れないでしょう。

この変更への強さは、開発者の視点で考えてみても重要な問題だと感じます。 自分の開発を振り返ってみても、既存のコンポーネントの依存関係を考慮したり、不要な結合を生じさせないように考える時間が多く、 実際にコードを書く時間自体は数分で終わってしまうことが多々あります。

デザインパターンとそこから導き出されるオブジェクト指向設計の原則は、この変更要求へ対応するための有力な考え方であると感じました。

まとめ

以上が「オブジェクト指向のこころ」の書評でした。 3点に絞ってざっくりとお伝えしましたが、中身は様々な内容について言及していて全然伝えられた気がしません。もどかしい…! 個人的には、前回読んだ設計の技術書との類似点(関心ごとの抽出など)も出てきて、少しずつ設計の世界の視野が広がっているように感じます。

オブジェクト指向を理解したい方、デザインパターンに入門したい方はぜひ読んでみてください。

Route53ResolverをCloudFormationで作ろう[Qiita]

お久しぶりです。kuwana-kbです。

Route53 ResolverというAWS環境とオンプレ間の名前解決を容易にしてくれるサービスについて記事を書きました。 AWS⇔オンプレという条件からどちらかというと企業レベルで使われるサービスだと思います。 ニッチな内容なので使える機会は少ないかもしれませんが、なにかの参考になればうれしいです。 qiita.com

「現場で役立つシステム設計の原則」 書評

こんばんは、kuwana-kbです。 今回はソフトウェア設計に関する書評です。

最近、チームの開発タスクで「○○機能を実装する」というタスクをこなせるようになってきました。 どんなタスクか具体化すると、仕様書にある「入力」と「出力」に基づいた実装を書くことです。 これができるようになってきたのは、大変喜ばしいことです。これができるということは、自分の手でプログラムを作って動かせるということを意味します。 例えば、Lambdaなどで日常のタスクを自動化したりなんかもできますね。

しかし、喜ばしいのと同時に新たな課題を感じています。 それは設計です。どうしたら変更に強くて可読性の高いソースコードになるのか、といった課題を感じています。 「作れるようになったのはいいけど、この作り方でどれくらい運用できるだろうか…他の人からみたら読みづらくないだろうか…」という不安に駆られる感じですね…。 そこで、今回は「現場で役立つシステム設計の原則 ~変更を楽で安全にするオブジェクト指向の実践技法~」という本を読みました。

ちなみに私は設計に関して完全な初心者なため、本書を著者の意図通りに理解できているか微妙です。 そんな初心者が書評をまとめるのはどうかな…という気もするんですが、そういう視点の書評もあって良いだろうと開き直ってまとめたいと思います。

ざっくりと3行でいうと

この本の紹介

この本は、システム設計の解説書です。
序盤は「わかりやすく、変更に強い」コードの書き方に関する解説で、中盤以降は「三層+ドメインモデル」による設計の解説がメインになります。 参考までに、以下は本書の目次になります。

  1. 小さくまとめてわかりやすくする
  2. 場合分けのロジックを整理する
  3. 業務ロジックをわかりやすく整理する
  4. ドメインモデルの考え方で設計する
  5. アプリケーション機能を組み立てる
  6. データベースの設計とドメインオブジェクト
  7. 画面とドメインオブジェクトの設計を連動させる
  8. アプリケーション間の連携
  9. オブジェクト指向開発プロセス
  10. オブジェクト指向設計の学び方と教え方

本書では、サンプルコードとしてJavaが使われています。 とはいえ、何かしらの言語の基礎をわかっていれば、躓くことなく読めると思います。 私はJavaをよく知らなかったので、ネットでJavaの基礎を1時間ほど調べてから読み始めました。

この本の3つのポイント

リファクタリングのテクニックを学べる

本書では、プログラミングの具体的なテクニックを学べます。 私が過去に読んだ本でいえば、「リーダブルコード」に近しい内容です。 どうすればわかりやすく変更に強いコードを書けるか、という視点で様々なテクニックが紹介されています。

コードの改善方法が段階的に解説されているため、各テクニックがどういうメリットをもっているか理解しやすかったように思います。 また、サンプルコードもあり実践的な内容になっているため、すぐにでも適用できる内容である点も良いと思いました。

ドメイン駆動設計の理解の足がかりになった

私はDDD本をまだ読んだことがないのですが、周りの人から難解な本である、という話は聞いていました。 本書を読むきっかけとなったのは、チームでDDDを採用しているためDDD本を読もうとしていたところを「その前にこの本を挟んだほうが良いよ」と会社の先輩から助言頂いたからでした。

本書で紹介されているオブジェクト指向の設計方法は、ドメイン駆動設計に基づいたものです。 実際にドメイン駆動設計と明言はされていませんが、「三層+ドメインモデル」として紹介されており、参考文献としてエリック・エヴァンス氏のDDD本が何度か登場します。

「三層+ドメインモデル」の解説の流れとしては、ドメインモデルとはなにかという解説から始まり、 三層であるプレゼンテーション層、アプリケーション層、データソース層におけるノウハウや注意点の説明がなされています。 ドメインモデルという抽象的な概念の説明も充実していますし、三層における具体的なノウハウもわかりやすかったです。

特にプレゼンテーション層の解説において、利用者の関心事が画面とドメインオブジェクトで一致する話は納得感がありました。

その他にも本書では以下の点を繰り返し述べていたことも印象的でした。

  • 現実の関心事をドメインモデルとして、プログラムの関心事を三層として分ける
  • 現実の関心事が三層に漏れ出すと変更が難しく読みづらいコードになっていくので、それをどのように防ぐか
  • データとロジックをまとめることを徹底する(手続き型言語との対比として)

また、個人的には本書で説明されているドメインモデルの設計についてどこまでがDDDで、どこからが筆者の意見であるかというのが分かりづらいように思いました。 (そもそも本書はDDDの解説書ではなく、「現場で役立つシステム設計の原則」なので筋違いの意見になってしまうのですが…) これは、DDD本を読んでいない私が原因なので、DDD本を読んでからもう一度向き合いたいです。

設計に関する次の学習指針を立てられた

最後の章では「オブジェクト指向設計の学び方と教え方」について解説がされています。 本書で出てきた概念やテクニックを深掘りしたい方にとっては、ありがたいページです。 個人的には、「リファクタリング」と「エリック・エヴァンスのドメイン駆動設計」は是非読みたいと思っていた本なので、今後の学習計画の指針になりました。

まとめ

以上が「現場で役立つシステム設計の原則」の書評でした。

序盤のわかりやすく、変更に強いコードの書き方は初心者の方でもすぐに実践できるような内容です。 途中で登場するドメインモデルは、私にはまだ全てを理解することができませんでしたが、おおよその「DDDの地図」ができたように感じます。 次はエリック・エヴァンス氏のDDD本に挑戦してみたいと思います。

「達人に学ぶDB設計 徹底指南書」 書評

こんばんは、kuwana-kbです。

プログラミングを初めて半年以上経ちますが、データベース周りはあまり勉強していませんでした。 特に設計はからっきしです。 これが影響してクラウドのRDS周りもあまり自信がありません。 なので、弱点を克服すべくデータベース周りの学習をしています。

前回はSQLの入門書籍である「SQL ゼロから始めるデータベース操作」を読みました。 こちらの書籍を通じてある程度SQLの基礎が身についたので、今回はDBの設計について学習しました。 利用した書籍は「達人に学ぶDB設計 徹底指南書」です。

例のごとくまとめていきたいと思います。

達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ

達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ

ざっくりと3行でいうと

  • DB設計初心者にもわかりやすく読みやすい
  • DB設計のアンチパターンを学べる
  • 「一歩進んだ論理設計」の話がおもしろい

この本の紹介

この本は、DB設計の解説書です。
内容としては、大まかに以下のような形になっています。

  1. RDSと設計の基礎
  2. 正規化
  3. ER図
  4. 正規化とパフォーマンスのトレードオフ
  5. DB設計のアンチパターン、グレーノウハウの紹介
  6. 一歩進んだ論理設計の紹介

私の場合、DB設計を経験したことがなく、正規化やER図のことがよくわかっていませんでした。 本書では、1からこれらの内容について解説されていて、未経験の私でも最後まで苦もなく読み終えられました。 おそらく以下の要素を満たしていれば問題なく読めると思います。

  • 基礎的なSQLを書くことができる
  • DBを操作したことがある(業務規模のものだと尚良し)

この本の3つのポイント

DB設計初心者にもわかりやすく読みやすい

「この本の紹介」でも述べたとおり、本書は初心者でも理解しやすく読みやすいことがポイントとして挙げられます。

本文は平易な言葉が使われていて、難しい用語には解説がついています。 また、データベース・DB設計の基礎の解説も充実しています。 例えば、DB設計は「システム開発」という大きな枠から解説が始まり、その枠組みの中においてDB設計がどういう位置付けで何故重要なのか、というようなことを理解できます。 この解説があるため、あまり開発工程を経験したことがない方でもスンナリと理解することができると思います。

私としては、やはり正規化・ER図の基礎を身につけられた点が特に良かったと感じます。

DB設計のアンチパターンを学べる

もうひとつのポイントは、アンチパターン・グレーノウハウについても言及している点でしょう。

アンチパターンなんてそんな現場で起きるのかなーと少し疑問でしたが、 「〇〇のケースの場合、どう設計するのが良いか考えてみてください」といった質問が出てきて解いてみると… 自分の答えが正にそのアンチパターンにあてはまっていたので思わず笑ってしまいました。 こういう浅はかな人間が負債を生み出してしまうのでしょう…反省です。

本書においてアンチパターンは、

といった形で説明がなされています。 また、上述に加えて「場合によっては良しとされるグレーノウハウ」においては、 どういったケースで良しとされるかについて言及しています。いずれも納得感のある解説です。

リーダブルコードを読んだ際も感じましたが、やはりアンチパターンから学べることは多いです。 とはいえすべてを覚えることは厳しいので、DB設計をすることになった際に本書のアンチパターンに該当していないか照らし合わせたいと思いました。

「一歩進んだ論理設計」の話がおもしろい

本書の最後の方に「一歩進んだ論理設計」という章があります。 ここでは、現状のリレーションナルデータベースの持つ欠点とそれを補う可能性をもつ新しいデータベースモデルの紹介がなされています。 詳細は省きますが、私としては

  • 入れ子区間モデル考えた人、天才なのでは…という感嘆
  • 未来のデータベースはまた違った構造になる可能性がある…!というわくわく感

を抱いたのでした。

まとめ

これまでDB設計のことをよくわかっていなかった私ですが、本書を通じて業務領域の視界を広げることができたように思います。

タイトルの「徹底指南書」というワードから難しそうなイメージを受けるかもしれません。 しかし、本書はDBをある程度触ったことがあれば、誰にでもおすすめできる本だと感じました。

「SQL ゼロからはじめるデータベース操作」 書評

こんばんは、kuwana-kbです。

最近、業務でSQLに触れる機会が増えてきました。 例えば、アプリケーションのインフラストラクチャ層を実装する時などですね。

一応、基礎的な文法はネットで調べて使えている(つもり)なのですが、将来パフォーマンスを考慮したクエリチューニングをしたり、プロダクトのアナリティクスに携わる場合に、より必要になってくるのでは…?となんとなく考えています。 そう考えるとSQLも体系的に学ぶ必要があるな〜と感じてしまうのです。

そこで今回は「SQL ゼロからはじめるデータベース操作」を読んでみました。まとめていきます。

SQL 第2版 ゼロからはじめるデータベース操作

SQL 第2版 ゼロからはじめるデータベース操作

ざっくりと3行でいうと

  • 解説がわかりやすく丁寧
  • 実戦形式で身に着けやすい
  • 構成が効率的なので学習を続けやすい

この本の紹介

この本は、SQLの入門書です。 タイトルに「ゼロからはじめるデータベース操作」とある通り、プログラミングの事前知識がなくとも理解できるような内容になっています。 例えば、学習環境の構築方法の説明や関数・変数といったプログラミングの初歩的な用語の解説がなされています。

参考までに、各章の表題とざっくりとしたキーワードを載せておきます。

タイトル キーワード
0 イントロダクション 環境構築
1 データベースとSQL
2 検索の基本 SELECT文
3 集約と並べ替え 集約関数
4 データの更新 INSERT、DELETE、UPDATE
5 複雑な問い合わせ ビュー、サブクエリ、相関サブクエリ
6 関数、述語、CASE式
7 集合演算 テーブルの足し算引き算と結合
8 SQLで高度な処理を行う ウィンドウ関数
9 アプリケーションからデータベースへ接続する JavaアプリでDBにSQLを投げる

この本のポイント

解説がわかりやすく丁寧

最初のポイントはやはりこれです。 かなり易しい解説になっています。 冒頭でも述べましたが、環境構築の方法や関数といったプログラミング用語の説明まであります。 その意味で、エンジニアを目指している人やエンジニアじゃないけどSQL使いたいといった人にもおすすめです。

また、仕様の説明に際しては、その仕様の理由にまで言及している点が好印象でした。

実践形式で身に着けやすい

本書は実践形式で、SQL文を結構書くことになります。 各章につき平均で20前後のサンプルコードがあるんじゃないでしょうか。 また、章の最後には練習問題が3,4問ついています。

本書を読む際に、あわせて本書のサンプルコードを書くことをおすすめします。 読み終える頃にはある程度SQLを書く能力が勝手に身についていると思いますよ。 (SQL文は3,4行が大半ですからそこまで大変じゃないです。ご安心ください。)

補足すると、本書ではPostgreSQLを使用してSQLを学ぶ形になっています。 業務ではMySQLなので最初ちょっと心配でしたが、読み終わった今考えると杞憂でした。 本書は標準SQLを中心に学ぶ構成になっていて、RDBMS別の仕様の違いについてもしっかり明記されているからです。

構成が効率的なので学習を続けやすい

SQLはDBのデータを扱う言語なので、当たり前ですがSQLを学習する際はDBにデータを入れる必要があります。 こういう学習で地味に面倒なのが、説明をよむ度に新しいテーブルを作って新しいデータを入れなおすといった作業です。 「SQLの勉強をしているのになんで俺はどうでもいい販売記録のデータを延々と打ち込んでいるのだろう…」って思いません…?

素敵なことに本書ではその必要がありません。 基本的に最初に入れたデータをもとに各機能を学んでいきます。 SQLの動作に注力できるように、という著者の配慮が伺えて素敵ですね。 とりあえず本に書かれた通りの操作をすれば、詰まることなく学習を進められるでしょう

また、本の中にサンプルコードが保存されたリンクも紹介されています。 もし入力をスキップしたい・詰まってしまったといった場合は、そちらを利用すれば大丈夫でしょう。

まとめ

こちらの書籍は社内のエンジニアの方に「エンジニアになって間もない頃に読んでよかった or 読みたかった本は?」と聞いた際に挙がった本です。 正確には著者のミック氏の本がおすすめと言われたのですが、 今回実際に読んでみてとても満足のいく内容だったので、同氏のデータベース設計の書籍も読んでみたいと思います。

本書を一言でまとめるなら、SQL初心者にとって最適な入門書です。 これからSQLを学びたいという方は是非手にとって見てください。

「プログラミング言語Go」 書評

お久しぶりです、kuwana-kbです。

この10日間ほど、ずっと「プログラミング言語Go」という本を読んでいました。 これまで読んできた技術書の中では一番が時間をかけたと思います。 そしてそれだけの価値がある本でした。 例のごとく書評を記していきたいと思います。

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

ざっくりと3行でいうと

  • Goの仕様をより深く理解できる本
  • Goのベタープラクティスについて触れらている
  • 練習問題が難しい…けどためになる

この本の紹介

この本は、Goの言語仕様について書かれた解説書です。 著者はGoチームのメンバーである Alan A.A. Donovan氏 と 「プログラミング言語C」の著書である Brian W. Kernighan氏で、 翻訳は柴田芳樹氏(@yoshiki_shibata)によるものです。 本書はGoプログラマにおけるバイブルのような位置づけのようです。

構成としてはチュートリアルから始まり、構造体やインターフェースなどの主要な仕様について解説されていて、他のGoの書籍と似たような形になっています。 しかし、その説明は(少なくとも私がこれまで読んだGoの書籍と比べると)とても深い部分にまで言及されています。

Goを始めたばかりの方には少し敷居が高いかもしれません。それは、練習問題を解くには初っ端から様々なGoの知識が要求されるからです。 一応「interfaceについては第7章を見てください」といった感じで注意書きがあるのですが、それに従っていると章を度々またぐことになるのでおすすめしません。 したがって、Goの入門書を一通り終えてから手にするのが良いでしょう。

参考までに、各章の表題を載せておきます。

  • 第1章 チュートリアル
  • 第2章 プログラム構造
  • 第3章 基本データ型
  • 第4章 コンポジット型
  • 第5章 関数
  • 第6章 メソッド
  • 第7章 インタフェース
  • 第8章 ゴルーチンとチャネル
  • 第9章 共有された変数による並行性
  • 第10章 パッケージとGoツール
  • 第11章 テスト
  • 第12章 リフレクション
  • 第13章 低レベルプログラミング

この本のポイント

Goの仕様をより深く理解できる

本書では、言語仕様の説明において、標準パッケージを例にした解説が度々登場します。 例を挙げると、fmtパッケージのPrint関数やerrorパッケージのerrorインターフェースです。 普段よく使う機能の中身を覗いて、どういった仕組みで動いているか解説がなされているのです。

この解説にはとても納得感がありました。 特にインターフェースは、Goの初学者がつまづくポイントとして有名ですが、 普段よく使うfmtやerrorパッケージからインターフェースの仕組みを解説することで、 言語仕様への理解だけでなく、標準パッケージへの理解も深めてくれています。

また、本書を通じて標準パッケージを度々参照していると、 「めっちゃ勉強になるコードがこんな身近にあったなんて…」という風にも思わされました。

↓読者の喜びの声

Goのベタープラクティスについて触れている

本書の特徴として、Goのより良い書き方に触れられている点が挙げられます。 「○○を実現したい場合、☓☓のように書くのがよいだろう」といった具合です。

プログラミングは書き手によって様々な表現方法を選択することができますが、私のようなひよっこからするとどの選択肢を選べばいいか悩ましく感じることが多いです。 技術書の中には選択肢だけを提示して、その使い分け方はあまり解説してくれない本もありますが、本書は違いました。

本書では、シンプルさや可読性の観点から場面に応じた書き方の指南が記されています。 例えば、「Goの関数では空リターンによって結果を返すことができますが、コードの理解を容易にしてくれるわけではないため、空リターンは控えめに使うのが最善でしょう」など。

上述した例のように、本書には実践的で役立つプラクティスが詰まっています。 実際、私は本書で得た知識のおかげでチームのコードレビューにコメントする回数が増えました。 本で得た知識が実践で役立つと身につくのも早くていいですね。

練習問題が難しい…けどためになる

本書には各章に練習問題が付属しています。 問題文は2,3行でその章で習った内容を駆使してコードを書いてみる、といった具合です。 私の場合は、「各章で内容を理解→練習問題で実践→次の章へ」というサイクルでやりました。 実際に問題を説いてコードを書いてみると思わぬところでつまづいて時間がかかってしまうことがあるのですが、そういったつまづきは読むだけでは得られない知見です。

ということで是非練習問題も解きましょう!

...と言いたいところなのですが、本書の練習問題は量が多いことに加えていろいろと難易度が高いように思います。 難易度が高いというのは、コンピュータ・サイエンスの知識を必要とするものがあったり、 問題の要求が立派な1つのアプリケーションレベルのものを作れという規模感だったり… 要するに必要とする知識のレベルと作業の工数がやけに高い問題がちらほらあるのです (特にコンピュータ・サイエンス系の問題は私文卒の私には意味がわかりませんでした…)

↓問題の意味がよくわからず逃避する私

多分問題文を全部真面目にやろうとすると1ヶ月以上はかかりそうな規模感だと思います。 なので、それぞれの目的に応じて「本を読むことを優先して各章数問だけやってみる」や「本を読むことに徹する」という方針でも良いと思います。

文章が理解しづらい一面も

原書は英語で書かれており、本書はその日本語訳版です。 そのせいか頭に入りづらい言い回しが多い気がします。 原文に忠実な訳なのかもしれませんが、個人的にはもうすこし平易な日本語訳にして頂けたらと思いました。

まとめ

本書は、文章の分かりづらさを除けばとても満足度の高い書籍でした。 「プログラミング言語Go」はまさにGopherにとってのバイブルといえるでしょう。 まだ読んでいない方は是非手にとってみてください。きっとGoの世界の視野が広がります。

追記

Twitterにて、訳者である柴田さんより練習問題に関して補足を頂きました。 ありがとうございます。 私も他の方の解答例もいくつか拝見しましたが人によって書き方が全然違ったりするので、これから挑戦する方は比べてみるのも面白いかもしれません。

「Webを支える技術」 書評

こんばんは、kuwana-kbです。

以前読んだ「Goプログラミング実践入門」という本で、RESTfulAPIを作ってみよう!という項目がありました。私の中でRESTとは「何回か調べたことはあるけど、あんまり頭の中に入っていない…」そんな用語でした。せっかく作ったのに中身をよく理解できていないのは大変もったいないです。

ということで、今回は「Webを支える技術 HTTP, URI, HTMLそしてREST」を読んでみました。 RESTとはなにか?に加えてHTTP、URIのおさらいもしてきましたので、書評としてまとめます。

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

ざっくりと3行でいうと

  • なんとなく理解していたHTTP, URI, RESTを体系的に理解できる
  • アーキテクチャスタイルという言葉を初めて知る
  • 情報が古い部分もあるからこれ一冊で完璧、とはいえない

この本の紹介

この本は、HTTP, URI, HTML といった今のWebを支える代表的な技術に焦点を置いた解説書です。 上述した技術について、歴史的な成り立ちや具体的な仕様について解説し、最終的にはWebサービスを設計する際の指針を説いてくれます。

では、次に各部のざっくりとした紹介です。

第1部 Web概論

まず最初は、普段我々が何気なく使用しているWebに関する解説から始まります。 具体的には、現在のWebの範囲とは何か、Webにはどういった歴史的背景があったか、Webを成功へ導いたREST*1とはなにか、といった内容になります。 「ベンダー同士の利権の話」や「一人の技術者によって今のHTTPの原型となる仕様が提案された話」は、世界史の授業を聞いているようで面白かったですよ。

第2部 URI

この部は、URIの仕様と設計についてのお話です。 設計の章に、Webの開発者である Tim BL氏の「Cool URIs don't change」という言葉が登場するのですが、シンプルでわかりやすい指針だと感じました。 この言葉が出てから既に20年以上経過していますが、原則というのは時を経ても変わらないものですね。

第3部 HTTP

第3部はHTTPについての部です。 この部ではHTTPの仕様とWebサービスを設計する際にHTTPをどう扱うべきかについて解説されています。 初めて知るステータスコードが意外とあったのが印象的でした。

第4部 ハイパーメディアフォーマット

第4部では、HTML, xml, atom, JSON といったフォーマットについて解説されています。 フォーマットの書き方のお話がメインなので、あまり目新しい情報はなかったように思えます。

第5部 Webサービスの設計

最後の第5部は、これまでの部で扱った「HTTP, URI, フォーマット」を用いて、どのようにWebサービスを設計するかについてのお話です。 関係モデルのER図、オブジェクト指向のクラス図、情報アーキテクチャの3種類の成果物からリソースの設計を試みます。

この本のポイント

HTTP, URIを振り返ろう

WebエンジニアにとってHTTPとURIって当たり前の存在だと思います。 curlでリクエストを投げたり、WebAPIを実装してレスポンスを確認したりする中で、日々触れ合いますよね。 上記のような経験の中でなんとなく覚えたもの、という人もいるんじゃないでしょうか。 私の場合は、この3ヶ月間開発を繰り返す中で「あ〜またこのHTTPヘッダか〜」という具合に徐々に覚えてきました。

本書ではHTTPとURIについて体系的に解説されています。 ある程度プログラミングを覚えてきた人にとっては、一度体系的に整理するのにちょうど良い書籍だと思います。(私にはちょうど良かった!)

アーキテクチャスタイルとしてのREST

本書には、「RESTは複数のアーキテクチャスタイルを組み合わせて構築した複合アーキテクチャスタイルである。」という記述があります。 そもそもアーキテクチャスタイル*2ってなに…?って感じだったんですが、意外と身近な仕組みがそう呼ばれていました。 例えば「クライアント/サーバ」や「キャッシュ」の仕組みです。 「アレってそういう枠組みの言葉なんだ!」とちょっと驚きました。

アーキテクチャスタイルは以下のように実装から二段階抽象化した概念を指すとのことです。*3

抽象化レベル Webでの例
アーキテクチャスタイル REST, クライアント/サーバ, キャッシュ
アーキテクチャ ブラウザ, サーバ, HTTP, URI
実装 Apache, Firefox|

RESTというのは、上記のように抽象化されたパターンの組み合わせによって、 パフォーマンス、スケーラビリティ、簡潔性、拡張性、可視性、移植性、信頼性といったメリットを実現するための設計パターンなのだと理解しました。

また、「WebそのものがRESTであり、個々のWebサービスがRESTfulになることで、Web全体がより良くなる」という記述はRESTが自己循環しているようで面白かったです。

情報が古いのが残念

本書の初版が発行されたのは2010年です。 そのため情報が古くなっている箇所が散見されます。 例えば、2015年にHTTP/2が承認されましたが、本書ではHTTP/1.1までしか解説されていません。 説明がすごく丁寧なだけに本当に残念ですね…HTTP/2の解説も読んでみたかったです。 ぜひこの内容を追記した第二版を出して頂きたいところです。 他にもメディアフォーマットとしてatomの解説が充実していますが、現在のWebの需要でいうとそこまで深く解説すべき内容には見受けられませんでした。

まとめ

「Webを支える技術」は今まで知っているようでよく分かっていなかった、そんな知識領域であるHTTP, URI, RESTをわかりやすく解説してくれる本です。

プログラミングにちょっと慣れてきた方におすすめします。寄り道のように思えるかもしれませんが、得られるものは少なくないと思いますよ。

*1:現在はRESTfulな設計が主流ではあるものの、HTTPのRESTへの評価は過大ではないか、という意見もあるようです。

*2:複数のアーキテクチャに共通する性質、様式、作法あるいは流儀をさす言葉 本文25Pより引用

*3:本文27Pより引用