テスト駆動開発から始めるプログラミング入門 AI時代の写経

構成

  • テスト駆動開発から始めるプログラミング入門
  • AI 時代の写経とは
  • GitHub Codespaces を使った環境
  • Agent Skills practicing-getting-start-tdd
  • 多言語学習スタイル
  • デモ
  • まとめ

テスト駆動開発から始めるプログラミング入門

FizzBuzz 問題を題材に、14 言語で同じ TDD サイクル(Red-Green-Refactor)を体験するシリーズ

  • 同じ仕様を異なる言語で実装し、**「何が同じで何が違うか」**を意識する
  • 言語ごとの設計思想と共通する本質を探求する
  • TDD は言語を超えた普遍的スキル

テスト駆動開発から始めるプログラミング入門 対象 14 言語

言語 環境 パラダイム
Java JVM OOP
JavaScript / TypeScript Node.js マルチ
Python CPython マルチ
Ruby CRuby OOP / FP
PHP PHP OOP
Go Go 構造化
Rust Rust マルチ
C# / F# .NET OOP / FP
Clojure JVM LISP / FP
Scala JVM OOP + FP
Elixir Erlang VM FP
Haskell GHC 純粋 FP

テスト駆動開発から始めるプログラミング入門 章構成

12 章 4 部構成。Red-Green-Refactor から関数型プログラミングへ段階的に深化

テーマ
第 1 部 TDD の基本サイクル 1. TODO リスト / 2. 仮実装と三角測量 / 3. 明白な実装
第 2 部 開発環境と自動化 4. Conventional Commits / 5. パッケージ管理 / 6. CI/CD
第 3 部 オブジェクト指向設計 7. カプセル化 / 8. デザインパターン / 9. SOLID
第 4 部 関数型プログラミング 10. 高階関数 / 11. 不変データ / 12. 型安全性
  • 第 1 部で TDD の基礎を全言語で体験
  • 第 2 部で開発の三種の神器(バージョン管理・テスト・自動化)を確立
  • 第 3 部で OOP のリファクタリング、第 4 部で FP への展開

AI 時代の写経とは

写経とは、教材のコードをそのまま書き写しながら、その意図を体に染み込ませる古典的な学習法

  • 昔の写経: 紙の本を見ながら独学、詰まったら検索
  • AI 時代の写経: AI がガイド役として横にいる
    • コード提示・記述方法の選択(手動 / 自動)
    • ヒントを段階的に出す(方向性 → 構造 → 一部 → 解答)
    • つまずきに合わせてペース調整

AI 時代の写経の核心

観点 従来の独学 AI 時代の写経
教材 紙の本・固定 14 言語横断・対話的
環境構築 都度試行錯誤 Codespaces + Nix で即起動
ペース 自分次第(中断しがち) AI が伴走、つまずき検知
ヒント 検索・コピペ 段階的(方向性 → 解答)
振り返り 任意 章末で KPT を必ず実施

コードを書くのは「ユーザー自身」

  • AI は教えるのではなく一緒に学ぶ姿勢
  • 答えを見せても**「なぜそうなるか」**の理解を促す
  • 学習効果を高めるなら手動記述(推奨)、テンポ重視なら自動記述

開発ライフサイクルの中の位置づけ

  • 分析・開発・運用のサイクルのうち、今回は開発フェーズにフォーカス
  • 開発フェーズの中核 = コーディングとテスト
  • TDD は変更を楽に・安全にできるソフトウェアを作る規律

開発ライフサイクル コーディングとテストの流れ

  • イテレーション計画 → ユーザーストーリー → コーディングとテスト → レビュー
  • 「コーディングとテスト」の中で Red-Green-Refactor を繰り返す
  • 写経で身につけたいのは、まさにこのサイクルそのもの

GitHub Codespaces を使った環境

クラウド上の開発環境。devcontainer に Nix が設定済みで、14 言語の開発環境が即座に利用可能

  • OS / ローカル環境に依存しない: Windows / macOS / Linux すべてブラウザだけで OK
  • 言語ごとの flake: nix develop .#java.#python.#node …で切替
  • Claude Code 同梱: AI がそのまま手元で使える

