概要

本稿は、システムの安定稼働を支える「バッチ処理設計書」の包括的なガイドです。設計書の目的と位置づけを明らかにし、概要、処理フロー、入出力、処理ロジック、異常系、非機能要件といった必須の構成要素を詳述。
特に、Mermaidを用いた具体的なフロー図のサンプルを3種類提示し、視覚的でメンテナンス性の高いドキュメント作成のポイントを解説します。開発から運用・保守までを見据えた、実践的な設計手法を学びます。
-
【設計シリーズ】システム開発でよく使う設計書 TOP20
システム開発の現場で必須となる設計書をTOP20ランキングでご紹介。開発の起点となる要件定義書から、品質保証のためのテスト仕様書、円滑な運用を支えるマニュアルまで。各ドキュメントの役割と重要性を簡潔に解説し、プロジェクト全体の流れを可視化します。エンジニアやPM必携の知識です。
続きを見る
目次
はじめに
今日の多くの情報システムにおいて、バッチ処理は依然として不可欠な役割を担っています。日々のトランザクションデータを集計・分析する夜間バッチ、月末に請求データを作成する月次バッチ、外部システムとデータを同期する連携バッチなど、その用途は多岐にわたります。これらのバッチ処理は、システムの裏側で黙々と動作し、ビジネスの根幹を支える重要なデータを生成・加工しています。
オンライン処理がユーザーの操作に応じてリアルタイムに応答するのに対し、バッチ処理は「決められた時間に」「まとまったデータを」「一括で」処理するという特性を持ちます。この特性ゆえに、その設計にはオンライン処理とは異なる特有の観点、すなわち大量データ処理の性能、エラー発生時の堅牢な復旧手順、そして運用を見据えた自動化などが求められます。
この重要なバッチ処理の仕様を定義し、関係者間の認識を統一するための羅針盤となるのが「バッチ処理設計書」です。質の高いバッチ処理設計書は、開発の効率化、テストの網羅性向上、そして将来の安定運用と保守性の確保に直結します。逆に、設計書が曖昧であったり、考慮漏れがあったりすると、開発の手戻りはもちろん、本番稼働後に深刻なシステム障害を引き起こす原因ともなりかねません。
本稿では、【設計シリーズ】の第14弾として、このバッチ処理設計書に焦点を当てます。まず、設計書の目的と構成要素を明らかにし、各項目で何をどのように記述すべきかを具体的に解説します。特に、処理の流れを視覚的に表現する手段として、テキストベースでバージョン管理も容易な Mermaid を用いたサンプル構成図を複数提示し、その活用法を探ります。本稿が、これからバッチ処理の設計に携わる方、あるいは既存の設計書の品質向上を目指す方にとって、実践的な手引きとなることを目指します。
バッチ処理設計書とは
定義と目的
バッチ処理設計書とは、特定のトリガー(スケジュール、イベント、手動実行など)に基づいて、まとまった量のデータ(ファイル、データベースレコードなど)を一括で処理するためのプログラム(バッチ処理)の仕様を詳細に定義した技術ドキュメントです。
この設計書の主な目的は、単にプログラムのロジックを記述することに留まりません。以下の多岐にわたる目的を達成するために作成されます。
- 開発者への明確な指示: 設計書は、実装を担当する開発者(プログラマー)にとっての「設計図」です。処理の開始から終了までの流れ、データの入出力形式、ビジネスロジック、異常系の挙動など、実装に必要な情報を過不足なく提供し、開発者の解釈によるブレを防ぎます。
- 関係者間の合意形成: バッチ処理は、ビジネス部門、システム企画部門、開発部門、運用部門など、多くのステークホルダーが関わります。設計書は、これらの関係者が「どのような処理が」「いつ」「どのように行われるのか」を共通の理解のもとで合意するための基盤となります。
- テストのインプット: テスト担当者は、設計書を基にテストケースを作成します。正常系の処理はもちろん、想定される異常系の処理や境界値など、どのような観点でテストを行うべきかのインプット情報となります。詳細な設計書は、テストの網羅性を高め、品質向上に貢献します。
- 運用・保守フェーズの引き継ぎ: 完成したバッチ処理は、運用チームに引き継がれます。運用担当者は、設計書を参照して日々の監視、障害発生時の一次対応、定期メンテナンスなどを行います。特に、エラー発生時の原因調査や復旧手順は、運用において極めて重要な情報です。
- 将来の保守・改修時の参照資料: システムは一度作ったら終わりではありません。法改正やビジネス要件の変更に伴い、将来的にバッチ処理を改修する必要が生じます。その際、担当者が変わっていても、設計書があれば処理内容を正確に理解し、影響範囲を特定した上で、安全かつ効率的に改修作業を進めることができます。
設計書の位置づけ
バッチ処理設計書は、システム開発のV字モデルにおいて、**詳細設計(DD: Detailed Design)**フェーズで作成される成果物の一つです。要件定義で決定されたビジネス要件や、基本設計(BD: Basic Design)で定められたシステム方式・機能概要を、より具体的に、実装可能なレベルまでブレークダウンした内容を記述します。
この設計書がなければ、開発者は曖昧な情報をもとに実装を進めることになり、結果として要件を満たさないプログラムが完成したり、後工程で多くの手戻りが発生したりするリスクが高まります。堅牢で信頼性の高いバッチ処理を実現するための、まさに要となるドキュメントなのです。
バッチ処理設計書の構成要素
優れたバッチ処理設計書は、必要な情報が構造化され、網羅的に記述されています。ここでは、一般的によく用いられる構成要素について、何を記述すべきかを詳細に解説します。
概要
設計書の冒頭に位置し、そのバッチ処理が「何者」であるかを一目で理解できるようにするためのセクションです。
- バッチID: システム内で一意にバッチを識別するためのID。命名規則(例:
BAT-SL-D-001
- バッチ-売上-日次-001)を定めておくと管理が容易になります。 - バッチ名: 処理内容が具体的にわかる名称(例: 日次売上データ集計バッチ)。
- 処理目的・概要: このバッチが「なぜ存在するのか」「何をするのか」を簡潔に記述します。「各店舗POSから送信される売上実績ファイルを基に、全社の日次売上サマリテーブルを作成し、基幹システムに連携する」のように、背景と目的を明確にします。
- 起動方式: バッチがどのように起動されるかを明記します。
- スケジュール起動: ジョブ管理システム(JPS、Systemwalkerなど)により、毎日AM 2:00に自動実行される、など。
- イベントドリブン起動: 特定のファイルがFTPサーバーに置かれたことをトリガーに起動する、など。
- 手動起動: 運用担当者がコマンドラインから実行する、など。
- 実行頻度・スケジュール: 「日次(毎日)」「月次(毎月25日)」「随時」など、実行される頻度と具体的なタイミングを記述します。
- 想定実行時間・タイムアウト: 正常に処理が完了するまでのおおよ目の時間(例: 約15分)と、異常とみなして処理を強制終了させるタイムアウト時間(例: 60分)を定めます。これは、処理の無限ループやハングアップを検知するために重要です。
- 前提条件・制約事項: バッチ実行の前提となる条件(例: 「先行バッチ
BAT-XX-D-001
が正常終了していること」「入力ファイルがAM 1:30までに所定のディレクトリに配置されていること」)や、設計上の制約(例: 「サーバーのCPU使用率が80%を超えないこと」)などを記述します。
処理フロー
バッチ処理全体の流れを視覚的に表現する、設計書の中核となるセクションです。文章だけでは伝わりにくい複雑な処理シーケンスも、図を用いることで直感的な理解を助けます。ここでは、Mermaid を用いた表現を推奨します。Mermaidはテキストベースでフローチャートを記述できるため、Gitなどのバージョン管理システムとの相性が非常に良いというメリットがあります。
【Mermaidによる構成図のポイント】
- 処理の単位を明確にする: 一つの箱(ノード)が一つの処理ステップに対応するようにします。
- 正常系と異常系を表現する:
if-else
や条件分岐を用いて、正常時の流れだけでなく、エラーが発生した場合の分岐(ログ出力、通知、終了処理など)も明記します。 - 入出力を示す: ファイルやデータベースのアイコンを用いて、どこからデータを読み込み、どこへ書き出すのかを視覚的に示します。
- サブグラフでグループ化する: 関連する一連の処理をサブグラフで囲むことで、大きな処理の塊を分かりやすく表現できます。
後述の「4. サンプル構成図 (Mermaid) と解説」で具体的なコードと図を詳しく紹介します。
入出力詳細
処理フローで示された入出力(I/O)について、その詳細な仕様を定義します。
- 入力情報:
- ファイル:
- 論理名/物理名:
売上実績ファイル
/sales_yyyymmdd.csv
- フォーマット: CSV、固定長、JSON、XMLなど
- レイアウト: 各項目の桁数、データ型、説明などを表形式で記述します。
- 文字コード:
UTF-8
、Shift_JIS
など - 配置場所(パス):
/data/incoming/sales/
- 論理名/物理名:
- データベース:
- テーブル名(論理/物理):
商品マスタ
/M_PRODUCT
- 抽出条件:
DELETE_FLG = 0
など、SQLのWHERE句に相当する条件を記述します。 - 抽出項目: 処理に必要なカラムを一覧化します。
- テーブル名(論理/物理):
- API:
- エンドポイントURL:
https://api.example.com/v1/stock
- HTTPメソッド:
GET
,POST
など - リクエストパラメータ/ボディ: 送信するデータの内容と形式。
- エンドポイントURL:
- 引数:
- バッチ起動時に外部から渡されるパラメータ。例えば、処理対象日を
-d 20250809
のように指定する場合の仕様を定義します。
- バッチ起動時に外部から渡されるパラメータ。例えば、処理対象日を
- ファイル:
- 出力情報:
- ファイル: 入力と同様に、ファイル名(命名規則)、フォーマット、レイアウト、文字コード、出力先パスを定義します。
- データベース:
- テーブル名(論理/物理):
日次売上サマリ
/T_DAILY_SALES_SUMMARY
- 処理種別:
INSERT
(新規登録)、UPDATE
(更新)、DELETE
(削除)の別。 - 登録・更新項目: どの項目にどの値を設定するのかをマッピング形式で記述します。
- テーブル名(論理/物理):
- 帳票:
- 帳票ID/帳票名:
CHO-SL-M-001
/月次売上報告書
- 出力形式: PDF, Excelなど
- 帳票ID/帳票名:
- ログ:
- 出力内容: 処理開始・終了メッセージ、処理件数、エラーメッセージなど。
- ログレベル:
INFO
,WARN
,ERROR
- フォーマット:
[タイムスタンプ] [ログレベル] [バッチID] メッセージ
- メール通知:
- 送信タイミング: 正常終了時、異常終了時
- 宛先(To/Cc/Bcc):
[email protected]
- 件名:
【成功】日次売上集計バッチ実行完了のお知らせ
- 本文: 実行結果、処理件数、エラー内容などを含むテンプレートを記述します。
処理ロジック詳細
処理フローの各ステップで行われる具体的な処理内容を、実装者がコードを書けるレベルまで詳細に記述します。
- データ加工・編集ロジック: 「入力ファイルの
商品コード
(8桁)の先頭2桁を切り出し、商品カテゴリコード
として使用する」といった具体的な変換ルールを記述します。 - 計算ロジック: 「
売上金額
=単価
×数量
× (1 +消費税率
)」のように、計算式を明確に示します。消費税率の取得元(マスタ、設定ファイルなど)も明記します。 - バリデーションチェック: 入力データの妥当性を検証するルールを定義します。
- 必須チェック:
顧客ID
が空でないこと。 - 型チェック:
数量
が数値であること。 - 桁数チェック:
郵便番号
が7桁であること。 - 範囲チェック:
年齢
が0以上150以下であること。 - マスタ存在チェック:
商品コード
が商品マスタに存在すること。 - チェックでNGだった場合の挙動(エラーログ出力、該当レコードをスキップ、処理中断など)もセットで定義します。
- 必須チェック:
- 更新・登録ロジック: データベースへの書き込みロジックを記述します。「入力ファイルの
顧客ID
をキーに顧客テーブルを検索し、レコードが存在すれば最終購入日
を更新(UPDATE)、存在しなければ新規レコードとして登録(INSERT)する」といった条件分岐を明確にします。 - 疑似コード: 複雑なロジックは、自然言語に近い疑似コード(Pseudocode)を用いて記述すると、プログラミング言語に依存しない形でロジックを正確に伝えることができます。
異常系処理
システムの信頼性を担保する上で最も重要なセクションです。「バッチはエラーが起きて当たり前」という前提に立ち、想定されるあらゆる問題への対処法を定義します。
- エラーハンドリング:
- エラー検知条件: どのような状態を「異常」とみなすかを網羅的にリストアップします。(例: 入力ファイルが存在しない、DB接続に失敗、データ形式が不正、メモリ不足など)
- エラー発生時の処理: 検知したエラーごとに、バッチがどう振る舞うかを定義します。
- 処理中断 (Abort): 致命的なエラー。即座に処理を停止し、異常終了コードを返す。
- リトライ (Retry): 一時的な障害(ネットワーク瞬断など)の可能性がある場合に再試行する。
- スキップ (Skip): 特定のデータに問題がある場合、そのデータのみをスキップして処理を続行する。
- エラーコード・メッセージ一覧: バッチが出力する可能性のあるエラーコードと、それに対応するメッセージ、原因、対処法を一覧表にまとめます。これは運用時の障害対応で非常に役立ちます。
- リトライ処理:
- リトライ対象: どのエラーをリトライの対象とするか。(例: DB接続エラー、APIタイムアウト)
- リトライ回数・間隔: 「3回まで」「1分間隔で」のように具体的に定めます。間隔を徐々に長くする(Exponential Backoff)方式も有効です。
- 復旧手順 (リカバリ):
- 障害発生時の切り分け方法: ログのどこを確認すれば原因がわかるか、など。
- 手動でのデータ復旧手順: 中途半端な状態で残ってしまったデータを、手動で正常な状態に戻すためのSQLやコマンドなどを記述します。
- 再実行手順: 障害原因を取り除いた後、バッチを再実行する際の手順を定義します。単純に再実行すればよいのか、あるいは特定のパラメータを付与する必要があるのか、途中から再開(リラン)できるのかなどを明確にします。特に、冪等性(べきとうせい)、つまり「処理を何度実行しても結果が同じになる」ように設計されているかは重要な観点です。
性能・非機能要件
機能的な正しさに加え、性能やセキュリティなど、非機能面での要件も定義します。
- 処理性能:
- 目標処理件数: 単位時間あたりに処理すべきデータ件数(例: 100万件/時)。
- 目標実行時間: バッチ全体の実行時間が、後続処理やオンラインサービスの開始時間に影響を与えない範囲で完了すること(例: 毎日AM 5:00までに完了すること)。
- 排他制御:
- 同じバッチが多重起動されることを防ぐ仕組み(二重起動防止)。
- 複数のバッチが同じテーブルやファイルを同時に更新しようとした際のデータの整合性を保つための仕組み(テーブルロック、ファイルロックなど)の要否と方式を記述します。
- セキュリティ:
- ファイルへのアクセス権限(パーミッション)。
- データベースへの接続に使用するアカウントとその権限。
- パスワードなどの機密情報をコードに直接記述(ハードコーディング)せず、安全な場所(設定ファイル、環境変数など)で管理する方法を定義します。
- ログ要件:
- ログの出力レベル(本番環境では
INFO
以上、開発環境ではDEBUG
など)。 - ログのローテーション(世代管理)と保管期間(例: 90日間)。
- ログの出力レベル(本番環境では
サンプル構成図 (Mermaid) と解説
ここでは、3つの異なるシナリオを想定し、Mermaidで記述した処理フローのサンプルとその解説を示します。
サンプル1:日次売上集計バッチ (シンプル)
シナリオ: 毎日深夜に、指定されたディレクトリにある売上実績ファイル(CSV)を1つ読み込み、内容を集計して日次売上サマリDBに書き込む、最も基本的なバッチ。
graph TD subgraph "日次売上集計バッチ (BAT-SL-D-001)" direction A[開始] --> B{入力ファイル存在チェック}; B -->|OK| C[売上実績ファイル読込]; B -->|NG| E[エラーログ出力<br>「ファイル未達」]; C --> D{データ形式チェック}; D -->|OK| F[売上データ集計]; D -->|NG| G[エラーログ出力<br>「フォーマット不正」]; F --> H[日次売上サマリDBへ登録]; H --> I{DB登録結果チェック}; I -->|OK| J[正常終了ログ出力]; I -->|NG| K[エラーログ出力<br>「DB登録失敗」]; J --> Z[終了]; E --> Z; G --> Z; K --> Z; end style A fill:#9f9,stroke:#333,stroke-width:2px style Z fill:#f99,stroke:#333,stroke-width:2px
【図の解説】
graph LR
: フローを左から右(Left to Right)へ描画する宣言です。subgraph
:日次売上集計バッチ
という名前で処理全体をグループ化し、見やすくしています。A[テキスト]
: 四角形でプロセス(処理)を表します。B{テキスト}
: 菱形で条件分岐を表します。-->
: 処理の流れ(矢印)です。矢印の間に|テキスト|
を入れることで、分岐の条件(OK/NG)を示すことができます。- この図により、ファイルの存在チェックから始まり、成功ルートと失敗ルートがどのように分岐し、最終的に終了に至るかという一連の流れが明確に理解できます。
サンプル2:月次請求データ生成バッチ (条件分岐あり)
シナリオ: 月末に、顧客DBと当月のサービス利用実績DBからデータを読み込み、顧客の契約プラン(通常/プレミアム)に応じて請求金額を計算し、請求データファイルと未払い者警告リストファイルをそれぞれ出力するバッチ。
graph TD subgraph "月次請求データ生成バッチ (BAT-BL-M-001)" direction A[開始] --> B[顧客DB読込]; B --> C[サービス利用実績DB読込]; C --> D[顧客ごとにループ開始]; D --> E{契約プラン判定}; E -->|通常プラン| F[通常料金計算ロジック]; E -->|プレミアムプラン| G[プレミアム料金計算ロジック]; F --> H[請求金額確定]; G --> H; H --> I[請求データ生成]; I --> J{未払いフラグ判定}; J -->|ON| K[警告リストへ追記]; J -->|OFF| L[次の顧客へ]; K --> L; L --> D; D --> M[ループ終了]; M --> N[請求データファイル出力]; N --> O[警告リストファイル出力]; O --> P[正常終了]; P --> Z[終了]; %% 異常系処理 C --> |DB接続エラー| Q[リトライ処理 3回]; Q -->|成功| C; Q -->|失敗| R[致命的エラーとして異常終了]; R --> Z; end
【図の解説】
graph TD
: フローを上から下(Top to Down)へ描画します。- ループ表現:
D[顧客ごとにループ開始]
からL[次の顧客へ]
を経てD
に戻る矢印で、繰り返し処理を表現しています。 - 条件分岐:
E{契約プラン判定}
やJ{未払いフラグ判定}
で処理が分岐する様子がわかります。 - 異常系:
C
から分岐するリトライ処理のように、特定のステップで発生する異常系フローを組み込むことができます。これにより、設計の網羅性が高まります。
4.3. サンプル3:外部API連携による在庫更新バッチ (複雑なフロー)
シナリオ: 1時間ごとに、自社の商品DBと外部の仕入先が提供する在庫APIを照合し、在庫数を同期するバッチ。API通信にはタイムアウトやエラーが想定されるため、リトライ処理を組み込む。
graph LR subgraph "在庫同期バッチ (BAT-ST-H-001)" direction A(開始) --> B[二重起動チェック]; B -->|NG| C(終了); B -->|OK| D[自社商品DBから対象商品リスト取得]; D --> E[ループ開始]; E --> F[仕入先在庫APIへリクエスト送信]; F --> G{APIレスポンス受信}; G -->|成功 - HTTP 200| H[在庫数比較]; G -->|タイムアウト or 5xxエラー| I[リトライ処理 10秒待機]; G -->|クライアントエラー 4xx| J[エラーログ出力 リトライ対象外]; I --> F; H --> K{在庫数に差異あり?}; K -->|Yes| L[自社商品DBの在庫数を更新]; K -->|No| M[スキップ]; L --> N[次の商品へ]; J --> N; M --> N; N --> E; %% ループ終了後の処理 E --> O[ループ終了]; O --> P[処理結果サマリ メール通知]; P --> Q(正常終了); end style A fill:#9cf,stroke:#333 style Q fill:#9cf,stroke:#333 style C fill:#f99,stroke:#333
【図の解説】
- ノードの形:
A()
のように丸括弧で囲むと、角の丸いノードになります。開始・終了の表現に適しています。 - サブグラフのネスト:
商品ごとのループ処理
サブグラフをメインのフローの中に配置することで、処理の階層構造を表現できます。 - 実践的なエラーハンドリング: API連携で頻発するタイムアウトやサーバーエラー(5xx系)はリトライ対象とし、リクエスト自体に問題があるクライアントエラー(4xx系)はリトライせずにエラーとして記録するなど、より実践的なエラーハンドリングのロジックを図示しています。
-.->
: 点線の矢印で、直接的ではない関連(この場合は二重起動チェックからの終了)を示すことができます。
5. バッチ処理設計書作成のポイントと注意点
質の高い設計書を作成するために、以下の点を常に意識することが重要です。
- 明確性と具体性 (Unambiguity & Specificity)
- 誰が読んでも同じ解釈ができるように書くことが最も重要です。「よしなに」「うまく」といった曖昧な表現を避け、具体的な数値やロジックを記述します。
- 専門用語や略語を使用する場合は、設計書の冒頭に用語集を設けるなどの配慮をします。
- 網羅性 (Comprehensiveness)
- 正常系だけでなく、異常系を徹底的に洗い出すことがシステムの堅牢性に繋がります。入力データが空の場合、想定外のフォーマットの場合、ディスクフルになった場合など、起こりうるあらゆる問題を想像し、その対処法を定義します。
- 運用開始後のこと(ログ監視、再実行、障害復旧)を想像しながら書くことが、網羅性を高めるコツです。
- トレーサビリティ (Traceability)
- このバッチ処理が、要件定義書のどの要件を実現するものなのか、基本設計のどの機能に対応するのか、その関連性を明記します。これにより、仕様変更が発生した際の影響範囲の特定が容易になります。
- 逆引きも重要です。要件定義書から、対応するバッチ処理設計書が追跡できるように、IDなどで相互にリンクさせます。
- 図の活用とメンテナンス性 (Visualization & Maintainability)
- 複雑な処理フローは、文章だけで説明するよりも図で示した方が圧倒的に理解しやすくなります。
- Mermaidのようなテキストベースの作図ツールは、仕様変更に伴う図の修正が容易であり、差分管理も可能なため、WordやExcelの描画機能よりもメンテナンス性に優れています。設計書をMarkdownで記述し、Mermaidのコードを直接埋め込むことで、ドキュメントと図の一元管理が実現できます。
- レビュー (Review)
- 設計書が完成したら、必ず複数の視点でレビューを行います。
- 開発者: 実装可能か、技術的な懸念はないか。
- テスター: テストケースを作成するのに十分な情報があるか、異常系の考慮は網羅されているか。
- 運用担当者: 運用監視に必要なログは出ているか、障害発生時の復旧手順は現実的か。
- 有識者/アーキテクト: システム全体の設計思想と乖離していないか、性能やセキュリティ面に問題はないか。
- レビューを通じてフィードバックを得ることで、設計の精度を格段に向上させることができます。
- 設計書が完成したら、必ず複数の視点でレビューを行います。
6. おわりに
本稿では、「バッチ処理設計書」をテーマに、その目的から具体的な構成要素、Mermaidを用いた視覚的な表現方法、そして作成における重要なポイントまでを詳述してきました。
バッチ処理は、華やかなユーザーインターフェースの裏側で、システム全体のデータ整合性やビジネスロジックの根幹を支える、地味ながらも極めて重要な存在です。そして、その品質は、本稿で解説してきたバッチ処理設計書の品質に大きく左右されます。
優れた設計書は、単なる「仕様の記録」ではありません。それは、プロジェクトに関わるすべての人々をつなぐ「共通言語」であり、未来のシステムを守るための「資産」です。曖昧さを排除し、あらゆる事態を想定して練り上げられた設計書は、開発を円滑に進め、システムの安定稼働を約束し、将来の保守・改修作業の負荷を大幅に軽減します。
設計とは、単に「書く」作業ではなく、「考え抜き、伝える」知的生産活動です。今回ご紹介した構成要素やMermaidによる図解が、皆様のプロジェクトにおいて、より質の高い、そして「伝わる」バッチ処理設計書を作成するための一助となれば、これに勝る喜びはありません。
-
【設計シリーズ】システム開発でよく使う設計書 TOP20
システム開発の現場で必須となる設計書をTOP20ランキングでご紹介。開発の起点となる要件定義書から、品質保証のためのテスト仕様書、円滑な運用を支えるマニュアルまで。各ドキュメントの役割と重要性を簡潔に解説し、プロジェクト全体の流れを可視化します。エンジニアやPM必携の知識です。
続きを見る