過度に複雑なソリューションや設計を防ぐにはどうすればよいでしょうか?[閉まっている]

StackOverflow https://stackoverflow.com/questions/86308

  •  01-07-2019
  •  | 
  •  

質問

問題に取り組んでいると、作成されているソリューションが問題が必要とするものよりもはるかに複雑であることが判明することがよくあります。職場の複雑さを制御するのに役立つ制御、ベストプラクティス、テクニックなどはありますか?

役に立ちましたか?

解決

新しい人に見てもらうこと。

他のヒント

テストが難しすぎる場合は、設計が複雑すぎます。それが私が最初に使用する指標です。

私の経験では、あまりにも一般的なケースに合わせて設計すると、過度の複雑さが生じる傾向があります。

エンジニアリング文化は、環境についてあまり仮定を置かない設計を奨励します。これは通常良いことですが、行き過ぎている人もいます。たとえば、それは かもしれない あなたの車の設計が特定の重力を想定していなければ良いのですが、月面で実際にあなたの車を運転する人は誰もいませんし、仮に運転したとしても、燃料を燃やすための酸素がないため、車はうまくいきません。

難しいのは、「どの惑星でも動作する」デザインを開発した人は賢いとみなされることが多いため、彼のデザインが優れていると主張するにはもっと努力する必要があるかもしれないということです。 あまりにも 頭がいい。

トレードオフを理解して、良い仮定と悪い仮定の間で決定を下せるようにすることは、不必要に複雑な設計を避けるのに大いに役立ちます。

デザインをよりシンプルにするためのアイデアをいくつか紹介します。

  • プログラミングの本や記事を読んでから、 適用する それらを仕事に取り入れてコードを書く
  • 他の人が書いたコード (良いものも悪いものも) (オープンソース プロジェクトなど) をたくさん読み、何が機能し、何が機能しないのかを理解することを学びます。
  • コードの実験を可能にするセーフティ ネット (単体テスト) を構築する
  • 実験が間違った方向に進んだ場合は、バージョン管理を使用してロールバックを有効にします
  • TDD(テスト駆動開発) そして BDD (行動駆動型開発)
  • 態度を変えて、どうすればそうなれるかを尋ねてください。 「それは単純に機能します」 (設定よりも規約が役立つ可能性があります。または、Apple がどのようにするかを尋ねてください)
  • 練習する(ジャズプレーヤーのように、コードでジャムったり、試してみたり) コードカタ)
  • 同じコードを異なる言語で複数回作成し、しばらく経った後に
  • 新しい概念で新しい言語を学びます(静的言語を使用している場合は、動的言語を学びます。手続き型言語を使用する場合は、関数型言語を学習してください。...) [1 年に 1 言語が適切です]
  • 誰かにコードをレビューしてもらい、コードをよりシンプルかつエレガントにする方法を積極的に尋ねてください (そしてそれを作ります)
  • 上記のことを行うことで、何年も元気に過ごすことができます(時間が活動的な心を助けます)

デザインなどを作成し、それを見て、不要と思われるものをすべて(積極的に)削除するようにします。後でデザインを磨き上げるときに必要であることが判明した場合は、再度追加します。これを数回繰り返して、進めながら改良していきます。

Michael C. 著「従来のコードを効果的に使用する」を読んでください。羽毛。

重要なのは、機能するコードがあり、設計を変更する必要がある場合、コードを単体テスト可能にし、コードをより小さな部分に分割することほど効果的なものはないということです。

テスト駆動開発を使用し、Robert C. に従ってください。マーティンさんの TDD の 3 つのルール:

  1. 不合格の単体テストを合格させるためでない限り、実稼働コードを作成することはできません。
  2. 失敗するのに十分な量を超える単体テストを作成することはできません。そしてコンパイルの失敗は失敗です。
  3. 1 つの単体テストに合格するのに十分な量を超える実稼働コードを作成することはできません。

こうすることで、必要のないコードが大量に取得される可能性は低くなります。常に 1 つの重要なことを機能させることに集中し、複雑さの点で自分より先を行くことはありません。

まずテストしてください ここでは役立つかもしれませんが、すべての状況に適しているわけではありません。そしてそれはいずれにしても万能薬ではありません。

小さく始めてください これも素晴らしいアイデアです。本当にこれに 10 個のデザインパターンすべてを詰め込む必要がありますか?まずは「バカな方法」でやってみてください。なかなかうまくいきませんか?よし、「もう少し愚かでない方法」でやってみよう。等。

