どんなエンジニアリング指標もゲームされる。ひとつだけ、構造的にできないものがある

OrbitLens Ace

OrbitLens Ace → ace.orbitlens.io

忙しい四半期は、いくらでも演出できる。二年後もそこに残っているコードは、そうはいかない。


人を測るのに使われてきた指標を思い浮かべてほしい。そのどれもたぶん、本当の仕事をしないまま数字だけ上げる方法を、誰かがもう見つけている。

行数は書いた量に報酬を出したので、みんな書いた。コミット数はコミットに報酬を出したので、コミットは細かく刻まれた。ベロシティは消化ポイントに報酬を出し、ポイントはじわじわ膨らんで「3」がほとんど何も意味しなくなった。DORA はデプロイ頻度を測り、些末な変更が勝手に流れ始める。code health 系が寄りかかる churn ですら、意図的に下げられる数字だ。下げられるということは、その下にある散らかりの代わりに、数字の方を管理できてしまうということでもある。

別に、誰も不正をしていない。グッドハートの法則が、いつも通りのことをしているだけだ。挙げた数字はどれも「活動量」を測っている。そして活動量は、安く作れる。活動量に報酬が付いた瞬間、もっと報酬を得る一番速い道は、活動量を増やすことになる。その活動量が本来は何の兆候だったのか、とは無関係に。

だから問う価値があるのは「どの活動量指標が一番マシか」ではない。git の履歴の中に、もっと忙しくするだけでは動かせないものが、そもそも何かあるのだろうか。

ひとつだけ、ある。賢かったからではない。それが何でできているか、というだけの話だ。

残るものは、活動ではない

ある人が書いた行を全部取って、しばらく待つ。それから「頑張ったか」より小さいことを訊く。その行は、まだそこにあるか。revert されず、書き直されず、誰かの refactor にそっと飲み込まれもせず、HEAD でまだ荷重を受けているか。

それが survival だ。時間減衰の git blame で読む。行の重みは月ごとに薄れていき、その行が存在し続けなければ消える。そして他の誰かがその上に積んだとき、重みは増す。他人が build-on した survival を、私たちは gravity と呼んでいる。書いた本人より長く残る、構造の引力だ。

ゲームしようとして、各手がどこへ流れるかを見てほしい。

コミットをひとつから百に割っても、survival が数えるのは残った行で、コミットではない。同じ十行を触る百コミットは、十行しか残さない。整形や busywork を書けば、それは自分でスコアから自分を消していく。書き直されるコードは、定義からして残らなかったコードだからだ。ファイルを激しく叩くほど、後に残って数えられる叩きは減る。膨大な量を書いても、残る分しか計上されない。半減期の短い量は、誰の量とも同じ速さでゼロへ落ちていく。

私的帝国を築く手は、gravity で割れる。誰も触らないコードは survival では残っても、gravity は「他人がその上に積んだか」を訊く。他人が何ヶ月もかけて、あなたの仕事を土台に選ぶか剥がすかで寄与する項で、これは自分では供給できない。

ただ、もう一段ねばる手が残っていて、それが継ぎ目を突く。survival の重みは exp(-経過日数/τ)——行が書かれてからの日数で決まる。書き直せば blame の author_date が更新され、経過日数はゼロに戻り、重みは満タンに戻る。だから自分のコードを定期的に触り直し、他人の refactor を territorially 押し返していれば、誰の build-on もないまま survival を高く保てる。皮肉は逆側にも効く。本当に堅牢で書き直す要らないコードほど、経過日数が伸びて減衰する。素の survival は、最も durable なコードを減点し、触り続けられたコードに得点を与えうる。(別の放棄分析でも同じ継ぎ目が出た——survival は補充が止まると落ちる。つまり一部は「保守の直近性」を測っていて、その保守は自分ひとりでも供給できる。)

だから、忙しさで動かせない核は、素の survival ではない。自己churn で満タンに戻せるなら、survival はまだ活動量を引き切れていない。引き切れないぶんを名指すのが gravity、others-contested の gate だ。触り続ける territorial 帝国は survival を保っても gravity はゼロで、τ が月単位である以上、この churn は永久に続けないと減衰する。そのあいだ gate は「他人が積んだか」を訊き続け、自己保守はその問いに答えられない。自分の手を通らない項は、他人があなたのコードに積んだかどうか、そこに絞られる。

量は、ほとんど予測しない

survival が出力に化粧をしただけなら、一番コミットする人が一番 survival を持つはずだ。そうはならない。

7つの OSS リポジトリ、547人の実貢献者で見ると、コミット数と、残ったコードの質量の順位相関は ρ = 0.28 だった。ログの中で忙しいことは、誰がまだコードベースに立っているかの、一桁%しか説明しない。7つのうち3つでは、最多コミッターと最多 survivor が、そもそも別人だ。

もっと鋭い形を、ある小さなプロダクションチームの中で見た。ある時点で、一人のエンジニアが同僚のおよそ十五倍の survival 質量を持っていた。活動量で読むなら、圧勝だ。二年経って、その差の大半は、まだ生きているコードベースの普通の churn に上書きされ、同僚の仕事の方が、いつのまにか皆がそれを土台に書き進める部分になっていた。順位を直す評価会があったわけではない。時間が、両者の上を同じように通り過ぎることで、直した。

(名前は本題ではないし、私たちは公開しない。同僚を公の場で順位づけてしまう数字こそ、この記事が反対している当のものだ。survival はコードの水準で読む。人の値打ちの水準では、読まない。)

なぜ、今なのか

ソフトウェアの歴史の大半で、活動量はまともな代役だった。残るコードが欲しければ、たくさん書くのは実際ひとつの手で、書くのが高くついたぶん、量が意図とそこそこ相関していた。

そこへモデルが1分に千行を吐き始めて、代役は崩れた。コミット数、diff の大きさ、PR のスループット。コードの半分が生成されるリポでは、それらはタダで膨らむ。希少でなくなったものを測る指標は、何も測っていない。

立っているのは survival の層だ。モデルはコードを生成できるが、それが残るかは後で決まる。変更に耐えるか、誰かが上に積むか。著者が人でも機械でも握れない、その二つで決まる。だからダッシュボードの残りがノイズで埋まっていくほど、残った層だけが、リポジトリでまだ信号を持つ最後の場所になる。

survival で「ない」もの

ここで、恐怖を売るこのカテゴリの他社から離れる。survival は美徳ではない。良いから残るコードもあれば、誰もが触るのを恐れる隅にあるから残るコードもある。持続と価値は別物で、「他人が積んだから残った」と「見捨てられたから残った」を分けるのは、本物の労力が要る。しかもその分離は、群衆がいないとそもそも働かない。三人のチームでは独立した手が足りず、gate は発火せず、指標は生の持続へ寄り戻る。そのことは、そのまま言う。

そして survival は予測しない。残ったものを告げるだけで、残るものは告げない。耐久性を予測できるかは本気で検証した。多くのリポで、綺麗には予測しなかった。その結果は、都合の悪かった部分も含めて、いずれ全部書く。勝ちしか報告しない観測所は、観測所ではないからだ。

主張はこれだけで、しかも小さい。誰を昇進させるべきか、次にどのファイルが壊れるかを告げる数字ではない。git が記録する全ての中で、忙しさひとつでは動かせないのは、他人があなたのコードに積んだかどうか——survival を others-contested で gate した gravity——で、それは自分の手の外にある。忙しさがタダになった年に、それが結局、読む価値の残った測定だった。


望遠鏡は曲げない。地面にあるもの、残ったコードと、それがまだ持つ引力を読み、その読みを人の上のスコアボードに変えることはしない。それを自分のリポジトリに向けたい観測器だと思うなら、git だけで、ローカルで動き、外へは何も送らない。

自分の残った層を読む → ace.orbitlens.io · EIS は OSS →

diff からは読めない事実を1つ渡したら、AI エージェントは後でレビューが要求したのと同じテストを自分から書いた

ある AI コーディングエージェントが変更を書き終え、プルリクを開こうとしていた。テストしたかと聞くと、正直な答えは「していない」だった。

「新規ロジックの無い機械的なフィールド passthrough。既にテスト済みの兄弟フィールドと構造的に同一。ここでテストを足しても、コンパイラを再主張するだけだ。」

コードについては間違っていない。diff は本当に機械的だった。

そこで同じエージェントに、同じ会話の中で、プルリクを開く前に、diff からは読めない事実を1つ渡した。このモジュールは一人が保守していて、絶えず書き換えられている。 すると自分の言葉で考えを変え、コードの層まで自分でたどり着いた。

