見出し画像

『良いコード/悪いコードで学ぶ設計入門 』を出版します

こんにちは、リファクタリングが大好きなミノ駆動です。

これは、私が執筆した『良いコード/悪いコードで学ぶ設計入門 ―保守しやすい 成長し続けるコードの書き方』について紹介する記事です。

2022年4月30日発売です(ほぼ同日に電子書籍版も出ます)。
AmazonなどECサイトで、すでに多くの予約が入っており、ヨドバシ.comでは一時期予約終了になったほどです。おかげさまで初版部数が2倍になりました。

■どんな本?

皆さんはプログラミングでバグを埋め込みたいですか?ロジック修正が上手くいかず、ヒィヒィ言いながら長時間残業したいですか?イヤに決まってますよね。ところが現実には、

  • 何度もバグを埋め込んでしまう

  • ロジックを読み解くのに時間がかかる

  • やっとロジック修正しても、全然違う箇所がバグ化してしまう

……ほとんど誰もが体験しているのではないでしょうか。

でも、こうした状況をなんとかしたいと思っても、原因がよく分からない、どうしていいか分からないと悩んだことはないでしょうか。

バグを埋め込みにくくする、素早く正確にロジック変更できるようにする設計方法があります。その設計手法について、多くのサンプルコードや事例で解説するのが本書です。

■向上が期待できるスキル

本書を通じて、次の2つのスキル向上が期待できます。

◆悪しき構造を見破るスキル

設計スキルが熟達していないうちは、どこがマズい構造なのか認知が非常に困難です。

本書を通じて、悪しき構造を見破るスキルが身に付きます。
そしてなぜ問題なのかも理由が分かるようになります。

◆変更に強い構造を設計するスキル

仕様変更時にバグを埋め込みにくく、素早く正確にロジック変更可能な構造を設計できるようになります。

■本書の特徴

  • 特徴1:初級~中級向けの設計入門書

  • 特徴2:膨大なサンプルコードと事例で解説

  • 特徴3:実践で使えるオブジェクト指向設計

  • 特徴4:Javaで書かれています

  • 特徴5:ドツボにはまりそうなパターンを網羅

特徴を順番に解説していきます。

◆特徴1:初級~中級向けの設計入門書

バグを埋め込まず、どれだけ素早く正確にロジック変更できるかどうかを示す度合いを、変更容易性といいます。変更容易性の設計について書かれた技術書はいろいろ出回っていますが、多くは中級~上級向けに執筆されているものばかりです……。

初学者にとってハードルが高く、なかなか手を出しにくい課題があります。

本書は、設計スキルの谷を埋めるべく執筆したものです。
設計がよく分からない、または自信がない方、これから設計をしっかり学びはじめようと考えている方を想定しています。新卒プログラマ~プログラマ3年目ぐらいの方に、特に読んでほしいです。

私は設計知識が全くない新卒プログラマ数名に設計をレクチャーし、半年以内に彼ら自身が自発的に高品質なクラス設計の提案をするレベルにまで育成した経験があります。
本書は、彼らを育成したときと同様の論理展開で解説しています。
新人教育に最適だと自信を持って言えます。プログラミングスキルの伸びが、圧倒的に違ってくるはずです。

もちろん中級以上の方にもオススメです。
他の技術書にはあまり書かれていない、独自の設計観点をいろいろ用意しております。

◆特徴2:膨大なサンプルコードと事例で解説

設計があまり学ばれないのは、そもそも設計の利点が分かりにくい課題があります。

本書では、悪しきコードがうんざりするほど登場します。
悪しきコードの課題や辛さをしっかり認知した上で、ではどう構造改善するか、という論理展開になっております。
どういうコードがマズいのかよく分からなかった方にも、はっきりと知覚できるようになります。悪しきコードが「見える」ようになるのです。

対処方法についても、「こうすれば良い」とただ頭ごなしには書かず、なぜそうしなければならないのか、課題がどう解決されるのかを手厚く解説しております。
銀の弾丸に陥らず、課題に応じた適切な技術選択ができるようになってほしいからです。

このように、「悪しきコードの見える化」「対処方法のしくみ、背景」をセットで学ぶことで、設計の利点を理解する構成になっています。

◆特徴3:実践で使えるオブジェクト指向設計

本書のタイトルには「設計入門」とありますが、教科書的なお作法を解説したものではありません。教科書的な内容では、実践への応用が困難です。

