🧩今日の学び
・COBOLでは桁数(PIC)を超えるとオーバーフローが発生し、結果が静かに壊れることがある
・なるおの気づきの通り、計算結果を入れる「箱のサイズ」を事前に想像することが重要
・変数サイズはただの箱ではなく、異常データからシステムを守る防波堤になる
係長)さて
なるお)なんすか…
係)なんだよ?
な)だって、「さて」とか言ったらだいたい文句じゃないすか…
係)文句言うな!ありがたい助言だろ!
な)ありがたいってのは、吉野家とすき家どっちがいい?つって、牛丼を持ってきてくれる上司ですよ…。
係)なんでお前に牛丼くわせなきゃならないんだよ…
な)だったら、マックのポテトでも。
係)大して変わらないだろ!
な)最低でもウイダーinゼリーのブドウ糖のやつで。
係)もう糖分10年ぐらい取らなくても死なねーだろうよ…
な)いやいやいやいや。
そんな無味乾燥な世界生きる意味あります?
係)もううるせ!
昨日のお前が書いたコードだ。
01 X PIC 9(3). 01 TOTAL PIC 9(3) VALUE 0. 01 Y PIC X.
な)あー初期値の要否を完璧に見抜き、変数のダイエットと自身のダイエットを同時に達成した俺の100点満点のコードじゃないっすか。
係)全然お前自身のダイエットは成功してないからな。
正しいコードでも「思想」が足りない
いいか、構造としては100点だ。
だが、お前にはまだ「思想」が足りない。このままだと実務では一瞬でクビになるぞ。
な)なんでですか? こぼるんもご機嫌で、生徒たちの校則違反を取り締まってますよ!
係)それ嫌われるだけだろ…。
いいか、割り算をやったときのこと思い出してみろ。 「10 ÷ 3」をやるとき、お前はどうした?
な)えーと、「余り」が出るから REMAINDER を使ったり、小数点になるから V とかおしゃれに使ってみたり?
係)お前のおしゃれ感がわからんが…、それは計算した結果が「どうなるか」を想定(想像)したからこそ、正しい箱を用意できたわけだ。
な)まぁ、スキル「千里眼」が発動しちゃいますからね。パッシブですよ?
係)…。
だったら、この足し算機でも想定してみろ。
入力する数字 X の箱は PIC 9(3) だ。つまり最大で「999」まで入力できる。
999+1で何が起きるか想像できるか
であれば、その「999」を入力して、次にもう一回「1」を入力して足し算したら、合計の TOTAL はいくつになる?
な)えーと、999 + 1 = 1000 っすね。
係)そうだな?
な)そりゃそうですけど…??
………… あ …、TOTAL ってPIC 9(3) だから……3桁っすか?
係)そうだ。結果は「1000」の4桁になるのに、お前が用意した箱は「3桁」しかない。
これを入れるとどうなると思う?
な)え…溢れる…?あの日の淡い思い出が溢れ出してもう戻らないってやつすか?
係)なにがあったんだよ!
桁あふれ(オーバーフロー)は静かに壊れる
いいか!
オーバーフローっていうんだが、COBOLの場合、はみ出た上の桁(この場合は千の位の「1」)が切り捨てられて、結果が「000」になってしまうぞ。環境によるがな。
最悪の場合はプログラムが異常終了(アベンド)して死ぬぞ。これも環境によるがな。
な)え!1000円が0円になったら、うちぐらいの会社は一瞬で潰れちゃうじゃないっすか!
係)ま、まぁ、意味はそうなんだけどな…、お前、うちの会社も馬鹿にしてんだろ…
だ、だからだ!金融システムなんかでこれをやったら、損害賠償ものの大事故だ。だから、合計値を入れる箱は、足し込む元の箱よりも大きく設計しておかなきゃならない。
な)だったら、TOTALの箱はもっと大きくしておけばいいわけでしょ?
係長がPIC 9(3)とかちまいの書くからちまいほうがいいのかなと思ったんすけど、01 TOTAL PIC 9(100) ぐらいにしておけば、この宇宙も飲み込んで、隣り合う宇宙まで侵食できますね!
係)ちまくて悪かったな…。
むやみやたらに箱をデカくすればいいってもんじゃないぞ。
「何桁になるかわからないから、とりあえずデカくしておく」というのは三流の考え方だ。
な)えーなんでですか?大は小を兼ねるんだから、極大も極小を兼ねるでしょ?三流はその程度なんですよ。極三流はそれをも凌ぎますけど。
係)ほんとうるさい、三流にはかわりないだろ!
このシステムは1回の入力の最大値はいくつか。
最大で何回くらい足し算が行われるのか。
業務の仕様を理解し、「どんなに多くてもこの桁数には収まるだろう」という限界値を想定する。 それがプログラマーの思想だ。
なんども言ってるが、無駄にデカい箱(変数)を何万個も作ったら、メモリを圧迫してシステム全体が激重になるんだよ。特に昔のCOBOL時代はメモリが超高価だったから、1桁の無駄すら許されなかったんだよ!
な)あー、いつのものやつっすね…
変数サイズは「防波堤」である
係まぁ、今はマシンの性能も上がってるし、昔ほどうるさくはないが、もう一つ決定的な理由がある。
変数のサイズは「異常なデータからシステムを守る防波堤」になるんだよ。
な)また、大げさに言う…
係)だったら、お前が腹減って、注文システムで牛丼を注文しようとしている。
な)ふむふむ
係)今日の腹の減りぐらいだったら、5個ぐらいかなとか思ってるだろ、どうせ?
な)ふむふ…む??
係)でも、お前がついに狂いだして、100万個買う!とか言って入力したらどうなる?
な)…幸せ?
係)あのな、牛丼1つ500円として、お前5億払えんのか?
な)は!?
係)お前が狂っただけならいつも通りだが、もし、キーボードの上に猫が乗って「9999999」って入力されたらどうする? そのまま計算されてしまうぞ?
な)幸せが逃げていきますね…
係)プログラムは動いて当たり前。プロの仕事は「将来起こりうる事故を想像し、未然に防ぐ設計をすること」でもある。
実際は、業務に応じて決めるものだが、今回は練習だからな、とりあえず TOTAL は PIC 9(5) くらいに、太らせておけ。
な)あい…ンズアンドトルペ。
係)(いらっ)
おむすび
な)いやーでも、オーバーフロー怖いっすね…。俺も食べすぎには気をつけます。びしっと気をつけますよー。
オーバーフローの申し子とは俺のことですから。
係)オーバーフローさせてどうすんだよ!
な)でも、オーバーフローのほうがかっこよさげじゃないです?
係)それ字面だけだからな…
な)えーでも、合コンでオーバーフローして、人気者になるってのが、この世の理じゃないっす?
係)難しい言葉使えばもてるわけじゃねーだろ。
な)いやー、理の上に立つ俺に隙なんて無いのが大きな問題っすよね…困ったものです。
係)お前合コン呼ばれないだろ?
な)え!?
係長のワンポイント
正しく動くコードは、まだ半分だ。
想定外が来たときに壊れない設計が、もう半分だ。
桁あふれはエラーを出さず、静かに結果を壊す。
だから変数サイズは「ただの箱」じゃなく、防波堤になる。
COBOLは計算する言語じゃない──事故を防ぐ設計の言語だ。


コメント