Runner in the High

技術のことをかくこころみ

個人的なアプリケーション設計のバイブル3選

自分が本格的に設計を意識するようになったのは、2015年の夏に現職であるFringe81株式会社で開催されていたサマーインターンに参加してからだ。

インターンではDDDとクリーン・アーキテクチャ*1を一から勉強してAPIサーバーに実装する、というカリキュラムであったが、いま思うと2週間という比較的長いインターンで僕が学べたことと言えば本当に微々たるものだった。つまるところ、それくらいには設計というものは奥が深い。常になんらか特定のデザイン・パターンなりアーキテクチャ・パターンを適用することでアプリケーション開発がうまくいくということはなく、それらの様々な知識から少しづつ応用されたものが最終的なアプリケーションの設計に対して真の洞察を与えてくれるものというのが、僕自身のいまの認識である。

設計はまさに Connecting the dots そのものだ。多くを知れば知るほど、アプリケーション開発において遭遇する問題に対しての適切な解決策が思いつく。知識としての設計だけでは不十分だが、知識がなければ設計はできない。そして、知識をつけるためにはこれまでの様々なソフトウェア・エンジニアが書き残してきた書物を読むことが一番だ。

オブジェクト指向設計実践ガイド

この本は現時点で僕にとってのアプリケーション設計のバイブル。具体的な実装レベルで設計を学べる本といえば、特にこれだ。

これまで僕にとってのオブジェクト指向はとても捉えどころのない概念だった。インターネットで検索をすると、大抵動物や車の例えとJavaのコード例が現れ、結局OOPがどのようなケースで有用なのか、という根本的なメリットがあまり明示されないケースが多い。

一方で、この「オブジェクト指向設計実践ガイド」はどちらかといえば大学の授業で学ぶような雰囲気を避け、アプリケーション開発とスケーラビリティを意識した実践的な内容のOOPを、Rubyという比較的とっつきやすい言語と共に紹介する。一般的なOOPのサンプルはJavaが多い印象があるが、その中でRubyを使ってOOPを学ぶこの本は圧倒的に分かりやすい。

敢えてRubyを使っているのかは分からないが、動的型付言語をサンプルコードとして使うことで、JavaGolangインターフェイスがなぜ便利なのか、という点の理解がより深まってくる。一方で、言語仕様としてのインターフェイスを持たない動的型付言語のダックタイピングの柔軟さも理解が深まる。

Clean Architecture

Clean Architecture 達人に学ぶソフトウェアの構造と設計

Clean Architecture 達人に学ぶソフトウェアの構造と設計

日本語訳が出た今でこそ、比較的膾炙し始めたクリーン・アーキテクチャであるが、この本が日本語訳されるまではインターネットにとても情報が少なかった。それだけに、ボブおじさんのこの本が日本語訳として登場したのは、とても喜ばしいことであるし、これが多くの人に読まれているというのはすごく素晴らしいことだ。

一貫してボブおじさんがこの本の中で主張しているのは、実装とインターフェイスを分離すること、そして依存の方向を統一すること、このふたつだ。奥花子が歌っていたように*2、我々はアプリケーションの中で「変わらないもの」を探さねばならない。それがすなわち我々のビジネスルールであり、外部世界と分離して守らねばならない。

この本が出版されてからというもの、Qiitaやらブログやらでクリーン・アーキテクチャで実装してみました!という記事がたくさんインターネットで見つかるが、よくよく読んでみるとドメイン層の中でHTTPだとかCSVのようなどう考えても外部世界のフレーズが出てきたり、ボブおじさんが本の中で書いている Flow of Control に則ってない実装になっていたり*3、本当にクリーン・アーキテクチャの原典を読んで実装しているのかが疑わしいものがいくつもある。

この本を手にとる各位においては、インターネットに転がるクリーン・アーキテクチャの真贋を一読した上でぜひ見極めてもらいたい。

データ指向アプリケーションデザイン

データ指向アプリケーションデザイン ―信頼性、拡張性、保守性の高い分散システム設計の原理

データ指向アプリケーションデザイン ―信頼性、拡張性、保守性の高い分散システム設計の原理

嘘偽りなく現代のWebアプリケーション開発に必要なことが全部書いてあるバイブル。

業務でアプリケーションを作るというのは、大規模なデータ(ビッグデータではない)やトラフィックと常に戦い続けることだ。特に自分は文系大学出身かつ学生時代はさほど大きなアプリケーションに携わる経験がなかったこともあり、この本で説明されるような知識を全く持って持ち合わせていなかった。なぜNoSQLが生まれたのか、結果整合性*4とはなにか、ACID、CAP定理、CORBA、二層コミット、などなど。ソフトウェア・エンジニアとしてこれらのフレーズを一度も聞いたことがない、というのであれば今すぐにでも読むべきだと思う。

自分はWebアプリケーション開発をRailsから始め、データベースといえばPostgresQLMySQLくらしか触ったことがなかった。ところが、世の中にはMicrosoft AzureのCosmosDBやGCPのSpanner、そしてAmazonのDynamoDB、FacebookのCassandraなど、一般的なRDBMSとは異なる特徴をもつミドルウェアがある。では、それらがなぜ生まれ、どのようなアプリケーションに向いているのかを知るためには、彼らのもつ特徴や歴史背景などを知らねばならない。アプリケーションの規模が大きくなればなるほど、ビジネスの性質に応じて適切な道具を選ぶことで、コストの削減やパフォーマンスの向上が期待できる。その取捨選択が行えるのがアーキテクトたるソフトウェア・エンジニアの姿であるし、僕が目指すものでもある。

この本を読むまで、せいぜい親しいものといえば伊藤直也氏による「大規模サービス技術入門」だったが、どちらかというとこの本は低レイヤの知識をベースにどうスケーラビリティを獲得するかについて語るものだったと言える。データ指向アプリケーションデザインはより広いユースケースをカバーしており、ステップアップとしてはとても最適な本になっている。まあ、どちらも良書なので両方読むのがベターだろう。

*1:その当時はクリーン・アーキテクチャの本は日本語訳されておらず、いまのようにクリーン・アーキテクチャと呼べるのかどうかも紛らわしいような記事がQiitaに溢れたりしていなかった

*2:https://www.youtube.com/watch?v=qzsta6KTB7A

*3:もちろん、必ずしも原典が一番ということはないが、原典に沿わないのであれば沿わないでどういうメリットが新しく享受できるのかを自分の言葉で説明してもらいたい、という気持ちはある

*4:http://izumisy-tech.hatenablog.com/entry/2018/06/11/224719