<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>設計 on blog.kyu08.com</title>
    <link>https://blog.kyu08.com/pr-344/tags/%E8%A8%AD%E8%A8%88/</link>
    <description>Recent content in 設計 on blog.kyu08.com</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ja</language>
    <copyright>blog.kyu08.com</copyright>
    <lastBuildDate>Mon, 12 Jan 2026 00:27:58 +0900</lastBuildDate><atom:link href="https://blog.kyu08.com/pr-344/tags/%E8%A8%AD%E8%A8%88/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>『CQRS Documents by Greg Young』を読んだ</title>
      <link>https://blog.kyu08.com/pr-344/posts/cqrs-documents-by-greg-young/</link>
      <pubDate>Mon, 12 Jan 2026 00:27:58 +0900</pubDate>
      
      <guid>https://blog.kyu08.com/pr-344/posts/cqrs-documents-by-greg-young/</guid>
      <description>CQRSに興味があったのでGreg Young氏のCQRS Documentsを読んでみた。 https://cqrs.wordpress.com/wp-content/uploads/2010/11/cqrs_documents.pdfhttps://cqrs.wordpress.com/wp-content/uploads/2010/11/cqrs_documents.pdf CQRSに興味を持ったきっかけ ドメイン層のメンテナ</description>
      <content>&lt;p&gt;CQRSに興味があったのでGreg Young氏の&lt;a href=&#34;https://cqrs.wordpress.com/wp-content/uploads/2010/11/cqrs_documents.pdf&#34; target=&#34;_blank&#34; &gt;CQRS Documents&lt;/a&gt;を読んでみた。&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;blogcard&#34; data-url=&#34;https://cqrs.wordpress.com/wp-content/uploads/2010/11/cqrs_documents.pdf&#34; data-auto-fetch=&#34;false&#34;&gt;
  &lt;a href=&#34;https://cqrs.wordpress.com/wp-content/uploads/2010/11/cqrs_documents.pdf&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; class=&#34;blogcard-link&#34;&gt;&lt;div class=&#34;blogcard-thumbnail blogcard-thumbnail-placeholder&#34;&gt;
      &lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
        &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34;&gt;&lt;/path&gt;
        &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34;&gt;&lt;/path&gt;
      &lt;/svg&gt;
    &lt;/div&gt;&lt;div class=&#34;blogcard-content&#34;&gt;
      &lt;div class=&#34;blogcard-title&#34;&gt;https://cqrs.wordpress.com/wp-content/uploads/2010/11/cqrs_documents.pdf&lt;/div&gt;&lt;div class=&#34;blogcard-url&#34;&gt;https://cqrs.wordpress.com/wp-content/uploads/2010/11/cqrs_documents.pdf&lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h2 id=&#34;cqrsに興味を持ったきっかけ&#34;&gt;CQRSに興味を持ったきっかけ&lt;/h2&gt;
