あなたがした最も遺orな設計やプログラミングの決定は?[閉まっている]


57

どのような設計上の決定を下し、どのように裏目に出たのか聞きたいです。悪い設計上の決定のため、私はその悪い決定を永遠にサポートしなければなりませんでした(私もそれに参加しました)。これにより、1つの設計ミスが永遠にあなたを悩ませることに気づきました。経験豊富な人々から、どんな種類の失敗を経験し、彼らから何を学んだかを学びたいです。

これらの決定を繰り返さないようにすることで、他のプログラマーにとってこれが多くの助けになると確信しています。

あなたの経験を共有してくれてありがとう。


19
SOに時間をかけすぎています!! ;)
ミッチ小麦

6
@George:最初のリンクはオーバーエンジニアリングに関するもののようです。これは、このスレッドに接線方向に関連している可能性がありますが、重複ではありません。2番目と最後のリンクは、コーディングエラーと管理ファンブルに関するもので、どちらもこのスレッドの複製ではありません。
ジュリエット

1
これはおそらくコミュニティWikiにする必要があります(投稿を編集するときにボックスがあります)。

3
反対に投票する方法があればいいのにと思います。終値をつけますか?
キヴェーリ

5
すべての閉鎖された有権者の何が問題になっていますか?それで、それがCWでないならば、質問者が質問を思い付くためにいくらかの票を得てください。私はこのトピックに本当に興味があります。CWが良い主観的な質問を邪魔しないようにしてください。Sheesh、SOは「CW THIS」スクリーマーでいっぱいです。
syaz

回答:



56

「後でやります」
「後で」ということはありません。


8
後で来ることはありません。

決してありません。

「今すぐそれをする時間がない場合、後で修正する時間があると思うのはなぜですか?」

4
私たちは、この「決して反復」と呼ぶ
NotMe

10
一時的な解決策ほど永続的なものはありません。
-Dietbuddha


44

アプリケーションの構成可能性は素晴らしいです。構成可能性が多すぎると、使用および保守が悪夢になります。


2
はい。本当です。すべてを構成可能にし、上司にコードを1行も変更する必要がないことを伝えるのが理想です。

1
私たちのプロジェクト管理のためにそれらの無限に構成可能なシステムの1つに固執している不幸なユーザーであったので、私はできれば私はあなたに100万回賛成するだろうと言うことができるだけです。
HLGEM

通常、設定の柔軟性が高いのは、実行時に任意のコードを実行できないため、すべてを予測する必要があるためです。

これは、«spoftcodingは»«ハードコーディング»をするとは対照的に呼ばれている
deadalnix

42

私の間違いの1つから、DBの正規化を盲目的に追跡すべきではないことを学びました。可能ですが、場合によってはテーブルをフラットにする必要があります。

最終的には(モデルを介して)テーブルの負荷を管理することになり、テーブルのフラット化を少し行ってもパフォーマンスはそれほど良くありませんでした。


5
私はこれ以上同意できませんでした...私はソフトウェアエンジニアであり、常に正規化するように言われます。なんてこった。それは、教師が真に複雑でパフォーマンスに依存するDBを使用しようとしたことがなかったからです。

8
もちろん、正規化も非常に肯定的なものになる可能性があると付け加えます。

12
プログラマーは不適切な理由で非正規化するのは速すぎると思いますが、はい、正規化の規則を奴隷的に遵守することは大きな間違いです。一般に、ソフトウェア開発における私の大きな不満の1つは、「Xを実行する必要がある」と誰かが言うときであり、これが引き起こすすべての問題を指摘すると、「それは無関係です。すべての専門家は、Xしたがって、例外を発生させずに、常にXを実行する必要があります。」

4
正規化に対する私のアプローチは常に簡単です。私は常に正規化しますが、少し平坦化することでパフォーマンスが向上する可能性がある場合は、常にテストとベンチマークを行います。ほとんどの場合、それは平坦化の代価です。
アイマンタス

