ソフトウェアの複雑さを「意図指向プログラミング」で管理する

【編集部注】著者のUri SaridはMuleSoftのCTOである。(この著者による他の記事:The last thing the API economy needs is copyright friction

ソフトウェアの魔法は失われつつある。私たちが単に現在のアプローチから多くを望みすぎているのだ。結果として、ソフトウェア開発者たちは複雑さとの戦いに敗れつつある。そしてそれはしばしば自覚されていない。しばしば、小さな失敗が他の小さな失敗の上に積み重なり、消費者の生活だけでなくビジネスシーンも、簡単になるというよりも不満が募るものとなる。

たとえば、Appleの製品はバギーなものになりつつあり、旅行は今だに悪夢であり、コールセンターでの経験は、私たちに人工知能と人間知能の両方を疑わせるものになっている。

魔法をソフトウェアに取り戻すためには、開発たちは、望ましい結果を得るためにシステムの中を一歩一歩歩き回ることを、やめる必要がある。その代わりに、システムが分刻みで大規模かつ複雑になる中で、開発者たちは、レイヤーの利用、意図指向(intent-oriented)アルゴリズム、そして人工知能(AI)を利用して、ソフトウェア自体をより自律的なものにする必要があるのだ。

1歩下がって眺めてみるならば、魔法の一部が失われているのはさほど驚くべきことではない。私たちはソフトウェアへの期待を大きく高めたが、その一方で誰がそれに命じることができるのかについての期待も同時に広げてきた。これまで以上に多くのことが自動的に「ただ上手く動く」ことを期待され、ますます多くの人びとが、デジタルライフとデジタルワークの自動制御をコントロールできるようになる筈だと期待している。

ソフトウェアが対処しようとしている課題が、静的なものである場合でさえ、そうした期待に応えることは相当に難しい。しかし、この自動制御は、リアルタイムの要求に応えることも期待されているのだ――それは自動制御が実行されている最中にも、パラメーターたちが急速に変化する世界である。

交通状況、天候状況、工事状況に対応しながら、A地点からB地点へと車をナビゲーションすることは十分に難しい課題なのだ。あるいは、通勤途中の車の中で行われる電話会議、あるいは物理的およびデジタル商取引などの最適化はどうだろう?同じ道路を同時に利用している何百万台もの車でこれを行うにはどうすれば良いのだろう?車、電車、飛行機、ホテル、レストランなどを組み合わせた旅行のためにこれを行なうためには、どうすれば良いのだろう?

こうした要素たちは、これまでとは異なるプログラミングモデルを要求しているのだ。すなわち宣言的プログラミングモデルである。この代替モデルでは、私たちは手続きではなく「意図」(目標または最終状態)を宣言する。そしてソフトウェアシステムが自律的にその意図を「実現する」方法を見出すのだ。人間は境界と制約を設定するが、目標に到達するためのソリューションを、人間がいつでも発見できるとは期待できない。そこに、コンピューターが登場しその作業を行うのだ。

新しいプログラミングモデルは、コンピュータを活用してそれ自身の複雑さの課題を解決する。

この説明に便利なアナロジーは産業界ではお馴染みのものだ。目標による管理(MBO:management by objectives)である。強力なMBOとは、従業員たちに測定対象となる目標だけを与えることであり、その目標達成する手段を事細かに与えることはしない。目標は販売成績、顧客獲得数、あるいは製品の採用数などを中心に設定されるだろう。その目標を達成するための手段は、従業員たちに任される。予想外の条件変化が起きるために、それはしばしば柔軟な対応を必要とする。またそうした対応の過程で学習が行われて、時間とともに実行が容易になって行くのだ。したがって、ある意味では、この代替プログラミングモデルは、目標でソフトウェアを管理する手法なのだ。すなわち機械のためのMBOである。

この必要性の例はどこにでも見出すことができる。現在最もホットな分野の1つは、ボットや、音声ならびにテキストコマンドを受け付けるインターフェイスだ。現在のボットの多くはコマンド指向だが(例えば「LinkedInでJane Doeを探して下さい」といった命令)、それらは意図指向(intent-oriented)になる必要がある(例えば「適切な求職者を探して下さい」といった指示)。

新しい営業担当者、エンジニア、あるいはCIOを雇う必要があるとしよう。コンピューターの前に座って人材を探し出すためにウェブを眺め回す努力をするのではなく、その代わりにインテリジェントなチャットボットに対して肝心な仕事をして貰うように依頼するのだ。その依頼の裏側では、チャットボットはLinkedInとGlassdoorからの候補者たちを選び出すAPIにリンクし、候補者たちの情報をGitHubやMeetupを使って補足し、候補者たちに接触してその関心や適合性を測る。適切な候補が見つかると、チャットボットは、依頼側と候補者を結びつけて話を進める。経験を重ねるに連れて、チャットボットはどの候補者が良い候補者であるかを学び、探索する作業に熟達して行くのだ。未来の話に聞こえるかもしれないが、この採用方法は現在でも、既存のソフトウェアの適切な協調により実施することが可能だ。

ソフトウェアが、どのようにして複雑なシナリオを大規模な状況でも解決できるようになるのかを理解するために、私たち自身のビルトインコンピュータ(頭脳)が映像を処理する方法を参考にすることができる。

  • 第1レイヤーでは光は光受容体細胞によって吸収される。ここでは最小の処理のみが行われ、網膜の第2および第3の層に信号が渡される。

  • 第2および第3のレイヤーでは、ニューロンとガングリオン細胞が一緒に働いて、エッジまたは影を検出する目標を果たし、視神経を介して脳内に結果を送る。

  • 視覚野には、さらに多くのレイヤーがある。1つのレイヤーはオブジェクトがどこにあるかを計算する。別のレイヤーがエッジを検出し処理して形として取り出す。別のレイヤーはそれらの形を認識可能な物――例えば顔や物体など――に変換する。各レイヤーは時間が経つにつれて学習し、そのパフォーマンスを向上させる。

  • そして最後のレイヤーでは、そうした顔や物体を個人の記憶バンクの内容とマッチングを行い、その結果人間や物体が認識されたりされなかったりすることになる。

このようなアプローチ、すなわち「各レイヤーがただ1つのゴールだけを担当し、抽象度が高くなるにつれてゴールが段々と洗練されていくアプローチ」を使うことによって、ソフトウェアを意図に基づいたものとして構成し、複雑なシナリオを大規模に解決させることができる。マシンの世界で、各レイヤーは、重要なデータを提供するAPI、異なるシステムからのデータを統合する組み合わせサービス、そして各レイヤーでスマートな決定を行なうための人工知能といった形で提供される。

これがソフトウェアの未来だ。そしてその未来は既に始まっている。モダンで大規模に分散したクラウドシステム(例えばGoogleのKubernetesとそのエコシステム)や、自動運転車と自動飛行機、そしてもちろん私たちの増え続けるデジタルワールドの全てのレイヤーに浸透する人工知能や機械学習といった形で。

お互いに依存するシステム数や動的データ量の爆発、そして中核で解決されることが求められる期待の増加などによって積み上げられる複雑さのため、パラダイムシフトは避けることができない。新しいプログラミングモデルは、コンピュータを活用してそれ自身の複雑さの課題を解決し、人間が最も得意とすることに集中させる。すなわち「意図/目標は何か」を考えることだ。

[原文へ]
(翻訳:Sako)