レビューしてもらう. 。他の人が書いているように、目は2対ある方が良いです。さらに良いのは脳が2つあることです。あなたの友人は単純化の余地があるだけかもしれませんし、あなたがハッキングに何時間も費やしているから大丈夫だと思っていた問題のある領域を見つけただけかもしれません。

無駄のない言葉を使いましょう。 Java や場合によっては C++ などの言語は、厄介で複雑なソリューションを奨励しているように見えることがあります。単純なものは複数行のコードにまたがる傾向があり、それをすべて管理するには 3 つの外部ライブラリと大きなフレームワークを使用するだけで済みます。Python、Ruby などの使用を検討してください。- 自分のプロジェクト用ではない場合は、個人的な用途に使用します。できる 考え方を変える シンプルさを好み、シンプルさが可能であると確信するためです。

プログラマになったら、これが起こるのは避けられません。労力を真剣に見積もっていなかった場合、またはソリューションが機能しない問題に遭遇した場合は、コーディングを中止してプロジェクト マネージャーに相談してください。私は常に解決策を会議に持っていくのが好きです。問題は A ですが、あなたが x を行うには 3 日かかりますが、私たちは y を試すこともできますが、これには 6 日かかります。自分で選択しないでください。

  • あらゆる段階で他のプログラマーと話し合ってください。設計に対する注目が集まるほど、コードベースで過度に複雑になる前に、複雑すぎる側面が早期に明らかにされる可能性が高くなります。
  • 現在取り組んでいることをどのように活用するかを常に自問してください。答えがわからない場合は、立ち止まって自分が何をしているのかを再考してください。
  • 現在取り組んでいることを潜在的に簡素化する方法について考えを書き留めることが役立つことがわかりました。そうすれば、実際に機能するようになったら、まだ機能していないものに手を加えるのではなく、必要に応じて戻ってリファクタリングややり直しが簡単になります。

これは微妙なバランスをとる作業です。一方では、設計と実装に時間がかかりすぎるハックは望ましくありません。他方では、来週の問題に対処できるほど複雑ではないハック、またはさらに悪いことに、適応するために書き直す必要があるハックは望ましくありません。 。

私が役立つと思うテクニックをいくつか紹介します。

何かが思っているよりも複雑に見える場合は、考え終わったらすぐに座って実装しないでください。その日の残りの時間に何か他のことを見つけてください。問題の初期の部分に対して、後でかなりの複雑さを取り除く別の解決策を考えることになることが何度もあります。

同様に、アイデアをぶつけることができる誰かを雇ってください。なぜ複雑さが正当化されるのかを彼らに説明できるようにしてください。

将来的には正当化されると考えて複雑さを追加している場合は、次のことを確立してください。 いつ 将来的にはそれを使用することになります。この複雑さが 1 ~ 3 年必要になるとは (現実的に) 想像できない場合は、おそらく今その複雑さにお金を払うのは正当化されません。

タスクを一連の小さなタスクにシリアル化することで、作業するデータの量を減らします。ほとんどの人はコーディング中に頭の中に 6 個の (プラスまたはマイナス) 条件しか保持できないため、それを実装の単位にします。達成する必要があるすべてのタスクに合わせて設計しますが、その設計を容赦なくハッキングして、モジュール内の 6 個以上のパスを操作する必要がなくなるようにします。

これは、Bendazo の投稿「簡単になるまで単純化する」に続くものです。

お客様にお願いします なぜ 彼らには何らかの機能が必要です。私は彼らのリクエストの本質を理解して、彼らが経験している問題を特定しようとします。これは、私 (または彼ら) が考えるよりも簡単な解決策になることがよくあります。

もちろん、クライアントの仕事の習慣と、彼らが取り組まなければならない問題を知っていれば、最初からクライアントの問題をよりよく理解できるようになります。そして、あなたが彼らを「知っている」なら、彼らのスピーチをよりよく理解できます。したがって、ユーザーと緊密な協力関係を築きましょう。それはエンジニアリングのゼロステップです。

時間をかけてシステムの概念に適切な名前を付け、関連する名前を見つけると、システムがより親しみやすくなります。概念の名前を変更することをためらわないでください。あなたが知っている世界とのつながりが良くなればなるほど、脳はその世界をうまく活用できるようになります。

クリーンでシンプルなソリューションに興味がある人に意見を求めてください。

現在のプロジェクトに必要なコンセプトのみを実装してください (将来の機能や汎用システムを求めると、設計が肥大化します)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top