7
しかし、正規化は楽しいです!:)私は真剣です。データ構造の設計を楽しんでいます。私が言うことは、正規化されたスキーマを非正規化するのは簡単ですが、その逆は真実ではないということです。あなたはそれらを壊す前にルールを知っている必要があります。

36

データベースで単一の文字をステータスなどに使用します。これにはまったく意味がありません。長いchar()またはnvarchar2()を使用するオーバーヘッドは、ネットワークおよびSQL呼び出しによって発生する解析に比べてわずかですが、文字は常に終了しますかなり難読化されているか、不足しています(ステータスではなく、その他のもの)。人間が読めるバージョンを入れるだけで、Javaモデル(私の場合)に値が一致する列挙型を含める方がはるかに優れています。

これは、時期尚早で不必要で盲目的な最適化の一種だと思います。単一の文字を使用すると、最近では世界が救われるかのように。ブール値/ビットをサポートしないデータベースのY / Nブール値は別として。


+1私たちはまさにこの問題に関する会議を開催しました。同じ結論に達しました。
APC

顧客がそのような略語を使用しており、それらを放棄したくない場合はどうなりますか?

既存のシステムでは、もちろん互換性が必要です(<code> MyEnum fromChar(char c)</ code>メソッドで適切な値のJava列挙を作成します)。新しいデザインの場合、そこに行かないでください!

一部のデータベースは列挙型をサポートしています。列挙型はコンパクトで読みやすく、予期しない値を適切に禁止します。可能であれば、それらを使用してください。
カールバーテル

2
ほぼ同じように、MS SQL ServerでBIT型を使用する前に、インデックスの一部にできないことを発見します。
finnw

32

適切なデータアクセスレイヤーを開発せず、コード内のあらゆる場所にsqlを配置することで、何かを「すばやく」実行できるようにします。その後、プロジェクトが拡大し始め、要件が変化したため、悪夢になりました。当時DALが何であるかは知りませんでした。

...過去20年以上の「経験」のあるプログラマーがこれを行っているのを今でも見ていますが、うれしいです。


16
どこで読んだか思い出せませんが、20年の経験と1年の経験を19回繰り返すことには違いがあります。
CaffGeek

@Chad:ジョエル・スポルスキーの著作のどこかにありました。

+1:うん。そして、そのSQLに結び付けられたすべてのロジックをリファクタリングしてみてください...インライン、フリーフォームSQL、ストアドプロシージャのいずれであっても。[うん-私はその聖戦を恐れていません。]
ジムG.

26

私はすべて同じプロジェクトのアーキテクト、開発者、およびPMになることができると考えています。

2か月間、1泊3時間寝ると、どうしてもできないことがわかりました。


15
そんなに眠らないで!ああ、待って...それは普通ではないということですか... ?? うーん、このプロジェクトに他の人を連れて行かなければならない...
AviD

PMのように


20

私の決断ではありませんでしたが(やや遅れて入社しました)、どこかで仕事をしていましたが、すべてのログメッセージの翻訳を含めてi18nを少し使いすぎました。

結果:

  • 新しいログを追加するのがもっとつらい
  • 翻訳のためのより多くの費用
  • ログは後で読むのが難しくなります

おっと。


ここでi18nをいくつか行い、ユーザーに何が記録され、ログに何が記録されるかを把握しようとしています。すべてのユーザー向け出力をローカライズできるようにしたいのですが、ログはそのままにしておきたいです。その過程で、私は例外がどこに行くのか、自分が好きなことよりももっと理解する必要があります。
デビッドソーンリー

1
アメリカ人?もしそうでなければ、あなたは英語しか話せませんか?新しいログエントリが英語である場合、国際化を使用します。別の言語が利用可能な場合は、ユーザーの言語を表示します。ヒント:ここでは、言語が何であってもログをgrep /スキャンできるので、エラーコードを使用すると便利です。

2
@Jacob:私は英語ですが、英語しか話せません。しかし、これはエンジニアリングベース全体がイギリスにある会社のためであったため、他の言語でログファイル(診断目的であり、ユーザーに表示される情報ではない)はリソースの無駄になります。テキストの代わりにエラーコードを使用すると、オンザフライでの翻訳が可能になることに同意します。それは何かどこ識別することによって、作業を軽減する問題だ鳴り有用なのは、実際に大きな価値を提供するつもりはありません。
ジョンスキート

