B-Teck!

お仕事からゲームまで幅広く

【本/DDD】 わかる! ドメイン駆動設計~もちこちゃんの大冒険~読書メモ

booth.pm

こちらの本を読みました。
ストーリー仕立てでドメイン駆動設計の戦略的な部分を平易に説明してくれる良本で、DDDの用語にとっつきづらさを感じていた自分にはちょうどよい内容でした。
戦術的な部分については一切書かれていないので注意。
次は「ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本」を読んで、戦術的な部分を抑えてみようかなと思ってます。

ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基本

ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基本

  • 作者:成瀬 允宣
  • 発売日: 2020/02/13
  • メディア: 単行本(ソフトカバー)

以下読書メモです

DDDってなに?

DDDとは

  • DDD = Domain Driven Design(ドメイン駆動設計)のこと
  • ドメイン駆動設計はソフトウェア開発手法であり、ソフトウェアモデルを設計する指針となる手法・理論・概念

DDDでは何をする?

  • 開発者とドメインエキスパートが協力してドメインを反映したモデル(ドメインモデル)を作り上げる
    • ドメインとはソフトウェアを適用する対象領域 ソフトウェアを通して表現したいなんらかの業務など
    • ドメインエキスパートとはドメインに対して知識を持っている人 業務の流れ/業務知識/既存設計/営業視点/実際の業務/運用の歴史など

ドメインを反映したモデル

  • ドメインを反映したモデルとは、ドメインを構成する物・概念・振る舞い・関係性を表現したもの 業務を構成するタスクがどのような関係性を持ち、どのような役割・振る舞いを期待されて存在しているか
  • DDDを効果的に行い、現実世界を適切に表したモデルを作るにはプロジェクトが下記のように進んでいると望ましい
    • 開発がイテレーティブである
    • 開発者とドメインエキスパートが密接に関わっている

DDDをすべき理由

  • ドメインエキスパートと開発者が相互に連携しモデルを作り上げることで、全員が業務・ソフトウェアを理解した状態を作り出せる

DDDの要素

  • DDDを構成する要素として、戦略的設計と戦術的設計がある
    • 戦略的設計
      • ユビキタス言語などの考え方や概念についてのもの
    • 戦術的設計
      • エンティティ・値オブジェクトなどの技術的手法
  • 戦術的設計だけを適用してもそれなりにメリットは得られるが、戦略的設計を行った上で戦術的設計を適用することがDDDの本旨

ユビキタス言語ってなに?

ユビキタス言語とは/ユビキタス言語を見つけるには

  • ドメインエキスパート・開発者間で共通となる、ドメインやその要素・振る舞いや関連性などを一意に表すための言葉
  • 関連する人間が同じものを同じ言葉で表すことが大事
    • そうでないものは徐々に排除し、置き換えていく

変化し続けるユビキタス言語

  • ユビキタス言語はソフトウェアの成長とともに常に変化しうるものであり、用語集的なものを用いると陳腐化しやすい
    • ので、ソフトウェアのコメントなどにできると良い

ユビキタス言語の適用範囲

  • 同じものを同じ言葉で話すことで認識の齟齬が減り、手戻りや修正、そもそもの認識の違いなどと言ったリスクが回避しやすくなる
  • プロジェクトの中での会話・ドキュメント・ソースコードなど、あらゆる範囲で同じ言葉を用いる

ユビキタス言語とドメインモデル

  • ドメインモデルはユビキタス言語で表されなければならない
  • つまり、ドメインモデル及びその実装についてユビキタス言語で定義できる状態になっていなければならない

ユビキタス言語の確立

  • 既に存在していたりするフレーズなどを収集する
    • 現在のドキュメントに存在するフレーズ 同じ存在を表しているもの/現象だけがあるもの/概念だけがあるもの
    • ドメインエキスパートが用いる言葉・単語
    • それらの振る舞いを表す言葉
  • 収集した言葉をチーム内で議論し、1つの言葉に収束させていく

ドメインモデル

ドメインモデルとは

  • ドメインを反映した概念的なモデル
  • チーム内での名前・関係性・振る舞いの概念を規定する
  • コードで表現されたドメインモデルが成果物であり、設計である状態を維持することがドメイン駆動設計

ドメインモデル貧血症

  • ドメインモデルが値を保持するだけのオブジェクトとなっていたり、ドメインモデルに振る舞いが規定されていない状態
  • ユビキタス言語に基づいてドメインの振る舞い・意図を実装したものこそがドメインオブジェクト

境界づけられたコンテキストって?

