web-dev-qa-db-ja.com

フレームワークの変更やサポート対象外のものを使用して、エンタープライズソフトウェアの長期的な安定性を確保する方法

私は私の国で最大の企業の1つである社内IT部門で働いています。

インフラストラクチャとソフトウェアシステムは、Oracleデータベースに大きく基づいています。ほとんどのコアビジネスプロセスとビジネスロジックは、SQLおよびPL/SQLバッチジョブ、データベースへのデータのインポート、変換、統合、DBリンクを介した通信などを使用して構築されています。このシステムは、過去30年間徐々に構築されてきました。これは非常に均質なシステムであり、利点もあります。

現在、最近、さまざまなテクノロジー、多様化、およびOracleへの依存度の低下に向けた動きがありました(コストは1つの要素です。数百のEnterprise Editionデータベースと数千のStandard Editionをホストしています)。

ただし、1つの質問がよく出てきます。Oracleデータベースはかなり安定しており、下位互換性があります。より複雑な環境でシステムの長期的な安定性(10年以上)をどのように確保できるでしょうか。特定のフレームワークを使用し、クラウドのどこかにホストされているコンポーネントA、B、C、Dがあるとします。クラウドプロバイダーがフレームワークのサポートを中止した場合はどうなりますか?重大な変更によりコンポーネントBとCの互換性がなくなった場合はどうなりますか?

満足のいく答えはまだ聞いていません-基本的に私がこれまでに得た唯一の答えは「書き直さなければならない」だけでした

したがって、基本的に3年ごとにすべてを書き直さなくて済むようにするために、どのような戦略を採用する必要があるかを知りたいと思っています。

5
sigsegv

活用すればするほどOther Peoples Work TMより多くの人が他の人の気まぐれになります。

したがって、これを処理するには4つの方法があります。

  1. 取るに足らない金額ではないを支払うと、家のすべての物を100%(または可能な限り近く)開発および維持できます。それを最新の状態に保ち、バグがなく、下位互換性を保つことは、完全にあなた自身の問題です。少なくともあなたはあなたが望むものを(多かれ少なかれ)変えることができます。

  2. 重要ではない金額ではないを支払うと、サードパーティは、そのテクノロジーを最新の状態に保ち、機能し、バグがなく、下位互換性を維持することについて十分注意することができます。あなたが望むどんな変更もおそらく腕と脚に費用がかかり、受け取られるまで長い時間がかかります。物事を変えないために、領主に賃金を支払うのを好む。

  3. 内部のニーズに変更を加える必要がない場合でも、コミュニティの取り組みの一部としてそのテクノロジーを維持するために、一部の開発者を維持するために取るに足らない金額ではありませんを支払います。それを最新の状態に保ち、動作し、バグがなく、下位互換性を保つことは、気になるビットの問題です。ああ、そしてスチュワードシップに関する多くの議論。ただし、すべてを家に持ち込むか、そのテクノロジーの家主にならざるを得ない場合もあります。

  4. 古い(壊れていない)テクノロジが原因でソフトウェアが停止し、新しいテクノロジで生まれ変わったソフトウェアを継続的に再構築するには、重要ではない金額ではありませんを支払います。また、こんにちは再訓練にこんにちは。プロジェクトのユニコーンのためにもたらされた3歳の従業員が現在プロジェクトの恐竜に取り組んでいるので、可能性のある大勢の人々が辞任します。


私の心の中で、上記の戦略のどの組み合わせがあなたの状況に役立つかを理解してください。

あなたは、これが銀行残高と将来の予算編成に何を意味するかをビジネスマネージャーに明確にする必要があります。

  1. 大規模な社内チーム、長期従業員、運用上の変更と開発上の変更に集中するために、機能的な変更を提供しない時間。

  2. 大規模なベンダーの支出、動きの遅い新機能、展開と監視を処理する中規模から大規模のサポート/運用スタッフ。

  3. 大規模な開発者コミュニティで作業する小規模の開発者チーム。コミュニティの善意を育て、競争相手をサポートするためのコードを提供するなど、市民の責任を果たすことで獲得する必要があります。他の人がバグ、問題の発見、問題の解決などを手助けする可能性はありますが、コードはあなた自身の管理下では100%ではなく、必要な機能が失われたり、一部の内部プロジェクトの問題を引き起こすように変更されたりする可能性があります。

  4. 大規模な社内チーム/新しいソフトウェアを作成するための頻繁な外部契約。頻繁な再トレーニング、頻繁な従業員の離職。頻繁な廃止措置活動。古いシステムからのデータへのアクセスは、データレイクがあってもほぼ不可能ですが、システムをこれを恐ろしいコード/テクノロジーベースの社内ソリューションに移行させるシステムを維持するために、生命維持担当者が必要になります。記録管理を行わず、軽薄なシステムでのみ使用することをお勧めします。真剣にこれは長期的なソフトウェアにはなりません。


