Skip to content

執筆ワークフロー

概要

本記事は outline.md に定義された構成に従い、章ごとに執筆と実装を同期しながら進める。

ワークフロー図

uml diagram

詳細フロー

uml diagram

MkDocs 反映ワークフロー

uml diagram

MkDocs 更新手順

1. mkdocs.yml への章追加

nav:
  - 記事:
      - 概要: article/index.md
      - Python:
          - 概要: article/python/index.md
          - 基本的なアルゴリズム: article/python/01-basic-algorithms.md
          - 配列: article/python/02-arrays.md

2. ローカルプレビュー

# サーバー起動
npm run docs:serve

# ブラウザで確認
# http://localhost:8000

3. ビルド・デプロイ

# 静的サイト生成
npm run docs:build

MkDocs チェックリスト

  • 章ファイルが正しいパスに配置されている
  • mkdocs.yml の nav に章が追加されている
  • index.md のリンクが正しい
  • ローカルプレビューで表示確認済み
  • PlantUML ダイアグラムが正しくレンダリングされる
  • 内部リンクが正常に動作する

執筆ルール

1. 章の選択

  • outline.md の順序に従って進める
  • 言語間の依存はないため、1 言語ずつ全 9 章を通しで書いても、1 章ずつ全言語横断で書いてもよい
  • 推奨: 1 言語ずつ第 1〜9 章を通しで執筆し、実装も同時に完成させる

2. 参照記事

Wiki 記事が存在する言語は参照元として活用する。

言語 参照先(Wiki) ステータス
Python tmp/wiki/記事/アルゴリズム/アルゴリズムから始めるPython入門/ 原本
TypeScript tmp/wiki/記事/アルゴリズム/アルゴリズムから始めるTypeScript入門/ あり
Go tmp/wiki/記事/アルゴリズム/アルゴリズムから始めるGo入門/ あり
Haskell tmp/wiki/記事/アルゴリズム/アルゴリズムから始めるHaskell入門/ あり
Clojure tmp/wiki/記事/アルゴリズム/アルゴリズムから始めるClojure入門/ あり
F# tmp/wiki/記事/アルゴリズム/アルゴリズムから始めるF#入門/ あり
Java - 新規執筆
C# - 新規執筆
Ruby - 新規執筆
PHP - 新規執筆
Rust - 新規執筆
Scala - 新規執筆

3. 執筆フォーマット

# 第N章: 章タイトル

## N.1 セクションタイトル

本文...

### コード例