10
私はスウェーデン人です。コード/コメント/ログは英語以外のものであるべきだとさえ示唆する人には中世にならなければなりません。英語は、ユーザーインターフェイス以外のすべてに使用する言語です。それ以外のことはすべて、コードの読み取りと議論を困難にします。使用する他のフレームワーク/ライブラリはすべて英語なので、母国語を使用するのはばかげています。
jgauffin

1
+1英語はプログラミングの共通語です。翻訳することは、必要なレイヤーをできるだけ少なくし、できるだけ明確にするために追加のレイヤーを追加することです。


19

デザインをやりすぎる。多くのUML図、特にすべての単一操作のシーケンス図を作成しますが、その多くは最終的には役に立たないことが判明しました。最終的に、不必要に詳細な設計/図をスキップして直接コーディングを開始することで、かなりの時間を節約できたことがわかりました。


「あなたが今まで見た中で最も遺tableな設計やプログラミングの決定は何ですか?」自分たちが犯した間違いとは対照的に、リストの一番上に「UML」を付けました。「Windowsレジストリ」のすぐ下。

2
UMLはチームのメンバー間で議論するのに適していますが、設計に関しては設計に従って実装すると、常にひどく終わります。これはある種の企業のある種の夢ですが、実際のところ、ソフトウェアの作成は決定的にそのようには機能しません。+1!
deadalnix

17

顧客が自分が望むものを知っていると信じてから、顧客に確認する前にやりすぎです。


15

私の最悪の設計決定は?1980年代に私は、実行時に解釈されるデータ入力画面用のテンプレートを作成するという素晴らしいアイデアを得たプロジェクトに取り組んでいました。悪い決定ではありません。入力画面の設計が簡単になりました。基本的には、データ入力画面に似たファイルを作成します。ラベルと入力フィールドを識別し、入力フィールドが英数字かどうかを識別するための特別なコードを使用します。次に、これらのファイルにさらに特別なコードを追加して、実行する検証を特定することにしました。次に、画面の条件付きビルドを許可するコードを追加しました。フィールドXは、ある条件が満たされた場合にのみ含まれます。等 最終的に、画面テンプレートを新しいプログラミング言語に変換し、式、制御構造、およびI / Oライブラリを完備しました。そして何のために?FORTRANを再発明するために多くの仕事をしました。より良い設計とより良いテストが行​​われた言語用のコンパイラーがいっぱいの棚がありました。実際にある程度の専門知識を備えた製品を構築するためにそのような努力を捧げたとしても、その企業は今日も営業している可能性があります。


それはおもしろくて悲劇的です:)

悲しいことは、このアプローチが最善の方法である場合があることです。顧客は、「画面はすぐに変更できます」または「画面はお茶を入れるなどすべてを実行します」のいずれかを選択できますが、両方は選択できません。

3
テンプレートや他の一般的なコードを使用することに何の抵抗もありません。間違いは、一般的なコードを言語内の言語に変えることにありました。

2004年にこの正確な処理が行われました。すべてのビジネスロジックは15個の構成テーブルに分散されており、適切な方法でスローされる動的な「言語」の試行がいくつか行われています(Greenspunの第10ルールを参照)。

1
FORTRANではなくCOBOLを意味しませんか?
finnw

15

オーバー熱心な(と呼ばれるYAGNIのアプリケーション列挙して、デザインをして、オブジェクト指向開発の落とし穴いずれかの賢明な人は要件がされたことを言うことができる環境では)間違いなく変更するつもり。そして繰り返し変更します。

すべてを現在の要件に正確に(ハード)コーディングした場合、「これはもっと一般的ではないでしょうか?」YAGNIマレットを使用すると、要件が大幅に変更されます(ただし、合理的に予想できる方法で)。それは、2週間で調整するのと20分間で調整するのとの違いになります。

