1. 開発プロセス
採用する開発プロセスを決定する。
日付: 2024-11-13
ステータス
2024-11-13 提案されました
コンテキスト
mindmap
root((開発プロセス))
SCRUM
原則
経験プロセスを管理する
自己組織化する
コラボレーションする
価値観に基づいて優先順位を付ける
時間を区切る
反復的に開発する
価値基準
確約
勇気
集中
公開
尊敬
プロセス
バックログを整理する
スプリント計画セッションを開く
スクラムスプリントを開始する
デイリースクラムを開く
スプリントレビューを開く
スプリントレトロスペクティブを開く
役割
スクラムマスター
プロダクトオーナー
開発チーム
アーティファクト
プロダクトバックログ
スプリントバックログ
製品インクリメント
XP
5つの価値
シンプルさ
コミュニケーション
フィードバック
勇気
尊重
5つのルール
計画
管理
設計
コーディング
テスト
12のプラクティス
計画ゲーム
顧客テスト
小規模リリース
シンプルな設計
ペアプログラミング
テスト駆動開発
リファクタリング
集団所有権
継続的インテグレーション
持続可能なペース
メタファー
コーディング規約
アジャイル開発の中で、SCRUMとXPが有名である。SCRUMは経験プロセスを管理することを重視し、XPはプラクティスを重視する。どちらもアジャイル開発の価値観を共有している。 今回は、どちらか一方を採用するか、または両方を組み合わせるかを決定する。
決定
XPを採用する、理由は以下の通り。
- 今回の開発はチームでなく個人で行うため、XPのプラクティスを実践することで、開発プロセスを改善することができる。
- SCRUMに比べて開発プロセスがシンプルであるため、適応コストが低い。
開発プロセスは以下の通り。
---
title: XP開発プロセス
---
stateDiagram-v2
[*] --> リリース計画
リリース計画 --> イテレーション計画
イテレーション計画 --> コーディングとテスト
コーディングとテスト --> イテレーションレビュー
イテレーションレビュー --> [*]
イテレーションレビュー --> イテレーション計画
影響
ポジティブ:
- 開発者はXPのプラクティスを実践することで、開発プロセスを改善することができる。
ネガティブ:
- 従来の開発プロセスとの違いによる適応コストが発生する可能性がある。
コプライアンス
各テーマは個別に検討する。
- 計画ゲーム
- 顧客テスト
- 小規模リリース
- シンプルな設計
- ペアプログラミング
- テスト駆動開発
- リファクタリング
- 集団所有権
- 継続的インテグレーション
- 持続可能なペース
- メタファー
- コーディング規約
備考
- 著者: k2works
- バージョン: 0.1
- 変更ログ:
- 0.1: 初回提案バージョン
2. シンプルな設計
設計アプローチに関して決定する
日付: 2024-11-14
ステータス
2024-11-14 提案されました
コンテキスト
mindmap
root((設計))
ユースケース
ドメインモデル
データモデル
ユーザーインターフェース
ビュー
モデル
インタラクション
アプリケーションを構成する設計要素に以下のものが含まれる。
- ユースケース
- ドメインモデル
- データモデル
- ユーザーインターフェース
決定
以下の設計プロセスを採用する。
---
title: 設計プロセス
---
stateDiagram-v2
[*] --> ユースケース作成
ユースケース作成 --> データモデル設計
データモデル設計 --> ドメインモデル設計
ドメインモデル設計 --> コーディングとテスト
コーディングとテスト --> リファクタリング
コーディングとテスト --> ユーザーインターフェース設計
ユーザーインターフェース設計 --> コーディングとテスト
コーディングとテスト --> リファクタリング
リファクタリング --> [*]
リファクタリング --> ユースケース作成
影響
ポジティブ
- 設計プロセスが明確になる
ネガティブ
- 開発者により設計に関する考えが異なるため、設計プロセスが適用されない可能性がある
コプライアンス
開発支援ツールを使用して設計プロセスを実行する
備考
- 著者: k2works
- バージョン: 0.1
- 変更ログ:
- 0.1: 初回提案バージョン
3. テスト駆動開発
テスト駆動開発の進め方についての決定
日付: 2024-11-14
ステータス
2024-11-14 提案されました
コンテキスト
mindmap
root((テスト駆動開発))
TODOリスト
テストファースト
仮実装
三角測量
リファクタリング
テスト
単体テスト
統合テスト
受け入れテスト
%%{init: {'theme': 'base', 'themeVariables': { 'pie1': '#ffcc00', 'pie2': '#ff9900', 'pie3': '#ff6600' }}}%%
pie
title テスティングピラミッド
"単体テスト" : 70
"統合テスト" : 20
"E2Eテスト" : 10
ここで対象となるテストは単体テストである。
決定
コーディングとテストにおいていはテスト駆動開発の採用する。 理由は、設計のスピードアップと高品質なコードが期待できるから。
stateDiagram-v2
[*] --> TODO: TDOリストを作成
TODO --> Red: テストを書く
Red --> Green: 最小限の実装
Green --> Refactor: リファクタリング
Refactor --> Red: 次のテストを書く
Red: テストに失敗
Green: テストに通る最小限の実装
Refactor: コードの重複を除去してリファクタリング
Refactor --> TODO: リファクタリングが完了したらTODOリストに戻る
影響
ポジティブ
- コードの品質が向上する
- 設計のスピードアップが期待できる
ネガティブ
- 従来の開発プロセスとの違いによる適応コストが発生する可能性がある
コプライアンス
CI/CDと組み合わせて実施する。
備考
- 著者: k2works
- バージョン: 0.1
- 変更ログ:
- 0.1: 初回提案バージョン
4. リファクタリング
リファクタリングの方針を決定する。
日付: 2024-11-14
ステータス
2024-11-14 提案されました
コンテキスト
mindmap
root(リファクタリング)
抽出
メソッドの抽出
変数の抽出
クラスの抽出
インターフェースの抽出
インライン
メソッドのインライン化
変数のインライン化
移動
メソッドの移動
フィールドの移動
リネーム
メソッド名の変更
変数名の変更
クラス名の変更
メソッドシグネチャの変更
パラメータの追加
パラメータの削除
パラメータの並び替え
一時変数を問い合わせに置き換え
パラメータオブジェクトの導入
継承を委譲に置き換え
フィールドのカプセル化
条件文の分解
メソッド呼び出しの簡素化
決定
リファクタリングはカタログの語彙を使って意図を明確にする。
影響
ポジティブ
- コードの品質が向上する
- メンテナンス性が向上する
ネガティブ
- 前提としてリファクタリングの書籍を読む必要がある
コプライアンス
Gitのコミットメッセージにリファクタリングのカタログの語彙を使う。
備考
- 著者: k2works
- バージョン: 0.1
- 変更ログ:
- 0.1: 初回提案バージョン
5. 継続的インテグレーション
継続的インテグレーションを導入する。
日付: 2024-11-14
ステータス
2024-11-14 提案されました
コンテキスト
%%{init: {'theme': 'base', 'themeVariables': { 'pie1': '#ffcc00', 'pie2': '#ff9900', 'pie3': '#ff6600' }}}%%
graph LR
subgraph GitHub
subgraph Repository
Git
end
subgraph Continuous_Integration
GitHub_Actions
end
end
subgraph Vercel
subgraph Production_Environment_Vercel
UI
end
end
subgraph Heroku
subgraph Production_Environment_Heroku
API
DB
end
end
開発者 --> Git
Git --> API & UI
API --> DB
API -->|データのやり取り| UI
Git --> GitHub_Actions
利用者 --> UI
決定
継続的インテグレーションを導入する。理由は以下の通り。
- プロジェクトの品質を保つことができる
- プロジェクトのリスクを軽減できる
- プロジェクトの信頼性を向上できる
影響
ポジティブ:
- プロジェクトの品質を保つことができる
ネガティブ:
- 構築の時間がかかる
コプライアンス
GitHub Actionsを使用する。
備考
- 著者: k2works
- バージョン: 0.1
- 変更ログ:
- 0.1: 初回提案バージョン
6. アプリケーションアーキーテクチャ
アプリケーションアーキテクチャについての決定を記述します。
日付: 2024-11-14
ステータス
2024-11-14 提案されました
コンテキスト
classDiagram
class データベース
class プレゼンテーション層 {
Controller
}
class サービス層 {
Service
}
class インフラストラクチャ層 {
DataSource
}
class ドメイン層 {
Model
}
プレゼンテーション層 --> サービス層
サービス層 --> インフラストラクチャ層
サービス層 --> ドメイン層
インフラストラクチャ層 --> データベース
決定
アーキテクチャスタイルは、レイヤードアーキテクチャを採用。 ドメイン層のアーキテクチャパターンはドメインモデルパターンを採用。
理由は、ドメインモデルパターンは、ビジネスロジックをドメインモデルに集約することで、ビジネスロジックの再利用性を高めることができるため。
影響
ポジティブ:
- 複雑なビジネスロジックをドメインモデルに集約することで、ビジネスロジックの再利用性を高めることができる
ネガティブ:
- ドメインモデルパターンを理解するための学習コストがかかる
コプライアンス
ArchUnitを使用して、アーキテクチャのコンプライアンスを確認する。
備考
- 著者: k2works
- バージョン: 0.1
- 変更ログ:
- 0.1: 初回提案バージョン
7. プロジェクト構成
プロジェクトの構成についての決定
日付: 2024-11-25
ステータス
2024-11-25 提案されました
コンテキスト
単一のレポジトリで複数のアプリケーションを開発している。
graph TD
subgraph プロジェクト
subgraph バックエンド
販売管理サービス
end
subgraph フロントエンド
販売管理アプリケーション
end
end
また、ドキュメントや構築・運用コードも同じレポジトリで管理している。
graph TD
subgraph プロジェクト
subgraph ドキュメント
ADR
セットアップガイド
業務分析
アプリケーション仕様
end
subgraph 構築運用コード
Dockerfile
Gulpfile
DBSchema
end
end
決定
以下のディレクトリ構成を採用する。
- ルート
- app
- backend
- frontend
- db
- docs
- ops
- app
- appディレクトリには、バックエンドとフロントエンドのアプリケーションが配置される。
- dbディレクトリには、データベースのスキーマが配置される。
- docsディレクトリには、ドキュメントが配置される。
- opsディレクトリには、構築・運用コードが配置される。
影響
ポジティブ:
- 将来マイクロサービスアーキテクチャ採用において、アプリケーションを分割することができる
ネガティブ:
- プロジェクトの構成が複雑になる
コプライアンス
gulpのdevタスクで一連のビルドを実行する。
備考
- 著者: k2works
- バージョン: 0.1
- 変更ログ:
- 0.1: 初回提案バージョン
7. プロジェクト構成
プロジェクトの構成についての決定
日付: 2024-11-25
ステータス
2024-11-25 提案されました
コンテキスト
単一のレポジトリで複数のアプリケーションを開発している。
graph TD
subgraph プロジェクト
subgraph バックエンド
販売管理サービス
end
subgraph フロントエンド
販売管理アプリケーション
end
end
また、ドキュメントや構築・運用コードも同じレポジトリで管理している。
graph TD
subgraph プロジェクト
subgraph ドキュメント
ADR
セットアップガイド
業務分析
アプリケーション仕様
end
subgraph 構築運用コード
Dockerfile
Gulpfile
DBSchema
end
end
決定
以下のディレクトリ構成を採用する。
- ルート
- app
- backend
- frontend
- db
- docs
- ops
- app
- appディレクトリには、バックエンドとフロントエンドのアプリケーションが配置される。
- dbディレクトリには、データベースのスキーマが配置される。
- docsディレクトリには、ドキュメントが配置される。
- opsディレクトリには、構築・運用コードが配置される。
影響
ポジティブ:
- 将来マイクロサービスアーキテクチャ採用において、アプリケーションを分割することができる
ネガティブ:
- プロジェクトの構成が複雑になる
コプライアンス
gulpのdevタスクで一連のビルドを実行する。
備考
- 著者: k2works
- バージョン: 0.1
- 変更ログ:
- 0.1: 初回提案バージョン
8. 排他制御
データベースの排他制御についての方針を決定する。
日付: 2024-12-05
ステータス
2024-12-05 提案されました
コンテキスト
MyBatisを使用した排他制御には、以下の方法がある。
行ロック
メリット:
- データベースが提供するネイティブなロック機能を活用でき、直感的で実装が簡単。
- ロック中のデータにアクセスしようとする他のトランザクションを自動的に待機させることができる。
デメリット:
- データベースへのロックを取得するために、処理のパフォーマンスが低下する場合がある。
- 高い排他制御が要求されるため、スケーラビリティの面での制約がある。
悲観ロック
メリット:
- データ競合を事前に防ぐため、データの整合性を非常に高いレベルで維持できる。
- データに対する独占的なアクセスを保証。
デメリット:
- 長期間のロックはデッドロックを引き起こしやすく、システムのスループットを低下させる可能性がある。
- ロックの実装と管理が複雑になることがある。
楽観ロック
メリット:
- 実際のロックを避けるため、並列処理のパフォーマンスが向上。
- 競合が発生した場合にのみ回避策を取るため、スケーラビリティに優れている。
デメリット:
- データ更新時に競合が発生すると、そのトランザクションを再試行する必要があり、これが頻発するとパフォーマンスに影響を与える可能性がある。
- 競合を検出するために追加のデータ管理(バージョン番号やタイムスタンプ)が必要。
決定
スケーラビリティを考慮し、楽観ロックを採用する。
楽観ロック対象は、集約ルートエンティティとする。
影響
ポジティブ:
- 将来マイクロサービスアーキテクチャ採用において、スケーラビリティを確保できる
ネガティブ:
- 既存データベースに楽観ロックを導入するための変更が必要
コプライアンス
単体テストを実施し、楽観ロックが正しく機能することを確認する。
単体テストには、Testcontainersを使用する。
備考
- 著者: k2works
- バージョン: 0.1
- 変更ログ:
- 0.1: 初回提案バージョン
9. E2Eテスト
E2Eテストを導入する。
日付: 2024-12-20
ステータス
2024-12-20 提案されました
コンテキスト
バックエンド、フロントエンドの変更時の影響範囲を確認するために、E2Eテストを導入する。
決定
E2Eテストには、Cypressを採用する。
影響
ポジティブ:
- フロントエンドのリファクタリングが進めやすくなる
ネガティブ:
- E2Eテストツールの仕様による制約がある
- Cypressではタブの操作ができないため、タブの操作が必要な場合は回避方法を検討する
コプライアンス
CI/CDパイプラインにE2Eテストを組み込み、自動化する。
e2e:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK
uses: actions/setup-java@v3
with:
java-version: '21'
distribution: 'temurin'
- name: Grant execute permission for Gradle wrapper
run: chmod +x ./gradlew
working-directory: app/backend/api
- name: Build with Gradle in api directory
run: ./gradlew build -x test
working-directory: app/backend/api
- name: Run with Gradle in api directory
run: ./gradlew bootRun &
working-directory: app/backend/api
- name: Use Node.js latest
uses: actions/setup-node@v3
with:
node-version: latest
cache: 'npm'
- run: npm ci
working-directory: app/frontend
- name: Cypress run
uses: cypress-io/github-action@v5
with:
build: npm run build
start: npm run dev
wait-on: "http://localhost:5173"
working-directory: app/frontend
タブを使うユーザーインターフェース部分は開発環境のみメニュー表示を環境変数で切り替えるなどの対応を行う。
<li className="nav-item">
マスタ
<ul className="nav-sub-list">
<SubNavItem id="side-nav-department-nav" to="/department">部門</SubNavItem>
<SubNavItem id="side-nav-employee-nav" to="/employee">社員</SubNavItem>
<SubNavItem id="side-nav-product-nav" to="/product">商品</SubNavItem>
{ !Env.isProduction() && (
<ul className="nav-sub-list">
<SubNavItem id="side-nav-product-nav" to="/product-category">分類</SubNavItem>
<SubNavItem id="side-nav-product-nav" to="/product-detail">詳細</SubNavItem>
</ul>
)}
</ul>
</li>
備考
- 著者: k2works
- バージョン: 0.1
- 変更ログ:
- 0.1: 初回提案バージョン