&lt;p&gt;ドメイン層のメンテナビリティの重要性を感じる中で、ドメイン層は書き込み系の振る舞いだけを担い、読み取り系の責務は別のモジュールに移譲してしまった方がドメイン層をシンプルに保てて良いのではないかと考えるようになった。&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;それってCQRSってやつじゃね？と思ったのでまずは原典に近いドキュメントを読んでみることにした。&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;ここからは&lt;a href=&#34;https://cqrs.wordpress.com/wp-content/uploads/2010/11/cqrs_documents.pdf&#34; target=&#34;_blank&#34; &gt;CQRS Documents&lt;/a&gt;の内容をまとめていく。&lt;/p&gt;
&lt;h2 id=&#34;a-stereotypical-architecture-典型的なアーキテクチャ&#34;&gt;&amp;ldquo;A Stereotypical Architecture&amp;rdquo;: 典型的なアーキテクチャ&lt;/h2&gt;
&lt;p&gt;&amp;ldquo;A Stereotypical Architecture&amp;quot;として、典型的なアーキテクチャが紹介されている。CQRS Documentsではこのアーキテクチャに対して段階的にCQRSを導入していく形で説明が進んでいく。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;a-stereotypical-architecture.webp&#34; alt=&#34;a-stereotypical-architecture.webp&#34; loading=&#34;lazy&#34; /&gt;
CQRS Documents by Greg Young P2より引用&lt;/p&gt;
&lt;p&gt;このアーキテクチャではシステムはCRUDのみの機能を持ち、クライアントとは&lt;strong&gt;常にDTOを介して通信する。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;おそらくクライアントが&lt;code&gt;UpdateUserName&lt;/code&gt;のようなエンドポイントに更新後のユーザーネームだけを渡すのではなく&lt;code&gt;/user&lt;/code&gt;に更新後のDTOを丸ごと渡す、というようなことだと思われる。&lt;/p&gt;
&lt;p&gt;サーバー側では受け取ったDTOをドメインオブジェクトに詰め替えてバリデーションを行い、永続化する。&lt;/p&gt;
&lt;p&gt;このような設計ではアプリケーションサービスの責務はDTOとドメインオブジェクトの詰め替えに終始し、ドメイン層はバリデーションを主な責務として受け持つ。データの更新方法はクライアントに委ねられてしまうため、ドメイン知識の一部がクライアント側に漏れ出してしまう。&lt;/p&gt;
&lt;p&gt;このようなアーキテクチャでは簡潔性によってオンボーディングコストが低くなるメリットがある代わりに、次のような課題が存在する。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;スケーリング:&lt;/strong&gt; 一般的なシステムでは読み取り操作は書き込み操作よりも2桁以上多い。読み取り操作から見ると非正規化されたデータ構造が適しているが、書き込み操作から見ると正規化されたデータ構造が適している。これらを単一のDBで扱おうとすると垂直スケーリングが必要になるが、垂直スケーリングには非常に高額なコストがかかる。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DDD適用の困難さ:&lt;/strong&gt; この設計ではAPIがデータ指向のインターフェースを持つため、システム全体がCRUDの4つの動詞に縛られる。（データの更新方法がクライアントまたはユーザー側に漏れ出ておりドメイン知識をソフトウェアで表現することが難しいため）&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;ここまでの感想&#34;&gt;ここまでの感想&lt;/h3&gt;
&lt;p&gt;さすがにこういったアーキテクチャのシステムは見たことがないので極端な例では&amp;hellip;?とは思いつつ時代や場所によってはこういった設計のシステムも存在するのかもしれない。&lt;/p&gt;
&lt;h2 id=&#34;cqrsとは&#34;&gt;CQRSとは&lt;/h2&gt;
&lt;p&gt;CQRSはBertrand Meyerが提唱した&lt;a href=&#34;https://en.wikipedia.org/wiki/Command%E2%80%93query_separation&#34; target=&#34;_blank&#34; &gt;『Command and Query Separation Principle』&lt;/a&gt;にその起源を持つ。Wikipediaではこの原則を次のように説明している。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It states that every method should either be a command that performs an action, or a query that returns data to the caller, but not both.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Command%E2%80%93query_separation&#34; target=&#34;_blank&#34; &gt;Command–query separation - Wikipedia&lt;/a&gt; より引用&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;とあり、すべてのメソッドはCommandかQueryのいずれかであるべきであり、両方を兼ねるべきではないと説明されている。&lt;/p&gt;
&lt;p&gt;これに対し、Martin Fowlerは以下のようにPopのような操作はCommandでありQueryでもあり、必ずしも上記の原則を厳密に守らなくてもいいのではないか、ということを述べている。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Meyer likes to use command-query separation absolutely, but there are exceptions. Popping a stack is a good example of a modifier that modifies state. Meyer correctly says that you can avoid having this method, but it is a useful idiom. So I prefer to follow this principle when I can, but I&amp;rsquo;m prepared to break it to get my pop. (Fowler)&lt;/p&gt;
&lt;p&gt;CQRS Documents by Greg Young P17より引用&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;ここまでの感想-1&#34;&gt;ここまでの感想&lt;/h3&gt;
&lt;p&gt;実際にWebサービスを開発していてもたとえばユーザー作成メソッドが作成したユーザーのIDを返すような処理は普通に書くし、自分もどちらかというと定義ほどは厳密に運用しなくても十分恩恵を受けられるのではないかという立場。&lt;/p&gt;
&lt;h2 id=&#34;a-stereotypical-architectureにcqrsを導入する&#34;&gt;&amp;ldquo;A Stereotypical Architecture&amp;quot;にCQRSを導入する&lt;/h2&gt;
&lt;p&gt;&amp;ldquo;A Stereotypical Architecture&amp;quot;として最初に紹介されたアーキテクチャでは、ドメインモデルがCommandとQueryの両方に使用されていた。このアプリケーションにCQRSを適用するとQuery側とCommand側はそれぞれ次のようになる。&lt;/p&gt;
&lt;h3 id=&#34;query&#34;&gt;Query&lt;/h3&gt;
&lt;p&gt;Query処理側にはデータ取得のためのメソッドのみが含まれる。&lt;/p&gt;
&lt;p&gt;元のアーキテクチャではドメインモデルを生成し、それをDTOにマッピングしたうえでクライアントに返却していた。多くの場合でドメインモデルとDTOは異なるモデルであるため、以下のような課題があるがこれがCQRSの適用によって解決される。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;複数集約から1つのDTOを生成する場合、複数回DBにアクセスする必要がありパフォーマンスが低下する。また、集約の境界が曖昧になる。&lt;/li&gt;
&lt;li&gt;ドメイン層にQueryの責務が多く含まれている（e.g. repositoryのinterfaceにQuery系のメソッドが多く含まれ、ページングやソート情報が含まれている）&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;After CQRS has been applied there is a natural boundary. Separate paths have been made explicit. It makes a lot of sense now to not use the domain to project DTOs. Instead it is possible to introduce a new way of projecting DTOs.&lt;/p&gt;
&lt;p&gt;CQRS Documents by Greg Young P20より引用&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;とあるように、CQRSを適用することでCommandとQueryの処理経路が明確に分離される。この段階ではドメインモデルをDTOの生成に使用しない方が合理的である。&lt;/p&gt;
&lt;p&gt;その代わりに&amp;quot;Thin Read Layer&amp;quot;という方法でDTOを生成することができる。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;thin-read-layer.webp&#34; alt=&#34;thin-read-layer.webp&#34; loading=&#34;lazy&#34; /&gt;
CQRS Documents by Greg Young P21より引用&lt;/p&gt;
&lt;p&gt;この層はDBから直接データを読み取り（ドメインモデルを迂回し）DTOを生成する。&lt;/p&gt;
&lt;p&gt;こうすることで、&lt;strong&gt;ドメイン層からQueryの責務を切り離すことができ、ドメイン層の純度を上げることができる。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;command&#34;&gt;Command&lt;/h3&gt;
&lt;p&gt;CQRSを適用するとCommand側のアーキテクチャは以下のようになる。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;the-command-site.webp&#34; alt=&#34;the-command-site.webp&#34; loading=&#34;lazy&#34; /&gt;
CQRS Documents by Greg Young P22より引用&lt;/p&gt;
&lt;p&gt;元のアーキテクチャでは書き込み系の処理をする際もDTOをクライアントから受け取っていたが、CQRS適用後はデータ中心ではなく振る舞い中心の契約を採用している点と読み取り処理が分離されている点が大きな違い。（元のアーキテクチャでは書き込み時にクライアントからDTOを渡していたが、ここではメッセージが渡されるようになっている）&lt;/p&gt;
&lt;p&gt;また、元のアーキテクチャでドメイン層に存在していた次のような課題が解決されている。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;リポジトリに大量の読み取りメソッドが存在する&lt;/li&gt;
&lt;li&gt;DTO構築のためにドメインオブジェクトの内部状態を公開するゲッターメソッドが存在する&lt;/li&gt;
&lt;li&gt;DTO構築のために複数の集約オブジェクトをそれぞれ読み込むことで、非効率なクエリが実行される&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;ドメインイベントイベントソーシング&#34;&gt;ドメインイベント、イベントソーシング&lt;/h3&gt;
&lt;p&gt;本文にはドメインイベント、イベントソーシングについても記載があり読んだがここでは割愛。&lt;/p&gt;
&lt;h3 id=&#34;ここまでの感想-2&#34;&gt;ここまでの感想&lt;/h3&gt;
&lt;p&gt;ドメイン層からQuery系の責務を切り離すことでメンテナビリティが向上する、というのが自分が（直近）CQRSに興味を持っていた一番の理由だったのでそうだよなーと思いながら読んだ。&lt;/p&gt;
&lt;p&gt;また（書いてあるとおりだが）読み取り単位を必ずしもドメインモデル単位にする必要がないためパフォーマンスの最適化が行いやすい点も大きなメリットだといえそう。&lt;/p&gt;
&lt;p&gt;結局CommandとQueryはまったく別の責務なことが多いので両者を分離することでメリットを得られるケースは多そう。&lt;/p&gt;
&lt;h2 id=&#34;作業習慣の違い&#34;&gt;作業習慣の違い&lt;/h2&gt;
&lt;p&gt;CQRS Documentsを読むまでは意識していなかったが、CQRSを採用することで&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ドメイン層&lt;/li&gt;
&lt;li&gt;リードモデル&lt;/li&gt;
&lt;li&gt;クライアント&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;の3つの要素に分解して作業を進めることができるため、プロジェクトに関わる開発者数をより効果的に増やすことができる。（サーバーとクライアントの作業分担をできるのはCQRSかどうかにかかわらないが、重要なのは1つのサーバーアプリケーションを2並列で安全に進めやすいという点だろう。）&lt;/p&gt;
&lt;p&gt;また、開発者には次のような観点の差異が存在する。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;技術的熟練度&lt;/li&gt;
&lt;li&gt;ビジネスドメインに関する知識&lt;/li&gt;
&lt;li&gt;コスト&lt;/li&gt;
&lt;li&gt;ソフトスキル&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ドメイン層の実装には4つすべての項目が秀でた人材が最適である一方、リードモデルの実装にはそれらの開発者要件は必ずしも当てはまるとは限らない。&lt;/p&gt;
&lt;h3 id=&#34;ここまでの感想-3&#34;&gt;ここまでの感想&lt;/h3&gt;
&lt;p&gt;開発効率の観点は持ってなかったが、たしかにCQRSを採用することで（1つのアプリケーションが2つのモジュールに分離されるので）コンフリクトせずに開発を進めやすそう。（モジュール設計はプロジェクトによるので厳密には2つのモジュールとは限らないが）&lt;/p&gt;
&lt;h2 id=&#34;感想&#34;&gt;感想&lt;/h2&gt;
&lt;p&gt;事前のイメージ通り、CQRSを適用することで開発効率を高められそうなイメージが持てた。&lt;/p&gt;
&lt;p&gt;CQRS Documents内でも触れられていたが、結局CQRSにしろイベントソーシングにしろ一定のオーバーヘッドはあるので、システムやビジネスの課題や要件、今後の見通しを元に必要性を検討するのが（いつだって）重要そう。&lt;/p&gt;
&lt;p&gt;というのはありつつ、ドメイン層のメンテナビリティを高めるためにCQRSを採用するのはかなり有効な選択肢の1つだとも感じているので、ひとまず個人のプロジェクトで検証してみたいと思う。&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;もちろんアプリケーションの状況にもよるが&amp;hellip;。repositoryのRead系メソッドの返り値がドメインモデルと一致&lt;strong&gt;しない&lt;/strong&gt;ケースが多くなるような場合では特にCQRSのメリットが効果を発揮しやすいような気がしている。状況にかかわらずCQRSをやったほうがいいのかどうかはまだあまりわかっていない。ちなみにここでのCQRSは基本的には&lt;strong&gt;同一DB&lt;/strong&gt;でCのアプリケーションコードとQのアプリケーションコードが分離されている、くらいの方法をざっくり想定して書いている。（CとQでDBを分けるパターンは流石にtoo muchなケースが多そうなので）&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;厳密にこのドキュメントが原典であることを確認したわけではない。正確な情報をお持ちの方がいたら教えて下さい。&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</content>
    </item>
    
    <item>
      <title>『Tidy First?』を読んだ</title>
      <link>https://blog.kyu08.com/pr-344/posts/tidy-first/</link>
      <pubDate>Sat, 04 Oct 2025 08:21:10 +0000</pubDate>
      
      <guid>https://blog.kyu08.com/pr-344/posts/tidy-first/</guid>
      <description>『Tidy First?』を読んだ。 勉強になったところをまとめる。 「整頓」という概念 整頓はリファクタリングのサブセットだ。整頓は可愛くてふわふ</description>
      <content>&lt;p&gt;『&lt;a href=&#34;https://www.oreilly.co.jp/books/9784814400911/&#34; target=&#34;_blank&#34; &gt;Tidy First?&lt;/a&gt;』を読んだ。&lt;/p&gt;