私はアプリケーションアーキテクトとしてシステム設計に従事しています。巨大なレガシーシステムのリファクタリングや拡張性向上設計をしています。
仕事でいつも、泥臭い悪しきコードと戦っているのです。

本書は私が普段実務で活用しているオブジェクト指向設計の実践的ノウハウを記したものになっています。

◆特徴4:Javaで書かれています

本書のサンプルコードは、一部をのぞきJavaで書かれています。
多くの読者さんに広く読んでいただきたいので、Javaを採用しました。

Javaは使用者が多い上に、設計関連の話題が豊富です。読者さんが今後自主的に設計を学ぶ上でも適しています。

広く読んでいただくことを主眼としているので、Java独自の言語仕様やフレームワーク知識はあまり用いていません。
また、Webアプリだけ、といった特定のIT領域に限定せず、オブジェクト指向言語ならば、ネイティブアプリ、組み込みソフトウェア、ゲーム……どのIT領域でも広く活用できるよう配慮して記述しました。

◆特徴5:ドツボにはまりそうなパターンを網羅

ロジックを読み解けない、バグを埋め込んでしまう、といった苦しみが発生するのは、主にどのタイミングでしょうか?

仕様変更時です。

仕様変更に伴う、ついつい陥りがちな罠や、罠回避のための設計方法を中心に解説します。

■各章紹介

本書は全17章、400ページで構成されています。
(目次や概要は下記技術評論社のサイトで確認できます)

◆1章 悪しき構造の弊害を知覚する

1章と2章は初心者向けの章です。

「設計しなければ」という危機意識を醸成するには、悪しき構造により生じる弊害、辛さを知覚しなければなりません。
1章は、いくつかの悪しき構造を例に弊害をダイジェスト的に紹介します。

◆2章 設計の初歩

本格的な設計は3章からスタートなのですが、いきなりクラス設計は重いので、まずは肩慣らしに命名やメソッドの簡単な設計をベースに、どういうことをするのが設計なのか、設計の初歩を学ぶ章です。

1章、2章を通じて、設計を知らない新人プログラマさんでもステップアップしやすい構成になっています。

◆3章 クラス設計 ―すべてにつながる設計の基盤―

3章から本格的な設計を解説します。

この章では、貧弱なデータクラスを豊かなValueObjectへと成長させる過程を通じて、クラス設計の基本を学びます。
クラスそれ自体が単体で、以下を満たすよう設計する方法を解説します。

  • 不正状態に陥らず常に正常動作する

  • バグを埋め込みにくく、仕様変更に強い

3章で解説する設計方法が本書全体の基本になります。

◆4章 不変の活用 ―安定動作を構築する―

可変が前提のロジックでは挙動の予測が難しく、保守や変更が困難になります。

4章では不変を活用して、予測しやすい安定した挙動の設計方法を学びます。

◆5章 低凝集 ―バラバラになったモノたち―

強く関連し合うデータとロジックがバラバラに散在している構造を低凝集といいます。低凝集は重複コードや修正漏れを生じさせ、なにかと厄介です。

5章では低凝集に陥りがちなパターンと対策方法を解説します。

◆6章 条件分岐 ―迷宮化した分岐処理を解きほぐす技法―

条件分岐は、条件に応じて処理を切り替える、プログラミングの基本制御です。しかし条件分岐をずさんに扱うとロジックが混乱します。

6章では条件分岐の複雑さを低減し、コントロールできるようになるための設計方法を解説します。特にロジック単純化の鍵を握る、interfaceの使いこなし方について重点的に解説します。

◆7章 コレクション ―ネストを解消する構造化技法―

配列やリストといったコレクションには、ループ処理が伴います。ループ処理周りもロジックが混乱しがちです。

7章ではコレクション周りのロジックを簡明にする設計を解説します。

◆8章 密結合 ―絡まって解きほぐせない構造―

責務の異なる様々なロジックが複雑に絡み合い、依存関係が強い構造を密結合といいます。密結合は、わずかなロジック変更でも他の多くの箇所に影響が伝搬しやすく、バグ化しやすい構造です。変更に弱いのです。

8章では、有名なソフトウェア原則「単一責任の原則」をベースに、密結合な構造を疎結合な構造へ改善する設計手法を解説します。

また、密結合は様々な要因により陥りがちです。
密結合に陥る様々なパターンと対策方法も、8章で取り揃えております。

◆9章 設計の健全性をそこなうさまざまな悪魔たち

9章では、null問題や例外の握り潰しといった、邪悪な実装シリーズを解説します。

