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

オープンソースプロジェクトが消えてしまう愚かな方法

概要

  • オープンソースプロジェクトの多くがメンテナンスされなくなり「死んだ」状態に陥る現実
  • プロジェクト停止の背景には多様なパターンが存在
  • メンテナー不在や企業の放置、資金切れなどが主な要因
  • 外見上は健全に見えても実態は停止しているケースも多い
  • 依存関係や外部要因による間接的な「死」も頻発

オープンソースプロジェクトが「死ぬ」多様なパターン

  • 人間のメンテナー不在

    • メンテナー離脱。最後のコミットから数年経過し、issueが蓄積するも放置状態
    • 企業による孤児化。チーム解散や事業転換で管理者不在となり、READMEも更新されず
    • 学術プロジェクト孤児。学生の卒業や研究室の人員交代で誰も引き継がず
    • 資金切れ。助成金やスポンサー終了で開発停止、READMEのロゴだけが残る
    • メンテナーの転職。新しい職場の規約や業務多忙で活動停止
    • 継承の行き詰まり。引き継ぎ希望者はいるが権限移譲できず、公式手続きも長期化
  • メンテナーはいるが実質停止

    • バーンアウト停滞。小規模な修正は続くが、本質的な対応は行われない
    • ベネボレントゾンビ。Botによる自動コミットだけが続き、実質的な開発者不在
    • 管理権争い。共同メンテナー間の対立でプロジェクトが凍結
    • 部族知識消失。主要開発者の離脱で誰もコア部分を触れず事実上の凍結
    • 有害なゲートキーピング。排他的なメンテナーの態度で後継者が育たず
  • 悪意や事故による乗っ取り・破壊

    • 乗っ取り。悪意ある人物が権限を獲得し不正コードを混入
    • プロテストウェア。正当なメンテナー自身が意図的にパッケージを破壊
    • リリース不能。権限やリリース環境の喪失で新バージョン公開不可
    • 再現不能なビルド。過去のビルド環境消失で再リリース不可
    • シャドウメンテナンス。実際の開発はクローズドで行われ、公開リポジトリは形骸化
  • バージョン・依存関係・レジストリ問題

    • メジャーバージョン孤立。古いバージョンが主流のまま新バージョンが普及せず
    • レジストリ孤児。レジストリ上のURLが消失し、ソース確認やフォークが不可能
  • 外的要因による強制停止

    • 制裁による孤立。地政学的要因でアカウント凍結、公開不可
    • Takedown(削除)。法的要請や商標問題でレジストリやホストから削除
  • プラットフォームや依存の変化による陳腐化

    • プラットフォーム孤立。EOLランタイムや消失した依存環境に縛られる
    • 依存の「死」。下位依存の停止が連鎖的に影響
    • APIの消失。外部APIやサービスの終了で機能消失
    • 役割の消滅。標準化や言語機能拡張で不要化
  • プロジェクトの分裂・分岐

    • フォークの膠着。意見対立や離脱で複数分岐し、どれも主流にならず停滞

オープンソースの「死」のサインとその見分け方

  • 表面的な活動指標だけでは実態を把握できない

    • Botによる自動化や小規模な修正が続いていても、実際には開発停止
    • issueやPRが放置されている場合、内部で既に「死んでいる」可能性
    • レジストリ上で解決できても、ソースや運用体制が消えているケース多数
  • プロジェクトの健全性評価の限界

    • 活動履歴やリリース頻度だけでは、継続的な人的関与や将来性を測れない
    • 継承・権限移譲の仕組みや、ドキュメントの整備が不可欠

まとめ:オープンソース依存のリスクと対策

  • 依存パッケージの「死」に備える重要性

    • 依存先の健全性だけでなく、引き継ぎ体制やドキュメントの有無も確認
    • 可能な限り代替手段やフォークの選択肢を用意
    • オープンソースの「死」は多様な要因が絡むため、単一指標での判断は危険
  • コミュニティの維持と健全なガバナンスの推進

    • 継承・権限移譲の手続き明確化
    • オープンな開発体制と新規参加者への配慮
    • 構造的なリスクを理解し、長期的な運用と保守を意識する姿勢

Hackerたちの意見