\```python
# テストコード
import unittest

class TestAlgorithm(unittest.TestCase):
    def test_example(self):
        # Arrange
        # Act
        # Assert
        pass
\```

### TDD サイクル

\<img src="data:image/svg+xml;base64,PD9wbGFudHVtbCAxLjIwMjYuMj8+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBjb250ZW50U3R5bGVUeXBlPSJ0ZXh0L2NzcyIgaGVpZ2h0PSIxNjlweCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSIgc3R5bGU9IndpZHRoOjM5M3B4O2hlaWdodDoxNjlweDtiYWNrZ3JvdW5kOiMwMDAwMDA7IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCAzOTMgMTY5IiB3aWR0aD0iMzkzcHgiIHpvb21BbmRQYW49Im1hZ25pZnkiPjxkZWZzLz48Zz48cmVjdCBmaWxsPSIjMDAxNzAxIiBoZWlnaHQ9IjEiIHN0eWxlPSJzdHJva2U6IzAwMTcwMTtzdHJva2Utd2lkdGg6MTsiIHdpZHRoPSIxIiB4PSIwIiB5PSIwIi8+PHRleHQgZmlsbD0iIzMzRkYwMiIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIGZvbnQtc3R5bGU9Iml0YWxpYyIgZm9udC13ZWlnaHQ9ImJvbGQiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMTI4LjAwOTgiIHg9IjUiIHk9IjE3Ij5QbGFudFVNTCAxLjIwMjYuMjwvdGV4dD48cmVjdCBmaWxsPSIjMzNGRjAyIiBoZWlnaHQ9IjIxLjI5NjkiIHN0eWxlPSJzdHJva2U6IzMzRkYwMjtzdHJva2Utd2lkdGg6MTsiIHdpZHRoPSIxNzMuMjgxMyIgeD0iNSIgeT0iMjYuOTY4OCIvPjx0ZXh0IGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmb250LXdlaWdodD0iYm9sZCIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSIxNzEuMjgxMyIgeD0iNiIgeT0iNDEuOTY4OCI+W0Zyb20gc3RyaW5nIChsaW5lIDUpIF08L3RleHQ+PHRleHQgZmlsbD0iIzMzRkYwMiIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTQiIGZvbnQtd2VpZ2h0PSJib2xkIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjQuODc0IiB4PSI1IiB5PSI2Mi4yNjU2Ij4mIzE2MDs8L3RleHQ+PHRleHQgZmlsbD0iIzMzRkYwMiIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTQiIGZvbnQtd2VpZ2h0PSJib2xkIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHRMZW5ndGg9IjgxLjQyMjkiIHg9IjUiIHk9Ijc4LjU2MjUiPkBzdGFydHVtbDwvdGV4dD48dGV4dCBmaWxsPSIjMzNGRjAyIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNCIgZm9udC13ZWlnaHQ9ImJvbGQiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMTIxLjk2NjUiIHg9IjUiIHk9Ijk0Ljg1OTQiPjpSZWQ6ICYjMTI0ODY7JiMxMjQ3MzsmIzEyNDg4OyYjMjAzMTY7JiMyNTEwNDs7PC90ZXh0Pjx0ZXh0IGZpbGw9IiMzM0ZGMDIiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmb250LXdlaWdodD0iYm9sZCIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSIxMjUuMDIyMiIgeD0iNSIgeT0iMTExLjE1NjMiPjpHcmVlbjogJiMyNjM2ODsmIzIzNTY3OyYjMjM0NTU7JiMzNTAxMzs7PC90ZXh0Pjx0ZXh0IGZpbGw9IiMzM0ZGMDIiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmb250LXdlaWdodD0iYm9sZCIgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nIiB0ZXh0TGVuZ3RoPSIxNTguOTk2OCIgeD0iNSIgeT0iMTI3LjQ1MzEiPjpSZWZhY3RvcjogJiMxMjQ2NzsmIzEyNTQwOyYjMTI0ODk7JiMyNTkxMzsmIzIxODkyOzs8L3RleHQ+PHRleHQgZmlsbD0iIzMzRkYwMiIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTQiIGZvbnQtd2VpZ2h0PSJib2xkIiBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIHRleHQtZGVjb3JhdGlvbj0id2F2eSB1bmRlcmxpbmUiIHRleHRMZW5ndGg9IjI2LjExMzMiIHg9IjUiIHk9IjE0My43NSI+XGBgYDwvdGV4dD48dGV4dCBmaWxsPSIjRkYwMDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNCIgZm9udC13ZWlnaHQ9ImJvbGQiIGxlbmd0aEFkanVzdD0ic3BhY2luZyIgdGV4dExlbmd0aD0iMzc2LjI0MzIiIHg9IjkuODc0IiB5PSIxNjAuMDQ2OSI+U3ludGF4IEVycm9yPyAoQXNzdW1lZCBkaWFncmFtIHR5cGU6IGFjdGl2aXR5KTwvdGV4dD48P3BsYW50dW1sLXNyYyBpbWZBSlI1SVVEcFN6aFhmdi1GY1pZVHh2cHBoYzYzRFBVTFViOWdRUHdObVI0eDNxbXR6SnpWRFZ4NnU1SVdRYjlnTWM1b0lObUpLcVJKdlNWRVVueXNUcHdSaVYzZ2puUGVoOVk0WFdPakJNTGJQMFFBUVl5aWM5UkthQ0pFZHM4eEJmaFdxRHBVbmdEOEU4V05OUXdDRmEtMDJ3by1lQkNkOHAtREFJS3JKSUNuOXBvX0FCQ2Q4clQycXViOU1xREZKdW9mOEIydzZNY0VaM3BDUjAwMDA/PjwvZz48L3N2Zz4=" class="uml" alt="uml diagram" title="" />

- タスク項目などは一行開けて記述する

- NG

  ```markdown
    **受入条件**:
    - [ ] テストが通る
    - [ ] リファクタリング済み
  ```

- OK

  ```markdown
    **受入条件**:

    - [ ] テストが通る
    - [ ] リファクタリング済み
  ```

### 4. 実装同期チェックリスト

- [ ] `apps/{lang}/` にプロジェクトが作成されている
- [ ] テストコードが執筆内容と一致
- [ ] プロダクションコードが一致
- [ ] テスト実行結果が記事の記述と一致
- [ ] リファクタリング後のコードが反映済み
- [ ] 記事内のコード例が `apps/{lang}/` の実コードと同期している

## ファイル構成

### 記事(docs/article/)
docs/article/ ├── index.md # 記事トップページ(目次) ├── outline.md # 執筆計画アウトライン ├── workflow.md # 本ファイル(執筆ワークフロー) ├── python/ # Python(原本) │ ├── index.md │ ├── 01-basic-algorithms.md │ ├── 02-arrays.md │ ├── 03-search-algorithms.md │ ├── 04-stack-and-queue.md │ ├── 05-recursion.md │ ├── 06-sort-algorithms.md │ ├── 07-string-processing.md │ ├── 08-lists.md │ └── 09-tree-structures.md ├── java/ # Java ├── node/ # TypeScript ├── ruby/ # Ruby ├── php/ # PHP ├── go/ # Go ├── rust/ # Rust ├── csharp/ # C# ├── fsharp/ # F# ├── clojure/ # Clojure ├── scala/ # Scala ├── haskell/ # Haskell └── all/ # 多言語統合解説
### 実装コード(apps/)

各言語の実装コードは `apps/` ディレクトリ配下に言語ごとのディレクトリを作成して配置する。ディレクトリ名は `ops/nix/environments/` と一致させる。
apps/ ├── java/ # Java(Maven/Gradle プロジェクト) │ ├── src/ │ │ ├── main/java/ │ │ └── test/java/ │ └── pom.xml or build.gradle ├── node/ # TypeScript(npm プロジェクト) │ ├── src/ │ ├── test/ │ └── package.json ├── python/ # Python(uv/poetry プロジェクト) │ ├── src/ │ ├── tests/ │ └── pyproject.toml ├── ruby/ # Ruby(Bundler プロジェクト) │ ├── lib/ │ ├── test/ │ └── Gemfile ├── php/ # PHP(Composer プロジェクト) │ ├── src/ │ ├── tests/ │ └── composer.json ├── go/ # Go(Go Modules プロジェクト) │ ├── algorithm/ │ └── go.mod ├── rust/ # Rust(Cargo プロジェクト) │ ├── src/ │ ├── tests/ │ └── Cargo.toml ├── dotnet/ # C# / F#(.NET プロジェクト) │ ├── src/ │ ├── test/ │ └── .sln ├── clojure/ # Clojure(deps.edn プロジェクト) │ ├── src/ │ ├── test/ │ └── deps.edn ├── scala/ # Scala(sbt プロジェクト) │ ├── src/ │ └── build.sbt └── haskell/ # Haskell(Cabal/Stack プロジェクト) ├── src/ ├── test/ └── package.yaml or .cabal
### 記事と実装の対応関係
docs/article/{lang}/NN-chapter-name.md ←→ apps/{lang}/ (記事・解説) (実装コード)
記事内のコード例は `apps/{lang}/` の実際のコードと一致させる。実装を先に TDD で進め、動作確認済みのコードを記事に転記する。

## 開発環境

各言語の開発環境は Nix で管理する。

```bash
# 言語別環境に入る
nix develop .#java
nix develop .#node
nix develop .#python
nix develop .#ruby
nix develop .#php
nix develop .#go
nix develop .#rust
nix develop .#dotnet
nix develop .#clojure
nix develop .#scala
nix develop .#elixir
nix develop .#haskell

