web-dev-qa-db-ja.com

ソフトウェア設計:迅速に構築するか、それともうまく構築するか?

重要なアプリケーションを構築するときは、物事を迅速に機能させることに焦点を当て、モデルロジックをビューと混合し、カプセル化を解除するようなコードのショートカットを作成するのが最善ですか?または、より多くのアーキテクチャを構築し、正しく構築するために事前に時間を割いた方がよいのですが、設計が非常に流動的であり、フィードバックが原因となる場合はそれを破棄しなければならない可能性があるため、このすべての追加コードが使用されない可能性があります。別の方向に行くには?

コンテキストについては、デスクトップアプリケーションを作成しています。私は唯一の開発者で、日帰りで仕事をしているのでアルバイトをしています。今、仕事のために、私は物事を正しい方法で、許可されたスケジュールでやろうとしています。しかし、このプロジェクトについては、人々からのフィードバックを得て変化すると予想していますが、それが正しいアプローチかどうかはわかりません。私は今週数時間かけて、モデルの変更をビューに伝えるために、テキストビューのModel View Controllerデザインを導入しました。これは一般的にはすばらしいですが、データを表示するために複数のビューが必要かどうかはわかりませんし、追加のアーキテクチャがなくてもより速く表示することができたかもしれません。プロジェクトに費やす時間は週に10〜15時間程度なので、適切なソフトウェアプラクティスに従えば、デモを作成できるものを構築するにはかなりの時間がかかると思います。ユーザーが私が内部でMVCを使用することを気にしないことを知っています。彼らは問題を解決する何かを望んでいるだけです。しかし、ショートカットからの技術的負債が多すぎて、コードを維持し、新しい機能を追加するのが非常に難しいという状況にもありました。他の人がこの種の問題にどのように取り組むか聞いてみたいです。

38
Pedro Estrada

うまく構築する

全体像を見ると、「高速」で構築することは論理的な誤りです。これにより、うまく構築することができなくなり、最終的には、バグや、リファクタリングを妨げたり、新機能の追加を不可能にしたりする基本的なアーキテクチャの欠陥に悩まされるようになります。

それをうまく構築することは実際には逆です。最初は遅いかもしれませんが、最終的には、適切な選択をするために時間をかけたことで効率が向上することに気づくでしょう。さらに、将来の要件に簡単に適応できるようになり(必要に応じてリファクタリング)、少なくともバグが少ないため、最終製品が改善されます。

言い換えれば(これが一回限りの契約でない限り)高速で構築=低速で構築、適切に構築=高速で構築


また、「うまく構築する」ことと、アーキテクチャーを設計することについて、理解しておくべき重要なことがあります。あなたが尋ねた...

...しかし、設計が非常に流動的であり、フィードバックによって別の方向に進む場合はそれを破棄しなければならない可能性があるため、この余分なコードがすべて使用されない可能性があるというリスクを冒していますか?

これは、「アーキテクチャの時間を費やす」ことによる実際のリスクではありません。 建築設計は有機的でなければならない。正当化されるまで、どの部分のアーキテクチャの設計にも時間を費やさないでください。アーキテクチャは、プロジェクトで観察および確認されたパターンからのみ進化する必要があります。

SystemanticsのJohn Gallの法則:

最初から設計された複雑なシステムは機能せず、パッチを適用して機能させることはできません。シンプルなシステムから始めて、最初からやり直す必要があります。

48
Nicole

速く、それから

これは、さまざまな方法を試してみた私の個人的な経験によるものです。

高速で動作する(そしてリリースする)だけの問題は、一般に、機能をアプリケーションに追加し、リリースされた後、プログラムに根本的な変更を加えることが非常に難しいことです。健全な基盤となるアーキテクチャがないため、長期的には高額な料金を支払います。それは流砂の上に突撃砲を建設するようなものです。

それをうまくやっているプログラムは、あなたが多くの時間とコードを浪費することになるということです。それは設計図のない邸宅を建てるようなものです。アプリケーションの作成は学習プロセスであり、(私の経験では)事前に設計することはほとんど不可能です。つまり、多くのリファクタリングを実行し、常にすべてを「うまく」書くと、最終的には大量のコードを捨ててしまうことになります。

したがって、高速です。