更新:明確にするために、ここで起こったことからそれほど遠くない架空の例を示します。Stack Overflowはバッジをサポートするように設計されていますが、最初は4つのバッジしか考えられないと仮定します。わずか4つなので、サイト内のすべてのロジックで正確に4つのバッジのサポートをハードコーディングしました。データベース内、ユーザー情報内、すべての表示コード内。あなたが考えることのできないバッジは「必要ない」からですよね?次に、サイトが公開され、人々が新しいバッジの提案を開始するとします。各バッジ追加するのに最大2週間かかります。これは、あちこちで微調整するハードコーディングが多いためです。それでも、今日のリストより多くのバッジは「必要ない」ので、バッジの一般的なコレクションをサポートするリファクタリングはありません。そのような一般的なコレクションは、事前にこれ以上の時間を要したでしょうか?あまりない、もしあれば。

YAGNIは価値のある原則ですが、貧弱なデザインと不適切なハードコーディングを弁解するために(ab)使用すべきではありません。バランスがあり、経験があれば、それに近づいていると思います。


1
はい、いいえ、どの方向に変化するかを予測できますか?私は...予測ジェネリックに適合していなかった最初の再利用のための全く不十分証明した痛々しいほど複雑なシステムの経験を持っている
Benjol

^ええ、私はそのくそよりもヤグニを扱いたいです。

それで、2週間を前もって過ごすべきだったと思いますか?
finnw

4
その例はまったくYAGNIではありません。DRYはYAGNIの一部であり、DRYがないと、変化に敏感に反応できません。

3
ステファン、この例は、glibとキャッチフレーズの不適切な乱用を示しています。DRY(そのバリアントOAOOを使用)も良い原則ですが、まったく別のものです:c2.com/cgi/wiki?OaooBalancesYagni。ただし、「DRYはYAGNIの一部である」という主張を裏付けるものはどこもありません。マスタードはホットドッグによく合いますが、マスタードがホットドッグの一部であることを意味しません。おそらく参考文献で明確にできれば、おそらく理解できるでしょう。
80x24コンソール

15

無能な人材

間違った人と一緒に何かを正しくて素晴らしいものにしようとしています!
たとえ彼らが不必要なエゴPMの役割を担っていたとしても(特に、彼らの無能がより長く耐えることができる大企業ではあまりにも一般的です)。


1
私はあなたの痛みを理解しています:

13

急いでいるので、技術的な負債を作成したり、手続きコードを書いたり、テストの記述をスキップしたりするたびに。ほぼ必然的に、これは将来の私にとって苦痛をもたらすと思います。


13

SQL Server統合サービス(SSIS)を使用します。

私は最悪の敵にそれを望んでいません。

過去2か月間でいくつかのSSISパッケージをビルドした後、私が開発したパッケージが配布およびデプロイできないことを知りました。特に、非Web、非SQL Serverライセンス環境で。

48時間以内に純粋な.NET POCOコードでSSISパッケージを書き直すか、目標の期限を守れない場合は、非常に悪い状況です。

OLEDBアダプターとSQL Adapatersを使用して、純粋な.NETコードで12時間以内に3つのSSISパッケージ(テストと開発に2か月かかった)を書き換えることができたことに驚かされます。

SSISは、SQL Serverライセンス(具体的にはDTSPipeline.dll)がインストールされていない場合、配布できず、クライアントマシンからパッケージを実行しません。これは事前に知っておくといいでしょう。MSDNで免責事項を(細字で)今見ています。SQL-LICENSEDマシンのみのコードを使用してインターネット全体にサンプルコードがある場合、これは役に立ちません。基本的に、SSISパッケージをプログラムで実行するには、SQLサーバーと通信するWebサービスを作成する必要があります。実行中のマシンにSQLライセンスがインストールされていない限り、純粋な.NETコードからそれらを実行することはできません。それはどれほど非現実的ですか?Microsoftは、SQL Serverのインストールが必要なマシンからSSISを使用することを本当に期待していますか?なんと2ヶ月という無駄。

私の会社は、この小さな活字「落とし穴」のためにSSISを二度と使用しません。


