エンビジョンより技術的な概要

エンビジョンのより技術的な概要


ホーム » コマース分析 » このページ

エンビジョンはコマース分析に合わせたドメイン固有言語です。構文はSQLとPythonを共有する点で類似している。Lokadは、ウェブ基盤の開発環境とウェブ基盤の実行環境を提供している。入力データはLokad内でホストされているフラットテキストファイルあるいはエクセルシートが表形式のファイルとして提供されることが期待される。エンビジョンスクリプトの出力は、ダッシュボード、そして潜在的にスクリプト内の計算から生じる一つまたはいくつかの表形式の出力ファイル。

ドメイン固有言語の発生

エンビジョンは、何百もの小売業者とLokadの長年の実務経験の結果です。Lokadは2008年に設立されたとき、それは技術ロードマップの一部ではありませんでした。新しいプログラミング言語を作成することが、主な関連作業であり、2008年から2013年の間に主流のプログラミング言語を使用していました。しかし、より多くの経験を積む中で、一意商取引に合わせた言語開発を支援し、はるかに高速な当店の別注クライアントの割り当てを行うことが可能であると気づきました。 2014の間に、Lokadはいくつかの社内のプロジェクトにエンビジョンを使用して、その "ドッグフーディング"プロセスを開始したときに、明らかに、一流のソフトウェア開発者でも、エンビジョン搭載の取り組みは、汎用プログラミング言語で実施代替取り組みを明らかに上回りました。エンビジョンは、C#/ Javaの/ Pythonの/ SQL/などより必ずしも優れているとは主張しません。しかし、一般的な場合には、商業で発見される非常に特殊なケースに - これらの言語は、優れています。しかし、ビジネスの生産性の頂点を表すものではありません。

よく設計された言語の特性

正直、エンタープライズ•プログラミング言語の大半は「ジャンク級」品質としての資格として、十分且つ最低限良い。エンビジョンを設計したときに、商業への譲渡禁止焦点だけによって制限し素晴らしい言語作ることにしました。 言語について:
  • ループなし、分岐なし (間違いなく、機能)
  • 型付けが強い
  • 関数呼び出しは副作用がありません
  • ネイティブコードのコンパイル
  • 特殊なアルゴリズムで非常に高速実行

開発環境について:
  • コードのカラーリングとコード自動完成
  • スマートコンパイラが意味深長なメッセージを与える
  • 過去の編集と実行の完全なバージョン管理
  • 入力データの文脈ブラウジング

コーディングスタイルの面では、エンビジョンはパイソンのきわめて簡潔な構文の影響を受け、同様に若干の良い考えをC#のような他の言語から適用しました。

SQL対エンビジョン

SQLとエンビジョンの両方がデータ親和性を非常に共有します。しかし、SQLはACID(原子性、一貫性、独立性、耐久性)特性を重視し、トランザクションデータモデルの照会に焦点を当てたが、エンビジョンはただフラット表形式ファイルのセットを照会する。実際、コマースの最適化の課題に関する限り、昨日までのデータだけを必要とし、リアルタイムのデータを必要としない。このデータは、過去と不変。その結果、READ以外、支持するINSERT、UPDATEまたはDELETEのような物事がないので、そのようなファイルがリレーショナルテーブルよりも桁違いに速く(1)処理することができる。

エンビジョンでは、SQLで見つかるSELECT文と非常によく似ている文でテーブルを表示することが可能。

show table "Product List" with Id, Name, Supplier


経験豊富なSQL開発者は、おそらくすぐにこの文はSELECTの後に見つかるFROM 句が欠けていることに通常は気づくだろう。商業では、ほぼすべてのデータはかなりの製品に関する(またはSKU)を解決されることを観察し、そしてほぼすべての過去のデータはまた、製品に取り付けられたイベントとして記述することができる。このように、同じパターンを延々と繰り返してあらゆる所にJOINを書く代わりに、エンビジョンは「自然の」JOINを特徴とする。たとえば、次のスクリプトは、明示的にJOINがなく、販売実績に基づいて、トップの売り手のリストを生成する方法を示す。

LastYearQty = sum(Orders.Quantity) when date > end - 365
show table "Top Sellers" with Id, Name, LastYearQty order by LastYearQty desc

また、商業において、定期的な予定表の集計は非常に頻繁であることを見出しました。管理者は、日、週、月ごとにその数を持つ必要がある。それは基本的な必要性があるが、SQLは、毎週線グラフのような単純なものを表示することが非常に困難で、これはエンビジョンでわずか2本の線“だけ”で書くことができる。

Week.quantity := sum(Orders.Quantity)
show linechart "Weekly quantities sold" with Week.quantity

