戦闘(認識)オーバーエンジニアリングvs流れに乗る[終了]


8

私のデザインとは異なるアプローチを持つチームに参加しました。私はYAGNIのデザインへのアプローチを信じています。たとえば、メソッド(インターフェース、クラス)が使用されていない場合は、削除する必要があります。それでおしまい。

私のチームの人々はモジュール式のアプリを構築しており、モジュールの1つは「フレームワーク」として認識されています。アプリはこのフレームワークの唯一のユーザーであり、現時点でクライアントを増やす計画はありません。ただし、このフレームワークのコードの一部は、あたかも後で使用されるかのように作成および保守され、一貫性と完全性はYAGNIよりも優れています。抽象化が必要になることのない場所に抽象化があるなど。

私はいくつかのことを議論しようとしましたが、仮に仮に説得するにしても、それぞれのポイントにはかなりの時間がかかります。

「フローに沿って」、個人的な問題なしに追加のコードを書くことができます。それは、後に維持するために、最も可能性の高いより多くの時間をコードに今私に多くの時間がかかる、となります、余分にも時間がかかり、圧力を加える何かをしないように、それぞれの議論を。

問題は、異なる意見の場合、より大きな不利益、不要であるが「適切な」コード、または定数の引数と壊れたチームのダイナミクスは何をするのでしょうか?


1
あなたの痛みが分かります。各決定の賛否両論をチームにリストすることを検討しましたか?労力(工数)を通貨の数値に変換し、マネージャーがそれに対して喜んで支払うかどうか尋ねるか、またはそのお金がどのように正当化されるか?これはあなたが働いているアジャイルな環境ですか?ではごきげんよう!
Lucas T

@LucasT私はカウボーイ環境で働いています。同じロジックによって、テストをスキップし、保守不可能なコードを記述し、すべての良い習慣を忘れるかどうかを経営陣に尋ねることができるので、この数時間は難しいトピックです。トレードオフを設定する(そしてそれらを防御する)のは開発者としての責任です。
カバーバック2017年

2
「フレームワーク」は私を震えさせました-ちょうどあなたが内部プラットフォーム効果の影響を受けるものを構築していないことを確認してください。また、本物のユースケースを作成する前に抽象化を構築すると、悪い先入観やコードのリファクタリングに多くの時間を浪費するリスクがあります。あなたの質問に答えるために-事前に適切なバランスを知ることは難しい/不可能です、あなたの懸念を表明できること、バランスが機能するかどうかを測定する方法があること、そしてバランスが取れていない場合は人々が変化する可能性があることを確認してくださいそうではありません。
GoatInTheMachine 2017年

マーティンファウラーが2003年に議論した何かのように聞こえます:FoundationFrameworkHarvestedFramework。事前のアプローチと臨時のアプローチの間の永続的な闘い。
rwong 2017年

回答:


4

架空のフレームワークを維持することは、アーキテクチャ上重要な決定であるため、問題は結局、チームで「アーキテクチャを考え出して進化させる方法」に要約されます。ルールのないゲーム存在しないため、チームの全員が明確で採用する明確に定義された意思決定ルールから始める必要があります

入社時、最も重要な質問の1つは–

意思決定プロセスはチームでどのように機能し、時間とともにどのように進化しますか?

悪い意思決定プロセスよりも悪い意思決定プロセスはありません。プロセスがない場合、誰かがプロセスを定義する必要があります。そうでなければ、ナンセンスの量はチームとの意見の不一致の量とともに増大します。

これで私たちはループを閉じていると思います。意思決定プロセスが欠落している場合にそれを定義する権限と権限を持っているか、現在のプロセス/およびそれがどのように進化するかに同意します。1つ選択してください。


1

一定の議論と壊れたチームのダイナミクスは決してあなたを遠くに連れて行きません。

そもそもなぜフレームワークがあるのか​​を理解してみようと思います。

最も可能性の高い理由は、後で他のシステムで使用されることが予想されることです。その場合は、今必要な以上のことを行うのが理にかなっています。

その理由は、1つのアプリが稼働中の場合、フレームワークの更新を必要とする新しいアプリが進行中であり、フレームワークで何かが変更されるたびに、おそらく以前は不要だった抽象化が追加され、その後、元のアプリを更新する必要がありますそして同様にテストしました。

これは、本番環境で何かをリファクタリングし、再テストすることの非常に多くのことです。

更新されたフレームワークを古いアプリに含めないことを選択した場合、2つのフレームワークがあり、そのうちの1つはすでに廃止されています。

時代遅れのコードを維持することは、士気にとってもあまり良いことではありません。


「もしそうなら、今必要な以上のことをするのは理にかなっています。」コードが正しく記述されておらず、ユニットテストがなく、後でリファクタリングするのが難しい場合のみ。
David Arno

1

チームに慣れていない場合は、部隊の邪魔にならないようにすることを最初に検討する必要があります。

私はあなたがリード/アーキテクトの立場になく、決定はあなた次第ではないと想定しています。

第二の懸念はある学習します。多くを学ぶ。彼らが下した決定を下した理由、フレームワークが作成された理由、その背後にある合理的な理由を学びましょう。すべての情報を入手したら、オーバーエンジニアリングや不適切な通信など、起こりうる問題への対処方法について、情報に基づいた決定を下すことができます。

丁寧に質問してください。マスターではなく、学生の立場に身を置いてください。人々がなぜそのように物事をしたのかを人々に「教える」ことがより簡単になります。

