将来的フラグを使用した段階的な機能採用

ソフトウェア開発における私たちの取り組みでは、メジャーリリースに以下の目標を達成することを目指しています。

  1. 段階的な機能採用: 開発者は、現在のメジャーバージョンで利用可能になったときに、新しい機能と変更を1つずつ選択して統合することができます。これは、すべての変更を1つの新しいメジャーリリースにバンドルするという従来の方法からの脱却です。
  2. シームレスなバージョンアップグレード: 開発者は、事前に新しい機能を選択的に取り込むことで、既存のアプリケーションコードを変更する必要なく、新しいメジャーバージョンにスムーズに移行できます。

不安定なAPIと将来のフラグ

私たちは、unstable_someFeatureのような将来のフラグを使用して、現在のリリースに新しい機能を導入しています。これらのフラグは、Remix Vite Pluginの future オプションで、vite.config.ts ファイルで指定できます。

vite.config.ts
import { vitePlugin as remix } from "@remix-run/dev";
import { defineConfig } from "vite";
 
export default defineConfig({
  plugins: [
    remix({
      future: {
        unstable_someFeature: true,
      },
    }),
  ],
});

まだViteを使用していない場合は、remix.config.jsfuture オプションで将来のフラグを提供できます

  • 不安定な機能が安定状態に達したら、特別なプレフィックスを削除し、次のマイナーリリースに機能を含めます。この時点で、APIの構造は、その後のマイナーリリースを通じて一貫性を保ちます。

  • このアプローチにより、初期導入者と協力してAPIを洗練し、すべてのユーザーに影響を与えることなく、不安定なフェーズで必要な変更を取り入れることができます。その後、安定したリリースは、これらの改善から中断なく恩恵を受けることができます。

  • unstable_* フラグでラベル付けされた機能を使用している場合は、各マイナーリリースのリリースノートを確認することが重要です。これは、これらの機能の動作または構造が進化する可能性があるためです。このフェーズでのあなたのフィードバックは、最終リリース前に機能を強化するために非常に役立ちます!

将来のフラグを使用した破壊的変更の管理

破壊的な変更を導入する場合、現在のメジャーバージョンのコンテキストで行い、将来のフラグで隠します。たとえば、v2にいる場合、破壊的な変更は v3_somethingDifferent という将来のフラグの下に配置される可能性があります。

vite.config.ts
import { vitePlugin as remix } from "@remix-run/dev";
import { defineConfig } from "vite";
 
export default defineConfig({
  plugins: [
    remix({
      future: {
        v3_someFeature: true,
      },
    }),
  ],
});
  • 既存の v2 の動作と新しい v3_somethingDifferent の動作は同時に共存します。
  • アプリケーションは、次のメジャーリリースですべての変更に一度に調整するのではなく、一度に1つのステップで段階的に変更を採用できます。
  • すべての v3_* 将来のフラグが有効になっている場合、v3 への移行は、理想的にはコードベースへの変更を必要としません。
  • 初期には破壊的な変更をもたらす将来のフラグの一部は、unstable_* フラグとして開始されます。これらは、マイナーリリース中に修正される可能性があります。v3_* 将来のフラグになると、対応する API は設定され、それ以上変更されません。

まとめ

私たちの開発戦略は、メジャーリリースの段階的な機能採用とシームレスなバージョンアップグレードに焦点を当てています。これにより、開発者は新しい機能を選択的に統合し、バージョン移行中に大規模なコード調整を行う必要がなくなります。 unstable_* フラグを通じて機能を導入することで、初期導入者と協力して API を洗練し、安定したリリースが強化から恩恵を受けるようにします。 v3_* フラグを使用した破壊的な変更の慎重な管理を通じて、変更を段階的に採用する柔軟性を提供し、メジャーバージョン間のスムーズな移行を促進します。これは、Remix フレームワークの開発を複雑にする一方で、この開発者中心のアプローチは、Remix を使用したアプリケーション開発を大幅に簡素化し、最終的にソフトウェア品質と(願わくは!)開発者の満足度を高めます。