これらの新しいフレームワークはバケット3または4に分類されます。

  • 保守保証を請け負う企業、およびあなたが支払う意思のある企業がなければ、その2
  • またはそのオープンソース、そしてそれを社内で維持するために大規模なチームを収容する用意があるなら、その1。

クラウドベースのサービスは2または4のいずれかです。サービス契約の保証をまだ確認していないため、おそらく4です。

  • 生のインスタンスだけでも4(厳密に保証された契約を意味します)ですが、少なくともそれは社内インスタンスに簡単に変換できます(1)。

Oracleデータベース、それは2です。

そして、その周りにある自社開発のアプリケーションはすべて1つのカテゴリに含まれます。

5
Kain0_0

概要

  • 抽象的な依存関係合理的に抽象化できるため、将来それらを交換する必要がある準備ができています。
  • ベンダーのサポートに依存している場合は、ベンダーを確認して、サポート契約をよく確認してください。
  • 重大な変更に対処したくない場合は、依存関係のメジャーバージョンを盲目的に更新しないでください。ベンダーサポートのライフタイムに注意してください。
  • 一般的なヒントとして、バグを最小限にしたい場合はすぐに新しいメジャーバージョンを採用しないでください。時間が経つにつれ、これらのリリースは微調整される傾向があり、マイナーバージョンの更新によってバグが修正されます。

フレームワークとライブラリ

frameworks /変更することで長期的なエンタープライズソフトウェアの安定性を確保する方法

「フレームワーク」は、ここでは潜在的な危険信号です。フレームワークとライブラリには違いがあります。特定のライブラリが実際にフレームワークであるかどうかについて、どこに線が引かれているかについてはある程度の議論がありますが、一般的な傾向があります。

ライブラリは、アプリケーションにいくつかの機能を追加する依存関係です。適切な慣行として、これらのインターフェースは抽象化することができ、抽象化する必要があります。これにより、コントラクト自体を変更する必要なく、あるライブラリを別のライブラリと交換できるようになります。

ただし、フレームワークは抽象化がはるかに困難です。多くの場合、これは、アプリケーションを(その一部として)構築するための基盤を提供するため、簡単に削除できないためです。

結局のところ、何かを実装するかどうかは、最小限の努力の問題です。最小限の時間で済むのは何ですか。依存関係を抽象化しますか、それとも、非抽象化された依存関係を変更するのにかかる余分な時間ですか(依存関係を変更する必要がある確率も考慮に入れます)。
これにより、作業時間を最小限に抑え、したがって開発コストを最小限に抑えるため、企業や利害関係者は常に最小労力のソリューションを優先します。

これは、フレームワークとライブラリの定義に対する私の見解です。

  • 依存関係の抽象化が、抽象化されていないときに依存関係を交換するのにかかる時間よりも少ない労力で済む場合、それはlibraryであり、抽象化する必要があります。
  • それを抽象化することは、非抽象化を扱うよりも多くの労力を要する場合、または抽象化することで、他の方法で使用していた機能の一部を失うことになる場合、それはフレームワークそして、それを試して抽象化することは意味がありません(なぜあなたはより多くの努力と/またはより少ない利益のルートを取るのですか?)

簡単な例として、.Netフレームワークを考えてみます(フレームワークでもコアでも、ここでは関係ありませんが、どちらもフレームワークです)。同時にuseしてコードベースに影響を与えることなく削除することはほとんど不可能です。

簡単に言えば、フレームワークは通常、より緊密な結合を必要とするため、そのフレームワークに対してビルドされたときに、そのフレームワークをコードベースからドロップすることが困難になります。これは一般に避けられないことです(フレームワーク開発者が合理的に可能な限り最善の方法でカップリングを最小化したと仮定した場合)。


バージョン管理

重大な変更によりコンポーネントBとCの互換性がなくなった場合はどうなりますか?

適切なライブラリ/フレームワークは、新しいバージョンがリリースされた場合でも特定のバージョンを利用可能にする必要があります。 BとCが過去に一緒に動作していたが、そのうちの1つが更新されてから壊れている場合は、その依存関係を、相互作用を壊さなかったバージョンに戻します。

うまくいけば、更新間の変更を壊すとメジャーバージョン番号がシフトしますが、マイナーバージョンの更新では壊すような変更は起こりません。しかし、それは依存関係のベンダーに大きく依存します。

BとCが相互に直接対話する必要がない場合は、BとCの最新バージョンが引き続き連携できるようにするカスタムの中間ロジックを記述できる場合がありますが、これはコスト/メリットの問題です。 B/Cの最新バージョンを用意する価値があるか


重大な変更

したがって、基本的に3年ごとにすべてを書き直さなくて済むようにするために、どのような戦略を採用する必要があるかを知りたいと思っています。

