低能エンジニアによるデータ汚染
使えないヤツを現場に送り込んでくる人事は有害。
「いない方がマシ」な人間を積極的に送り込んでくる。
今の日本においては「いない方がマシ」な人材が3割ぐらいはいると思う。そいつ等がいなくなればもっと開発は早くなるし、不具合も減るのだがな。
さて10000年問題であろうと2000年問題であろうと何が問題かわかるだろうか。10000年の方はわかりやすいかもしれない、元々はSeireki年が全桁入っていたのに10000年を迎えると入らなくなる。桁数が足りないのだからそれは問題だろう。
けれど2000年の時点では元々2桁なものを何故4桁にしないといけなくなったのか。年に98とあれば暗黙的にそれは1998年を示していたように00であれば2000年を示している事は明らかでそれを1900年と間違う人はまずいないという事は理解出来る事と思う。もちろん、2100年になれば2000年と2100年の区別がつかなくなる。それ以前にコンピュータというものが作られデータやプログラムコードが2000年時点でも残っていた1970年頃から、つまり2070年頃からデータが混ざり始めるので、その段階に至れば2桁では問題だ、というのは誰でも理解出来る事だろう。けれど2000年時点では00や01は2000年や2001年でしか有り得ない。そうであるにも関わらず何故2000年を迎えるその日までに修正しないといけなかったのか。
これはとても簡単な話だ。人間には一目瞭然でもコンピュータにとってはそうではないという事なのだ。人間は年2桁を見ればそこから類推は出来る。けれど、当時のコンピュータにはそれが出来なかった。現代であれば類推させることは出来る。出来るがやらせることはまずない。類推は類推でしかないのだから絶対安全な方法を取るのが通常だ。
では00を2000年ではなく00年や1900年と誤認してしまうと何が問題になるか。考えるまでもないだろう、たとえばだSeireki10000年を迎えるにあたり5000年ぶりの復活となるオリンピック。これは2000年に開催されたのだが、コンピュータはそれを1900年の出来事だと応じかねないという事だ。
年を入れて歴史を記し、それをコンピュータに古い順に並び変えさせたとすると、1999年が歴史の最後になってしまうのだ。人間の生まれた日付でもいい。2000年に誕生した子供のデータを入力したら、その子はコンピュータは100歳と表示してしまうような事になってしまう。
これではまずいだろう、並び替えがまともに出来ないじゃないか、と大雑把にいればこれが最大の問題点だったと言っていい。1万年問題も実のところその部分は変わらない。年が4桁しかないのでSeireki10000年はSeireki0年と判定されてしまう事となる。
ただ、これだけ聞けば世の中にそんなに「年」を使ったデータやプログラム判定があるのか?と思う人もいるだろう。その答えは「そんなにあるのだよ」なんだが、それだけじゃあないんだ。それを単純に「年」として扱う気が無い場合も多い。データの一部に年が混ざっていると思えばいい。例としてはあまり相応しくないのだが、有名な1足式有人操縦ロボットの「サスガ8735」の8735は開発を始めたSeireki年だという。先に言った通り例としてはあまり相応しくないのだけれど、つまりは「年」というものはあっちこっちに使われているのだと思ってもらいたい。
データ上はそれが「年」だとわからない形で埋もれていたものは2000年当時も、そして今もたくさんある。本来そのようなものは記録として残しておくべきなのだけれど、2000年当時は極めて杜撰な開発を行った企業が多く記録が残されていないパターンが多かったようで全てのプログラミングコードを目で見て確認し、それが何なのかわからなければ時間をかけて実際にそれが何なのか試験稼働させて確認をしたらしい。
人類というのは痛みをすぐに忘れてしまうようで、2000年問題で懲りたはずだというのにそれ以後も杜撰な体勢のままだったところも多かったのか結局数千年と流用され続けているものの中にはもはやそれが何なのかさえわからないまま動いているものも多い。今回、それが「何なのか」を突き止め今後の為に資料化するというのも1万年問題に付属する作業となっている。が、突き止めるのが不可能と言っていいものが多いのが実情なのだが。
それでも全く反省が無かったわけでもない。Seireki3300年辺りにはプログラミングというのは短い期間の間に急速に体系化されていき、誰でも読める、誰でも改変出来るものへと変化していた。この頃のプログラミングコードはプログラマから見て非常に美しく今でも人気は高い。人類史においてごくごく短い期間にだけ現れた奇跡といっていい。
この美しい傾向が廃れたのは世界情勢によるものだ。歴史好きな人であれば3300年頃という年代でピンとくるものがあるだろう。そう、3303年に起きた地球と火星2つの星で起きた大戦により結局のところ誰でも簡単に読める、改変出来るコードではセキュリティに問題があると叫ばれたのだ。そんな事は3300年に至るまでもなく最初からわかっていて、人類の英知と善意に期待してのものだったというのに長い大戦は人類の心を荒ませてしまったようで以後、各組織による独自路線化が始まり以後約7000年の間そのままだ。
それが今の時代の私たちプログラマを困らせる要因となっている。ルール無用すぎて、プログラム解析にとても時間がかかってしまう。先のクソSuzukiのような無能を晒しているクソプログラマがクソなコードを作り、しっかりと先人が考えて作ったであろうコードの意味を介さずぶち壊すクソ改変をしてしまう。数千年の歴史の間にはどうしてもこんなクソ無能がそれなりの数混じってくる。人類の敵といっていい。生まれてきた事を後悔させてやりたいぐらいにイラついてくる。聞いてくれよ、たとえばだ、あなたが地球に行きたいと思った場合どうする?金星や水星にいくか?いかないだろ?だが、無能な奴らはそれをするんだ。1000年前を調べたいと思った時どうする?いや、聞いても仕方ないか。あーーーーーー、無能死ねくたばれ。
すまない、話を戻そう。「年が1桁足りないって言っても最大○桁って縛りを絶対に外せないものとかあるんじゃないの?」と思った人がいるなら、その人はなかなか鋭い。もちろんそういうものもある。いつかはそれも対処しないといけないかもしれないけれど、そういう場合は桁数は4桁のまま乗り切ることになる。
2000年問題当時においても実は2桁だった年の箇所を全て4桁にしたわけではなく、2桁のままであったり1桁増やして3桁で対応した事例もある。2桁のままの場合はもちろんまともに並び替えは出来ないのだけれど、そういう需要が無い場合には2桁でもどうにかならない事もないという事だ。
2000年当時であれば実際に使っていたデータは1970年辺りからだ。だから年が70以上の場合は1900年代、69以下は2000年代なんていうバカげた判定コードが実際に書き込まれていたりする事例もある。100年単位で同じデータが存在しえない、つまり2000年1月1日のデータと2001年1月1日のデータは絶対に同時に存在しないというようなケースの場合、2桁のままかなり長い間使っていた事例も私が見たコードの中にはあった。100年毎にコードを自動的に書き換えていたようだ。もしかしたら未だに2桁のままのものも存在している可能性すらある。
こんなノリなので2500年になって今更にして2000年問題が起きてしまったシステムなんてのもあるようで当時のニュースを見ると何故500年も見逃されていたのかだとか技術者のレベルが低いのではないかだとか色々書かれていて面白い。
もちろんSuzukiのようなロクでもないクソ無能が紛れているのは確かだけれど全てをプログラマの責任にされてもそれは困る。無能を現場に送り込んできたヤツの方が問題あるだろ?クソ無能が1人いるだけで数千年に渡って人類に害を及ぼすのだからたまったもんじゃないな。ただ、技術者のレベルが低いのではないかという指摘はやはりもっともなものではある。
技術者、エンジニア、プログラマとひとまとめにしたところで、個々の性能は全く違う。そして問題は1人、そうたった1人性能が劣るヤツがいるとそれは周囲を汚染する。
コンピュータの世界においては太古の時代から現在に至るまで数値と文字とは別の存在だ。"1"は人間にとって「1」でしかない。が、コンピュータにとってはそれが「1という数値」なのか「1という文字」なのかはしっかり区別をしている。区別をせずどちらでも扱えるようにすることは出来るのだけれど、敢えてそうさせてないのだ。
これがレベルの低いバカげた問題を引き起こした事例もある。100を超える何かを管理するにあたって、1から連番で番号を振ってそれを人間が目で見る場合、100以上の場合は問題ない、99以下の場合、たとえば1の場合「001」なのか「1」なのか、どちらのケースもあると思うけれど、ご親切に頭のゼロを消して「1」とする場合に問題が発生する。これは「001」という数値を「 1」という文字に変換しているのだけれど…
何度も言うけれど2000年問題当時は70年頃からのデータしかない。なので2桁を表示する際に頭の1桁が0になる事はない、それが2000年になると「00」となりゼロを消すなんて事をしている場合、00年どころか「 年」と空白になってしまう。本来年の部分に空白など入るはずがない。正直、何故そこでゼロを消すなんて謎の対応が入っていたのかはわからないのだけれど、プログラミング言語の中には命令を必要とせず、項目定義だけでそれを行うものが存在する。項目というのは、そうだな「年」
であれば「年」というデータの置き場だと思ってくれればいい。その置き場自体に「ゼロを消す」という定義がなされているという事だ。
本来であればそんな定義自体必要ないのだけれど、これに限らず命令や定義、設定、何も理解してないんだろうなという使い方をしている事例などいくらでもある。Suzukiほどの無能は限られているけれど、そこそこの低能は(残念ながら現代においても)結構な数がこの業界には蔓延っている。当然、怖い話ではあるがそのレベルの低能は1万年問題対策にも駆り出されている。まあ、聞かなかった事にしてくれ。
「00年」が「 年」になるなんてパターンは2000年問題において予想していた人はほとんどいないだろう。まさかそんなバカげた事を敢えてしているプログラムがあるなんてさすがに想像していなかったのだ。ただ、そう表示されるだけならいい、問題は年月日を数値として扱っていた事にある。
前述の通りコンピュータは数値と文字を区別している、けれど区別しない事も出来る。このバカげたバグ…想像しえなかった2000年問題を引き起こしたシステムにおいては文字と数値を区別していなかった。問題が発生する以前から「文字」としての数字を数値として扱っていた。そこに数字しか入らない事が前提で。結果、空白の侵入を許してしまった。こんなバカげたことがあるから数値と文字は区別しているのだ、敢えて。
もう書く事無い気もするけど、ひねり出そう。まあ、期待もされてないだろうしその内な。