実装の始め方

開発には Nix を使用する。Nix 環境に入ることで言語処理系・ビルドツールがすべて利用可能になる。

パッケージ管理・静的解析・タスクランナーの構成は tmp/getting-started-tdd/docs/article/{lang}/05 および 06 を参考にする。詳細は docs/article/outline.md の「環境構築方針」を参照。

# 1. Nix 環境に入る(言語処理系・ビルドツールが利用可能になる)
nix develop .#python   # Python + uv
nix develop .#java     # Java + Gradle
nix develop .#node     # Node.js + npm
nix develop .#ruby     # Ruby + Bundler
nix develop .#php      # PHP + Composer
nix develop .#go       # Go + Go Modules
nix develop .#rust     # Rust + Cargo
nix develop .#dotnet   # .NET (C# / F#) + NuGet
nix develop .#clojure  # Clojure + Leiningen
nix develop .#scala    # Scala + sbt
nix develop .#haskell  # Haskell + Stack

# 2. apps/{lang}/ に移動(初回はディレクトリ作成)
cd apps/python

# 3. 言語固有のプロジェクトを初期化(ch05/06 の構成に準拠)
#    Python:  uv init → pyproject.toml + .ruff.toml + tox.ini
#    Java:    gradle init → build.gradle + checkstyle.xml
#    Node:    npm init → package.json + tsconfig.json + eslint.config.mjs
#    Ruby:    bundle init → Gemfile + .rubocop.yml
#    PHP:     composer init → composer.json + phpunit.xml
#    Go:      go mod init → go.mod + .golangci.yml
#    Rust:    cargo init → Cargo.toml + rustfmt.toml
#    C#:      dotnet new → .csproj + .editorconfig
#    F#:      dotnet new → .fsproj + .editorconfig
#    Scala:   sbt init → build.sbt + .scalafmt.conf
#    Clojure: lein new → project.clj
#    Haskell: stack new → package.yaml + stack.yaml + .hlint.yaml

# 4. TDD サイクル開始
#    テスト作成 → 実行(Red) → 実装(Green) → リファクタリング

進捗管理

言語 第 1 部 第 2 部 第 3 部 第 4 部 ステータス
Python 未着手 未着手 未着手 未着手 -
TypeScript 未着手 未着手 未着手 未着手 -
Java 未着手 未着手 未着手 未着手 -
C# 未着手 未着手 未着手 未着手 -
Ruby 未着手 未着手 未着手 未着手 -
PHP 未着手 未着手 未着手 未着手 -
Go 未着手 未着手 未着手 未着手 -
Rust 未着手 未着手 未着手 未着手 -
F# 未着手 未着手 未着手 未着手 -
Scala 未着手 未着手 未着手 未着手 -
Clojure 未着手 未着手 未着手 未着手 -
Haskell 未着手 未着手 未着手 未着手 -
統合解説 未着手 未着手 未着手 未着手 -