リストに載ってないけど、「過信したフォーク」ってのがあるよね。誰かが既存のプロジェクトを怒りや傲慢からフォークするけど、そのフォークは結局重要な支持を得られずに消えていく。逆に、OpenSSHやJenkins、LibreOfficeのように、元のプロジェクト(SSH、Hudson、OpenOffice)が傲慢だったけど、コミュニティが移っていくうちにすぐに忘れられちゃったってのがあるね。

時々、フェードアウトする代わりに、良いことをするレイジフォークが生まれることもある。2014年か2015年のio.jsのノードからのフォークが思い浮かぶ。確か、ノードを前に進めるために必要な変更や改善がたくさんあったけど、Joyentが足を引っ張ってたんだよね(V8のアップグレードがその一つだったかもしれないけど、もう長いこと前のことだから確かには覚えてない)。コアの開発者たちも、全てが進むのが遅いことにうんざりしてた。だから、彼らのグループがノードからio.jsをフォークして、アップグレードや他の改善を行った結果、最終的にはそれがコアノードに戻ってきて、みんなが満足する結果になった。でも、少しでも状況が違っていたら、みんながノードじゃなくてio.jsを使っていたかもしれないと思う。

このリストにはいろんなエッジケースがあるね。使ったプロジェクトの中では、ほとんどがメンテナーが興味を失ったり、姿を消したりすることが多い。フォークはいつも解決策として提案されるけど、いくつかのプロジェクトはフォークを敵対的な試みとして扱うんだ。重要なリクエストをマージしたくないメンテナーがいて、フォークしようとする人に対して非常に敵対的になったこともあったよ。もしメンテナーがプロジェクトとそのユーザーを自分の小さな帝国のように扱ったら、状況は悲惨になるよね。

フォークの「反対側」がそれを少しネガティブに見るのは全く驚きじゃないね。フォークを計画している人も、メインラインのプロジェクトのメンテナーをその瞬間、少しネガティブに見てるだろうし。彼らはどれだけ敵対的になってもいいけど、それはフォークの決定にはほとんど関係ないみたい。もしメインラインがパッチを受け入れないとか、別の方向に行きたいなら、フォークするのは全然妥当だし、彼らの帝国を維持できる。それでいいんじゃない? 東に行きたくないなら、東に行くフォークがあれば、同じく東に行きたいユーザーも満たされるし。

ライセンスがオープンソースなら、メンテナはフォークされると文句を言うことしかできないよ。自分の(比喩的な)耳を塞いで、作業を続けるしかないんだ。

それからJekyllがあるけど、完全に死んでるわけじゃないけど、確実に衰退してるね。GitHubがさらなる開発や4.xリリースへのアップグレードをサポートしないせいで、行き詰まってるみたい。

GitHub Pagesの問題を無視すると、Jekyll 4.xでやってほしいことって何?

昔は「オープンソースプロジェクト」って言うと、「問題があったから、これが解決策だ。同じ問題を抱えてる人は自由に使ってね」って意味だったんだよね。最近はもっと、 - 個人ブランドを築く - スキルをアピールする - 誰かを出し抜こうとする、たいていは自分のPRをマージしてくれなかったから - 時にはただ楽しむため そして大きな組織で働いてると、「これ、うちのエピックのどれかに似てるから使い始めよう、24/7のサポートを要求しよう」ってことも多い。

昔は、ウェブって趣味を匿名のサポートしてくれる人たちと共有する場所だったし、暗号通貨は数字を使って賢いことをすることを意味してた。私の経験上、欲望やお金、サイコパスがダンバー数を超えるものを台無しにするのはほぼ確実だよね。遊び場が麻薬王たちに乗っ取られるのは悲しいことだ(比喩的にね)。それに対する答えは持ってないけど、私の中心的なトラウマだよ。

同じようなスタイルのプロジェクトはたくさんあると思う。ただ、開発者の数は爆発的に増えて、ニッチで解決策のない問題の数は劇的に減ったね。

共有から伝道へと明確にシフトしたよね。例えば、Cは共有され、C++は伝道された。違いは、人々に自分のものを採用させるためにかける努力だよ。Javaなんかは超伝道されたし、サンはそれで運命が逆転するかもって思ってた。Linuxは最初は「どうぞ、うまくいくといいね」って感じだったけど、そこからエコシステムを作る人たちが集まってきた。

