パスワードを忘れた? アカウント作成
16535 story

年金問題、生年月日の日付を丸めて記録?? 142

ストーリー by nabeshin
翌年分は大丈夫ということは 部門より

seeds 曰く、

なにかと年金問題が取りざたされていますが、asahi.comの『生年月日まるめて記録〜』によると、
プログラムミスによって生年月日をそれぞれ丸めて記録されていたのではないか?
というような話が出てきていますが、これって「プログラムミス」?
COBOLのバグ? というか、受け入れテストしてなかったの?

ワタシ的には(意図的だったら)なんでわざわざそんなことしたの?ですが。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Tatenon (20311) on 2007年10月26日 11時51分 (#1239268) 日記
    10~19 → 10
    20~29 → 20
    30~31 → 30
    これは日の1の位を落とすだけなのでプログラムミスもあるかな~と思いますが

    1~9→1
    に丸まってる時点で『そういうコードがある』としか思えないですねぇ。

    何のために?と聞かれると、「阿呆と天才の考えることははかりしれん」としか答えようが無いですが。

    # 1~9を0に丸めた後、日付チェックで不正な日付として強制的に1日にしてる(エラー吐けよ)可能性も排除できませんが
    • by aSilo (34754) on 2007年10月26日 13時45分 (#1239388) 日記
      このバグはありえますね。

      文字列項目から年・月・日それぞれの数値項目に分解する時、文字の桁数で指定して代入っていうのはよくやることで、これを間違えて日付の十の桁だけが日付として扱われているっていうのはありうるバグだし、それが整形されて 1 日っていうのもありえる。
      特別に指定できなきゃいけない日付として「月初」と「月末」っていうのは割と定番で、たぶん 32 を「月末を意味するデータ」とかにして 0 を「月初を意味するデータ」とかにしていたんじゃないかな?
      --
      -- Where your reading book is, there will your heart be also  天戸 司郎 (Silo Amato)
      親コメント
    • by Anonymous Coward on 2007年10月26日 13時47分 (#1239391)
      レコード長(カラム幅)固定でデータベースを作ってた。
      追加で新しいデータも記録することになったのに,レコード長が足らない。
      しょうがないので重要性の低い生年月日の日付その他を切り詰めて空きスペースを作り出した。
      個人の識別は名前と生年・月があれば十分だから,こりゃグッドアイデアだ!

      ↑は冗談にしろ,大昔のCOBOLで作ったシステムではまれに似たような話が出てくる。
      (実際に製造管理システムの識別コード桁長増・データ追加にからむプログラム全面改修の話が爆発して,
      EDPシステムの担当者が激怒・椅子を蹴って立ち上がり会議から出ていこうとしたのを目撃したことがある)
      親コメント
  • by Super KUMASAN (34209) on 2007年10月26日 12時12分 (#1239287)
    そんな改造をしてもプログラマーの作業量は減りませんので、プログラマーの独断でそのようになったとは考えにくいです。要求仕様でそのように指示されたからやっただけでないかと。プログラマーも意味不明な仕様だなといぶかりながらも、自分の責任で無いからと、言われたとおりそのまんま実装したのではないかと思います。

    ここでプログラマーやっているみなさんも、そんな意味不明な仕様を出されても、そのまんま実装しちゃいますか? それとも、仕様作成者につっこみますか? それとも、出したところでつっこみは無視されますか?
    • > ここでプログラマーやっているみなさんも、そんな意味不明な仕様を出されても、そのまんま実装しちゃいますか?
      > それとも、仕様作成者につっこみますか? それとも、出したところでつっこみは無視されますか?
      そこで仕様作成者がドロンですよ
      --
      @ytnobody
      親コメント
    • by Anonymous Coward on 2007年10月26日 12時24分 (#1239302)
      > そのまんま実装しちゃいますか? それとも、仕様作成者につっこみますか?

      普通はそのまま作るでしょう。言ったとしても軽く突っ込む程度でしょう。で、笑い話の種になる。

      > それとも、出したところでつっこみは無視されますか?

      普通、無視されるでしょう。仕様としてプログラマにくるまでにここまでバカな仕様が議論されずに仕様になるわけないですから。
      親コメント
      • > それとも、出したところでつっこみは無視されますか?

        普通、無視されるでしょう。仕様としてプログラマにくるまでにここまでバカな仕様が議論されずに仕様になるわけないですから。


        馬鹿は、「馬鹿な仕様」が「馬鹿な仕様」であることを認識できないので、議論しません。

        賢者は「馬鹿がお客様の場合は」、そのようなポイントを議論しません。
        自分が出す発注物の仕様がこうだった場合のみ、議論します。

        結論としては、「発注元に賢者はいなかった」という事が今回露呈したわけです。
        --
        fjの教祖様
        親コメント
    • おかしいなと思ったときは、一応確認のために質問はしておきます。
      仕様を考えた人のミスということもあるので、
      お互いのために確認は入れます。

      結果として、そのままという結論になって、
      後々不具合になった場合に、「以前に確認していますよ。」と
      言えるようにはしています。

      たまにお互いに気づかずにスルーして、最後の最後でひっくりかえることも
      あるにはあるのですが。
      親コメント
  • by icecream (33977) on 2007年10月26日 13時47分 (#1239390) ホームページ
    年齢に関する法律 [wikipedia.org]というのがありまして。
    一回仕事で使いましたが、無駄にややこしい法律です。
    (かなり失念気味、間違えていたらご指摘ください。)
    要するに4月1日生まれは早生まれというアレです。

    誕生日から徴収開始月を求める場合、日まで正しく入力される必要があります。
    いい加減に丸めた数字では正しく徴収できないはずです。
    仕様書作成に関わった人が全員素人でも無い限りありえないと思うんですけどね。

    さて、リソースが超絶少ない頃の業者の思考で進めると誕生日から毎回計算は大変。
    徴収の管理が目的なら正しい生年月日ではなく、入力時に丸めてしまえとなるわけです。
    例1)19500331生まれの場合は195003
    例2)19500401生まれの場合は195003
    例3)19500402生まれの場合は195004
    計算機側で丸めて保存するのか、入力時に人間が丸めるかはわからないですが、
    このデーターだと月差で年齢が出せるので、計算のリソースが少なくて済むよねという訳。
    あくまで私の予想なので実際どうなのかはわかりませんけどね。

    #あとは2000年問題のときに桁が足りないから恐ろしいことをやって誤魔化したとか。
  • 理由? (スコア:3, おもしろおかしい)

    by Anonymous Coward on 2007年10月26日 11時48分 (#1239266)
    「それがぼくには楽しかったから」じゃダメですか?
    ダメでしょうね
  • 誕生日なんて飾りです (スコア:3, すばらしい洞察)

    by Anonymous Coward on 2007年10月26日 11時51分 (#1239269)
    当時の担当者も、まさか誕生日がなにかのデータ処理に使われるとは思わなかったからじゃない?
  • まるめる? (スコア:3, 興味深い)

    by VioletR (34157) on 2007年10月26日 11時53分 (#1239272)
    データを端折ってしまうことを「まるめる」というのは
    一般的な用語だったのでしょうか。

    IT系の現場ではごく当たり前のように使われていますが、
    世の中的にはどうなのでしょう
    • by YellowTurtle (16315) on 2007年10月26日 12時06分 (#1239285) ホームページ 日記
      そういえばIT系以外では聞いたことがないですね。
      一般的では無いのかも。

      そもそも、何で「まるめる」って言葉になったんでしょうね。
      英語では、四捨五入することをround〜 といういい方をするようですが、

       round → 円形 → まる → まるめる!

      というようなあたりが語源なんですかねえ。
      以上、オフトピでした。
      --
      @ytnobody
      親コメント
      • by tsubone (3599) on 2007年10月26日 12時31分 (#1239314) 日記
        引き算で繰り下げがあったとき、よく「十の位から『借りてくる』」という言い回しが
        とても疑問だったわけですが、後にキャリーフラグ・ボローフラグって言葉を聞いて
        ああ、英語からきたんだなと納得したわけですが。

        でもなんで、英語でも「借りる」なの…?

        # 「その十は返さなくていいんだ!」
        親コメント
      • by necop (6252) on 2007年10月26日 12時25分 (#1239303) 日記
        うどん粉を丸めると角が取れる様子から来ていると思います。
        親コメント
      • Re:まるめる? (スコア:1, 参考になる)

        by Anonymous Coward on 2007年10月26日 12時51分 (#1239338)
        健康保険の業界 [google.com]でも使います。
        親コメント
      • 日本古来よりの習慣「頭をまるめる」
        いかなる髪の長さであっても「頭をまるめる」ことにより
        みな同じ坊主頭となることから、細かな差を捨てるという
        意味になったのです。

        # もちろん適当
        親コメント
      • by TarZ (28055) on 2007年10月26日 13時58分 (#1239402) 日記
        そもそも、何で「まるめる」って言葉になったんでしょうね。
        英語では、四捨五入することをround~ といういい方をするようですが、

        ずばり、英語の"rounding"の直訳じゃないですかね。(さらに遡ると仏語のrondかな?)

        端数処理の用語としての使われ方は、ITが世に現れるよりはるか以前、金の貸し借りで利息計算がされるようになった頃からあるのではないかと思います。(ちょっと用例を調べきれなかった…)
        親コメント
    • Re:まるめる? (スコア:2, 参考になる)

      by Kotobuki_F (33751) on 2007年10月26日 13時05分 (#1239353) 日記
      「JIS Z 8401 数値の丸め方」というのがありますので,ITのみということはない。
      親コメント
    • by rtree (19626) on 2007年10月26日 12時00分 (#1239280)
      デフォルトと同じですね、、、
      親コメント
    • Re:まるめる? (スコア:1, 参考になる)

      by Anonymous Coward on 2007年10月26日 13時10分 (#1239360)
      今日昼間見たワイドショーでもコメンテーターと芸人だったかな?「丸める??」てなことを申してましたので
      あまり一般的ではないのかも知れません、その後アナウンサーが四捨五入や切り捨て/切り上げを
      そんな風に言うことがあると補足してましたが

      昼飯休憩の時に何となく見ていただけなので、微妙に間違ってたら失礼
      親コメント
  • どう考えても (スコア:3, すばらしい洞察)

    by 127.0.0.1 (33105) on 2007年10月26日 12時01分 (#1239282) 日記
    「あのミスが最後の一匹だとは思えない」

    #ゴジラ風に
  • 節約 (スコア:2, おもしろおかしい)

    by Anonymous Coward on 2007年10月26日 11時51分 (#1239270)
    1バイト節約した
  • アサヒって無い? (スコア:2, おもしろおかしい)

    by Anonymous Coward on 2007年10月26日 12時47分 (#1239332)
    ソース元がasahi.comなだけに

    まるめただけでデータが宙に浮く要因になるってのも理解できない
    (「重複データが多い」とかなら分かるけど)
    • >まるめただけでデータが宙に浮く要因になるってのも理解できない

      丸まったデータと丸まってないデータが時期の違いにより混在,両者が異なる人間に帰属される
      ものとして認識されるから,当人にきちんと帰属できないデータが生じる.

      って事もソース元に書いてありますが.
      親コメント
  • by Anonymous Coward on 2007年10月26日 13時39分 (#1239380)
    当時のシステムを考えると、データの格納は多分EBCDEC。
    汎用性を考えるとパックは使ってないと思われるので、1文字1バイトで格納。
    すると、例えば1980年12月31日なら、16進で表すと、
    文字型・符号なし数値型:F1 F9 F8 F0 F1 F2 F3 F1
    符号あり数値型(正の値):F1 F9 F8 F0 F1 F2 F3 C1
    と、最終桁のみ微妙に違う。

    COBOLでは相互の型変換は自動で行われる為に支障はまず起きないが、バッチシステムなどではひとつのプログラムで処理を全て行うことはまれで、単機能のプログラムの処理結果をユーティリティで繋ぐのが一般的。SORTとかね。
    そこでパラメータの設定不備があると、符号の含まれた末尾一バイトが飛ぶ。

    個々のプログラムがうまく動いてもデータが壊れる例なんてざらだったよ。
    結合テスト不備だな。
    • by parsley (5772) on 2007年10月26日 14時16分 (#1239413) 日記
      一度、社保事務所へ行きましょう。西暦でなんか記録されていません。
      当然のように元号です。
      --
      Copyright (c) 2001-2014 Parsley, All rights reserved.
      親コメント
    • by Anonymous Coward on 2007年10月26日 17時39分 (#1239550)
      日付はDB上は西暦8桁で格納しています。ただし、サインなしパックです。 16進数で表すと、
      19 80 12 31
      という具合に4バイトで済みます。

      16進のダンプリストを見る時は楽なのですが、これをプログラムで扱おうとすると、非常に面倒です。 そのため、DBから取り出した後はサイン付きパックに変換しています。
      変換と言ってもCOBOLなので、データ定義のREDEFINEを多用したものです。 サインなしパックのケツに'0C'をくっつけて、10で割ってサイン付きパックに代入、というもの。

      01 98 01 23 1C
      で、更にこれを通常の10進数の変数に代入することで、年、月、日を取り出せるようにします。
      01 DATE.
        03 YMD PIC 9(8).
        03 YMD-C REDEFINE YMD.
          05 YY PIC 9(4).
          05 MM PIC 9(2).
          05 DD PIC 9(2).
      ...
      MOVE SIGNED-PACKED-DATE TO YMD.
      MOVE YY TO YEAR.
      どこかで1桁くらい失われたりとかありそうです。

      # まだ私のコードが残っていそうな1960年代生まれのSEAC

      親コメント
  • PIC 90. では (スコア:1, 興味深い)

    by Anonymous Coward on 2007年10月26日 11時49分 (#1239267)
    初歩的なタイプミスと思われますが。
  • by harupunte (10435) on 2007年10月26日 12時05分 (#1239284) 日記
    まるめてください
  • by anonemouse (20052) on 2007年10月26日 12時30分 (#1239313)
    誕生日のフィールドには、年月日で8桁のはずが、7桁までしか保存されなかった。
    たとえば、19701223 が 1970122 と保存されてしまった。
    これを読む側のプログラマーがあれ?一桁たりねぇぞ?
    しょうがねぇから、無いからゼロなんだろ、0日は存在しないから
    その場合はたぶん1日だろうな・・・うん。ケテーイ

    そしてリリースの日を迎える・・・
  • by koduckin (15749) on 2007年10月26日 13時25分 (#1239368)
    プログラムミスが取りざたされてますが・・・

    > 「問題の時期にコンピューターを切り替えており、(正しく入力されたデータをまるめて変換する)プログラムミスがあったのではないか」

    * システムを更改して、データ移行をしようとした
    * ところが、もとのデータに生年月日の「日」が入っていなかったレコードが存在
    * その結果、データ移行に失敗
    * 仕方が無いので、「日」の無いレコードは、10, 20, 30の様な適当な数値で補って、とりあえず処理が終わるようにした。

    という可能性は?

    # よーく探したら、19?0年も不自然に多いかもしれない・・・
typodupeerror

長期的な見通しやビジョンはあえて持たないようにしてる -- Linus Torvalds

読み込み中...