ドメインとは

  • 何らかの業務を表す領域のようなもの
  • 殆どのソフトウェアのドメインは複数のサブドメインの集合体である
    • サブドメインの種類
      • そのドメインを表すのに必要不可欠なコアドメイン
      • 業務にロックインしている、独自の機能、領域を表す支援サブドメイン
      • 十分に汎化され、なくても成り立つ、代替可能である汎用サブドメイン

境界づけられたコンテキストとは

  • ユビキタス言語やドメインの概念は、特定のコンテキストの中でのみ通用する概念である
  • サブドメイン単位であることもあれば、サブドメイン内で担当チームごとにコンテキストの境界が存在することもある
  • 解決したい問題に対して適切なサイズの境界付けを行うことで、チーム内が一つの概念を扱う形に統率できる

コンテキストマップ

コンテキストマップとは

  • 複数の境界付けられたコンテキストとその関係性を描いたもの
  • 境界付けられたコンテキスト自体の名前をユビキタス言語から取る

コンテキストマップの役割

  • ありのままの現状を表現する
  • それぞれのコンテキストの関係性、振る舞いについて、チーム内に共有と理解をもたらすもの

コンテキストマップを活用する

境界づけられたコンテキストの関係性のパターン

  • 共有カーネル
    • 2つのチーム間でコンテキストをやり取りをするための、ドメインモデルのサブセット
    • 自分たちのコンテキストと共有カーネルだけを意識すれば良くなる
  • 顧客/供給者の開発チーム
    • 2つのチームで開発しているシステムに相互の関係があり、片方が完全に依存している場合に適用できるパターン
      • 上流を供給者、下流を顧客と見立てて顧客と供給者という関係で定義する
      • 上流が下流の要望に答えるメリットがない場合はこのパターンの適用が難しい
    • 下流が要件を洗い出し、上流へ伝える
    • 上流は下流に対して要件を満たす適切なインターフェースを提供する
  • 順応者
    • 2つのチームで開発しているシステムに相互の関係があり、顧客と供給者の関係を築けない場合のパターン
    • 下流のチームが順応者として上流チームの提供するドメインモデルに従い開発するパターン
    • 上流のコンテキストに合わせた開発を行うため下流の負荷は高くなるが、開発を進めることは出来る
    • 順応者として振る舞えるほどコンテキストが単純でない場合、後述の腐敗防止層のパターンを用いることも出来る
  • 腐敗防止層
    • 境界づけられたコンテキスト間の変換にかかるコストが高い場合に、変換用のレイヤを用意するパターン
    • レイヤを持つことで独自のユビキタス言語、ドメインモデルを保つ
  • 別々の道
    • 要件を整理した結果コンテキスト間の関係が薄かった場合に、それらの関係を切り離して独立したドメインモデルとすること
  • 公開ホストサービス
    • 多くのコンテキストと関連する場合、個別に変換するレイヤを設けず、プロトコルとインターフェースを定義・公開するパターン
    • 1対他の共有カーネルのようなもの?
  • 公表された言語
    • 公開ホストサービスが提供するプロトコルとして利用する言語
    • 独自にプロトコルを生み出すのではなく、一般的に広く利用されているxmlやjsonなどを介すことで問題を簡単にする
  • 巨大な泥団子(巨大なコンテキスト)
    • 既存のシステムがドメインで整理されておらず、分割も難しい場合に一つのコンテキストとして隔離してしまうこと
    • 巨大なコンテキストの整理を一旦諦めて、腐敗防止層などを用意して腐敗が溶け込まないようにする

【雑記】前に進むしかないという話

※極個人的な感情の辛さを整理するために書いたものです。

ここ数日、数年ぶりに仕事で何も出来ていないなぁ、役に立てていないなぁという無力感を味わう毎日が続いている。

未知の既存プロダクトの再構築、かつ得手としていないDB部分の構築、1Bに共有され1Eからjoin、3Eまでに動くAPIを用意する業務。
要件の吸い上げ、理解、そして構成、何もかもわからないまま手探りで進んでいるし、何より難しいのが基本的に自分一人の案件で進める案件であることだ。
多忙なドメインエキスパートをうまく捕まえられれば質問や意見をもらうことなどが出来ないわけではないが、それをするには自分がまず理解して言語化しないといけない。
2月に入ってからは、半べそかきながら既存仕様を理解し、あるべき姿を脳内に作り上げ、それを元に意見を交わし、前に進む、の繰り返し。
本当に前に進んでいるのか、自分は何をしているのか、そんな事を自問する毎日で、精神が参らないはずはないなと思った。
この年齢になってその経験が出来ることはありがたいことでもあるけれど、つらいことでもあって、この業務に自分が携わる意味とは…とか、どうせ間に合わないでしょ…とか、そんな事を考えてばかりいた。