依存関係の膨張や依存関係の腐敗が、解決策をあまり永続的でなくし、メンテナンスの負担を増やしてる。依存関係ゼロの古いプロジェクトはまだ残ってるけど、変動する依存関係に基づいて作ったプロジェクトは腐ってきてる。

それに、修正を求める人はたくさんいるけど、実際に貢献する人はあんまりいないんだよね。

このフレーミングは、「問題解決型」プロジェクトと「パーソナルブランド」プロジェクトの比率が変わったと仮定しているけど、ちょっと反論したいな。根本的な比率は大体同じだと思うよ。変わったのは、何が公開されるかってこと。オープンソースプロジェクトを運営する作業(問題の整理、セキュリティの公開、貢献ガイドライン、CI、リリースのペース、依存関係のメンテナンス)は、元の問題を解決する作業よりも遥かに大変なんだ。「私のプライベートなワークフローツール」って考えの人たちは、そういう税金を負担できないから、ますます公開しなくなってる。一方で、ブランド構築のメリットを求める人はそれを引き受ける意欲があるから、ブランド構築が目的なんだよね。だから、目に見えるOSSの風景はブランドカテゴリーを過剰に表現している。解決策の共有が死んだわけじゃなくて、解決策の共有には10倍のメンテナンスコストがかかるようになったから、ほとんどの人がそれを避けるようになったんだ。自分のdotfilesでもそういうのを見てるよ。小さなツールがいっぱいあって、「共有」ってまだ「gistを落とす」って意味だったら喜んで共有するんだけど、もうそうじゃないんだよね。

15年前、GitHubは「コードを書いてピザをドアの下に滑り込ませる」みたいな同じ考えの開発者にとって、強いシグナルだったんだよね。でも、時間が経つにつれてそのシグナルの意味が薄れて、みんな他のこと、例えばスターとかブランドとかを重視し始めた。フロントエンドのマーケティング系の人たちとJSフレームワークの爆発が、この流れを引き起こしたんじゃないかな。今や、どこにでもバイブの合ったプロジェクトがあって、良いものと悪いものを見分けるのが本当に大変だよ。今でもGitHubを使ってるけど、あのスターがまだ一部の市場では有効だと思ってるのかもしれない。でも、もしかしたら自分を騙してるだけかも。あるいは、ロケット絵文字の発明がこの現象の原因かもしれないね。

大体、CSのキャリアアドバイスはいつも「自分のプロジェクトをいくつか見せること」だったから。完全に一人でやるか、貢献者になるか。時間が経つにつれて、企業文化や履歴書重視の開発文化も影響を受けてきたんだよね。

「古いって呼んでくれてもいいけど、昔は『オープンソースプロジェクト』っていうのは『問題があったから、これが解決策だ。同じ問題を抱えてる人は自由に使ってね』って意味だったんだ。最近はもっとこうなってる: - パーソナルブランドを築く - スキルを見せる - 誰かを出し抜こうとする、特に自分のPRをマージしなかったから - 時にはただ楽しむために。Linux、MySQL、PostgreSQL、Apache、Python、ほとんどのウェブブラウザやインターネットで使われている大規模なサーバーコードは、ずっと「オープンソースプロジェクト」だったけど、単に人々がその解決策をそのまま共有するだけじゃなかった。役立つプロジェクトは常にコミュニティを育ててきた。中には露出や履歴書のためにオープンソースプロジェクトを作ろうとする人もいるけど、それは通常、メンテナーが消える心配をしなきゃいけないほどのトラクションを得るプロジェクトとは関係ないと思うよ。あなたは2つの異なる概念を混同してるんじゃないかな。

それは間違ってないけど、使ってるライセンスがめっちゃ重要だよ。もしコードが本当にオープンソースで、OSSライセンスなら、そのまま使ったり、学んで自分で書いたりできるよ。アプリにそのまま組み込むこともできるしね。コードはそのままにして、依存関係を外せばいい。フリーソフトウェアはまた別の話だよ。GPLとかはウイルスみたいなもんだから、GPLソフトを使って上記のことをすると、いろいろ影響が出るよ。学ぶだけでもリスクがあるし、リライトするなら変数名の変更だけじゃダメだよ。もし昔ながらのやり方で、「好きにやって、これを仕事にするつもりはない」って感じで、みんなに実際に利益をもたらしたいなら、フリーライセンスよりOSSライセンスをおすすめするよ。一方で、ターゲットが他のフリー開発者なら、フリーライセンスが理にかなってる。将来的にプロジェクトを商業化するつもりなら、AGPLみたいな攻撃的なフリーライセンスがいい選択だね。結局、ライセンスの選択は自分の目標に合ったものにすべきだよ。