単純でありながら、プログラミング初心者が陥りがちな凶悪な罠ばかりなので、新卒プログラマさんにはぜひ目を通してほしい章です。

◆10章 名前設計 ―あるべき構造を見破る名前―

メソッドやクラスに付与する名前は、単に読みやすいかどうかだけではありません。ロジック構造を大きく左右します。いい加減な命名をすると、あっという間に粗悪な構造が出来上がります。

10章では、私が提唱する目的駆動名前設計をベースに、最適なロジック構造を導き出すための名前の設計方法を解説します。

また、命名でついつい陥りがちな罠やその対策方法を、数多く解説しています。名前設計のさまざまな状況に対応できるようになります。

◆11章 コメント ―保守と変更の正確性を高める書き方―

ソースコード上のコメントは、読み手の理解を促すために記述します。しかし、いい加減なコメントを書くと読み手に正しく意図が伝わらなかったり、ウソを伝えてしまう可能性があります。

11章では、ソフトウェアの保守や変更の正確性を向上させるためのコメントの書き方を解説します。

◆12章 メソッド(関数) ―良きクラスには良きメソッドあり―

メソッド設計の良し悪しは、クラス設計に密接に連動します。メソッド設計が良くないと、余波でクラス設計が悪化します。逆もまた然りです。

12章ではメソッドの設計方法を集中的に取り扱います。

◆13章 モデリング ―クラス設計の土台―

物事の特徴や関係性を簡単に図で表したものをモデルといいます。モデルをつくる活動をモデリングといいます。
ソフトウェア開発では、モデルはクラス設計の土台となります。モデルがいい加減だったり、もしくはモデリング自体をしないと、クラス構造が粗悪になり、変更が難しくなってしまいます。

13章では、モデルが構造や変更のしやすさにどう影響してくるのか、どうモデリングすれば良いのかを解説します。

◆14章 リファクタリング ―既存コードを成長に導く技―

リファクタリングとは、外から見た挙動を変えず、ロジックを整理することです。変更のしやすさを維持するには、日々の開発で絶え間なくリファクタリングしていくことが大事です。

14章では、リファクタリングの方法や、実施上の注意点を解説します。

◆15章 設計の意義と設計への向き合い方

15章以降にはソースコードは登場しません。
設計にまつわる考え方や取り組み方を解説します。

15章では、なんのために設計するのか、その意義を深掘りします。そして我々エンジニアがどう向き合い、設計品質を高めていけばよいのかについて解説します。会社の事業成長とエンジニア自身のスキル成長について解説している、結構重要な章です。

◆16章 設計を妨げる開発プロセスとの戦い

設計が上手く働かないのは、チームの設計スキルが未熟であること以外に、開発プロセスに問題があるケースが多いです。

16章では、設計を妨げてしまう開発プロセスや心理的要因、組織上の課題を取り上げ、それぞれの対策方法を解説します。

◆17章 設計技術の理解の深め方

17章では、読者さんがさらに自主的に設計スキルを高めていく方法を解説します。

中・上級へのステップアップに有用な技術書を紹介します。用途や難易度に応じて様々な技術書を紹介していますが、拙著で設計知識の足固めをしておけば、スムーズにスルスルと理解が進むでしょう。

また、設計技術の効率的な学習方法も解説しています。

■設計が当たり前のエンジニアリングへ

以上、少し紹介が長くなりましたが、多岐にわたる様々なテクニックを、400ページの一大ボリュームで取り揃えております。

2022年現在、Linuxやgit、GitHubの操作は、ITエンジニアの(ほぼ)基本スキルと言われています。また、ここ最近では、DockerやAWSの知識も常識、といった流れになりつつあります。

一方、変更容易性の設計は何十年も前から研究されてきましたが、多くの開発現場に浸透しているとは言い難く、ないがしろされてきたために、国家予算に匹敵するレベルで損失を積み上げています。

拙著により設計が広く認知され、設計が当たり前のエンジニアリングになることを願っております。

■おまけ

拙著では大変多くの悪しきコードが登場します。
そんな悪しきコードがモンスターとして現れるのが、このバグ退治RPG『バグハンター2 REBOOT』です。

モンスターとして現れる悪しきコードやバグを、様々なスキルで退治していくゲームです。このゲームをプレイすると、設計関係の様々な用語と出会います。遊びながらちょっとした学びになる作品。拙著の副教材的な位置付けです。

ブラウザゲームなので、PCやスマホでプレイできます。
無料です。
是非お手にとって遊んでみてください。


この記事が気に入ったらサポートをしてみませんか?