著者が運営するサポートページです。
|
トップ | 正誤表 | 関連情報 |
『オブジェクト指向でなぜつくるのか』を10年ぶりに再改訂しました。
全体の構成や記述内容は第2版から大きく変えていませんが、2021年時点の状況を鑑みて加筆と修正を行いました。主な変更点は次の通りです。
初版は、C言語やCOBOLなどの従来技術に慣れ親しんだ開発者をメインのターゲット読者にしていました。
初版を刊行した2004年は、Javaや.NETが企業システム開発の主役言語になりつつある中、オブジェクト指向がバズワードにもなっていた時期でした。このため、以下のような極端な説明がされることがありました。
しかし時は流れ、最初にプログラミングを学んだときからオブジェクト指向言語だった人たちが多数派になりました。また、オブジェクト指向言語がバズワードではなくなったことで、上記のような極端な説明がなされることもほとんどなくなりました。そんな時代の変化の中で、この本の寿命も終わるだろうと考えていました。
ところが驚いたことに、2021年時点でもまだ現役の書籍として読み続けていただけており、読者の多くは若いエンジニアの方たちのようでした。私自身の経験としても、自社の新人研修でプログラミングを初めて本格的に学ぶ若者たちが、クラスやポリモーフィズム、例外などの仕組みを理解するのに苦労している姿をよく見かけてきました。
そこで今回の改訂では、オブジェクト指向ネイティブ世代をターゲット読者として内容を見直すことにしました。
今回の改訂に当たって一番悩んだのが、第1章と第2章です。
初版および第2版では、第1章でオブジェクト指向の適切な理解を妨げる要因として、「用語の洪水」「比喩の乱用」「なんでもオブジェクト症候群」の3つを挙げました。
これらは主に「現実世界もソフトウェアもオブジェクト指向を使えば適切に整理できる」と説明されたときに混乱する典型的なパターンですが、オブジェクト指向を概念的な説明だけで終わらせる人はほとんどいなくなったため、2021年時点ではちょっと過剰な表現になっているように感じました。
また第2章では、オブジェクト指向プログラミングを現実世界になぞらえて説明するやり方を、少し強めのトーンで批判していました。これも今読み返すと、ちょっとやり過ぎな記載になっているように思えました。
そこで最初は、第1章と第2章を全面的に書き換えようとしました。
第1章でオブジェクト指向のコンセプトとプログラミングから総合技術に発展した流れを説明し、第2章の比喩によるOOPの説明は割愛して、すぐに機械語から構造化プログラミングまでの進化の歴史の説明に進む案を検討しました。
この案が一番素直に思えましたが、実際にやってみるといくつか問題がありました。
これらのことを踏まえて、最終的に第1章と第2章はマイナー変更にとどめました。
第1章では、オブジェクト指向の適切な理解を妨げる要因として、「プログラミングの仕組みが複雑なこと」「比喩による説明が混乱を招きやすいこと」「オブジェクト指向というコンセプトが抽象的なこと」の3つに変更しました。
「用語の洪水」「比喩の乱用」「なんでもオブジェクト症候群」のほうがインパクトのある表現ですが、より客観的な記述にしたことで、オブジェクト指向ネイティブ世代の方々が納得感を得やすくなったのではないかと思っています
また第2章も構成は大きく変更せず、オブジェクト指向と現実世界の違いを説明する後半の文章をコンパクトに変更する程度にとどめました。
現在主流となっているオブジェクト指向プログラミング言語の特徴を紹介するコラムを書きました。具体的には、Python、PHP、Ruby、JavaScript、Javaについてのコラムを追加しました。
その中では、Pythonのオフサイドルール、PHPがWebシステムをサポートする基本的な仕組み、Rubyの特徴的な文法やメタプログラミング、JavaScriptのコンストラクタ関数やプロトタイプ、JavaのStream APIなど、各言語が持つ特徴的な仕組みについて簡単に紹介しました。
記述内容をコンパクトに2ページで収めることに苦労しましたが、葉波さんに新しいイラストを描いていただいたので、ゲラの確認はとても楽しく進めることができました。
初版の時に書いた「プログラミング昔話」のコラムを残すべきかはちょっと迷いました。
そもそもCOBOLコンパイラ、メモリダンプ、メインフレームの開発環境を引き合いに出したのは、従来技術に慣れ親しんだ開発者の方々に対して「皆さんと同じような経験をした私から見ても、オブジェクト指向は素晴らしい技術ですよ」と伝える意図がありました。
ただ、2004年時点でもすでに昔話で、2021年時点では大昔の話になってしまうため、当初は削除することも考えました。
しかし、「今ドキのOOP」を追加したことで、今と大昔の対比も悪くないと思い直し、最終的に残すことにしました。
第2版までは、第7章や第9章で人工知能(AI)の普及はまだまだ遠いと記述していましたが、2010年代以降に機械学習技術が著しく進歩し、従来は不可能だった画像認識や音声認識技術が飛躍的に発展しました。
このため第3版では、人工知能に関する記述を見直しました。現在の技術動向を踏まえて、人工知能技術の将来を予測する文章を書くことも考えましたが、この領域はさらに飛躍的に進化する可能性があるため、中途半端な記載をするのはやめました。
また初版と第2版の第7章では、現実世界とコンピュータシステムのギャップを議論する例として、病院と銀行を取り上げていました。しかし、現在はネット銀行が一般的に普及したため、現実世界とコンピュータの仮想現実の違いを議論する例としてはふさわしくなくなってしまいました。このため、議論する例を病院と製造業に変更し、ネット銀行やECサイトについて補足する文章を追加しました。
オブジェクト指向関係としては、第2版まで残していたJavaのApplet、スリーアミーゴ、シームレスなど、現在ではほとんど使われなくなった用語を削除したり、脚注に回すなどしました。これにあわせて、「シームレス」という用語の説明を兼ねていた第9章のウォーミングアップのクイズを「はじめチョロチョロ、なかパッパ~」に変更しました。
アジャイル開発について述べた第11章では、反復型開発手法について幅広い視点で議論するために、第2版まではRUP(ラショナル統一プロセス)とXP(エクストリームプログラミング)を説明していました。しかしRUPが表舞台から消えつつある状況、および人気の高いScrum(スクラム)がアジャイル開発の代名詞となっている状況を踏まえて、RUPの解説を削除し、Scrumの紹介を追加しました。
関数型言語について説明した章は第2版では「第13章」でしたが、主テーマのオブジェクト指向とは別テーマであることを明示するため、「補章」に変更しました。
内容に関しても、第2版では本格普及する前夜の技術と説明していましたが、2014年のJava8のリリースもあって一般的に広く知られる仕組みになったことから、オブジェクト指向と関数型言語のマルチパラダイム言語が主流になっている、という説明に変更しました。
初版と第2版に続いて、平鍋健児さんに推薦のことばを書いていただきました。平鍋さんの肩書きは改訂のたびにグレードアップしていて素晴らしいですね。
さらに初版の刊行がきっかけで親しくなった小森裕介さんにも推薦のことばを書いていただきました。
今回の副題は「知っておきたいOOP、設計、アジャイル開発の基礎知識」となりました。
第2版では関数型言語の章を追加したことが目玉だったため、「知っておきたいOOP、設計、関数型言語の基礎知識」でしたが、関数型言語の章の位置づけを補章にしたため、副題はオブジェクト指向に絞りました。
各章末の参考書籍を見直しました。現在は、人気のPythonを筆頭にプログラミング本は数多く出版されていますが、オブジェクト指向プログラミングや設計、デザインパターン、モデリングの書籍の新刊は2011年以降さほど多くなかったため、全体としてマイナーチェンジにとどまっています。
一方で、アジャイル開発は良書の新刊が多く、過去10年間でシステム開発の現場に定着していることを実感しました。
すべての文章を丹念に読み返して、不適切な論旨の展開や文章表現を細かく修正しました。
章 | タイトル | 主なキーワード |
---|---|---|
1 | オブジェクト指向はソフトウエア開発を楽にする技術 | - |
2 | オブジェクト指向と現実世界は似て非なるもの | オブジェクト指向の三大要素、現実世界 |
3 | OOPを理解する近道はプログラミング言語の歴史にあり | 機械語、アセンブリ言語、高級言語、構造化プログラミング |
4 | OOPは無駄を省いて整理整頓するプログラミング言語 | クラス、ポリモーフィズム、継承、パッケージ、例外、ガベージコレクション |
5 | メモリの仕組みの理解はプログラマのたしなみ | スレッド、仮想マシン、静的領域、ヒープ領域、スタック領域、ポインタ |
6 | OOPがもたらしたソフトウエアとアイデアの再利用 | クラスライブラリ、フレームワーク、コンポーネント、デザインパターン |
7 | 汎用の整理術に化けたオブジェクト指向 | 集合論、役割分担 |
8 | UMLは形のないソフトウエアを見る道具 | クラス図、シーケンス図、コミュニケーション図、ユースケース図 |
9 | 現実世界とソフトウエアのギャップを埋めるモデリング | 業務分析、要求定義、ビジネスアプリケーション、組み込みソフトウエア |
10 | 擬人化して役割分担させるオブジェクト指向設計 | 凝集度、結合度、依存関係、擬人化 |
11 | オブジェクト指向から生まれたアジャイル開発 | XP、スクラム、TDD、リファクタリング、継続的インテグレーション |
12 | オブジェクト指向を使いこなそう | - |
補 | 関数型言語でなぜつくるのか | 関数、式、高階関数、副作用、遅延評価、パターンマッチ、型推論 |
2022/11/06 正誤表を更新しました。
2021/07/22 関連情報を公開しました。
2021/04/05 ページを公開しました。
第2版のサポートページへ |
初版のサポートページへ |
『UMLモデリングレッスン』のサポートページへ |
トップ | 正誤表 | 関連情報 |