Skip to content
Published on

開発者のためのテクニカルライティングガイド:RFC、ADR、技術ブログ、APIドキュメント作成法

Authors

はじめに

「コードは開発者(かいはつしゃ)がコンピュータに話(はな)す言葉(ことば)であり、ドキュメントは開発者(かいはつしゃ)が他(ほか)の開発者(かいはつしゃ)に話(はな)す言葉(ことば)である。」

ソフトウェアエンジニアにとって、ライティング能力(のうりょく)はなぜ重要(じゅうよう)なのでしょうか?コードをうまく書(か)くだけでは不十分(ふじゅうぶん)です。設計(せっけい)の決定(けってい)を説明(せつめい)し、APIをドキュメント化(か)し、RFCを作成(さくせい)してチームの合意(ごうい)を導(みちび)く能力(のうりょく)こそが、シニアエンジニアとジュニアエンジニアを分(わ)ける核心的(かくしんてき)な能力(のうりょく)です。

Stripe、GitLab、Netflixのような企業(きぎょう)が「ドキュメンテーション文化(ぶんか)」を核心的(かくしんてき)な価値(かち)として掲(かか)げる理由(りゆう)があります。良(よ)いドキュメントはオンボーディング時間(じかん)を短縮(たんしゅく)し、意思決定(いしけってい)を透明(とうめい)にし、組織(そしき)の知識(ちしき)を保存(ほぞん)します。

このガイドでは、開発者(かいはつしゃ)が知(し)るべき**すべてのタイプの技術文書(ぎじゅつぶんしょ)の書(か)き方(かた)**をカバーします。


1. なぜエンジニアにライティングが重要(じゅうよう)か

1.1 ライティングが生(う)む違(ちが)い

状況(じょうきょう)ライティングなしライティングあり
設計(せっけい)レビュー口頭(こうとう)説明(せつめい)、記憶(きおく)に依存(いぞん)RFC文書(ぶんしょ)で非同期(ひどうき)レビュー
アーキテクチャ変更(へんこう)「なぜこうしたの?」の繰(く)り返(かえ)しADRでコンテキスト保存(ほぞん)
新入社員(しんにゅうしゃいん)オンボーディング口伝(くでん)の不足(ふそく)した知識(ちしき)README + アーキテクチャ文書(ぶんしょ)
外部(がいぶ)API提供(ていきょう)「これどう使(つか)うの?」の繰(く)り返(かえ)し質問(しつもん)OpenAPI + サンプルコード
技術(ぎじゅつ)ブログチーム外部(がいぶ)に知(し)られないブランディング + 採用(さいよう)効果(こうか)

1.2 良(よ)い技術文書(ぎじゅつぶんしょ)の4つの原則(げんそく)

  1. 正確性(せいかくせい)(Accuracy): コードとドキュメントが一致(いっち)すること
  2. 簡潔性(かんけつせい)(Conciseness): 不要(ふよう)な内容(ないよう)を削除(さくじょ)する
  3. 構造化(こうぞうか)(Structure): 見出(みだ)し、リスト、表(ひょう)を活用(かつよう)してスキャンしやすくする
  4. 読者(どくしゃ)中心(ちゅうしん)(Reader-Focused): まず読者(どくしゃ)を特定(とくてい)する

1.3 読者(どくしゃ)分析(ぶんせき)フレームワーク

文書(ぶんしょ)を書(か)く前(まえ)に必(かなら)ず読者(どくしゃ)を定義(ていぎ)してください:

読者分析チェックリスト:
- 読者の技術レベルは?(ジュニア/シニア/非開発者)
- 読者がすでに知っていることは何か?
- 読者がこの文書を読んでできるべきことは?
- 読者がどのような状況で読むか?(学習/参照/問題解決)

2. RFC(Request for Comments)

2.1 RFCとは?

RFCは技術的(ぎじゅつてき)な提案(ていあん)をドキュメント化(か)してチームメンバーからフィードバックを受(う)け、合意(ごうい)を導(みちび)くプロセスです。Google、Meta、Uberなどほとんどのビッグテック企業(きぎょう)で使用(しよう)されています。

