「レガシー」を保守したり、刷新したりするにあたり得られた知見・ノウハウ・苦労話 by Works Human Intelligence Calendar 2025
https://qiita.com/advent-calendar/2025/works-hi-2
45年以上前の話もあり、いろいろ忘れていることがあるといけない。
ChatGPTにどういう可能性があるか考えてもらい、それに応える形にすることにより、抜け漏れを防いだ。
1 メインフレームのCOBOLで書かれていた料金計算をピーシーのBasicで書き換えて、さまざまな模擬試験を手元で実行
メインフレームのCOBOLで書かれていた料金計算をPCのBasicで書き換えて、さまざまな模擬試験を手元で実行したことがあります。ここで課題になったであろうことをご推測ください。
以下は、メインフレーム COBOL の料金計算ロジックを PC の BASIC に書き換えて手元で模擬試験を行ったときに、実際に起きがちな課題・落とし穴を総合的に推測したものです。COBOL → BASIC という移植の特徴や、メインフレームと PC のアーキテクチャ差異を踏まえて整理しました。
🧩 想定される主な課題(推測)
1. データ型・桁数・丸め規則の相違
COBOL は桁管理が厳密(PIC 9(n)V9(m))、BASIC は浮動小数点が中心
→ 料金計算での端数処理、四捨五入・切り捨て・切り上げの違い が模擬結果に影響。
よくあった問題例
- 0.1 のような二進小数の誤差で最終料金が 1円ズレる
- COBOL の ROUNDED 指定が BASIC では再現されない
- 計算途中の桁落ち、繰り上がり差異
2. 日付計算・期間計算の差異
メインフレーム COBOL では日付処理ルーチンが整備されている一方、BASIC は自前実装が多い。
起きがちな問題
- うるう年・末日処理の抜け
- YY → YYYY の変換差異
- 時間帯や夏時間処理の差の無視
3. レコード構造の扱い方の違い
COBOL:定義済みレイアウト(FD・WORKING-STORAGE)
BASIC:配列やユーザー定義型(構造体)で代用
よくある課題
- フィールド位置のズレ
- 固定長 → 可変長文字列への変換ミス
- 使用するコードページ(EBCDIC/ASCII)の違い
4. ファイル I/O の差異(特に固定長ファイル)
メインフレームのファイル形式は PC と異なるため、データコンバートでトラブルが発生しやすい。
典型例
- EBCDIC → ASCII 変換で数字のゾーン部が想定外
- 改行コード(CR/LF vs none)
- 1 レコード = 80バイト固定の想定が崩れる
5. 業務ルールが暗黙依存している部分の再現ミス
COBOL のプログラムは、従来システムの流れや夜間バッチ処理の順序に依存していることが多い。
課題の例
- 「先に割引を計算する」「上限料金に丸める」など、業務ロジックの順序差異
- 依存サブルーチンが BASIC では未実装
- 過去の特例処理をうっかり抜かす
6. 性能差(メインフレームの並列 I/O vs PC)
BASIC で大量レコードを処理すると 遅く なり、テスト時間がかかることも。
7. テストデータの変換不足
メインフレームの料金計算は大量の例外・パターンを扱う。
→ 小さな PC BASIC 環境では テストケースが不足 しがち。
8. 端末依存のロジックの欠落
COBOL の画面項目(CICS/IMS)が料金に影響していた場合、BASIC で省略されることで差が出る。
9. 並行処理・バッチ処理特有の問題が再現できない
メインフレームのバッチはファイルロックやリスタート機能を持つが、BASIC では再現が難しい。
10. 計算結果の差異をどう評価するかの基準問題
「1円の違いを許容するか?」「どのケースを正として比較するか?」
など、模擬試験の判定ルールが曖昧になりやすい。
🔍 総合すると…
コア課題は「環境の差異による計算結果のズレをどこまで再現するか」
ここに尽きます。
特に、
- 数値表現
- I/O 形式
- 暗黙の業務ルール
の 3 点が「ずれ」や「想定外の差異」を生みやすいです。
必要なら
- 実際の COBOL 税計算ロジックの推測例
- BASIC → Python/COBOL 動作比較の表
- 当時の PC-BASIC での具体的な落とし穴
- 現代語での「レガシーマイグレーションの類似課題」
なども追加できます。
1.1 データ型・桁数・丸め規則の相違
水道料金の計算で、整数演算だけであり、データ型、桁数、丸めの問題が生じない模擬試験にした。
小数を使わないためCOBOLとBASICの誤差はなし。
計算途中の桁落ち、繰り上がり差異も、割り算を使わないことにより回避した。
1.2 日付計算・期間計算の差異
COBOLのデータを使わずに計算したため問題は生じていない。
自前の表を引いて計算するため差異は生じない。
閏年も表を作るときに確認した。
時間帯や夏時間処理の差は、月単位の模擬試験で自前の表を引いて計算するため差異は生じない。