Back home

古いシステムを最新化するには、まず互換性ラダーが必要です

Copilot の本当に便利な部分は、環境、入り口、テスト、境界をレイヤーごとに抽出することです。

最初に古いシステムを最新化し、互換性ラダーを構築します

20 年前の Java プロジェクトを初めて開いたとき、最初に目にしたのはコードの匂いではなく、古い匂いでした。 build.xml はまだ存在しますが、pom.xml は存在しません。ディレクトリ構造も古いし、テストの入り口も古いし、「実行可能な製品を再構築できるかどうか」さえ再確認する必要があります。この段階で最もよくある間違いは、クラスとメソッドに焦点を当て、モダナイゼーションを実際に妨げているのは環境と入り口であることを無視することです。

古いシステムを最新化するときに最初に行うことは、互換性ラダーを構築することです。はしごの根元には、通常、古いシステムを古いルール内で安定して実行できるようにするため、できればタイムカプセルとして機能させるための機能が 1 つだけあります。 Docker、古い JDK、古いビルド ツール、古いテスト コマンド、これらは粗雑に見えますが、非常に効果的です。このベースが正しくない限り、その後のすべての変更には新たなノイズが混入します。コードが壊れているのか、JVM、イメージ、アーキテクチャ、プラグインが壊れているのかを判断することは不可能です。

次に、橋を選択する番になりました。ブリッジの目標は非常に具体的です。一方の端は古いソース コードに接続され、もう一方の端は新しいマシンに接続されます。このプロジェクトは最終的に Java 8 と Gradle 7.6 に落ちましたが、これらは両端の制約に固執するだけでした。Java 17 は Java 1.5 のソース コードをコンパイルしようとしなくなり、Java 6 は ARM64 のネイティブ環境で実行できなくなりました。橋渡しが間違っていると、最新化がツールチェーンで行き詰まってしまいます。橋渡しが適切であれば、その後の移行は段階的に進めることができます。

ここで最も便利なのは、大きなモデルに整理と変換を行わせることです。これは、Ant ロジックを Gradle に変換し、ディレクトリを古いレイアウトにマップして戻し、反復的で機械的な構成を削除するのに役立ちます。たとえば、ソース コード ディレクトリを古いパスに明示的に指定し、古い main() テストを実行するカスタム タスクを追加します。

java {
    sourceCompatibility = JavaVersion.VERSION_1_5
    targetCompatibility = JavaVersion.VERSION_1_5
}
sourceSets {
    main {
        java {
            srcDirs = ['java']
        }
    }
}
tasks.register('runLegacyTest', JavaExec) {
    mainClass.set(project.findProperty('mainClass'))
    classpath = sourceSets.main.runtimeClasspath
}

この構成の重要性は、古い世界のルールを明確にすることです。古いプロジェクトで最も問題となるのは、多くの場合、能力の欠如ではなく、その能力が習慣の中に隠れていることです。テストは main() エントリを通じて実行され、ソース コードは古いディレクトリに配置され、ビルドは Ant 時代のパスを想定して書かれます。 Copilot はここで時間を節約できますが、節約できるのは判断時間ではなく、翻訳時間です。

判定時間を外部委託することはできません。 Gradle 8 はより新しく見え、Java 17 はより現代的に見え、直接ジャンプすることもよりきれいに見えますが、これらのオプションは古いソース コードと古いテストの制約を同時に満たさない可能性があります。モダナイゼーションにおける最大の懸念は、ツールのアップグレードを進行状況とみなして、コマンドの実行をシステムの理解とみなしてしまうことです。プロジェクトが運用ベースラインを達成していない限り、グリーン テストは勝利とはみなされず、当面は露出した表面に到達しなかったとのみみなされます。

私がより信頼しているアプローチは、まず問題を 4 つのレベル (実行できるかどうか、編集できるかどうか、テストできるかどうか、および変更できるかどうか) に分類することです。最初のレベルはシーンを再現すること、第 2 レベルはブリッジを決定すること、第 3 レベルは古いテストで保存されたものを決定すること、そして第 4 レベルは実際のリファクタリングです。 Copilot は、最初の 2 つのレベルで特に役立ちます。これは、ログやディレクトリ構造を追跡する物理的な作業や、断片化された手がかりを読みやすいマップにつなぎ合わせるのに適しています。 4 番目のレベルでは、モデルは移動とプロンプトのみを担当する必要があり、人々は決定を下すために人々に依存する必要があります。

古いシステムを最新化することの最も価値のある結果は、「機能するはずのもの」の束を「実際に機能し、なぜ機能するのかがわかっているもの」に変えることです。この互換性のはしごが確立されると、その後の解体にはリズムがあり、変更には境界が設けられます。副操縦士は、この時点では最前線にいる助手のようなもので、懐中電灯を持って年齢、入国状況、依存関係を確認します。本当に方向性を決めるのは旧体制の歴史の判断だ。

FAQ

What to read next

Related

Continue reading