見たままから再構築された現実へ
キュビスト・コーディング
ピカソとAPIの出会う場所
「なぜ私たちのAPIは複雑な現実を完全に表現できないのか?」
あなたはこの問いを深く考えたことがありますか?多くの開発者がこの課題に直面し、より良いフレームワークやパターンを継続的に探し求めています。しかし、もし根本的な問題が技術ではなく、私たちの「現実の捉え方」そのものにあるとしたら?
プログラマーとして、私たちは一貫して「見たまま」の世界を構築してきました。ユーザーの行動を手続き的なエンドポイントに変換し、データモデルを実世界の単純なマッピングとして扱ってきました。この「見たまま」のアプローチは直感的ですが、システムがより複雑になるにつれて、現実の豊かさや可能性を捉えきれなくなります。
興味深いことに、これらの知覚の限界を突破する試みが、約100年前に芸術の世界で起こりました。
20世紀初頭、パブロ・ピカソとジョルジュ・ブラックは伝統的な視点、つまり「見たまま」の表現に疑問を投げかけました。彼らが先駆けたキュビスムは、単なる新しい絵画様式ではなく、現実を見て理解する根本的に新しい方法でした。それは主題を分解し、複数の視点から同時に見て、それらを再構築する方法です。
同様に、今日のソフトウェアアーキテクチャは転換点に立っています。伝統的な「見たまま」のAPI設計を超えて、問題領域を分解し、新たな視点で再構築する「キュビスト」的アプローチが必要です。この論考では、美術史にインスパイアされた新しいプログラミングパラダイムの可能性を探ります。
芸術におけるキュビスト革命

