マガジン

変更履歴を残さずに作り続けると、どこで戻れなくなるのか:再現実験の設計書

遊びをつくる

執筆にClaudeを使用しています。

小さなゲーム模型を四つの試験コースで動かし、修正を確かめる机。
記事のテーマをもとに制作したAI生成イラスト。

ゲームを作っていて、「さっきの方がよかった」と思う場面を考えてみます。的の動きを速くしたら忙しすぎて、数分前の速さに戻したい。ところが、数分前の値が何だったのか思い出せません。保存はずっと上書きだったので、ファイルのどこにも残っていません。この瞬間が、題名の「戻れなくなった瞬間」です。 この記事は、その瞬間を自分の手元で意図的に再現し、「いつ起きるのか」「戻るのにどれだけの手間がかかるのか」を数字で確かめるための設計書です。結果は書きません。結果は、読者が実際に行った記録から出ます。 確かめたいのは感想ではなく、次の二点です。一つは、履歴なしで変更を重ねたとき、戻したい状態の再現にかかる時間が変更回数とともにどう増えるか。もう一つは、同じ変更列を履歴ありで行うと、その時間がどう変わるかです。

この記事の目次
  1. 「戻れなくなった瞬間」を測れる形に定義する
  2. 準備するもの
  3. 手順:履歴を残さない10ラウンド
  4. 記録の取り方と結果の読み方
  5. 起こりやすい誤り
  6. 次の行動

「戻れなくなった瞬間」を測れる形に定義する

「戻れなくなった」は気分の言葉なので、そのままでは記録できません。実験の前に、次のような操作的な定義を決めておきます。

  • 定義A:戻したい状態を言葉では説明できるが、コードや数値として再現できない。
  • 定義B:再現に着手してから一定時間(例として10分)が経っても、元の挙動と一致したと確認できない。

どちらかに当てはまった時点で「戻れなくなった」と記録します。時間の閾値は例なので、読者が自分で決めてかまいません。ただし、実験を始めた後で変えてはいけません。結果を見てから基準を動かすと、何でも「戻れた」「戻れなかった」と言えてしまうからです。

もう一つ、「同じ挙動」の判定基準も先に決めます。後述するチェックリストを使います。「なんとなく同じ感じ」で合格にすると、測定になりません。

準備するもの

必要なものは次のとおりです。

  • テキストエディタとブラウザ
  • ストップウォッチ(スマートフォンのもので十分です)
  • 記録用の紙か表計算ソフト
  • 下に示す小さなゲーム(的当て)

的当ては、動く的をクリックして得点を稼ぐ20秒の作品です。設定値は CONFIG にまとめてあり、変更の対象にします。次のコードをそのまま index.html として保存すると動きます。

html
<!doctype html>
<meta charset="utf-8">
<title>まとあて</title>
<button id="t" style="position:absolute">●</button>
<p>得点: <span id="s">0</span> / 残り: <span id="r"></span></p>
<script>
const CONFIG = { limit: 20, interval: 900, points: 1 };
let score = 0, left = CONFIG.limit;
const t = document.getElementById("t");
function move() {
  t.style.left = Math.random() * 300 + "px";
  t.style.top = 60 + Math.random() * 200 + "px";
}
t.onclick = () => { score += CONFIG.points; s.textContent = score; move(); };
move();
setInterval(move, CONFIG.interval);
const timer = setInterval(() => {
  left--; r.textContent = left;
  if (left <= 0) { clearInterval(timer); t.disabled = true; }
}, 1000);
r.textContent = left;
</script>

ここで大事なのは、ゲームの出来ではありません。変更が積み重なる土台として、短く、数値が見えて、挙動が目で確認できることです。ゲームを持っている読者は、自作の小さなプロトタイプで代用できます。その場合も、変更の種類が散らばるように次の変更リストを自分のゲームに置き換えてください。

手順:履歴を残さない10ラウンド

守るルール

履歴なし条件では、次のルールを守ります。

  1. 保存は常に同じファイルへの上書きだけにします。
  2. ファイルのコピー、別名保存、バージョン管理ツール、エディタの「元に戻す」履歴の頼りすぎはしません。エディタを閉じて履歴を消す必要はありませんが、頼ったら記録に残します。
  3. 1ラウンドの変更は、下のリストの1項目だけにします。
  4. 1ラウンドが終わったら、必ず1回ブラウザで動かして挙動を確かめます。

変更リスト(固定)

変更の順序と内容は、実験の前に決めて動かしません。例として次のように置きます。

  • 1、変更内容:得点の表示を「得点: 3」から「3点」に変える
  • 2、変更内容:的の移動間隔を短くする
  • 3、変更内容:制限時間を変え、的の間隔も調整して「ちょうどよい」難しさにする
  • 4、変更内容:的の色を変える
  • 5、変更内容:1回あたりの得点を変える
  • 6、変更内容:効果音を足す
  • 7、変更内容:的の大きさをランダムにする
  • 8、変更内容:得点計算を「大きさに応じて加点」に変える
  • 9、変更内容:コードを整理して関数に分ける
  • 10、変更内容:ラウンド3の遊び心地を再現する

ラウンド3は「ちょうどよい」状態として意図的に作ります。ここで、チェックリスト(次節)を書きます。ラウンド10は、ラウンド3の状態へ戻る指示です。つまり、実験の本体は「ラウンド10で、ラウンド3の挙動をどれだけの手間で再現できるか」の測定です。

戻る作業の進め方

