2000年問題の報道について
2000.3/18
2000年問題は、幸いにして最大のヤマである去年から今年への移行を乗り切り、もう一つの
ヤマである年度変わりを迎えようとしています。こちらも大きな混乱がないことを念ずるのみです。
ところで、ここまでのところで『2000年問題』と取り沙汰された二つの節目、1999年12月31日から
2000年1月1日への変わり目と、2000年2月29日について、技術者の一人として感じていることを
書きたいと思います。
○断じて狼少年ではなかった年変わりの危機
まず、昨年の大晦日から今年の元旦にかけての2000年問題ですが、これは、ほとんどの人にとって、
『肩透かし』といっていいくらい、平穏でした。特に、日本のみならず、世界的に見ても大きな
トラブルがなかったため、一部では、騒ぎすぎだったとか、もともとそれほど大した問題ではなかったとか
いう見方がされています。しかし、これは大きな間違いです。
2000年問題自体は、その要因は、プロのプログラマとして恥ずべき性質の、場当たり的、手抜き、
無責任さ、不注意、などという表現を否定できない、お粗末な作業による原因が大半であることは
事実です。ただ、現実問題として、その結果予測された社会的影響は、実際極めて深刻なもので、
もともと大した問題ではなかった、というのはとんでもない間違いです。これは現場で改修に携わった
人たちは身にしみているでしょうし、まじめに取材していたマスコミはその実態を知っていたので、
結果が平穏だからやっぱりたいしたことなかった、というスタンスの記事は、比較的少なめだったように
思います。
私自身はあまり2000年問題についてはかかわりがなかったので敢えて言いますが、この件については、
現場の大変な努力の結果、無事にクリアできた、ということが現実であることは、
理解してもらいたいと思います。
○理屈に合わない俗説のまかり通る2000年うるう年問題
一方、対照的に、ずいぶんと的外れな報道をしていると感じたのが、2000年のうるう年問題です。
この主旨は、
- うるう年の計算は、4で割り切れる年がうるう年となる。
- しかし、4で割り切れても、100で割り切れる年は、うるう年ではない。
- しかしさらに、100で割り切れても、400で割り切れる年はうるう年となる。
- したがって、100で割り切れるにもかかわらず、400で割り切れる2000年の
うるう年は、うるう年と認識しないバグを持つプログラムで、誤動作する恐れがある。
とまあ、こんなところです。
ほとんどの人は、うるう年は4で割り切れる年、という認識しかなかったと思いますので、こうした
話を聞いて、へえーっ、と感心したのではないでしょうか。無理もありません。体験的にこれを
知っている人がいたとしたら、百年前の1900年の時点で、「ええ!?今年は4で割り切れるのに、
うるう年ではないの」と驚くだけの年齢に達していた人だからです。そうでないほとんどすべての
人にとっては、うるう年は4で割り切れる年という枠から出ることはなかったのです。
さて、それでも私のように、商売柄、正確にはうるう年はどういうものか、ということを
調べたことのある人は、こうしたルールを知っています。そうして、実際にプログラムを書く時、
どう考えるでしょうか。
「ああ、1901年から2099年までは、とにかく4で割りゃあいいんだ。簡単簡単。」
念のために付け加えると、2000年問題を考えないコーディングをすることと、2100年の
時点の処理を正しく行わないプログラムを書くことの意味はまるで違います。前者は、
3万キロ走ると効かなくなるブレーキをつけて車を売る行為、後者は、1億キロ走ると
ブレーキが効かなくなる車と考えてください。そもそも、現在のプログラムが100年後に
使われていたとすると、70より大きな数字は1900年代、それより小さいのは2000年代、
とやった2000年問題の対応を、この例で言えば2070年になる前と2100年になる前に
それぞれもう一度やる必要があります。それのほうがよほど問題です。
話を戻しますが、趣味で書くプログラムはともかく、職業プログラミングの場合、一ステップの処理を
書くという行為には、その何倍かのコストのかかる「試験」という作業が伴います。だれが好き好んで、
4で割るという作業以上の、100で割って、400で割って、なんてコードを書くでしょう。
無論、例外もあります。例えば、任意の西暦年を指定すると、その年のカレンダーを表示する
プログラムでは、こうした計算をちゃんとする必要があります。それにしても、100で割りきれる
年はうるう年でない、というところまで意識してコーディングする人が、400で割り切れれば
うるう年となる、という条件だけわざわざ忘れるものでしょうか。
でも、実際にいくつか、2月29日に出たバグが報道されたではないか、という方もあるでしょう。
事実、それが2000年問題がらみのバグとまでは断言されていなかったものの、そうではないかという
トーンで報道されたいくつかの事象はありました。しかし、これは、『トラブルが少なかったから
年替わりの2000年問題は空騒ぎだった』、とする姿勢と、ちょうど裏返しで、
『トラブルがあったからやっぱりうるう年の2000年問題はあったんだ』、と感覚的に理解している
ように思えます。
私の推測では、こうしたバグの理由として考えられるのは、もともとの単純なうるう年バグだった、
というものです。例えば、そのプログラムが前回のうるう年、1996年の2月29日よりあとから
使われだしたものであれば、今回が初めてのうるう年ケースとなります。もともとあった、
2000年問題とは無関係のバグというわけです。
あるいは、もともとはバグがなかったのに、2000年対応の改修作業において、バグを作りこんで
しまったという可能性は結構あるかもしれません。それと、上述のように100年と400年の単位を
ちゃんと計算する、leap()というような名前のライブラリ(あらかじめ用意された汎用のプログラム)が
あったとして、それに西暦年のパラメータを渡す際、00という数字について1900と与えて
しまっているようなバグがあったとすれば、これは間違った結果を返すでしょう。
あまり多いとは思えませんが、まあこの場合がかろうじて2000年のうるう年問題といえる程度
でしょうか。
○プログラムも人間が手作業で作るもの
この問題に対する上述のような解説を、何の抵抗もなく受けいれてしまうということは、報道した記者も
含め、大半の人にとっては、『コンピュータのプログラムはなにやら得体の知れないものだ』、という
意識が確固としてあるということの一つの証でしょう。実際は、プログラムと言えども、普通の
人間が、頭で考え、手作業で作っていくものなのです。本質的に、手紙を書いたり日記を書いたり
することと同じ行為なのです。ですから、本来は得体の知れないものでもなければ、逆に
とりたてて高級なものでもありません。このことは覚えていて損はないと思います。
Back Home