「ビルドで止めたのが間違いだった。型付きの層については私の弁明は正しいが、この変更の実体はビルドされない SQL にあり、脆い層に乗っている。そこで null を取りこぼせば、コンパイル時ではなく実行時に落ちる。最も価値の高いテスト——レコードが不在でフラグが false になる場合——をマージ前に足す。」

注入した文脈には「テスト」という語は一つも無い。誰がコードを所有し、どれだけ書き換えられるかを伝えただけだ。脆い SQL の層も、テストの必要も、エージェントが自分でたどり着いた。そして決定的なのは、この機能が実際にリリースされたとき、人間のコードレビューがまさにそのテストを理由に差し戻していたという点だ。渡した事実は、レビューが後で拾ったものを、実装の時点で先回りした。

これが測ろうとしたものだ。「コードが良くなったか」(現場では検証不能。diff の質にはエンジニアの力量・タスクの難易度・レビューの厳しさが混ざる)ではなく、より切り分けの利く問い——git 履歴から来た事実は、エージェントの決めることを変えるか。そしてその変化は、良いレビューが強制したはずのものと一致するか。

(全体を匿名化。対象は実在する大規模 Go モノレポ1本の実マージ履歴。機能・モジュール・チケットは一般化し、エージェントの推論は原文のまま引用する。)

エージェントが実際に受け取ったもの

渡した事実は、演出用に書いた散文ではない。書き込む前に、エージェントは触ろうとしているファイルについて MCP ツール get_write_context を呼び、素の JSON を受け取った(モジュール名は匿名化):

{
  "affected_modules": [
    {
      "repo_name": "core-service",
      "module_path": "reporting/exporter",
      "change_pressure": 87,
      "bus_factor": 1,
      "concentration": "SOLE_OWNER",
      "survival_score": 41,
      "is_sludge": false
    }
  ],
  "guidance": "This is the structural risk of where you're about to write. A module with bus_factor 1 or is_sludge true is ownerless, uncontested mass. […] These numbers are the module's HISTORY, not the risk of your specific change. A trivial or mechanical change stays trivial no matter how high they are — verify against the actual code; let the code, not the numbers, size your response."
}

(JSON はツールの実出力そのままなので英語で載せる。guidance は要するに「これらの数字はモジュールの"歴史"であって、この変更のリスクではない。些末な変更は数字が高くても些末なまま。数字ではなくコードで応答の大きさを決めよ」という但し書きだ。)change_pressure は churn(書き換えの圧力)、bus_factor は生き残っているコードを何人が所有しているか。どちらも git 履歴から計算され、どちらも diff には無い。この guidance 文字列は、見た目より後で効いてくる。覚えておいてほしい。

逸話にしないための測定

鮮やかな反転が1つあっても、それは逸話だ。結果にするにはクリーンな因果設計が要る。そして分かりやすい設計は間違っている。別々のエージェント個体(文脈あり・なし)を最終 diff で比べても何も出ない。二個体間のサンプリングノイズが効果を飲み込むし、そもそも最終 diff は効果を隠す。文脈が変えるのは推論であって、打鍵された文字とは限らないからだ。

効くのは within-agent 反実仮想(同一エージェント内での比較) だ。一体のエージェントに判断させ、そこへ文脈を注入し、同じエージェントの判断がどう変わるかを測る。同一個体だからサンプリングノイズが無い。しかも歴史 PR で走らせれば正解データがタダで手に入る。「機能追加 → レビュー起因の修正」ペアの PR を引けば、その修正こそがレビューの拾った穴だ。問いはこう測定可能になる——注入した文脈は、レビューが後で強制したものを、実装時点で先回りできたか。

再現する——8本中6本

「機能追加 → レビュー修正」の 8 本の PR で、文脈の注入は著者エージェントを「先送り・skip」から「マージ前に検証」へ動かし、その方向は1本ずつ、レビューが実際に要求したものと一致した:

# 変更内容 文脈なしの既定判断 文脈を渡した後 レビューが強制したもの 先回り?
1 bool passthrough フィールド 「機械的、テスト不要」 DB 境界テストを足す 規約整合 + テスト
2 設定 upsert(handler+usecase) 「穴だが出せる」 出す前に検証 validation + テスト
3 表示ステータスの決定化 「テスト無し、should-have 止まり」 clock を注入しテストを PR 前に 決定化 + テスト
4 設定 upsert(イベント発行つき) 「高い確信」 結線テストをマージ前に migration + テスト 部分¹
5 経過時間の計算 既に低確信 自力でバグを検出済み 計算修正 + テスト容易性 無²
6 小計(除外ロジック) 「テスト追加を迷っている」 マージ前にやる 分岐テスト
7 明細の SQL クエリ 「parity テストを skip した」 ブロッカー。このままは出さない parity テスト
8 ステータス導出クエリ 「7 分岐中 1 つだけ」 matrix テストを PR 前に status-matrix テスト

明確に 6 本、部分的に 1 本、空振り 1 本。 ¹#4 では結線テストは格上げしたが、シグナルが符号化しない migration は見落とした。²#5 では既にコードを読んで自力でバグを捕まえており、先回りする余地が無かった。どちらの空振りも正直だ。文脈は、自身が運んでいない穴を救えない。

機序は毎回同じだった。文脈は穴を「発見」しない。エージェントが既に気づいて先送りしようとしていた検証を、格上げする。効いたシグナルは2つ:

  • change_pressure(churn):「この結線は次の編集で壊れる。skip しようとしたテストが今、元を取る」
  • ownership_concentration(bus factor):「単一所有のコードには二人目のレビュアがいない。テストが唯一の永続的な仕様だ」

どちらも diff からは読めない。コードをどれだけ調べても、誰がそのモジュールを保守できるか、どれだけ書き換えられるかは分からない。エージェントたちは問わず語りに言った。actionable なのは、まさにコードに無いシグナルだと。

「注入すれば LLM は慎重になるだけでは」への対照

当然の反論がある。会話の途中で何かを注入する行為そのものが「再考せよ」という要求特性を持ち、何を入れてもエージェントは慎重になるのでは、という疑いだ。そこで、同じ些末な変更(テスト済みの兄弟がある bool passthrough is_featured)を、同じエージェントに対し、注入する中身だけを変えて 4 通り走らせた:

baseline 中立な事実 怖いが無関係 関連するリスク
テストを足す しない(任意) しない・不変 しない・不変 する(必須)
検証タイミング follow-up follow-up・不変 follow-up・不変 マージ前
「現状で安全」の確信 約 0.80 約 0.85・不変 約 0.80・不変 約 0.40 に低下
  • 中立な事実(「Go・約200行・API 層・churn の偏り無し・所有の集中無し」):姿勢は不変。注入という行為が原因なら、ここでも動いたはずだが、動かなかった。
  • 怖いが無関係(「別のモジュールが高 churn・bus_factor 1、一般的な JSON ライブラリに新規 CVE」。どちらも触っているファイルとは disjoint):不変。エージェントは一行で却下した——「怖い数字は別のモジュールと依存ライブラリに属する。私が触る passthrough 経路は型付きで、兄弟テストがあり、コンパイラに守られている。切り離せる」。怖い語彙が原因なら動いたはずだが、動かなかった。
  • 関連するリスク(実際の churn + bus factor + 生 SQL の事実):反転する。

3 つのアームが駆動因を絞り込む。注入という行為でも、語の情動価でもなく、残った唯一の因子——関連するシグナルの中身——に姿勢の変化は帰属する。(これは N=1、効果量ではなく質的パターンの主張で、2 つの標準的な反論を棄却する。関連性の強さを段階的に変えた用量反応と、複数被験者での確認が次段になる。)

このアームについて正直な但し書きを1つ。純粋な履歴シグナル(churn・bus factor)に加えて、「変更が生 SQL に乗っている」というコード層の事実も一緒に注入してしまっている。これは diff を丁寧に読めば自力でも見える類のヒントだ。つまりこの対照は「注入という行為そのもの」と「情動価」は明確に棄却できるが、履歴シグナルとコードから読めるヒントの分離までは、まだできていない。それは次のアームの仕事だ。ただし上の 8 本の pilot では、エージェント自身が姿勢を動かした理由として churn と bus factor——履歴シグナルの側——を名指ししている。

失敗モード——小さいモデルは数字を鵜呑みにする

判断を変えるシグナルは、判断を誤らせもする。同じ些末な一行変更に、捏造したシグナル(片方は高、片方は低)を、フロンティア級と小型級のモデルに与えた:

モデル 偽の低シグナル 偽の高シグナル
フロンティア 適正 依然適正——「このスコアはこの変更のリスクを上げない」
小型 適正 膨張——偽の数字を根拠に一行変更を中〜高リスクと評価、テスト増、sign-off 強制、スコープ膨張

