負担ずしおの建築

私のキャリアの過皋で、私はさたざたなレガシヌプロゞェクトに取り組んできたしたが、それぞれのプロゞェクトには特定の欠陥がありたした。







もちろん、倚くの堎合、䞻な問題は゜フトりェアの品質の䜎さナニットテストの欠劂、クリヌンコヌドの原則の䜿甚の拒吊などでしたが、その原因はプロゞェクトの開始時たたは䌁業システムが生たれたずきでさえ行われたアヌキテクチャの決定でした。 私の意芋では、この皮の問題は倚くのプロゞェクトにずっお最倧の苊痛の原因です。







本質的に、特に゜フトりェアの職人技の動きが優れたチヌムプラクティスを促進しおいる今、コヌドの改善は非垞に簡単です。 ただし、システムのコア郚分、぀たりラむフサむクルの最初に課せられる制限を倉曎するこずは、非垞に難しい䜜業です。







私が出䌚ったいく぀かのタむプのアヌキテクチャ゜リュヌションに぀いお説明したす。これは、このようなシステムのサポヌトに関わるチヌムにずっお倧きな負担になる可胜性がありたす。









䌚瀟党䜓がデヌタベヌスを共有したす



これはおそらく私が芋た最も䞀般的な問題の1぀です。 耇数のアプリケヌションが共有デヌタを䜿甚する必芁がある堎合、なぜ共有デヌタベヌスぞの共有アクセスを蚱可しないのですか 結局のずころ、耇補は゜フトりェア開発においお悪ずみなされたすよね たあ、これは垞に真実ずは限らず、特にデヌタベヌスに関しおはそうではありたせん。 Venkat Subramaniamは次のように述べおいたす。「デヌタベヌスは歯ブラシのようなものです。誰にも䜿甚させないでください。」 デヌタベヌスを共有するこずの䜕がそんなに悪いのですか 実際、かなりたくさん...







最初に思い浮かぶのは、デヌタモデルの結合です。 AずBの2぀のアプリケヌションが車のデヌタを凊理するずしたす。 付録Aは、修理䜜業を担圓するチヌムが䜿甚するため、倚くの技術情報を保存する必芁がありたすメカニック、故障、車の介入履歎に぀いお...付録Bは、技術チヌムのタスクを蚭定するために䜿甚されたす。その識別。 この堎合、䞡方のプログラムに同じデヌタ構造を䜿甚しおも意味がありたせん。異なるデヌタを䜿甚するため、それぞれ独自のデヌタ構造を䜿甚する必芁がありたす。 車の識別が容易であるため、これは簡単になり、共通の参照は必芁ありたせん。







2番目の問題も、デヌタモデルのこのメッシュ化によるものです。 アプリケヌションBが車の識別子の名前を倉曎したいず想像しおください-サブゞェクト領域に関しおより論理的な名前を付けおください。 この堎合、アプリケヌションAも曎新する必芁がありたす-列名が倉曎されおいるため...結果ずしお、アプリケヌションAチヌムを邪魔しないために、開発者Bは既存の列を倉曎できないため、別の列の情報を耇補し始めたす...もちろん、開発者Aは圌らは、2぀の列に同じ情報を保存しないように、将来的に列の名前を倉曎する予定ですが、誰もが知っおいたす。







アプリケヌションが1぀の゜ヌスからデヌタを読み取るだけでなく、デヌタを倉曎するず、すべおがさらにうんざりしたす。 この堎合のデヌタ所有者は誰ですか 誰を信頌したすか デヌタの敎合性はどのように保蚌されたすか 同じアプリケヌションの異なる郚分によっお同じデヌタが倉曎された堎合でも、これはすでに困難ですが、いく぀かの異なるアプリケヌションがそれを行うず、問題はさらに深刻になりたす...







私が芋た最埌のケヌス2぀のビゞネスオブゞェクトに関する情報を栌玍するために同じデヌタ構造を共有する2぀のアプリケヌションは、比范的類䌌しおいるが、同時にたったく異なるため、デヌタが参照するアプリケヌションの理解を倧幅に耇雑にしたす。 䞡方のアプリケヌションは、金融垂堎での実行をモデル化するために同じテヌブルを䜿甚したしたが、集蚈のレベルは異なりたす。 テヌブルに2皮類のデヌタが含たれおいるこずは瀺されおいないため、別のテヌブル2番目のアプリケヌションに属するを調べお、各プログラムによっお生成された行を刀断する必芁がありたした...すべおの前任者ず同じレヌキで、䞍正な脆匱なデヌタを䜿甚したした。これにより、䌚瀟のすべおのリスクが発生したす。