あなたが始めるときの主なことは、すべてをコードに書き留め、すべての機能を釘付けにして、サポートする必要があるアーキテクチャの種類を確認できるようにすることです。この方法論のもう1つの良い点は、すぐに何かが実行されるようになるので、やる気を維持できることです。一般的なアーキテクチャに影響を与えるため、「エッジケース」機能を実装することも重要です。この段階では、単体テストを記述したり、詳細に取り組んだりしないでください。将来的に多言語をサポートする必要があると思われる場合は、プラグインアーキテクチャを実装しますが、迅速かつダーティです。アプリケーションを管理しやすくするためにリファクタリングを行いますが、過度なことは何もしません。

「プロトタイプ」が機能していると感じたら、リファクタリングを開始します。基本的に、あなたが今知っているすべてを知っているゼロから始めたならば、あなたがそうするようにアプリケーションをやり直したいと思います。重要なことは、フェーズ1で実行したすべての機能を再実装するのではなく、architectureを正しく取得することですが、後でサポートするためのアーキテクチャを用意する必要があります。

このようにして、とにかく私の経験では、可能な限り効率的なサウンドアーキテクチャのアプリケーションが完成します:)

17
Homde

それを作る

高速市場投入までの時間が品質よりも重要な場合

まあ市場投入までの時間よりも品質が重要な場合

10
user2567

それを速く構築すると、短期的な利益と長期的な損失がもたらされます。

それをうまく構築することは、短期間の損失を招きますが、長期的な利益をもたらします。

それをうまく構築するには忍耐と知恵が必要ですが、あなたは報われるでしょう。

迅速に構築することは、迅速なプロトタイピングと使い捨てに適しています。長期的な目標を達成するには、最初から正しい姿勢が必要です。

8
user8685

他のユーザーが使用できるように配布する予定のプロジェクトの場合、前払い作業では常にエラーが発生します。よく考えられたアーキテクチャは、必要に応じて拡張する方が簡単です。ショートカットを取ることは、技術的負債を蓄積するためのモデルにすぎません。

時々イライラして遅くなることがあります。やる価値のあることは、正しくやる価値があります。

5
Jeff

うまく構築する=迅速に構築する

ショートカットは振り向いて、あなたが思っているよりも速くあなたを噛む傾向があります。時にはランチ前にも。

あなたの文脈について;すぐに抽象化しないでください。 YAGNIに固執し、重複を削除します。 2番目のビューが実際にあるときに、そのビューベースのパターンを実装してください。その2番目のビューが到着したとき、通常、作成する抽象化は、最初の1回の出現で作成したものよりもはるかに優れています。

5
Joppe

もしあなたがあなたが何をしているかを既に知っているなら、あなたが知らないなら速く

私はリサーチサイエンティストであり、全体像を把握したり、プロジェクトがどのように発展するかを知る前に、多くの探索的コードを書いています。これらのケースでは、「よく」がどのように定義されるべきかを見さえすることは困難です。また、通常、細かい詳細や、拡張する方法をすべて確認することは困難です。したがって、古い格言が適用されます:

  1. それを動作させます。
  2. それを正しくしなさい。それを2番目に正しくすることには、いったんそれを機能させる経験があれば、「適切」をより適切に定義できるという利点があります。
3
dsimcha

それをうまく構築してください..常にですが、速く進むという幻想を与えます

速くするには、小さくするだけです。フィードバックを得るために十分重要である全体の小さなサブセットを構築します。一定のペースで徐々に追加していくと、不快な夜がぶち壊しをする連鎖反応に魂を売ることなく、迅速に構築するのと同じ利点の多くが得られます。

2
Newtopian

おそらく機能する可能性のある最も単純なことを実行します。特定のケースでは、プログラムが非常に大きくなることはなく、パートタイムで作業するのはあなただけです。 gotoの乱用、説明のない変数名などの悪いマナーは推奨していませんが、必要以上に複雑にするべきではありません。多分MVCはあなたの特定のプロジェクトにとってはやり過ぎです。

1
user281377

常に「しっかりと構築」されるべきだと思います。市場投入までの時間が重要な場合は、段階的な開発プロセスを使用します。機能が少ない製品がある最悪のシナリオですが、少なくとも将来の機能リリースで拡張できる高品質の製品を出荷する必要があります。

1
Pemdas

バランス

