
#俺が見たクソコード選手権、Twitterで盛り上がる 218
ストーリー by hylom
最もクソなのはクソなコードなのに動くことだ 部門より
最もクソなのはクソなコードなのに動くことだ 部門より
あるAnonymous Coward 曰く、
ここ/.では毎度お馴染みのテーマ、「これまでに出くわした酷いソースコード」でtwitter界隈が盛り上がっている(Togetterまとめ)。
- ソース、DB、インプット、アウトプットの文字コードが全部違う
- プロジェクトの方針が1クラス1publicメソッドで、privateメソッド禁止
- コンストラクタだけで15000行
など強烈な例が挙げられているが、/.の古参の方々にもこれまでのキャリアの中で出会ったユニークな実例の数々を是非教えて貰いたい。
「昔の自分のソースコード」と言う意見は、タレコミ子にとっても耳が痛いところ……。
これを紹介しろって声が聞こえたw (スコア:5, 参考になる)
Cプログラミング診断室 [pro.or.jp]
元祖・クソコード紹介本。
しかし、現場で実際に目にしたクソコードは、ここで紹介したものが幼稚園児に見えるほどの壮絶なものばかりだった…とだけ言っておこうかw
clausemitz
ソースの2/3が変更履歴 (スコア:4, 興味深い)
// 20xx/04/01 add start
int i;
// 20xx/05/01 mod start
// int j;
//for (j = 0; j 100; j++) {
int j = 0;
while (j ++ < 100) {
// 20xx/05/01 mod end
・・・
}
// 20xx/04/01 add end
Re:ソースの2/3が変更履歴 (スコア:3, 参考になる)
それには事情がありまして。
かなりぼかして書きますが、ソースコードを諸外国含む政府機関に提出して、実行バイナリの許認可をもらう業界にいます。
提出するソースは、改定毎に全履歴が判らなければならないため、修正前は全てコメントアウトし、修正理由を書き加えることになっています。
#たとえばギャンブル関係とか……なのでAC。
Re:ソースの2/3が変更履歴 (スコア:1)
Re:ソースの2/3が変更履歴 (スコア:5, おもしろおかしい)
いや、フォルダバージョン管理。
\20120401_最新
\最新
\latest
\current
Re:ソースの2/3が変更履歴 (スコア:3)
「生協に置いてあるPC、フォルダ名がひどいw」で検索すると出てくる画像の奴とかー。
ちなみにどことは言わないけど、うちの会社というか自分はファイル名末尾に「.2012040401」とかつけてる
index.htmlだったらindex.html.2012040401 になる。
Re:ソースの2/3が変更履歴 (スコア:2)
Re:ソースの2/3が変更履歴 (スコア:1)
まさにそういう管理されたソースが目の前に
#誰が得するんだ、このゴミ記述
Re:ソースの2/3が変更履歴 (スコア:1)
デバッグ用コードとか、昔のコードとかが #if 0 で無効化されていて、それがソースの半分位占めていたりしてコードの流れが非常に見づらいものがよくあります。大抵 #if 0 の中はメンテされていないので復活させても動かなかったりするし、あるだけ無駄。
ソースファイル全部が無効化されていて、そこを解読しようとして無駄な時間を過ごしたり・・・
ありすぎて嫌になる。
プロパティ名 (スコア:4, 参考になる)
int texture_id; // モデルのID
int model_id; // テクスチャのID
コメントの間違いかと思っていたら、
"あっていた"ことにのけぞりました。
お願いだから直しておいてください・・・
Re:プロパティ名 (スコア:2)
最初はなんかの間違いだったんだよ。
で、なおそうとして texture_id → model_id、
model_id → texture_id の順に置換したら
全部 texture_id になっちまうもんだから
放置されたんだな。きっと。
Re:プロパティ名 (スコア:3)
そう。
そんな奴でも「経験×年です」というふれこみで
現場に送り込んでくる会社があったりしたんでしょ。
きっと。
ループ変数i, j (スコア:3)
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 5; i++) {
// …
}
}
# 1、2時間無駄にした orz
Re:ループ変数i, j (スコア:1)
ロートルプログラマなら有りそうだ
#昔FORTRANと言う言語が有ってなあ、i,j,k,l,m,nが暗黙の整数で…
Re:ループ変数i, j (スコア:1)
j は使わない (スコア:4, 参考になる)
疲れていたりする時にこれをやらかして懲りたので、ループ変数は i, k, m, n と区別しやすいアルファベットだけ使うようにしています。(j と l は絶対使わない)
# どこかの掲示板に書いたら馬鹿扱いされたので怖いけど、非 AC
Re:j は使わない (スコア:2)
8と間違いやすいのでB使用禁止、0と間違いやすいのでO使用禁止なと言うコード制約とか。
Re:ループ変数i, j (スコア:2)
ロートルプログラマ だから 目が...
# オレもだが
オレは逆ダァ (スコア:3, おもしろおかしい)
へぇー、よくこんなの考えついたなぁと思ってコメント見ると自分だった。
今のオレじゃあ思いつかない。
年とったなぁ。。。
「昔の自分の」を挙げない奴こそクソ (スコア:2)
それは進歩の証なのだから。
Re:「昔の自分の」を挙げない奴こそクソ (スコア:3, おもしろおかしい)
何となく5年ぐらい前の自分のプロジェクトで"hoge"を検索してみた。
"一致した行: 492 一致したファイル: 48 検索ファイル総数: 77"
その中でどんな使われ方してるのかと思って何個か見てみたら、こんなのがあった。
"int hoge = 12; //TODO: piyo!"
もうこのソース書いたやつは首を吊れと言いたくなった。いや自分なんだけど。
#業務でプログラムを書くようになってからhogeは封印しました…
Re:「昔の自分の」を挙げない奴こそクソ (スコア:2)
まだJavaの右も左もわかってない頃。わかってないのに毎日徹夜でいいから作れ!と。
request.getParametorを知らず、request.toString ?すると
パラメータ等が全部1つの長い文字列で返ってくるのを発見して、substringで切り出して書きました。
勿論動くわけがない。別なプロジェクトに飛ばされました。
今なら初めての言語でもネットですぐ調べられるし、そもそもドシロウトに1からソースかかせることもないですよね。
#フレームワークが流行ってから始めた人はどうやって動いてるかわからんけど画面の値が変数に勝手に入ってくると思ってる人居るんだろうなぁ
Re:「昔の自分の」を挙げない奴こそクソ (スコア:1)
>「昔の自分の」を挙げない奴こそクソ
そんなお上品な回答をするのが憚られるほど酷いコードを見ちゃうと…
教科書か、ジョークでしか見た事無いような笑えるコードでも、
意外とみんなの周りで動いてるんですね。
514 (スコア:2)
処理の本体がループの条件文にある (スコア:2)
仕様書のないプログラムを理解しようとしていて大変困ったのが以下のようなコード。
int hoge(){ /*グローバル変数や引数を使った重要な処理*/ }
for( i = 0; i hoge(); i++ ){
/* 凄く長くて良く読んだら結局は穴を掘って埋めてるだけの意味がない処理 */
}
もしかしてこれ普通のテクニックなのかなあ。
読んだ時はなんだこの迷彩、と思った。
桑田佳祐復活 (スコア:2)
クラウディアさんこういうコードを監視しとけよ
Re:桑田佳祐復活 (スコア:2)
一切拾わないのかwwwクソビッチwwww
Perlの (スコア:2)
クラス禁止 (スコア:1)
クソコードというかクソコーディング規約ですが。
本気でどうしようかと思った。
#関数名が通し番号とかじゃないだけマシだったと思うほかない
Re:クラス禁止 (スコア:1)
これでもProCの規約だったりする。
ほぼ全てのモジュールでカラム数以外超えまくりでしたがね。
Re:クラス禁止 (スコア:1)
で、自分が担当した物で一番小さかった関数でも100ラインを軽く超え、複数行にまたがっての記述
だらけになり、見た目の行数は非常に多くなるんですよ。
Re:クラス禁止 (スコア:1)
COBOLだけじゃなく大規模開発の旧態依然な体制のプロジェクトではありがちではなかったかと
# 自分の経験では今は無き某銀行のPL/Iで書かれたシステムで有りましたが
3000行のPHP 1000行の関数 50個のグローバル変数 (スコア:1)
Re:3000行のPHP 1000行の関数 50個のグローバル変数 (スコア:3, すばらしい洞察)
>まあ他人のクソコード見るのはあまり嫌いじゃ無い。自分の作った動かないコードは心が折れる。
たしかに「見てるだけ」なら嫌じゃない。
しかし正しく動かない他人のクソコードを、
正しく動かすことが自分の責任にされた場合、
その作業は精神を激しく精神を消耗し、
最後には作った奴を殺したくなる。
Re:3000行のPHP 1000行の関数 50個のグローバル変数 (スコア:1)
私も嫌いじゃない。
特に実績のある現行システムを他言語に移植するとかで好きに作りなおして良い場合は楽しかったりする。
Re:3000行のPHP 1000行の関数 50個のグローバル変数 (スコア:1)
・画面ごとに異なる項目の入れ物変数をsharedで定義
・case分岐してsharedの中身を書き換えるメソッドが存在
・そのメソッドの行数が1万行以上
・ちなみにオブジェクト指向言語
やはりこういう話題は盛り上がる (スコア:1)
タイトルオンリー
Re:#include "pascal-macro.h" (スコア:2)
これって四半世紀前のジョークだと思っていました.
Re:#include "pascal-macro.h" (スコア:2)
悪名高い「やさしいCプログラミング [pro.or.jp]」ですか?
# どこが やさしい んだ(笑)
clausemitz
Re:#include "pascal-macro.h" (スコア:1)
むしろ伝説のこの本のことかと思った。
「Cプリプロセッサ・パワー C言語の秘められた能力を解き放つ [pro.or.jp]」
Re:矛盾した定義 (スコア:3)
ところが両方を連結すると、とたんに動かない。調査してビックリ。
A社のヘッダーファイル → #define TRUE 1
B社のヘッダーファイル → #define TRUE (-1)
てのがありました。
clausemitz
Re:矛盾した定義 (スコア:1)
Re:矛盾した定義 (スコア:1)
これはC言語かな?
むしろ言語として真偽値がないことの方が問題なような。
#そりゃあ古い言語だからねえ……。
>if (flag == TRUE) ...
>みたいなコード書く方が悪い。
こっちは必ずしも悪くないような。
flag が、TRUE, FALSE, UNDEFINED, ERROR みたいな値を取るかもしれないんだから。
この書き方は「あんまり良くない」けれど、C言語だと機能的に制限があるので仕方なかった。
Re:矛盾した定義 (スコア:2)
だから「あんまり良くない」とは言ってる。
Javaだったらこんなコードは書かないよ。
>DBのNULL値に代表されるように
DBのNULL値はまったく別問題。
たぶんまだDBを良く分かってないんだよね。
Re:矛盾した定義 (スコア:2)
「xxxを256倍使う本」の著者のことですね!
Re:矛盾した定義 (スコア:2)
「xxxを256倍使う本」じゃなくて「「xxxを256倍使うための本」だった!
Re:C++のプログラムなのに (スコア:1)
4番目のどこが悪いんだろう。
ポインタじゃなくて実体のアップキャストをしていたということ?こんな感じに。
巧妙に潜伏したバグは心霊現象と区別が付かない。
悩んだときは97%ぐらいの確率で糞ソース (スコア:1)
結構悩むんですよねぇ、これには何か深い意味があるのかはたまたただの糞ソースなのか・・・。
経験則でいうと、97%が糞ソースで残り3%ぐらいだけ、深い意図があってやってることがあったりします。
そして、ああもう糞ソースばっか書きやがって!とまとめて直したりすると、稀に落とし穴に嵌ることにorz
# 動いてるソースは直すな?うるさいそこ直さないといけないバグが起きたんだよ!
Re:LabView (スコア:1)
サイズは数KBレベルの量で、少しぐらい当たりをと思ってファイル開いた
数秒後に心折れて、担当チームへ丸投げしました
Re:IF文で、必ず片方しか通らないソースコード (スコア:2)
ソースコードのインデントさえまともに出来てないので指摘したら
「俺のはオブジェクト指向だから」
って返事が返ってきたときは、いやホントどうしようかと思ったことならある。
#まぁ大学生の頃の話なので、自分に実害あるわけでもなく放置しましたが。
##コード書きに就職できていることはあるまい、、と信じている。