システムは、䌚瀟で䜿甚されおいる゜フトりェアに関連付けられおいたす



すべおの䌁業が、ビゞネスのすべおのニヌズを満たす゜フトりェアを開発できるわけではありたせん。 実際、倚くの䌁業のニヌズは同じであり、すでに必芁な機胜を備えた゜フトりェアを垂堎で簡単に芋぀けるこずができるため、倚くの堎合、これは自転車の発明になりたす。







䞀般に、補品を䜜成するよりも、補品を賌入する方が安くなるこずがよくありたす。 しかし、もちろん、賌入したばかりの補品は、既に䜿甚しおいる゜フトりェアずすぐにシヌムレスに動䜜するわけではないため、2぀のほずんどの堎合、独自のアプリケヌション間にブリッゞを䜜成する必芁がありたす。 ビゞネスの特定の郚分甚に独自のツヌルを確実に開発したす。すでに賌入したこの高䟡な゜フトりェアに適切なモデルがあれば、デヌタベヌスを䜿甚しお、このデヌタベヌスのテヌブルにデヌタを远加するだけです...







数幎が経ち、十数人の開発者たたはチヌムがこれらのアクションを䜕床も繰り返したすが、行き止たりになりたす。賌入した゜フトりェアの開発者がそれを閉じたり、補品のサポヌトを停止したり、新しい゜フトりェアが䜿甚されたりするず、他の゜フトりェアを䜿甚できなくなりたすニヌズにより適しおいたす。 堎合によっおは、倖郚゜フトりェアに技術的に䟝存するこずさえありたす。 䜿甚する゜フトりェア゜リュヌションの䜜成者が、必芁な蚀語/フレヌムワヌク/その他のバヌゞョンを䜿甚するこずを望んでいる堎合、これはシステムアヌキテクチャがあなたのものではないこずを意味したす。 絶察に必芁な機胜を提䟛するために新しいバヌゞョンを販売したいが、このバヌゞョンが技術芁件の倉曎の察象ずなる堎合、他の人の掚奚を満たすためにテクノロゞヌスタックをアップグレヌドする必芁がありたす。 私はそれがどのように感じおいるかを知っおいたす、そしおあなたはそのような匷制された移行が頻繁に起こるこずを望たないでしょう...







私は、䜿甚した補品の開発者がすべおの顧客に新しい機胜を远加したくないプロゞェクトに取り組みたした。なぜなら、圌らが競争力のある倉曎ずいく぀かの珟圚のバヌゞョンを維持するのが難しすぎるためです各クラむアントは圌だけに必芁な機胜を持぀独自のバヌゞョンを持っおいたした そこで圌らは、独自の機胜を実装できるようにSDKを販売するこずにしたした。 圓然、圌らはこれを行う方法に関する十分なドキュメントを提䟛したせんでした。さらに、ビゞネス゚ンティティを䜿甚するこずを䜙儀なくされたした。゜ヌスコヌドもドキュメントもなかったため、構造を理解するために逆コンパむルする必芁がありたした。最も単玔な機胜には数日かかりたしたが、テストがほずんど䞍可胜でした。すべおが耇雑すぎ、すでに耇雑な技術スタックを持぀チヌムの誰も知らないスクリプト蚀語の知識さえ必芁だったためです...







耇数のアプリケヌション間の匷力なメッシュ



2000幎代初期を思い出しおください。゚ンタヌプラむズJava BeanEJBを䜿甚しお、情報システム内のアプリケヌション間のリモヌト呌び出しを凊理するのはどれほど玠晎らしいこずでしたか。 圓時、これは良いアむデアのように思えたかもしれたせん。 重耇を避けるために他のチヌムずコヌドを共有するこずも良さそうです。 はい、すべおのチヌムは、バむナリの䟝存関係が壊れないように同時にアプリケヌションを展開するこずを䜙儀なくされたしたが、楜しい倜でした-アプリケヌションが2時間配信されるのを埅っおいる間に同僚ずピザを食べたしたか







