📖

Claude Codeを使ったおすすめ勉強法

に公開

Claude Codeの登場で学びの時間が減った

Claude Codeが便利すぎて、もう手放せません。
ただし、Claude Codeを使えば使うほど「自分でコーディングする機会」は激減しました。
それが悪いとは断言しづらいですが、一つ言えるのは「私のような中途半端にプログラミングを学んだ人間にとって勉強の機会が減ることは致命的」ということです。

Claude Codeの/output-styleLearningを選ぶことでユーザーの学習をサポートできなくはないのですが、個人的に試した印象としては「身につけるための学習」とはちょっと違うかな?と感じました。

では「身につけるための学習」とはどういった学習か。
これも個人的な意見ですが「反復練習」「能動的な調査・試行錯誤」が非効率的であっても有効だと思っています。
一番勉強していたとき、つまり学生時代を思い返すと「繰り返し問題集を解く」「わからないときは書籍で調べる・先生に聞く」が当たり前だったので、それを模倣すれば私にとってプログラミングやいろんなツールの使い方も「身につく」と考えました。
ただし、当時とは時間も体力も限られているので、できるだけ効率的に、それでいて効果的な方法にアレンジする必要があります。

Claude Codeに「間違った」課題を作ってもらう

そこで考えたのがClaude Codeに短時間でできる課題を作ってもらうことです。これは「反復練習」を目的としているので、「朝メールチェックのあとに15分くらいで解ける内容」を意識して作ってもらいました。またDay 1に学んだ知識をDay 2の課題で多少なりとも復習できる構成を意識しました(まぁ意識して作ったのはClaude Code様なのですが)。

そしてあえてちょっとだけ間違っている課題を作ってもらうようにしました。これは最初は意識したわけではなく、たまたまGitコマンドの勉強教材を作ってもらったときに、Claude Codeが提示した操作手順通りに操作してもエラーが起きたことが発端です。
エラーの解消のために公式ドキュメントやZennの記事を読んだり、ChatGPTにエラーを投げたりして問題を解決したのですが、その一連の過程こそが学習の重要な要素の一つだと改めて実感しました。
当たり前といえば当たり前ですが、ChatGPT登場以降、すぐに正解にたどり着けることが増えてきたせいでこういう地道な調査が疎かになっていることを今更ながら反省しました。

ということで、万人に有効な方法ではないのですが、私のようなClaude Codeによる勉強機会の減少に危機感を感じている人コードやコマンドを覚えることが苦手な人は一つの選択肢としてこの勉強法を参考にしてもらえると嬉しいです。

例:Gitコマンドを覚えるための教材の作り方

では、「Gitコマンド」を勉強する教材を例に、どのように作成したかを共有します。
まず、以下のようにコンセプトを固めました。

  • Claude Codeでアプリを開発する際によく使うGitコマンドを優先する
  • 実際に困った事例を課題に加える
  • 短時間で解ける(あるいは写経できる)量にする
  • 未経験の機能・操作も学べる教材にする
  • 今後も当分使わない機能・操作は対象外とする

受験勉強と同じです。要は「テストに出やすい問題を優先して解く」「間違えた問題はもう一度解く」「テストに出そうだけど解いたことない問題は解く」です。

上記のコンセプトを意識して、現在作成中のアプリを開発しているレポジトリ内でClaude Codeに対して以下の指示を出しました。

prompt
このレポジトリでアプリを開発する過程でよく使っているGitコマンドを集計してください。その後、よく使うGitコマンドを覚えるための教材を作る作業を手伝ってください。

その後、集計結果を見ながら適宜追加の条件を追加していきます。参考までに私は以下の指示を追加しました。

prompt
# 教材作成の追加指示
- 個人開発者向けの教材にしてください。
- 教材は15分程度で解ける(写経できる)量に分割してください。
- Github flowのブランチ戦略を意識して教材を作成してください。
- Claude Codeとgit worktreeを組み合わせることで開発効率が上がるという記事をzennで見かけました。情報を収集し、Claude Code × git worktreeでgit worktreeを学べる教材も作成してください。
- 教材中のgitコマンドの一部に、古いコマンドや誤ったコマンドを含めてください。古いコマンドや誤ったコマンドは20%以下としてください。