&lt;p&gt;勉強になったところをまとめる。&lt;/p&gt;
&lt;h2 id=&#34;整頓という概念&#34;&gt;「整頓」という概念&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;整頓はリファクタリングのサブセットだ。整頓は可愛くてふわふわした小さなリファクタリングなので、誰も嫌いになれないはずだ。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;リファクタリングほど大掛かりなものではなく、数十分でできるような小さな改善を本書では「整頓」と呼んでいる。&lt;/p&gt;
&lt;p&gt;具体的にはコードコメントを追加したり適切な位置に空行を配置したり適切な変数名に変更したりすることなどを指している。&lt;/p&gt;
&lt;p&gt;この「整頓」という概念を知ることができたのが本書を読んで得られた最大の収穫だった。今までそのような行為に名前をつけたことがなかったが名前をつけることで使い所や意義が明確になり意識的に実践できるようになりそう。&lt;/p&gt;
&lt;p&gt;なお本書では「整頓」と「振る舞いの変更」の順番やタイミング、粒度や意義について様々な角度から書かれているので気になる方はぜひ手にとってみてほしい。&lt;/p&gt;
&lt;h2 id=&#34;第11章-ステートメントを小分けにする&#34;&gt;第11章 ステートメントを小分けにする&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;大きなコードのチャンクを読んでいると、「ああ、ここは&lt;strong&gt;これ&lt;/strong&gt;をしていて、あそこで&lt;strong&gt;あれ&lt;/strong&gt;をしているのか」とわかる。そのあいだに空行を入れよう。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;長めの関数を読むとき、空行がまったくないことは少ないが空行の位置を改善できそうだと感じることがたまにある。&lt;/p&gt;
&lt;p&gt;処理の塊ごとに適切に改行されているだけでそこそこ可読性が上がる実感があるのでやってみようと思う。（空行の追加/削除のみのPRであればレビュワーの負担もかなり少ないはず）&lt;/p&gt;
&lt;h2 id=&#34;第13章-ひとかたまり&#34;&gt;第13章 ひとかたまり&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;細かく分割されているがゆえに、かえって理解を妨げているようなコードに出会うことはないだろうか。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;超巨大な関数はテストしづらく可読性も低いので避けたいが、逆にすべての処理を関数として切り出してしまうと毎回定義ジャンプしないと処理の内容がわからないのでかえって読みづらくなってしまう。&lt;/p&gt;
&lt;p&gt;テストが書きやすい程度に細かくかつ可読性が落ちない程度には大きく関数を切り出すのがよさそうで、いい塩梅を探るには複数のパターンを実際に書いてみて読みやすいかどうかを判断するのがよさそう。（実際に複数パターンを書いてみると意外とすぐに書けることが多いし、しかも実際に書いてみると事前の想定とは印象が違うことが多いように思う）&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;小さな部品に分けようとするのは、コードを少しずつ理解できるようにしたいからだ。だが、ときには、このプロセスが間違った方向に進むことがある。小さな部品のやりとりの仕方によっては、コードが&lt;strong&gt;理解しにくくなる&lt;/strong&gt;のだ。明確さを取り戻すには、まずはコードを1箇所に集めて、それから改めて、簡単に理解できる部品を抽出する。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;1000行の関数でこれをやるとさすがに辛そうだが、100行前後くらいであればひとまず1つにまとめてから再構成するのはたしかに良さそう。&lt;/p&gt;
&lt;h2 id=&#34;第14章-説明コメント&#34;&gt;第14章 説明コメント&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;コードを読んでいて「なるほど、それで&lt;strong&gt;こう&lt;/strong&gt;なっているのか」と声が出ることがある。これは貴重な瞬間だ。記録しよう。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;コードリーディングの結果、必要なコメントが欠けていることに気づくことがある。&lt;/p&gt;
&lt;p&gt;そういった場面でこれまであまりPRを作ったりはしてこなかったが、説明コメントの追加も立派な整頓であり将来の読者（当然将来の自分を含む）の時間を節約することに繋がるのでやっていきたい。&lt;/p&gt;
&lt;p&gt;説明コメントの追加PRはレビュワーの負荷が少ない割にレビュイーとレビュワーのコード理解を深められる点で比較的コスパの良い取り組みな気がした。（正確な説明コメントを書くための調査が大変、とかはあるかもだが）&lt;/p&gt;
&lt;h2 id=&#34;第19章-リズム&#34;&gt;第19章 リズム&lt;/h2&gt;
&lt;p&gt;1つの整頓にかける時間はここでは1時間くらいまでが許容範囲とされており、それを大幅に超過するようであれば変更の単位が大きすぎる兆候らしい。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;こんな話を聞いたことはないだろうか。ある大学がたくさんの建物を造った。計画者は、それを結ぶ歩道をどこに造るか考えていた。だが、そこで経験にもとづいて注意深く推測するのではなく、建物のあいだのエリアに芝生を植えたのだ。
数か月後、学生の歩いた跡によって芝生に道ができた。計画者は芝生がなくなったところを舗装した。&lt;/p&gt;
&lt;p&gt;コードにおいて、振る舞いの変更は一部に集中する傾向にある。パレートの法則にあるように、80%の変更は20%のファイルで起こる。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;（計画者天才すぎワロタ&amp;hellip;）&lt;/p&gt;
&lt;p&gt;変更の前に整頓することを続けていくと頻繁に変更される20%のコードがどんどん綺麗になっていく、ということを言っているのだと解釈した。&lt;/p&gt;
&lt;p&gt;そうした取り組みを続けていくとコードの大部分は手直ししてないにもかかわらず整頓していないコードに出会うことは稀になる。逆に言うと仮にコードの50%を頑張って綺麗にしたところで、その50%に変更がまったく入らないのであれば投資対効果が高いとはいえないかもしれない。（当然、コード全体が複雑に絡み合っていて一部だけ再設計することが難しい場合や全体的に変更しないと一貫性がなくなる場合などはその限りではないと思う）&lt;/p&gt;
&lt;p&gt;なのでコードを修正する際は単純にある時点のコードベースだけを見てコード品質に改善点が見つかったというだけの理由で修正する、というよりは修正すべき合理的な理由（e.g. 内部品質が課題で問題が起きている、よく変更が入る箇所が変更しづらくなっているなど）がある箇所から対応していくのがよさそう。&lt;/p&gt;
&lt;h2 id=&#34;第21章-先に整頓あとに整頓改めて整頓整頓しない&#34;&gt;第21章 先に整頓、あとに整頓、改めて整頓、整頓しない&lt;/h2&gt;
&lt;p&gt;整頓を変更の前にやるか、あとにやるか、将来時間がとれたときにやるか、あるいはまったくやらないかについて論じた章。&lt;/p&gt;
&lt;p&gt;章のまとめにもあるように結局はビジネスにとって合理的なタイミングでやるのがよい、ということなのだと思った。（言葉にするとそれはそうという感じではあるが）&lt;/p&gt;
&lt;p&gt;「改めて整頓する」と「あとに整頓する」の区別はあまり考えたことがなかったが、整頓が完了するまでの必要工数が
大きいケース以外は「あとに整頓する」に寄せるのが良さそうに感じた。&lt;/p&gt;
&lt;h2 id=&#34;第25章-明日の1ドルより今日の1ドル&#34;&gt;第25章 明日の1ドルより今日の1ドル&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;お金を生む振る舞いの変更を今すぐ実装して、あとから整頓できるなら、すぐにお金が手に入り、あとでお金を使うことになる(前述のとおり、ときには先に整頓してから振る舞いを変更するほうが整頓せずに変更するよりも安価なこともある。そんな場合は常に先に整頓する)。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ビジネス的なメリットがあるならば整頓を後回しにすることが合理的になるのは十分にありえる。(e.g. 12/1までにリリースできれば大企業A社の受注に繋がるが、それを超過してしまうと競合他社と契約されてしまい、A社と契約できるチャンスが消滅してしまう)&lt;/p&gt;
&lt;p&gt;逆に、先に整頓したほうが変更が楽になるならそうする。コードベースへの理解、ビジネスへの関心と理解（デッドラインは最終的なものなのか、調整可能なのか）、一定の設計スキルなどがあるとこの判断の練度を上げることに繋がりそう。&lt;/p&gt;
&lt;!-- 逆に、先に整頓したほうが変更が楽になるならそうする。じゃあメリデメを整理していい感じに判断すればいいじゃん、という話になるがこの判断を正確にするためにはコードベースへの理解、ビジネスへの関心と理解（デッドラインは最終的なものなのか、調整可能なのか）、一定の設計スキルなどが必要そう。 --&gt;
&lt;h2 id=&#34;第26章-オプション&#34;&gt;第26章 オプション&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;「次にどのような振る舞いを実装できるか」は、実装する前から、それ自体に価値がある。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;これはあまり考えたことがなかった。「プログラムの変更容易性は将来の実装工数を削減するために重要である」というアイディアと本質的には近いことを言ってそうだが、「価値」という切り口で捉え直すとたしかに変更容易性は価値と等価ともいえそう。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;（これが最重要なのだが）価値予測の不確実性が&lt;strong&gt;高い&lt;/strong&gt;ほど、オプションの価値は&lt;strong&gt;高い&lt;/strong&gt;（今すぐ実装するのと比べて）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;価値予測の不確実性と変更容易性の価値についてもあまり考えたことがなかったが納得感があった。たとえばよくあるSaaSモデルのプロダクトであれば探索しながら市場の反応を見たり変化に対応したりすることが必要で、そのためには変更容易性が必要なのでその価値がより高まる、ということだと理解した。&lt;/p&gt;
&lt;h2 id=&#34;第32章-凝集&#34;&gt;第32章 凝集&lt;/h2&gt;
&lt;p&gt;凝集性が低いモジュールの改善方法についての章だが、どちらかというと章の後半に書かれていた下記の記述が参考になった。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;次の人のために少しだけコードを整頓しておこう。全員がこのボーイスカウトルール(「来たときよりも美しく」)に従えば、そのうちにより扱いやすいコードになっていくだろう。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;これまではボーイスカウトルールというと「触ったコードの負債をできるだけ&lt;strong&gt;リファクタリングして綺麗にすべし&lt;/strong&gt;」のような考え方だと認識していた（これ自体は間違いではないと思う）。&lt;/p&gt;
&lt;p&gt;本格的なリファクタリングまではいかなくとも、本書で「整頓」として紹介されている「コードコメントの追加」や「空行の調整」なども十分ボーイスカウト的な行為なのだなと考え直して少しハードルが下がる感覚を得た。&lt;/p&gt;
&lt;h2 id=&#34;第33章-結論&#34;&gt;第33章 結論&lt;/h2&gt;
&lt;p&gt;本書のタイトルにもなっている、どんなときに先に整頓すべきかについてのまとめの章。&lt;/p&gt;
&lt;p&gt;以下の4つの観点で整理して決断するとよい、と書かれている。次に判断に迷った際には参考にしてみたい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コスト&lt;/li&gt;
&lt;li&gt;収益&lt;/li&gt;
&lt;li&gt;結合&lt;/li&gt;
&lt;li&gt;凝集&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- &gt; だが、いちばん重要なのはあなただ。整頓はあなたのプログラミングに平穏と満足、喜びをもたらしてくれるだろうか? 多少はありそうだ。これは重要だ。なぜなら、あなたが最高の自分でいれば、より良いプログラマーでいられるからだ。いつも急いでいて、変更に痛みを伴うコードの変更をしているなら、最高の自分ではいられない。 --&gt;
&lt;!----&gt;
&lt;!-- この部分に関してはちょっと諸説ありそうだと思った。 --&gt;
&lt;!----&gt;
&lt;!-- プログラマ的にはクリーンなコードを書いたり、コードをクリーンにする作業自体が楽しかったり、そこから学びを得ることができるというのは当然理解できる。 --&gt;
&lt;!----&gt;
&lt;!-- ただ業務であまりそこを重視しすぎるとビジネス的な都合を無視する考えに繋がるのでは...と思った。（著者はそこまで言ってないかもだが）一般的にはビジネスがうまくいかないと売上が上がらないことに起因してモチベーションが下がったり報酬が思ったように上がらなかったり、働く環境が悪化したりすることもあるため難しい。 --&gt;
&lt;!----&gt;
&lt;!-- いちメンバーの視点だとビジネス都合とソフトウェアの状況を勘案して総合的に判断するのがよさそうな気がした。 --&gt;
&lt;!----&gt;
&lt;!-- マネジメント側の立場だとメンバーのパフォーマンスを高めることも重要な責務なのでうまくバランスを取るのが重要そう。 --&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;164ページと全体がコンパクトにまとまっているのと、簡潔に書かれている（かつ、翻訳もとても読みやすい）ので短時間で読みやすかった。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「整頓」&lt;/strong&gt; という概念を知れたのが最大の収穫だった。今後は意識的に実践していきたいと思う。&lt;/p&gt;
&lt;p&gt;次回作の構想もあるようなので楽しみ。&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>『ちょうぜつソフトウェア設計入門 PHPで理解するオブジェクト指向の活用』を読んだ</title>
      <link>https://blog.kyu08.com/pr-344/posts/chozetsu-bon/</link>
      <pubDate>Sat, 15 Jul 2023 15:00:00 +0000</pubDate>
      
      <guid>https://blog.kyu08.com/pr-344/posts/chozetsu-bon/</guid>
      <description>田中ひさてるさんの『ちょうぜつソフトウェア設計入門――PHPで理解するオブジェクト指向の活用』が話題になっていたので読んでみた。 全体を通して</description>
      <content>&lt;p&gt;田中ひさてるさんの『ちょうぜつソフトウェア設計入門――PHPで理解するオブジェクト指向の活用』が話題になっていたので読んでみた。&lt;/p&gt;