コードを完璧に設計することも、Jiffyでいくつかのコードをマッシュアップすることも、実用的ではありません。それは本当に適切なバランスをとることについてです。私の意見で重要なのは、いつ何をするかです。

ここで最も重要なことは、アプリケーションのコアである基本構造が本当に適切に構築されていることを確実に確実にすることだと思います。気密。それが達成されると、時間の制約に応じて、時間がない場合は、いくつかのコードをまとめて後でリファクタリングすることができます。基礎を得るために注意を払っていたので、その贅沢を買うことができます。そう、コードをリファクタリングしても害はありません。

1
Shreyas Satish

物事を迅速に機能させること、およびモデルロジックとビューを混合すること、カプセル化を解除することなどのコードのショートカットを取ることに焦点を当てることが最善ですか?または、より多くのアーキテクチャを構築するために事前に時間を割いた方がよいですか

私の耳では、あなたがそれをそこに置く方法で、あなたは2つの極端をリストしています。最初の選択は、カプセル化を解除し、モデルロジックをビューに配置することです。私見、これらの問題を解決することは、より多くのアーキテクチャを導入することと同じではありません。おそらく、UIコードがSQLステートメントを実行しているということを除いて、しかし、私はもっと多くのアーキテクチャを構築するとは言いません、そしてあなたはデザインとアーキテクチャの完全な欠如があり、あなたはそれを手に入れるべきだと言います。

アーキテクチャに関しては、今すぐ問題を解決する最も単純なものを選択し、問題が発生するにつれて拡張します。

例えば。現時点で必要なのは、単一のデータベーステーブルからデータを返す機能です。問題が最終的に発生することがわかっていても、関連するテーブルからデータをロードする方法などの問題については心配しません。その機能を実装するようになると、私はそれについて心配し始めます。

したがって、自分の住宅開発プロジェクトでは、次のアプローチを採用します。私が現在取り組んでいる問題を解決する最も単純な可能なソリューションを構築しますが、うまく構築します。さらに複雑さが必要な場合は、ソリューションをリファクタリングします。次のTDDプラクティスは、リファクタリングを安全にし、コードの臭いを回避するのにも役立ちます(カプセル化を解除している場合、適切な単体テストを作成することは困難です)。

ちなみにそれは私がプロとして働くときに取るアプローチでもあります。 ;)

0
Pete

私は人々からフィードバックを得ると私は変身すると期待しています

あなたは自分でそれを最もよく言った:

しかし、ショートカットからの技術的負債が多すぎて、コードを保守して新しい機能を追加するのが非常に難しいという状況にもありました。

時間が足りない場合は、同じ理由で雇用主からプロジェクトを完了するための時間を増やすことを恐れないでください。彼らはあなたにそれを与えると確信しています。これを言っても、何かに一生懸命に取り組み、結果の大部分を誇示できない場合に、いかに苛立たしい気持ちになるかは理解できます。しかし、心配する必要はありません。そこにたどり着くので、うまく構築することは確かに価値があります。

0
Rob S.

通常、私は構造をうまく構築し、特定の実装の詳細について心配することなく時間を節約したいと思っています。あなたが言うように、彼らはとにかく変わるでしょう。よくできた下部構造を構築する背後にある考え方は、ベースが構築されると、変更が非常に速く発生する可能性があるということです。私は自分のクラスでできるだけ一般的になることに焦点を当て、可能な限りそれらをreuableにすることを試みます。私は通常、ユーザーに、最も基本的な使いやすさの要件のみを満足する、適切に構築されたアプリを提供します。ツールが手に入ると、ユーザーはあらゆる種類のアイデアを手に入れることができるので、遠くまで考えても意味がありません。

0
Kratz

ビルドするwell。時間がない場合は、機能セットを減らしてください。

niversalとして設計できます。例えば。プラグインアーキテクチャを設計します。知っている場合でも、最初に使用されるプラグインは1つだけです。最初にパラメーターが1つしかない場合でも、ユニバーサル構成スキーマ(拡張可能な構成、組織化言語)を使用します。これは非常に良い投資であり、この投資はプロジェクトの開始時にのみ行うことができます。

0
ern0

まず、ソフトウェアを立ち上げ、あらゆる面をカバーし、ソフトウェアを最初に立ち、徐々に装飾し、パフォーマンスを向上させることをお勧めします

0
Pir Abdul