RFCを書(か)くべき場合(ばあい):

  • 新(あたら)しいシステムやサービスの導入(どうにゅう)
  • 既存(きそん)アーキテクチャの大規模(だいきぼ)な変更(へんこう)
  • 複数(ふくすう)チームに影響(えいきょう)する技術的(ぎじゅつてき)決定(けってい)
  • 新(あたら)しい標準(ひょうじゅん)やプロセスの導入(どうにゅう)

2.2 RFCテンプレート

# RFC-001: ユーザー通知システムの再設計

## メタデータ
- 作成者: 田中太郎
- 状態: Draft / In Review / Accepted / Rejected / Superseded
- 作成日: 2025-03-15
- レビュアー: 鈴木花子, 佐藤次郎, 高橋三郎
- 関連RFC: RFC-042(イベントシステム)

## 要約 (Summary)
現在のポーリング型通知システムをWebSocketベースの
リアルタイム通知システムに置き換え、レイテンシを
30秒から1秒以内に短縮します。

## 動機 (Motivation)
- 現在のシステムは30秒ごとにポーリング(高レイテンシ)
- ポーリングによる不要なAPIコールが全トラフィックの15%
- ユーザー満足度調査:42%が「通知が遅い」と不満

## 提案 (Proposal)
### 技術設計
WebSocketサーバーを導入し、イベント駆動型の
通知パイプラインを構築します。

### 代替案の検討 (Alternatives Considered)
1. SSE: 単方向のみ、双方向通信不可
2. ポーリング間隔縮小(5秒): サーバー負荷6倍増
3. Long Polling: コネクション管理の複雑さ

### マイグレーション戦略
1. Phase 1: WebSocketサーバー構築と内部テスト(2週間)
2. Phase 2: 10%カナリアデプロイ(1週間)
3. Phase 3: 全体展開とポーリング削除(1週間)

## リスクと懸念事項
- WebSocketコネクション維持コスト
- ファイアウォール/プロキシ環境でのWebSocket制限
- モバイル環境でのバッテリー消費

## オープンクエスチョン
- Redis Pub/Sub vs Kafkaをメッセージブローカーとして使用するか?
- オフラインユーザー通知のキューイング戦略は?

2.3 RFCプロセスフロー

┌──────────┐    ┌───────────┐    ┌───────────┐    ┌──────────┐
Draft->In Review->Decision->Accepted (作成) (レビュー) (会議) (承認)└──────────┘    └───────────┘    └───────────┘    └──────────┘
                     │                                │
                     v                                v
               ┌───────────┐                   ┌────────────┐
Revision  │                   │ Superseded                (修正) (置換)               └───────────┘                   └────────────┘

2.4 RFCレビューチェックリスト

## RFCレビューポイント
- [ ] 問題が明確に定義されているか?
- [ ] 提案が問題を実際に解決するか?
- [ ] 代替案が十分に検討されたか?
- [ ] マイグレーション戦略が現実的か?
- [ ] リスクが特定され緩和策があるか?
- [ ] 成功/失敗の測定基準があるか?
- [ ] ロールバック計画があるか?

3. ADR(Architecture Decision Records)

3.1 ADRとは?

ADRはアーキテクチャ意思決定(いしけってい)の**コンテキスト、理由(りゆう)、結果(けっか)**を記録(きろく)する短(みじか)い文書(ぶんしょ)です。Michael Nygardが提案(ていあん)したフォーマットが最(もっと)も広(ひろ)く使(つか)われています。

RFCとの違(ちが)い:RFCは「提案(ていあん)と議論(ぎろん)」、ADRは「決定記録(けっていきろく)」です。

3.2 ADRテンプレート(Michael Nygardフォーマット)

# ADR-007: PostgreSQLをプライマリデータベースとして選択

## ステータス (Status)
Accepted (2025-02-20)

## コンテキスト (Context)
新プロジェクトのプライマリデータベースを選択する必要があります。
主な要件:
- ACIDトランザクションサポート
- JSONデータ型のネイティブサポート
- 全文検索(Full-text search)機能
- チームの既存経験の活用

