見出し画像

新米エンジニアが挑む「良いコード/悪いコードで学ぶ設計入門」 - 成長を加速させる保守性と拡張性の追求 with ChatGPT

ツクリンク株式会社のRailsエンジニアの佐山です!
ツクリンクのエンジニア内で毎週10分勉強会というイベントを開催しており、そこで「良いコード/悪いコードで学ぶ設計入門ー保守しやすい成長し続けるコードの書き方」という本を読んだ感想をChatGPTの力を借りてざっくり発表したのでそれを公開します。

本の紹介


ChatGPT要約

# 質問
書籍「良いコード/悪いコードで学ぶ設計入門 保守しやすい成長し続けるコードの書き方」を150文字程度で
要約して下さい

# 回答
『良いコード/悪いコードで学ぶ設計入門』は、保守性・拡張性に優れたコードを書くためのガイドです。
可読性、再利用性、モジュール性、柔軟性、テスト容易性を重視し、リファクタリングや設計パターン、
プログラミング原則を学ぶことで、プロジェクトの品質と生産性を向上させます。

※注意
勉強会の際に気づいたのですが、ChatGPTの知識は2021年9月までのもので、この書籍の発売は2022年に入ってからなのでChatGPTはこの書籍自体はデータとして入っていないことになります。にも関わらず今回この書籍の要約などをお願いしたところ、ほぼ近しい内容の回答が得られました(少なくとも私自身にはそう思えました)。その理由として、ChatGPTが過去の類似した内容やテーマの過去の書籍や情報を基に、推測や予測を行って回答を生成したものと思われます。(ChatGPT確認済み)
したがって、この書籍を読んだことがある方によっては要約が内容と異なっていると感じる場合があるかもしれませんが、そこは大目に見ていただけると幸いです。

今回は本の内容全てには触れないので、気になる方の為に、本の目次記載しておきます。

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

  2. 設計の初歩

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  17. 設計技術の理解の深め方


エンジニア歴1〜2年目の場合にすぐ取り入れられそうなところ

自分の回答

  • 名前設計

  • 条件分岐(早期リターンとか)

  • コメント

  • リファクタリング

ChatGPTの回答

# 質問
エンジニア歴12年目だった場合、この書籍の内容をすぐに取り入れられそうな部分、
将来的には出来ていた方が良い部分を抽出してまとめて下さい。

# 回答
エンジニア歴12年目の場合、以下の内容はすぐに取り入れられると良いでしょう。

1. 名前設計: 変数や関数、クラスの名前をわかりやすく具体的に命名することで、
      コードの可読性を向上させることができます。
2. コメント: コードの意図を明確に伝えるために適切なコメントを記述し、必要な
      情報を提供することが重要です。
3. リファクタリング: 既存コードの構造を改善することで、保守性と可読性を向上させることができます。
      リファクタリングを継続的に行い、コードの質を向上させることが求められます。

  将来的には、以下の部分を理解し実践できるようになることが望ましいです。

1. 設計原則(SOLID原則など): 良い設計を実現するための原則を理解し、それらを実践することで、
      より保守性と拡張性に優れたコードを書くことができます。
2. デザインパターン: 一般的な問題を解決するための設計パターンを学び、適切な場面で使用することで、
       コードの品質を向上させることができます。
3. 高凝集・疎結合: 高凝集度を保ち、疎結合にすることで、変更やテストが容易になり、保守性と拡張性が
      向上します。
4. 条件分岐の簡素化: 複雑な条件分岐を簡素化し、ポリモーフィズムやデザインパターンを利用してコードの
      可読性と保守性を向上させます。
5. 設計への向き合い方: 計画的で柔軟な設計を行い、要件変更や新たな機能追加にも対応できるよう、
      継続的な改善とアジャイルな設計思考を実践することが重要です。

これらのスキルを習得することで、エンジニアとしての成長が促進され、プロジェクト全体の品質と効率が
向上するでしょう。

取り入れられそうなところの詳細

名前設計

  • 曖昧な名前は避ける(〜Managerみたいな命名はクラスの巨大化複雑化を誘発する)

    • ツクリンクだとPlanEntryとか初見だと分かりずらいかも。。。

  • 特定の目的(ソフトウェアで達成した目的)の達成に特化した、極めて意味範囲の狭い名前をクラス名にすること

悪い例

class UserManager
  # ユーザーの作成、更新、削除など、多くの責任を持っているクラス
end

良い例

class UserCreator
  # ユーザーの作成に特化したクラス
end

class UserUpdater
  # ユーザーの更新に特化したクラス
end

class UserDeleter
  # ユーザーの削除に特化したクラス
end

コメント

  • ロジックの挙動をなぞる(ロジックを見たら分かる)コメントは退化する

    • ロジック変更が加わった時、変更忘れなどが発生するリスク

  • ロジックがどういう意図で動いているか、仕様変更時の注意点をコメントで伝える

悪い例

def calculate_tax(income)
  # 税率を定義
  tax_rate = 0.1

  # 収入に税率をかけて税額を計算
  tax = income * tax_rate

  # 税額を返す
  tax