すべてが週単位でメンテナンスされることを期待されるのは馬鹿げてるよね。昔は、一度コードを書いたらそれで終わりで、何年も、時には数十年後でも動き続けるソフトウェアスタックがあったんだ。例えば、https://sapaclisp.common-lisp.dev/ では1993年に書かれたコードをダウンロードして、最新のSBCLに読み込むことができるよ。

時代が違うね。セキュリティアップデートのためのパッチが必要になるのが急速に増えてる。

これだよね。根本的な問題は、人々がすべてのソフトウェアは必ず信頼できないものだと考えていることなんだ。実際には、自分たちが完璧に信頼できるソフトウェアを作れないから、他の人も同じだと思ってしまう。そんな狭い視野だと、ソフトウェアは常にアップデートが必要だと思うよね。メンテナンスする人が、終わりのないモグラ叩きをしているようなもんだから。すべての技術が変わるわけじゃないし、低レベルのエンジンAPIは非常に安定していて、基本的に変わらないことが多い。じゃあ、その上に作られたソフトウェアが変わる必要はあるの? OPによると、AIの混乱時代に必要な信頼できるソフトウェアは「死んだプロジェクト」のカテゴリーに入るらしい。だから、彼らは他のAIの混乱の上にAIの混乱を作る運命なんだ。頑張ってほしいね。

直面している現実:何年も「ただ動く」ソフトウェアは、アプリケーションレベルだけじゃなくてエコシステムレベルでの依存関係の衛生が必要なんだ。Common LispやC、あるいはほとんどのGoをそんな風に書けば、20年後もコードは動くよ。でも、現代のフロントエンドフレームワークやバックエンドフレームワークに依存した瞬間、そのリリースペースに従わなきゃいけなくなる。しばしば「年に2回、ものを非推奨にします」って感じだし。フレームワークの作者には自分たちのインセンティブ(関連性、雇用、採用の流れ)があって、あなたのプロジェクトの長寿を最適化しているわけじゃない。今日、20年持つコードを書く唯一の方法は、(a) 本当に安定性を重視するエコシステム(Lisp、C、一部のErlang/OTP、Postgres)で作業するか、(b) 現代のスタックのコストを受け入れて、それに明示的に予算を組むことだ。ほとんどのチームはどちらもやらないから、プロジェクトが一番早く腐るんだ。

またこれか!ソフトウェアは成熟していて、かつ役に立つこともあるんだ。成熟していて役に立つソフトウェアに出会ったら、まずはそのGitリポジトリを自分のストレージにクローンして、プロジェクトの状態を保存するべきだよ。その後、自分のリポジトリで作業して、コミュニティのためにプルリクエストを出すべきなんだ。でも、誰もそのプルリクエストを使わないなら、次に進むべきだね。

言語によって、こういうことに対する期待や文化は全然違うよね。npmパッケージが2年間更新されてなかったら、ちょっと疑っちゃう。ダウンロード数をチェックしたり、GitHubのイシューを見たりして、どんな問題があるか調べるし、他に使われてるものがないかGoogleで探す。clojarsのパッケージが6年間更新されてなかったら、もう考えもしないよ!

インターネットに接続されてるものや、サードパーティのシステムと統合されてるものは、永遠に定期的にメンテナンスしなきゃいけないんだよね。自己完結型のものはずっと持つけど。アプリが必要なものは買わないようにしてるのが主な理由。だって、いつかそのアプリがメンテナンスされなくなって、動かなくなっちゃうから、ハードウェアが壊れちゃうんだよね。

