Skip to content

執筆計画アウトライン

概要

「アルゴリズムから始めるプログラミング入門」シリーズの執筆計画。Wiki 記事のうち最も完成度の高い Python 版を原本として再構成し、Python 版を基に 11 言語へ多言語展開する。

対象言語

ops/nix/environments/ に定義された 12 言語環境:

環境名 言語 Wiki 記事 展開元 備考
python Python あり(原本) - マルチパラダイム、全言語の基準
node TypeScript あり(補助参照) Python 静的型付き JS
java Java なし Python OOP 代表
dotnet (C#) C# なし Python .NET OOP
ruby Ruby なし Python 動的型付き OOP
php PHP なし Python Web 特化
go Go あり(補助参照) Python シンプル志向
rust Rust なし Python 所有権・メモリ安全性
dotnet (F#) F# あり(補助参照) Python .NET 関数型
scala Scala なし Python OOP + FP ハイブリッド
clojure Clojure あり(補助参照) Python LISP + 関数型
haskell Haskell あり(補助参照) Python 純粋関数型
elixir Elixir なし Python BEAM VM、並行関数型

環境構築方針

Nix 開発環境

各言語の実行環境は Nix で管理する。ops/nix/environments/ に定義された言語別の devShell を使用することで、開発環境の再現性を保証する。

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

Nix 環境に入ることで、言語処理系・ビルドツール・パッケージマネージャーがすべて利用可能になる。ホスト環境に言語をインストールする必要はない。

パッケージ管理・静的解析・タスクランナー

言語固有のパッケージ管理・静的解析・タスクランナーの設定は tmp/getting-started-tdd/docs/article/{lang}/05 および 06 を参考にする。

参考元: tmp/getting-started-tdd/docs/article/{lang}/

  • 05-package-management-and-static-analysis.md — パッケージ管理と静的解析
  • 06-task-runner-and-ci-cd.md — タスクランナーと CI/CD

言語別環境構築仕様

言語 パッケージ管理 設定ファイル リンター/フォーマッター タスクランナー テストフレームワーク
Python uv pyproject.toml, .ruff.toml Ruff, mypy tox pytest + pytest-cov
TypeScript npm package.json, eslint.config.mjs, tsconfig.json ESLint, Prettier npm scripts Jest
Java Gradle build.gradle Checkstyle, PMD, SpotBugs Gradle tasks JUnit 5
C# NuGet (dotnet) .csproj, .editorconfig dotnet format, Roslyn Analyzers dotnet CLI xUnit
Ruby Bundler Gemfile, .rubocop.yml RuboCop Rake Minitest + SimpleCov
PHP Composer composer.json, .php-cs-fixer.php PHP_CodeSniffer, PHPStan Composer scripts PHPUnit
Go Go Modules go.mod golangci-lint Makefile / go test testing (標準)
Rust Cargo Cargo.toml, rustfmt.toml Clippy, rustfmt cargo cargo test
F# NuGet (dotnet) .fsproj, .editorconfig Fantomas, Roslyn Analyzers dotnet CLI xUnit
Scala sbt build.sbt, project/plugins.sbt, .scalafmt.conf scalafmt, WartRemover sbt tasks ScalaTest
Clojure Leiningen project.clj Eastwood, Kibit, cljfmt Leiningen tasks clojure.test
Haskell Stack package.yaml, stack.yaml, .hlint.yaml HLint, stylish-haskell stack Hspec
Elixir Mix mix.exs Credo, Dialyxir mix tasks ExUnit

各言語の apps/ ディレクトリ構造

Python (apps/python/)

apps/python/
├── src/algorithm/          # プロダクションコード
├── tests/                  # テストコード
├── pyproject.toml          # uv + pytest + mypy 設定
├── .ruff.toml              # Ruff(リンター + フォーマッター)設定
└── tox.ini                 # タスクランナー(test/lint/type/format)

TypeScript (apps/node/)

apps/node/
├── src/algorithm/          # プロダクションコード
├── test/                   # テストコード
├── package.json            # npm 依存関係 + scripts
├── tsconfig.json           # TypeScript 設定
└── eslint.config.mjs       # ESLint 設定

Java (apps/java/)

apps/java/
├── src/main/java/algorithm/  # プロダクションコード
├── src/test/java/algorithm/  # テストコード
├── build.gradle              # Gradle ビルド + Checkstyle/PMD/SpotBugs
└── checkstyle.xml            # Checkstyle 設定

C# (apps/dotnet/csharp/)

apps/dotnet/csharp/
├── src/Algorithm/          # プロダクションコード
├── test/Algorithm.Tests/   # テストコード
├── Algorithm.sln           # ソリューションファイル
└── .editorconfig           # フォーマット設定

Ruby (apps/ruby/)

apps/ruby/
├── lib/algorithm/          # プロダクションコード
├── test/                   # テストコード
├── Gemfile                 # Bundler 依存関係
└── .rubocop.yml            # RuboCop 設定

PHP (apps/php/)

apps/php/
├── src/Algorithm/          # プロダクションコード(PSR-4)
├── tests/                  # テストコード
├── composer.json           # Composer 依存関係
└── phpunit.xml             # PHPUnit 設定

Go (apps/go/)

apps/go/
├── algorithm/              # プロダクションコード
├── go.mod                  # Go Modules
└── .golangci.yml           # golangci-lint 設定

Rust (apps/rust/)

apps/rust/
├── src/                    # プロダクションコード
├── tests/                  # 統合テスト
├── Cargo.toml              # Cargo 依存関係
└── rustfmt.toml            # rustfmt 設定

F# (apps/dotnet/fsharp/)

apps/dotnet/fsharp/
├── src/Algorithm/          # プロダクションコード
├── test/Algorithm.Tests/   # テストコード
├── Algorithm.sln           # ソリューションファイル
└── .editorconfig           # フォーマット設定(Fantomas)

Scala (apps/scala/)

apps/scala/
├── src/main/scala/         # プロダクションコード
├── src/test/scala/         # テストコード
├── build.sbt               # sbt ビルド + WartRemover
├── project/plugins.sbt     # sbt プラグイン(scalafmt 等)
└── .scalafmt.conf          # scalafmt 設定

Clojure (apps/clojure/)

apps/clojure/
├── src/algorithm/          # プロダクションコード
├── test/algorithm/         # テストコード
└── project.clj             # Leiningen プロジェクト設定

Haskell (apps/haskell/)

apps/haskell/
├── src/                    # プロダクションコード
├── test/                   # テストコード(Hspec)
├── package.yaml            # hpack 形式プロジェクト設定
├── stack.yaml              # Stack スナップショット設定
└── .hlint.yaml             # HLint 設定

Elixir (apps/elixir/)

apps/elixir/
├── lib/algorithm/          # プロダクションコード
├── test/                   # テストコード(ExUnit)
├── mix.exs                 # Mix プロジェクト設定
└── .credo.exs              # Credo 設定

執筆方針

Python 原本方式

参考元の Wiki 記事は 6 言語(Python, TypeScript, Go, Haskell, Clojure, F#)で存在するが、Python 版が最も完成度が高いため、以下の方針で進める。

  1. Python 版を原本として作成: Wiki の Python 記事を基に docs/article/python/ を執筆・実装する
  2. Python 版を基に多言語展開: 完成した Python 版の構成・コード例・解説を基準として、他 11 言語へ展開する
  3. 他の Wiki 記事は補助参照: TypeScript, Go, Haskell, Clojure, F# の Wiki 記事は、言語固有のイディオムや表現の参考として活用する(構成の基準にはしない)

展開順序

Python(原本)
  ├── OOP 言語: TypeScript → Java → C# → Ruby → PHP
  ├── システム言語: Go → Rust
  └── 関数型言語: F# → Scala → Clojure → Haskell → Elixir
  • OOP 言語は Python との構造的類似性が高いため、展開コストが低い
  • システム言語・関数型言語は言語固有の設計判断が必要なため、後半に配置

章構成

Wiki 記事の 9 章構成をそのまま維持する。各章はアルゴリズムとデータ構造のテーマごとに分かれており、TDD で段階的に実装する。

第 1 部: 基本(第 1〜3 章)

基本的なアルゴリズム、配列操作、探索の基礎を学ぶ。

テーマ 内容
1 基本的なアルゴリズム 3 値の最大値・中央値、条件判定と分岐、繰り返し処理、多重ループ
2 配列 配列の基本操作、配列の探索、要素の並べ替え
3 探索アルゴリズム 線形探索、二分探索、ハッシュ法

第 2 部: データ構造(第 4〜5 章)

スタック・キューと再帰アルゴリズムを学ぶ。

テーマ 内容
4 スタックとキュー スタックの概念と実装、キューの概念と実装
5 再帰アルゴリズム 再帰の基本、再帰と反復、再帰の応用

第 3 部: ソートと文字列(第 6〜7 章)

各種ソートアルゴリズムと文字列処理を学ぶ。

テーマ 内容
6 ソートアルゴリズム バブルソート、選択ソート、挿入ソート、クイックソート、マージソート
7 文字列処理 文字列の基本、文字列の探索、文字列の照合

第 4 部: 高度なデータ構造(第 8〜9 章)

リストと木構造を学ぶ。

テーマ 内容
8 リスト 線形リスト、連結リスト、循環リスト、双方向リスト
9 木構造 二分木、探索木、ヒープ

言語ごとのバリエーション

OOP 言語(手続き的・オブジェクト指向的アプローチ)

言語 特色
Java クラスベース OOP、コレクションフレームワーク
C# LINQ、ジェネリクス、パターンマッチング
TypeScript 静的型付き、Array メソッド、ジェネリクス
Python リスト内包表記、ジェネレータ、動的型付き
Ruby ブロック、Enumerable、動的型付き
PHP SPL データ構造、ジェネレータ

システム言語(メモリ管理・パフォーマンス志向)

言語 特色
Go スライス、ゴルーチン対応データ構造、シンプルな構文
Rust 所有権、ライフタイム、Iterator トレイト、安全なメモリ管理

関数型言語(関数型・イミュータブルアプローチ)

言語 特色
F# 判別共用体、パイプライン演算子、パターンマッチング
Scala sealed trait、case class、関数型コレクション
Clojure 永続データ構造、REPL 駆動、マルチメソッド
Haskell 代数的データ型、型クラス、遅延評価、モナド
Elixir パターンマッチング、パイプ演算子、BEAM 並行処理、イミュータブル

ファイル構成

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
│   ├── index.md
│   └── ...
├── node/                 # TypeScript
│   ├── index.md
│   └── ...
├── ruby/                 # Ruby
│   ├── index.md
│   └── ...
├── php/                  # PHP
│   ├── index.md
│   └── ...
├── go/                   # Go
│   ├── index.md
│   └── ...
├── rust/                 # Rust
│   ├── index.md
│   └── ...
├── csharp/               # C#
│   ├── index.md
│   └── ...
├── fsharp/               # F#
│   ├── index.md
│   └── ...
├── clojure/              # Clojure
│   ├── index.md
│   └── ...
├── scala/                # Scala
│   ├── index.md
│   └── ...
├── haskell/              # Haskell
│   ├── index.md
│   └── ...
├── elixir/               # Elixir
│   ├── index.md
│   └── ...
└── all/                  # 多言語統合解説
    ├── index.md
    └── ...

実装コードの配置

各言語の実装コードは apps/ ディレクトリに配置する。

apps/
├── java/                 # Java プロジェクト
├── node/                 # TypeScript プロジェクト
├── python/               # Python プロジェクト
├── ruby/                 # Ruby プロジェクト
├── php/                  # PHP プロジェクト
├── go/                   # Go プロジェクト
├── rust/                 # Rust プロジェクト
├── dotnet/               # C# / F# プロジェクト
├── clojure/              # Clojure プロジェクト
├── scala/                # Scala プロジェクト
├── haskell/              # Haskell プロジェクト
└── elixir/               # Elixir プロジェクト

Wiki 記事との対応

Wiki ファイル名 記事ファイル名
第 1 章 第1章_基本的なアルゴリズム.md 01-basic-algorithms.md
第 2 章 第2章_配列.md 02-arrays.md
第 3 章 第3章_探索アルゴリズム.md 03-search-algorithms.md
第 4 章 第4章_スタックとキュー.md 04-stack-and-queue.md
第 5 章 第5章_再帰アルゴリズム.md 05-recursion.md
第 6 章 第6章_ソートアルゴリズム.md 06-sort-algorithms.md
第 7 章 第7章_文字列処理.md 07-string-processing.md
第 8 章 第8章_リスト.md 08-lists.md
第 9 章 第9章_木構造.md 09-tree-structures.md

参考文献

  • 『新・明解 Python で学ぶアルゴリズムとデータ構造』 - 柴田望洋
  • 『テスト駆動開発』 - Kent Beck