YAGNIとどこまで行きますか?[閉まっている]
-
19-09-2019 - |
質問
私はエンタープライズ市場向けの新しい革新的な Web アプリケーションを開発しています。確かに、私以前の多くの人は、自社の Web アプリが革命的であると考えていましたが、実際はそうではないことがわかりました。(あるいはそうなのですが、とにかくビジネスがうまくいきません)。
そこで、最小限のコストで自分のアイデアに説得力があるかどうかを確認するために、極端な YAGNI に従うことを考えています。
セキュリティ機能はありません (ユーザーなど)。新しい顧客の場合は、新しいデータベース インスタンスと新しい Web アプリ インスタンスをインストールします。各 Web アプリケーション インスタンスは、http サーバーのパスワード (ダイジェストまたは基本認証、おそらく https 経由) によって保護されます。
国際化はありません。ソースコードに英語の文字列が埋め込まれているだけです。
デカップリングはありません。データベースと通信する Web ページだけです。
パフォーマンス上のトリックはありません。キュー、キャッシュ、タイマー、バックグラウンド ジョブ、非同期呼び出しなどはありません。
スケーラビリティがない。データベースのパーティショニング、シャード、クラスタリングやレプリケーションはありません。
さらに、必要に応じて、YAGNI をミクロレベルで使用してください。
私はプロジェクトを開始して、シンプルで魅力的な UI で革新的な機能を販売できる (または販売しようとしている) 点にできるだけ早く到達したいと考えています。
計画が失敗した場合は、早い段階でわかります。それが成功すれば、顧客が何を望んでいるのかが見えてきます。彼らはフランス語版を望んでいますか?それとも、組織内のユーザーと役割が必要ですか?
これが人々がYAGNIという言葉で意味するものなのでしょうか、それともこれは病理学的で誇張されたYAGNIの例なのでしょうか?
解決
私は YAGNI の原則に心から同意しますが、それでも成功するための計画を立てたいと考えています。ユーザーが突然 10 人を超えたときにアプリケーションを完全に書き直す必要がある場合、それは YAGNI のやりすぎです。
必要なものがいくつかあります。私の観点から、最も重要な点は次の 2 つです。
アプリの国際化の準備を怠って、自分自身を傷つけないでください。あなたのアプリケーションが少しでも優れていれば、いつか国際化が議論されるようになるでしょう。また、2010 年にアプリケーションを最初から構築する場合、UTF-8 を使用して外部文字を処理できることは絶対的な要件です。英語を母国語とする人にとって国際化はそれほど重要ではないように思えるかもしれませんが、信じてください、これは不可欠であり、後からアプリケーションを国際化する際の苦痛は恐ろしいものです。
セキュリティ機能がないことについてよく考えてください。さまざまなセキュリティ レベルのユーザーがアプリを操作したいと考えている組織やグループはどうでしょうか。それ できた これは実際にはなくても問題ない機能ですが、私の製品の多くにはきめ細かいセキュリティ システムが組み込まれていますが、まだその可能性を最大限に活用できていません。ただし、特定のアプリケーションが成功したとしても、それなしで問題が解決できるかどうかをよく考えてください。
他のヒント
これが「プロトタイピング」と呼ばれるものです。頑張れ。
YAGNI とプロトタイピングの間には微妙な点があります。
それがユーザーの要求による特徴炎であり、あなたがノーと言うとき、それがYAGNIです。
それが実装 (I18N、「デカップリング」(?)、キュー、キャッシュ、タイマーなど) であり、自分自身に「ノー」と言ったとき。それは本当のYAGNIではありません。それがプロトタイピングです。
ここにあるもののほとんどはユーザー志向の金メッキではないようです。私はこれを -- 正確には -- YAGNI とは呼びません。
YAGNIはあなたがを何の違いを見るために、あなたを思い出させるについてです。のやると、あなたの要件を満たすために何をする必要があるかすることができます。
たとえば、あなたの条件に言えばちょうどあなたのフレームワークのデフォルトの認証方法を使用して、次の要件に移動し、「人々がアカウントを作成し、ログインしてみましょう」。
あなたのウェブアプリ のサポートはOpenID、Active Directoryの、ローカルデータベース、フラットファイル、および認証方法の無数他の種類のことができますが、最も簡単なものを実装することにより、要件を満たすことができます。 (私には、 YAGNI の意味<のhref = "http://c2.com/xp/ DoTheSimplestThingThatCouldPossiblyWork.html」のrel = "noreferrer"> DTSTTCPW を)。
"私は十分な時間が与えられ、何でもできる"
- 私が今まで会ってきたすべてのプログラマ
YAGNI原則のファンではない自分自身。私はそれが悪い-設計されたソフトウェアの正当化にあまりにも頻繁に使わ参照してください。オーバー設計されたソフトウェアは、あまりにももちろん問題ですが、「YAGNIは」本当に実際の影響分析のための余地を残していません。
これは、ソフトウェアの世界では、あなたが必要とするつもりはないと思う事柄の多くは、あなたが実際に必要としていることが判明しました。そしてその後、いくつかの。 Who'dathunkitます。
私は使い捨てのアプリケーションや2年後の生産にまだあるホールドオーバーすることになった1つのまたは2のアプリを書いています。彼らは維持するための痛みです。
それはセキュリティのようなものになる場合は特に - あなたはおそらくはは、それを必要としています。
。YAGNIは良い原則ですが、それは唯一の設計原理ではありません。上記の多くは、すぐにユーザーの前に製品を取得するために意味をなします。例えば、データベースに直接話をWebページには、あなたが(この場合はDRYで)他の人を除外して1つの原則(YAGNI)上の奴隷依存を見つけるつもりされている各重複したコードに始める、しかし、もしあなたの能力を制限しますユーザの機能要求のごうまくいけば成長している番号に対応します。
本当に開発するつもりなら、 エンタープライズ市場向けの革新的な Web アプリケーション どれがどれなのかよくわかりません Yあなた あ整数 G女 Nええと。
また、あなたの例はかなり具体的です。たとえば、次のように言うときです。「セキュリティ機能がありません」...ユーザーはなくても済むものの 1 つですが、入力をサニタイズすることは不可能だと思います。また、「スケーラビリティ」はデータベースのシャーディングやレプリケーションの問題ではありません。これらは、アプリケーションが適切に拡張できないことを認識した後に行う決定です。
むしろ使うときは気をつけたい ヤグニ これは、高レベルの設計ガイドラインとして、奇妙な製品機能やソフトウェア コンポーネントの極度の柔軟性について話すときに最もよく当てはまります。
私の0.2だけ
、あなたは容赦なくあなたをリファクタリングするために準備する必要がありますコードベースは、泥のボールを作成することなく、あなたが今、除外後のものに追加します。
私の心のYAGNIでは、最も一般的に考えて、開発者との文脈で使用されている「我々はまた、我々は将来的にそれを必要とするかもしれない機能Xを追加した場合ああ、それはスマートになります。」 の今までにの要件ではない機能を追加することはありません。
あなたの顧客は機能Yが絶対に必要であると考えるならば、あなたのコードは常に変更のために開いている必要があります言われていること。良いアーキテクチャは必見です!
スケーラビリティ、キュー、キャッシングについて:それは依存しています。アプリケーションのための要件は何ですか?それは10人の同時ユーザーが使用するイントラネットサイトであるか、それは何百万ものユーザーに人気のサイトです。場合によります。要件を見つけ、その行いません - 何もより多くを。 YAGNI。あなたの条件に変更した場合は、アプリケーションを変更する - それは修正のために開いている必要があります。
。YAGNIは良好です。あなたは今、それを必要としないが、あなたは、あなたが近い将来にそれをする必要がありますほとんど確信している場合は、それはほとんど常に、後でよりアップフロントでそれに合うように簡単です。あなたは、この2つ目ののを必要としませんが、ほぼ確実に問題が始まるところだ、YAGNIによって近い将来に必要になります。
のものを実装していない場合には正当化YAGNIは、多くの中で一つだけの偉大なプリンシパルがある点は覚えて良いものです。時々YAGNIは、1つの決定を示唆しているが、別のを好むにも同様に良い(またはそれ以上)の理由があります。
ここで私はいくつかのYAGNIの支持者は、遠くに行くことを感じつの領域があります:あなたはOOD /多型に慣れている場合、通常でも、プロトタイプでは、あなたは非常に少しの将来の使用のためにいくつかの素晴らしい拡張ポイントを「で焼く」するコストます。
ここでは一例です...
レポートの印刷用バージョンを表示する機能が含まれてプロトタイプのWebアプリケーションを作成しています。あなたはすぐに動作しますが、steakholdersはラインの下にもレポートを電子メールで送信する機能が要求されますかなり良い感触を持っている必要があります。
サーバーサイドのJavaコードでは、報告書は、インターフェイスの背後にあるプリンタのために準備されているという事実の知識を隠します。その責任を保持するためのインターフェイスを拡張する具象クラスを作成します。実際にオフに行くと、のインターフェースのの電子メールのバージョンを書き、YAGNIのでしないでください。あなたが行う場合でも、あなたはあなたの既存の機能に大虐殺ずにそれを追加するように設定しています。
私はノーであるどちら...あなたはすべての常識を捨てると、可能な限り最もexpediant方法で、プロジェクト全体をすることによって始めている場合は、何をしてしまいますが失敗の大きな山であることを言うだろう革命(TM)を意味します。
あなたは本当に有用であることが起こっているかどうかを知りたい場合は、は、いくつかの画面モックアップを行います。多分普通の古いハードコードされたHTML。潜在的な顧客にそれらを取ると、あなたがドアに足を得ることができるかどうかを確認します。それらのいくつかは噛まないように開始する場合は、お尻をバストし、それを構築します。
場所での契約を得るために時間がかかる支払を取得し、実際にそれを使用して起動するようにクライアントのスタッフの誰かを取得するつもりです。それが起こっているが、それを構築します。
ほとんどの場合起こるために何が起こっているかは、潜在的な顧客は、それが彼らのために動作しない理由を教えてくれ、うまくいけば、あなたのアプリを見てということです。モックアップを変更し、戻ります。あなたが誰かが支払う意志があることを、ご使用の製品のためのフロントエンドのデザインを持ってまで、必要に応じて反復します。
私は何をするだろうことはあります:
1)考慮して、右の建築の決定を取って、それを設計します。国際化とセキュリティは、おそらく、この場合にぐるぐる必要があります。
開発時に2)、これらの原則は、後に実装するためのフックを作成します。あなたは時間と予算を持っているときに、あなたが主要な改造を行うことなく、それらをimplementeすることができます。
3)次に、あなたのアプリケーションが飛ぶなるだろうな機能に集中し、あなたの潜在的な顧客へのより重要であることができます。
だから私は、あなたが示唆したように、この場合には、私は「極端なYAGNI」よりもKISSのアプローチの多くを使用しているだろうと思います。
私の意見では、YAGNIはデフォルトで従うべき
のます。と思ったいくつかの例外があります。あなたがサードパーティのライブラリを開発する場合たとえば、あなたは、少なくとも少し早めに考えると、いくつかの将来のユーザーのニーズを予測する必要があります。それはあなたが完全にYAGNIに放棄していることを言っているわけではないが、あなたはのように厳密では自社開発のようにそれに従うべきではありません。
はい、でも...
私はあなたの考察の多くに同意する傾向があります を除外する Yagniの「IT」は、考える手順ではなく機能を表しているため、「デカップリングなし」です。いくつかの抽象を導入すること(分離に必要なものだけ)は、発生していないエラーや、より迅速に発見および削除されたエラーの観点からすぐに報われます。
それらの抽象化を導入するための素敵な(それがあなたが考えているから) 優れたWebフレームワークを使用して、その提案されたアプリケーション構造スタイルに従うだけです.
フリンジの利点として、セキュリティ、国際化、パフォーマンス、スケーリングのものを後で追加する方がはるかに簡単になり、Yougni-Behavior-nowは合理的に安全になるはずです。
(残念ながら、引数は、すでにWebフレームワークを知っている場合にのみ適用されます。ヤグニ王国では知識が最も重要です。)