&lt;p&gt;全体を通して平易な日本語で書かれていたのとコード例が豊富だったので理解しやすくてよかった。&lt;/p&gt;
&lt;p&gt;以下学びを簡単にまとめていく。&lt;/p&gt;
&lt;h2 id=&#34;第2章-パッケージ原則&#34;&gt;第2章 パッケージ原則&lt;/h2&gt;
&lt;p&gt;より変更に強いパッケージ設計にするために注意すべき点として&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;パッケージの凝集性を高める&lt;/li&gt;
&lt;li&gt;より安定度が高い(=抽象度が高い)パッケージに依存する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;などがある。&lt;/p&gt;
&lt;p&gt;また、&lt;strong&gt;凝集性の低さを表すシグナル&lt;/strong&gt;として&lt;strong&gt;そのパッケージが変更される理由が複数あること&lt;/strong&gt;・&lt;strong&gt;1つの変更の際に変更対象となるパッケージが複数あること&lt;/strong&gt;(それぞれ同じ?)が挙げられる。&lt;/p&gt;
&lt;p&gt;「抽象」については以下のように説明されていた。&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;抽象クラスやインターフェイスなど実装詳細を自身から排除したもの&lt;/li&gt;
&lt;li&gt;上記のような詳細を持たないものだけに依存するロジック&lt;/li&gt;
&lt;li&gt;固有の業務にも特定技術にも関係しない時刻や配列などの汎用概念とその操作&lt;/li&gt;
&lt;li&gt;プログラミング言語そのものや言語標準ライブラリと同等レベルの業界標準&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;第3章-オブジェクト指向&#34;&gt;第3章 オブジェクト指向&lt;/h2&gt;
&lt;h3 id=&#34;いい抽象を見つけるには&#34;&gt;いい抽象を見つけるには&lt;/h3&gt;
&lt;p&gt;具体的な例を分析してそれらから抽象を見つけることで期待値の高い抽象を発見できる。&lt;/p&gt;
&lt;p&gt;逆に先に&lt;strong&gt;ひとりよがりの哲学をこねくり回して現実をかえりみない抽象化を先行させた&lt;/strong&gt;場合は、&lt;strong&gt;役に立たない概念に縛られる無駄が起きやすくなる。&lt;/strong&gt;（ペットショップのシステムなのに「Catには野良猫もいるかもしれない。必ずしもPetではないかも&amp;hellip;…」みたいなことを考えてしまうのは明らかに無駄）（抽象化においてもYAGNIが重要っぽい）&lt;/p&gt;
&lt;p&gt;無限の可能性に向かって発散してしまわず、いかに可能性を削ぎ落として最小サイズで実際に起こりうるバリエーションをカバーできるかが汎化のポイント。&lt;/p&gt;
&lt;p&gt;そういう意味でもドメインやビジネスの状況を理解しておくことはプロダクトの将来を考慮しながら設計するために必要なんだろうなと思った。&lt;/p&gt;
&lt;h3 id=&#34;多態性がなくても役立つ&#34;&gt;「多」態性がなくても役立つ&lt;/h3&gt;
&lt;p&gt;抽象と具象は必ずしも1対多の関係である必要はない。&lt;/p&gt;
&lt;p&gt;具象と抽象に分けておくことで先に大枠を安定させることができるため、設計の見通しがつきやすくなる。&lt;/p&gt;
&lt;p&gt;また、具象の数が複数になったときに対応しやすいというメリットもある。&lt;/p&gt;
&lt;p&gt;これまで「抽象と具象が1対1対応なケースはわざわざDIする必要はないのでは」と思っていたが上記のメリットがあるので積極的にDIしていこうと思った。&lt;/p&gt;
&lt;h2 id=&#34;第5章-オブジェクト指向原則-solid&#34;&gt;第5章 オブジェクト指向原則 SOLID&lt;/h2&gt;
&lt;h3 id=&#34;5-2-単一責任原則single-responsibility-principlesrp&#34;&gt;5-2 単一責任原則(Single Responsibility Principle(SRP))&lt;/h3&gt;
&lt;p&gt;クラスと責務は1対1対応すべき、という指針。&lt;/p&gt;
&lt;h4 id=&#34;単一の責務のみつけかた&#34;&gt;単一の責務のみつけかた&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;クラスの利用者がどんなときに別のクラスや新しいバージョンに交換したいと思うかを想像する。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;実際に起こりそうな交換要求への想像が責務(= クラスのカバー範囲)を見極めるヒントになる。&lt;/p&gt;
&lt;p&gt;たとえば記事クラスが存在し記事の入稿および購読というユースケースがある例では以下のように考えることができる。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ニュース記事を書く人の事情が変わったけれど、購読ユーザーには従来どおりのサービスを提供したい。逆に、入稿はそのまま、購読ユーザーへのサービスを拡張したい。そんなニーズが起きるのは容易に想像できます。入稿と購読のそれぞれを互いに影響を与えない独立したクラスとしておき、いつでも気兼ねなく別の実装に交換できる単位としておく方が、後で便利に決まっています。なので、ニュース記事管理の場合は、「入稿」と「購読」が、それぞれひとつの責務になります。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;5-3-開放閉鎖原則open-close-principle&#34;&gt;5-3 開放閉鎖原則(Open Close Principle)&lt;/h3&gt;
&lt;p&gt;拡張に対してオープン、変更にたいしてクローズドであるべき、という指針。&lt;/p&gt;
&lt;p&gt;これは書籍内で紹介されていたコード例がわかりやすかった。&lt;/p&gt;
&lt;p&gt;あとはどこが変化する仕様なのかを考えるために一度要件を抽象化してみる方法が紹介されていた。こちらもコード例が示されていたのでイメージが湧きやすかった。&lt;/p&gt;
&lt;h2 id=&#34;第7章-依存性注入&#34;&gt;第7章 依存性注入&lt;/h2&gt;
&lt;p&gt;オブジェクトが使う機能の実体を得る際その解決を自力で行わず、常に外部から与えるようにすべき、という設計方針。&lt;/p&gt;
&lt;p&gt;依存性注入を行うメリットの1つは生成の責務と使用の責務を分けられる点がある。&lt;/p&gt;
&lt;p&gt;また、テスト容易性とDIについては以下のような記述があった。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;単体テストしやすいクラスであることと、DI可能なクラスであるということには、正の相関があります。DIを単に「単体テストのためにやること」といった目的観で考えるのは視野狭窄ではあるのですが、単体テストがアーキテクチャへの気づきの手段として、とても有用なのは間違いありません。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;テストが書きずらかったら設計を疑ってみるのも1つの手かもしれない。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;よく聞くSOLID原則もやっとちゃんと理解できたし依存性注入に対する理解も深まったので今後に活かしていきたい。&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>デザインパターンをひととおり眺めた感想</title>
      <link>https://blog.kyu08.com/pr-344/posts/learn-design-pattern/</link>
      <pubDate>Wed, 01 Feb 2023 16:15:48 +0000</pubDate>
      
      <guid>https://blog.kyu08.com/pr-344/posts/learn-design-pattern/</guid>
      <description>ずっと気になってはいたが2つ~3つくらいしか知らなかったデザインパターンをやっと勉強する気になったのでこのサイトを一通り眺めてみた。 デザイン</description>
      <content>&lt;p&gt;ずっと気になってはいたが2つ~3つくらいしか知らなかったデザインパターンをやっと勉強する気になったのでこのサイトを一通り眺めてみた。&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;blogcard&#34; data-url=&#34;https://refactoring.guru/ja/design-patterns&#34; data-auto-fetch=&#34;false&#34;&gt;
  &lt;a href=&#34;https://refactoring.guru/ja/design-patterns&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; class=&#34;blogcard-link&#34;&gt;&lt;div class=&#34;blogcard-thumbnail&#34;&gt;
      &lt;img src=&#34;https://refactoring.guru/ja/images/refactoring/social/facebook-share-preview.png?id=dbf9e98269595be86eb668f365be6868&#34; alt=&#34;デザインパターン&#34; loading=&#34;lazy&#34;&gt;
    &lt;/div&gt;&lt;div class=&#34;blogcard-content&#34;&gt;
      &lt;div class=&#34;blogcard-title&#34;&gt;デザインパターン&lt;/div&gt;&lt;div class=&#34;blogcard-description&#34;&gt;デザインパターンは、ソフトウェア設計でよく起きる問題に対する典型的な解決方法です。これらは、事前に用意された、問題解決のための設計図で、適宜変更して、自分のコードにおける特定の設計上の問題の解決に使えます。&lt;/div&gt;&lt;div class=&#34;blogcard-url&#34;&gt;https://refactoring.guru/ja/design-patterns&lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;こちらのサイトは平易な文章とわかりやすい例で説明がされていて、各言語でのサンプルコードも載せてくれていたのでかなりサクサクと理解できてとてもよかった。(各パターンをC#, C++, Go, Java, php, Python, Ruby, Rust, Swift, TypeScriptで実装した例が紹介されていた)(すごい)&lt;/p&gt;
