【マイレース開発記録(14)】デバッグで救われた瞬間
マイレースの開発では、設計や実装よりも長い時間を費やした工程があります。
それが デバッグ です。
特に Flask API とフロントエンドを接続したあと、「動いているように見えるのに結果が正しくない」という状態が何度も発生しました。
この回では、開発中に印象に残っているデバッグによって問題の原因にたどり着いた場面を記録しておきます。
エラーが出ないバグ
API /api/calc が動き、JSONも返ってくる。
フロントのレースも動く。
しかし、結果を見ると違和感がありました。
- 同じ誕生日でも結果が極端に変わる
- スピード差が不自然
- レース順位が想定と合わない
エラーは出ません。
処理も止まりません。
つまり 「正常に動いているように見える不具合」 でした。
こういう状態が一番厄介です。
コンソールのログを見る
最初にやったことは、とても単純です。
計算途中の値をすべて printで出力する ことでした。
Python
print("birthday:", birthday)
print("target:", target)
print("phases:", phases)
print("speeds:", speeds)
print("finish_times:", finish_times)
これだけで、状況がかなり見えるようになります。
ブラウザではなく、サーバーコンソールのログを読む という作業です。
AIにコードを提案してもらうことはできますが、この「値を追いかける作業」は結局自分が理解しないと進めません。
見えてきた違和感
ログを見ていると、ある問題に気付きました。
speeds の計算が、思っていたより 似た値ばかり だったのです。
原因はこの関数でした。
Python
def speed(natal_lon, transit_lon):
return 1.0 + (1 - angle_diff(natal_lon, transit_lon) / 180) * 0.4
ロジック自体は間違っていません。
しかし
angle_diff の値が想定より偏っていた のです。
ここで初めて「天体位置の差分」を疑うことになりました。
Swiss Ephemeris 側を疑う
次に出力したのは、天体の経度です。
Python
print("natal:", natal)
print("transit:", transit)
すると、ある問題に気付きました。
出生時刻と計算時刻の扱いです。
Python
birth_dt = datetime(..., tzinfo=JST)
target_dt = datetime(..., 12, 0, tzinfo=JST)
ここで
- 出生は「実際の時刻」
- 対象日は「正午固定」
という設計にしていました。
これは意図した仕様ではありますが、
当初はこの影響を十分理解していませんでした。
問題の原因は「計算の前提」
結果が不自然だった理由は、コードのミスではなく 設計の理解不足 でした。
デバッグを進めることで、
- phase計算の周期
- 天体差分
- finish_bonus の影響
それぞれがどう結果に影響するかを、少しずつ把握できるようになりました。
発達特性とデバッグ
私は発達特性の影響で、
- 細部に意識が向きすぎる
- 全体構造を見失う
ということがあります。
そのため、「どこが問題か分からないバグ」に長時間捕まることがありました。
しかし今回の開発では、
- ログを出す
- 状態を一つずつ確認する
- AIと対話しながら整理する
という手順を取ることで、
思考を分解しながら問題に向き合うことができました。
これは、AIと一緒に開発しているからこそ作れた作業スタイルだと思います。
デバッグは「バグ探し」ではない
このプロジェクトで感じたのは、デバッグは単にバグを見つける作業ではないということです。
むしろ
「自分が書いたロジックを理解し直す作業」
に近いと感じました。
今回のケースでも、printによるログ出力を続けたことで
- 計算フロー
- 数値の変化
- ロジックの前提
を改めて整理することができました。
この経験が残したもの
このときのデバッグ経験は、マイレース開発の中でも大きな転機でした。
それまでは
- エラーが出る
- 修正する
という受け身の作業が多かったのですが、この頃から
「数値を追って原因を特定する」
という進め方ができるようになってきました。
AIはヒントを出してくれますが、最終的にロジックを理解するのは自分です。
この経験は、その後のフロントエンド実装やUI調整にも大きく役立つことになりました。。
次回予告
次回からは、
フロントエンド実装のフェーズに入ります。
Canvas描画、アニメーション制御、レスポンシブ対応など、
バックエンドとは違った難しさが続きました。
次の記事では
【マイレース開発記録(15)】canvas描画との戦い
として、ブラウザ上でレースを動かす部分の実装について書いていきます。