正直今でもその気持ちは拭えていないし、諦念半分といったところではあるのだけど、あまりの辛さから急に風呂場で瞑想をしたり、月曜日に絶望したりしていたら、急にタイトルのような心境になったので、忘れないようにこの文章を書いてる。

人生、諦観したところで動きを止めてくれるわけでもなく、流され続けるしかないので、結局流されるか自分の意志で進むしかないのだ。
どうせ進むなら自分の意志で進めたほうがいい。それで駄目だったとして、それはその時考えればいい話で、今考えることではないなってなった。

今の仕事は楽しいし、なるべくやっていきたいなと思っているけど、万が一このプロジェクトが失敗して評価・評判がボロクソになって居場所がなくなろうが、働ける企業が現職一つであるわけでもない。
それだったら成功したときのプラスを最大化出来るようにしたほうが、結果的に得だよねという結論にまで至ることで、どうにかメンタルを持ち直してきた。

万が一ここまで読んだ人がもしいたら私が4月を笑って迎えられるよう祈っていてください。


石風呂 / 壊れぬハートが欲しいのだ【OFFICIAL MUSIC VIDEO】

【雑記】Miband4(Miスマートバンド4)のススメ

昨年末にXiaomiが日本公式販売をスタートしてからにわかに話題となっているXiaomiのスマートバンドですが、実際購入してみて確かに満足度が高かったので改めておすすめしたいと思います。
f:id:beatdjam:20200126151314j:plain

なぜMiband4を購入したのか

昨年秋、知人がFitbit購入を期に生活のトラッキングなどを始めているのを見ました。元々あまり睡眠週間が良くなかったために改善のための何かを探していたのですが、Fitbitはお試しで購入してみるには高く…。実売価格で 4000円弱 だったMiband4を購入しました。

その時はまだ日本公式販売ではなかったので、ほんとに大丈夫かな…と若干不安だったんですが、現在はXiaomiが国内公式販売を始めたのでより手に入れやすくなっていますし安心ですね。
(※余談ですが、なぜかこのタイミングで国内向けの製品名がMiスマートバンド4になりました。謎)

Miband4でできること

じゃあ具体的に何ができるんだというと、下記のような事ができます。

* 各種運動の消費カロリーなどのモニタリングと記録
* 歩数計(万歩計)
* スリープモニター(眠りの質をチェックする)
* 心拍数のモニタリング
* スマートホンからの通知を受ける
* 座りすぎ通知
など…

モニタリングされた情報はXiaomi公式が出している MiFit というアプリで確認できます。

さらに、Androidしか確認していないんですが、サードパーティの睡眠トラッキングアプリと連携して睡眠の浅い時間にアラームを鳴らしたりもできます。
ちょっと古い記事ですが、連携はこちらを参考にしました。
まだアラーム音で朝起きてるの? Sleep as Android×スマートウォッチでスマートに目覚めよう | あすへん! 〜薙月の明日への変化〜

また、一つ特徴的な点として、 Xiaomiが出しているアプリ以外にも、このスマートバンドと連携できるサードパーティ製のアプリが多数リリースされている点があります。
公式のアプリよりも運動などのデータが見やすいものや、ショートカット用のジェスチャーを追加するもの、より細かい通知の制御を提供するもの等様々あるので、こちらを色々探してみるのも良いかもしれないです。
個人的に利用しているのは Tools & Miband というアプリです。Notify & Fitness for Mi Band というアプリも有名みたいですね。

買ってよかったこと

実際にどういった点で満足しているのかというと…

* 防水のためほぼずっとつけっぱなしでいられる
* バンド含めて22g(実測値)なので軽い
* 安いのである程度雑に扱っても罪悪感がない
* 電池持ちがめちゃくちゃ良い
* 最も電力消費する設定にしてもでもフル充電から10日程度は充電が不要
* 歩数・心拍数等がGoogleFit・iOSのヘルスケアにも連携可能

などです。

睡眠時間や運動のログが勝手に残るので、見る習慣をつけるだけで生活習慣の振り返りなどが行えるようになりました。また、生活を振り返る事が習慣化することで、生活の質を上げよう心理が働いてサイクルが回っているような気がします。

あと単純に、スマホを出さなくても通知が確認できるというのは思った以上に便利でした。朝家を出る時間に天気予報の通知が飛ぶように設定しておいたり、Google Calendarの通知を飛ばすようにしてミーティング忘れを防いだり…。

おわりに

  • 安くて多機能なウェアラブルデバイスでエントリーモデルとして最適
  • 腕時計使いたいけど、重さが気になる人にもおすすめ

実は私は合わせてXiaomiの体組成計も買いました。
先述したMiFitに接続することで、こちらもボディスコアなどを勝手に記録してくれるのでとても便利なのでこちらもおすすめです。