Open2
【作業ログ】どう作ろう3_ゲームから始まるタスク管理ツール
やったこと
ゲームコンテンツの作成とテスト
- great, good, failゾーン生成
- 各ゾーンランダム生成
- バー進行
実装の作業内容と作業時間
このアプリの総制作時間は8Hで設定したところ、現段階で8H経過。
原因
TDDによる開発手法を知らない、分からない、慣れていない
時間経過による問題
価値があるか分からないものにコストを掛けている
対策と方向転換
- 学習に比重を置き、時間がかかることはあきらめる(今後の開発時間短縮のための投資)
- 自前でコードを読み書きすることに、時間制限を設ける。以降はChatGPTによるコード生成に頼る(が、理解することには時間をかける)
考えたこと
ChatGPTによるコード生成の恐怖
- 簡単なプロンプトで自分の力量以上のコードが作れてしまう
- さらにそのコード読んでいくとまるで理解したかのように感じてしまう
👉実際に同じものを書こうとすると書けない(本当の理解に達していない)ため、学習目的としては問題あり。 - もちろんこれはChatGPTの使い方に問題あり。もっと深い理解へ到達するための使い方をしなければならない。
- また単純にCSの基礎学習は常に必須
次にやること
ゲームコンテンツの作成とテスト
- ゲーム画面の描画
- ゲームコントローラー
- スコア計算
ChatGPTによるフィードバック
いいまとめです —思考が整理されていて、問題認識・原因・対策まで一貫しているのが素晴らしいです。以下、妥当性の評価・批判(改善点)・発展のための水平思考的アイデア(創発案)、そして**具体的な次アクション(実務)**を出します。ChatGPTを学習補助に使うための「安全な使い方」やTDDを学ぶための実践プランも含めます。長めですが実践で使える内容に絞りました。
1) 現状評価(妥当性)
- 問題把握:TDDに慣れていない → 妥当。TDDは習得に時間がかかるし、最初は遅く感じるのが普通です。
- 対策の方針(学習に比重/ChatGPTに生成補助を頼る)は合理的:学習投資で将来の速度向上を図るのは正しい選択。ただし「以降はChatGPTに頼る(理解は続ける)」の運用ルールが曖昧だと、理解不足のまま依存してしまうリスクがあります。
- 時間管理の問題認識(価値不確実な作業にコストを掛けている):的確。早期に小さく価値検証(MVP)すると良い。
2) 建設的批判(改善点・注意点)
-
学習に“全部”振るのはやりすぎる危険
- 学習も重要だがプロダクトを少しずつ動かす(リリースableな小さなインクリメント)ことはモチベーション維持とフィードバック獲得に必須。
-
ChatGPT生成コードの“受け取り方”が弱い
- 「動いた」=「理解した」ではないという自己認識は正しい。だが放置すると技術負債になる。生成されたコードを自分で改変して壊して直す訓練を必ず組み込むべき。
-
TDDを学ぶ方法が不明瞭
- 単に「TDDを学ぶ」と言うだけでなく、非常に小さな機能単位で学ぶ(例:バーがクリックで止まる)ことを推奨。
3) 実践的アドバイス(すぐ出来ること・やり方)
以下は「学びながら前に進む」ための具体アクション群。どれも今のゲームに直接応用できます。
A. ミニTDDサイクル(1機能の例)
対象:クリックでバーを止める機能(まずはこれだけをTDDで作る)
-
Fail(赤)を書く(テストを書く)
- テスト例(pseudo / Jest + DOM):
test('クリックでバーが停止する', () => {
// 初期化
const bar = new ProgressBar();
bar.start();
// クリック(シミュレーション)
bar.clickStop();
expect(bar.isMoving()).toBe(false);
});
-
Green(実装して通す)
- 最小限の実装(start, clickStop, isMoving)だけ実装してテストを通す。
-
Refactor(改善)
- コードをリファクタ、命名改善、重複排除、もう一度テスト確認。
ポイント:最初はDOMを直接触らず、**ロジック部分(純粋関数・クラス)**を先にテストする。DOM連動はその後で結びつける。
B. 具体的に書くべきテスト群(優先順位)
-
ゾーン生成ロジック
- 各生成で
great/good/failの割合が期待範囲に入る - 隣接ゾーンが重ならない/最小幅を保つ
- 各生成で
-
バー進行ロジック
- 進行は一定速度で増える(シミュレーションで増分を検証)
- 端まで到達したら
failと判定
-
停止操作とスコア
- クリックで停止 -> zone 判定 -> スコア反映
- 連続クリックでスコアが二重に入らない
-
再現性(テスト向け)
- RNGにシードを入れて deterministic に(テストが安定)
C. ChatGPTを“教育ツール”として安全に使うワークフロー
-
テストファーストのプロンプトを出す
- 「この機能のためのJestテストをまず書いて。テストが失敗する状態で出力して」→そのテストを実行・確認。
-
小刻みに実装させる
- 「最低限の実装だけを書いて。次にリファクタ案を出して」→自分でリファクタを試す。
-
コードの意図説明を求める
- 「この関数は何をしている?1行ずつ日本語で説明して」→理解チェック。
-
誤りを意図的に入れさせる
- 「この実装にバグを一つ入れて。どこを直すべき?」→デバッグ訓練。
-
再実装課題
- 生成コードを“いったん閉じて”自分で同じ機能を実装してみる(タイマー or 控えめな制約付き)。
D. 学習・理解を深めるための“アクティビティ”
- リバースエンジニアリング:ChatGPT生成コードを一度手でコメントアウトし、各ブロックの役割を日本語で書く。
- コード・カラオケ:声に出してコードを説明しながら書く(Rubber ducking の進化形)。
- 写経+変形:生成コードを写経した後、変数名/アルゴリズムを変更して同じ動作を保てるか確かめる。
- ペアプログラミングの疑似体験:ChatGPTに「あなたはペアの相手。僕が書いたコードのレビュー15行以内で改善点3つ挙げて」と指示する。
4) 次にやること(実務的チェックリスト)
(時間は示しません — ユーザーのペースで進めてください)
-
ゲーム画面の最小描画(まずは見える形で動くもの)
- プレイフィールド、バー、ゾーン(視覚的に分かる)を描く(canvas or DOM)。
- 描画はロジックと分離(
RendererとGameLogic)。
-
ゲームコントローラー(入力)
- 入力イベント(クリック/キーボード)を
Controllerが受け取り、GameLogicに伝える設計。 -
Controllerはテスト可能にする(イベントの”シミュレーション呼び出し”で動作確認)。
- 入力イベント(クリック/キーボード)を
-
スコア計算と表示
-
ScoreManagerを作る(得点ルールは関数化して単体テストを用意)。 - スコア表示は
Rendererが参照するだけ。
-
-
テスト第一で1機能ずつ
- 上の「ミニTDDサイクル」を繰り返す。ゾーン生成→バー移動→停止→スコア。
-
テスト環境を整える
- Jest + jsdom(フロントロジック)か、もし純粋ロジックなら Node 環境でテスト。
-
CI(任意)
- GitHub Actions 等で
npm testが動くようにしておくと成長を視覚化できる。
- GitHub Actions 等で
5) 水平思考的(発展)アイデア — 斜め上を行く提案
- ゾーン・エディタを作る:エディタ画面でゾーン位置を手でセット → 保存 → テスト用シナリオを作る。学習とデバッグが捗る。
- シード付き再生機能:RNGにシードを入れ、同じシードで再現できるデバッグモード(テスト安定化に有効)。
-
難易度自動設計:プレイヤーの失敗率に応じて
great/good/failの幅を動的に調整する実験をしてみる(A/Bテスト)。 - 可視化ツール:時間軸でバー位置・ゾーン位置をプロットするデバッグビュー(問題箇所が一目で分かる)。
- プロパティベーステスト(fast-check等):色んなランダム入力で仕様が壊れないかを検証する。
- Accessibility / Keyboard-first:モバイルだけでなくキーボード操作やスクリーンリーダ対応を早めに考えると良い。
6) ChatGPTに投げるべき具体プロンプト(テンプレ)
- 「Jestで『クリックでバーが止まる』テストを書いてください。DOM操作は最小限にしてクラス
ProgressBarのメソッドだけテストする形で。失敗テストを見せてください。」 - 「上のテストを通すための最小実装(
ProgressBar)をES6クラスで作って。各メソッドを日本語で1行ずつ説明して。」 - 「生成された実装に意図的にバグを入れて。それを修正するためのデバッグ手順(console.logをどこに置くか)を示して。」
- 「この
ZoneGeneratorのロジックを、RNGシード対応で deterministic に書き換えて。サンプルシードで期待出力を教えて。」
7) 最後に — まとめ(要点)
- あなたの方針(学習に比重を置く)は合理的。ただし小さく動く成果物を同時並行で残すこと(学習のモチベ維持と価値検証)を強く推奨します。
- ChatGPTは「コードを作る先生」ではなく「コーチ兼短期アシスタント」として使うと学習効果が高い:テストを書かせる → 実装させる → 説明させる → 自分で再実装 のループを回してください。
- 実務的には「Renderer / GameLogic / Controller / ScoreManager / ZoneGenerator」の責務分離をまず行い、各モジュールを小さくテストしていくと失敗が見えにくくならず学べます。