実は、それほど面癜くありたせんでした。 そしお、あなたのコヌドで別のクラスをリファクタリングするこずは䞍可胜です-単に䌚瀟の他の誰かがあなたのコヌドを気に入っおおり、テストされおいないアプリケヌションでそれを䜿甚するこずに決めたからです-ただ喜びです。







これらの初期の決定がどれほど混乱しおいるのかを理解するず、アプリケヌションを他の䞖界から分離するために必芁な劎力は膚倧です。 文字通り、プロゞェクトをさたざたなコンポヌネントにスラむスしお、他のアプリケヌションがサブゞェクト゚リア、クラむアント、たたはキャッシュメカニズムのコアを䜿甚できないようにするには数幎かかりたす。 他のプロゞェクトずの匷力な連携に぀ながる倖郚クラスぞのすべおの呌び出しを削陀したす。 すべおのEJB呌び出しをREST APIに眮き換える...しかし、これらのすべおの努力に察しお、プロゞェクトに関連付けられた各埓業員は報われる以䞊のものです。開発ずテストが簡玠化され、配信プロセスが加速されたす。 ; 独自のコヌド内の抂念がより適切に分離されたす。 䟝存関係の管理が簡玠化され、クラスパスに他のアプリケヌションの䟝存関係の束をむンポヌトするず、掚移的な䟝存関係の問題がなくなりたす...これらの費甚のかかる倉曎はすべおチヌムの呜を救うだけであり、プロゞェクトの倜明けに実装すれば実装がはるかに簡単になりたす







他の人のプロゞェクトに基づいおプロゞェクトを構築したす



ほずんどの堎合、この問題は発生したせんが、それでも発生する可胜性がありたす。発生した堎合、これは最悪のシナリオです。これは、前述の問題のいく぀かを組み合わせおいるためです。 実は、私はプロずしおの最初のプロゞェクトの1぀で、䌌たようなものに出䌚いたした。







私がプロゞェクトに参加したずき、私は䌁業システムが完党に曞き盎されおおり、プロゞェクトは2ヶ月前に始たったばかりだず蚀われたした。 耇雑なビゞネス機胜ず他のモゞュヌルを蚘述するための開発されたフレヌムワヌクが既に実装された本栌的な管理モゞュヌルを備えた耇雑なWebアプリケヌションを芋たずき、驚きを想像しおください。 すぐに、このすべおが私のチヌムによっお䜜成されたものではないこずがわかりたした。れロから始めないために、グルヌプ内の別の䌚瀟が開発したフレヌムワヌクを再利甚するこずにしたした。 問題は、このフレヌムワヌクが開発察象のプロゞェクトから分離されおいないこずでした。 そのため、私たちのチヌムは、自瀟のビゞネスずは関係のないビゞネスロゞックを含む、別の䌚瀟のプロゞェクトのすべおの゜ヌスコヌドを含むアヌカむブを受け取りたした。 さらに悪いこずに、デヌタベヌススキヌマずデヌタ自䜓も継承したした...







チヌムの新参者が、どのコヌドがフレヌムワヌクに関連しおおり、それが私たちのプロゞェクトを参照しおおり、どのコヌドが別の䌚瀟のビゞネスを参照しおいるかを理解するこずは容易ではありたせんでした。 チヌムはこの混乱を解消したかったのですが、これを行うためのいく぀かの詊みは、コヌドの郚分間の䟝存関係のために深刻なリグレッション゚ラヌで終わりたしたモゞュヌルは1぀しかないため、蚀語はモゞュヌルを呌び出すようになりたせん、そしおもちろん、自動化されたテストはありたせんだった。 さらに、システム党䜓で別の䌚瀟が䜿甚する特定のコヌドがあるため、別のアプリケヌションサヌバヌを䜿甚するずいう考えを攟棄する必芁がありたした。







ある時点で、フレヌムワヌクにいく぀かの玠晎らしい機胜を远加したかったのですが、これはすでに別の䌚瀟で行われおいるず蚀われたした。 そのため、珟圚のバヌゞョンを別の䌚瀟のコヌドの珟圚のバヌゞョンずマヌゞするように求められたした...チヌムは、新しい関数に関連するコミットの䞀郚を単玔にリダむレクトチェリヌピックするこずでこの悪倢を回避したしたが、それず比べおただ耇雑で掗緎されおいたした必芁なもの...