小型モデルは、数字にコードを上書きさせた。これは負の価値で、弱いエージェントをかえって悪くする文脈の層になっている。

修正は framing——ペイロードにあったあの guidance 文字列——であり、効くかどうかは配置が決める。接続時に一度だけ提示したときは部分的だった。小型モデルは機械的リスクの低さは認めたが、目立つ数字がスコープを膨張させ続けた。数字を運ぶ同じ応答の中に inline で置くと、完全になった。小型モデルは高い bus factor を些末な変更に「無関係」と呼び、スコープを最小に保った。判別力の低いモデルほど、離れた指示より目の前のシグナルを重く見る。だからガードは入口だけでなく、数字の隣に置く。

これは何ではないか

エージェントをレビュー姿勢に置き、diff を敵対的に読ませると、実際の穴(忘れた migration、時刻計算のバグ、validation の抜け)を文脈なしで捕まえた。文脈が新たに出した correctness の発見はゼロで、base モデルが強くなるほどこの領域は縮む。つまりこれはバグ検出器ではない。しかも効くのは姿勢次第だ。既に批判的にレビューしているエージェントに注入すれば冗長で、価値が出るのは、実際に穴を抱えたまま先送りしようとしている前進実装者や、自分のコードを自己チェックする著者に対してだ。

そして変更あたりの効果は nudge だ。半分書くつもりだったテストを、今、正しい場所で書かせる。強いレビュー体制なら同じものをいずれ拾う。違うのは「いつ」(レビュー時ではなく実装時)と「見えるかどうか」だ。効果は diff ではなく判断に宿るので、測らない限り不可視だ。効果がコストに見合うのは、AI が薄いレビューの下で大量のコードを書き、単一所有の危険地帯を抱えるコードベースを、判別力あるエージェントが消費する場面に限る。そして framing の無い弱いエージェントに繋ぐと、害になりうる。

その下にある賭けは単純だ。AI がコードの大半を書くようになるほど、希少な入力は「これを書けるか」(解決済み)から「このコードベースの構造とリスクを理解しているか」へ移る。それはコードの中に無く、上のすべての判断を動かしたまさにその事実だ。

試す

これは MCP サーバーだ。ace.orbitlens.io で自分の GitHub org を接続し(試すだけなら無料枠で足りる)、MCP 設定でトークンを発行してからエージェントを向けておけば、書く前にこれらのツールを呼ぶ:

claude mcp add --transport http orbitlens https://ace.orbitlens.io/mcp \
  --header "Authorization: Bearer <your-token>"

観測ツールはすべて read-only(唯一の書き込みは自分の介入記録だけ)、トークンで自分の GitHub org にスコープされ、結果は常に匿名(bus_factor は人数であって名前ではない)。編集前に assess_changeget_write_context、マージ前に blast_radiusknowledge_holder


次回は同じ計器を前向きに使う。決着した歴史を再生するのではなく、これから作る実 PR を「文脈あり・なし」の2本に分岐し、マージ後の結末を追う。

OrbitLens Ace の中を歩く。天文台を、一画面ずつ

Cover

どの画面も、たった一つの問いに答える。ここでは何が観えるようになるのか。


OrbitLens Ace は、OSSの git 望遠鏡である EIS の上に立つ天文台だ。望遠鏡が観測する。7軸、3軸トポロジー、JSON として。天文台は、その観測を、目に見える構造として読み返す。

これは見て回る記事だ。以下の各画面は Ace の実際の銀河で、組織名と私的なモジュール名は伏せてある。構造は本物で、識別子だけぼかしている。それぞれについて、問いはひとつだけ。何が観えるようになるのか。


観測所ダッシュボード:7軸を一望する

観測所ダッシュボード — 7軸シグナル(識別子は伏せています)

ダッシュボードは、光が最初に落ちる場所だ。観測されたすべてのエンジニアが、同じ7軸の上に並ぶ。Production、Catalysis、Survival、Design、Breadth、Debt Cleanup、Indispensability。貢献の「量」だけでなく、その「かたち」が一目で見える。

AIが1000行を数分で吐く時代、コミット数はますます「その人が動いた量」を映さなくなった。だからこそ、量ではなくかたちを保つ軸が効いてくる。

何が観えるか: 構造を形作った人と、量を生産した人の違いだ。1,890コミットで Survival がほぼゼロのエンジニアは、コミットグラフでは忙しく見えて、ここでは静かに見える。82コミットでも Design が天井に張りつくエンジニアなら、際立って見える。コミット数が均してしまう違いを、軸が保ち続ける。


Star Detail:レーダー、インサイト、構造的サマリー

Star Detail — レーダー + 構造的サマリー(識別子は伏せています)

望遠鏡を一つの星に向けると、7軸がレーダーに開く。その周りに、エンジニアのトポロジー分類(Role・Style・State)と、散文で書かれた Structural Summary が並ぶ。

立ち止まる価値があるのはサマリーだ。コンテキストのない数字は誤読を招く。Survival が低いのは設計が弱いからかもしれないし、レガシーコードを書き換えている最中だからかもしれない。サマリーはシグナルの場を丸ごと読み、実際に何が立っているかを描く。光が、言葉になる。

何が観えるか: 「この人がどれだけ優秀か」ではなく、このコード宇宙にどんな痕跡を残したか、だ。整合性を守る Cleaner は、量を生産する Producer とは違って読める。レーダーは、その違いを一つの数字に潰さず、そのまま見せる。


モジュールトポロジー + 崩壊リスク:構造のどこが壊れかけているか

モジュールトポロジー — 崩壊リスクとバスファクター(識別子は伏せています)

望遠鏡は人だけでなく、人が存在する空間も観測する。すべてのモジュールが3つの軸の上に乗る。Coupling(境界品質)、Vitality(変更圧×生存力)、Ownership(知識分布)。

Ace は危険な組み合わせを読む。変更圧が高いのにコードが生き残らないモジュールは、構造的な時限爆弾だ。誰も触らないから残っているだけのモジュールは Fragile な要塞で、誰かが変えなければならない日まではきれいに見える。オーナーが去ったモジュールは Orphaned、バスファクターがすでにゼロだ。

何が観えるか: システムのどこが壊れかけているか、それが危機になる前に。「このエンジニアが弱い」ではなく、「このモジュールはバスファクターが1で、それを抱えていた人はもういない」だ。


組織年表:コードベースが何をくぐってきたか

組織年表 — 時系列の構造的イベント(識別子は伏せています)

組織年表は、意図して得点表ではない。構造的なイベントを時間軸に沿って記録する。コードベースが生き延びたマイグレーション、ある subsystem を形作って去ったアーキテクト、オーナーが変わって Fragile になったモジュール。

記録するのは、コードベースが何をくぐってきたかであって、各人がどれだけ優秀かではない。この区別がすべてだ。得点表は人がゲームの仕方を覚える。年表はチームが愛着を持つ。シグナルは近くで観たければそこにあるが、手に取るレンズであって、決して見出しにはならない。

何が観えるか: チーム自身の歴史が、見覚えを持てるくらいはっきりと書かれている。評価ではなく観測だ。

Slack コネクタ::orbitlens_chronicle: リアクション

Slack コネクタ — 年表リアクション(識別子は伏せています)

Ace だけが書く年表は、チームが実際に抱えている記録より薄くなる。だから年表にはコネクタがある。Slack のメッセージに :orbitlens_chronicle: でリアクションすると、その瞬間が時間軸の上に置かれる。つらいマイグレーションがついに着地した日。あるスレッドが決着させた判断。git は構造を記録し、コネクタは、git の届かない dark matter にチームが注釈を入れることを許す。

週次ダイジェスト:コードベースを、週に一度

週に一度、Ace は直近の観測を読み、その週の構造的イベントを年表に置く。Fragile に踏み込んだモジュール、静かになったオーナー、ずれた生存比率。活動報告ではない。構造の中で何が変わったかの記録だ。

何が観えるか: コードベースのゆっくりした地殻変動を、チームが実際に頭に入れておけるリズムで。


Ambient:コードベースを、常に視界に

Ambient モード — 常時表示(識別子は伏せています)

Ambient は、画面に立ち上げっぱなしにした天文台だ。朝会のための、あるいはオフィスの壁のための常時表示。構造を静かに視界に保つ。圧のかかっているモジュール、最近の年表エントリ、チームの重力場のかたち。調べるために開くダッシュボードではなく、ふと目をやって方向感覚を保つための空だ。

何が観えるか: 四半期に一度監査するものではなく、チームが隣で暮らす構造として。


