パスワードを忘れた? アカウント作成
136820 story
プログラミング

期日に間に合わせるために仕込んだ「やっつけ技」は? 82

ストーリー by hylom
「あとで直そう」は危険シグナル 部門より

あるAnonymous Coward 曰く、

本家/.「Dirty Coding Tricks To Make a Deadline」より。

Gamasutraにゲーム開発者らが出荷に間に合うように仕込んだ「やっつけ技」を集めた記事が掲載されている。一部軽く抜粋してみると次のような感じだ。「確かプロジェクトの期限ギリギリの頃の話だったと思うのだが、あるレベルに隠さないといけないオブジェクトがあったのを見つけた。レベルを再びエクスポートするのは避けたかったし、チェックサムを使うのも避けたかった。そこでエンジンに次のようなコードを仕込んで出荷することとなった。

if( level == 10 && object == 56 ) {HideObject();}

その後我々の開発したエンジンを使っていた開発者が『なぜエクスポートしたのにオブジェクトが表示されないのか』と苛立った質問をぶつけてきたのは1年後位だっけかな。」

皆もギリギリ期日に間に合わせるために酷いコーディングを入れたことはあるだろうか?

/.J諸兄方はどのような「秘策」を仕込んだことがあるだろうか?伝え聞いたことのある武勇伝なども合わせてぜひ。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by iwakuralain (33086) on 2009年08月28日 13時18分 (#1630669)

    納品の2時間前になぜかエラーがはき出されはじめた。
    原因は不明だし調べる時間はない。
    そこでエラーの文字色を背景色と同じにして見た目は何もない状態にして納品。
    後日、調査して修正したが運良く気づかれる事はなかった。

  • by Anonymous Coward on 2009年08月28日 12時20分 (#1630626)

    中国のソフトベンダに外注を出すと、常にそのような局面に出くわします。

    ある障害が起きたときに、「この例外を出ないようにしろ」と伝えたときには、
    しれっと空catch節で包まれて納品されてきました。

    ・・・ええ、明らかに悪いのは当方です。
    彼らは言われたことをするのに、最大限の省力化を図るのを身上と考えている人たちです。
    行間に書いたことを読み取ってもらおうなどというのはただの甘えです。

    • 某オフショアにて

      あるJavaScriptがページの修正版が動かない、というのを試験で指摘すると、一時間後「直りました」と。確かに動く。

      「原因は何で、どう対応したの?」

      「はい、DOCTYPE 行を削除しました」

      orz

      --
      みんつ
      親コメント
      • オフショアっつーか、害虫^H^H外注ソフトで。
        どー見ても日本語っつーか文字コード周りの仕様チェックミス(多分ソフト内の検索エンジン的に通らずphpがエラー吐く、多分拡張してデータベースに日本語入力できるようにしたときに本来仕様上入らないはずのフィールドに入るようになってしまっていて、値判定条件でエラー起こしてるのにその対応が出来てない)なのに、指摘すると関連する生データをちょいちょいいじってごまかして「対応しました」とほざく。かつエンジン的には直ってないから、別のフィールドに日本語データ入れたりしたらまた止まったり正しく検索にかからなかったり何なり。で、自分ところにしか触れないような風を装って今後もよろしくときたもんだ。

        前の素敵上司はそことべたべたにアレだったのでお茶濁しの対応とわかってても受け入れていたものの、今はまともな上司がきていることだし、そこがメンテ契約今年もとったが最後、泣いたり笑ったり出来なくしてやる予定。とりあえずエラーが出る状態を技術的に原因レポート書かせてみたりとか、検索エンジンで論理的にあってるように見える条件で、なぜ合計が正しく取れないか回答をさせてみたりとかして、あとは他社がまともに引き継げるように今年でドキュメントとデータ構造ちゃんと書かせるところまでやらせたいところ、というかなぜ素敵上司以前の人はちゃんとその辺させてなかったのかと小一時間。

        親コメント
    • by Anonymous Coward on 2009年08月28日 19時54分 (#1630935)

      > ある障害が起きたときに、「この例外を出ないようにしろ」と伝えたときには、
      しれっと空catch節で包まれて納品されてきました。

      これって、完璧に正確に指示に従っているだけじゃないですか。省力化なんてしてませんね。
      この指示でそれ以外の対処をしたら突っ返されるのが常識ですよ。

      多分、彼らが外注でなく元請けならそんな対処はしないでしょうねぇ。

      親コメント
    • by Anonymous Coward on 2009年08月28日 18時52分 (#1630905)
      オフショアは開発コスト削減のため以上に、仕様書や障害票を作るのに最大限の省力化を図ろうとする人を排除するのに使えそうですな。
      親コメント
    • by Anonymous Coward
      >・・・ええ、明らかに悪いのは当方です。
      >彼らは言われたことをするのに、最大限の省力化を図るのを身上と考えている人たちです。
      >行間に書いたことを読み取ってもらおうなどというのはただの甘えです。

      そうそう、奴らはきっちり指示しないと「常識的に考えたら普通やるだろ」的なエラーハンドリングすらすっ飛ばすよね。
      この違いを把握してないこっちが悪い、と言われると返す言葉がないんだけど、でも…
      • by Anonymous Coward
        逆に行間を読んでなんとか相手の仕事に合わせようとする日本の会社は世界的な競争力があるんじゃないだろうか、
        と一瞬考えた・・・けどそれって世界基準じゃ単なる安請け合いなのか、しかも世界基準じゃ安くもないし。
        • by Anonymous Coward

          逆に行間を読んでなんとか相手の仕事に合わせようとする日本の会社は世界的な競争力があるんじゃないだろうか、

          そして、大地震が報告されるっと。

  • by gonta (11642) on 2009年08月28日 12時33分 (#1630638) 日記

    ・仕様書を書き換える
    バグっているところの仕様書が、非常にファジー(何とでも解釈できる)な内容だったので、

    「**のおつもりですか?いや、当方○○のつもりでした。今回はその機能切っておきます。後の修正で対応しましょう。」

    で、伸ばす。後に見つかったのは非常にイージーなミス。なぜか納期直前には、見つけられないイージーなバグ。

    --
    -- gonta --
    "May Macintosh be with you"
  • やっつけの末路 (スコア:4, おもしろおかしい)

    by Anonymous Coward on 2009年08月28日 21時23分 (#1630984)

    別部署に異動寸前に、運用オペレータから機能追加要望が。
    とりあえず1.5日のやっつけ作業で、超へんな画面設計のツールが完成。
    ほんとにこれで良いのか念を押すと、動くからいい、でそのまま置き土産リリース。

    5年後、運用のボスに話を聞いてみた。
    「ツール?今でも大活躍してるよ、うちの新人はまずあれの使い方を覚えることから始めるんだ」
    ごめんなさい、新人さん。っていうか、作り直せよ。

    また5年後、話を聞いてみた。
    「あのツールな、今度別の顧客のシステムにも導入するんだぜ。
     画面?もうみんなあれに慣れてるから変えられねーよ」
    バグは一時の恥、やっつけは一生の恥だと思った。

  • やっつけ連鎖 (スコア:3, 参考になる)

    by s02222 (20350) on 2009年08月28日 14時06分 (#1630698)
    むしろ、やっつけ技(?)をやっつけた経験ですが、社内向けにpythonで組まれたcgiのソース全体にs/2001/2002/gをかけた事があります。

    外注に作らせた毎年データを積み上げてく類のデータベースで、運用開始が2001年だったんですが、 なぜか年がハードコードされてて2002年以降に対応できるようにはなっておらず、 発注した奴と仕様を書いた奴と検品した奴、ちょっと出てこい、みたいな。

    本来の業務外だし、ちらっと見る程度では責任は持てない、外注先に相談してくれ、と、 逃げようとしたのですが「何でもいいからとにかく今すぐ何とかしろ」と厳命され、 ざっと見てひどいことにはならさそうだったので「最低限何とかした。後は知らん」とやっつけました。

    # 2003年以降も見た目が同じシステムを使い続けてるけど・・・その後どうなってるのかは知らない
  • 今は無きY証券の商品で (スコア:2, おもしろおかしい)

    by Lurch (10536) on 2009年08月28日 12時40分 (#1630640)
    買い付け後1週間は売る事ができないので、買い付けプログラムだけ作った事があります。
    カットオーバーが4月だったので、3末に契約切れで初日は別の仕事していました。

    .....N村のパンフレットが出来るまで商品の仕様が判らないとか本気で言うし^_^;
    --

    ------------
    惑星ケイロンまであと何マイル?
  • by Anonymous Coward on 2009年08月28日 13時14分 (#1630665)
    学生の頃のハードウェア作成の課題で、演習の合格にはテストAとテストBに通ることが必須。

    でも、どうしてもテストAとテストBの両方に通る回路にできなかったので、秘密のジャンパを設置。テストAが終わった瞬間にこそっとジャンパを抜いて、テストBだけ通る回路に切り替えてテストBもクリア。

    テストに立ち会ったTAの先輩には、「あれ?」と不審がられたようでしたが、「OKですよね!!」と強く言えば自信なさげにスルーしてくださいました。最後に物を言うのはハッタリです。
    • by gonzo (38147) on 2009年08月28日 14時11分 (#1630703)

      僕がやった同様の演習の回避方法は、
      ・理由は不明だがある部品を実装するとAが通るがBが通らない
      ・逆に、実装しないとAは通らなくなるがBが通る

      よって、
      [1] テストAを実施 =>PASS
      [2] テストBに移る前にうっかり部品を壊す (取れてしまうようにしたかなんだったか)
      [3] 修理すると見せかけて部品を外す (見た目は同じだが導通しないように改造する)
      [4] テストBを実施 =>PASS

      実演後は証拠隠滅のため、回路図も基板もすぐに捨てた

      親コメント
      • by tmf3jr (38872) on 2009年08月28日 17時44分 (#1630878)
        自分の場合もなぜか特定の部品、回路を実装すると動かない経験があります。
        気合と根性で調べまくった結果こんな事が分かりました。
        • CPU(Z80)が長年学生実験で使われていたため壊れていた
        • RAMも長年学生実験で使われていたため壊れていた
        • そもそもブレッドボードが内部でショートしていた

        もちろん、「こんな機材でまともに実験できるわけねーだろ」とレポートに書いて提出しましたよ。

        親コメント
    • 再構成可能ハードウェアによる設計欠陥の動的回避だと主張してみれば通ったかもよ?

      親コメント
    • by Anonymous Coward
      まるでゴードン・マーレイじゃないか!
  • 技術的負債 (スコア:2, 興味深い)

    by Anonymous Coward on 2009年08月28日 13時45分 (#1630687)

    http://capsctrl.que.jp/kdmsnr/wiki/bliki/?TechnicalDebt [capsctrl.que.jp]

    ご利用は計画的に。

  • by DeSoya (37220) on 2009年08月28日 15時59分 (#1630789)

    とあるゲームでのお話。

    描画中に例外がスローされるも、発生条件が稀で原因不明。
    マジ時間が無かったので、try~catchで捕まえて何もせずスキップさせました。

    一瞬消えるキャラがいるのは、多分そのせいです。。。
    (でもサポートに苦情は来なかったみたい)

  • 友達が仕事でMSX3用のHDDユーティリティを作っててカツカレー3杯(笑)でdebugを手伝っていた事があるんだけど、ある時期からいきなりハングアップしやすくなってしまった事があります。ある程度ロールバック等してみたんだけど効果なし。2人でソースとにらめっこしてたんだけど数日追っかけても全然アヤしいところが見つからないと。泊り込みで片方が寝てる間に片方がチェックという状況だったんだけど、ある時友達が寝ている時にふとコード行の最後に

    dummy:  256 dup(0)

    # だったかな? まあそんな感じのコード
    を入れたらピタッとハングアップしなくなったと。特にヒープを使うようなコードでもなかったし、逆にスタックエリアを同じように増やすだけでは改善しなかったり。何度もその行をつけたり外したりして比較したんだけど確かにこれで改善される…でもコード上でそのあたりのメモリを参照したり、スタックでつぶされている気配もなし。何でコレで直るんだろ…と思ってたけど結局それで納品したらしい(256についてはいろいろ実験して多少小さくしたような記憶もあるけどよく覚えていない)。もっともMSX3が派手にこけたせいでそのプログラムの存在はほとんど知られること無く終わったらしい。

    # 当然ながらこういう手を使うのはそれが始めてではなく
    # その前にも一度同じ手で逃げられた経験があったり。
    # でもなぜそれで動いてしまうのか未だに理解できず…

  • DB性能改善 (スコア:2, 興味深い)

    by Anonymous Coward on 2009年08月28日 20時10分 (#1630941)

     本番環境のDBに接続すると応答時間が遅いため、システム起動時にDB内容を読み、値を変数や分岐条件に埋め込んだCソースを自動生成しコンパイル、それを以後実行という凶悪な変更で、2桁近い性能速度を達成しました……。
     参照のみだから問題ないけど、自分でもよくあんな事としたよなぁと思う。

  • やっつけすぎる (スコア:2, 参考になる)

    by Necky (36791) on 2009年08月29日 22時11分 (#1631466) 日記

    そういえば、定時ちょっと前に自分の仕事を終わらせてのんびり
    していた時に、おえらいさんからプロジェクトがまったく
    できてないのでヘルプして!と電話がきたことがあって…

    聞けば約10KL程度で2~3ヶ月間と比較的時間があったので
    試しに新人数人にやらせてみたものの、実はお客さんに渡して
    テストしてもらう直前になって全く(数行すら!)できていないという、
    驚愕の事実。

    あんたはいったい何を管理していたんだと…

    まぁ職場に0泊3日で当日朝までになんとかコンパイルが通るところ
    まではできたものの、もちろんまともに動くわけがなく^^;
    ただ、後日修正しますということでその場を逃れることはできました。

    最終的には要求仕様にも問題があって、まともに動くようになるまでに
    1年かかりました。やっぱり10KL以上のやっつけコードなんて書くもの
    じゃないですね...

    # そんなことになる前に策を打てるようちゃんと周りも見ておかないと
    # ダメだと気づいた3年目の春

  • by duenmynoth (34577) on 2009年08月28日 12時14分 (#1630623) 日記
    JUnitを固定値で動かす、とかでしょうか

    #そういうのに限って本番もちゃんと動くからタチが悪い
  • テクニックというほどもなく素朴なヤツだけど、とれたて新鮮。今朝やったばかりのやつ。

    Java SwingでGUI書いてて、どこでコンポーネントのサイズ計算がおかしいのか
    (Boxレイアウトマネージャとパネルが何重にも入れ子になってて適切にサイズ情報が伝わっていないように見える。)
    どうしてもコンポーネントの一部が重なるので、トップレベルのウィンドウを上下方向に25%伸ばした。

    結果、表示は間延びしたが取りあえず重ならなくなった。

  • by Anonymous Coward on 2009年08月28日 13時44分 (#1630686)

    ある拡張ボードを2枚使えるようにドライバを改造するとき、
    通常なら配列で処理するのだろうが、あろうことか関数名や
    グローバル変数名に0と1をつけてきたものを作ってきた。

    真偽不明の後日談として、時間あたりの開発量(行数?)が
    良かったので表彰もされたそうだ。

    • Re:すばらしい生産性 (スコア:1, おもしろおかしい)

      by Anonymous Coward on 2009年08月28日 15時46分 (#1630780)
      ・関数名や変数名にサフィックスを付けるだけなので、工数も間違いも少ない。
      ・変更したコードの可読性は全く損なわれていない。
      ・今後3枚以上に対応させる場合でも、配列にすべき箇所=サフィックスを付けた箇所なので見通しがよい。1枚対応版から一足飛びに配列版にするとたぶんハマる。

      表彰されても不思議ではないと思います。
      親コメント
  • by rin_penguin (9144) on 2009年08月28日 14時44分 (#1630737)

    if( level == 10 && object == 56 ) {HideObject();}

    開発者じゃないのでコレに対するツッコミは入れられないのですが、
    最後の ();} が顔文字に見えてユーモアというかブラックジョークの
    センスがあるなぁとか思ってしまいました。

  • なんだったか忘れたけど (スコア:1, おもしろおかしい)

    by Anonymous Coward on 2009年08月28日 17時17分 (#1630859)
    int a = hoge(); if (a == -1) a = 0; // hoge()のバグ
    みたいな感じで、同じソース内にあるhoge()から-1が返る原因調べずに対処してたのは見たことがある。
  • こまった (スコア:1, おもしろおかしい)

    by Anonymous Coward on 2009年08月28日 21時31分 (#1630990)

    この匿名投稿の告白の一つが何の件の誰だかわかるような気がする

    #きがする,
    #だけだよね?

  • ある社内ツールで (スコア:1, おもしろおかしい)

    by Anonymous Coward on 2009年08月29日 17時04分 (#1631388)
    従業員が一定数を越えると失敗するバグを放置したことがある。
    従業員半分になったから問題なかったけど。
  • by aruefu (34582) on 2009年08月31日 8時58分 (#1631873) 日記
    昔々、富士通のパソコンで
    1月開始同年12月期末のデータと4月開始翌年3月期末のデータが混在するシステムで12月から1月の切り替わりが一部うまくいかないため、プログラムの一部を停止して4月から12月のみで運用開始して10月頃に完成版に入れ替えた事があります。

    #というか、1区画16MByteが最大とかいう時代の当時のパソコンでこんなヘンな処理なんて無茶ですよ・・・。
  • by Anonymous Coward on 2009年08月28日 12時22分 (#1630627)

    リリース直前の夜11時、1ヵ月ほどかけて開発した機能を呼び出すためのGUIが ない ことに気づき、慌てて急造のボタンを追加したことは今では懐かしい思い出です。このボタン、やっぱり使いにくい仕上がりになってしまい、のちのバージョンアップで修正しました。

    社内向けの自社開発ツールだったからこんなことが出来たわけですが・・・
    # いや、ダメなんじゃないか?

    # 関係者に知れると嫌なのでACで

  • by Anonymous Coward on 2009年08月28日 12時31分 (#1630636)
    T/O
  • by Anonymous Coward on 2009年08月28日 12時54分 (#1630650)
    いつでもどんな風にでも楽に変更でき、かつバグの入る余地が少なくなる様に、限りなくベタなコード。

    例↓(擬似コード)
    if (flag)
      case (flag==0)
        処理A();処理B();処理C();
      case (flag==1)
        処理A();処理C();
      case (flag==2)
        EXIT;
      case (flag==3)
        EXIT;
      case (flag==4)
        処理A();処理B();処理C();
      :
     以下、続く

    仕様がどう転ぶか分からないんだから、最適化なんてやってられません。
    • by Anonymous Coward

      if (flag)
        case (flag==0)

      これは、boolean へのキャストと == 演算子 がオーバーロードされていると読めば良いのか?

      • by Anonymous Coward
        flagが数値型なんじゃねの?
        • by Anonymous Coward
          Cだとするとif(flag)を通るのにcase(flag==0)は成立しない、という話では?
          ifの「flag」とcaseの「flag」は別物だと思いますよ。同じならせめてcaseだけで書きたいし。

          はっ!? 擬似コードだし、0未満がfalseな言語仕様、とか??(いや、それはない)
          • by Anonymous Coward

            はっ!? 擬似コードだし、0未満がfalseな言語仕様、とか??(いや、それはない)

            そこで、 goto #1630638 [srad.jp].

      • by Anonymous Coward

        最初はif分岐羅列で書いてたけど、
        さすがにswitch~caseで書くぐらいしないとかっこ悪いとおもって修正したら
        微妙に間違ってしまったとエスパー

typodupeerror

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

読み込み中...