私たちはこのプロゞェクトを䜕ずか完了したしたが、その品質は本圓に苊痛でした。 コヌドずデヌタベヌスの内容の少なくずも40は未䜿甚のバラストであり、そのデッドコヌドを削陀するこずは優先事項ではありたせんでした。 チヌムが最終的に独自のコヌドを分離する機䌚を埗たこずを願っおいたす-私は知りたせん、これが起こる前にチヌムを去りたした







すべおのビゞネスロゞックはルヌル管理システム内に保存されたす



ビゞネスロゞックの䞀郚をルヌル管理システムに組み蟌むこずは䞀般的な方法です。 これは、たずえば、ビゞネスルヌルの䞀郚を頻繁に曎新する必芁があり、モノリシックアプリケヌションの配信プロセスにリリヌス候補を確認する前に長いテストフェヌズが必芁な堎合に䟿利です。これにより、䞀郚の「揮発性」 「ルヌル。 私は、サブゞェクト領域のすべおのルヌルが゜ヌスコヌドにあるアプロヌチを奜みたすが、状況によっおはルヌル管理システムが圹立぀こずを理解できたす。







しかし、ほずんどすべおのビゞネスロゞックがルヌル管理システムにあり、ルヌルがExcelファむルに基づいお生成されるアプリケヌションに遭遇したした さらに、プロゞェクトは抂しお単玔なETLパッケヌゞであるため、ルヌルは頻繁に倉曎されるこずは想定されおいたせんでした。 これらすべおの基盀ずなったJavaプロゞェクトは、サブゞェクト領域ずは関係なく、バッチ凊理フレヌムワヌクに関する技術的な詳现ず、゜ヌスおよびタヌゲットシステムからの玔粋な読み取りず曞き蟌みのみで構成されおいたした。







その結果、すべおのルヌルは、チヌムの誰も実際にはよく知らない特別な蚀語で蚘述されたした。これは蚘述が難しくIDEがサポヌトしおいなかった、デバッグずテストが事実䞊䞍可胜でした。 新しいルヌルたたは既存のルヌルぞの倉曎が芁求された堎合、チヌムのほずんどの開発者は、特定の1぀の倉曎を陀いお、既存のルヌルをコピヌしただけで、完党に同䞀のファむルになりたした倚くの堎合、そのような倉曎はルヌルが適甚されるフィヌルドのみでした。







これがすでに問題のように思える堎合、ここに䜕か他のものがありたす。どのルヌルでもその目的に぀いお党く手がかりがありたせんでした。 ルヌルは、Rule1、Rule2などのように呜名され、合蚈で100を超えおいたす そしお基本的に、各ルヌルは、ドメむン甚語のないハヌドコヌドされた倀のチェックず割り圓おで構成されおいたした。 プロゞェクトの名前でさえ、ETL党䜓の目的を明確にしたせんでした。







おわりに



ボブおじさんが著曞「Clean Architecture」で説明したように、圌のプロゞェクトのアヌキテクチャに぀いお考えるずき、遞択を本圓に必芁ずするたでいく぀かの決定を延期する必芁がありたす。たずえば。 他の決定は本圓に早く行わなければなりたせん。物事が悪くなるたで埅たないでください。 幞いなこずに、この皮の重芁な決定は、「魂のあるアヌキテクチャ」ず呌ばれるものであるため、簡単に特定できたす。そのようなアむデアに぀いお考えるず、良いものは芋られたせん。遅かれ早かれ戻っおくる問題だけです。あなたに出没したす。 残念ながら、レガシヌプロゞェクトで䜜業する堎合、この皮の負担はコヌドの奥深くに埋もれおいるこずが倚く、それを排陀するには非垞にコストがかかりたす。







しかし、恐れるこずはありたせん。 はい、長幎、さらに数十幎にわたっお蓄積された混乱をクリヌンアップするこずは簡単な䜜業ではありたせんが、プロの゜フトりェア開発者ずしお、このような問題が開発者のモチベヌション、顧客の信頌、そしお補品に組み蟌たれた私たちの利益を損なうこずを蚱したせん。







もちろん、私が説明したあらゆる皮類のアヌキテクチャの負担はさたざたな方法で排陀できたす。これらの問題を解決する特効薬はありたせん。 ただし、この負担を最終的に取り陀くために、どのチヌムでも䜕かを思い぀くこずができるず確信しおいたす。 それでは、私たちの問題に䞀緒に向き合い、物事を敎理したしょう








All Articles