ラウンド10で、ストップウォッチを開始します。ラウンド3のチェックリストを見ながら、現在のファイルを、ラウンド3の挙動に近づけます。「一致した」と判断できたらストップウォッチを止めます。定義AまたはBに当てはまったら、その時点で止めて、「戻れなくなった」と記録します。

履歴あり条件との比較

比較のため、同じ変更リストを別の日に、履歴あり条件で繰り返します。各ラウンドが終わるたびに、次のどれかで状態を残します。

  • フォルダごとコピーして round03 のように名前を付ける
  • Gitを使えるなら、ラウンドごとにコミットする

そしてラウンド10で、ラウンド3の状態に戻すのにかかる時間を測ります。ここで一点だけ注意があります。履歴なし条件を先に行ってください。履歴あり条件を先に行うと、ラウンド3の中身を記憶しているので、後の履歴なし条件の再現が簡単になります。先に履歴なしを行えば、この不公平を避けられます。それでも、同じ変更列を二度行うので、二回目は記憶の影響を受けます。その分は結果を読むときに差し引いて考えます。

記録の取り方と結果の読み方

何を記録するか

最初に、ラウンド3の終了時点で、挙動チェックリストを紙に書きます。項目は3つに絞ります。

  1. 的が移動する間隔(体感ではなく、数えられる形で)
  2. 制限時間(画面の残り秒数で確かめられる形で)
  3. 1回のクリックで入る得点

次に、毎ラウンド終了時、表に次の項目を記入します。

  • ラウンド番号、記入内容:1〜10
  • 変更内容、記入内容:リストの項目
  • 変更したファイルの箇所、記入内容:行や設定名
  • 「戻りたい」と思ったか、記入内容:はい/いいえ。はいなら何に戻したいか
  • 所要時間、記入内容:変更にかかった分数

ラウンド10では、さらに次を記録します。

  • 再現にかかった時間(分・秒)
  • チェックリスト3項目のうち、一致を確認できた数
  • 再現のために何をしたか(コードを読み直した、ブラウザで何度も試した、設定を総当たりした、など)
  • 定義A・Bのどちらに当てはまったか、あるいは当てはまらなかったか

測る単位は、時間は秒、一致項目は3項目中の個数、回数は各条件1回ずつです。1回では偶然かもしれないので、余裕があれば、変更リストの順序を入れ替えた別の組(例:ラウンド3の位置を5に動かす)でもう一度行うと、結果の揺れが見えます。

結果の読み方

読者が自分で出した数字を、次のように判断します。

  • 履歴なしの再現時間が、履歴ありの再現時間より明らかに長い場合。 履歴の価値は、手間の差として確認できたことになります。ただし、差の大きさはプロジェクトの規模に依存します。この小さなゲームで差が小さくても、規模が大きければ差は広がる可能性があります。
  • 両者の時間があまり変わらない場合。 ゲームが小さすぎて、頭の中だけで追える規模だったと読めます。変更リストを増やす、変更を日をまたいで行う、あるいは自作の大きめのプロトタイプで試す、と条件を重くして再実験します。
  • チェックリスト3項目のうち一致を確認できた数が少ない場合。 時間の問題ではなく、「何に戻すのか」を決めること自体が難しかったと読めます。定義Aに近い状態です。
  • ラウンド10より前に「戻りたい」が何回も出ていた場合。 ラウンド10だけが問題ではなく、日常的に戻りたい場面が発生していると読めます。ラウンドごとの「戻りたいか」の列を見て、どの種類の変更(数値調整、見た目、構造)で出やすかったかを数えます。

いずれの場合も、「履歴は必須だ」「いらない」という結論を急がないでください。確かめたいのは、自分の制作の規模と作り方で、戻る手間がどの程度かかるかです。

起こりやすい誤り

  • チェックリストを後から書く。 ラウンド10でリストを作ると、現在のファイルに合わせた基準になってしまいます。ラウンド3の終了時に書いて、ラウンド10まで見ないように封をします。
  • メモを許すかどうかが曖昧になる。 数値のメモ(仕様メモ)を取っていれば、それは一種の履歴です。この実験の履歴なし条件では、チェックリストの3項目以外のメモは取りません。メモ有りの条件は別の実験として、変数を一つずつ変えて行います。
  • エディタの「元に戻す」に頼る。 閉じていなければ数手前まで戻れてしまいます。頼った場合は記録に書き、その回の結果は参考扱いにします。
  • 一度に二つ変更する。 「ついでに」直したくなりますが、どの変更で挙動が変わったのか追えなくなります。それ自体が観察対象の現象ですが、変更列を固定する今回は避けます。
  • 時間を測り忘れる。 戻る作業に没頭するとストップウォッチを忘れます。開始前に必ず押して、画面の見える位置に置きます。
  • 履歴あり条件でも、戻す方法を調べるところから始める。 コミットやフォルダの扱いに慣れていないと、その学習時間が計測に混ざります。履歴あり条件の前に、戻す操作の練習を一度だけ行ってください。

次の行動

まず上のコードを保存し、ラウンド1〜3まで進めて、チェックリストを紙に書くところまで試してください。そこで「3項目が本当に数えられるか」が分かります。数えられない項目があれば、先に基準を直してから本番に入ります。

アソバースに作品を投稿する場合も、公開内容の更新ができます。ZIPで更新する前に、更新前のフォルダを手元に残しておくと、戻りたくなったときに困りません。公開済みの版を後から以前の状態に戻せるかどうかは、現在の案内で確認してください。