GitHub Codespaces ローカル環境との比較

項目 ローカル(Before) Codespaces(After)
環境構築 OS 別に手順が違う、数時間 クリック 1 つ、数分
言語切替 別途インストール nix develop .#{lang}
共有 「私の PC では動く」問題 全員同じ devcontainer
教材コード clone・パス設定が必要 起動時点で配置済み
AI アシスタント 別途セットアップ Claude Code 同梱

Windows ユーザーへの推奨

  • 第一推奨: Codespaces(環境差を完全に消せる)
  • ローカルなら: WSL + Nix(教材の動作例ともっとも齟齬が少ない)
  • WSL 不可なら: Scoop で各言語を直接インストール

Agent Skills とは

  • Agent Skills: AI に専門知識を与える仕組み
  • SKILL.md ファイルに指示を記述 → タスクに応じて自動発動
  • ユーザーの自然言語の依頼から、AI が適切な SKILL を選択して実行

過去のノウハウ・進め方をSKILL 化することで、誰がどの環境で実行しても一貫した体験を提供できる

Agent Skills practicing-getting-start-tdd

---
name: practicing-getting-start-tdd
description: 「テスト駆動開発から始めるプログラミング入門」の対話式チュートリアル
---

このスキルが提供するもの

要素 内容
教材 docs/article/getting-start-tdd/ 14 言語 × 12 章
進行 対話式の Red-Green-Refactor サイクル
環境構築 Codespaces / WSL+Nix / Scoop の選択肢を提示
ヒント段階 方向性 → 構造 → コード片 → 完全解答
振り返り 章末で KPT(Keep / Problem / Try)
  • ユーザーが「TDD で FizzBuzz を学びたい」と言うだけで起動
  • ガイド役に徹し、コードを書くのはユーザー自身

Agent Skills SKILL の進行ルール

  • コード配置ルール: apps/{lang}/ 配下に言語ごとに分離
  • 一度にすべてを見せず、1 ステップずつ課題を出す

Agent Skills ヒントの段階

ユーザーが詰まった場合、答えをすぐに出さず段階的にヒントを出す

段階 例(FizzBuzz の 3 の倍数判定)
1. 方向性 「3 の倍数を判定するには、どの演算子が使えそうですか?」
2. 構造 if 文と剰余演算子(%)を組み合わせてみましょう」
3. コード片 number % 3 == 0 という条件式を使えます」
4. 完全解答 教材のコードを提示し、なぜそうなるかを解説

対話のトーン

  • 励ましと好奇心を持って接する
  • 間違いを責めず、なぜそうなるかを一緒に考える
  • TDD 書籍からの引用を適宜挟み、理論的背景を伝える
  • ユーザーのペースに合わせる

多言語学習スタイル

推奨学習順序: 3 フェーズ

フェーズ 言語 期間目安
1. OOP の基盤 Java → Python 3-5 週間
2. マルチパラダイム TypeScript → Ruby → Go / Rust 5-9 週間
3. FP への展開 F# → Scala → Elixir or Clojure → Haskell 7-12 週間

すべて深く学ぶ必要はなく、2-3 言語を深く、残りは概要を理解

多言語学習スタイル 効果的な学習テクニック

テクニック 内容
比較学習 同じ FizzBuzz 仕様を 2 つの言語で実装し、差分を分析
段階的深化 基本 → OOP リファクタリング → FP リファクタリング
リンター活用 リンターの指摘 = その言語のベストプラクティス
テストから読む 新言語のコードはテストファイルから読み始める
章末 KPT Keep / Problem / Try で学びを言語化

多言語学習スタイル 各言語で「最も学べる」概念

概念 最適な言語 理由
Red-Green-Refactor Java, Python シンプルな構造で本質に集中
カプセル化・デザインパターン Java, C# アクセス修飾子と GoF が直接適用
所有権・型安全性 Rust 言語仕様としてメモリ安全性を担保
パターンマッチング F#, Scala, Elixir, Haskell 言語レベルでサポート
モナド・型クラス Haskell 最も純粋な実装
不変データ・REPL 駆動 Clojure, Elixir デフォルトで不変、対話開発が中心