&lt;h2 id=&#34;自分のデザインパターンとの向き合い方について&#34;&gt;自分のデザインパターンとの向き合い方について&lt;/h2&gt;
&lt;p&gt;周りのエンジニアにデザインパターンについて聞くと、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;すべてのパターンが今も有用かと言われるとそうでもないかも&lt;/li&gt;
&lt;li&gt;よくある設計パターンの共通言語として知っておくとコミュニケーションの効率があがってよい&lt;/li&gt;
&lt;li&gt;暗記までする必要はなくて設計のときの参考程度にするとよさそう&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;みたいなことを言っているのをよく聞くのですべてを自分のものにするというよりは軽く雰囲気を理解するくらいのテンションでサイトを眺めてみた。&lt;/p&gt;
&lt;h2 id=&#34;感想&#34;&gt;感想&lt;/h2&gt;
&lt;p&gt;一通り眺めてみて、以下のようなことが重要なんだろうなと感じた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;interfaceをうまく使って抽象に依存する&lt;/li&gt;
&lt;li&gt;データと振る舞いを分離する&lt;/li&gt;
&lt;li&gt;依存の方向に気を付ける&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;いろんなところで言われていることだが、やはり責務の分離や単一責任の法則を意識することで変更しやすいコードにしていくことがよりよい設計に繋がることを再確認できた。&lt;/p&gt;
&lt;p&gt;いいコードを書けるようになるにはこれらのことを意識しながら実際にコードを書いて実践していくことが重要だと思うのでたくさん試行錯誤していい感じのコード書き力を身につけていきたい。(とても経験豊富な先輩エンジニアも結局自分でサービスを運用して設計の失敗の痛みを感じるのが一番成長できる、というようなことを言っていた)&lt;/p&gt;
&lt;p&gt;設計関連だと &lt;a href=&#34;https://www.amazon.co.jp/dp/4297127830&#34; target=&#34;_blank&#34; &gt;良いコード/悪いコードで学ぶ設計入門 ―保守しやすい 成長し続けるコードの書き方&lt;/a&gt; とか &lt;a href=&#34;https://www.amazon.co.jp/Clean-Architecture-%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E6%A7%8B%E9%80%A0%E3%81%A8%E8%A8%AD%E8%A8%88-Robert-C-Martin/dp/4048930656&#34; target=&#34;_blank&#34; &gt;Clean Architecture&lt;/a&gt; とかも気になってるので読みたい。&lt;/p&gt;
</content>
    </item>
    
  </channel>
</rss>
