Skip to content

Latest commit

 

History

History
155 lines (104 loc) · 6.89 KB

File metadata and controls

155 lines (104 loc) · 6.89 KB

Orbit — 設計思想

ターゲット

AI と一緒に開発する個人開発者・小規模チーム。

今はここに集中する。エコシステムと実績が育てば、対象は自然に広がる。

核心: 人間の最終責任

コードの最終責任は人間にある。AI がどれだけ進化しても、これは変わらない。

  • AI がレビューもする時代が来ても、プロダクトの責任を負うのは人間
  • だから人間は「必要なときに読んで、正しさを判断できる」状態を維持しなければならない
  • 法律のように、普段は読まなくても、読めば理解できる状態を保つ

「AI が書いて、人間が読む」の位置づけ

「AI が書いて、人間が読む」は 今この思想が必要とされる理由の説明 であって、思想そのものではない。

思想の核は 「読む側への最適化」。 読み手が人間でも AI でも、WHAT が明確で構造が予測可能なコードが最も価値がある。

だから Orbit は「書きやすさ」より「読みやすさ」を優先する。

理解負債をゼロにする

AI にコードを任せると、開発スピードは上がる。 でも、人間の理解が追いつかないまま進むと「理解負債」が溜まる。

理解負債 — コードベースに対する人間の理解が、実装の進行に置いていかれること。

技術的負債はリファクタリングで返せる。 理解負債は、コードを読み直すところからやり直すしかない。もっと厄介だ。

読む頻度が下がるほど規約の価値は上がる

毎日読む人:   文脈が頭にある → 多少バラついても追える
たまに読む人: 文脈がない → 構造が揃っていないと追えない
  • AI に任せる範囲が広がれば、人間がコードを読む頻度は下がる
  • 理解負債は「コードを読まない期間」に比例して溜まる
  • 規約で構造が揃っていれば、間が空いても「前と同じパターンだ」と即座に復帰できる
  • 規約は理解負債の利子をゼロにする仕組み

読みやすさの定義

Orbit が言う「読みやすい」とは、具体的にこういうことだ:

1. コードを自然言語に翻訳できる

一行一行を見て、日本語(あるいは英語)に訳せること。

// ✅ 訳せる
// 「params から id を取って、API を叩いて、結果を返す」
const { data: user } = useUser(params.id);

// ❌ 訳せない — 裏の知識がないと意味がわからない
export const loader = createLoader("users", { include: ["posts"] });

2. 隠すな、階層化しろ

「全部見せる」でも「全部隠す」でもない。情報を階層化する。

全部隠す                    階層化                    全部見せる
Rails                      Orbit                   TanStack
resources :users     export function getUser()    useQuery({ queryKey,
                                                    queryFn, staleTime,
                                                    gcTime, retry, ... })

WHAT と HOW の区別

問い
WHAT このコードは何をしているか? 「ユーザーを取得する」
HOW それはどう実現されているか? 「HTTP POST で /rpc/users/getUser に飛ぶ」

「何をしているか(WHAT)」はコードに書いてあること。 「どうやっているか(HOW)」は抽象化してよい。ただし境界を明示すること。

  • 「境界の明示」= server.ts というファイル名。「ここに書いた関数はサーバーで動く」ことをファイル名が示す
  • HOW(HTTP 通信、Hono、RPC 変換)は知らなくていい

読む人の理解度に応じた階層

Level 1: コードを読んで「何をしているか」がわかる → 誰でも
Level 2: 「なぜそう書くのか」がわかる → 規約を学べば
Level 3: 「裏で何が起きているか」がわかる → 掘れば

3. どこでも同じパターン

一箇所読めば、他のファイルも同じ構造だと予測できる。

routes/users/page.tsx    → hooks を呼んで JSX を書く
routes/posts/page.tsx    → hooks を呼んで JSX を書く(同じパターン)
routes/comments/page.tsx → hooks を呼んで JSX を書く(同じパターン)

パターンが揃っていれば、2つ目以降は「翻訳」すら要らない。見た瞬間にわかる。

正しい書き方が1つしかない

API の自由度が高いと、AI は毎回違う書き方をする。 同じチームの中でも書き方がバラつく。レビューのたびに「これどっちの書き方?」と考える羽目になる。

Orbit は、同じことをやるなら同じコードになるように API を設計する。 AI が書いても人間が書いても、出てくるコードが同じ。 だからレビューで「書き方の違い」に悩まず、「ロジックが正しいか」に集中できる。

規約は道標であって壁ではない

Orbit の規約は、こうすればうまくいくという舗装道路だ。

  • デフォルトに従えば、シンプルで読みやすいコードになる
  • 規約から逸れることは禁止しない。柔軟性はオプションとして残す
  • 縛りたい人はカスタム lint で厳しくすればいい

Rails のように規約に従わないと辛くなる設計ではない。 道を歩けば快適だが、脇に逸れることを禁止しない。

React Compiler 互換

React Compiler(自動メモ化)は、不要な再レンダリングを自動で排除してくれる。 しかし、既存のライブラリの多くは Rules of React に違反しており、Compiler と共存できない。

React Hook Form は Proxy ベースのリアクティビティが壊れた。 TanStack Table はクラスインスタンスのメモ化失敗で連鎖的に最適化が無効化された。

Orbit は最初から Rules of React に厳密に従って設計する:

  • useSyncExternalStore で外部ストアと同期する
  • Proxy ベースのリアクティビティを使わない
  • クラスインスタンスを hooks 内で露出しない
  • hooks の戻り値を後から変更しない

後追いで互換性対応に苦しむのではなく、設計段階で解決する。

まとめ

従来のフレームワーク Orbit
書きやすさを追求 読みやすさを追求
短く書ける 読めばわかる
自由に書ける 正しい書き方が1つ
規約で隠す 規約で階層化する
人間が書く前提 人間が最終責任を持つ前提