プログラマーは時々複雑なコードを意図的にオーバーしますか?[閉まっている]


26

スタックオーバーフローでは、多くの場合、人々(特にプログラマー)は、元の問題よりもはるかに複雑なソリューションの問題の解決を過度に複雑にする傾向がありますか?私は決して専門家ではありませんが、最も簡単な解決策を試してみます(そして明らかにこれはどこでも機能しません)が、人々が思われる仕事で簡単な解決策を提案することでかなりの成功を収めましたもっと複雑なソリューションを見落とすことはありませんか?

これはプログラマーにとっては普通のことなのでしょうか.....または、私は正しい見方で考えているだけではありませんか。


5
1.はい、時々思います。2.はい、少なくとも一部のプログラマーは、少なくとも時々コードを過度に複雑にします。3.ケースはクローズされました。
ジョブ

3
「考えたことがあるはずです!」と誰かに怒鳴られたことはありますか?最初の要件収集に記載されていない要件を逃したとき それが、物事を必要以上に複雑にする原因になります。
JBキング

回答:


18

明らかに、一部のプログラマーは、誰も理解できない非常に複雑なコードを作成することで、彼らがどれほど賢いかを示すことに熱心です。他のプログラマーは非常に高いレベルで発砲しているため、ソリューションの複雑化は自然な進化です。

私が今まで見た中で最悪のコードのいくつかは、2000行を超えるコードを含むメソッドでした。間違いなくこのコードは複雑でしたが、非常に貧弱でもありました。

優れたプログラマーは、過度に複雑なコードを避けると思います。これには、設計パターンを実際にそれを必要としないソリューションに適合させる誘惑を回避することが含まれます。また、神オブジェクト、魔法のボタン、時期尚早の最適化、時期尚早の一般化、およびその他のアンチパターンの回避も含まれます。

複雑さの成長は有機的なものであるため、私は常にリファクタリングを行い、ソリューションを簡素化する機会を探しています。他の多くの有機物と同様に、使用し続けたい場合は、トリミングして剪定する必要があります。複雑さが増すと、コードが破損する可能性が高くなるため、過度に複雑なソリューションとやり取りする必要はありません。

可読性はコードメンテナンスの最も重要な要素であり、過度に複雑なソリューションはほとんど常に可読性を低下させ、メンテナンスコストを増大させると思います。


32

必要以上に複雑で、ほとんど常に次の3つの理由で、多くのコードを見てきました。

1)時期尚早な一般化のため、または決して発生しない将来のニーズを予測しようとするため、過剰に設計されている

2)開発者は、以前は使用したことのなかった新しいデザインパターンまたはテクノロジーで学習/実験したいと考え、それが過剰であったとしてもそれをくつがえしました。彼らはそれが彼らの仕事をより面白くして、彼らが何か新しいことを学ぶようになるので、それをします。

3)機能とバグ修正が追加されましたが、同時に既存のコードは正しくリファクタリングされませんでした。それはほんの小さな複製であるか、メソッドに別のフラグ引数を追加するだけかもしれませんが、すべてが加算されます。事実上、ハッキングが追加され、すべてのコードの匂いのためにすべてが複雑になりすぎるのに時間がかかりません。これが最も一般的であり、通常は、より良いことや時間のプレッシャーを知らないためです。


私は#2の罪を犯しています。経験を持つ私は今、しかし自分自身を控える傾向にある...と実験:)の代わりに自宅で(と成熟?)
マシューM.

私は、彼らが自分たちのために多くの仕事として、5回を作成して終了、人々は1すべての時間を行う見る
アリー

11

それは絶対に一般的なことです。ほとんどの本が言うように、優れた開発者はそれをシンプルに保つ方法を知っています。見つけたばかりの新しいテクノロジーや「クールな」フレームワークで何かを複雑にするのは簡単すぎるため、問題の観点から考えるのではなく、使用方法を探し始めます。

マーティン・ファウラーが言ったように、新しい技術を学ぶ人は、その「技術」がソリューションを駆動するという短期的な問題を抱えています。


4
-1:ほとんどの本が言うように、優れた開発者はそれをシンプルにする方法を知っています。-あなたはこれについて絶対に正しいです。しかし、あなたは、新しい技術の濫用がコードを過度に複雑にする最大の原因であることを暗示しました。あなたはそれについて間違っています。私を信じて、新技術の濫用とは何の関係もない複雑なコードがたくさんあります。
ジムG.

「過度に複雑なコードの最大の原因」であることを正確に暗示したのはどこですか?それは確かに問題です、「ねえ、私はちょうどパターンXを学んだ、それを適用することができます」-Patternitus。あなたはジムで私の口に本当に言葉を入れました。
マーティンブロア

4
「この手紙をいつもより長くしましたが、それを短くする時間がなかったからです。」-Blaise Pascalここでも同様です。「複雑」は、多くの場合、急いでいる、怠けている、または無能なコーディングの兆候です。
ビル

