X



【IT】本当にあった怖いプログラム(クソコード事例集)

■ このスレッドは過去ログ倉庫に格納されています
0001ノチラ ★
垢版 |
2018/04/27(金) 21:01:14.39ID:CAP_USER
命名規則に関連するクソコード
クラス名、メソッド名、変数名などのネーミングを誤るとクソコード認定されてしまいます。会社やプロジェクトごとに多少のルールの違いはあるにせよ、どこに行っても漏れなくクソコード認定されてしまうネーミングパターンのご紹介です。

ネーミングが「記号+番号」
クラス名や変数名はわかりやすい名称にしましょう。ネーミングを見て内容を推測できるようになっていることが重要です。「記号+番号」ではそれを見るだけでは何のプログラムであるかを推測することは不可能です。

ネーミングに日本語、英語、ローマ字が混在
プロジェクトによってクラス名や変数名のネーミングルールは異なりますので、何がダメだというわけではありませんが、自由すぎるネーミングを行うのはやめましょう。きちんとプロジェクトでルールを統一することは重要です。

またにクラス名や変数名に日本語を使用することは言語仕様上可能とはなっておりますが、アルファベットを使うことが慣習となっていることと、日本語だとIDEの補完機能がうまく機能しないことがあって非効率化の原因となりますので、避けた方が無難です。

ネーミングにスペルミスがある
ネーミングでスペルミスがあると、後でソースコードから文字列で該当箇所を検索する時に検索にヒットせず、改修漏れの原因にもなります。正しいスペルと間違ったスペルが混在していたりするともう最悪です。スペルミスのないように気をつけましょう。

ネーミングに個人名が使われている
ネーミングはプログラムの中身がわかるような名前にするという観点からも、プログラムの中に自分の名前にすることは適切ではないのでやめましょう。

またソースコードレビューの時に思いがけず恥ずかしい思いをすることになるかもしれません。私は新人の時に「yonemura.sh」という名前で自分用に作ったシェルが他社に買い取られることになってしまい、他の会社のエンジニア20名くらいの前で「よねむらシェルとは・・・」と説明会で大きな声で読み上げるはめになって大変恥ずかしい思いをしたことがあります。

個人で使うプログラムでもプログラムの中身を表した無難なネーミングにしておくことを強くお勧めします。

ネーミングに番号やアルファベットの連番が使われている
クラスや変数のネーミングに、1からの連番やaからの連番を使うと、クラスや変数の中身を推測することが不可能になってしまうのでやめましょう。こういうことをすると後でそのプログラムをメンテナンスする人に、一々プログラムの処理を細かく解析することを強いることとなり、「このクソコード書いたやつまじで氏ね」と言われてしまいますのでやめましょう。

可読性に関連するクソコード
プログラムは後でメンテナンスするためにも、読みやすく書くことが非常に重要です。処理の内容だけ見ると読みやすくても読みにくくても実行される内容は同じかもしれませんが、読みやすいソースコードは改修の工数を下げますし、バグが混入するリスクも下げてくれます。

ネストが異様に深い
ソースコードの中にネストが何重にもなっている箇所があると可読性を下げてしまいます。ネストを何重まで許可するかはプロジェクトによって異なりますが、個人的には3重か4重くらいまでにおさまるようにコーディングするよう心がけていました。

これとセットで「1行の文字数は80文字まで」みたいなコーディング規約があるとさらにカオスな感じになってきます。ネストが10階層+1行80文字までとか、考えただけでも嫌になりますね。

インデントがずれている
今どきエディタが良い感じにインデントしてくれるのに、まさかインデントがずれているソースコードなんて存在しないと信じたいところですが、昔作られたソースコードだとそういう化石みたいなクソコードにお目にかかることはあるようですね。

カッコの閉じ位置のインデントがズレていたりすると、著しく可読性を下げますし、コードの解析を誤るリスクも増えてしまいます。こういうことをすると漏れなくクソコード認定されてしまうでしょう。