候補: PostgreSQL, MySQL 8.0, MongoDB, CockroachDB

## 決定 (Decision)
PostgreSQL 16をプライマリデータベースとして使用します。

理由:
1. JSONB型で半構造化データを効率的に処理可能
2. pg_trgm, ts_vectorで全文検索可能(別途Elasticsearch不要)
3. チームメンバー5人中4人がPostgreSQL経験あり
4. MVCCベースの同時実行制御が我々のワークロードに適合

## 結果 (Consequences)
肯定的:
- 単一データベースでリレーショナル + JSON + 検索処理
- 運用の複雑さ軽減(Elasticsearch不要)
- チーム学習コスト最小化

否定的:
- 水平スケーリングがMySQLより複雑
- Write-heavyワークロードでMVCCオーバーヘッドの可能性
- Citus等での拡張時に追加コスト

## 代替案 (Alternatives)
- MySQL 8.0: JSONサポートがPostgreSQL JSONBより限定的
- MongoDB: ACIDサポートは4.0からだが複雑なJOIN不可
- CockroachDB: 分散SQLだがチーム経験不足、運用コスト高

3.3 ADRディレクトリ構造(こうぞう)

docs/
└── adr/
    ├── 0001-use-react-for-frontend.md
    ├── 0002-adopt-typescript.md
    ├── 0003-choose-postgresql.md
    ├── 0004-implement-event-sourcing.md
    ├── 0005-migrate-to-kubernetes.md
    ├── 0006-adopt-graphql.md        # Status: Superseded by 0010
    ├── 0007-choose-postgresql.md
    ├── 0008-use-redis-for-caching.md
    ├── 0009-adopt-trunk-based-dev.md
    ├── 0010-rest-api-over-graphql.md # Supersedes 0006
    └── template.md

3.4 ADR自動化(じどうか)ツール

# adr-toolsのインストールと使用
brew install adr-tools

# 新しいADR作成
adr new "Use React for Frontend"
# -> docs/adr/0001-use-react-for-frontend.md を作成

# ADRの置き換え
adr new -s 6 "REST API over GraphQL"
# -> 0006のステータスをSupersededに変更

# 目次生成
adr generate toc

4. APIドキュメント(OpenAPI / Swagger)

4.1 OpenAPI 3.1仕様(しよう)の作成(さくせい)

openapi: 3.1.0
info:
  title: User Management API
  description: ユーザー管理のためのRESTful API
  version: 2.1.0
  contact:
    name: Platform Team
    email: platform@example.com

servers:
  - url: https://api.example.com/v2
    description: Production
  - url: https://staging-api.example.com/v2
    description: Staging

paths:
  /users:
    get:
      summary: List all users
      description: |
        ページネーションをサポートするユーザー一覧取得APIです。
        デフォルトではアクティブなユーザーのみ返します。
      operationId: listUsers
      tags:
        - Users
      parameters:
        - name: page
          in: query
          description: ページ番号(1から開始)
          schema:
            type: integer
            minimum: 1
            default: 1
        - name: limit
          in: query
          description: ページあたりのアイテム数
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 20
        - name: status
          in: query
          description: ユーザーステータスフィルター
          schema:
            type: string
            enum: [active, inactive, suspended]
            default: active
      responses:
        '200':
          description: 成功
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/User'
                  pagination:
                    $ref: '#/components/schemas/Pagination'
        '401':
          description: 認証失敗
        '429':
          description: レート制限超過

components:
  schemas:
    User:
      type: object
      required: [id, name, email, role, createdAt]
      properties:
        id:
          type: string
          description: ユーザー固有ID(usr_プレフィックス)
          example: "usr_abc123"
        name:
          type: string
          example: "Alice Kim"
        email:
          type: string
          format: email
        role:
          type: string
          enum: [admin, member, viewer]
        createdAt:
          type: string
          format: date-time

    Pagination:
      type: object
      properties:
        page:
          type: integer
        limit:
          type: integer
        totalItems:
          type: integer
        totalPages:
          type: integer

  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