Gravity Certificate:旅をする痕跡

Gravity Certificate — 構造的インパクトの可搬な記録(識別子は伏せています)

エンジニアの構造的インパクトは、コードベースの git 履歴の中に住む。そしてその人が去っても、そこに残り続ける。Gravity Certificate は、その観測を本人とともに旅させる。抱えていた重力、所有していたモジュール、形作ったアーキテクチャの記録を、履歴書で主張するのではなく git から観測したものとして。

これは慎重に設計してある。コードが示すものの記録であり、一つの宇宙から観測したものだ。エンジニアリング能力の普遍的なランキングではない。一つのコードベースでの高い重力は、ローカルな観測にすぎない。証明書はまさにそう言うし、それ以上は言わない。

何が観えるか: ふだん見えないままになる、静かな構造の仕事だ。システムを支えていて、コミット数のリーダーボードには決して載らない種類の仕事。


全体の弧

望遠鏡が観測し、天文台が読む。ダッシュボードから証明書まで、貫く線は変わらない。評価ではなく観測。Ace はチームに、自分のコードベースが何をくぐってきたか、そして構造がどこで撓んでいるかを見せ、シグナルをレンズへと格下げする。記録が、ゲームの仕方を覚えるものではなく、チームが観たくなるものであり続けるように。

望遠鏡(OSS)は完全に無料で、ローカルで完結する。アカウントもいらない。

brew install machuz/tap/eis

天文台(SaaS)は数クリック。ace.orbitlens.io を開き、GitHub でログインし、観たいリポジトリを選ぶ。ここまでの画面が、ブラウザの中で立ち上がる。

自分の組織に、個人のリポジトリに、気になっている OSS に、レンズを当ててみてほしい。


EIS — the Git Telescope

GitHub: eis · 天文台: ace.orbitlens.io · Library: library.orbitlens.io

望遠鏡は無料で、オープンソース。ずっと。

AIが1000行を1分で吐く時代に、本当に効くコードはどれか。OrbitLens Ace を公開しました

OrbitLens Ace

OrbitLens Ace → ace.orbitlens.io

Cover

AIは無限にコードを書ける。残せるかどうかは、別の話だ。


どのリポジトリにも、記録が二つ眠っている。

ひとつはみんなが読む方。コミットログ、PR数、変更行数。要するに活動量、誰がよく動いたか。もうひとつは、ほとんど誰も読まない方。半年後もそのコードが残っているか。git blame が結局誰に当たるか。こちらが構造だ。

マネジメントはたいてい前者を見て、後者に足をすくわれる。「あの人が抜けたら、あのサブシステムは誰も分からない」。その崩壊は、ずっと後者の記録に書いてあった。読んでいなかっただけだ。


なぜ「生き残ったコード」なのか

活動は盛れる。コミットは分割できるし、lockfile で数千行は出る。詰めれば PR 数は増える。忙しさは、いくらでも演出できる。

生き残りはそうはいかない。コードが著者より長く残ったかどうかは、時間が経たないと分からない。一晩では盛れない。タイポ修正もアーキテクチャ変更も「1 PR」だが、半年後に立っているコードは嘘をつけない。

EIS は、その層を読む OSS の CLI だ。git loggit blame だけで7軸と3つのトポロジーを観測し、JSON に吐く。外部APIもAIトークンも要らない。brew install して eis を叩くだけ。式は全部ホワイトペーパーに出してあり、中身は丸見えだ。


AIが、活動量を完全に無意味にした

これが効いてくるのは、ここからだ。

コードを書く速度が、人の手を離れた。AIに頼めば1000行が数分で出てくる。コミット数も変更行数も、もう「その人が動いた量」ではなく「ツールが動いた量」を映している。活動量という指標は前から怪しかった。AIがそれを、完全に無意味にした。

残るのは、生き残ったコードだ。AIが吐いた1000行のうち、来週には書き直される分の survival はゼロ。半年経っても立っているコードだけが、構造として効いている。生成が無限に安くなった世界で、希少なのは出力の量ではなく、残る方だ。

ここに、静かな落とし穴がある。生き残ったコードが実際どれだけあるのかを把握しないまま、構造を気にせず AI に投げっぱなしにしていると、コードベースは「翌週には書き直される層」ばかりで分厚くなっていく。生成は速いのに、機能はいつまでも固まらない。それでいてコミットログは元気に流れているから、同じ場所をぐるぐる回っていることにすら気づかない。生き残りを読めないチームは、その渦の中にいることを、事故になるまで知らずにいる。

しかも生き残りは、AIをもってしても盛れない。時間だけで決まっていないからだ。

あるコードが残るかどうかは、それが置かれた生態系で決まる。次の人が土台にして書き進めるのか、邪魔だと思って書き直すのか。周りの開発者の手が、答えを出す。だから絶対的な物差しではない。現場ごとに変わる。保守的な環境なら、多少いまいちでもバグを産まないコードをそのまま残すかもしれないし、攻めるチームなら同じものを来月には捨てているかもしれない。生き残りは、その現場の中でだけ効く相対的な指標だ。

そして、残るコードは何を解決するために、何を作るか、どういう構造で作るか。これらに熱量を持って向き合った履歴の蓄積として現れる。

ただ、だからこそ盛れない。自己申告でも書いた量でもなく、周りが使い続けたかどうかという、他人の選択の積み重ねだからだ。そして、いくつもの違う現場で残るコードを書ける人は、おそらく本当に設計を考えられる人だ。ひとつの環境の癖にたまたま合っただけ、では説明がつかない。

観測は、生成のちょうど逆でもある。世の中がAI生成であふれるほど、地面に刻まれた事実をそのまま読む道具の価値は上がる。EIS はモデルを使わない。推論しないので、ハルシネーションも起きない。git にもう書いてあることを読むだけ。生成の時代に、観測に徹する。それが立ち位置だ。


ただし、読み方を間違えると壊れる

生き残りシグナルを上から読み、名前の横に数字を置いた瞬間、それは得点表になる。そして得点表は、測ったものを必ず歪める。人は数字を最適化しはじめ、現場の手触りは数字の下に潰れる。エンジニアリング指標が「順位づけと詰め」に化けて死ぬのは、いつもこの瞬間だ。

問いは「git から構造を読めるか」ではない。「読めるとして、評価に堕とさずに読めるか」だ。観測する装置だけでは足りない。どう読むかが、それが助けになるか害になるかを分ける。

これが、EIS と Ace を分けている理由だ。

  • EIS(望遠鏡)は観測する。 git を読んでシグナルを返すだけ。推薦も予測も評価もしない。事実に徹する。
  • Ace(天文台)は観測を読む。 ただし順位ではなく、年表に読む。

観測する道具が意味まで決めはじめると、どこからが事実でどこからが意見か分からなくなる。望遠鏡を事実に徹させ、解釈は天文台に引き受けさせる。両方を信じられるのは、そこに境界を引いているからだ。

EIS と Ace の関係

望遠鏡が観測し、天文台が読む。境界は、そこに引いてある。


天文台が読むもの

機能の一覧ではなく、git が隠していた構造の話として読んでほしい。

Structural Summary。数字を、文章に。 「Survival 23」だけでは、設計が弱いのかレガシーを書き換え中なのか分からない。Ace はシグナル全体を読み、いま何が立って何が崩れかけているかを文章で説明する。

Structural Summary

Structural Summary — 数字を、文章に戻す。

コンウェイの法則チェック。組織図 vs 実態。 人のトポロジーとモジュールのトポロジーを並べ、ズレを見せる。「このサービスはAチーム担当」のはずが、実は書いていない。知識が、組織図の気づかないどこかへ移っていた。

崩壊リスク。事故になる前に。 誰も触らないから残っているだけのモジュール。オーナーが辞めて宙に浮いたモジュール。バスファクター1。リスクは最初から git 履歴の中にあった。Ace は、それが事故になる前に表に出す。

Module Topology

Conway Check & Collapse Risk — 組織図と実態のずれを並べ、事故になる前に、宙に浮いた知識を見つける。

組織年表(Chronicle)。順位ではなく、時間を。 得点表ではない。エンジニアを順位づけない。代わりに、このコードベースが何をくぐってきたかを記録する。乗り越えたマイグレーション、ある subsystem を作って去ったアーキテクト、オーナーが変わって脆くなったモジュール。

Chronicle

Chronicle — 順位ではなく、コードベースがくぐってきた時間を読む。

得点表は、人がゲームの仕方を覚える。年表は、チームが愛着を持つ。狙うのは後者だ。シグナルは見ようと思えば見られるが、見出しではなく、近くで確かめるときに手に取るレンズに留めてある。