1つのメソッドが異様に長い
たまに1つのメソッドが異様に長いソースコードにお目にかかることがあります。私の個人的な感想だと某国にオフショア開発に出されてウミガメのように日本に帰ってきたソースコードにそういうメソッド分割の概念が消失してしまったかのようなソースコードが多いように思います。

1つのメソッドの長さが数千行にも及ぶような男前なソースコードにバグが混入してしまい、解析及び改修をしなければならなくなった時には絶望するしかありませんね。
以下ソース
https://axia.co.jp/2018-04-27
0202名刺は切らしておりまして
垢版 |
2018/04/28(土) 12:29:00.26ID:zD3vT4eW
大昔に高校の部活で先輩が作ったBASICインタプリタは、よくステートメントを読み飛ばしてくれたので、
要所のIF文やGOTO文は2重3重に記述しておくのがコツだった
0203名刺は切らしておりまして
垢版 |
2018/04/28(土) 12:41:06.10ID:D9svBvK7
>>184
while使わずforで書けば忘れない
whileでないとまずい事情があるならタイムアウト必ず入れる
0204名刺は切らしておりまして
垢版 |
2018/04/28(土) 12:41:58.26ID:5YsjTPZL
COBOL屋さんって変数名とか識別子が全部コード番号だよな。 NH5X7V5とかな。
で、このコードはどういう機能かを、手元の帳面めくって検索する。