security:
  - BearerAuth: []

4.2 APIドキュメントツール比較(ひかく)

ツール特徴(とくちょう)推奨(すいしょう)状況(じょうきょう)
Swagger UIOpenAPIレンダリング、インタラクティブテストクイックスタート
Redocきれいな3パネルレイアウト外部公開(こうかい)API
Stoplightビジュアルエディタ、モックサーバーデザインファースト
MintlifyMDXベース、美(うつく)しいUIスタートアップ/OSS
ReadMeダッシュボード、分析(ぶんせき)エンタープライズ

4.3 良(よ)いAPIドキュメントのチェックリスト

## APIドキュメント品質チェックリスト
- [ ] すべてのエンドポイントに説明があるか?
- [ ] リクエスト/レスポンスの例があるか?
- [ ] エラーレスポンスとエラーコードが文書化されているか?
- [ ] 認証方法が明記されているか?
- [ ] レート制限情報が含まれているか?
- [ ] ページネーション方法が説明されているか?
- [ ] SDK/コード例が提供されているか?
- [ ] 変更履歴(changelog)が管理されているか?

5. READMEの書(か)き方(かた)

5.1 README構造(こうぞう)テンプレート

# プロジェクト名

簡潔な一行説明:このプロジェクトが何で、なぜ使うのか

![Build Status](badge) ![License](badge) ![Version](badge)

## 主な機能 (Features)
## クイックスタート (Quick Start)
## インストール (Installation)
## 使い方 (Usage)
## 設定 (Configuration)
## APIリファレンス (API Reference)
## コントリビュート (Contributing)
## ライセンス (License)

5.2 README作成(さくせい)のコツ

30秒(びょう)ルール: 開発者(かいはつしゃ)がREADMEを開(ひら)いた時(とき)、30秒(びょう)以内(いない)に「このプロジェクトは自分(じぶん)に必要(ひつよう)か?」を判断(はんだん)できるべきです。

Bad README:

# my-project
Install and run.

Good README:

# FastCache

Redis互換インメモリキャッシュサーバー。Goで記述され、Redisと比較して
40%低いメモリ使用量を実現。

## なぜFastCacheか?
- Redisプロトコル100%互換 — 既存クライアントをそのまま使用
- メモリ使用量40%削減(ベンチマーク結果付き)
- シングルバイナリ、ゼロ依存

## 30秒スタート
(3行のインストール/実行コード)

6. CHANGELOGの書(か)き方(かた)

6.1 Keep a Changelogフォーマット

# Changelog