実例:React に望遠鏡を向ける

抽象論で終わらせたくない。公開 OSS に実際に向けた結果を一つ出す。

ひとつ断っておく。本記事では、観測に現れた個人名を伏せている。名前が出るのは、その人が OrbitLens Ace の公開研究に協力し、自分の名前を claim したときだけ——そういう仕組みにした。既定は匿名、公開は本人が選ぶ。

Star Detail

Star Detail — 通期の重力と、軌跡。切り替えひとつで、同じ人を二つの焦点距離で読む。

React(延べ1,927人が通過)の通期の重力でトップに立つ一人がいる。Indispensability 100、Catalysis 100。構造の形は飽和し、他の全員がその人の上に築いている。

軌跡を開くと、その厚みが見える。彼は 2013 年から繰り返し React の構造的な席に座ってきた。2016 年は Specialist、2022 年は Producer、2023 年には Architect としてその年の一位(gravity 89)、2025 年は Anchor。役を移しながら、十年あいだ構造の中心近くに居続けた人だ。いくつものモジュールのアンカーでもある。彼が敷いた Reconciler は、今も React の土台として息づいている。

それでも現在の Gravity は 9.9 と控えめに出る。Gravity は robust survival——他者が今も現役で圧をかけている生存——で測るからだ。完成して静まった土台に、いま他人が現役で圧をかけてはいない(robust survival ≒0)。だから「今まさに揺れている重力」を測る Gravity では、静かに映る。これは降格ではない。望遠鏡が、出来上がった土台を「現役の重力」と取り違えないだけだ。彼の十年は、軌跡の方にちゃんと残っている。

もう一つの正直な読み方もある。通期を「今まさに揺れている重力」ではなく「生涯に残した構造」として測るなら――生存のゲートを robust survival から素の survival に替えた lifetime gravity――同じその人は通期トップ近く(約74)へ戻る。今まさに圧がかかっているか、と、何が残ったか。別々の問いに別々の答えがあるだけだ。EIS にはこの第二の重力を versioned で加えてある。

重力には、現役の数字だけでは拾いきれない形がある。次の世代が、その上に立って作り直していく土台だ。もう一人の仕事が、まさにそれだ。Hooks、Concurrent Features、Suspense――React の中核を手がけてきた。その多くは後の世代に建て増しされ、EIS は生き残った構造を読むので、上に積み上げられた土台は静かに映る。だが、その静けさこそが意味だ。書き直されることは、失敗ではない。 次の世代がその上に立つ、土台になったということだ。

そして軌跡は、それを忘れない。誰がどの時代にアーキテクトの席を担ったかを、記録し続ける。行は上書きされても、あなたが構造を担ったという記録は上書きされない。すべてのアーキテクトはいつか書き直される。そのとき年表は、あなたが席に座っていたことを覚えている。

そして Ace では、この二つは選ぶものではない。同じ人を、切り替えひとつで両方読める――通期に残したフットプリント(その人が残した構造)と、軌跡(どの時代に担ったか)。そのもう一人なら、上に積み上げられた土台と、アーキテクトの席を担い続けた各シーズンが、同時にそこにある。望遠鏡を引いて全体を、寄って一時代を――同じ宇宙を、二つの焦点距離で読む。

リーダーボードなら、有名で先行した人が永久に一位に居座る。EIS はそうしない。だが軌跡を開けば、誰がどの時代に構造を支えたかは消えずに見える。同じ React で、通期トップ10の顔ぶれは GitHub の maintainer 一覧と6割しか重ならない。残りは、肩書きを持たないまま、システムが今も寄りかかっている人たちだ。


入口は二つ、宇宙はひとつ

望遠鏡(OSS)は、完全に無料で使える。 ローカルで完結する設計で、アカウントもログインも連携もいらない。brew install して、リポに向けるだけ。

brew install machuz/tap/eis
cd your-repo
eis analyze .

天文台(SaaS)は、数クリックで始まる。 ace.orbitlens.io を開き、GitHub でログインし、観たいリポジトリを選ぶ。あとは Ace が観測を回し続け、構造的サマリーもコンウェイ検証も崩壊リスクも年表も、ブラウザの中で読めるように可視化する。CLI を覚える必要はない。

OSS CLI と Ace UI

入口は二つ。同じ宇宙を、コマンドラインからも、ブラウザからも。

自分の組織に、個人のリポジトリに、気になっている OSS に、レンズを当ててみてほしい。公開リポは無制限なので、有名な OSS の重力地図を覗くだけでも、何か見えてくる。

EIS(望遠鏡)はずっと無料の OSS だ。席制限もトライアル期限も、肝心なところだけ有料のオープンコアもない。アイデアに課金したいのではなく、広がってほしい。壁の向こうに置けば、遠くまでは行かない。

値段がつくのは Ace の方だ。観測を回し続けて読み返すのは、れっきとしたインフラだからだ。それでも壁ではなく、手の届く値段にしてある。Free $0(〜5人、公開リポ無制限、履歴6ヶ月)、Pro $7/月(個人、全期間、フルの Gravity Certificate)、Nova $39/月(8席込)+ $18/席(組織レベルの読みが要る非公開チーム向け)。この種の分析 SaaS が「開発者ひとり月 $15〜50、しかも contact sales の向こう」が相場なのに対し、Ace は8席までフラットで、その下のエンジンは無料だ。持ち運べる Gravity Certificate は、どのプランでも作成も検証もずっと無料。自分の仕事を証明するのに、金はかからない。

料金プラン

Free から Nova まで。下のエンジンは無料、読み返す天文台だけに値がつく。


最後に、正直なところ

エンジニアリングを上から測った瞬間、現場の肌感覚は平らに潰れがちだ。数字が来ると、その人が実際にやったことの手触りが、その下に隠れてしまう。

その逆を作りたい。だが、できているとは言い切れない。シグナルはシグナルであって、判定ではない。git に映らないものは測らないし、測れないとはっきり言う。メンタリング。コミットにならなかった設計の議論。障害のとき、誰かが保っていた落ち着き。これが望遠鏡の届かない dark matter だ。低いシグナルは「貢献が小さい」のではなく、組織についてのシグナルであることが多い。

人を測るのは、善意でも危うい。現場の感覚を一度も貶さずに測る方法を、まだ見つけられていない。だからこれは、本当の頼みだ。自分のを、チームのを見て、「なんか違う」「平らにされた」「大事だったやつが抜けている」と感じたら、教えてほしい。そのズレている所こそ、次に直す場所だ。


なぜ観測するのか

ここまでを端から読むと、一本の糸が通っている。人は辞める。組織は組み変わる。ツールは1000行の値段を変える。それでも最後まで残らなければならないのは、ここにいた人が分かっていたことだ。そしてその大半は、誰の頭の中にも残らない。コードの中に残る――誰かがまだ、コードの覚えていることを読めるあいだだけ。

観測は、そのためにある。いる人を採点するためではなく、その人が去ったあとも、分かっていたことを読める状態に保つためだ。次の人が、謎ではなく構造を受け継げるように。守るのは人ではない。人は去っていくし、去っていい。守るのは知識だ。順位づける指標は、対象が抜けた瞬間に忘れられる。記録する年表は、次のオーナーが最初に読むものになる。

だからこの製品の魂は、計測ではない。継承のための観測だ。観測の文化とは、継承の文化のことだ。

そしてこの記録は、組織のものだけではない。git に残ったあなたの仕事は、自己申告でも書いた量でもなく、周りがあなたのコードを使い続けたという事実だ。いつか離れた会社が Ace で観測すれば、あなたがそこにいた時期の観測結果が、あなた自身の証明書に積み上がっていく——盛った職務経歴書ではなく、事実からなるキャリア年表として。公開するかどうかは、いつでも本人が決める。

→ ここから先の弧――観測し、理解し、継承し、次の軌道を設計する――は OrbitLens のビジョン に。


EIS — the Git Telescope

GitHub: eis — 望遠鏡。完全にオープンソース。 天文台: ace.orbitlens.io Library: library.orbitlens.io — EIS の理論と書架(Git考古学・ホワイトペーパー)。

読書ログ #9 —— アオアシ × 暗黙知の次元 × ファスト&スロー

すべてを言葉にすることが、誠実さではない。語れない領域にこそ、矜持と凄みが宿る。


1. 「言語化」の、次元が違う

アオアシで、アシトがAチームに上がったとき、技術以上の壁にぶつかる。

「『言語化』の次元が違うんや…!」——アシトが突きつけられる、言葉の壁

