(本投稿は米国時間2021年3月2日付の ブログ投稿 の日本語抄訳です。内容に齟齬がある場合、原文を正とさせていただきます。)
Microsoft Power Fx は、Microsoft Power Platform のロジックを表現するためのロー コード言語です。現在の Microsoft Power Apps のキャンバス アプリの中核を成している言語と同じ言語であり、Microsoft Excel から着想を得ています。"ノー コード" と "プロ コード" の断絶を埋め、あらゆる開発を可能にすることで、さまざまなチームの共同作業を実現し、時間と費用を削減します。私たちはこのような言語を Power Platform 全体に提供し、オープン ソースとしてすべての人と共有できることをとても嬉しく思っています。そして、強固なユーザー コミュニティの助けがなければ、言語が成長、繁栄することはないでしょう。
本日の発表は、今後の方向性を示すものです。土台である Power Apps から Power Fx を抽出するために、まだやるべき仕事がたくさんあります。現在は、Power Fx を Microsoft Power Virtual Agents、Microsoft Dataverse、モデル駆動型の Power Apps に統合する作業を精力的に進めています。これらはオープン ソース共有に適したパッケージを用意するためのテスト環境として利用する予定です。オープン ソースの GitHub リポジトリを https://github.com/microsoft/Power-Fx (英語) に用意しました。こちらから Power Fx についてご意見をお聞かせください。提供しているものはまだあまり多くありませんが、現時点ではいくつか初期ドキュメント (英語) を公開しています。ここでも、Power Apps から Power Fx を抽出している過程であることを説明しています。
"Microsoft Power Platform 全てに” と聞くと、Power BI の既存の M 言語や DAX 言語と何か関係があるのではないかと思うかもしれません。答えはノーです。Power Fx は、これらの言語を補完するものであり、なんら影響を与えるものではなく、3 つすべてが共存していくことになります。M と DAX は、大量のデータの読み取り、シェイプ、結合、集計に重点を置いているのに対し、Power Fx は、小規模なリレーショナル データのセットの読み取りと書き込みに重点を置いています。
Excel からの着想
スプレッドシートと同じように、アプリを簡単に作れないだろうか?
今あるスプレッドシートの知識を活かせないだろうか?
これらの疑問が、Power Apps と Power Fx が生まれたきっかけでした。毎日、何億人ものユーザーが Excel を使用してスプレッドシートを作成しています。そこで、ユーザーが既に知っている Excel の概念を活かして、簡単にアプリを作れるようにしたらどうかと考えたのです。
Excel のデータ型、演算子、コア関数の表現言語は、非常に簡単に再現できます。下の表は、Power Fx の純粋な関数をすべて示したものです。緑でマークされているものは、Excel の関数と同じか、非常に近いものです。
Excel にはこの他にも多くの関数があり、Power Fx にも関数を続々と追加しているところです。また、また、Excel チームが次に追加しようとしている関数を知り、彼らの方向性に沿った関数を私たちがどのように追加できるかについて、Excel チームと話し合いをしています。
ところで、Excel では、式を記述するだけではなく、数式、つまり特定のセルの値を計算する方法を記述します。A1 = B2 * 2 は、A1 の値を常に定義する計算式であり、B2 が変化すると自動的に再計算されます。
Power Fx はこれと同じ数式のパターンに従っています。ただし、セルの代わりに、コントロールまたはオブジェクトのプロパティを使用します。例を見てみましょう。これは Stack Overflow にある逆文字列検索用の Excel 数式 (英語) です。
これをもとに、Power Fx の数式を作成しました。セルへの参照をコントロール プロパティへの参照に変えただけです。
アニメーションを見てください。同じ構文と関数が Power Fx で動作すること以外にも、注目すべき点があります。Input.Text (上のボックス) が変更されると、Label.Text (下のボックス) が自動的に再計算されます。このアプリはスプレッドシートのように動作し、再計算を実行しています。
もう 1 つ例を紹介しましょう。この例では、画面の塗りつぶしの色に数式を使用しています。赤、緑、青をコントロールするスライダーを変更すると、再計算されて、背景色が自動的に変化します。
他の言語でよく見られる OnChange イベントは、このスライダー コントロールには使用されていません。また、Fill プロパティの値を明示的に設定する方法もありません。この方式には、1 か所で数式を管理できるという大きなメリットがあります。色の動作が正しくない場合、この 1 つの数式を見るだけで、その原因を把握できます。アプリを検索し、コードの中で意図しないタイミングでプロパティを設定している問題箇所を探す必要はありません。実は、このアプリに時間的な要素はなく、正しい数式の値が常に維持されます。
このアニメーションには、他にも注目すべき点があります。スライダーを暗い色に設定すると、"Red"、"Green"、"Blue" のラベルの色が補正のために白に変化します。これは、各ラベル コントロールの Color プロパティのシンプルな数式によって実現されています。
このアプリの優れた点は、ラベルの計算と塗りつぶしの色の計算が切り離されていることです。この 2 つはまったく異なる計算です。通常、Power Fx のロジックでは、単一の巨大なプロシージャではなく、数多くの独立した小さな数式を使用します。その方がわかりやすく、既存のロジックを乱すことなく拡張が可能になります。
Power Fx は Excel と同じく宣言型言語です。開発者はどのような動作が必要かを定義しますが、それをいつ、どのように行うかを決定して最適化するのはシステムです。これを可能にするために、ほとんどの処理は副作用を生まない純粋な関数で行われます。そのため、Power Fx は、Excel と同様に関数型言語でもあります。
今は命令的でステップバイステップのロジックが求められる時代になりましたが、Power Fx はこれにも対応しています。ボタンを押すだけで、データベースに変更を書き戻したり、自動化を開始したりできます。一方、スプレッドシートでは、このようなことは実行できません。先ほど述べたメリットや Excel との一貫性を考慮して、私たちは可能な限り宣言的アプローチを採用しています。
ロー コード
Power Fx では、ビジネス ロジックを簡潔かつパワフルな数式で記述します。ほとんどのロジックは、表現力と制御能力を十分に備えた 1 行のコードに短縮できるため、複雑なニーズにも対応できます。目標は、開発者が理解しなければならない概念の数を最小限に抑えることです。Excel ユーザーが今持つ知識だけで記述できることが理想です。
たとえば、ある注文を担当する従業員の名前を検索する場合、下のように Power Fx を記述します。この例では、Excel にない概念は、データ構造を掘り下げるための表記法である "." しか使用されていません。.Employee.'First Name' がそれです。このアニメーションでは、Power Fx の数式の各部分と、同様の処理を JavaScript で記述する場合に明示的にコーディングする必要がある概念との対応関係を示しています。
Power Fx のさまざまなしくみや、宣言的な数式がもたらす最適化の自由度について、さらに詳しく見てみましょう。
- 非同期処理: Power Fx のデータ処理は、すべて非同期処理です。開発者はこの処理方式を指定する必要はありませんし、呼び出しが終わった後に同期する必要もありません。最も重要なのは、開発者がこの概念を意識する必要も、Promise や Lambda 関数について知る必要もないことです。
- ローカルとリモート: Power Fx では、データベースやサービス内のローカル インメモリ データとリモート データに対して、同じ構文と関数を使用します。ユーザーはこの区別について考える必要はありません。フィルターや並べ替えを効率的に処理するために、Power Fx によって処理が自動的にサーバーに委任されます。
- リレーショナル データ: 注文と顧客は 2 つのテーブルに分かれており、多対 1 のリレーションシップで関連付けられています。OData のクエリだと、"$expand" と外部キーの知識が必要です。これは SQL の JOIN に似ています。上記の数式には、そのようなものは一切ありません。アプリ作成者は、データベース キーの概念を知っている必要はありません。開発者はシンプルなドット表記法を使用して、レコードからリレーションシップのグラフ全体にアクセスできます。
- 射影: クエリを記述するとき、多くの開発者は、データのすべての列を取り出すために "SELECT * FROM..." を記述します。Power Fx は、数式のすべての依存関係を含め、アプリ全体で使用されるすべての列を分析します。射影は自動的に最適化されるため、開発者がその用語の意味を知る必要はありません。
- 必要なデータだけを取得: 上の例では、LookUp 関数は 1 つのレコードだけを検索します。取得されるデータはそれがすべてです。Filter 関数を使用してさらに多くのレコードを要求した場合、何千件ものレコードが対象となる可能性がありますが、一度に取得されるのは、1 ページ分の 100 レコード程度のデータだけです。さらにデータを表示するには、ユーザーがギャラリーやデータ テーブルを操作する必要があります。その際、データは自動的に取得されます。開発者は、大規模なデータセットについて考える際に、データ リクエストを適当な分量に制限することを考えずに済みます。
- 必要なときにだけ実行: 上の例では、ラベル コントロールの Text プロパティの数式を定義しています。変数 Selected が変更されると、LookUp が自動的に再計算され、ラベルが更新されます。開発者は、選択箇所の OnChange ハンドラーを記述する必要はありませんが、このラベルが選択箇所に依存していることは知っておく必要があります。これは先ほど説明したように、宣言型プログラミングです。開発者が指定するのは、ラベルをいつ、どのように取得するかではなく、ラベルにどのようなデータを入力するかです。画面が非表示であるためにこのラベルが表示されていない場合や、Visible プロパティが false である場合は、ラベルが表示されるまでこの計算を延期することができます。ラベルがほとんど表示されない場合は、この計算を省略しても問題は生じません。
- Excel の構文の変換: Excel は何億人ものユーザーが利用しており、ほとんどのユーザーが文字列の連結に "&" を使用することを知っています。JavaScript では "+" を使用し、他の言語では "." を使用します。私たちは、開発者が置かれている状況を考慮し、既存の知識を活用したいと考えています。
- 表示名とローカライゼーション: Power Fx の数式では 'First Name' が使用されていますが、それに対応する JavaScript では nwind_firstname が使用されています。Dataverse や SharePoint のフィールドやテーブルには、一意の論理名の他に表示名があります。上の例のように、多くの場合、表示名の方がはるかにユーザー フレンドリーです。ただし、表示名にはもう 1 つ、ローカライズが可能であるという重要な特性があります。多言語のチームがある場合、各チーム メンバーが自分の言語でテーブル名やフィールド名を見ることができます。どのような場合でも、Power Fx では必ず正しい論理名が自動的にデータベースに送信されます。
常にライブ状態
シチズン デベロッパーにとって重要な Excel の特徴として、即時フィードバックがあります。よく考えてみると、Excel には編集モードもコンパイル ステップも実行状態もありません。思いも寄らなかったことかもしれませんが、スプレッドシートを読み込み、数式や値を自由に編集して答えを得られるというのは、大きな利点です。Excel を開いている間、スプレッドシートは常にライブ状態であり、編集と実行の間に区別はありません。値や数式の変更はスプレッドシート全体に即座に反映され、開発者は正しい答えをすばやく確認できます。Excel が検出したエラーはすぐに表示され、スプレッドシートの他の部分の妨げになることはありません。
Power Fx でも、このようなライブ エクスペリエンスを目指しています。Power Fx には、アプリの実行中に状態に影響を与えることなく数式を更新するインクリメンタル コンパイラが組み込まれています。下のアニメーションでは、ラベル コントロール下のラベルに 2 つのエラーが表示されているにもかかわらず、スライダー コントロールの位置に応じてラベル コントロールに注文番号が表示されています。アプリは問題なくインタラクティブに動作しています。最初に .InvalidName で Employee の数式を修正しようとしたときには、すぐに赤い波線が表示され、エラーが正しく表示されますが、アプリは動作し続けています。
.Employee を入力したときはどうなっているでしょうか? この編集により、[Data] ペインに Employees テーブルが追加されます。そしてこのテーブルのメタデータが取得され、フィールドのサジェストが即座に表示されます。ここでは、あるテーブルから別のテーブルへの関係が確立され、アプリの参照に対して必要な調整が行われているのです。.Customer を追加したときも、同じことが起こっています。
それぞれを編集した後も、スライダーの値はそのまま維持され、変数の値も保持されています。その間、注文番号は一番上のラベルに表示され続けています。このアプリは、実際のデータを処理しながら、常にライブで動作しています。このアプリは Excel のように保存して閉じることができ、他のユーザーは開いて使用することができます。ビルド ステップもコンパイルもありません。あるのはどのバージョンのアプリをユーザーに提供するかを決定する公開 ステップだけです。
ノー コード
ユーザーは Power Fx の読み方や書き方を知らなくても、ロジックの表現を始めることができます。シンプルなスイッチや UI ビルダーで表現できるカスタマイズやロジックが数多く用意されています。私たちは、一歩進んだ詳細な制御も行えるように、Power Fx を読み書きできる、このような "ノー コード" ツールを開発しました。一方で、"ノー コード" ツールでは、Power Fx が持つすべての表現力を十分に提供できないことも認識しています。"ノー コード" ビルダーと一緒に使用する場合でも、Power Apps では意図的に数式バーを中心に配置し、どのような処理が実行されているかを開発者に伝えることで、Power Fx を学べるようにしています。
いくつかの例を見てみましょう。Power Apps のプロパティ パネルには、コントロールのプロパティ用の "ノー コード" のスイッチやノブがあります。実際には、ほとんどのプロパティ値が静的な値です。カラー ビルダーを使用してギャラリーの背景色を変更すると、ご覧のように、数式バーでこの変更が反映され、数式が別の RGBA 呼び出しに更新されます。開発者はいつでも数式バーに移動し、さらに一歩進んだ調整を行うことができます。この例では、ColorFade を使用して色を調整しています。色のプロパティはこのときもプロパティ パネルに表示されますが、マウス ポインターを合わせると fx と表示され、開発者は数式バーに誘導されます。数式バーは相互的に動作します。ColorFade 呼び出しを削除すると、プロパティ パネルで認識できる色に戻り、再びプロパティ パネルを使用して色を設定できるようになります。
さらに複雑な例を紹介しましょう。ギャラリーに Dataverse から取得した従業員のリストが表示されています。Dataverse はテーブル データのビューを提供します。いずれかのビューを選択すると、数式が Filter 関数とビュー名を使用するように変更されます。2 つのドロップダウンを使用することで、数式バーを操作することなく、正しいテーブルとビューを選択できます。しかし、この例では、もう一歩進んで並べ替えを追加しています。これは数式バーで行うことができます。ここでもプロパティ パネルには fx アイコンが表示され、数式バーで変更するように誘導されます。また、数式をプロパティ パネルが認識できるように単純化すれば、再びプロパティ パネルを使用できるようになります。
以上、簡単な例を紹介しました。Power Fx は、ノー コードのインタラクションを記述するのに最適な言語だと私たちは考えています。簡潔かつパワフルで解析が簡単であり、ロー コードとの断絶解消に必要とされる高度な制御能力も備えています。
プロ コード
シチズン デベロッパーとは真逆のタイプのユーザーも、同様に重要な存在です。ロー コード開発者が構築したアプリは、ときにエキスパートのサポートが必要だったり、プロ開発者にメンテナンスや機能強化を引き継いでもらう必要があることがあります。また、プロ開発者も、ロー コード ツールを使うことで、プロ向けのツールを使うよりも容易かつ迅速に低コストで開発できることを認識しています。どんな状況にも Visual Studio のフル パワーが必要だというわけではありません。
プロ開発者は、生産性を最大限に高める目的でプロ向けのツールを使用します。そこで私たちは、Visual Studio Code や Visual Studio で編集可能な構成部分にキャンバス アプリを展開できる言語ツール (英語) を 1 月に導入しました。
また、Power Fx を GitHub や Azure DevOps でソース管理下に置くことができるようにしました。
Power Fx は、共有や再利用に適した数式ベースのコンポーネントをサポートしています。数週間前には、コンポーネント プロパティのパラメーター (英語) のサポートを発表しました。これにより、純粋なユーザー定義関数の作成が可能になりました。
また、Power Fx は、プロの開発者が作成したコンポーネントやサービスとの連携にも優れています。標準のコネクタを使用して、数百のデータ ソースや Web サービスにアクセスしたり、カスタム コネクタを使用して、Power Fx と REST Web サービス間の通信を可能にしたり、コード コンポーネントを使用して、画面やページ上で Power Fx とフル カスタムの JavaScript 間でやり取りさせたりすることができます。
言語の進化
プログラミング言語を進化させることは、必要なことであると同時に注意を要することでもあります。善意によるものであっても、言語に変更が加えられると、既存のコードが動作しなくなったり、新しいパターンを学ぶ必要が生じたりするかもしれないと心配に思うでしょう。それは当然のことです。Power Fx チームは下位互換性を重視していますが、一方で最初から完全なものができることはないという確信も持っており、コミュニティとして何が最善なのかを一緒に模索していきたいと考えています。言語には進化が欠かせません。Power Fx は初めから進化を前提に設計されています。
保存されるすべての Power Fx ドキュメントには、言語のバージョン スタンプが添付されます。互換性のない変更を行う場合には、次回の編集時に自動的に数式を書き換える "下位互換性コンバーター" と呼んでいるものを用意しています。また、ユーザーの学習が必要となる大きな変更の場合は、ドキュメントへのリンクを含むメッセージを表示します。このような機能を使用すれば、数年前の Power Apps プレビュー版で構築したアプリを、それ以降に導入されたすべての変更の影響を受けずに、読み込むことができます。
例を挙げましょう。2018 年に、私たちは赤い背景のエラー バナーを表示する ShowError 関数を導入しました。2018 年時点のバナーの表示は次のようなものでした。
これはユーザーには好評でしたが、成功バナー (緑の背景) や情報バナー (青の背景) を表示する方法を求める声も出てきました。そこで、通知の種類を第 2 引数として指定できる、より汎用的な Notify 関数を考案しました。Notify を追加して ShowError をそのまま残すこともできましたが、そうせずに、ShowError を Notify に置き換えました。つまり、既に運用されている関数を削除し、別の関数を導入したのです。なぜでしょうか? それは、同じことをするのに 2 つの方法があったら、特に新しいユーザーの混乱を招き、何より複雑になってしまうからです。ユーザーの再教育は多少必要になりましたが、不満を訴えるユーザーはおらず、だれもがこの変更を評価しました。そして、次に私たちが追加した Notify の機能、タイムアウト コントロールに移行しました。現在のすべてのユーザーと将来の多くのユーザーのために、皆さんと一緒に正解を見つけていきたいと考えています。
次の画像は、先ほどのアプリを現在の Power Apps に読み込んだときのようすです。この変換を実行するのに、ユーザーは何もする必要はありません。開いたときに自動的に実行されます。
これが可能なのは、現在の Power Apps がクローズド システムであるからです。ただし、今後、多くのコンテキストやソース コード処理方法に向けて Power Apps を開放していく中で、この機能を維持することが課題になると考えています。
今後の計画
私たちにはやるべき仕事がたくさんあります。計画の発表と Power Fx の紹介は終わりました。次に必要なのは、Power Apps キャンバスから言語とドキュメントを抽出し、他のコンテキストで利用できるように一般化することで、今はそれに取り組んでいます。先ほどもお伝えしましたが、私たちのオープン ソースのホームは https://github.com/microsoft/Power-Fx (英語) です。動きがありしだい、GitHub サイト、カンファレンス、ウェビナー、そしてこのブログで、進捗状況やデモを共有していきます。
ここでご紹介したことは Power Fx の概要に過ぎません。他にも多くの情報が提供されています。詳細については、公開したばかりの Power Fx のドキュメント (英語) や既存の Power Apps のドキュメントをご覧ください。また、Power Apps キャンバスの無料トライアルで今すぐに Power Fx を試すこともできます。
さらに、言語の機能強化もリリースしていく予定です。名前付き数式、ユーザー定義関数と Excel 関数の追加、データ型の追加、完了エラー処理、動的スキーマ、App.OnStart の代替となる宣言など、多数の開発予定の機能があります。その他にも多くの機能を予定しています。
オープン ソースは、皆様の知恵をお借りしながら、イノベーションの道のりを進んでいくことを目的としています。重要なのは、コミュニティを作り、皆様のフィードバック、問題、アイデアについて、自由な発想で話し合うことです。それは、今すぐにでも始めることができます。Power Fx はあらゆる人のためのロー コード言語です。使用することのほかに、ぜひその進化にもご参加ください。
*This post is locked for comments