このプロジェクトのすべての主要な変更を記録します。
[Keep a Changelog](https://keepachangelog.com/) 形式に従います。

## [Unreleased]

### Added
- ダークモードサポート (#234)
- ユーザープロフィール画像アップロード機能 (#256)

## [2.1.0] - 2025-03-01

### Added
- WebSocketベースのリアルタイム通知システム (#189)
- 管理者ダッシュボード分析チャート (#201)

### Changed
- JWTトークン有効期限を24時間から12時間に変更

### Fixed
- 同時ログイン時のセッション衝突バグ修正 (#220)

### Deprecated
- /api/v1 エンドポイント(v3.0で削除予定)

### Security
- 依存関係更新: lodash 4.17.21 (CVE-2021-23337)

6.2 セマンティックバージョニング(SemVer)

MAJOR.MINOR.PATCH

MAJOR: 互換性のないAPI変更(Breaking Change)
MINOR: 後方互換の新機能追加
PATCH: 後方互換のバグ修正

例:
1.0.0 -> 1.0.1  (バグ修正)
1.0.1 -> 1.1.0  (新機能追加)
1.1.0 -> 2.0.0  (Breaking Change)

7. 技術(ぎじゅつ)ブログの書(か)き方(かた)

7.1 技術(ぎじゅつ)ブログ記事(きじ)の構造(こうぞう)

1. タイトル (Title)
   - 具体的で検索可能なキーワードを含む
   - Bad: 「学んだこと」
   - Good: 「PostgreSQLで100万行クエリを2秒から50msに最適化した方法」

2. 導入部 (Introduction)
   - 問題定義:読者が共感できる状況
   - 結果プレビュー:「この記事を読めばXができます」

3. 本文 (Body)
   - 問題 -> 試行 -> 失敗 -> 解決のストーリー構造
   - 実行可能なコード例
   - 複雑な概念のダイアグラム化

4. 結論 (Conclusion)
   - 核心的教訓の要約(3行以内)
   - 次のステップ

5. 参考資料 (References)

7.2 技術(ぎじゅつ)ブログSEO

## SEOチェックリスト
- [ ] タイトルにコアキーワード含む(50〜60文字)
- [ ] メタディスクリプション作成(150〜160文字)
- [ ] H2/H3見出しに関連キーワード含む
- [ ] 画像にaltタグ追加
- [ ] 内部/外部リンク含む
- [ ] URLがクリーンでキーワード含む
- [ ] コードブロックにシンタックスハイライティング適用

7.3 技術(ぎじゅつ)ブログライティングのコツ

ストーリー構造(こうぞう)を活用(かつよう):

「私たちのチームは毎日午後3時にサーバーがダウンする問題に直面していた。」(問題)
「最初はメモリリークだと思った。」(仮説)
「しかしプロファイリングの結果、問題はGCではなくコネクションプール枯渇だった。」(発見)
「コネクションプール設定を変更しモニタリングを追加した結果...」(解決)
「この経験から学んだ3つの教訓:」(教訓)

8. ダイアグラミング

8.1 Mermaid

Markdown内(ない)でダイアグラムを作成(さくせい)できるテキストベースのツールです。GitHub、GitLab、Notionなどでネイティブサポートされています。

シーケンスダイアグラム:

sequenceDiagram
    participant Client
    participant API Gateway
    participant Auth Service
    participant User Service
    participant Database

    Client->>API Gateway: POST /login
    API Gateway->>Auth Service: Validate credentials
    Auth Service->>Database: Query user
    Database-->>Auth Service: User data
    Auth Service-->>API Gateway: JWT token
    API Gateway-->>Client: 200 OK + token

アーキテクチャダイアグラム:

graph TD
    A[Client] --> B[Load Balancer]
    B --> C[API Server 1]
    B --> D[API Server 2]
    C --> E[Redis Cache]
    D --> E
    C --> F[PostgreSQL Primary]
    D --> F
    F --> G[PostgreSQL Replica]
    C --> H[Message Queue]
    D --> H
    H --> I[Worker 1]
    H --> J[Worker 2]

ステートダイアグラム:

stateDiagram-v2
    [*] --> Draft
    Draft --> InReview: Submit for review
    InReview --> Approved: All reviewers approve
    InReview --> Draft: Changes requested
    Approved --> Published: Deploy
    Published --> Archived: Deprecate
    Archived --> [*]

8.2 PlantUML

より複雑(ふくざつ)なダイアグラムに適(てき)したツールです。

@startuml
!theme plain

package "Frontend" {
  [React App] as react
  [Next.js SSR] as nextjs
}

package "Backend" {
  [API Gateway] as gateway
  [User Service] as user
  [Order Service] as order
  [Notification Service] as notif
}

package "Data" {
  database "PostgreSQL" as pg
  database "Redis" as redis
  queue "Kafka" as kafka
}

react --> gateway
nextjs --> gateway
gateway --> user
gateway --> order
user --> pg
order --> pg
user --> redis
order --> kafka
kafka --> notif

@enduml

8.3 ダイアグラムツール比較(ひかく)

ツールタイプ長所(ちょうしょ)短所(たんしょ)
MermaidテキストベースGit親和的(しんわてき)、Markdown統合(とうごう)複雑(ふくざつ)なレイアウト制限(せいげん)
PlantUMLテキストベース豊富(ほうふ)なダイアグラムタイプJavaランタイム必要(ひつよう)
D2テキストベースモダンな文法(ぶんぽう)、きれいな出力(しゅつりょく)エコシステムがまだ小(ちい)さい
Excalidrawビジュアル手書(てが)きスタイル、直感的(ちょっかんてき)Git diff不可(ふか)
draw.ioビジュアル無料(むりょう)、豊富(ほうふ)なテンプレートXMLベースでdiff困難(こんなん)

8.4 ダイアグラム作成(さくせい)の原則(げんそく)

  1. 適切(てきせつ)な抽象化(ちゅうしょうか)レベル: すべての詳細(しょうさい)を含(ふく)めず、伝(つた)えたい核心(かくしん)だけ
  2. 一貫(いっかん)した方向性(ほうこうせい): データフローは左(ひだり)から右(みぎ)、または上(うえ)から下(した)へ
  3. ラベルの活用(かつよう): 矢印(やじるし)に説明(せつめい)を付(つ)けて関係(かんけい)を明確(めいかく)に
  4. 色(いろ)の節制(せっせい): 最大(さいだい)3〜4色(しょく)のみ使用(しよう)
  5. 凡例(はんれい)を含(ふく)める: 記号(きごう)と色(いろ)の意味(いみ)を説明(せつめい)

9. Docs-as-Code

9.1 Docs-as-Codeとは?

ドキュメントをコードのように管理(かんり)する方法論(ほうほうろん)です:

  • バージョン管理(かんり): Gitでドキュメント履歴(りれき)を追跡(ついせき)
  • PRレビュー: ドキュメント変更(へんこう)もコードレビューのように
  • CI/CD: ドキュメントのビルドとデプロイを自動化(じどうか)
  • リンティング: 文法(ぶんぽう)、スタイルの自動(じどう)チェック

9.2 Docs-as-Codeツール比較(ひかく)

ツール特徴(とくちょう)推奨(すいしょう)状況(じょうきょう)
DocusaurusReactベース、MDX、バージョニングオープンソースプロジェクト
MkDocs (Material)Pythonベース、きれいなUI社内(しゃない)ドキュメント
MintlifyAIベース、美(うつく)しいテーマAPIドキュメント、スタートアップ
GitBookWYSIWYG、コラボレーション非開発者(ひかいはつしゃ)を含(ふく)むチーム
Astro StarlightAstroベース、高速(こうそく)パフォーマンス重視(じゅうし)

9.3 ドキュメントリンティング

# .github/workflows/docs-lint.yml
name: Docs Lint
on: [pull_request]

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: markdownlint
        uses: DavidAnson/markdownlint-cli2-action@v18
        with:
          globs: 'docs/**/*.md'

      - name: vale (prose linter)
        uses: errata-ai/vale-action@v2
        with:
          files: docs/
          vale_flags: "--config=.vale.ini"

Vale設定(せってい)例(れい):

# .vale.ini
StylesPath = .vale/styles
MinAlertLevel = suggestion

[*.md]
BasedOnStyles = Vale, Google
Google.Passive = warning
Google.We = warning
Google.Will = error
Vale.Terms = error

10. ドキュメンテーション文化(ぶんか)の事例(じれい)

10.1 Stripe

  • すべてをドキュメント化(か): 設計(せっけい)決定(けってい)、障害報告書(しょうがいほうこくしょ)、オンボーディングガイド
  • ライティング文化(ぶんか): ライティングスキルが昇進(しょうしん)基準(きじゅん)に含(ふく)まれる
  • APIドキュメント: 業界(ぎょうかい)最高(さいこう)レベルのAPIドキュメント

10.2 GitLab

  • ハンドブックファースト: すべてのプロセスをまずハンドブックにドキュメント化(か)
  • パブリックハンドブック: 2,000ページ以上(いじょう)のオープンハンドブック
  • すべてのコミュニケーションをドキュメント化(か): ミーティングノート、意思決定(いしけってい)ログすべて公開(こうかい)

10.3 Netflix

  • RFC文化(ぶんか): 技術的(ぎじゅつてき)決定(けってい)にRFCプロセス必須(ひっす)
  • ポストモーテム: 障害後(しょうがいご)の詳細(しょうさい)な事後(じご)分析(ぶんせき)文書(ぶんしょ)
  • Paved Road: 推奨(すいしょう)技術(ぎじゅつ)スタックとパターンをドキュメント化(か)

10.4 Amazon

  • 6ページメモ: パワーポイントの代(か)わりに6ページのナラティブ文書(ぶんしょ)
  • PR/FAQ文書(ぶんしょ): 新製品(しんせいひん)/機能(きのう)はプレスリリース形式(けいしき)で提案(ていあん)
  • 逆方向(ぎゃくほうこう)作業(さぎょう)(Working Backwards): 顧客(こきゃく)視点(してん)からドキュメントを開始(かいし)

10.5 ドキュメンテーション文化(ぶんか)の導入(どうにゅう)段階(だんかい)

ステージ1: README標準化(12週間)
  - すべてのリポジトリにREADMEテンプレートを適用
  - PRチェックリストに「ドキュメント更新」項目を追加

ステージ2: ADR導入(24週間)
  - ADRテンプレートとディレクトリ構造を設定
  - 主要なアーキテクチャ決定にADR作成を義務化

ステージ3: RFCプロセス導入(12ヶ月)
  - RFCテンプレートとレビュープロセスを確立
  - 影響度の高い変更にRFCを必須化

ステージ4: Docs-as-Code(23ヶ月)
  - ドキュメントサイト構築(Docusaurus/MkDocs)
  - CI/CDパイプラインにドキュメントビルド/デプロイを統合
  - リンティング自動化(markdownlint, Vale)

ステージ5: 文化定着(継続)
  - 良いドキュメントへの認識と報酬
  - 定期的なライティングワークショップ
  - 新入社員オンボーディングにドキュメント作成練習を含める

実践(じっせん)クイズ

クイズ1:このRFCの問題点(もんだいてん)を見(み)つけてください。
# RFC: 新システム

## 要約
新しいシステムを作ります。

## 提案
Redisを使います。

## 結論
これがいいです。

問題点(もんだいてん):

  1. 動機(どうき)の欠如(けつじょ): なぜ新(あたら)しいシステムが必要(ひつよう)か説明(せつめい)がない
  2. 代替案(だいたいあん)の検討(けんとう)なし: Redisのみ言及(げんきゅう)で他(ほか)の選択肢(せんたくし)と比較(ひかく)していない
  3. 具体的(ぐたいてき)な設計(せっけい)なし: 「何(なに)」はあるが「どのように」がない
  4. リスク分析(ぶんせき)なし: どんな危険(きけん)があるか、緩和策(かんわさく)は何(なに)か
  5. 成功(せいこう)基準(きじゅん)なし: どの指標(しひょう)で成功(せいこう)を測定(そくてい)するか
  6. マイグレーション戦略(せんりゃく)なし: どのように移行(いこう)するか
  7. メタデータなし: 作成者(さくせいしゃ)、レビュアー、ステータス情報(じょうほう)がない
クイズ2:このAPIエンドポイントのドキュメントを改善(かいぜん)してください。
## GET /users
ユーザーを取得します。

改善案(かいぜんあん):

## GET /users

ページネーションでユーザー一覧を取得します。
デフォルトではアクティブなユーザーのみ返します。

### パラメータ

| 名前 | 位置 || 必須 | 説明 | デフォルト |
|------|------|------|------|------|--------|
| page | query | integer | No | ページ番号(1から) | 1 |
| limit | query | integer | No | ページあたり項目数(1-100) | 20 |
| status | query | string | No | ステータスフィルター | active |

### レスポンス例

**200 OK**

(JSONレスポンス例を含む)

### エラーレスポンス

| ステータスコード | 説明 | 解決方法 |
|-----------|------|----------|
| 401 | 認証トークンが欠落または期限切れ | Authorizationヘッダーに有効なトークンを含める |
| 429 | レート制限超過(100req/min) | Retry-Afterヘッダーを参照して再試行 |
クイズ3:このADRで欠(か)けている項目(こうもく)を見(み)つけてください。
# ADR-003: MongoDBの使用

## 決定
MongoDBを使用します。

欠(か)けている項目(こうもく):

  1. ステータス: Proposed/Accepted/Deprecated等(とう)
  2. コンテキスト: どんな問題(もんだい)を解決(かいけつ)するための決定(けってい)か
  3. 結果(けっか): 肯定的(こうていてき)/否定的(ひていてき)な影響(えいきょう)
  4. 代替案(だいたいあん)の検討(けんとう): なぜ他(ほか)のオプションではなくMongoDBか
  5. 日付(ひづけ): いつ決定(けってい)したか
  6. 理由(りゆう): なぜMongoDBを選択(せんたく)したか具体的(ぐたいてき)な根拠(こんきょ)
クイズ4:READMEの30秒(びょう)ルールを適用(てきよう)してみましょう。

次(つぎ)のREADMEを30秒(びょう)以内(いない)に判断(はんだん)できるように改善(かいぜん)してください:

# project-x
Node.jsプロジェクトです。

改善案(かいぜんあん):

# ProjectX - リアルタイム協同ホワイトボード

ブラウザベースのリアルタイムホワイトボードツール。WebSocketで
最大50人が同時にドローイング/ノート/ダイアグラム作業可能。

主な機能:
- リアルタイムマルチプレイヤー編集(50人同時接続)
- 無限キャンバス + ベクターベースレンダリング
- Slack/Notion連携

技術スタック: Next.js, WebSocket, Canvas API, PostgreSQL

クイックスタート:
(3行のインストール/実行コード)
クイズ5:Mermaidで次(つぎ)のアーキテクチャをダイアグラムで表現(ひょうげん)してください。

「クライアントがAPIゲートウェイを通(とお)して認証(にんしょう)サービスと商品(しょうひん)サービスにアクセスし、各(かく)サービスはそれぞれ別(べつ)のデータベースを使用(しよう)する。」

答(こた)え:

graph TD
    A[Client] --> B[API Gateway]
    B --> C[Auth Service]
    B --> D[Product Service]
    C --> E[(Auth DB)]
    D --> F[(Product DB)]
  • 各(かく)サービスの境界(きょうかい)が明確(めいかく)
  • データベースがサービスごとに分離(ぶんり)(Database per Serviceパターン)
  • API Gatewayが単一(たんいつ)の入口(いりぐち)として機能(きのう)

ツール一覧(いちらん)

ドキュメント作成(さくせい)ツール

カテゴリツール用途(ようと)
APIドキュメントSwagger/Redoc/StoplightOpenAPIレンダリング
ドキュメントサイトDocusaurus/MkDocs/Mintlify技術(ぎじゅつ)ドキュメントサイト
ダイアグラムMermaid/PlantUML/D2テキストベースダイアグラム
リンティングmarkdownlint/Valeドキュメント品質(ひんしつ)自動(じどう)チェック
ADR管理(かんり)adr-tools/log4brainsADR作成(さくせい)/管理(かんり)
CHANGELOGconventional-changelog/release-please変更(へんこう)ログ自動(じどう)生成(せいせい)
スクリーンショットcarbon.now.sh/ray.soコードスクリーンショット生成(せいせい)
コラボレーションNotion/Confluence/GitBookチームドキュメント協業(きょうぎょう)

参考(さんこう)資料(しりょう)

  1. "Docs for Developers" by Jared Bhatti et al. (2021)
  2. Google Technical Writing Course (developers.google.com/tech-writing)
  3. Michael Nygard, "Documenting Architecture Decisions" (2011)
  4. OpenAPI Specification 3.1.0 (spec.openapis.org)
  5. Keep a Changelog (keepachangelog.com)
  6. Semantic Versioning (semver.org)
  7. Mermaid.js Documentation (mermaid.js.org)
  8. GitLab Handbook (handbook.gitlab.com)
  9. Stripe Engineering Blog — "Writing Culture"
  10. Amazon's "Working Backwards" Methodology
  11. Docusaurus Documentation (docusaurus.io)
  12. Vale.sh — Prose Linter (vale.sh)
  13. PlantUML Documentation (plantuml.com)
  14. "The Diagramming Playbook" — Simon Brown (structurizr.com)