もう少し丁寧に指示を出すべきかもしれませんが、案外これくらい雑な指示でも期待値に達する教材は作ってくれました。
作成された教材の一部を紹介します。

ディレクトリ構造
git-practice/
├── README.md
├── 1_switch_merge_tag/
│   ├── README.md
│   ├── reset.sh
│   └── setup.sh
├── 2_worktree/
│   ├── README.md
│   ├── reset.sh
│   └── setup.sh
├── 3_reset_revert/
│   ├── README.md
│   ├── reset.sh
│   └── setup.sh
├── 4_pull_request_flow/
│   ├── README.md
│   ├── reset.sh
│   └── setup.sh
├── 5_conflict_resolution/
│   ├── README.md
│   ├── reset.sh
│   └── setup.sh
└── 6_github_actions_claude/
    ├── README.md
    ├── reset.sh
    └── setup.sh
1_switch_merge_tag/README.mdの一部

# Git操作ハンズオン - 毎日練習

## 📋 このハンズオンについて

このハンズオン環境は、**実際のGit開発ワークフローを毎日練習**するためのものです。

### 目的

以下のGitワークフローを体で覚える:
1. 新機能開発のためにブランチ作成
2. 完成したのでmainにマージ
3. タグを付けてリリース
4. 新しい機能を作るので新ブランチ作成
5. 古いブランチの削除

### 特徴

✅ **毎日リセット可能** - `bash reset.sh`で初期状態に戻る
✅ **現プロジェクトに影響なし** - 完全に独立した環境
✅ **実践的な練習** - 実際のワークフローを再現
✅ **失敗しても安心** - 何度でもやり直せる

---

## 🚀 クイックスタート

### 初回セットアップ

# 1. このディレクトリに移動
cd /workspace/git-practice

# 2. 練習環境を作成
bash setup.sh

# 3. sample-app/に移動
cd sample-app

# 4. 現在の状態を確認
git log --oneline --graph --decorate
git tag

# 5. Day 1の練習を開始(下記参照)

### 2日目以降

# 1. 環境をリセット
cd /workspace/git-practice
bash reset.sh

# 2. sample-app/に移動
cd sample-app

# 3. 練習開始

---

## 📚 練習カリキュラム

### Day 1: 基本ワークフロー(機能開発 → マージ → タグ → 新ブランチ → 削除)

**目標**: 電卓に引き算機能を追加し、v0.4としてリリース

#### ステップ1: 現在の状態を確認

# ブランチを確認(mainブランチにいることを確認)
git branch

# コミット履歴を確認
git log --oneline --graph --decorate

# タグを確認(v0.1, v0.2, v0.3があるはず)
git tag

**期待される状態**:
* commit3 (HEAD -> main, tag: v0.3) fix: main.pyでutils関数を使用するように修正
* commit2 (tag: v0.2) feat: 掛け算と割り算機能を追加
* commit1 (tag: v0.1) feat: 初期リリース

#### ステップ2: 新機能ブランチを作成

# feature/add-subtractionブランチを作成して切り替え
git checkout feature/add-subtraction

# ブランチを確認(*が feature/add-subtractionに付いているはず)
git branch

#### ステップ3: 引き算機能を実装
以下略
・
・
・

例えばステップ2のgit checkout feature/add-subtractionを見たときに、「あれ、最近の書き方だとgit switch -cじゃなかったっけ?」と気づき、ZennやChatGPTで「なぜgit checkoutじゃなくてgit switch -cが推奨されるのか?」を自分で調べ、理解してからREADME.mdを自分で修正するところまでが一連の流れです。

その他にも後続のステップでREADME.md通りに進めるとconflictする箇所など、過去に自分が実際に経験したトラブルを盛り込んでいます。なお、過去に自分が実際に経験したトラブルもClaude Codeが抽出してくれました(Claude Codeにトラブルシューティングを依頼したことが何度もあるのでおそらくそこからとってきてくれてると思われます)。

各フォルダ内のsetup.shは環境のセットアップを行い、reset.shは環境を初期化する役目を担っており、何度もやり直しできる仕様にしています。

setup.sh
#!/bin/bash

