執筆ワークフロー¶
概要¶
本記事は outline.md に定義された構成に従い、章ごとに執筆と実装を同期しながら進める。
ワークフロー図¶
詳細フロー¶
MkDocs 反映ワークフロー¶
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/)
### 実装コード(apps/)
各言語の実装コードは `apps/` ディレクトリ配下に言語ごとのディレクトリを作成して配置する。ディレクトリ名は `ops/nix/environments/` と一致させる。
### 記事と実装の対応関係
記事内のコード例は `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 | 未着手 | 未着手 | 未着手 | 未着手 | - |
| 統合解説 | 未着手 | 未着手 | 未着手 | 未着手 | - |