世界を動かす技術を、日本語で。

NIHは誤った依存関係よりも安価です

概要

  • 依存関係 には見落とされがちな コスト が存在
  • TigerBeetleのような ゼロ依存方針 の事例紹介
  • 依存関係評価のための 5つのフレームワーク 提示
  • 良い依存例とその評価基準の具体的解説
  • 依存選択時は 批判的思考 と慎重な判断が必要

コーディングにおける依存関係の誤解

  • 依存関係 は「無料の機能」と誤解されがち
  • 実際は 学習コスト導入コスト が発生
  • 複雑な依存 は自作よりも導入・習得が困難な場合も
  • インターフェース変更 による自前コードの大幅修正リスク
  • クライアント環境への配布デプロイの複雑化 問題
    • コンテナ化バンドル 設定の煩雑化
    • 本来の機能とは無関係な「新しい車輪」の再発明に繋がることも

TigerBeetleのゼロ依存アプローチ

  • TigerBeetleVanilla Zig のみで構築、 ゼロ依存方針
  • 依存関係は サプライチェーン攻撃安全性・性能リスクインストール遅延 の原因
  • インフラ基盤では 依存コスト がスタック全体に波及
  • 少数精鋭の標準ツール 運用によるシンプルな開発環境維持
  • Zig への投資で 新規課題 にも迅速対応

依存関係評価フレームワーク

  • 「自作シリコンウエハー論」等の極論は置いておく

  • すべての依存が同等ではないという前提

  • 5つの評価軸 を提案

    • 普及性 (Ubiquity)
      • 対象環境に 既に存在 するか
      • 導入やデプロイ の複雑化有無
    • 安定性 (Stability)
      • 破壊的変更非推奨化 の頻度
    • 深さ (Depth)
      • API・インターフェースの 裏に隠れた機能量
      • 自作困難度
    • 使い勝手 (Ergonomics)
      • 宣言的抽象化 か、APIの 快適さ
    • 水密性 (Watertightness)
      • 抽象化の漏れ の有無
      • 基盤技術 を意識する頻度
  • 依存推奨者は 使い勝手 のみを強調しがち。他の観点も重要

良い依存関係の例と評価

  • POSIXシステムコール

    • 普及性 :Linux, Android, macOS, BSD等で利用可
    • 安定性 :極めて高い
    • 深さ :open一つで数十万行のカーネルコード
    • 使い勝手 :やや古いが許容範囲
    • 水密性 :高いがストレージ仕様差に注意
  • ECMA-48ターミナル制御コード

    • 普及性 :ほぼ全ての主要ターミナルエミュレータで対応
    • 安定性 :1991年以降変更なし
    • 深さ :自作標準作成は現実的でない
    • 使い勝手 :エスケープ文字の煩雑さはあるが許容範囲
    • 水密性 :非常に高い
  • Webプラットフォーム(Web API, HTML, JS, CSS等)

    • 普及性 :地球上で最も普及したアプリ・ドキュメントプラットフォーム
    • 安定性 :後方互換性維持に注力
    • 深さ :ブラウザ自作は非現実的
    • 使い勝手 :多少の古さはあるがドキュメントとツールが充実
    • 水密性 :ファイル・音声・動画以外はほぼ水密

依存関係選択の心得

  • 悪い依存関係 の例は読者の練習問題として残す
  • コスト便益 を常に批判的に評価
  • 賢明な選択 の重要性

Hackerたちの意見

完全に同意だね。どの依存関係が良いか悪いかを見極めるのは、最も重要なスキルの一つだと思う。私の意見だけど、有料の依存関係はだいたい悪いことが多い。なぜなら、その依存関係を提供している会社には、ユーザーを縛りつけるインセンティブがあるから。あと、「依存関係ミニマリズム」っていうのはいい名前だね。

それに、有料の依存関係は通常、サポートが一つのソースしかないから、会社が倒産したり、製品のサポートをやめたりすると、厳しい状況になるよね。ほとんどの会社が永遠に続くわけじゃないから、自分のプロジェクトがその会社のサポート能力に依存していると、影響を受けるかどうかを考えなきゃいけない。