# =============================================================================
# Git Practice Environment Setup Script
# =============================================================================
# このスクリプトはGit操作を練習するための環境を自動的にセットアップします。
#
# 作成されるもの:
# - sample-app/ ディレクトリ
# - Gitリポジトリ
# - 初期ファイル (main.py, utils.py, README.md)
# - 初期コミット × 3
# - タグ v0.1, v0.2, v0.3
#
# 使い方:
#   bash setup.sh
# =============================================================================

set -e  # エラーが発生したら停止

# カラー出力用
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE}Git Practice Environment Setup${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""

# 現在のディレクトリを確認
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"

# 既にsample-appが存在する場合は警告
if [ -d "sample-app" ]; then
    echo -e "${YELLOW}⚠️  sample-app/ ディレクトリが既に存在します。${NC}"
    echo -e "${YELLOW}   リセットする場合は、reset.sh を実行してください。${NC}"
    echo ""
    echo -e "${YELLOW}   削除して再作成しますか? (y/N):${NC} "
    read -r response
    if [[ ! "$response" =~ ^[Yy]$ ]]; then
        echo "セットアップを中止しました。"
        exit 0
    fi
    echo -e "${YELLOW}   sample-app/ を削除します...${NC}"
    rm -rf sample-app
fi

# Step 1: ディレクトリ作成
echo -e "${GREEN}✓${NC} Step 1: sample-app/ ディレクトリを作成"
mkdir -p sample-app
cd sample-app

# Step 2: Git初期化
echo -e "${GREEN}✓${NC} Step 2: Gitリポジトリを初期化"
git init
git config user.name "Git Practice User"
git config user.email "practice@example.com"

# Step 3: 初期ファイル作成 (v0.1)
echo -e "${GREEN}✓${NC} Step 3: 初期ファイルを作成 (v0.1)"

cat > README.md << 'EOF'
# Sample App

シンプルな計算アプリケーション

## 機能

- 基本的な計算機能
- ユーティリティ関数

## 使い方

```bash
python main.py
```

## バージョン履歴

- v0.1: 初期リリース
EOF

cat > main.py << 'EOF'
#!/usr/bin/env python3
"""
Sample App - Main Program
"""

def main():
    print("Welcome to Sample App v0.1!")
    print("This is a simple calculator application.")

if __name__ == "__main__":
    main()
EOF

cat > utils.py << 'EOF'
"""
Utility Functions
"""

def greet(name):
    """挨拶を返す"""
    return f"Hello, {name}!"
EOF

git add .
git commit -m "feat: 初期リリース

- メインプログラムの作成
- ユーティリティモジュールの追加
- READMEの作成"

git tag -a v0.1 -m "Release v0.1: 初期リリース"
echo -e "${BLUE}   → v0.1 タグを作成${NC}"

# Step 4: 機能追加 (v0.2)
echo -e "${GREEN}✓${NC} Step 4: 機能追加 (v0.2)"

cat > utils.py << 'EOF'
"""
Utility Functions
"""

def greet(name):
    """挨拶を返す"""
    return f"Hello, {name}!"

def multiply(a, b):
    """掛け算"""
    return a * b

def divide(a, b):
    """割り算"""
    if b == 0:
        raise ValueError("0で割ることはできません")
    return a / b
EOF

# README更新
cat > README.md << 'EOF'
# Sample App

シンプルな計算アプリケーション

## 機能

- 基本的な計算機能
  - 掛け算
  - 割り算
- ユーティリティ関数

## 使い方

```bash
python main.py
```

## バージョン履歴

- v0.2: 計算機能追加(掛け算、割り算)
- v0.1: 初期リリース
EOF

git add .
git commit -m "feat: 掛け算と割り算機能を追加

- multiply関数の実装
- divide関数の実装(ゼロ除算エラー処理付き)
- READMEの更新"

git tag -a v0.2 -m "Release v0.2: 計算機能追加"
echo -e "${BLUE}   → v0.2 タグを作成${NC}"

# Step 5: バグ修正 (v0.3)
echo -e "${GREEN}✓${NC} Step 5: バグ修正 (v0.3)"

cat > main.py << 'EOF'
#!/usr/bin/env python3
"""
Sample App - Main Program
"""
from utils import multiply, divide

def main():
    print("Welcome to Sample App v0.3!")
    print("This is a simple calculator application.")

    # サンプル計算
    print(f"\n5 × 3 = {multiply(5, 3)}")
    print(f"10 ÷ 2 = {divide(10, 2)}")

if __name__ == "__main__":
    main()
EOF

git add .
git commit -m "fix: main.pyでutils関数を使用するように修正

- multiply, divide関数のインポート
- サンプル計算の実行"

git tag -a v0.3 -m "Release v0.3: バグ修正"
echo -e "${BLUE}   → v0.3 タグを作成${NC}"

# 完了メッセージ
cd ..
echo ""
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}✓ セットアップ完了!${NC}"
echo -e "${GREEN}========================================${NC}"
echo ""
echo "練習環境が準備できました!"
echo ""
echo -e "${BLUE}📁 作成されたもの:${NC}"
echo "  - sample-app/ ディレクトリ"
echo "  - Gitリポジトリ(初期化済み)"
echo "  - 3つのコミット"
echo "  - 3つのタグ (v0.1, v0.2, v0.3)"
echo ""
echo -e "${BLUE}📝 次のステップ:${NC}"
echo "  1. README.md を読んで練習内容を確認"
echo "     → cat README.md"
echo ""
echo "  2. sample-app/ ディレクトリに移動"
echo "     → cd sample-app"
echo ""
echo "  3. 現在の状態を確認"
echo "     → git log --oneline --graph --decorate"
echo "     → git tag"
echo ""
echo "  4. README.md の手順に従って練習開始!"
echo ""
echo -e "${YELLOW}💡 ヒント:${NC}"
echo "  - 何度でもやり直せます: bash reset.sh"
echo "  - 各ステップで git status, git log で状態確認"
echo ""

