FacebookのFlowチームをサポートするエンジニアリングマネージャーのVladan Djeric氏は最近、Flowタイプチェッカーが単なる型付けされたJavaScriptを超えるもので、Facebookの内部ユーザーニーズをベースにした新機能を導入することを発表した。Flowでは、特に、Facebookなどの大規模で複雑なコードベースで高速かつ適切なタイプチェックを提供することに注力している。Flowのビジョンは、TypeScriptのビジョンとは対照的だ。TypeScriptは型のシンタックスを備えたJavaScriptである。
Vladan Djeric氏は、Flowの指針に対する変化を次のように説明した。
内部的には、JavaScriptを作成する開発者が数万人います。そして、数千万行のコードを含む1つのプロジェクトがあります。チームの優先事項は、Facebookの社内顧客のニーズです。 […] Flowを採用しやすくなるように、スケーラビリティを損なう(たとえば、グローバル推論に依存する[…])、そして型の安全性を損なう(型なしコードとany型を許可する)設計上の選択をしました。
現在、Facebookのコードベース内のほぼすべてのJSファイルでFlowが有効になっており、90%以上がより高いFlow Strict標準に至っている。コードベースの進化に伴い、Flowによるトレードオフが変わりました。 […]
Flowタイプの内部での多くの採用とコードベースの急速な成長は、スケーラビリティを注力する必要があることも意味します。
Flowチームは、大規模な状況におけるパフォーマンス向上、型安全性の向上、IDEエクスペリエンスの向上に明確にフォーカスするだろう。
1年前に導入されたFlowのTypes First アーキテクチャは、大規模なコードベースでの大幅なパフォーマンス改善を求めている。FlowのTypes Firstを使うと、コードの依存関係をチェックできなくなる。これにより、ソースファイルが変更されたときに実行される変更分のタイプチェックが高速化される。Flowチームは、次のコード依存関係を持つファイルf
の例を提供している。
(出典: Types-First:Flowのスケーラブルな新しいアーキテクチャ)
従来の型チェックモードでは、依存関係全体をチェックする必要がある。
(出典: Types-First:Flowのスケーラブルな新しいアーキテクチャ)
Flowのtypes-firstアノテーションを使うと、タイプチェッカーの作業が少なくなり、処理が速くなる。
Types-Firstは、今年の初め以来、現在Flowの唯一のモードだ。これは具体的には、Flowを使う開発者は、Flowの型推論に依存するのではなく、モジュールの境界の全てにアノテーションを付ける必要があることを意味する。追加の作業と引き換えに得られる利益はかなりある。
Facebookには数千万行のJavaScriptコードがある。全体として、コードベースにtypes-firstでロールアウトしたときに、再チェックについてp[パーセンタイル]90で最大6倍、p[パーセンタイル]99で最大2倍のスピードアップが見られました。types-firstで最大の改善が見られた再チェックの種類は、チェックされていない依存関係の再チェックです。これは、依存関係がチェックされていないファイルをユーザが開いたときに発生するチェックです。そこでは、次の改善が見られました。
平均:9.10秒 -> 1.37秒(-84.957%)
p50:1.95秒 -> 0.90秒(-53.763%)
p75:7.85秒 -> 1.95秒(-75.143%)
p90:22.5秒 -> 2.83秒(-87.456%)
p95:42.8秒 -> 3.42秒(-92.006%)
p99:107秒 -> 5.63秒(-94.730%)
Djeric氏は、FlowチームがFacebookの内部ユーザのニーズに対応するために、型アノテーションを超えた新しい言語機能と構文を導入すると述べた。 Flowはオープンソースのままとなるが、Flowは、Flowのドキュメントやライブラリ定義の改善など、Flowチームの優先順位に沿ったプルリクエストのみを受け入れる。Flowの優先順位と一致しないプルリクエストとGitHubの問題はクローズされる可能性がある。
Djeric氏は次の通り結論付けた。
この変更により、一部のプロジェクトでの使用にFlowが適さなくなる可能性があることは認識しています。しかし、みなさんがFlowを使い、型の安全性、非常に大規模なコードベースのスケーラビリティ、および強化されたIDEエクスペリエンスといったフォーカス領域に合致する場合には、みなさんのプロジェクトにとってFlowが依然として正しい選択となります。