コンピュータサイエンスは多様な分野にわたっています。プログラミングだけでなく、アルゴリズムや計算情報の理論的な研究も含まれています。コンピュータ科学者は、問題を効率的に解決するためのアルゴリズムを設計・分析し、ソフトウェアやハードウェアの性能を評価します。
優れたコンピュータサイエンスの技術者になるためには、すべての科目を丁寧に学ぶことが重要です。例えば、計算複雑性理論、確率論、暗号、形式論理、プログラミング言語の理論と設計などです。
コンピュータサイエンスには、プログラムの効率性を評価・比較する能力、コンピュータアーキテクチャの理解、解釈可能で保守性の高いコードを開発するためのツールやパターンの知識など、一連の中心的なスキルが必要とされます。
以下では、大学やプロの開発者がスキルアップのために使用している、優れたコンピュータサイエンスの書籍を紹介しています。書籍自体の内容は大きく異なりますが、どの書籍も非常に有益で、変化し続けるコンピュータサイエンスの分野において、時代を超えて愛され続けています。
なお、邦訳が刊行されている場合は、邦題と訳者名を『』内に記載し、それ以外についてはタイトルの直訳を【 】内に記載します(刊行年は原書)。また、いずれの場合も著者名の後の( )内はカタカナ表記です。
13. Growing Object-Oriented Software, Guided by Tests『実践テスト駆動開発: テストに導かれてオブジェクト指向ソフトウェアを育てる』
著者:Steve Freeman, Nat Pryce(スティーブ・フリーマン、ナット・プライス)『和智 右桂、高木 正弘』
刊行年:2009
対象者:初心者、中級者
TDD (テスト駆動開発)とは、高品質なソフトウェアをより短時間で開発するための実証済みの手法です。TDDは、「プログラムのテストを作成してから、プログラム自体を書く」というシンプルな考え方に基づいています。しかし、それほど単純ではありません。最高のものを提供するためには、多くのスキルと判断力が必要です。
本書は、信頼性が高く、首尾一貫していて、保守性の高いプロジェクトを開発し、成長させる方法を教えてくれます。また、TDDの効率的な実施から、最も複雑な機能のテストまで、開発者がTDDで直面するすべてをカバーしています。
さらに、すっきりとした持続可能なコードを書くのに役立ちます。著者は、TDDが複数のレベルでどのように機能するのか、TDD、モックオブジェクト、オブジェクト指向設計が実際のソフトウェア開発プロジェクトでどのように組み合わされるのかを、豊富な例を用いて説明しています。
日常的にテストを行っている人にとっては、導入部分が緩慢だと感じるかもしれません。しかし、各章を読み進めていくと、興味深い内容がたくさん出てきます。最終的には、現在のプロジェクトでテストのどこが不足しているのかを把握するのに役立ちます。
12. Designing Data-Intensive Applications『データ指向アプリケーションデザイン ―信頼性、拡張性、保守性の高い分散システム設計の原理』
著者: Martin Kleppmann(マーティン・クレップマン)『玉川 竜司』
刊行年:2015
対象者:中級者、上級者
昨今では、データの作成、スケーリング、維持のためのツールは、リレーショナルデータベース、NoSQLデータストア、メッセージブローカー、ストリームプロセッサやバッチプロセッサなど、数多く存在します。自分のアプリケーションにとって何がベストな選択なのか、どうやって見極めればいいのでしょうか?
本書は、データを加工、保存、処理するための様々な技術の長所と短所を網羅した、包括的かつ実用的なガイドです。
ソフトウェアやハードウェアが変化しても、基本的な作業コンセプトは変わりません。本書では、それらのコンセプトを実際に適用し、最新のアプリケーションでデータを十分に活用する方法を教えてくれます。
技術書にしては口語的で読みやすく書かれています。しかし、(一般的なネットワークプロトコルに精通していない)初心者がこの本を読むと、技術的なことについて言及される際には時おり文脈を忘れてしまいがちな、非常に頭の良い人と話しているような気分になるかもしれません。
11. Release It!: Design and Deploy Production-Ready Software『Release It! 本番用ソフトウェア製品の設計とデプロイのために』
著者: Michael Nygard(マイケル・T・ナイガード)『でびあんぐる』
刊行年:2007
対象者:初心者、中級者
本書は、オブジェクト指向設計の重要性や、超効率的なコードの書き方を教えてくれるわけではありませんが、コードの書き方に影響を与えることは間違いありません。あなたのプロジェクトを本番環境に安全にデプロイできる状態にするために、やるべきことが強調されています。
現実世界の厳しい環境に対応するために、ソフトウェアをどのように設計し、構築するかを説明しています。また、様々なケーススタディや有益なアドバイスを網羅しており、毎年企業が多大な労力とコストを費やしている落とし穴を最小限に抑えることができます。
本書には2つの版があります。更新された(第2)版では、今日のシステムが直面する課題を取り上げています(今日のアプリケーションは、より複雑で、大規模で、高度に仮想化されています)。また、システム上の問題を明らかにするためにランダム性を適用するという規律についても述べています。
全体として、実世界の課題に取り組むアプリケーションを開発し、ダウンタイムなしのアップグレードを実装し、クラウド・ネイティブ・アプリケーションを回復力のあるものにするのに役立ちます。お使いの技術スタックがJava、C#、.NET、またはその他のシステムをベースにしているかどうか、プライベートデータセンターで作業しているかパブリッククラウドで作業しているかどうかにかかわらず、(本書で提案されている)ほとんどのパターンは、プロジェクトのほとんどの側面にほぼ適用されます。
10. Building Microservices: Designing Fine-Grained Systems『マイクロサービスアーキテクチャ』
著者: Sam Newman(サム・ニューマン)『木下 哲也』
刊行年:2014
対象者:初心者、中級者
この10年間で、分散システムはより高度になり、コードを多用する大規模なアプリから、より小さく自己完結したマイクロサービスへと移行してきました。このようなシステムの構築は、これまで以上に困難で複雑なものになっています。
著者は、マイクロサービス(コンピュータサイエンスの比較的新しいトレンド)を様々な側面から分析するために、全体的なアプローチをとっています。いくつかの例や実践的なアドバイス、実際の経験を用いているため、楽しく読める内容になっています。
本書は、マイクロサービスアーキテクチャを開発し、扱い、成長させる際に考慮しなければならないすべての要素を網羅しています。自律的なサービスをモデリング、統合、テスト、実装、追跡するための最新のソリューションを紹介しています。
全体で250ページと非常に短く、1日で読み終えることができます。また、各章の最後にはわかりやすい要約が記載されています。
9. Extreme Programming Explained: Embrace Change『エクストリームプログラミング』
著者: Kent Beck, Cynthia Andres(ケント・ベック、シンシア・アンドレス)『角 征典』
刊行年:2004
対象者:初心者、中級者
エクストリームプログラミングは、文字通りソフトウェア開発のあり方を大きく変えました。本書には、1999年に発売された第1版と、2004年に発売された第2版の2つの全く異なる版があります。
エクストリームプログラミングの何が 「エクストリーム 」なのか? それは、ソフトウェア開発において非常に重要な4つのことを教えてくれているからです。
ペアプログラミング:2人のチームが1つのデスクトップでプログラム全体を書くことで、コードの質が高くなります。
フレキシブルな計画:すべてのタスクに優先順位をつけ、その時点で最も重要なことを行うべきです。毎日、目標を設定し、必要に応じて顧客をチームに入れて、より良い情報に基づいた意思決定を行うことができます。
変化に対応したデザイン:ドキュメントを含め、プロジェクトのどの部分も完全に固定されたものとして扱わないようにしましょう。必要に応じて修正できるように、すべてを柔軟にしておきましょう。
ユニットテスト:効率的なコードを提供するためには、各モジュールの自動テストが不可欠です。
これらのアイデアは2004年の時点では最先端のものでしたが、革命を起こしたことで、今でも関連性があり、興味深く、インスピレーションを与えてくれます。全体として、本書は組織やビジネス、ソフトウェアの問題を解決することを好む開発者に最適です。
8. Fundamentals of Software Architecture: An Engineering Approach【ソフトウェア・アーキテクチャの基礎: エンジニアリング・アプローチ】
著者: Mark Richards, Neal Ford(マーク・リチャーズ、ニール・フォード)
刊行年:2020
対象者:初心者
本書は、ソフトウェア・アーキテクチャの様々な側面を包括的に解説しています。過去10年間に開発されたすべての手法や技術を考慮し、ソフトウェア・アーキテクチャを現代的に描いています。より具体的には、以下の点をカバーしています。
いくつかのアーキテクチャ上の決定の技術的根拠
ここ数年で大きく変化したエンジニアリング手法と運用戦略
ソフトウェア・アーキテクチャに厳密さを与える、反復可能な測定基準、評価、および結果
効率的なチームマネジメント、ミーティング、プレゼンテーション、交渉、その他のソフトスキル
全体として、アーキテクトの役割やソフトウェアエンジニアリングの実践について知りたいと思っているすべてのエンジニアにお勧めできる内容となっています。一度に本全体を読むことはお勧めしません。自分の現在の立場に最も適したものをチェックし、将来のアーキテクチャ決定のための参考書として活用してください。
7. Domain-Driven Design: Tackling Complexity in the Heart of Software『エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)』
著者: Eric Evans(エリック・エヴァンス)『和智 右桂、牧野 祐子』
刊行年:2003
対象者:初心者、中級者
ドメイン・モデリングは、ソフトウェア設計において重要な役割を果たします。ドメインモデルを使用することで、開発者は機能性をより良く表現し、それをソフトウェアの実装に反映させることができます。
その重要性は明らかであるにもかかわらず、ドメイン・モデリングをソフトウェア開発プロセスに組み込むための効果的な方法を説明した資料やガイドは十分ではありません。本書はその空白を埋めるものです。
ドメイン駆動設計は、特定のプログラミング言語を技術的に説明するものではありません。その代わりに、複雑なドメインに直面しているソフトウェア開発プロジェクトを促進するためのデザインプラクティス、基本原則、および経験に基づくテクニックの巨大なセットを提示しています。
本書は、デザイナー、オブジェクト指向の開発者、システムアナリストが、豊かで実用的なドメインモデルを構築し、それらを効果的で長期的なソフトウェアの実装に活用するのに役立ちます。
全体的に情報量が多く、読み物として楽しい本です。著者は何十もの興味深い話を巧みな表現で紹介しています。
6. The Mythical Man-Month『人月の神話』
著者: Frederick Phillips Brooks(フレデリック・P・ブルックス Jr.)『牧野 祐子, 富澤 昇』
刊行年:2018
対象者:初心者、中級者
本書は、ソフトウェア開発プロセスに関する古典的な書物であり、多くの根強い神話を覆しています。著者の観察は、IBMでOS/360というバッチ処理OSの開発を管理していた時の自身の経験に基づいています。
最も一般的な(そして危険な)神話の一つは、プロジェクトに多くの開発者を雇えば、より早く完成するという信念です。また、一人の人間が一ヶ月間に行った仕事を表す仮想的な単位である「人月」で有用な仕事を正確に測定することはできない、ということです。
著者は、グラフや実際の出来事を用いて、自身の主張をよりよく説明しています。その見解の中には、少々古くなっているものもありますが、今でもかなり適切なものがほとんどです。
5. A Philosophy of Software Design【ソフトウェア設計の哲学】
著者:John Ousterhout(ジョン・オースターハウト)
刊行年:2018
対象者:初心者、中級者
本書は短いながらも、いくつかの良いアドバイスが掲載されている本です。ソフトウェアシステムの複雑さを軽減するための2つの戦略について書かれています。
・シンプルであること:複雑さの原因は、一般的に依存関係と不明瞭さです。したがって、依存関係の数を最小限にし、情報をできるだけ明確にすることが目標となります。
・モジュラーデザインを採用する:すべてのモジュール(クラス、ライブラリ、サービスなど)は、クライアントが実装の詳細に依存したり、気にしたりする必要がないように、高レベルの抽象化をクライアントに提供できるシンプルなインターフェースを持つべきです。
著者は、よくある設計ミス、深いモジュールと浅いモジュール、一般的なインターフェースと特殊な目的のインターフェース、抽象化のレベル、情報の隠蔽、コード(メソッド)を分割するかまとめておくかのルールなどについて述べています。これを読めば、複雑さやモジュール性を少し違った形で捉えることができるでしょう。
4. Algorithms (Fourth Edition)【アルゴリズム(第4版)】
著者:Robert Sedgewick, Kevin Wayne(ロバート・セッジウィック、ケビン・ウェイン)
刊行年:2011
対象者:初心者、中級者
本書は、世界中の大学で広く使われています。現在使用されているほとんどすべての重要なアルゴリズムとデータ構造を網羅しており、開発者が必ず知っておくべき50のアルゴリズムも含まれています。以下の6つの章で構成されています。
・アルゴリズムを比較するための科学的、工学的根拠
・様々なソートアルゴリズム
・二分探索木、ハッシュテーブル、赤黒木などの様々なシンボルテーブルの実装
・最小全域木、幅優先探索、深さ優先探索などの重要なグラフ処理問題
・部分文字列検索や正規表現など、多くの文字列処理アルゴリズム
・科学技術計算、システムプログラミング、オペレーションズリサーチ、商用アプリ、難解さなどのつながり
また、本書には、講義、Javaコード(加えて、使用する標準ライブラリ)、演習、プログラミングの課題が含まれているため、学生や教師に最適な内容となっています。
3. Refactoring: Improving the Design of Existing Code『リファクタリング: 既存のコードを安全に改善する』
著者:Martin Fowler, Kent Beck(マーティン・ファウラー、ケント・ベック)『児玉 公信、友野 晶夫、平澤 章、梅澤 真史』
刊行年:2018
対象者:中級者、上級者
「リファクタリング」とは、既存のコードベースの外見的な動作を維持しつつ、設計を改善する制御された手法のことを指します。
本書では、リファクタリングとは何か、なぜすべてのプログラマーがリファクタリングを行う必要があるのか、リファクタリングが必要なコードを特定する方法、プロジェクトで使用されているプログラミング言語にかかわらず効率的にリファクタリングを行う方法などについて、詳細に説明しています。
簡単な例題でプロセス全体を説明することから始まり、その後、リファクタリングにまつわる問題や、リファクタリングによってオブジェクト指向のコードがどのようにシンプルになり、メンテナンスが容易になるのかを説明する序章が続きます。
本書には約70のリファクタリングが収録されており、それぞれに説明、動機付け、仕組み、簡単な例が示されています。すべてのヒントは、「前」と「後」のコードを使って、わかりやすい説明とともに説明されています。最後のセクションでは、リファクタリングの研究についても簡単に紹介しています。
リファクタリングのすべてではなく、プロがどのようにコードを考えているかを理解するための本です。年少の開発者は、コードの最初の行を書くときでも、これらの方法を使うことができます。
2. Patterns of Enterprise Application Architecture『エンタープライズ アプリケーションアーキテクチャパターン (Object Oriented SELECTION)』
著者:Martin Fowler(マーティン・ファウラー)『長瀬 嘉秀 (監訳)、株式会社 テクノロジックアート』
刊行年:2002
対象者:中級者、上級者
本書は、新しいツールや技術を使って強力なアプリケーションを構築する経験豊富な開発者向けに書かれています。プログラミング技術が進歩しても、同じ設計思想で共通の問題を解決することができると説明しています。
著者は、40以上の繰り返し起こる解決策をパターンに変換し、すべてのエンタープライズ・アプリケーション・プラットフォームに適用できるようにしています。アーキテクチャの各側面をよりよく説明するために、本書は2つのパートに分かれています。
第1部では、エンタープライズ・アプリケーションを作成するためのレッスンを行い、第2部では、パターン自体の包括的なリファレンスを提供しています。本書では、エンタープライズ・アプリケーションを開発する際に、各パターンをどのように使用し、実装するかを学ぶことができます。
また、詳細なコード例(C#またはJava)とUML図がふんだんに盛り込まれており、各コンセプトをよりよく説明しています。少々古くなっている例もありますが、本書で説明されているパターンは最新のプロジェクトでも活用できます。
1. The Art of Computer Programming [Volume 1]『The Art of Computer Programming Volume 1 Fundamental Algorithms Third Edition 日本語版』
著者:Donald Ervin Knuth(ドナルド・E・クヌース)『有澤誠 和田英一 監訳、青木孝 筧一彦 鈴木健一 長尾高弘 訳』
刊行年:1973
対象者:中級者、上級者
本書は、コンピュータサイエンスや数学に興味のある方に最適な学習教材です。プログラマーにとっては、日常的な問題を解決するための料理本のような本です。
2つのセクションで構成されており、第1章では、さまざまな便利な数学的ツール、MIXプロセッサ、シンプルなマシン・アーキテクチャの原理、サブルーチンやコ・ルーチンの実装方法などを紹介しています。
第2章では、データ構造(リスト、スタック、キュー、アレイ、ツリー)と、その構造を実装して扱う方法を紹介しています。ハフマン符号化、ガベージコレクションアルゴリズム、ダイナミックアロケーションアルゴリズム、それらにまつわる課題を学びます。
決して軽い読み物ではありませんが、多くの場面で応用できる優れたツールを提供しています。問題集は簡潔で興味をそそられるものばかりで、暇なときに数独パズルを解くよりもはるかに良いでしょう。
内容は正確でよく書かれており、味わい深いユーモアもあります。これほど楽しく読ませてくれるコンピュータ科学者はめったにいません。
本書が面白いと思ったら、半数値アルゴリズム、ソートと検索、コンビナトリアル・アルゴリズムなどを扱った後続の巻もチェックしてみてください。