あなたは少し矛盾したスタンスを取っています。

  • 一方では、すべての依存関係について、新しくリリースされた更新に依存する必要があります。
  • ただし、その一方で、依存関係やコードがそれらとどのように相互作用するかについては何も変更しないようにする必要があります。

あなたは自分の優先順位がどこにあるかを決定する必要があるでしょう。

依存関係を更新しない場合(または、更新によってコードベースが破損した場合は、少なくとも更新を停止する場合)、同じ試行済みの真の依存関係で機能し続けるため、コードベースを変更する必要はありません。

依存関係を更新すると、重大な変更の可能性に対処する必要が生じやすくなります。これは、特にメジャーバージョンのリリースで、依存関係を更新することで避けられない結果です。

この依存関係がベンダーのサポートを伴う場合、特定のバージョンに固執することを決定した場合に備えて、サポートの存続期間を考慮する必要があります。他の唯一の解決策は、ベンダーに(現在は古い)バージョンを無期限にサポートさせることです。それはあなたの決定ではなく、彼らの決定です。


ベンダー

Oracleデータベースはかなり安定しており、下位互換性があります

oracleへの依存度の低下(コストが1つの要素-数百のEnterprise Editionデータベースと数千のStandard Editionをホストしています)

下位互換性は、特に長期間維持される場合、努力が必要です。これはコストが非常に大きい理由の1つであり、オラクルは多くの時間と労力を費やして、バージョン間の重大な変更を最小限に抑えながら製品を改善する方法を考え出します。

また、あらゆる点で同等またはより優れた代替手段(コスト、下位互換性、信頼性を含む)があった場合、Oracleは現在ほど多くの料金を請求しないことも考慮してください。

ライブラリ/フレームワーク開発者の観点からは、変更が重大な変更であるかどうかを気にすることなく、変更を実装する完全な自由を持っている方が簡単です。したがって、これらのベンダーは、労力とコストを最小限に抑えることができるため、一般的に安価です。ただし、これには、顧客としての明らかな欠点が伴います。(おそらく)より多くの重大な変更に対処する必要があるため、独自の開発作業により多くの費用がかかります。

格言が進むにつれ、ソフトウェアはすばやく、安く、堅牢に構築できますが、3つのうち2つしか選択できません。

2
Flater

通常、ソフトウェアの本には、クライアントが必要とするものではなく、クライアントが必要とするものを与えると書かれています。現実の世界では正反対です。あなたが非常に安定した古い学校のプラットフォームを持っているからといって、それがゴミのためであることを意味するのではありません。ビジネスモデルを中断することなく、新しい書き換えを非常に慎重に行う必要があります。

私は以下をお勧めします:以下に焦点を当てた計画を立てます:

  1. セキュリティ-新しいテクノロジーは、GDPRとHIPAAで優れたセキュリティとトレンドを提供しますか-箱から出してすぐにサポートが組み込まれているピックテクノロジー。

  2. 人件費-新しいテクノロジーを使用した、今後5年間の現在の開発者の採用または移行の平均コストはいくらか-広く適応され、地域や国を中心にコミュニティのトレンドが良好なテクノロジーを選ぶ

  3. 小さなプロトタイプを実行して、古いプラットフォームの非常に小さなチャンクをエクスポートし、ユーザーが新しいプラットフォームをどのように気に入っているかを調査します。
  4. 少なくとも5年間の変革の予算を設定し、投資が問題ないかどうか、またはいつ実施できるかを確認します。タイミングが最も重要です。会社全体のパフォーマンスと経済を監視し、競合他社を監視します。
  5. ストレステスト、負荷テスト、パフォーマンス、ユーザーエクスペリエンスなど、現在のシステムのベンチマークを確立します。クライアントが好むものと好まないものを面接します。
  6. 1人か2人の非常にチームから始めます。 3か月間機能させます。彼らが何を発見し、紙のデザインを実際の実装と比較して、アーキテクチャがどのようにやって来るかを見てください。たまに一人ずつチームに参加し始めますが、無理をしないでください。量は生産につながりません。
  7. 古いチームメンバーをオンラインコースに送り始めます。オンラインコースでは、急速にプッシュすることなく、新しいテクノロジーを学び始めます。これらの人々の一部は、新しいテクノロジーに適応するために時間を必要とします。
  8. チームが同じ操作を手動で実行した後にのみ、どこでも自動化を使用できます。

  9. プラットフォームの稼働後、または3回のメジャーリリース後にさらに3年間の計画を立てます。ライブになるかもしれないからといって、変化があることを人々は理解しなければならないので、それは非常に重要です。

  10. 古いコンポーネントをすべて削除するための予算があることを確認してください。そうしないと、2つのテクノロジーを長期間使用することになり、メンテナンスに非常に費用がかかります。

0
ivan