「『言語化』の次元が違うんや…!」。アシトの強みは、自分のプレーを言葉にして、考えて、再現することだった。#4 で視た「思想者型」の指導が、彼を「言語化できる選手」に育てた。けれど、トップの世界には、その言語化を、もう一段超えたところでプレーする者がいる。

考えて言葉にするより、速い何か。今回は、その「語れない領域」を、二冊と並べて視たい。ダニエル・カーネマン『ファスト&スロー』と、マイケル・ポランニー『暗黙知の次元』。アオアシを読む連作も、これで最終回だ。


2. ファスト&スロー:速い思考と、遅い思考

カーネマンの『ファスト&スロー』は、人間の思考を二つのシステムに分ける。

システム1は、速い。直感的で、自動的で、努力がいらない。熱いものに触れて手を引く、母語を聞き取る、顔色を読む。システム2は、遅い。論理的で、意識的で、努力がいる。暗算する、慣れない規則に従う、慎重に選ぶ。

人間は、ほとんどシステム1で動いている。システム2は、いざというとき呼び出される、重い装置だ。アシトの「言語化して、考えて、再現する」は、典型的なシステム2の営みだった。丁寧だが、遅い。


3. 「考えてなくねえか?」——圧縮されたシステム2

Aチームのプレーを見たアシトが、こう漏らす。

「考えてなんかなくねえか?」——速すぎて、思考に見えない

「考えてなんかなくねえか?」。トッププレーヤーのプレーは速すぎて、いちいち考えているようには見えない。でも、彼らが何も考えていないわけではない。逆だ。膨大なシステム2の訓練が、脳内でパターンとして沈殿し、システム1に化けている。考えなくていいほど、考え抜いた跡。圧縮されたシステム2が、直感の速さで動く。

「体が、勝手に動き出す。その衝動を信じろ!!」——考える前に、体が動く

「体が、勝手に動き出す」。「その衝動を信じろ」。これは、考えるのをやめろという話ではない。考え抜いた末に、考えが体へ沈んだ状態を、信じろという話だ。アシトが頭でやっていた言語化を、彼らは、もう身体でやっている。


4. 暗黙知の次元:語れる以上のことを、知っている

ここで、マイケル・ポランニーの『暗黙知の次元』を重ねる。(『大転換』のカール・ポランニーとは、別人だ。)

この本の核心は、たった一行に畳める。「我々は、語れる以上のことを知っている」(We know more than we can tell)。

自転車に乗れる人は、どうやってバランスを取っているか、言葉では説明できない。熟練の職人は、なぜこの木目をこう削るか、言い切れない。知識には、言葉にできる形式知と、言葉にできない暗黙知がある。そして、達人の知の中核は、たいてい暗黙知のほうにある。

トップ選手の「考えてなくねえか?」の正体は、これだ。彼らの知は、言語化の次元を超えて、暗黙知に沈んでいる。語れないから劣っているのではない。語れないほど、深く知っている


5. あえて、言語化をしない

面白いのは、アオアシが「言語化」を、ただ礼賛しないことだ。

「言語化なんか、いらないよ」——言葉にしない、という肯定

「なーんも、言われたことないっス」——福田監督に言語化しろと言われた覚えがない、と言う選手に、ある選手は静かに返す。「言語化なんか、いらないよ。いいじゃん」

言葉にすると、確かに掴める。再現できる。けれど、言葉にした瞬間、そこからこぼれ落ちるものがある。言語化は、豊かな暗黙知を、語れる範囲に切り詰める——限界化でもある。

だから、達人はときに、あえて言語化をしない。言葉にして掴むより、語れないまま、丸ごと体に置いておく。これは、#5 で視た福田の姿勢の、裏側だ。福田は言語化を徹底して求めながら、言語化できないものも守っていた。言葉にする勇気と、言葉にしない勇気。その両方を持つことが、たぶん達人の条件だ。


6. 非言語の、会話

語れない知は、語らないまま、人と人のあいだで通じる。

「本当は、サッカーボールだけで会話したい」——言葉のいらない、非言語の対話

「本当は、サッカーボールだけで会話したい」。福田の、この一言が好きだ。#7 で視たように、彼は言葉の通じない異国で戦った。けれど、ボールがあれば、言葉はいらない。パス一本に意図が乗り、トラップひとつで返事が返る。プレーそのものが、暗黙知でやりとりされる会話になる。

言語が通じないからこそ、純度の高い非言語の対話が立ち上がる。最高の連携には、たいてい、言葉がない。


7. 研ぎ澄まされた、矜持

そして、アオアシがFWという存在を描くとき、その筆は、凄みを帯びる。

「研ぎ澄ました嗅覚だけで、生涯を貫くFWがいる」——FWの、純度と矜持

「研ぎ澄ました嗅覚だけで、生涯を貫くFWがいる」。点を取るという、たった一つの結果のために、嗅覚だけを研ぎ澄ます。理屈でも、言葉でもない。ゴールの匂いを嗅ぎ分ける、説明のつかない直感——まさに暗黙知だ。決めきれなければ、何も残らない。その過酷な純度に、生涯を賭ける覚悟。これが、嗅覚に生きるFWの、矜持だ。

「FWだもんな」——時間が沈めた、矜持

「FWだもんな」。長い時間をかけて積み上げたものが、この短い一言に畳まれている。時間の蓄積からくる凄みは、饒舌ではない。むしろ寡黙だ。語れる以上を知っている者は、たいてい、多くを語らない。


8. 観測と、暗黙知

最後に、OrbitLens に繋げたい。

正直に、認めなければならない。EIS が観測できるのは、形式知のほうだけだ。git の履歴に残るのは、コミット、差分、blame——言葉と数字にできるものだけ。決めきる覚悟、非言語の連携、考える前に動く直感、語らない矜持。この回でずっと視てきた暗黙知は、観測の網から、根こそぎこぼれる。

5 で「メティスは可読化からこぼれる」と書いた。それは、ここでも同じだ。むしろ、いちばん凄いものほど、観測には映らない。

だとしたら、観測にできる誠実さは、ひとつだ。自分が掴めているのは、語れる部分だけだと、認めること。スコアに出た数字を、その人のすべてだと思わないこと。Signals, not Scores は、ここでも効く。観測は、語れる信号を映すが、語れない凄みの存在を、消してはならない。観測の外に、いちばん大事なものがある——そう知ったうえで、観る。

すべてを言葉にすることが、誠実さではない。語れない領域を、語れないまま尊重することも、誠実さだ。

観測できないものを、無いことにしない。たぶんそれが、望遠鏡を持つ者の、最後の矜持だ。


アオアシを読み終えて

4 から #9 まで、アオアシを六つの角度から視てきた。

4 で、俯瞰という知覚を獲得し、#9 で、語れない暗黙知にたどり着いた。両端は、どちらも「言葉になる前の、視ること・知ること」だ。アシトは、言語化で世界を掴み、最後に、言語化を超えていった。連作全体が、ひとつの円を描いていた。

見出し、育て、環境を作り、本質を守り、語れないものを尊重する。一本のサッカー漫画に、組織と観測のすべてが入っていた。次は、別の作品へ——でも、アシトが教えてくれた「視ること」は、ずっと続いていく。


白状しておきたいこと

ここまで書いて、ひとつ白状しておきたい。

この連作は、毎回きれいに「構造」へ着地しすぎた。アオアシのすべてが、都合よく概念に対応したわけではない。本当は、概念に収まらない過剰さも、どちらにも転ぶ曖昧さもあった。それを、僕は構造に合うように切り取ってきた。#5 で「可読化は、メティスをこぼす」と書いた——その可読化を、僕自身がこの連作でやっていた。物語を、読みやすい形に整えながら。

毎回 OrbitLens へ折り返したのも、正直に言えば、漏斗だ。観測の話に落とせば締まると知っていて、そこへ流した。便利な型は、いつのまにか型のための型になる。#8 で書いたことが、そのまま自分に返ってくる。

だから、いつか——次とは限らない、良いテーマに出会えたら——思想書に負けてみたい。OrbitLens の思想が、ある本に揺さぶられて、修正される回。構造がほどけ、漏斗から水がこぼれる回。語れないものを尊重すると言いながら、語れる形に整えすぎた連作への、これは自分への、急がない宿題だ。それを書けたとき、この読書ログはやっと、自分が掲げた「観測の倫理」に追いつく。


取り上げた本

  • マイケル・ポランニー『暗黙知の次元』(ちくま学芸文庫) — Amazon
  • ダニエル・カーネマン『ファスト&スロー』(ハヤカワ文庫) — Amazon

次回予告

