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 提案されました
コンテキスト
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: 初回提案バージョン
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: 初回提案バージョン
10. 安全なソフトウェア設計
安全なソフトウェア開発を行うために、以下の方針を採用する。
日付: 2025-02-13
ステータス
2025-02-13 提案されました
コンテキスト
mindmap
root((安全なソフトウェア設計))
安全性を確立する実装テクニック
不変性
速やかな失敗
メソッドの引数に対する事前条件の確認
コンストラクタでの不変条件の確認
オブジェクトの状態の確認と速やかな失敗
妥当性確認
オリジンの確認
データ・サイズの確認
字句的内容の確認
構文の確認
データに対する意味の確認
安全性を考えた例外失敗時の対策
例外
チェックされる例外
実行時例外
エラー
処理が失敗したときの対応に使われる例外
例外のスロー
ビジネス例外
技術的例外
例外処理
例外に含ませる情報の扱い
例外を使わない処理失敗時の対応
失敗は例外ではない
処理の失敗を想定できるものとした設計
設計をより安全なものにする単体テスト
ドメインルール
正常値テスト
境界値テスト
異常値テスト
極端値テスト
決定
- 不変性を実現するために、エンティティ、値オブジェクトにはlombokの
@Value
アノテーションを使用する。 - 事前条件、不変条件、妥当性確認にはApache Commons Langの
Validate
クラスを使用する。 - すべてのpublicメソッドに対して事前条件を確認するようにする。少なくとも、引数の値がnullでないことを確認する。
- エンティティ、値オブジェクトのコンストラクタでの不変条件条件の確認は、コンストラクタ内で行い、契約に従っていないデータが送られてきた場合は、速やかに失敗するようにする。
- 妥当性確認は単体テストで行い、正常値テスト、境界値テスト、異常値テスト、極端値テストを実施する。
- 例外処理はビジネス例外と技術的例外に分け、ビジネス例外は
BusinessException
、技術的例外はTechnicalException
を使用する。 - 事前条件、不変条件、妥当性確認に失敗した場合は、
IllegalArgumentException
をスローする。
影響
ポジティブ:
- 安全性向上: 不変性の確保と事前条件の確認により、システムが予測不能な状態に陥る可能性が低下します。
- コードの信頼性強化: 明確な妥当性確認と速やかな失敗により、エラーの検知と解決が迅速に行われます。
- メンテナンス性向上: 一貫した設計原則(例:
@Value
アノテーションやValidate
クラスの使用)により、コードが読みやすくなり、将来的なアップデートが容易になります。 - テスト精度向上: 単体テストで多角的な検証(正常値、境界値、異常値、極端値)が行われることで、バグが早期に発見されます。
- 例外情報の明確化: 例外に含める情報を明示的にすることにより、デバッグが効率的になります。
- 責任の分離: ビジネス例外と技術的例外を分ける設計が整備されることで、問題の原因の分類と修正が素早く行えます。
ネガティブ:
- 開発コストの増加: 新たに導入される設計・開発ルールに対応するために、開発者へのトレーニング時間や学習コストが発生します。
- コード量の増加: 不変性確認や妥当性確認のためのコードが増えるため、開発の手間が増加します。
- パフォーマンスへの影響: 実行時における妥当性確認や事前条件確認の処理が増えるため、システム全体のパフォーマンスに影響を及ぼす可能性があります。
- 複雑性の増加: 設計の安全性を高めるための例外管理やルール定義が複雑になるため、新規開発者にとって参入障壁が高くなる可能性があります。
コプライアンス
CIでの自動化により、コードの品質を保つ。
備考
- 著者: k2works
- バージョン: 0.1
- 変更ログ:
- 0.1: 初回提案バージョン
11. プレゼントテーション層DTO
プレゼントテーションとフロントエンドの間でデータのやり取りを行うためのDTOを定義する。
日付: 2025-03-10
ステータス
2025-03-10 提案されました
コンテキスト
現在、フロントエンドとのやりとりで取得時と登録時で異なるデータ定義をしている。
例:部門マスタ
取得用データ定義
export type DepartmentIdType = {
deptCode: { value: string };
departmentStartDate: { value: string };
}
export type DepartmentType = {
departmentId: DepartmentIdType;
endDate: { value: string }
departmentName: string;
layer: number;
path: { value: string };
lowerType: LowerType;
slitYn: SlitYnType;
employees: EmployeeType[];
checked: boolean;
}
APIのドメインモデルをそのままDTOとして使用している
public class Department {
public static final String TERMINAL_CODE = "99999";
DepartmentId departmentId; // 部門ID
DepartmentEndDate endDate; // 終了日
String departmentName; // 部門名
Integer layer; // 組織階層
DepartmentPath path; // 部門パス
DepartmentLowerType lowerType; // 最下層区分
SlitYnType slitYn; // 伝票入力可否
List<Employee> employees; // 社員
...
登録用データ定義
export type DepartmentResourceType = {
departmentCode: string;
startDate: string;
endDate: string;
departmentName: string;
layer: string;
path: string;
lowerType: string;
slitYn: string;
employees: EmployeeResourceType[];
}
APIのリソースと関連付けたDTOを定義している
@Setter
@Getter
@Schema(description = "部門")
public class DepartmentResource implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@NotNull
private String departmentCode;
@NotNull
private String startDate;
@NotNull
private String endDate;
private String departmentName;
private String layer;
private String path;
private DepartmentLowerType lowerType;
private SlitYnType slitYn;
private List<EmployeeResource> employees;
}
このような構成のため、フロントエンドとバックエンドの間でデータのやり取りが複雑になっている。
決定
両方ともAPIリソース定義に合わせたDTOを定義する。
影響
ポジティブ
1. フロントエンドとバックエンド間の統一性の向上
- APIリソース定義で統一したDTOを使用することで、データ構造が一貫し、開発者間のコミュニケーションコストが削減される。
- フロントエンドとバックエンドが同じモデルを参照することで、整合性を確保できる。
2. モデリングとバリデーションが簡素化
- 異なるデータ定義が統一されることにより、新たに複数のDTOを定義する必要がなくなり、メンテナンス性が向上する。
- バリデーションルールの一元化によって、ロジックの冗長性が削減される。
3. コードの保守性が向上
- 統一されたデータ定義により、コードがシンプルで理解しやすくなり、新たなセットアップやエラー解消がスムーズになる。
- 必要に応じて共通ライブラリを利用することで、簡略化と再利用が可能。
4. テストの効率化
- DTOが統一されることで、APIのテストケースを一本化することが可能になる。
- これにより、少ない工数で広範囲なテストを実現できる。
ネガティブ
1. 移行の手間が発生
- 現在、取得用・登録用と分かれているデータ定義をAPIリソース定義に統一する作業が必要となり、その移行コストが発生する。
2. 一部の柔軟性の喪失
- 現在の仕組みでは各用途に最適化されたデータモデルを使用できるが、統一されたデータモデルでは拡張性や柔軟性が制限される可能性がある。
3. バックエンドにおける影響範囲増加
- DTOを統一することで、バックエンド側のAPIロジックに影響をおよぼし、システム全体のコード修正が必要になる可能性がある。
4. 性能面の影響
- 統一されたデータ構造では、データサイズが増加する可能性があり、特にモバイル環境などでは通信コスト増加やパフォーマンス低下のリスクがある。
コプライアンス
1. 段階的移行
- 現行システムをすぐには廃止せず、新しいDTOモデルへ段階的に移行することで、作業負荷を分散する。
2. テストの拡充
- システム変更後の動作確認として、ユニットテストや統合テストを徹底して実施し、リスクを最小化する。
3. バックエンドに変換ヘルパーを導入
- フロントエンド用途や性能要件に応じたデータを生成するヘルパーレイヤーを導入することで、DTO統一による負担を軽減する。
備考
- 著者: k2works
- バージョン: 0.1
- 変更ログ:
- 0.1: 初回提案バージョン
12. フィーチャートグル
アプリケーションのフィーチャーを有効化/無効化するための機能を提供する。
日付: 2025-03-15
ステータス
2025-03-15 提案されました
コンテキスト
現在のアプリケーションは、リリース単位でプルリクエストをマージすることで新しい機能を追加しています。
graph TD
開発(開発中の新機能) --> PR1[プルリクエスト]
開発 --> PR2[プルリクエスト]
PR1 --> マージ[マスターブランチ]
PR2 --> マージ
マージ --> 本番リリース[本番環境リリース]
決定
フィーチャートグルを導入し、新しい機能を有効化/無効化するための機能を提供する。
graph TD
開発(開発中の新機能) --> フィーチャートグル
フィーチャートグル --> 開発ブランチ
開発ブランチ --> マージ[マスターブランチ]
マージ --> 本番リリース[本番環境リリース]
影響
ポジティブ
柔軟な機能管理
- フィーチャートグルを使用することで、リリース後に特定の機能をオン/オフに切り替えられるため、問題が発生した際には迅速に無効化が可能。
- 大規模な変更を段階的に展開することができ、リスクを分散させる。
テスト戦略の改善
- 開発中の機能を本番環境で特定のユーザーにのみ提供することが可能になり、早期のフィードバックを得られる。
リリースプロセスの効率化
- PR(プルリクエスト)をマスターブランチにマージしつつ、機能有効化のタイミングを調整可能。
デプロイとリリースの分離
- コードのデプロイと機能の提供を分離することで、デプロイ時の影響を軽減しやすい。
ビジネスのアジリティ向上
- 新しい機能の市場投入までの時間を短縮できる。ビジネス要件に応じてオンデマンドで機能を展開可能。
ネガティブ
コードベースの複雑化
- フィーチャートグルにより、コード内に分岐や条件式が増え、メンテナンスの負担が増加。
技術的負債のリスク
- 長期間無効化された機能がコードベースに残った場合、技術的負債として作用し、後のトラブルにつながる可能性がある。
監視と管理のコスト増
- フィーチャートグル状態の監視や管理に追加のリソースやコストが必要。
テストの複雑化
- 機能の組み合わせごとにテストが必要になり、テストケースの増加を招く。
スケーリングに伴う課題
- 多数のフィーチャートグルを導入した場合、状態管理や整合性の維持が難しくなる。
コプライアンス
- 監査可能なログ:フィーチャートグルの状態変更について、いつ、誰が操作したかを記録。
- 運用ルールの制定:トグル利用期間や削除のタイミング、運用基準を明確に定める。
- 管理ツールの導入:LaunchDarkly、Togglzなどのフィーチャートグル管理ツールを利用。
備考
- 著者: k2works
- バージョン: 0.1
- 変更ログ:
- 0.1: 初回提案バージョン
12. フィーチャートグル
アプリケーションのフィーチャーを有効化/無効化するための機能を提供する。
日付: 2025-03-15
ステータス
2025-03-15 提案されました
コンテキスト
現在のアプリケーションは、リリース単位でプルリクエストをマージすることで新しい機能を追加しています。
graph TD
開発(開発中の新機能) --> PR1[プルリクエスト]
開発 --> PR2[プルリクエスト]
PR1 --> マージ[マスターブランチ]
PR2 --> マージ
マージ --> 本番リリース[本番環境リリース]
決定
フィーチャートグルを導入し、新しい機能を有効化/無効化するための機能を提供する。
graph TD
開発(開発中の新機能) --> フィーチャートグル
フィーチャートグル --> 開発ブランチ
開発ブランチ --> マージ[マスターブランチ]
マージ --> 本番リリース[本番環境リリース]
影響
ポジティブ
柔軟な機能管理
- フィーチャートグルを使用することで、リリース後に特定の機能をオン/オフに切り替えられるため、問題が発生した際には迅速に無効化が可能。
- 大規模な変更を段階的に展開することができ、リスクを分散させる。
テスト戦略の改善
- 開発中の機能を本番環境で特定のユーザーにのみ提供することが可能になり、早期のフィードバックを得られる。
リリースプロセスの効率化
- PR(プルリクエスト)をマスターブランチにマージしつつ、機能有効化のタイミングを調整可能。
デプロイとリリースの分離
- コードのデプロイと機能の提供を分離することで、デプロイ時の影響を軽減しやすい。
ビジネスのアジリティ向上
- 新しい機能の市場投入までの時間を短縮できる。ビジネス要件に応じてオンデマンドで機能を展開可能。
ネガティブ
コードベースの複雑化
- フィーチャートグルにより、コード内に分岐や条件式が増え、メンテナンスの負担が増加。
技術的負債のリスク
- 長期間無効化された機能がコードベースに残った場合、技術的負債として作用し、後のトラブルにつながる可能性がある。
監視と管理のコスト増
- フィーチャートグル状態の監視や管理に追加のリソースやコストが必要。
テストの複雑化
- 機能の組み合わせごとにテストが必要になり、テストケースの増加を招く。
スケーリングに伴う課題
- 多数のフィーチャートグルを導入した場合、状態管理や整合性の維持が難しくなる。
コプライアンス
- 監査可能なログ:フィーチャートグルの状態変更について、いつ、誰が操作したかを記録。
- 運用ルールの制定:トグル利用期間や削除のタイミング、運用基準を明確に定める。
- 管理ツールの導入:LaunchDarkly、Togglzなどのフィーチャートグル管理ツールを利用。
備考
- 著者: k2works
- バージョン: 0.1
- 変更ログ:
- 0.1: 初回提案バージョン