「明治33年から延滞」、入力ミスで高速料金過剰請求(朝日新聞) - goo ニュース
一般の方は、「へー、入力ミスでとんでもないことがあるんだな。」とか、
「100年以上も前から請求されちゃ大変だ。」とか、
「コンピュータもいい加減だなぁ。」なんて思われるかもしれませんね。
私は、いつものようにちょっとうがった見方をしてみましょう。
コンピュータがいい加減なわけではありません。
コンピュータはプログラムの指示に従って計算しただけ。
プログラムが悪い。
もちろん、入力ミスがその直接の原因ですが、
こんな低レベルのミスを検知できないプログラムは低レベル、
そのプログラムを組んだ人は、はっきり言ってプロレベルにない。
入力がどのようになっていたかは知りませんが、
いくつかのミスのタイプを考えてみます。
・起算年を入力しなかったので、0として認識し、0=1900年とした。
・年を2002年などと4ケタでいれるべきなのに、02や和暦の16と入れ、
小さすぎるので、自動的に1900年と置き換えた。
・年は西暦下2ケタで、02などと入れるべきなのに、2002と入れたため、
下2ケタが無視され、上2桁の20と認識され、現在の07より
大きい数字なので1900に置き換えた。
・年は西暦下2ケタでいれ、21世紀の1から10までは、2000を足す。
それ以外は、20世紀と判断し、1900を足す。
この結果、入力を間違って00や20と入れ、1900年と判断した。
・年月日を西暦下2ケタと月日の計6桁で、
例えば2002/03/04は、020304とすべきところ、
20020304のように8ケタでいれたため、20/02/03と判断、
20(=2020)は現在より大きいため、1900年と置き換えた。
まあ、プログラムがどのような作りで間違えたかは大した問題ではありません。
要は入力する人間はミスをするものだ、という前提に立って作るべきなのです。
いくら間違っても起算日を1900年と入れる人なんていないでしょう、
とは思いますが、でたらめに入れても検知する仕組みが必要です。
上の例でいえば、
・起算年が入力されなかったら、エラーとして扱う。
・起算年の下限を論理的に保持しておき、それより少ない値はエラーとする。
・現在より先の日付を起算年としたらエラーとして扱う。
また延滞金請求の場合、「時効」があるはずですから、
いくら時効延長の手続きをしていたといえども100年はおかしい。
人がおかしいと思う「感覚」をプログラムすることは難しいですが、
プログラム的におかしいと思える下限があるはずです。
例えば、1963年に初めての高速道路が開通していますから、
それ以前の起算日の料金延滞金はあり得ません。
東北道なら1972年以前は東北道自体が無いし、
本宮ICができたのは1981年だとか、
いろいろチェックすべき日付があるわけです。
これらの処理を入れても、プログラムは数行から数十行増えるだけでしょう。
相当複雑な判断を入れてもたかだか100行200行の追加ですむはずです。
しかし、いくらプログラムで工夫しても論理的にあり得る間違い、
例えば、2003年を2002年と入力するエラーは検知できないので、
・入力された日付を表示し、これでよいか確認すること、
・計算結果にも起算日や計算した期間を表示し、
請求書にも起算日や期間を表示すること、
などの処理が必要です。
でも、こんなのは初歩の初歩、やっちゃいけないレベルのミス。
フェイル・セーフとフール・プルーフという言葉があります。
これは「仮に間違っても間違いを発見したり正したりできる」仕組みと、
「間違った操作ができないようにする」仕組みのことで、
特にお金や安全に絡むプログラムでは絶対に忘れてはいけない。
一般の方は、「へー、入力ミスでとんでもないことがあるんだな。」とか、
「100年以上も前から請求されちゃ大変だ。」とか、
「コンピュータもいい加減だなぁ。」なんて思われるかもしれませんね。
私は、いつものようにちょっとうがった見方をしてみましょう。
コンピュータがいい加減なわけではありません。
コンピュータはプログラムの指示に従って計算しただけ。
プログラムが悪い。
もちろん、入力ミスがその直接の原因ですが、
こんな低レベルのミスを検知できないプログラムは低レベル、
そのプログラムを組んだ人は、はっきり言ってプロレベルにない。
入力がどのようになっていたかは知りませんが、
いくつかのミスのタイプを考えてみます。
・起算年を入力しなかったので、0として認識し、0=1900年とした。
・年を2002年などと4ケタでいれるべきなのに、02や和暦の16と入れ、
小さすぎるので、自動的に1900年と置き換えた。
・年は西暦下2ケタで、02などと入れるべきなのに、2002と入れたため、
下2ケタが無視され、上2桁の20と認識され、現在の07より
大きい数字なので1900に置き換えた。
・年は西暦下2ケタでいれ、21世紀の1から10までは、2000を足す。
それ以外は、20世紀と判断し、1900を足す。
この結果、入力を間違って00や20と入れ、1900年と判断した。
・年月日を西暦下2ケタと月日の計6桁で、
例えば2002/03/04は、020304とすべきところ、
20020304のように8ケタでいれたため、20/02/03と判断、
20(=2020)は現在より大きいため、1900年と置き換えた。
まあ、プログラムがどのような作りで間違えたかは大した問題ではありません。
要は入力する人間はミスをするものだ、という前提に立って作るべきなのです。
いくら間違っても起算日を1900年と入れる人なんていないでしょう、
とは思いますが、でたらめに入れても検知する仕組みが必要です。
上の例でいえば、
・起算年が入力されなかったら、エラーとして扱う。
・起算年の下限を論理的に保持しておき、それより少ない値はエラーとする。
・現在より先の日付を起算年としたらエラーとして扱う。
また延滞金請求の場合、「時効」があるはずですから、
いくら時効延長の手続きをしていたといえども100年はおかしい。
人がおかしいと思う「感覚」をプログラムすることは難しいですが、
プログラム的におかしいと思える下限があるはずです。
例えば、1963年に初めての高速道路が開通していますから、
それ以前の起算日の料金延滞金はあり得ません。
東北道なら1972年以前は東北道自体が無いし、
本宮ICができたのは1981年だとか、
いろいろチェックすべき日付があるわけです。
これらの処理を入れても、プログラムは数行から数十行増えるだけでしょう。
相当複雑な判断を入れてもたかだか100行200行の追加ですむはずです。
しかし、いくらプログラムで工夫しても論理的にあり得る間違い、
例えば、2003年を2002年と入力するエラーは検知できないので、
・入力された日付を表示し、これでよいか確認すること、
・計算結果にも起算日や計算した期間を表示し、
請求書にも起算日や期間を表示すること、
などの処理が必要です。
でも、こんなのは初歩の初歩、やっちゃいけないレベルのミス。
フェイル・セーフとフール・プルーフという言葉があります。
これは「仮に間違っても間違いを発見したり正したりできる」仕組みと、
「間違った操作ができないようにする」仕組みのことで、
特にお金や安全に絡むプログラムでは絶対に忘れてはいけない。
※コメント投稿者のブログIDはブログ作成者のみに通知されます