おそらく、「ファインプリント」ソフトウェアの使用を完全に避けるべきです!たとえば、TalendはオープンソースのETL IDEです。

+1:うん。SSIS開発の経験も悪夢です。ETLを実行するには、少なくとも半ダースのより良い方法があるでしょう。
ジムG.


10

2週間の休暇に行く前に、「面白い」イースターエッグをコードに入れました。私が戻ってきたとき、私はそれを読む唯一の人だと思っていました。

言うまでもなく、上司は私が留守中にレビューしたときに感動しませんでした。また、「イースターエッグ」の1つがASCIIで面白く描かれた顔を含んでいたとき、彼はさらに感銘を受けませんでした。

うーん...


1
IMO、それは「Good work Sir!」です。

18
ごく最近、「addin 'th'value(p)t'yer table!」などのトレースメッセージを求めてチームにock笑されました。私は見て言った、彼らは私をTalk Like A Pirate Dayで働かせた、彼らは彼らが得るものに値する。

3
Arr、あなたのログはキールハウリンを探しています!

10

昔ながらのCSSフォルダーだけで十分だったときにASP.Netテーマを使用する。


笑、はい!

1
この答えは、「ASP.NETを使用する」に短縮できます
-finnw

スキンは、デフォルトのCssClassのセットアップに役立ちます。

8

適切な道ではなく、いくつかのコードを機能させるための迅速な道を歩む(少し一般的ですが、それを抽象化と呼ぶため、「正しい」答え)。


7

私の会社にはウォーターフォールのような開発モデルがあり、ビジネスユーザーとビジネスアナリストがプロジェクトの要件を定義します。「大きな」プロジェクトの1つで、要件のスタックを取得しましたが、実装の詳細、具体的には会計システムで使用されるデータベーススキーマに関連する情報を含む多くの要件に気付きました。

実装は私のドメインであり、要件に含めるべきではないことをビジネスユーザーにコメントしました。結局のところ、彼らはビジネスであり、会計士が会計ソフトウェアを設計することだけが理にかなっているため、彼らは要件を変更することを嫌がりました。トーテムポーリングをはるかに下回っている卑劣な開発者として、私はthinkの代わりにやりたい思っています。戦いながらも、要件を書き直すように説得することはできませんでした。変更に関するペーパーワークと赤テープが多すぎて面倒です。

だから、私は彼らに彼らが求めたものを与えました。少なくとも、それはかなり動作しますが、データベースは奇妙に設計されています:

  • 不要な正規化がたくさん。5つまたは10のフィールドを含む単一のレコードは、3つまたは4つのテーブルに分割されます。それに対処することはできますが、個人的には、1:1のすべてのフィールドを1つのテーブルに取り込むことを望んでいます。

  • 不適切な非正規化がたくさん。請求書データ以上を保存する請求書データを保存するテーブルがあります。フラグがInvoiceDataテーブルに論理的に関連していない場合でも、InvoiceDataテーブルにその他の多くのフラグを格納します。これにより、各フラグにはマジック、ハードコーディングされた主キー値、およびInvoiceDataテーブル内の他のすべてのフィールドが空になります。フラグはテーブル内のレコードとして表されるため、フラグを独自のテーブルにプルすることをお勧めします。

  • より多くの不適切な非正規化。特定のアプリ全体のフラグは不適切なテーブルの列として保存されるため、アプリのフラグを変更するにはテーブル内のすべてのレコードを更新する必要があります。

  • 主キーにはメタデータが含まれます。そのため、varchar主キーが「D」で終わる場合、1つの値セットを使用して請求書を計算し、そうでない場合は別のセットで計算します。このメタデータを別の列にプルするか、値のセットをプルして別のテーブルに計算する方が理にかなっています。

  • 外部キーは複数のテーブルに移動することが多く、「M」で終わる外部キーは住宅ローン勘定テーブルにリンクし、「A」で終わる外部キーは自動勘定テーブルにリンクする場合があります。データをMortageDataとAutoInsuranceDataの2つのテーブルに分割する方が簡単です。