小規模なオープンソースプロジェクトを潰すパターンの一つで、あまり言及されないのが、最も声の大きいユーザーによるスコープクリープだね。特化したツールが一つのことをうまくやってると、周辺機能のPRや問題が増えてくる。メンテナーは反応したいから、それをマージしちゃうんだよね。6ヶ月後には、プロジェクトがメンテナンスが難しいスイスアーミーナイフになって、元々の使い方が複雑さの下に埋もれちゃう。解決策は、「このプロジェクトはこういうもので、こういうものではない」と明確に書かれたCONTRIBUTING.mdを作ることと、「スコープ外だけど、別のプロジェクトとしては素晴らしい」と言って問題を閉じることに慣れることだね。ソロメンテナーだと、閉じた問題が誰かを失望させるように感じるから、言うは易し行うは難しだけど。

そんなプロジェクトに時間を投資してきたけど、道を見失って完全にメチャクチャになっていくのを見るのは心が痛むね。フォークして元の根源に戻りたくなるけど、それにはさらに多くの時間を投資する必要があるから、また別の問題が出てくる。

本当にその通り。みんながそのプロジェクトが何をすべきかについて自分の考えを持っていて、その実装が特定のユースケースには素晴らしいけど、他の人には全然ダメだって説明するのが難しい。AIがこれをさらに悪化させてるよね。

ソロメンテナに「これが進む方向だよ」って言っても、彼らはみんなを喜ばせるために小さな貢献を受け入れ続けるだけなんだ。悪いアイデアじゃないけど、結局はめちゃくちゃなゴミの山になっちゃう。

あんまり興味のない機能をPRで投げ込んでくる人もいるよね。その後、その提出者が去って、時間が経ったらその機能に関するバグやリクエストが報告され始める。

通常、メンテナは他のことに移ってしまって、そのプロジェクトが彼らにとって重要じゃなかったから、正式に引き継ぐことはなかったんだ。どこに、私がプロジェクトを引き継げるメンテナのプールがあるの?

もっと重要なのは、そういう見込みのあるメンテナが、あなたが築いた評判を使ってマルウェアを出荷することがないってどうやって知るの?オープンソースプロジェクトにとって、死ぬことが最悪の事態じゃないからね。

最近1年くらいで悪化してるパターンがあるんだけど、サードパーティの「セキュリティスキャナー」からのドライブバイPRが増えてる。先週も来たよ — マークダウンの画像リンクを自分たちのスキャンサービスに追加するだけの1行の差分で、「94/100 確認済み安全」って形式の監査報告書が添えられてた。彼らが指摘した「高い重大性の発見」は、実は私たちのREADMEの中でプロンプトインジェクションに対抗する方法を説明してる部分だったんだ。正当なドキュメントを脆弱性としてスコア付けして、報告書を詳しく見せようとしてた。経済的には理解できるけど、受け入れられたPRは実際のOSSリポジトリに永久的なバックリンクをもたらすし、大抵のメンテナーはじっくりレビューする時間がないからね。1つ受け入れたら、さらに5つ来る。Dependabotの雪崩と組み合わさると、現代のメンテナーの負担はコードを書くことじゃなくて、ボットや成長ハッカーのトリアージなんだよね。彼らはあなたの貢献ポリシーをSEOのファネルとして扱ってる。ゼロ依存の哲学でも完全には逃れられないし、PRはREADMEのバッジやトランジティブスキャナーを狙ってくるから。

これは基本的にGitHubでホストされているオープンソースの問題だよね? GitHubは組織外の人からのPRをオフにすることを許可してないから。昔からこのポリシーを変えてほしいと頼まれてるのに、全然反応がないから、別の場所にプロジェクトをホストするのも一つの手だよね。そうすれば、同じポリシーやスパマーの量が少ないところでできるし。もちろん、GitHubでホストする利点は得られないけど、そこにホストするコスト/ベネフィット比は時間とともに変わってきた。

この記事は素晴らしいし、分類もいいけど、タイトルはちょっと好きじゃないな。オープンソースプロジェクトがフェードアウトしていく普通のパターンって感じだね。でも、プロジェクトを復活させたり、活性化させたりする方法もいくつかあるよ。個人的に好きなのは、すごくマイナーだけど、私がウィキペディアの記事を始めたからっていうのもあって、これだね。https://en.wikipedia.org/wiki/Slirp#User-space_networking_an...

最近の現象として、左派のエントリー主義者や活動家が、CoCを使ってプロジェクトを乗っ取ったり、政治的に合わないメンテナを追放したりすることがあるね。