すげーアホくさいが、昔は識別子の長さが短かったのでしょうがないんだと。
0205名刺は切らしておりまして
垢版 |
2018/04/28(土) 12:49:17.05ID:I9MKC8JJ
>>24
ケン・トンプソン「50年経っても言われるとは思わなかった」
0206名刺は切らしておりまして
垢版 |
2018/04/28(土) 12:57:28.17ID:f4/sW+De
どっち派?
if (…){


if (…)
{
0207名刺は切らしておりまして
垢版 |
2018/04/28(土) 12:58:58.59ID:XuVNkchh
>>206
前者派
だって括弧で無駄に1行使っちゃうじゃん
見通し悪くなるからキライ
0209名刺は切らしておりまして
垢版 |
2018/04/28(土) 13:02:59.85ID:zAnO1Wu8
>>117
> >ただし、そのグローバル変数は他関数から全く参照されない。
> デバッグ用じゃね?常に同じメモリ領域を監視すりゃいいわけだし。ロジアナでバス監視も出来る。
> >呼び出し元で戻り値を参照してるが、その値は常に0。
> 正常は0、エラーは負。正常終了しか実装してないから0返してるんだろ。
そんなまともなもんじゃなかったよー。
まぁ、必要性わからずにどっかからか持ってきたんだろうなーと思う。

>>142
単体、結合、システム全てのテストを通ったからOKよ。
(それまでは粒度の粗いシステムテストしかされてなかった…)
0210名刺は切らしておりまして
垢版 |
2018/04/28(土) 13:05:25.49ID:5YsjTPZL
>>207
行を無駄にしない、

if (x) foo(); else bar();

とかな。
0211名刺は切らしておりまして
垢版 |
2018/04/28(土) 13:08:00.53ID:XuVNkchh
>>210
たまにそういう書き方もするけど必ず{}は付ける
それが大人の危機管理
0214名刺は切らしておりまして
垢版 |
2018/04/28(土) 13:18:26.31ID:5YsjTPZL
メンバーのスキルレベルを揃えるのがとても重要。

普通に書いたのを初心者が全然分からん毎回解説とかかんべんしてほしいし、
一人だけ超絶技巧な奴が難解数学パズルのようなメンテ不能なのを書いては自慢するのもやめてほしい。
0219名刺は切らしておりまして
垢版 |
2018/04/28(土) 13:29:31.25ID:LSjs9KYj
>>167-170
キャッシュコントローラーにバグが。
0220名刺は切らしておりまして
垢版 |
2018/04/28(土) 13:31:09.75ID:5YsjTPZL
変数名じゃないけどログインパスワードにオンナの名前使ったバカは居た。
そいつが出張中、どうしてもそのマシンにログインしなきゃならなくなってだな…
0221名刺は切らしておりまして
垢版 |
2018/04/28(土) 13:55:43.55ID:C5R4zLWw
JavaScriptでは可読性を下げるためにあえて糞コードにしている。
0222名刺は切らしておりまして
垢版 |
2018/04/28(土) 14:02:24.67ID:7PWWeHer
>>152
昔の俺だ
更新内容を項目(セル?)単位じゃなく、レコード(行)単位でやってた

カンマ一つ忘れただけで地獄見たから、速攻で直したけど
0224名刺は切らしておりまして
垢版 |
2018/04/28(土) 14:06:28.82ID:9V0zlg7R
>>195
それ喧嘩になるだろw
Bの方がブチ切れそう
0225名刺は切らしておりまして
垢版 |
2018/04/28(土) 14:18:12.92ID:D9svBvK7
>>38
A一択
Aは話聞かない時点で社会人として終わってる
居たらプロジェクトから外すべき
0228名刺は切らしておりまして
垢版 |
2018/04/28(土) 14:23:28.27ID:D9svBvK7
>>206

下は間延びして気持ち悪い
0231名刺は切らしておりまして
垢版 |
2018/04/28(土) 14:42:13.63ID:82lvGs9e
オレの知ってるの
2000年問題の前に
和暦年を1桁で作ってて
平成10年問題ってのがあった・・・
0232230
垢版 |
2018/04/28(土) 14:45:03.35ID:akne9nQP
>>206
if (…) {
   ; }

インデントが省略されちゃったのでもう一度
前の処理の後ろで閉じる
0234名刺は切らしておりまして
垢版 |
2018/04/28(土) 15:59:47.66ID:7U3nQz0S
ゴキブリ在日韓国人の団体「民団」は
1カキコ8円で在日カキコ部隊を組織して
馬鹿げた反日カキコ(投稿)を書き込んでいます
よく読めば「ああ、これだな」とすぐ分かります
0235名刺は切らしておりまして
垢版 |
2018/04/28(土) 16:00:52.90ID:XuVNkchh
オブジェクト指向だと以下の傾向があると設計に失敗している事が多い
@ゲッターセッターが多い
Aやたらと引数が多い
0236名刺は切らしておりまして
垢版 |
2018/04/28(土) 16:05:07.25ID:5YsjTPZL
FORTHは1行に数個のワード(命令)を書くが、1つの定義(関数のようなもの)が3行以内になるようにと、ガイドラインがある。

日本で守ってるやつ見たこと無いが。
0237名刺は切らしておりまして
垢版 |
2018/04/28(土) 16:13:53.20ID:TmyZr2Uk
タブとスペース並べが混在するインデント。
タブの数を変更するとぐちゃぐちゃになる。
0241名刺は切らしておりまして
垢版 |
2018/04/28(土) 16:41:35.50ID:E7CVBScJ
>某国にオフショア開発に出されてウミガメのように日本に帰ってきたソースコード

社会人になりたての頃、韓国の会社に出したら戻ってきたのが全面的に修正作業が必要なクソで
自分のところでやったほうがましだったなんてことがあったっけ
0242名刺は切らしておりまして
垢版 |
2018/04/28(土) 16:42:43.51ID:NYPyA2x/
>>183
RDBの負荷が重い時にはやらざるを得ない場合あるんだぜ
index張ってないとかなめてるのかって思うけどinsert updateの負荷がやばいとかコメントに書いてあると泣ける
0243名刺は切らしておりまして
垢版 |
2018/04/28(土) 17:12:15.92ID:Q5Ts0VdD
ストアードでやるならともかくアプリの中でループしているのがあった。
select文による情報取得だから排他もかからないのに、
百件くらいの処理なら大したことなかったが千件、一万件になった途端に
処理が終わるまでに1分以上かかる様になってしまった。
SQL一発に直したら1秒で終わった。
0244名刺は切らしておりまして
垢版 |
2018/04/28(土) 17:20:09.86ID:oToeXhG9
自動生成のORマッパー定義使ってんだろな。
バッチ的な処理だと人の手入れないと性能出ない。
0249名刺は切らしておりまして
垢版 |
2018/04/28(土) 17:49:13.02ID:BcVzbjpX
>>247
単純な作りじゃなかったんですよねぇ・・・
途中参画だったからDTOのクラスが結構あったのもあるんだれど
setterの引数にフラグも持たせてそのフラグで入力チェックしたりしなかったり判定してたり
setterなのになんかいろいろ処理をやってましたよw
後困ったのが○○Cdっていうコード用の変数なのに名称が設定されてたりとかもありましたw
0250名刺は切らしておりまして
垢版 |
2018/04/28(土) 17:49:26.44ID:pda+dCR7
>>243
ストアドで作るとDBサーバーのメモリを食うし、サーバーの性能をみて判断やね。
確か15年くらい前はアプリ側にロジック持たせる風潮だっと思う。
ストアドで作るとベンダーロックインになる恐れがあるので嫌う人もいる。
0251名刺は切らしておりまして
垢版 |
2018/04/28(土) 17:52:46.54ID:Q5Ts0VdD
>>250
結局、多少複雑なSQL文を作成することになりました
もしかしたら、前任者はサブクェリーすら書けない人だったかも
0252名刺は切らしておりまして
垢版 |
2018/04/28(土) 18:03:11.66ID:qsgPqnP/
スペルミスがどうたら言うやつに聞きたいが、 SetColor(rgb) と SetColour(rgb)
どっちが正解?
0254名刺は切らしておりまして
垢版 |
2018/04/28(土) 18:08:15.38ID:cxqb81h5
くっさ
0257名刺は切らしておりまして
垢版 |
2018/04/28(土) 18:21:23.46ID:RG7F+pkW
大学の教授がシミュレーション用に書いたコードを見たことあるけど
変数名が異常に短く意味が想像つかない、コメントもほぼ無い、増改築を繰り返してる・・
教授も「自分しかわからん!」って言ってたし
0258名刺は切らしておりまして
垢版 |
2018/04/28(土) 18:27:59.98ID:qsgPqnP/
最近見かけた糞コードは、一度も値が代入されていないローカル変数を使ってる
プログラムと、時々ゼロ除算割り込みが発生するプログラム。

どっちも、先進運転支援システム(ADAS)製品のファームウェアで、これ使った
日本車が街中を走ってる。
0259名刺は切らしておりまして
垢版 |
2018/04/28(土) 18:39:30.88ID:TaziJFIO
>258
マイコンによってはゼロ除算でもリセットせずに続行する(型のマックス値として扱う)のもあるでな。
まあクソコードには違いないが。
0260名刺は切らしておりまして
垢版 |
2018/04/28(土) 18:39:45.50ID:lMX+3eH5
見た目だけの問題なら、
コードを書き換えるプログラムつくればよくね?
書き換えはリスク高いから、コードチェックしてアラートだしてくれる会社あったけど。
0261名刺は切らしておりまして
垢版 |
2018/04/28(土) 18:44:51.75ID:jGYcyZZ9
見た目がおかしいと本当におかしいのか実はおかしくないのか分からなくて下手に弄れないんだよなぁ…
0263名刺は切らしておりまして
垢版 |
2018/04/28(土) 18:54:46.86ID:qbm8W2om
昔いたソフトハウスでN88BASICでFORループからGOTOでループの外へ飛んで戻ってこないプログラムとか普通にあった
動かしているとスタックがたまっていく200万のCADアプリ

すごい時代だった
0264名刺は切らしておりまして
垢版 |
2018/04/28(土) 18:59:04.67ID:/5Z6XgEy
某大手ITの年代物ソフトはこんなモノの比じゃない
常人なら泡吹いて死ぬレベルのコード
0265名刺は切らしておりまして
垢版 |
2018/04/28(土) 19:06:36.58ID:LFDK2Ucy
>>263
CADみたいなユーザー数少ないのはお高いけどバグは多いのが普通
高いからと言ってそんなに開発費かけられるわけでもないし
0266名刺は切らしておりまして
垢版 |
2018/04/28(土) 19:08:20.27ID:fcGFNMd+
多数のサンプルを自動測定するプログラムにバグがあって、夜間に自動測定したデータが最初
の5個分しか保存されていないことがあった。測定したサンプルの個数はプログラムで数えてい
るのに、保存するところでは数えた結果を使わずに固定値の5が入っていた。
0268名刺は切らしておりまして
垢版 |
2018/04/28(土) 19:16:26.16ID:9wSuL1Zg
>>266 ひでえw
0270名刺は切らしておりまして
垢版 |
2018/04/28(土) 19:24:22.99ID:/FPIdlp4
>>269
そんな高尚な機能使うようなコードじゃねーしなあ
一つあたり多くても3000行くらいのコードやし
まあ、それでなくてもコンパイル時にこの変数使ってねーぞってワーニングあったら消してるけど
コード整形はスペース整形は良いがタブ整形はやめて欲しい
窓でコード作業してたのをLinuxに持っていった際にインデントめちゃくちゃになる・・・
昔の人はバイトサイズ減らすためにタブ使ってたらしいが、そんな時代じゃねーだろ
0272名刺は切らしておりまして
垢版 |
2018/04/28(土) 19:35:36.94ID:5YsjTPZL
自社開発していたMS-DOS用のCADは会社公式に「半日に1度は再起動して下さい」ってアナウンスしてた。
EMS廻りで時々データ迷子に。だからEMSマッピングそのものをEMS上に置くのはヤメロと。
0273名刺は切らしておりまして
垢版 |
2018/04/28(土) 19:39:55.83ID:/FPIdlp4
>>265
正直、ユーザーもデバッグしながら導入してるような状態だしなあ
じゃあ、他に選択肢あるか?って言ってもどこも似たり寄ったりだし
強いて言うならやっぱり、ユーザが多い会社のツールの方が多くの企業で使われて
バグフィックスされていくから、洗練される速度は早い
0274名刺は切らしておりまして
垢版 |
2018/04/28(土) 19:43:23.61ID:5YsjTPZL
>>273
つまり、AUTODESK社のをAdobeと同様月幾らで使う奴だな。
0275名刺は切らしておりまして
垢版 |
2018/04/28(土) 19:48:29.86ID:UyOeOKj8
>>273
横河のCadvanceは図研に事業譲渡されちゃいましたね。
0276名刺は切らしておりまして
垢版 |
2018/04/28(土) 19:48:38.35ID:/FPIdlp4
>>274
まあ、俺が使ってるCADは図面じゃなくて、回路図用のやつだが
事情は対して変わらんだろ?
大企業だと、CADベンダーと包括契約してて、最新版の先行利用(と言う名のベータテスト)やったり
次期verに関する機能要望受け付けてたり一種のパートナー状態
複雑さはOSに負けぬ劣らぬだが、使う人の数が少ないからな
一人あたりはボッタクるしか無いし、品質もOS程大金掛けてるわけじゃなかろうから仕方ないよね
って皆割り切ってる、もちろん、そういう事情がわかる業界内での利用だからだが
0277名刺は切らしておりまして
垢版 |
2018/04/28(土) 19:55:29.22ID:5YsjTPZL
ネットが発達して、商用ソフトは開発するほうがだいぶ気分楽になった。
大バグありで発売していきなりDVD1枚分丸ごとパッチな美少女ゲームとかさ。
最近のソフトはどれも自動更新機能が付いているのが普通だ。
バグが無くても時候のお知らせ入れるためだけに更新したりするNintendoDSとか。
0279名刺は切らしておりまして
垢版 |
2018/04/28(土) 20:09:53.11ID:RayhoNd2
>>36
N88BASIC(86)
懐かしすぎw
0280名刺は切らしておりまして
垢版 |
2018/04/28(土) 20:18:10.79ID:7xqZZ3EZ
>>247
BeanってMr.Beanですか?
一体何を言ってるんですか?
0281名刺は切らしておりまして
垢版 |
2018/04/28(土) 20:23:23.17ID:1haJJ1Ef
リバースエンジニアリングって変数名とかまで分かるもんなの?
0282名刺は切らしておりまして
垢版 |
2018/04/28(土) 20:28:54.33ID:5YsjTPZL
>>281
通常は無理。
どあほうがデバッグオプション付けたままビルドしてシンボルテーブルがこ残ってるよなファイルだと可能。
0283名刺は切らしておりまして
垢版 |
2018/04/28(土) 20:29:25.38ID:/FPIdlp4
>>281
完全に機械語にまで落とされる言語では厳しいけど
Javaとかみたいな最近の言語だと実行バイナリでもかなり
元コードに近い状態で残ってるんでなかったっけ?
だから、暗号化するとかいう話が出てきたりするわけで
0284名刺は切らしておりまして
垢版 |
2018/04/28(土) 20:52:19.35ID:7xqZZ3EZ
実際にデコンパイラ使った事がないのがばればれ
0285名刺は切らしておりまして
垢版 |
2018/04/28(土) 21:01:23.06ID:7xqZZ3EZ
Javaは最近の言語なのである!
0286名刺は切らしておりまして
垢版 |
2018/04/28(土) 21:14:17.41ID:9GSs03FX
クソコードで思ったんだけど
int 1 → 1 になるはずが
内部演算の都合でこれが 1 減って 0 になるような場合を回避するとき
どういうコード書いてる?
0287名刺は切らしておりまして
垢版 |
2018/04/28(土) 21:15:24.37ID:kTVICVlq
>>46
担当がいやなやつだと重要なコメント消してから納品することはあるな
0290名刺は切らしておりまして
垢版 |
2018/04/28(土) 21:33:36.54ID:TmyZr2Uk
C言語でgoto使ってる奴
0291名刺は切らしておりまして
垢版 |
2018/04/28(土) 21:41:31.96ID:mkrCgmc5
>>206
後者。前者は目をキョロキョロさせなきゃならない。
一目見て理解できるコードが最高。
山形の上には秋田がある。それが当たり前。
なのに、宮城を一度見る為に視線を微動させなきゃならないのはダメだ。
0294名刺は切らしておりまして
垢版 |
2018/04/28(土) 21:58:21.33ID:VpK8RVVn
>>87
こっちが出くわしたのはSQLを組み立てるための万里の長城のような関数。
7,000ステップに、SQL1、SQL2、…、SQL32くらいまでの変数が所々にあらわれ、くっつけられたり切り離されたりの難攻不落の長城。
0295名刺は切らしておりまして
垢版 |
2018/04/28(土) 21:59:32.78ID:PUwWFmmT
>>206
いまどきIDEで自動整形だろ
IDEが勝手にやってくれるので気にしない
0297名刺は切らしておりまして
垢版 |
2018/04/28(土) 22:51:28.15ID:zD3vT4eW
せっかく綺麗なコードを書いても、完成後に丸一日かけて難読化処理をやらされると
なんか萎える…
0298名刺は切らしておりまして
垢版 |
2018/04/28(土) 23:03:42.05ID:ebaup1NN
Web界隈だと広告用のJavaScript系のコードの中にはクソコードは良く見つかるな。
難読化などは昔のBASICを思い起こさせるし、スクリプトでスクリプトを組み立てるような
書き方などは常人には理解できないね。
GOTO文がなくともクソコードはかけるのだという良い見本。
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況