【IT】本当にあった怖いプログラム(クソコード事例集)
■ このスレッドは過去ログ倉庫に格納されています
命名規則に関連するクソコード
クラス名、メソッド名、変数名などのネーミングを誤るとクソコード認定されてしまいます。会社やプロジェクトごとに多少のルールの違いはあるにせよ、どこに行っても漏れなくクソコード認定されてしまうネーミングパターンのご紹介です。
ネーミングが「記号+番号」
クラス名や変数名はわかりやすい名称にしましょう。ネーミングを見て内容を推測できるようになっていることが重要です。「記号+番号」ではそれを見るだけでは何のプログラムであるかを推測することは不可能です。
ネーミングに日本語、英語、ローマ字が混在
プロジェクトによってクラス名や変数名のネーミングルールは異なりますので、何がダメだというわけではありませんが、自由すぎるネーミングを行うのはやめましょう。きちんとプロジェクトでルールを統一することは重要です。
またにクラス名や変数名に日本語を使用することは言語仕様上可能とはなっておりますが、アルファベットを使うことが慣習となっていることと、日本語だとIDEの補完機能がうまく機能しないことがあって非効率化の原因となりますので、避けた方が無難です。
ネーミングにスペルミスがある
ネーミングでスペルミスがあると、後でソースコードから文字列で該当箇所を検索する時に検索にヒットせず、改修漏れの原因にもなります。正しいスペルと間違ったスペルが混在していたりするともう最悪です。スペルミスのないように気をつけましょう。
ネーミングに個人名が使われている
ネーミングはプログラムの中身がわかるような名前にするという観点からも、プログラムの中に自分の名前にすることは適切ではないのでやめましょう。
またソースコードレビューの時に思いがけず恥ずかしい思いをすることになるかもしれません。私は新人の時に「yonemura.sh」という名前で自分用に作ったシェルが他社に買い取られることになってしまい、他の会社のエンジニア20名くらいの前で「よねむらシェルとは・・・」と説明会で大きな声で読み上げるはめになって大変恥ずかしい思いをしたことがあります。
個人で使うプログラムでもプログラムの中身を表した無難なネーミングにしておくことを強くお勧めします。
ネーミングに番号やアルファベットの連番が使われている
クラスや変数のネーミングに、1からの連番やaからの連番を使うと、クラスや変数の中身を推測することが不可能になってしまうのでやめましょう。こういうことをすると後でそのプログラムをメンテナンスする人に、一々プログラムの処理を細かく解析することを強いることとなり、「このクソコード書いたやつまじで氏ね」と言われてしまいますのでやめましょう。
可読性に関連するクソコード
プログラムは後でメンテナンスするためにも、読みやすく書くことが非常に重要です。処理の内容だけ見ると読みやすくても読みにくくても実行される内容は同じかもしれませんが、読みやすいソースコードは改修の工数を下げますし、バグが混入するリスクも下げてくれます。
ネストが異様に深い
ソースコードの中にネストが何重にもなっている箇所があると可読性を下げてしまいます。ネストを何重まで許可するかはプロジェクトによって異なりますが、個人的には3重か4重くらいまでにおさまるようにコーディングするよう心がけていました。
これとセットで「1行の文字数は80文字まで」みたいなコーディング規約があるとさらにカオスな感じになってきます。ネストが10階層+1行80文字までとか、考えただけでも嫌になりますね。
インデントがずれている
今どきエディタが良い感じにインデントしてくれるのに、まさかインデントがずれているソースコードなんて存在しないと信じたいところですが、昔作られたソースコードだとそういう化石みたいなクソコードにお目にかかることはあるようですね。
カッコの閉じ位置のインデントがズレていたりすると、著しく可読性を下げますし、コードの解析を誤るリスクも増えてしまいます。こういうことをすると漏れなくクソコード認定されてしまうでしょう。
1つのメソッドが異様に長い
たまに1つのメソッドが異様に長いソースコードにお目にかかることがあります。私の個人的な感想だと某国にオフショア開発に出されてウミガメのように日本に帰ってきたソースコードにそういうメソッド分割の概念が消失してしまったかのようなソースコードが多いように思います。
1つのメソッドの長さが数千行にも及ぶような男前なソースコードにバグが混入してしまい、解析及び改修をしなければならなくなった時には絶望するしかありませんね。
以下ソース
https://axia.co.jp/2018-04-27 大昔に高校の部活で先輩が作ったBASICインタプリタは、よくステートメントを読み飛ばしてくれたので、
要所のIF文やGOTO文は2重3重に記述しておくのがコツだった >>184
while使わずforで書けば忘れない
whileでないとまずい事情があるならタイムアウト必ず入れる COBOL屋さんって変数名とか識別子が全部コード番号だよな。 NH5X7V5とかな。
で、このコードはどういう機能かを、手元の帳面めくって検索する。
すげーアホくさいが、昔は識別子の長さが短かったのでしょうがないんだと。 >>24
ケン・トンプソン「50年経っても言われるとは思わなかった」 どっち派?
if (…){
}
if (…)
{
} >>206
前者派
だって括弧で無駄に1行使っちゃうじゃん
見通し悪くなるからキライ >>117
> >ただし、そのグローバル変数は他関数から全く参照されない。
> デバッグ用じゃね?常に同じメモリ領域を監視すりゃいいわけだし。ロジアナでバス監視も出来る。
> >呼び出し元で戻り値を参照してるが、その値は常に0。
> 正常は0、エラーは負。正常終了しか実装してないから0返してるんだろ。
そんなまともなもんじゃなかったよー。
まぁ、必要性わからずにどっかからか持ってきたんだろうなーと思う。
>>142
単体、結合、システム全てのテストを通ったからOKよ。
(それまでは粒度の粗いシステムテストしかされてなかった…) >>207
行を無駄にしない、
if (x) foo(); else bar();
とかな。 >>210
たまにそういう書き方もするけど必ず{}は付ける
それが大人の危機管理 >>206
前の職場だと)と{の間に1行スペース入れるのが規約になってた
if (…) {
} >>20
そういう余計なローカルルールを持つこと事態が糞だと気づけよ メンバーのスキルレベルを揃えるのがとても重要。
普通に書いたのを初心者が全然分からん毎回解説とかかんべんしてほしいし、
一人だけ超絶技巧な奴が難解数学パズルのようなメンテ不能なのを書いては自慢するのもやめてほしい。 記号+数字のネーミングは難読化ツール通したコードだろ 俺の名前付きの作業用バッチ持ってるわw
名前変えとこ。 >>215
画面IDやら機能IDをそのまま使えば難読化w >>167-170
キャッシュコントローラーにバグが。 変数名じゃないけどログインパスワードにオンナの名前使ったバカは居た。
そいつが出張中、どうしてもそのマシンにログインしなきゃならなくなってだな… JavaScriptでは可読性を下げるためにあえて糞コードにしている。 >>152
昔の俺だ
更新内容を項目(セル?)単位じゃなく、レコード(行)単位でやってた
カンマ一つ忘れただけで地獄見たから、速攻で直したけど >>221
TypeScriptで普通に書いてJS吐かしたらいいんじゃないか >>195
それ喧嘩になるだろw
Bの方がブチ切れそう >>38
A一択
Aは話聞かない時点で社会人として終わってる
居たらプロジェクトから外すべき >>38
間違いなくA
A君は途中で退職せず、一生そのプロジェクト担当してくれるなら文句は言わないが 新規開発の場合、納期とテスト品質が評価ポイントだから
保守性は無視に近いわ。 オレの知ってるの
2000年問題の前に
和暦年を1桁で作ってて
平成10年問題ってのがあった・・・ >>206
if (…) {
; }
インデントが省略されちゃったのでもう一度
前の処理の後ろで閉じる なぜか削除するとバグになる
処理に全く関係ない代入命令
変数名はsasakimagic ゴキブリ在日韓国人の団体「民団」は
1カキコ8円で在日カキコ部隊を組織して
馬鹿げた反日カキコ(投稿)を書き込んでいます
よく読めば「ああ、これだな」とすぐ分かります オブジェクト指向だと以下の傾向があると設計に失敗している事が多い
@ゲッターセッターが多い
Aやたらと引数が多い FORTHは1行に数個のワード(命令)を書くが、1つの定義(関数のようなもの)が3行以内になるようにと、ガイドラインがある。
日本で守ってるやつ見たこと無いが。 タブとスペース並べが混在するインデント。
タブの数を変更するとぐちゃぐちゃになる。 個人ホームページを作ってた時は、サムネイルをsam1~sam2にしてたなあ プログラム書いている自分が好きなだけのヤツは例外なく糞コードを書く。 >某国にオフショア開発に出されてウミガメのように日本に帰ってきたソースコード
社会人になりたての頃、韓国の会社に出したら戻ってきたのが全面的に修正作業が必要なクソで
自分のところでやったほうがましだったなんてことがあったっけ >>183
RDBの負荷が重い時にはやらざるを得ない場合あるんだぜ
index張ってないとかなめてるのかって思うけどinsert updateの負荷がやばいとかコメントに書いてあると泣ける ストアードでやるならともかくアプリの中でループしているのがあった。
select文による情報取得だから排他もかからないのに、
百件くらいの処理なら大したことなかったが千件、一万件になった途端に
処理が終わるまでに1分以上かかる様になってしまった。
SQL一発に直したら1秒で終わった。 自動生成のORマッパー定義使ってんだろな。
バッチ的な処理だと人の手入れないと性能出ない。 setterに入力チェック処理入れてる糞中国人とかいたなぁ・・・ >>237
そんなのIDEのソース整形機能使えばいいんですよ >>245
そんなのBeanValidator使えばいいんですよ。 >>247
単純な作りじゃなかったんですよねぇ・・・
途中参画だったからDTOのクラスが結構あったのもあるんだれど
setterの引数にフラグも持たせてそのフラグで入力チェックしたりしなかったり判定してたり
setterなのになんかいろいろ処理をやってましたよw
後困ったのが○○Cdっていうコード用の変数なのに名称が設定されてたりとかもありましたw >>243
ストアドで作るとDBサーバーのメモリを食うし、サーバーの性能をみて判断やね。
確か15年くらい前はアプリ側にロジック持たせる風潮だっと思う。
ストアドで作るとベンダーロックインになる恐れがあるので嫌う人もいる。 >>250
結局、多少複雑なSQL文を作成することになりました
もしかしたら、前任者はサブクェリーすら書けない人だったかも スペルミスがどうたら言うやつに聞きたいが、 SetColor(rgb) と SetColour(rgb)
どっちが正解? 大学の教授がシミュレーション用に書いたコードを見たことあるけど
変数名が異常に短く意味が想像つかない、コメントもほぼ無い、増改築を繰り返してる・・
教授も「自分しかわからん!」って言ってたし 最近見かけた糞コードは、一度も値が代入されていないローカル変数を使ってる
プログラムと、時々ゼロ除算割り込みが発生するプログラム。
どっちも、先進運転支援システム(ADAS)製品のファームウェアで、これ使った
日本車が街中を走ってる。 >258
マイコンによってはゼロ除算でもリセットせずに続行する(型のマックス値として扱う)のもあるでな。
まあクソコードには違いないが。 見た目だけの問題なら、
コードを書き換えるプログラムつくればよくね?
書き換えはリスク高いから、コードチェックしてアラートだしてくれる会社あったけど。 見た目がおかしいと本当におかしいのか実はおかしくないのか分からなくて下手に弄れないんだよなぁ… 昔いたソフトハウスでN88BASICでFORループからGOTOでループの外へ飛んで戻ってこないプログラムとか普通にあった
動かしているとスタックがたまっていく200万のCADアプリ
すごい時代だった 某大手ITの年代物ソフトはこんなモノの比じゃない
常人なら泡吹いて死ぬレベルのコード >>263
CADみたいなユーザー数少ないのはお高いけどバグは多いのが普通
高いからと言ってそんなに開発費かけられるわけでもないし 多数のサンプルを自動測定するプログラムにバグがあって、夜間に自動測定したデータが最初
の5個分しか保存されていないことがあった。測定したサンプルの個数はプログラムで数えてい
るのに、保存するところでは数えた結果を使わずに固定値の5が入っていた。 >>257
俺も会社での自分業務用のスクリプトはそんな感じやな
人に渡すことも絶対しないが >>258
IDEにコード整形とかリファクタリング機能ついてんのにおまえ等そういうの使わないんだな >>269
そんな高尚な機能使うようなコードじゃねーしなあ
一つあたり多くても3000行くらいのコードやし
まあ、それでなくてもコンパイル時にこの変数使ってねーぞってワーニングあったら消してるけど
コード整形はスペース整形は良いがタブ整形はやめて欲しい
窓でコード作業してたのをLinuxに持っていった際にインデントめちゃくちゃになる・・・
昔の人はバイトサイズ減らすためにタブ使ってたらしいが、そんな時代じゃねーだろ >>270
それこそコード整形でスペースインデントに変換すればいいでしょうに 自社開発していたMS-DOS用のCADは会社公式に「半日に1度は再起動して下さい」ってアナウンスしてた。
EMS廻りで時々データ迷子に。だからEMSマッピングそのものをEMS上に置くのはヤメロと。 >>265
正直、ユーザーもデバッグしながら導入してるような状態だしなあ
じゃあ、他に選択肢あるか?って言ってもどこも似たり寄ったりだし
強いて言うならやっぱり、ユーザが多い会社のツールの方が多くの企業で使われて
バグフィックスされていくから、洗練される速度は早い >>273
つまり、AUTODESK社のをAdobeと同様月幾らで使う奴だな。 >>273
横河のCadvanceは図研に事業譲渡されちゃいましたね。 >>274
まあ、俺が使ってるCADは図面じゃなくて、回路図用のやつだが
事情は対して変わらんだろ?
大企業だと、CADベンダーと包括契約してて、最新版の先行利用(と言う名のベータテスト)やったり
次期verに関する機能要望受け付けてたり一種のパートナー状態
複雑さはOSに負けぬ劣らぬだが、使う人の数が少ないからな
一人あたりはボッタクるしか無いし、品質もOS程大金掛けてるわけじゃなかろうから仕方ないよね
って皆割り切ってる、もちろん、そういう事情がわかる業界内での利用だからだが ネットが発達して、商用ソフトは開発するほうがだいぶ気分楽になった。
大バグありで発売していきなりDVD1枚分丸ごとパッチな美少女ゲームとかさ。
最近のソフトはどれも自動更新機能が付いているのが普通だ。
バグが無くても時候のお知らせ入れるためだけに更新したりするNintendoDSとか。 >>247
BeanってMr.Beanですか?
一体何を言ってるんですか? リバースエンジニアリングって変数名とかまで分かるもんなの? >>281
通常は無理。
どあほうがデバッグオプション付けたままビルドしてシンボルテーブルがこ残ってるよなファイルだと可能。 >>281
完全に機械語にまで落とされる言語では厳しいけど
Javaとかみたいな最近の言語だと実行バイナリでもかなり
元コードに近い状態で残ってるんでなかったっけ?
だから、暗号化するとかいう話が出てきたりするわけで クソコードで思ったんだけど
int 1 → 1 になるはずが
内部演算の都合でこれが 1 減って 0 になるような場合を回避するとき
どういうコード書いてる? >>46
担当がいやなやつだと重要なコメント消してから納品することはあるな >>206
後者。前者は目をキョロキョロさせなきゃならない。
一目見て理解できるコードが最高。
山形の上には秋田がある。それが当たり前。
なのに、宮城を一度見る為に視線を微動させなきゃならないのはダメだ。 >>206
C++は前者
C#は後者
理由はVisual Studioのデフォルトだから >>87
こっちが出くわしたのはSQLを組み立てるための万里の長城のような関数。
7,000ステップに、SQL1、SQL2、…、SQL32くらいまでの変数が所々にあらわれ、くっつけられたり切り離されたりの難攻不落の長城。 >>206
いまどきIDEで自動整形だろ
IDEが勝手にやってくれるので気にしない せっかく綺麗なコードを書いても、完成後に丸一日かけて難読化処理をやらされると
なんか萎える… Web界隈だと広告用のJavaScript系のコードの中にはクソコードは良く見つかるな。
難読化などは昔のBASICを思い起こさせるし、スクリプトでスクリプトを組み立てるような
書き方などは常人には理解できないね。
GOTO文がなくともクソコードはかけるのだという良い見本。 0:平成
1:明治
2:大正
3:昭和
もうね、バカかと
絶対他にもバグ誘発するSTEPあるわ ■ このスレッドは過去ログ倉庫に格納されています