「あなたはそれを必要としない」と「今は絶対にない」が一緒にプレイするにはどうすればいいですか?


17

デザインの乾燥を進めているとき、「今は絶対にない」ということをよく受け入れます。通常、私は、他の知識のシステムのコンテキストで、ある知識についての1つの信頼できる場所の理解を深める必要があると感じています。したがって、私はシステムを「今」設計する傾向があります。

反対に、このプラクティスにより、私はそれを必要としない合理的なチャンスにもかかわらず、かなり前もって構築することになります。

これら2つのパターンはどのように正方形になりますか

それらがうまく動作することを保証するためにどのようなプラクティスを使用しますか?

混乱を招くことなくそれらをどのように教えますか?


2
石橋を叩いて渡る。しかし、ためらう者は失われます。
mmyers

回答:


26

私もずっと先を考えていますが、通常はコードでは考えていません。ブレーンストーミングとメモを取り、できれば整理して、参照できるようにします。

私はコードに関しては「必要ない」に傾いていますが、デザインでは「今は絶対にない」のです。

新しいシステムの構築を開始するとき、今すぐすべてを構築したいのは魅力的ですが、それはあなたの勢いと士気を低下させることもできます。私は全体的な設計について考え、それを直接線引きしようとする傾向があります-エンドツーエンドの骨格アーキテクチャを考え出し、それを最初に構築し、後でそれを進化させてリファクタリングできるようにサウンドデザインの原則を適用新機能で。

動作可能なシステムの最も単純なエンドツーエンドの表現を構築します。最初にそれを行い、それからあなたは反省する何かを持っています。これは、これらの曖昧な「what if」質問をすべて明確にし、次に構築する必要があるものを特定するのに役立ちます。


3
デザインに何かのための場所を残して+1しても、その多くを最初に構築する必要があるわけではありません。あまりにも多くの人が絶対的なキックをして、要求の前に何も考慮すべきではなく、顧客の入力なしで全体を構築した場合よりもはるかに悪い状況に陥る必要があります。
ビル

9

YAGNIとは、物事が完了する前にではなく、完了する必要があるときに物事が完了することを意味します。それは、彼らが決して必要とされない限りではなく、彼らが決して終わらないことを意味しません。つまり、顧客に即時のビジネス価値をもたらすものだけを行うということです。即時のビジネス価値が意味するものは、すべての顧客とすべてのプロジェクトにとって主観的です。

どちらの場合でも、YAGNIで何も失うことはありません

もう1つの場合、使用されないコードの作成、使用されないコードのテストの作成、使用されないコードのドキュメントの作成、使用されないコードのメンテナンスなど、このコードが何をしているのか疑問に思う人は時間を無駄にします、それが使用された場合は、吐き気。

プロトタイプ/概念実証またはアプリケーションの1.0バージョンで作業している場合、Facebookのレベルに合わせて拡張するデザインは必要ありません。地獄私は、Facebookのレベルに合わせて拡張するためのデザインは必要ありません。そのようなトラフィックあることわかるまでは。

ZuckerbergがFacebookの最初のバージョンを設計して、5億人のユーザーに拡張できると思いますか?いいえ、彼はそれを設計し、それを行うために必要なだけでそれ以上のことをしないように構築しました。彼が初日から5億人のユーザーのためにデザインをウォーターフォールしようとした場合、Facebookはおそらくリリースされなかったでしょう。

物事を行うための実用的な方法は、彼がそれをやった方法です。彼はPHPとMySQLから始め、ビジネス価値に基づいて必要に応じて再設計および書き直し、数百万人のユーザーに拡大することは大きなビジネス価値でしたが、0日目ではなく、何かを立ち上げるだけで大​​きなビジネス価値がありました。

彼は再設計と書き直しを計画していました。これは、キッチンシンクの計画とは異なる考え方であり、完全な有用なものを実際に開発または提供することはありません。

コードベースの寿命の終わりと書き換えを計画することはアジャイルであり、将来の証拠です。「柔軟な」という未定義の目標を考え出そうとすると、毎回失敗に終わります。使用する必要のない機能について希望的観測をするのではなく、ビジネス上の価値のあるものを開発するために、必要なく設計し、時間を浪費しています。


2
あなたのデザインが悪い(例えば柔軟性に欠ける)場合、YAGNIで多くを失う可能性があります。
EricSchaefer

1
@EricSchaefer-目標を達成し、ビジネスに価値を提供し、多くの時間を投資しない場合、完全に出荷されない魔法の無限に柔軟なシステムを提供しないよりも、無駄を少なくするだけではありませんもしそうなら、それは設定の悪夢になります。

6

Python禅の方法はこう言います:

今は決してないよりはましです。多くの場合、今よりも優れていることはありません。

アイデアは、今やるべきことを定義できるからではないということです。今すぐ必要ですか?

  • はい:今すぐやってください!
  • いいえ:しないでください!必要を待ってください!ヤグニ!