reset.sh
#!/bin/bash

# =============================================================================
# Git Practice Environment Reset Script
# =============================================================================
# このスクリプトは練習環境を初期状態にリセットします。
# sample-app/ を削除して、setup.shを実行します。
#
# 使い方:
#   bash reset.sh
# =============================================================================

set -e  # エラーが発生したら停止

# カラー出力用
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color

echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE}Git Practice Environment Reset${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""

# 現在のディレクトリを確認
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"

# sample-appが存在するか確認
if [ ! -d "sample-app" ]; then
    echo -e "${YELLOW}ℹ️  sample-app/ ディレクトリが存在しません。${NC}"
    echo -e "${YELLOW}   新規セットアップを実行します。${NC}"
    echo ""
else
    echo -e "${RED}⚠️  sample-app/ ディレクトリを削除します。${NC}"
    echo -e "${RED}   すべてのデータが失われますが、よろしいですか? (y/N):${NC} "
    read -r response
    if [[ ! "$response" =~ ^[Yy]$ ]]; then
        echo "リセットを中止しました。"
        exit 0
    fi

    echo -e "${GREEN}✓${NC} sample-app/ を削除中..."
    rm -rf sample-app
    echo -e "${GREEN}✓${NC} 削除完了"
    echo ""
fi

# setup.shを実行
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE}セットアップを開始${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""

if [ -f "setup.sh" ]; then
    bash setup.sh
else
    echo -e "${RED}❌ setup.sh が見つかりません。${NC}"
    exit 1
fi

echo ""
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}✓ リセット完了!${NC}"
echo -e "${GREEN}========================================${NC}"
echo ""
echo "練習環境が初期状態に戻りました。"
echo "README.md を読んで、練習を開始してください!"
echo ""

感想

現在、Git、Docker、LangGraph の教材を作成し、一日ごとに教材を切り替えながら勉強しています。特にGitコマンドやDockerコマンドのような、記述量の少ないものに向いている勉強法だと思いました(単語や文法を覚えるような感覚に似ていて、何度も似たコマンドをタイプすることになるのでこの勉強法と相性が良い)。

一方で、これらはもともとベースの知識が0ではないものばかりなので、例えば全く使ったことのないプログラミング言語の勉強などに向いているかは未検証です。
ちょうどアプリ開発でTypeScriptを覚えようと思っていたところなので、この勉強法はベース知識0の分野にも向いているかを冬休みにでも検証しようと思います。

Discussion