キュビスムは、単純でありながら深遠な洞察から生まれました:単一の視点では対象の全体性を捉えることはできない。形を断片化し、複数の視点を同時に提示し、対象を本質的な幾何学的要素に還元することで、キュビストたちは伝統的な具象芸術では決して明らかにできなかった、主題についての深い真実を明らかにしました。
哲学者モーリス・メルロ=ポンティの知覚理論は、このキュビスト的な挑戦をより深く理解するための手がかりを提供します。メルロ=ポンティは人間の知覚を、カメラのような受動的なプロセスではなく、身体を通じた能動的で統合的な経験として考えました。彼によれば、私たちが世界を見るとき、私たちの視線は絶えず動き、触覚や身体的感覚と結びついて対象を把握します。メルロ=ポンティが「生きられた視点」と呼んだこの知覚プロセスは、まさにキュビストたちが表現しようとした「私たちの実際の知覚のあり方」なのです。
ピカソの「アンブロワーズ・ヴォラールの肖像」やブラックの「ヴァイオリンとキャンドルスティック」を見ると、主題が解体され、分析され、単なる視覚的表現を超えたものへと再構築されていることがわかります。これは単に美的な選択ではなく、認識論的な選択でした。
キュビスムは、理解は単一の視点への執着からではなく、複数の視点の総合から生まれると主張しました。ここでの「視点」とは、単なる物理的な観察位置だけでなく、解釈の枠組み全体を意味します。対象の前面と側面を同時に示すことは、その対象についての異なる知識や解釈を同時に提示することを意味します。例えば、楽器を描写する際、その外観、内部構造、音、演奏者の動き、さらにはその社会的意義まで、すべてが一枚のキャンバスに「同時に」表現されます。
この解体と再構築のプロセスは、対象の「外観」ではなく「本質」を捉えようとする試みでした。キュビストたちはまず対象を解体し、その構成要素を消化し、それらを新たな全体性へと再構築して、より深い理解と表現に到達しました。このプロセスでは、単一の「正しい」視点という概念は放棄され、多様な視点から得られた洞察の重層的な総合が重視されました。
同じ変革的な緊張が、今日の私たちがソフトウェアシステムを設計する方法にも存在しています。
「見たまま」プログラミングの魅力
今日のほとんどのAPIは、私が「見たままプログラミング」と呼ぶもの、つまり実世界での行動を表面的に認識する方法を反映した設計哲学に従っています。この一般的なパターンを考えてみましょう:
# 線形「見たまま」フロー(疑似RPC REST)
def create_order():
# エンドポイント: POST /orders
validate(data)
order_id = save_to_db(data)
return {"id": order_id, "status": "CREATED"}
def get_order(id):
# エンドポイント: GET /orders/{id}
return db.find_order(id)
def process_payment(order_id, payment_info):
# エンドポイント: POST /orders/{id}/payments
order = db.find_order(order_id)
process(order, payment_info)
return {"status": "SUCCESS"}
私たちはリモートプロシージャコールをRESTの衣装で飾りますが、基礎となる精神モデルは手続き的なままです:メソッドをエンドポイントにマッピングし、パラメータを渡し、結果を受け取る。これは遠近法描画のコンピュータ版です—私たちが世界を見るよう教えられた方法を模倣しているため、直感的に感じられるモデルです。
この手法がソフトウェア開発を支配している理由は、技術的な理由だけではありません。それは開発者がすでに持っている手続き型の思考方法と完全に一致しているからです。現代のフレームワークとツールはこれらのルートハンドラパターンに最適化されており、最も簡単な実装方法となっています。コンウェイの法則はさらにこの傾向を強化します。チームは彼らのコミュニケーション構造を反映したAPIを構築し、ドメインの洞察よりも組織の境界を反映したエンドポイント設計につながります。
APIが単なるリモート関数呼び出しであれば、私たちは分散システムを設計するのではなく、単にモノリスをネットワーク上に拡張しただけです。しかし、私たちがこのモデルに固執するのは、すぐに成果が得られるからです。最初のエンドポイントはすぐに完成し、ドキュメントは自動的に作成され、既存のパラダイムに挑戦する必要はありません。コストは、システムがより脆弱になり、適応性を失い、進化に抵抗するにつれて初めて明らかになります。
キュビスト的代替案:アフォーダンス中心設計
ピカソにAPIの設計を頼んだら、彼はどうするでしょうか?彼はおそらく、エンドポイントを固定された手順として捉える概念そのものに疑問を投げかけるでしょう。代わりに、彼は「アフォーダンス」—明示的な指示なしに使い方を伝える対象の特性—に焦点を当てるでしょう。
この2つのAPIレスポンスの違いを考えてみましょう:
伝統的:
{
"id": 42,
"status": "PLACED",
"total": 67.99
}
アフォーダンス中心:
{
"id": 42,
"status": "PLACED",
"total": 67.99,
"_links": {
"self": {"href": "/orders/42" },
"https://example.com/rels/payment": { "href": "/orders/42/payments" },
"https://example.com/rels/cancel": { "href": "/orders/42" }
}
}
2番目のアプローチはキュビスト原則を体現しています。複数の視点(データと可能なアクション)を同時に提示し、注文の概念を現在の状態と可能な状態遷移に分解します。最も重要なことに、これらの要素を再構築して、注文が何で「ある」かだけでなく、何に「なり得る」かを伝えるレスポンスを作成します。
この静的データから動的な可能性への移行は、私たちが日常生活で世界を経験する方法と一致しています。私たちの周りの物理的オブジェクトは常にアフォーダンス(行動の可能性)を提示します。例えば、ドアノブは回転を誘い、ボタンは押すことを求めます。哲学者メルロ=ポンティが述べたように、私たちの知覚は単に情報を受け取るだけでなく、環境との能動的な対話です。私たちのデジタルインターフェースも同じ原則に従うべきであり、単にデータだけでなく「次に何ができるか」を伝え、ユーザーの自然な探索とアクションを導くべきです。
なぜ疑似RPCが(現時点では)勝利したのか
理論的な利点にもかかわらず、アフォーダンス中心設計は例外であり、ルールではありません。ある意味で、「見たまま」プログラミングの勝利は必然だったかもしれません。
URLを組み立ててリクエストを送信する行為自体が「見たまま」の具現化であることを考えてみてください。HTTPクライアントは他のことができないという根本的な制約があります。クライアントがサーバーにアクセスするとき、最終的には「このURLにこのメソッドでアクセスする」という単純な操作に頼らざるを得ません。これは、ピカソの複雑で多面的な視点が最終的に二次元のキャンバスに表現されなければならなかったのと似ています。
しかし、キュビスト的な観点から見ると、本質的な違いは設計の前段階にあります。伝統的なAPIが「見たまま」の操作を直接エンドポイントにマッピングするのに対し、アフォーダンス中心設計はまず問題領域を要素に分解し、それらを新しい方法で再構築します。クライアントは最終的にはHTTPリクエストを実行しますが、それらのリクエストの選択と理解は根本的に異なります。
それでも、開発速度のバイアスは短期的な「見たまま」アプローチを好みます。RPC風のAPIは迅速に展開でき、簡単にドキュメント化でき、他の開発者にすぐに理解されます。コストは徐々に蓄積されていきます:コンポーネント間の結合度の増加、脆弱なクライアント依存関係、システムを独立して発展させることの難しさなどです。しかし、四半期目標が迫り、機能のバックログが増えるとき、これらのコストは無視しやすくなります。
環境的圧力はさらにこのバイアスを強化します。ビジネス指標は機能のデリバリーを報いるもので、アーキテクチャの持続可能性を評価するものではありません。ハイパーメディアとアフォーダンス中心開発のためのツールエコシステムは、従来のパターンをサポートする堅牢なフレームワークと比較して未熟なままです。
おそらく最も重要なのは、克服すべき心理的障壁があることです。開発者の精神モデルは、潜在的な状態遷移よりも即時的なアクションに傾きます。私たちのインセンティブ構造がそうなっているため、システムの長期的な発展よりも開発初期の成果を優先してしまいます。しかし、最終的にHTTPリクエストの形に至るとしても、そこに至る過程で問題を分解し再構築するプロセスこそが本質的な違いを生み出します。
APIを超えて:アフォーダンス革命
アフォーダンス中心設計の原則は、基本的なREST APIをはるかに超えて広がります。このアプローチがUI開発をどのように変革するか考えてみましょう:
// アフォーダンス中心コンポーネント
<Order id={42}>
{(order, actions) => (
<Card>
<OrderSummary data={order} />
{actions.canPay && (
<PaymentForm
onSubmit={actions.pay}
options={actions.paymentMethods}
/>
)}
{actions.canCancel && (
<Button
onClick={actions.cancel}
availableUntil={actions.cancelDeadline}
>キャンセル</Button>
)}
</Card>
)}
</Order>
ここでは、コンポーネントは単にデータではなく、現在の状態と利用可能な遷移に基づいた可能性の景観をレンダリングします。UIはデータの静的な表示ではなく、システム機能の動的な表現となります。
このパターンはデータエンジニアリングにも拡張され、イベントソースシステムは同じエンティティの複数の同時ビューを維持することができます:
// 時間的視点を持つイベントソースシステム
val orderTrajectory = events
.filter(_.entityType == "Order")
.filter(_.entityId == 42)
.groupByKey(e => e.timestamp.toLocalDate)
.aggregate(OrderStateProjection)
顔の複数の側面を同時に示すキュビスト絵画のように、このコードは注文の時間的な進化を明らかにし、単一のスナップショットでは決して提供できない洞察を提供します。
認知革命のパターン:「見たまま」から再構築へ
「見たまま」プログラミングは単なる技術的な偶然ではなく、人間の認知の自然な発現です。私たちは常に「見たまま」から始めます。なぜなら、それが認知の初期段階として自然だからです。しかし、人類の知的歴史を振り返ると、同じパターンが領域を超えて繰り返されています:直接観察から始まり、次に対象を分解し、それらを再構築して新たな理解に達します。
天文学の発展を考えてみましょう。古代の天文学者は、太陽、月、星が地球の周りを回る—地球中心モデル(プトレマイオス体系)という「見たまま」の観察から始まりました。しかし、コペルニクスとガリレオは同じ観察データを根本的に異なる方法で解体し再構築しました。彼らは「見たまま」の現象を、地球が太陽の周りを回るという革命的な視点から再解釈しました。これは認知の再構成の典型的な例、「天文学のキュビスム」です。可視現象を超えて宇宙の構造を根本的に再概念化することにより、彼らはより深い理解に達しました。
アフォーダンス中心設計がそれほど強力なら、なぜそこから始めないのでしょうか?答えは人間の認知と学習の自然な進化にあります。ジャン・ピアジェの発達心理学研究は、私たちが自然に具体的な手続きから抽象的モデルへと進化し、その逆ではないことを示唆しています。私たちは走る前に歩き、歩く前にハイハイをしなければなりません。
この自然な認知的軌道は、API設計の進化に完璧にマッピングされます:
まず、RPC風のAPIで直接観察された現実を映し出し、関数を直接ネットワーク呼び出しにマッピングします—「見たまま」の段階です。次に、分散システムの制約を発見するにつれて、問題領域をより基本的な要素に分解する必要性を認識します。最後に、リソース指向とハイパーメディアを通じて要素を再構築し、より適応性が高く、進化可能なシステムを構築します—「キュビスト」の段階です。
この進行は失敗ではなく、認知発達の必要な旅です。課題はステップをスキップすることではなく、次のステップに進む準備ができたときを認識することです。キュビスムの先駆者たちも、それを破る前に伝統的な遠近法を完全に理解していました。
なぜ今アフォーダンスが重要なのか
私たちは、アフォーダンス中心設計が理論的に優れているだけでなく、実用的に不可欠になりつつある技術的変曲点に立っています。三つの収束する傾向がこのアプローチをますます価値あるものにしています:
まず、AI駆動のインターフェースが私たちのシステムとの相互作用の方法を変革しています。大規模言語モデルは自然にハイパーメディアをナビゲートし、リンクをたどり、人間が書いたコードが必要とする脆弱なクライアント側のロジックなしで可能なアクションを理解します。アフォーダンスが豊富なAPIは、AIエージェントが効果的に動作するための完璧な基盤を提供します。
第二に、KafkaやKinesisのようなイベントリッチなエコシステムが現代のアーキテクチャのバックボーンインフラになっています。これらのシステムは自然にアフォーダンス中心設計の基礎となる状態遷移モデルをサポートし、実装をこれまで以上に実現可能にしています。例えば、注文システムでは、「OrderCreated」、「PaymentProcessed」、「OrderShipped」などのイベントストリームをサブスクライブすることで、注文エンティティの現在の状態と対応するアフォーダンス(支払い、キャンセル、配送追跡など)を動的に結合することができます。
最後に、並行して開発する分散チームの現実は、分離された進化を要求します。タイムゾーンや大陸を超えたチームが、常に同期することなく一貫したシステムを構築する必要がある場合、アフォーダンスが豊富なインターフェースは必要な柔軟性を提供します。
これらのシステムの特性—発見可能な機能を通じた自己文書化、コンポーネントが非同期に進化するときの優雅な劣化、構成を通じた創発的な動作—は現代のソフトウェア開発のニーズと完璧に一致します。
キャンバスからコードへ
キュビスムが芸術家を単一視点の制約から解放したように、アフォーダンス中心設計は開発者を手続き指向思考の限界から解放します。それは私たちのシステムを単なるエンドポイントの集合としてではなく、豊かな可能性が広がる領域として見るよう私たちを招待します。
ピカソはかつて「私は物事を見たままではなく、考えたままに描く」と言いました。おそらく今こそ、私たちも単に使用するままではなく、理解するままにシステムを構築する時が来たのでしょう—時間の経過とともに進化し変容する能力を持つ、動的で多面的なエンティティとして。
単にAPIのエンドポイントを構築するだけではなく、可能性に満ちた世界を創造しましょう。