レガシー移行でAIが間違えた場所を、全部書き出した

うまくいった話より、どこで間違えたかのほうが役に立つはずなので記録しました。

この記事の結論

  1. 間違えるのは、情報が足りない所と決まっている
  2. 「動くコード」が返ってくるので気づきにくい
  3. 先に言っておけば防げるものが多い
  • 間違えるのは、情報が足りない所と決まっている
  • 「動くコード」が返ってくるので気づきにくい
  • 先に言っておけば防げるものが多い

古いPHPの移行でAIを使って、間違いが出た場所を記録した。傾向がはっきりしている。

1. 存在しない関数を呼ぶ

いちばん多かった。古いコードの中で呼ばれている自作関数の定義を渡していないと、名前から推測して別物を書く。

calc_tax()が内部で丸め処理をしていても、渡していなければ単純な掛け算になる。動くので気づかない。

対策は、呼んでいる関数の定義を一緒に渡すこと。grepで集めるだけで防げる。

SPONSORED

2. 暗黙の型変換を消す

古いPHPは型がゆるい。"10" == 10が真になる前提のコードがある。

これを===に直すと、見た目は正しくなるが動かなくなる。GETで来る値は常に文字列なので、数値と比べると偽になる。

「厳密比較に直して」と頼むと、この落とし穴ごと直してくる。型の変換を同時に入れないと成立しない。

3. 配列の添字が消える

$row['name']を$row->nameに直す場面で、一部だけ変換が漏れる。

長いファイルの後半で起きやすい。変更後のコード全体を返させると、見落としが増える。差分の形で返させると減った。

4. SQLのテーブル名をプレースホルダにする

前に書いたとおり、値ではない部分はプレースホルダにできない。

// 返ってきた(動かない)
$pdo->prepare('SELECT * FROM :table WHERE id = :id');

構文としては通るが、実行すると失敗する。先に「できない箇所は指摘して」と頼んでおくと、書き換えずに一覧で返るようになった。

5. エラー処理を足しすぎる

頼んでいないのに、try-catchや例外処理が増える。親切なのだが、元のコードが例外で止まる前提になっていないと、握りつぶしてしまう。

エラーが出なくなったので直ったように見えて、実際は失敗を無視しているだけ、という形になる。

そのまま使える形

間違いは散らばらない。同じ種類に固まるので、分類して一括で見直す。

  • 渡していない前提を補った箇所 — 見えていないファイルの中身を推測で書く
  • 古い書き方を新しい書き方に「整理」した箇所 — 頼んでいないのに変わる
  • 例外の扱いを変えた箇所 — 握りつぶしていた箇所が、落ちるようになる(逆もある)
  • 文字コードと改行の扱い — 見た目が同じで中身が違う
  • 日付と時刻の扱い — タイムゾーンの既定に依存している箇所

1番が最も多く、最も気づきにくい。渡していないコードについては、必ず「不明」と書かせる指示を入れておく。

6. 文字コードの前提を変える

古い案件はEUC-JPやShift_JISが残っている。mb_convert_encoding()の指定を、UTF-8前提に書き換えてくることがあった。

画面では一見読めるので気づきにくい。文字化けは特定の文字でしか出ないため、確認するなら「表」「噂」「ソ」のような問題の出やすい字を使う。

7. コメントを消す

整理の名目で、古いコメントが落ちる。

そのコメントが// 2015年の仕様変更で、ここだけ四捨五入しないのような唯一の仕様書だった場合、取り返しがつかない。

「コメントは一字も変えないで」と毎回入れるようにした。

8. 不要そうなコードを消す

到達しないように見える分岐や、使われていなさそうな変数が整理される。

実際には、特定の条件でしか通らないだけだったことがある。年に数回しか通らない分岐は、読んだだけでは判断できない。消す提案は受け取っても、消す判断は人がやる。

共通しているのは2つ

間違いは、渡していない情報の所と、気を利かせた所に集中していた。

  • 情報不足 → 関連ファイルを足せば防げる
  • 気を利かせる → 範囲を切れば防げる

どちらも頼む前に対処できる。出てきた結果を直すより、頼み方を直すほうが早い。

気づける仕組みにする

見落としを前提にして、確認の側を機械にした。前の記事に書いた移行前後のHTML差分がここで効く。

人の目で全部見るのは無理だが、差分が出た所だけなら見られる。間違いを減らす努力と、間違いに気づく仕組みは、別々に用意しておく。

あわせて読む

SPONSORED

まとめ

AIは動くコードを返してくる。動かないコードなら気づけるが、動いてしまうので気づけない。

間違いの出る場所は決まっているので、先回りして指示を足す。そのうえで、差分で気づける仕組みを用意する。この2段構えが要る。

新しい記事が出たら、ブラウザの通知でお知らせします。

メールアドレスの登録は要りません。いつでも止められます。

AUTHOR

北海道のWEB屋

北海道を拠点に、Web業界14年・サポート実績1,000件以上。WordPressの復旧、サーバー移転、独自ドメインとメールの設定、PHP・JavaScriptの修正まで対応します。相談と見積もりは無料です。

SPONSORED

関連記事

RELATED