@Billそれについて興味深いことは、ビジネスの観点からより複雑なコードの良い議論です-何かを実装するために一定の金額が支払われ、それを行うことができない限り、リファクタリングまたは短縮するのに余分な時間がかかります初めて(できますか?)既に動作しているコードの複雑さを軽減することには基本的にペナルティがあります。
マイケル

10

すべてのプログラマーにとってこれは正常なことではないと思いますが、多くのプログラマーがこれを行うことは間違いなく見ています。

一部の人々は、本当にシンプルなものを「簡単すぎる」と考えていると信じており、それは彼らのスキルの良いショーケースではないと思います。そのため、彼らは手元の問題に対する最善の解決策ではないかもしれませんが、「私にできることを見てください!」


1
それは私がそれを見る方法です。IEが簡単すぎる場合は、使用する価値はありませんか?

@Mercfh私は見方を理解していません。ソリューションの容易さは、その有効性と何の関係がありますか?
GSto

私は彼のコメントに「はい、同意します」とコメントしていました。

7

私は、プログラマーがしばしば言語に既に組み込まれていることを知らなかったタスクを達成するために数行のコードを書くことを見てきました。これは意図的なものではありませんが、確実に防ぐことができます。


文字列のコピーごとにループを作成したプログラマを見てきました。標準ライブラリ関数の呼び出しを使用したことはありません。(さらに悪いことに、プラットフォームのコピーは、一度に単語を読むように最適化されています。)
BillThor

7

それはあなたが「シンプル」と呼ぶものに依存します。より多くのコードと複数の呼び出しグラフがあるため、一部の人々は高度にリファクタリングされたコードをより「複雑」と見なします。ただし、このコードは変更がはるかに簡単であるという点で、より「単純」です。

大きな関数は、変更が必要になるまで「単純」に見えることがよくありますが、それから複雑になります。

言い換えれば、多くの場合、見る人の目から見るとシンプルです。


2
+1:あまりにも多くのプログラマーがそれについて考えていない
ルカ

5

問題は、単純な解決策を明確に見ることができない場合(同僚との議論が出番である場合)、またはあまりにも早く一般化しすぎる場合です。

つまり、単純なループを高度なライブラリ関数に作成します。とにかく次のプロジェクトで必要になると思われるからです(この正確な形式を使用しない場合を除く)。これをあまりにも長く行うと、非常に単純なコアを持つ非常に複雑なアプリケーションができます。

また、非常に堅牢なコードが必要であり、すべての堅牢性によりデフォルトで複雑になることがあります。しかし、これはあなたの問題だとは思いません。


4

場合によっては、クリーンでシンプルなソリューションを考え出すだけの複雑さかもしれません。

私が覚えていない、または何かを見つけることができないという引用があります。

明確性の欠如は、人々がすべての過剰を取り除く能力を妨げます。


4
別の関連する引用は、「私はもっと短い手紙を書いていたであろうが、時間がなかった」というものです。
-user16764

3
「イルsemble QUEラ完璧soit atteinte非quand IL n'y AプラスRIENàajouter、MAIS quand IL n'y Aプラスretrancherà離煙。」(「それはそうです、完璧に達成されるではない追加するより多くの何もないときにはときフランスのパイロット、詩人、エンジニアであるアントワーヌ・マリー・ロジェ・ヴィコント・ド・サン=テグジュペリ、1939年(本「テレ・デ・オム風、砂、星)」より)。
ヨルグWミッターグ

おかげで、本当の起源は知らなかったようです:-)いいですね。
スティーブンベイリー

3

最高のエンジニアとは、本当に複雑な問題を取り上げ、それらを実装しやすく、理解しやすいソリューションに変えることができるエンジニアです。簡単に聞こえますが、そのようなエンジニア/開発者はそれほど多くはいません。実際、そのような存在する人は多くありません。現実には、そこに住む大多数の人々はまったく逆のことをしています。彼らは単純な問題を取り、認識できないほど複雑にします。単純な問題に対処し、それらを完全な混乱に変えた人々の例については、政治家をご覧ください。プログラマーはこの点で違いはありません。


3
痛い!私はあなたに+1を与えようとしていましたが、それから政治に対するあなたのアナロジーを見ました、そしてそれはせいぜい弱いです。//それは本当です-政治には多くの難読化、無駄な動き、手を振る、特別な利益が埋め込まれているため、法案が複雑になりすぎる可能性があります。しかし、過剰合併症は、難読化、無駄な動き、手振り、および特別な関心の副産物です。根本的な原因ではありません。
ジムG.

理由が何であれ、国の問題の多くには非常に簡単な解決策がありますが、政治家は必要以上に困難にすることを選択します。これは金銭、権力、投票のいずれかによるものと思われますが、大部分は能力に関するものだと考えています。その場合、私の類推は堅実な基盤にあります。
ダンク