多言語学習スタイル 同じ FizzBuzz でも違う表情(OOP 系 / Java)

// Java — if 文 + 早期 return
public String convert(int number) {
    if (number % 15 == 0) return "FizzBuzz";
    if (number % 3  == 0) return "Fizz";
    if (number % 5  == 0) return "Buzz";
    return String.valueOf(number);
}
  • 静的型付け + クラスのメソッドとして表現
  • 早期 return で条件分岐をフラットに保つのが Java らしい書き方
  • JUnit 5 で assertEquals("Fizz", target.convert(3)) のように検証

多言語学習スタイル 同じ FizzBuzz でも違う表情(OOP 系 / Python)

# Python — 動的型付けで簡潔に
def fizz_buzz(n: int) -> str:
    if n % 15 == 0: return "FizzBuzz"
    if n % 3  == 0: return "Fizz"
    if n % 5  == 0: return "Buzz"
    return str(n)
  • 動的型付けで1 行 if が許容され、ノイズが少ない
  • 型ヒント(int -> str)でドキュメント性も担保できる
  • pytest で assert fizz_buzz(3) == "Fizz" のように検証
  • OOP / 命令型は 「条件 → 値」 のフローが直線的
  • AI と一緒に差分を考えると理解が深まる

多言語学習スタイル 同じ FizzBuzz でも違う表情(FP 系)

// Rust — match + タプル
match (n % 3, n % 5) {
    (0, 0) => "FizzBuzz".to_string(),
    (0, _) => "Fizz".to_string(),
    (_, 0) => "Buzz".to_string(),
    _      => n.to_string(),
}
-- Haskell — パターンマッチング + ガード
fizzBuzz n
  | n `mod` 15 == 0 = "FizzBuzz"
  | n `mod`  3 == 0 = "Fizz"
  | n `mod`  5 == 0 = "Buzz"
  | otherwise       = show n
  • FP 系は 「値の分類」 をデータ構造の網羅性で表現
  • 同じ仕様でも、言語の設計思想がコードの形に表れる

デモ

practicing-getting-start-tdd SKILL を使ったチュートリアル体験

デモ内容

  1. 環境準備: Codespaces 起動 → nix develop .#java
  2. SKILL 発動: 「TDD で FizzBuzz を Java で学びたい」
  3. 章選択: 第 1 章「TODO リストと最初のテスト」
  4. Red: 失敗するテストを SKILL の指示に従って書く
  5. Green: 仮実装でテストを通す
  6. Refactor: 改善ポイントの解説とリファクタ
  7. KPT 振り返り: Keep / Problem / Try をまとめる

まとめ

  • TDD は言語を超えた普遍的スキル — Red-Green-Refactor のサイクルは 14 言語で共通
  • AI 時代の写経 = 教材 + AI ガイド + 自分の手で書く体験
  • 環境はもう障壁ではない — Codespaces + Nix で即起動、誰でも同じ環境
  • SKILL 化されたノウハウ — 進行ルール・ヒント段階・KPT が再現可能
  • 多言語比較で本質が見える — 同じ FizzBuzz が言語の設計思想を映す

まとめ Before / After

観点 Before After(AI 時代の写経)
教材 紙の本・固定言語 14 言語横断・対話的
環境構築 OS 別に試行錯誤、数時間 Codespaces で数分
ペース 独学・中断しがち AI が伴走、つまずき検知
ヒント 検索・コピペ 段階的(方向性 → 解答)
振り返り 任意・忘れがち 章末 KPT が標準
多言語学習 言語ごとに別教材 同じ題材で差分に集中

まとめ ただし...

  • コードを書くのはユーザー自身
    AI は「教える」のではなく「一緒に学ぶ」姿勢で進む
  • 「なぜそうなるか」の理解が学習の本質
    解答だけ見ても身につかない。AI に問い返す習慣を持つ
  • 規律が「変更を楽に安全にできて役に立つ」よいソフトウェアを作る
    TDD はその核心。AI 時代でも変わらない

写経は手段。目的は自分のものにすること。

参考