私の提案はすべて、多くの嘆きと歯ぎしりで撃ち落とされました。このアプリは設計どおりに機能し、泥だらけの大きなボールですが、厄介なハッキング、特殊なケース、奇妙なビジネスルールはすべてソースコードに皮肉とユーモラスに文書化されています。


3
よろしい、あなたの履歴書が素晴らしく、泥の大きなボールが重力に屈する前に迅速な脱出のために最新であることを願っています!
ベンジョル

7

クライアントを新しい.NETフレームワークバージョンにアップグレードするのは面倒だと思われるため、古いテクノロジにこだわりますが、実際には、一部の(時間を節約する)コンポーネントを利用できないため、ソフトウェアを作成するのにより多くの開発時間がかかります。新しいフレームワークバージョン。


+1:うん-行ったことがあります...そして、n00bsがアップグレードされないことに気づいたらすぐに、緑の牧草地への脱出を計画し始めました。
ジムG.

そして、私はそうしました、ちょうど来月引退しました!
ブドウ

6

大学に戻って、私はシニアデザインプロジェクトに取り組んでいました。別の人と私はウェブベースのバグ追跡システムを書いていました。(画期的なものはありませんが、私たちはWebエクスペリエンスを望んでいました。)Javaサーブレットを使用して適切に動作しましたが、何らかの理由で、エラー処理メカニズムとして例外を使用することを選択する代わりに、エラーコードを使用します。

私たちが学年のためにプロジェクトを発表したとき、教員の一人が避けられないことを尋ねました。私は即座に答えを知った:「私は例外を使うだろう、それは彼らがそこにいるものだ」。


ああ、車輪を再発明する喜び!:-) それは面白い。

次のイテレーションで改善できるように、意図的な欠陥と呼んでいます。
whatnick

2
例外は、例外の処理専用です。多くの人がすべてを例外に変えて例外を悪用しています。

@jacob-私はあなたが予測できるもの(すなわち例外的な条件)に例外を使用すべきだというあなたの感情に同意しますが、私が見たものから(そしてJavaプログラマーではない)Javaは太陽の下ですべてに例外を使用するようです。そのため、Javaコードで例外を使用しないことは、言語の流れに反すると見なすことができます。

6

私が選択した方法ではありませんが、行ベースのXMLファイルを列ベースのHTMLレポートに変換するXSLTを作成しました。

IEでのみ機能し、動作をデコードすることは完全に不可能でした。それを拡張する必要があるたびに、信じられないほど難しく、何年もかかりました。

結局、私は同じことをする小さなC#スクリプトに置き換えました。


私もそれをやった。私はXSLを使用してメールテンプレートエンジンを実装しましたが、読み取りと保守が難しいことがわかりました。
TrueWill

うん。誰かの巨大なXSLTファイルのツリーを、いくつかの単純なVB.NET関数に置き換えました。特に次の顧客変更要求がXSLTで実行できなかった場合、非常に満足しています。

ほとんどのプログラマーは、XSLTを取得できないという理由だけで、XSLTを悪い選択だと考えていることがわかりました。これは、他の多くのソリューションよりもはるかに効率的な、少数の問題に非常に役立ちます。一方で、それはあまりにも頻繁に使用され、ほとんどの小さな問題では使用されません...
AviD

6

すべての新しいテクノロジーを使用しようとすること(新しいテクノロジーを学ぶため)。


5

ビジネスモデルを評価するのに十分な時間がかかりませんでした。私はクライアントが尋ねたことをやりましたが、6-12か月後に私たちは両方とも違うやり方でやるべきだったという結論に達しました。


4

仕様なしの設計。


3
仕様は常に可能です

「顧客にそれが望んでいるかどうかを尋ねることなく、ソリューションを実装する」べきです。これは通常、仕様に従っていることを意味します。
-Dietbuddha

3

要件に従ってアプリケーションのサブセクションを実装しました。

要件が肥大化し、金メッキされ、コードが過剰に設計されていたことがわかりました。サブセクションは、その時点で追加していたものだけで動作するように設計する必要がありましたが、最初から一般的なサポートを含めることなく、他のすべてのものを追加する予定です。

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