end

良い例

def calculate_tax(income)
  # 現行の税率は10%ですが、将来的に変更される可能性があるため、変数で定義しています。
  tax_rate = 0.1

  tax = income * tax_rate

  # 注意: この計算は、所得税のみを対象としており、地方税など他の税金は含まれていません。
  tax
end

条件分岐

if文のネストは早期return

悪い例

def example_method(condition1, condition2)
  if condition1
    if condition2
      "Both conditions are true"
    else
      "Condition1 is true, Condition2 is false"
    end
  else
    "Condition1 is false"
  end
end

良い例

def example_method(condition1, condition2)
  return "Condition1 is false" unless condition1

  return "Condition1 is true, Condition2 is false" unless condition2

  "Both conditions are true"
end

リファクタリング

  • 命名を変更とかネスト解消とか

  • リファクタリングで注意すること

    • 機能追加とリファクタリングを同時にやらない

    • スモールステップで実施(メソッド名の変更とロジック移動などある場合、それぞれコミット分ける)

    • 無駄な仕様は削除も視野に入れる(開発コストの削減)

番外編 ChatGPTとのやりとり

ここにはChatGPTと戯れていたところの一部を抜粋して記載しております。

タイトル決め
この記事のタイトル決めをお願いしていました。ChatGPTには自分は若手に感じたらしい(笑)

# 質問1
「良いコード/悪いコードで学ぶ設計入門 保守しやすい成長し続けるコードの書き方」を読んでの感想
 このタイトルを12年目のエンジニアが読んだことが分かるようにかっこよくして下さい


# 回答1
若手エンジニアが挑む「良いコード/悪いコードで学ぶ設計入門」 - 成長を加速させる保守性と拡張性の追求


# 質問2
ありがとうございます!!すみませんが年齢が30歳を超えていて「若手」は流石にきついのでそこを変更
していただけますでしょうか


# 回答2
新米エンジニアが挑む「良いコード/悪いコードで学ぶ設計入門」 - 成長を加速させる保守性と拡張性の追求

本の要約
要約は指定した文字数に合わせて内容を変えてくれます。

# 質問
「良いコード/悪いコードで学ぶ設計入門 保守しやすい成長し続けるコードの書き方」を
400文字程度で要約して下さい

# 回答
『良いコード/悪いコードで学ぶ設計入門 保守しやすい成長し続けるコードの書き方』は、
プログラミング初心者から上級者までが、より保守性と拡張性に優れたコードを書くための
方法を学ぶための書籍です。本書では、実践的な例を通じて良いコードと悪いコードの違いを
解説し、効果的な設計方法を紹介しています。

主要なテーマは、可読性、再利用性、モジュール性、柔軟性、およびテスト容易性です。
これらの概念を理解することで、保守しやすく、変更に適応しやすいコードを書くことができます。
本書では、リファクタリングや設計パターン、プログラミング原則(SOLID原則など)も取り上げられています。

本書は、プログラミング言語やフレームワークに依存しない普遍的なアプローチを提案しており、実践的な
例を通して、良いコードと悪いコードの具体的な違いや改善方法を示しています。読者は、本書の内容を
自分のプロジェクトに適用することで、コードベースの品質を向上させ、チームの生産性を高めることができます。

まとめると、『良いコード/悪いコードで学ぶ設計入門 保守しやすい成長し続けるコードの書き方』は、
プログラミングのスキル向上やチームでの協力を促進するための理論と実践的なアドバイスが満載された書籍です。これを読むことで、保守性と拡張性に優れたコードを書く方法を学ぶことができ、プロジェクトの品質と生産性を向上させることができます。

リファクタリングのなぞかけ
これを面白いと思えるかは読者の方次第?

# 質問1
「〜とかけまして、〜と解きます。そのこころは?」「どちらも〜でしょう」の形式でリファクタリングを説明して下さい

# 回答1
「リファクタリングとかけまして、家の大掃除と解きます。そのこころは?」

「どちらも整理整頓で環境を改善するものでしょう」

# 質問2
上記他の例でもいけますでしょうか?

# 回答2
「リファクタリングとかけまして、庭の手入れと解きます。そのこころは?」

「どちらも定期的なメンテナンスで機能性と美しさを保つものでしょう」

# 質問3
もう一つお願いします!!

# 回答3
「リファクタリングとかけまして、料理のレシピ改良と解きます。そのこころは?」

「どちらも効率とクオリティを向上させる目的で行うものでしょう」

# 質問4
最後にクスッっと笑えそうな例でお願いします!

# 回答4
「リファクタリングとかけまして、髪型を変えると解きます。そのこころは?」

「どちらもスッキリ感を得て、新しい自分に出会えるチャンスでしょう」

さいごに

今後も10分勉強会など社内の学習機会を活用して継続的にインプット・アウトプットを行っていきたいと思います。また自分にとって効率よく学習する上でChatGPTはもはや欠かせない存在になっていますが、今回のようにChatGptのデータ知識に含まれていない場合もあるので、用法・容量を正しく守って使用していきたいと思います。


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