今、あなたは追放者です。あなたは外国のチームに参加しているので、彼らの習慣を学び、自分自身を適応させる必要があります。

あなたが正しい方法であなたの仕事をするならば、人々への丁寧なアプローチで、人々は自然にあなたの言うことに耳を傾けるでしょう。そして、もしあなたのアプローチが全体として最高のものであるということが絶対的に正しいなら、あなたは人々に変化をもたらすことができます。

批判されることが多いが価値を生み出さない人と一緒に仕事をするのが好きな人は、ほとんど知りません。あなたのチーム、彼らが一緒に働くことを誇りに思っている人への参照になります。

また、推奨読書:https : //www.amazon.com/How-Win-Friends-Influence-People/dp/0671027034


0

起こっていると私が思う2つの基本的なことがある。最初は文化的です。あなたはチームに初めて参加し、このチームとの連携方法をまだ十分に理解していません。彼らはおそらく実際に彼らのために働くかもしれない異なる方針と慣行を持っています。また、それらの1つ以上があなたの立場に応募している可能性があるため、彼らはあなたの努力を積極的に妨害したり、あなたが知る必要があることをあなたに伝えていないだけかもしれません。

2つ目は、デザインを誤って読んだ可能性があることです。デッドコードと思われる部分は、実際には設計の他の部分の一般化であるか、ビジネスが最終的にサポートしたいものをサポートするために機能している可能性があります。実際にはデッドコードの可能性があります。それに取り付かずに、なぜそこにあるのかを理解してください。実際に把握するには数か月かかる場合があります。

リスクを嫌う業界(つまり、銀行、中間など)では、コードのチャンクが使用される可能性がわずかにあり、そのコードのチャンクは何十年も残ります。

これを強調するために、私が見た見知らぬデータベース構造の1つは、6つのテーブルを中心としていました。それらの3つは、他の3つを接続するマッピングテーブルでした。1つだけが多対多の関係として使用されており、他の2つは1対多を実装していることがコードで示されているため、意味がありませんでした。これの元の設計者は去りました、そして、それがどのようにまたはなぜ働くか正確に誰も説明できませんでした。結局、私は設計を説明するビジネスドキュメントに出くわしました。つまり、ビジネスはそれを要求し、一部のDBAは、明らかな制限にもかかわらず、ビジネスが理解できる方法で実装しただけだったと思います。30年後もまだそこにあり、会社のお金を稼いでいますが、開発の観点からは、理解、維持、開発が困難です。


1
いいえ、未使用は未使用であり、そこにあるものを除いて、将来的に何かのためのビジネス計画はありません。特別なニーズがある可能性があることは理解していますが、この場合は100%ではありません。しかし、私は「最初にもっと学ぶ」というあなたの目的を理解しています。
カバーバック2017年

-1

他の人がそれを使用していなくても、アプリケーションからそのような部分を削除することにはいくつかの良い点があります。

これにより、アプリケーションの機能的なコンテキストの外(および独自のロードマップ)で適切なテストを行うことにより、フレームワークでの技術的な機能の開発を強化できます。

さらに、すべての開発者がそのフレームワークに触れるのではなく、最も高齢者のフレームワークに触れたくない場合もあります。そのため、アプリケーションの外部に配置することはプラスです。

不要な抽象化レイヤーについては、それらが既に存在する場合でも、すでに機能しているものを変更しないでください。

ただし、フレームワークの目標は作業を軽量化することであり、重みを付けることではないことを将来のチームに思い出してください。


「フレームワークの目標は、作業を軽くすることであり、重みを付けないことです」という点が気に入っています。たくさん!多くの人が代わりにそれを「(可能な)再利用の必要悪」としています。
カバーバック2017年

-3

行間を読んで、私はあなたの共同チームメンバーに傾いています。「必要以上に複雑な」ものを作ることは、必要とされない可能性のある将来の機能への道を開くだけでなく、アプリケーションの開発者の理解にも役立ち、ソフトウェアにモデルを組み込み、アイデアを文書化します。

そしてそうすることは、将来の発展が進むかもしれない方法を制限します。これは、設計/意図を完​​全に把握していない開発者が迷うのを防ぎます。

新しい開発者は、最初は「不必要に複雑な」デザインに悩まされるかもしれませんが、それによって彼は正しい方向に導かれ、彼は成功の穴に陥り、「自分のやり方で物事を行う」ことが難しくなります。同じアプリケーションで異なるアプローチにつながり、次の男が頭を抱えるのがさらに難しくなるため、事態を複雑にする別の方法にすぎません。

YAGNIは、「設計をスキップできる」または「迅速かつ汚い」という意味ではありません(またはすべきではありません)。あなたのチームが物事を考える上での贅沢を持っているなら、私はそれが戦うよりも大切にすべきものだと言います。


1
丁度。それは、将来の発展が何であるかを知らずに、将来の発展を制限します。既知のビジネスプランがなければ、どの抽象化が有用であり、どの抽象化が有害であるかは決してわかりません。そして残念なことに、チームは開発の遅れと配送の失敗というストレスにさらされています。
カバーバック2017年

@coverback:すべての設計の選択は、将来の開発を制限します。デッドコードがすべて除去された場合、このチームは配信ターゲットを作成しますか?または、プロセスに他に何か問題があるか、またはターゲット自体が非常に攻撃的であるか。
Robert Baron
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.