最後に、SQLに関するツーリングは、一度に一つのクエリのメンタルモデルを強調している。しかし、良いダッシュボードは、典型的に生産性を向上させるため、特定のビジネス指標の組み合わせを特に必要とするという結論に達しました。対照的に、エンビジョンスクリプトは一度、複雑なダッシュボードを作成する直接の意図が付属している。

(1)フラットファイルのみを扱うときに得られるものと同様のパフォーマンスのレベルを確実に達成するために、SQLデータベースを微調整するのが可能です。しかし、関係する努力がほぼいつも完全に利益を得ることがわかりました。それがSQLデータベース導入の第一の理由です。

エンビジョン対エクセル

エンビジョンは、プログラミング言語であるが、エクセルのアドバンスドユーザーもアクセスすることを意図している。エクセルを軽視していません:何十年もの平板状シートを凌ぐのは難しいです。そして、データ科学者と開発者のチームであること、我々は結局しばしばエクセルを使用することになる。たとえば一連の実験のために速く結果を強化するためです。

エクセルが優れた領域の1つは、全ての列またはコラムの上に速く活動を行う能力ことで、カット・アンド・ペーストの能力に動かされたベクトル-計算です。ベクトル計算は非常に役に立つが、しかし、カット・アンド・ペーストロジックほどではない。仮に過去の取引に基づいて、昨年の中央値は製品の価格を計算したい場合、これはエンビジョンを使用して、数行で書くことができる。

Orders.UnitPrice = Orders.NetAmount / Orders.Quantity
UnitPrice = mode(Orders.UnitPrice) when date > end - 365
show table "Median Price" with median(UnitPrice)

最初の行は、Ordersテーブル内のUnitPriceという名前の新しい列を導入するベクトル計算と同じです。そして、2行目は、mode(最も頻繁な観察値)が各製品について計算されるベクトル計算である。エクセルと同様に,非常に直接的です。エンビジョンで中間計算を導入し、その後それらを構成します。

エンビジョンは、エクセルの合成シートのようにダッシュボードの小型化にも非情に重点を置いています。エンビジョンの各show文は、ダッシュボード内に表示されるようにタイルを定義し、これらのタイルは、エクセルのようなグリッド次整列しています。
show label "Hello World" a1d1 tomato
show table "Product Lines" a2b2 royalblue with sum(1)
show table "Order Lines" c2b2 darkorange with sum(Orders.1)

上記のスクリプトは、行の列と番号の文字を使用したExcelの慣習に沿ったものでA1:D1、A2:B2、とC2:D2それぞれに配置されている3のタイルを定義します。

ループなし、分岐なしなど

エンビジョンは、きちんとした機能の構文を提供している。ループ、分岐またはヌルがない、思うかもしれないですが、エンビジョンはチューリング完全言語ではありません。実際には、これらの機能は省略されていません。その代わりに、エンビジョンは、単純に同じ結果を得ることが、はるかに少ない手間で組み込みの構築物を提供できます。エンビジョンでのこのような特徴を持っていることで、困難なデバッグの問題の全体のクラスを削除できるだけでなく、非常に生産性も向上させます。

今年の週ごとの上位10製品の合計販売量をプロット思考してみて、その後これらの毎週の合計を同じトップ10点の1年前の合計と比較しましょう。これは、以下のいくつかの行を用いて達成することができる。

Volume = sum(Orders.Amount) when date > end - 365
Week.amt := sum(Orders.Amount) where rank(Volume) <= 10
show linechart "Top 10. This Year vs Last Year." a1f3 tomato with \
  Week.amt as "Sold this year{$}", \
  Week.amt[-52] as "Sold last year{$}"

また、エンビジョンは、高速、非常に高速。多くのドメイン固有のアルゴリズム(2)を活用することができただけでなく、また、エンビジョンスクリプトの(ほぼ)すべての単一の計算ノードをキャッシュすることもできました。その結果、わずかに変更されたスクリプトが再実行されるとき、変更された計算グラフのノードのみが再計算されます。実際、5秒以内の20ギガバイトのデータ処理を感じて味わった後は、鈍いSQLクエリに戻りたくないでしょう。

(2)通常以上のクイックソートよりも性能が500倍優れているバケットソートアルゴリズムを持つ。確実に、O(n.log(N))で分類アルゴリズムの理論限界最適にもかかわらず、状況が良好であれば500倍で分類アルゴリズムを高速化することが可能です(例:日付の分類)。商業では、状況が頻繁なのでこの点で非常に有利です。

FORMATTER ERROR (Transcluded inexistent page or this same page)