1
@JimG。ええ、私はあなたに同意します...政治的な解決策の問題の多くは、本当に簡単な解決策を持たない本当に複雑な問題に対する簡単な解決策(彼ら!)があると主張する政治家のようです。
マイケル

2

個人的に、私は意図的にソフトウェアをより複雑にしようとしたことは一度もありません。しかし、私は何かを終えて「すごい、それは複雑すぎる」と考えて、それに戻ってリファクタリングしました。一部の人々はこれを見て、それが機能し、それが十分であり、リファクタリングしないと思うかもしれません。


1

賢い人は、あなたができるだけ簡単に物事を保つべきであると述べたが、ないより単純なていると言われています。同じことがコードにも当てはまる場合があります。時には、いくつかは複雑と見なす手法を使用する必要があります(再帰は良い例かもしれません。多くの場合、若いプログラマーを怖がらせます)。

ただし、一般的に、複雑なコードはしばしば有機的に発生すると思います。単純な問題は単純なコードで解決され、スコープが拡張され、コードはあまり考えずに変更されます。新しい問題をカバーしようとするが、実際には別の問題を解決するように設計されたコードが得られます。さまざまなロジックのパッチワークキルトになります。そのようなコードは、問題が必要とするよりもはるかに複雑に見えることがよくありますが、当時は小さな変更がコードを機能させる最も簡単な方法であるように思われたため、そのようになりました。

ほとんどの開発者は故意にコードを複雑にしようとは考えていません(自分のスキルを証明するために何らかのテクニックを使用する奇妙なショーを披露しますが)。 。


要件にほぼ適合しているが、多くの異なる方法で不足している本当にシンプルなコアで始まるシステムがいくつあるかは驚くべきことです。Cの整数型の単純な設計と、それらに伴ういくつかの奇妙に複雑な規則を検討してください。種類ごとに、「これは、プロモートする必要があります」オプションがあった場合、それは名目上(のような修飾子から仕方の異なるではないが、本当に種類の数を倍増しているだろうvolatile...など、)が、
supercat

...プロモーション/バランシングルールを大幅に緩和していました。昇格可能なintに昇格できない符号なしショートを追加すると、の大きさに関わらず、昇進できない符号なしショートが生成さshortintます。プロモーションテーブルにプロモーションテーブルをunsigned short追加するintと、int。同じサイズの署名されたものと署名されていないものを追加したり、異なるサイズのプロモーション不可のものを追加したりするとエラーになります。前もって複雑さを少し加えると、下流の奇妙なコーナーケースが消えます。
supercat

1

まだ提起されていないもう1つの理由は、提供されたソリューションを過度に複雑にして、これらのソリューションをサポートするために後でサービスが必要になることを保証することです。言い換えれば、仕事のセキュリティのためです。


なぜこれがダウン票されたのか定かではありませんが、自分でフレームワークを作成し、このプロジェクトで1時間ごとに支払われた1人の男性によってコーディングされた非常に大きなプロジェクトに出くわしました。雇用主が彼を怒らせた場合、製品ライン全体が台無しになります。別の開発者がコードを完全に理解するには数か月かかり、「すべてを知っている」コーダーがスパゲッティの混乱を更新するには数分かかりました。
SSH

0

たぶん、古典的な間違いの問題ですか?

30.開発者の金メッキ。

開発者は新しいテクノロジーに魅了されており、言語や環境の新しい機能を試したり、別の製品で見た滑らかな機能の実装を自分の製品で必要とされているかどうかに関係なく作成したい場合があります。不要な機能を設計、実装、テスト、文書化、およびサポートするために必要な作業により、スケジュールが長くなります。

  • ラピッドディベロップメント、スティーブマッコネル。

0

はい、私たちは自分自身を楽しませるためにコードを過度に複雑にします。ほとんどの場合、コードが過度に複雑であるという認識は、プロジェクトの無知なまたはジュニア参加者から来ています。


1
-1ジュニア開発者の問題を明確に非難するシニア開発者は、おそらく自分の仕事や他の仕事の動機を理解していないでしょう。ジュニア開発者がコードを追跡するのが難しい場合は、ITが複雑すぎます。
ブランドン

Jr開発者が理解できないコードを見つけた場合、それはコードのにおいであり、実際にはコードが複雑すぎるかもしれませんが、ここではブラシを広く使用しています。このコードの匂いは実際には存在するかもしれません。なぜなら、Jr開発者は、技術自体が責任を負うのではなく、高度な技術を理解するのに助けが必要だからです。
P.ロー

-1

はい...そして、私は何度も代価を支払った。

私のホワイトボードには、最上部にアスタリスクの文があります。

「それが単純でない場合、それは正しくありません」

...そして、ホワイトボード上で何かをプロトタイピングするたびに、常に注目を集めています。

私の複雑なデザインがよりシンプルになり、よりクリーンなコードに変換されるので、本当にうまくいきます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.