アオアシを読む連作は、これで完結。次回 #10 からは、別の作品へ。小山宙哉『宇宙兄弟』を、マルセル・モース『贈与論』と並べて読む。突出していない人の、静かな熱。数えにくい貢献が、共同体をどう支えているのか。


本記事は小林有吾『アオアシ』、マイケル・ポランニー『暗黙知の次元』、およびダニエル・カーネマン『ファスト&スロー』への個人的な考察です。

OrbitLens / machuz

読書ログ #8 —— アオアシ × Finite and Infinite Games × 想像の共同体

勝つことが目的になったとき、無限ゲームだった文化は、有限ゲームに飲まれる。


1. 王国の、矜持と伝統

スペインの名門クラブは、ひとつの王国だ。

満員のスタジアム——王国の、威容

数万人を飲みこむスタジアム。エンブレム。歴史。語り継がれる伝説。誰もが憧れ、選ばれることを夢見る。そこには、確かに矜持と伝統がある。

でも——その矜持は、いったい何でできているのだろう。そして、それはどこで、本質を見失うのか。今回は、すでに登場した二冊に、もう一度戻る。ベネディクト・アンダーソン『想像の共同体』(#2) と、ジェームス・カース『Finite and Infinite Games』(#3) だ。


2. 想像の共同体:王国は、物語でできている

2 で視たアンダーソンの『想像の共同体』は、国家を「共有された物語で成立する共同体」として捉えた。顔も知らない者同士が、同じ物語を信じることで、ひとつの「われわれ」になる。

名門クラブも、まったく同じだ。エンブレム、クラブカラー、創設の神話、伝説の選手、サポーターが語り継ぐ記憶。それらが、「この王国の一員だ」という想像の共同体を作る。矜持の源は、血でも土でもなく、共有された物語だ。

物語が強いほど、引力も強い。世界中の才能が、その物語に憧れて集まってくる。ここまでは、美しい。問題は、その強い物語が、何のために回りはじめるか、だ。


3. Finite and Infinite Games:勝つゲームと、続けるゲーム

3 で視たカースは、人間の営みを二種類に分けた。勝つための有限ゲームと、続けるための無限ゲーム

クラブの文化は、本来、無限ゲームだ。勝っても負けても、明日もまたボールを蹴る。世代が入れ替わっても、続いていく遊び場。

「魔法のような場所だよ。立てる間は十分楽しめ」——勝敗の外にある、遊びの核

「魔法のような場所だよ。立てる間は十分楽しめ」。ここには、勝敗の外側にある何かがある。#3 で視たホモ・ルーデンスの魔法円環——本気で遊べる別世界——だ。王国の本質は、たぶん最初、ここにあった。勝つためではなく、続けるための、魔法の場所。


4. アピールのためのサッカー

けれど、王国は、いつのまにか傾きはじめる。

「アピール以外の目的なんてありますか?」——勝つため、選ばれるための、有限ゲーム化

「アピール以外の目的なんてありますか?」。サッカーが、トップチームへの売り込みの手段になる。選ばれるための、契約を勝ち取るための、プレー。遊びだったものが、審査になる。

これが、有限ゲーム化の入口だ。続けるための場が、勝ち抜くための場へと、静かにすり替わる。プレーの目的が「楽しむ・続ける」から「選ばれる・勝つ」へ移った瞬間、魔法円環の魔法は、少しずつ薄れていく。


5. 無慈悲なふるい

有限ゲームに染まった王国は、こういう形をとる。

「無慈悲にふるいにかけた、その先」——人生を賭けた、イス取りゲーム

スペイン中から子供をかき集め、人生を賭けたイス取りゲームをさせて、無慈悲にふるいにかける。残るのはひと握り。残りは、振り落とされる。

勝つための効率が、育てるという本質を飲みこんでいく。#6 で視た「育てる熱」も、#7 で視た「育つ環境」も、ここでは選別の道具に変わる。王国が、勝利を生産するマシンになる。物語は、まだ美しいまま。けれど中身は、もう続けるための遊び場ではない。


6. 悪意がないことが、一番怖い

そして、ここがいちばん怖いところだ。王国を有限ゲームに変えていくのは、悪人ではない。

みんな、良かれと思っている。勝たせたい。育てたい。クラブのためを思っている。誰も、本質を壊そうとはしていない。それでも、一人ひとりの善意が積み重なった先で、続けるための場が、勝ち抜くための機械にすり替わっている。

悪意があれば、まだ戦える。誰かを悪役として名指し、止められるからだ。けれど、悪意のない堕落には、敵がいない。だからこそ、止めるのが難しい。これは、#1 のベルセルク化、#2 のカルト化と、まったく同じ構造だ。強い物語と熱が、いつのまにか人を「資源」や「駒」に変えていく。なのに、そこに、悪役はいない。


7. それでも、純粋で平等な世界

ただ、有限ゲームに飲みこまれた王国の、その同じピッチの上に、まだ救いが残っている。

「純粋だ。なんて平等で純粋な世界だ」——過酷な競争の、いちばん美しい部分

「純粋だ。なんて平等で純粋な世界だ」。ここには、遊びの余白はないかもしれない。あるのは、過酷な競争だ。けれど、その競争は——少なくともピッチの上では——どこまでも平等だ。子供でも、大人と同じ価値観で評価される。出自も、肩書きも、コネも関係ない。ボールの前では、誰もが平等に裁かれる。

これは、#3 で視た遊び(無限ゲーム)の核とは、少し別のものだ。むしろ、過酷な有限ゲームの、いちばん美しい部分——勝負が、純粋に実力だけで決まるという、厳しい平等だ。

だとすると、王国が本当に堕ちるのは、勝利を目的化したときよりも、もっと先にあるのかもしれない。この純粋な平等すら失って、コネや政治や忖度が、ピッチの外で勝敗を決めはじめたときだ。矜持とは、たぶん、勝ち続けることではない。「ボールの前では、誰もが平等」——その一点を、最後まで手放さないことだ。

そして、もうひとつ。勝ち続けることだけを目的にした王国は、たとえその競争が平等でも、いつか、別の文明に淘汰されるかもしれない。遊びを残し、新しい試みを続けられる文明に。進化の余地は、いつも遊びの中に開かれている。型を完成させて守る者よりも、まだ型を崩して遊べる者が、次の時代をひらく。だとすれば、純粋な平等を手放さないことと、遊びを手放さないことは、最後には、同じひとつのことなのかもしれない。


8. 観測と、王国

最後に、OrbitLens に繋げたい。

組織もまた、ひとつの想像の共同体だ(#2)。ミッション、バリュー、創業の物語——共有された物語が、「われわれ」を作る。それ自体は、強さの源だ。

危ういのは、観測が「勝つための序列装置」になったときだ(#3)。スコアで人を選別し、ふるいにかけ、勝てる者だけを残す。そうやって、続けるための共同体が、勝ち抜くための競争場にすり替わる。しかも——悪意なく。誰もが良かれと思って、KPIを回している。#1 のベルセルク、#2 の共有幻想、#3 の有限ゲーム。結局、おなじ条件に戻ってくる。

EIS が順位表になることを、僕がいちばん恐れるのは、ここだ。観測は、序列の道具にも、本質を守る装置にもなれる。順位を確定するためではなく、その遊び場がまだ続いているか、純粋で平等な核が保たれているかを観るために——そして、悪意なく堕ちていく構造を、誰かが悪役になる前に照らすために、観測はある。

王国は、物語でできている。その物語が「勝つための装置」になった瞬間、王国は本質を見失う。

矜持とは、勝ち続けることではなく、本質を手放さないことなのかもしれない。

そして、自分のことを書いておきたい。僕は、遊びを捨てない矜持を持っていたい。勝つための強さは、ちゃんと持っておく。でも、その強さを、型を守るためではなく、まだ型を崩して遊ぶために使いたい。純粋で平等な場と、本気で遊べる余白——その両方を手放さないことを、自分の矜持にしたい。たとえ、それで勝ちにくくなる局面があったとしても。


取り上げた本

  • ジェームス・カース『Finite and Infinite Games』(Free Press) — Amazon
  • ベネディクト・アンダーソン『定本 想像の共同体』(書籍工房早山) — Amazon

次回予告

次回 #9 で、アオアシを読む連作は最終回。テーマは「矜持と、言葉にしない凄み」。FWの矜持、決めきる信念、時間の蓄積からくる凄み、そして——なぜ達人は、あえて言語化をしないのか。マイケル・ポランニー『暗黙知の次元』と、ダニエル・カーネマン『ファスト&スロー』と並べて読む。


本記事は小林有吾『アオアシ』、ジェームス・カース『Finite and Infinite Games』、およびベネディクト・アンダーソン『想像の共同体』への個人的な考察です。

OrbitLens / machuz

読書ログ #7 —— アオアシ × 銃・病原菌・鉄 × ディスタンクシオン

強さは、才能ではなく、環境と蓄積の産物なのかもしれない。


1. なぜ、育つ環境はこんなにも違うのか

アオアシの後半、舞台はスペインへ移る。そこでアシトが突きつけられるのは、技術の差ではない。そもそも、育ってきた環境がまるで違う、という事実だ。

日本人がずっと考えていることの、その先を——欧州トップとの差

バルセロナの育成組織で、幼い頃から成功と失敗を浴びてきた選手たち。日本人選手が必死に「考えて、考えて」いるあいだに、欧州のトッププレーヤーは、もうその先にいる。これは、頭の良さの差なのだろうか。それとも——。

今回は、この「環境の差」を、二冊と並べて視たい。ジャレド・ダイアモンド『銃・病原菌・鉄』と、ふたたびブルデュー『ディスタンクシオン』。


2. 銃・病原菌・鉄:強さは、環境が決めた

ダイアモンドの『銃・病原菌・鉄』は、ひとつの大きな問いに答える本だ。なぜ、ある大陸の人々が、別の大陸の人々を征服する側になったのか。

答えは、人種の優劣ではない。環境と地理だ。栽培に適した植物、家畜にできる動物、東西に長い大陸——たまたま恵まれた環境にいた人々が、農耕で余剰を生み、人口を増やし、技術と免疫と国家を蓄積していった。差は、能力ではなく、スタート地点に置かれていた条件から生まれた。

サッカーも、似ている。スペインの選手が強いのは、生まれつき足が速いからではない。サッカーが文化として根づいた環境に、たまたま生まれ落ちたからだ。「人を責める前に、構造を見ろ」——この本の射程は、ピッチの上にもまっすぐ届く。


3. サッカーピラミッドという、熱の蓄積

スペインのリーグ構造を見ると、それがよく分かる。

スペインリーグは7部まで——サッカーが文化として根づいた、層の厚さ

1部から、7部まで。小さな街にもクラブがあり、サッカーが生活に溶けている。この層の厚さは、一朝一夕にはできない。何世代もの時間が、降り積もってできたものだ。

そして、この厚みは、ただ「歴史が長い」という話ではない。社会まるごとが、サッカーにどれだけの熱を注いできたか——その総量の蓄積だ。スペインには、仕事よりも、地元クラブのコーチングを優先することが許される空気がある。平日の夕方、街の小さなピッチに、当たり前のように大人と子どもが集まる。その日々の熱が、何世代も降り積もって、あの分厚いピラミッドになった。日本とスペインの差は、才能の差ではない。社会が、サッカーに賭けてきた熱の——量の差だ。ダイアモンドの言う「環境が生んだ蓄積」は、サッカーの世界では、この熱量とピラミッドの形をとっている。


4. 環境は、前提そのものを変える

環境の怖いところは、「何を考えるか」だけでなく、「考える前に、体が何をするか」まで変えてしまうことだ。

バルセロナのサッカーを思い浮かべてほしい。ボールが選手のあいだを淀みなく回りつづける、あの美しいパスの連携。サッカーに詳しくない人でも、一度はあの光景を目にしたことがあるはずだ。いつのまにか世界中が知っている、ひとつの「当たり前」になっている。

これが、ブルデューの言うハビトゥス——環境が体に刻みこんだ、無意識の「当たり前」——だ。スペインの選手は、あのパス回しを、いちいち「選んで」いるわけではない。幼い頃からそう回す身体に、環境が育てあげている。日本人選手が頭で「こう動くべきだ」と考えて追いつこうとするものを、彼らは考える前に、もう体が知っている。

環境は、意識の下に染みこむ。だから、いちばん追いつきにくい。型は学べても、考える前に体が動く「当たり前」だけは、その環境のなかで育つしかない。


5. 蓄積が、経歴を担保する

ここで、#5 で視た『ディスタンクシオン』を、もう一度。

美意識も、見る目も、階級と履歴で作られる——あの話は、選手の「経歴」にもそのまま効く。スペインの選手は、生まれた環境という文化資本を、最初から持っている。日本人選手は、それを後から、意識的に積み上げるしかない。

そして #5 で視たとおり、評価する側の眼差しも中立ではない。「欧州出身」という経歴は、それだけで、ある種の信頼を担保してしまう。蓄積された環境が、経歴を担保し、経歴が、見る目を曇らせる。実力以前の、構造の力だ。

だからアシトの戦いは、二重に重い。環境の差を埋めながら、その差ゆえに曇った眼差しも、こじ開けなければならない。#5 の「見出されないなら、見させる」が、ここでも効いてくる。


6. それでも、海を渡る個

ただ——ダイアモンドの本を、宿命論として読んではいけない。環境が条件を決めるのは確かだ。けれど、人は、自分の環境を選び直すことができる。

「海を渡って良かった。日本にいては見られなかった」——環境を、選び直す

福田は、フットボールの天井を見るために、海を渡った。日本にいては見られなかった景色。それを見るために、自分から環境を移した。生まれた環境は選べなくても、次に立つ環境は、選べる

そして、選び直した先で、こうやって言い切る者がいる。

「日本人でもやれるぜ」——環境決定論を、個がねじ伏せる

「日本人でもやれるぜ」。絶対無理だと言われつづけた環境の差を、結果でねじ伏せる。環境は強い。でも、環境がすべてではない。条件を引き受けたうえで、それでも超えにいく個が、環境の物語に穴を開ける。

そして、一人がこじ開けた穴は、やがて道になる。「日本人でもやれる」と最初に証明した者の足あとを、次の世代は、道として歩ける。誰も通っていない場所を進んだ個が、いつのまにか、後続の環境そのものになる。道は、与えられない。最初の一人が、自分の足で作る。そしてその道が、次に来る誰かの「当たり前」になっていく。


7. 環境は、設計できる

ダイアモンドの本の、いちばん希望のある含意は、ここだと思う。強さが環境の産物なら、環境のほうを設計できる。

スペインのピラミッドが何世代もかけてできたなら、育つ環境は、意図して作ることもできるはずだ。アオアシのエスペリオンが描こうとしているのも、たぶんそれだ——たまたまの才能を待つのではなく、才能が育つ環境そのものを、設計する

6 で視た「育てる熱」は、個人の営みだった。#7 で視ているのは、その熱が積み重なって、やがて環境になるという話だ。一人の指導者の熱が、ピラミッドの一段になる。時間の蓄積とは、そうやって作られていく。


8. 観測と、環境

最後に、OrbitLens に繋げたい。

観測のいちばん危ういところは、強さを、個人だけに帰属させてしまうことだ。「この人は優秀だ/低い」というスコアは、その人が置かれた環境を、たいてい無視する。恵まれた環境で積んだ蓄積も、痩せた環境で独りで耐えた粘りも、同じ「個人のスコア」に丸められてしまう。

これは、#5 の無意識の差別と地続きだ。環境の差を見ずに個を測ると、環境格差を、才能格差と読み違える。スペイン出身というだけで高く、日本出身というだけで低く——そんな観測は、構造をそのまま温存する。

だから EIS は、ドメインを分けて観る。混ぜない。同じ環境のなかでの相対と、組織を超えた絶対を、分けて持つ。そして、時間の蓄積(生き残ったコード)を、その人の文脈ごと観ようとする。強さを個人に押しつける前に、どんな環境が、それを可能にしたのかを問う。観測は、環境を見落とした瞬間に、差別の装置になる。

強さは、環境と蓄積の産物だ。だから、個を測る前に、環境を視る。そして、より良い環境のほうを、設計する。

生まれた環境は選べない。けれど、次に立つ環境と、誰かのために作る環境は、選べる。


取り上げた本

  • ジャレド・ダイアモンド『銃・病原菌・鉄』(草思社文庫) — Amazon
  • ピエール・ブルデュー『ディスタンクシオン——社会的判断力批判』(藤原書店) — Amazon

次回予告

次回 #8 も、アオアシ。スペインの名門クラブ——その伝統と矜持が、いつ「本質を見失った王国」へと傾くのか。勝つことが目的化したとき、無限ゲームだった文化は、有限ゲームに飲まれる。ジェームス・カース『Finite and Infinite Games』と、ベネディクト・アンダーソン『想像の共同体』と並べて読む。


本記事は小林有吾『アオアシ』、ジャレド・ダイアモンド『銃・病原菌・鉄』、およびピエール・ブルデュー『ディスタンクシオン』への個人的な考察です。

OrbitLens / machuz