【WIP】これまで関わったDDDについて振り返る
この記事はITC Advent Calendar(2) 16日目の記事です
はじめに
2017年5月当時にアルバイトしていた会社で、初めて新規案件をDDDを用いて上司と共に設計とPHPでの開発を行い、
それがきっかけでPHPでDDDで社内システムを開発している葬儀系ベンチャーに内定&現在進行系でインターンでそのシステムを開発中、
また、学校で行っているチーム開発でもDDDを用いて開発しているので、DDDの本質というより、各々のプロジェクトで行われているDDDで良かった点など書いていきたいと思います。
①アルバイト・初めてのDDDと社内システム
プロジェクト仕様
- Laravel 5.4
- PHP 7.0
- 開発期間 2017年5月〜2017年9月
- 某受託メインのIT企業の社内システムの設計と開発
- 社内でしか使われない、業務で使っているあるものを管理するシステム
2017年5月頃に当時の上司から社内システムを新規で開発したいという事で、上司をドメインエキスパートとして設計段階から取り掛かることになりました。
ユビキタス言語などの洗い出しやドメインモデル図作成から始まりましたが、
初めて知ったDDD自体を勉強しながら、更に0ベースからの開発だったため、何度も上司と打ち合わせを重ねてドメインを洗練された形へ何度も変更させつつ設計していきました。
上司の方はDDDのプロフェッショナルではないものの、何度かDDDの開発経験があったため過去の実装方法などを元に、Laravel且つPHPで実装する場合について煮詰めながらコーディングへと進みました。
このプロジェクトでのEntityは、LaravelのEloquentでsaveされた時に付与されるサロゲートキーをEntityのIDとして使うため、
OnMemory上で作成した段階ではIDが存在せず、Repositoryでsaveした時に永続化した上でIdが付与されるという実装方法を取っていました。
(EntityはOnMemory上でも一意でいなければ行けないので、実際はよろしくない設計らしい)
②学校・チーム開発でのWebサービス
プロジェクト仕様
- Laravel 5.4
- PHP 7.0
- 開発期間 2017年8月〜2018年2月終了予定
- 学校の作品展を目指して作成している
- チーム内にDDD経験者は2名(自分を含めて) 全員で勉強しながら進める予定
- 現在(2017/12/16時点)も開発中(やること山積み)
私の学校では2年生から、後期授業でチームで開発をする授業が始まります。(システム開発演習)
今回の開発では長期開発や継続で運営するようなものを作るわけではないものの、チームのリーダーもアルバイトでDDDをやった経験があり挑戦してみたいと言っていました。
また、自分としても更にDDDを勉強していきたいと思っていたので、学生最後となる今回のチーム開発でDDDに挑戦することとなりました。
③内定インターン・新社内向けWebシステム
プロジェクト仕様
- Silex
- PHP 7.0以上
- Vue.js + Vuex
- 開発期間(Join) 2017年9月〜2018年3月終了予定?
- 自社サービスの社内向けWebシステムのリニューアル
- 現在(2017/12/16時点)も開発中(新機能追加と機能修正)
2017年7月15日に行われたPHPカンファレンスの懇親会にて、偶然近くにいたエンジニアの方とお話することとなり、その方の会社でもDDDでPHPを使って開発しているとのことで意気投合しました。
その際に就職についてもお声をかけて頂き、その後なんやかんやでその会社に内定を頂いて現在インターンとして、そのDDDのプロジェクトにJoinして働かせて頂いています。
その結果初めて実際の業務で使われ続けるために開発されているDDDのプロジェクトを見たので、テンションが上がりました。
大きく違う点としては、システムの規模がやはりとても大きいことと、フォルダ分け含め共通部分などが非常に細分化やコンポーネント化されていて、ぱっと見ややこしいものの一度理解すれば更新や修正などが楽なようにできていて、流石だなぁと感じました。
一般的?にDDDのプロジェクトのディレクトリ構造的としては、レイヤードアーキテクチャとしてよく言われている以下のタイプがあります。
- プレゼンテーション層
- アプリケーション層
- ドメイン層
- インフラストラクチャー層
そして、このプロジェクトでも名前が少し違うもののやはり、大まかには同じようなディレクトリ構造となっていました。
詳しい内容などまた気が向いた時にかきます。