私の意見だけど、有料の依存関係はだいたい悪いことが多い。なぜなら、その依存関係を提供している会社には、ユーザーを縛りつけるインセンティブがあるから。ベンダーロックインは、購入したコンポーネントだけでなく、メンテナンスを引き受けたくない組織のFOSSにもリスクがある。サードパーティのコンポーネントを組み込むチームがリスクを管理し、適切な代替案を見つけて、ソリューションをモジュール化する責任がある。

有料の依存関係が悪いなら、もしかしたらその価値に見合った金額を払ってないのかも。私のコードに依存関係があるなら、それをサポートするのが自分の仕事だと思っている人がいるといいな。サポートするために十分な人数が雇われているか、あるいはそのコードに自分の価値やアイデンティティが強く結びついている人がいて、誇りを持ってサポートしてくれる必要がある。放置される可能性のある会社は要らないし、「バグは私の問題じゃない。ソースがあるから、自分で直せば?」って言うフリーソフトウェアの作者も要らない。そんな選択肢なら、自分で書いた方がマシだね。

非エンジニアのチームから強制された悪い有料の依存関係を経験したことがある。コミュニティで広く使われている「オープンコア」タイプの依存関係には、いくつか良い経験があるよ。例えば、sidekiqとかね。そういうのは、突然消えちゃう可能性が低いから、他の人たちにフォークされてメンテナンスされるだろうし。お金を払うメリットは、オーナーや会社が安定している限り、無給のソロメンテイナーが燃え尽きてログインしなくなる心配をしなくていいことだね。

https://opensourcemaintenancefee.org/ は、プロジェクトを続けるためのインセンティブとして支払いを利用しているから、依存関係を更新できるんだ。 .NET Rocks! が彼らにインタビューしたよ。 https://www.dotnetrocks.com/details/1948

開発者はこう言って、AWS LambdaやVercelにデプロイするんだよね、ほんとに。

そのアイデアは、もしお金を払っているなら、依存関係は何らかのオープンスタンダードやインターフェースを実装する必要があるってことだと思う。少なくとも他の実装に移行できる選択肢があるから、ベンダーはこの要件でロックインできないんだよね。ちょっと高くつくかもしれないけど、移行する選択肢は常にあるから、脅しとして存在しているだけなんだ。

エネルギー業界にいるから、依存関係は意図的に避けてるんだ。実際に変更をレビューしなきゃいけないからね。これを大いに助けてくれているのがAIコードアシスタンス。主な使い方は、ツールチェーンのコードや設定生成のためのCLIツールを書くことだよ。外部の依存関係を使わずに、生活を楽にするためのものなんだ。例えば、LLMを使ってopenapiドキュメントを作成して、それをGoのnet/http + FileServerで提供するから、標準ライブラリから出ることはない。もちろん、LLM自体はサードパーティの依存関係だけど、それを使ってCLIツールを書いてコード生成をするから、実際にはコードを見ることはないんだ。それにより、そのCLIツールの品質はあまり重要じゃなくなる。出力が大事だからね。もちろん、限界はあるけど。フロントエンドエンジニアたちがReactを使えない世界に住みたいとは思わないだろうけど、彼らの製品は外部のものとして扱われているからね。とにかく、「生活の質」を向上させる依存関係を使わないようにエンジニアを止めるのは、彼らの生活を楽にする何かを与えるとずっと簡単になるよ。

LLMは訓練された依存関係のコードを吐き出すだけじゃないの?それって、依存関係をフォークして自分のものとして扱うのと何が違うの?

著者はニュージーランド出身なんだ。これを理解するには、あそこに根付いている「ナンバー8ワイヤー」の考え方を知っておく必要があるよ。

今日は学んだこと。オーストラリアの「She'll buff out, mate」っていうミームを思い出した。

Hacker Newsで議論の続きを見る