これがあまり明白でないケースは、リファクタリングの場合です。できるたびにDRYを適用する必要がありますか?DRYを適用すると、複製よりも(費やす時間で)コストがかかる場合があるため、答えは明確ではありません。ただし、長期的には、技術的/パフォーマンス上の理由がない限りDRYを適用することは常に適切です。

だから、あなたがやるまでYAGNI、そして今それをしなさい。待てないで!


3

彼らは一緒にプレイするとは思わない。どちらか一方に傾くと思います。そして、私はヤグニに傾いています。

しかし、その価値については、「今は絶対にない」という2番目の提案には同意しません。要件が重要である場合は、完了する必要があります。したがって、「決して」は不可能です。それが重要でない場合、「今」は良くない-「決して」は良くない。

ちょうど私の2セント。


そして今、100万ドルの質問:「重要」とはどういう意味ですか?
アーロンノート

1
「重要」とは、受け入れテストであることを意味します。
親切な

重要なのは、クライアントがそこにいないときに大声で叫ぶことです。
ポールネイサン

2
重要なのは、クライアントがそこにいなければ支払わないということです。
クリストファーマハン

@Christopher、それは非プロフェッショナリズムを奨励していると解釈できます。例えば、SQLインジェクションから保護することは、たとえクライアントがそれが何であるかを知らず、支払い前に確かにそれをテストしなくても重要です。
ピーターテイラー

2

これら2つのパターンはどのように正方形になりますか

それらは直交しており、互いに関係ありません。

それらがうまく動作することを保証するためにどのようなプラクティスを使用しますか?

あの 両方ですか?さらに何がありますか?

混乱を招くことなくそれらをどのように教えますか?

YAGNIは、ユーザーから見た機能を説明します。あなたは空想を必要としません。

今はプロセスを説明しないよりはましです。今すぐテストを書きます。今すぐコードを書いてください。設計の代替案を検討している時間を離れてはいけません。何かを構築することについて話すのではなく、何かを構築します。


2

「決して」が「今ではない」という意味である場合、設計に欠陥があります。

ローカルの決定は、システムの他の部分に対して透過的でなければなりません。
あなたがコンポーネントを持っている場合たとえば、CookieSource、それは必要でCookieFactoryオンにするCookieRecipesことは知っているにCookiesそして、あなたのいくつかの入力パラメータに基づいて、CookieSource必要はありませんし、それによってどのように依存してはなりませんCookieFactory実装されており、どのようにCookieRecipes表現されます。が実際にa である
場合、それは問題になりません。その機能が必要でない限り、実装する必要はありません。そして、使用するサービスとの間に明確な抽象化障壁がない場合を除いて、後で追加できない理由はありません。CookieFactoryBakeryRecipePastryCookieSource

ソフトウェアを構築するときは、必要に応じて機能を追加し、意思決定に縛られないようにしてください。代わりに、適切な抽象化に決定をロックします。


1

私が見つけた最も簡単な解決策は、前もってコードを書くときに変更を期待することです。ブール値を関数に渡すとき、通常はできるだけ早くフラグ/列挙型に変更し、a)より読みやすく、b)拡張しやすくします。同様に、もう1つ必要になるような匂いがする場所に多数のパラメーターを渡していることに気付いた場合は、通常、特別な構造を作成します。希望はYAGNIですが、ある時点でそれを行うと、すべてのユーザーがすぐにひどく壊れることはなく、「うんざりする作業」はすでに完了しています。多くの場合、/ *将来の追加がここに追加されるように* /のようなコメントを追加することもできます。そのため、まだ実装されていないことは明らかですが、ここに追加します。後でインターフェイスのリファクタリングが最も時間のかかるものであることがわかったため、通常はこれが最も役立ちます。


私は原則としてこの哲学が好きですが、実際には、移行は私が二度と考えるほど痛みを伴うことがわかります。モデルの移行が変更を期待する妨げになっていることを発見したことはありますか?
ジャスティンマイルズホームズ

このアプローチの良いところは、変更の苦痛が少ないことです。まだ多くの作業が関係しています。モデルを移行することの意味が
わかり

0

将来の拡張機能を念頭に置いて設計しますが、必要になるまでそれらの拡張機能を実装しないでください。

思い浮かぶ例は、Netflixが最初に起動したとき、各アカウントに関連付けられたキューを1つだけ持つことができることです。彼らは後に複数のキューのサポートでハッキングしました。当初からそのように設計されていなかったため、保守がますます難しくなったため、彼らはその機能を廃止することにしました。顧客の騒ぎの後、彼らは弾丸を噛み、複数のキューを適切に統合するために再設計しました。

最初に誰かが後で複数のキューを必要とする可能性を許可していた場合、追加の短期的な労力をほとんどかけることなく、多くの長期的な悲しみを救うことができたでしょう。実際に複数のキューを実際に実装する必要はありませんでした。大規模な書き換えや保守不可能なハックが必要ないことを確認してください。

表面的には、将来の要件を予測する占い師のような能力が必要と思われますが、実際には、何かがハードコーディングされていることに気付いたとき、またはデータベーステーブルあいまいに関連する列のみを多く収集しています。

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