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

ソフトウェアの劣化

概要

  • Software rot は環境変化によるソフトウェアの劣化を指す概念
  • 継続的なメンテナンスが前提となる文化の問題提起
  • 安定した環境 への依存が長寿命ソフトウェアの鍵
  • 古典的プラットフォームは 保守不要 な場合が多い
  • 新しい環境では メディアアーキオロジー 的な対応が必要になることも

ソフトウェアロットと環境信頼性

  • Software rot とは、ソフトウェアが依存する環境の変化によって動作不良や劣化が発生する現象
  • 例として、10年前に作成されたプログラムが ライブラリの後方互換性欠如 により動作しなくなるケース
  • この考え方は「 継続的な保守が必須」という文化を助長
  • より良いアプローチとして、ソフトウェアが依存する 環境自体の信頼性 に着目する視点の提案
  • 不安定な基盤(例:頻繁に更新されるプラットフォーム)への構築は 沼地に家を建てる ことに例えられる

安定したプラットフォームの重要性

  • 実際には、 沼地(アクティブな開発環境) に構築せざるを得ない場合も多い
  • それでも、 静的で堅固な仕様 を持つ「ベッドロック」プラットフォームとの互換性確保が有効
  • ゲームやデモなど、リリース後の 保守を前提としない ソフトウェア文化では特に重要

古典的プラットフォームと現代環境の違い

  • DOSNES 等のクラシックプラットフォーム向けプログラムは、リリース後の 追加保守不要 が一般的
  • 一方、 Linux のような現代的環境では、10〜20年後には 動作不能 となるケースが多発
  • その結果、 特定バージョンの古いライブラリ を探し出すなどの メディアアーキオロジー的作業 が必要になる場合も

まとめ:ソフトウェアの長寿命化戦略

  • 安定した環境への依存 が、ソフトウェアの長期安定運用の鍵
  • 継続的保守が難しい分野では、 仕様固定・環境固定 のアプローチが有効
  • ソフトウェア文化や用途に応じた 環境選択の重要性

Hackerたちの意見

これとリンディ効果は、プロジェクトで何を使うかを選ぶ際に大きく影響してるんだ。メンテナンスフリーにしたいプロジェクトでは、特別なASCII/txtのサブセット、SQLite、Perl、Bash、PHP、HTML、JS、CSSを選んでる。選んだサブセットは、これらの言語の中で最も長く残っている部分なんだ。リンディ効果を参考にして、20年間の異なるバージョンで動くスタック/フレームワークを作ったから、今後20年間も壊れずに動き続ける可能性が高くなってるよ。

同じような理由とコードサイズやハッカビリティを考慮して、最近はほぼ常にLuaエコシステムを選んでるね。: https://akkartik.name/freewheeling

このドグマ的なアプローチは、BashやPerlのような使いにくいツールを使うことでエルゴノミクスを失うことを意味するんだ。だから、将来のためにほとんど得られない小さな利益のために、常にそのコストを負担しなきゃいけないんだよ(結局、その効果は広い仮説に過ぎないからね)。

プロジェクトが複雑になるにつれて、完璧な選択をするのが難しくなってきてるね。シンプルな製品でも、iOS、Android、ウェブ、バックエンドなど、いろいろなものを構築する必要があるから。html/jsに頼れる部分もあるけど、実際にはモバイルアプリは数年ごとに書き直されることが多いよね。私の考えでは、早めに問題を浮き彫りにすることに焦点を当てる方が有益だと思う。バグや遅延、リグレッションがユーザーに影響を与える前に知りたいから、私たちが書くものはすべてTDDを使って書いている。でも、ユニットテストは環境に結びついているから、一緒に「腐る」んだ。だから、プロジェクトがオンラインの間は、モニタリングや統合テスト、ブラックボックステストを早い段階で設定して、ずっと動かし続けるようにしているよ。

PHPが大好きなんだけど、7.4あたりから言語に破壊的な変更を加えるのがかなり好きになってきたみたい。最近では、古いバージョンと新しいバージョンのランタイムを同時に満たすことができないような変更もあるし。毎回のメジャーリリースの後に、何週間もかけて修正作業をする羽目になってる。

ソフトウェアのユーザーであり教師として、ソフトウェアの劣化についてよく考えるんだ。心配なのは、劣化が置き換えではなく追加によって進行する傾向があること。新しい機能が追加される一方で、アーキテクチャの根本的な限界は放置されている。Blenderが内輪のジョークから本物の競争相手に成長した理由は、2009年から2011年の間に行われた痛みを伴うリファクタリングなんだ。それに対して、After Effectsのコードが今や30年以上も前のものだってことを実感するよ。ネイティブトラッカーは遅くて古くて、最もシンプルなタスク以外には使えない。トラッキングは、実に不格好な統合ハックを通じて、サブライセンス版のMochaに外注されて「改善」された。すべてを捨てて再スタートするのも良いことだと思う。AppleがOSXで成功したように(スティーブ・ジョブズがAppleを離れてNextを始めた時のように)。でも、Blackberryが似たようなことを試みて、ほとんどの魔法を失ったことも覚えてる。

「工業用海洋グレードのコード劣化耐性」に関して、Microsoftより優れたエコシステムはないよ。20年前にコンパイルした同じ.NETウェブアプリのコードを新しいServer 2025で動かせるのは、他にはない素晴らしい体験だし、30年前のVBAマクロがExcel 365で今もちゃんと動いてるのもすごい。後方互換性をうまくやってる会社だね。

IBMメインフレームで働いている者として、私は違う意見だ。IBMはおそらく、前方アプリケーションの互換性に関しては最高だよ。笑われるかもしれないけど、ちゃんと見てほしい。

私は逆の経験をしたよ。ある年のグローバルゲームジャムでXNAを試してみたんだけど、まあまあ満足してたんだ。でも、次の年にはなくなっちゃった。

これが多くのソフトに当てはまると思う。現代のJVMは、20年前のJavaを変なことをしなければまだ動かせるし、Linuxもその頃から大きく変わってない。ウェブは、1996年のスペースジャムのサイトが今でもちゃんと動いてるように、最も広くサポートされている標準化されたプラットフォームの一つだよ(画面が大きくなっただけ)。ソフトウェアの劣化って本当にあるの?確かにあると思うけど、ランタイムの中にはないんじゃないかな。依存関係の可用性や互換性、主にNodeエコシステムに問題があると思う。

.NETの経験はないんだけど、信頼できる環境があるって聞いて嬉しいよ。でも、Microsoftに関しては、あんまりいい思い出がないんだ。Windows 95からXP時代の古いプログラムが動かせなくて困ってる。先週も2002年のポイント&クリックゲームをインストールしようとしたんだけど、ネットのアドバイスは「XPをインストールしろ」っていうのばっかりだった。Windows 7で動かす方法はあったけど、10や11では見たことないな。

Python 2の状況は、私の目を開かせたよ。今でも、特に職場環境ではpy2のものがたくさん残ってるのを見かける。実際、2.7.18のソースを自動で引っ張ってきて、最小構成でビルドするスクリプトを作らなきゃいけないほどだ。

Python 2は、後方互換性の変更を遅すぎるタイミングで行うことの警告だね。大きなライブラリがいくつかできると、後方互換性のリスクが指数関数的に増えるんだ。C#も型消去から具現化されたジェネリクスに移行することで、大きな変化を遂げたけど、それでエコシステムが二分されちゃった(具現化前と後)。誰もそのことを話さないのは、エコシステムがすごく小さかったから、誰も遭遇しなかったからだよ。

我々業界は、この状況を引き起こす社会的および市場のダイナミクスに真剣に取り組む必要がある。いつ、なぜ「安定」が「メンテナンスされていない」と同義になったのか?なぜ、ほとんどすべての安定した抽象化レイヤーの構築の試みが、抽象化されるレイヤーよりもかなり不安定になってしまったのか?

現在、Ubuntuには6つのLTSバージョンがあるんだよね。それ以上必要だと思ってるの?トレードオフは明らかだよ。プラットフォームを維持していて、革新したいなら、古い機能を廃止するか、責任の範囲を無限に広げるしかないんだ。一方で、革新を拒否すると、みんながより革新的なプラットフォームに移行するから、結局は忘れ去られちゃう。市場や社会のダイナミクスを変えたくはないな。革新が好きなんだ。

「いつから、なぜ「安定」が「メンテナンスされていない」と同義になったの?」 ソフトウェアエコシステムは静的じゃないからだよ。人々は、ソフトウェアにもっと機能を求めたり、セキュリティを強化したり、パフォーマンスを向上させたりしたいんだ。だから、君も競合他社もアップデートのトレッドミルに乗っている状態だよ。もしトレッドミルの上で立っている(=安定している)だけなら、落ちちゃうよ。トレッドミルに乗っている限り、コードや機能、バグ修正が増えていくけど、維持できなくなるか、より速い競合が現れて人々がそっちに流れることになる。この問題を解決するのは、みんなが求めている通りにコードが書かれていて、さらに人々がそれ以上のものを求めないことを証明するのと同じくらい簡単なんだ。

ここ10年の仕事を通じて見た影響の一つは、もし変更が必要ないなら、誰も機能を追加しないから、誰もそのコードに手を加えないってこと。誰も手を加えなければ、チームが辞めたり、チームを変えたりすると、最終的にはメンテナンスを担当しているチームがそのコードの仕組みを知らなくなっちゃう。そうなると、もはやメンテナンスに適さなくなるかもしれない。この現象は、チームや個人が自分のコードをより魔法のようにしたり、他のコードと異なるものにすると加速するんだ。新しいメンテナが入りにくくなるからね。さらに、すべてのコードが必要なテストカバレッジやモニタリングを持っているわけじゃないから、5年前に出荷したものを殺したり、変更したり、サポートをやめたりするインセンティブが常にあるのは驚くべきことじゃないよ。

このサイトに安定したリポジトリへのリンクを投稿してみて。すると、何人かが「最後のコミットは2020年;死んでるに違いない」と言い出すのを見られるよ。ソースコードはASCIIテキストで、ASCIIテキストは生きてない。呼吸する必要はないけど、依存関係はあるよね。でも、「アクティブじゃないから、死んでるに違いない、だから避けよう」という態度は、人々に「証明されていないバグの多い新しいものが常に良い」と信じさせるんだ。おかしな反例として、10年前のvimは最新のものと同じくらい90%のケースで使えるよ。

NESで書いたビジネスロジックをそのまま使えて、要件が悪化する心配がないといいな。ネットワーク層の上で何かを書くなら、最終的にはパッチが必要になるんじゃないかな。全ての配線やノードを所有しているような、セキュアな発電所や1960年代から同じCOBOLを使っている銀行の決済システムみたいな状況じゃない限りね。ネットワーク層と直接インターフェースするコードを書いているわけじゃないから、そういうライブラリに依存することになるし、それらは言語仕様の変更やセキュリティパッチの影響を受けることになる。つまり、ソフトウェアが私たちの汚れた世界で生きていく必要があるなら、きれいなバブルの中だけじゃなくて、物事は腐るってことだね。腐りにくいツールやライブラリ、言語を選ぶのは良いアイデアだと思う。少なくとも10年以上使われているものに縛られたくないな。2018年以前の私のコードの50〜60%と、ほぼ全ての大きなライブラリはAS3で書いていたから、かなり苦労したよ。多くのコードを維持しなければならないのが、強制的に放棄されたソフトウェアになったのは、ある意味解放された気分だった。でも今は、クローズドソースはやめて、自分で作ったりブランチして大幅に修正したライブラリに依存することはもうないよ。

2018年以前の私のコードの50〜60%と、ほぼ全ての大きなライブラリはAS3で書いていた ちょっと興味があるんだけど、どんな仕事をしてたの?古いAS3については、Haxeでうまくいった?簡単に移植できると思うけど。

岩盤の上に構築するのは一つの極端な例だよね。もう一つの極端は、すごく流動的になること。つまり、砂地の上に建てるけど、砂が動くたびに効率よく対処するってこと。AS3は役に立たなくなるかもしれないけど、もしAS3のコードをウェブのJavaScriptに再コンパイルできるツールがあれば、損失はないよね。

みんなが好きな恥ずかしい言語だけど、COBOLのDATA DIVISIONは長期的な安定性に特化してるよね。一般的にはバイナリフィールドは避けるのが常識。つまり、プログラムで見えるものが、そのままワイヤーやファイルに見えるってこと。

つまり、ソフトウェアが私たちの住んでいる汚れた世界で動く必要があるなら、ただのきれいなバブルの中じゃダメってこと。物事は腐っていくよ。だから、BubbleOSって呼んでるんだ。まだ完成してないけどね… プロプライエタリなプラットフォームに仕事を奪われた痛い経験、共感するよ。

これが私がLinuxベースの開発やそれを使ったOSが大嫌いな理由の一つだね。今では依存関係地獄って呼ばれてるけど、実際は今の開発のための手抜きショートカットなんだ。将来的には痛い目に遭うよ。企業向けのソフトウェアは問題じゃない。企業ユーザーは今動けばそれで満足だから、将来的にはずっと動く有料ソリューションに頼ることになる。私の場合、アーチLinuxのローカルミラーを運用してる。必要なライブラリやソフトウェアをダウンロードするためにずっとネットに繋いでいたくないからね。全部ここに揃ってるけど、しばらく更新してないから、今更新したら破壊的なアップデートが来るかもしれない。こんなのは絶対にあってはならないし、古いバージョンのソフトをコンパイルするのも同様。何度もGitHubで役立つソフトを見つけて、自然にコンパイルしようとするけど、簡単じゃない。必要な依存関係を探さなきゃいけないし、いろんなライブラリの古いバージョンをコンパイルしようとするのも馬鹿らしい。もっと簡単で賢く作られてほしいよ。時々、動かない理由がない古いソフトを使いたくなることもあるしね。Windowsを見ると、全てが魔法のように動くけど、実際は賢く作られてるだけ。GNU+Linuxでは、こういう賢い考え方は歓迎されてないし、今までそうだったことはない。代わりに、ソフトウェアを開発する大量の人々に頼って、意味もなくプログラムを更新させてるだけなんだ。

これは全部ボランティアの作業で、トリリオンの資金を持ってる企業じゃないんだよね。簡単なものが欲しいなら、Debian(またはUbuntu)を使ってみて。ほとんど全てのものが揃ってるから。ネットからソフトをダウンロードして実行するのがしたいなら、多くのディストリビューションはそれを避けようとしてる。代わりに、コードを審査してビルドして、信頼できるリポジトリに追加するんだ。誰もランダムなサイトからPostgresをダウンロードしたくないからね。

NixOSを使ってるよ。数ヶ月に一回くらい更新するけど、それで全然問題ない。デスクトップの使い心地はほぼ10年ずっと安定してる。一方、Windowsの仕事用PCは、WSLが何かの理由でvscodeに接続できなくなると、毎日か二日おきに再起動が必要なんだ(そうなるとCPUが100%になることが多くて、ロック解除するのにも1分以上かかるから、たいていは強制的に電源を切っちゃう)。

君の言ってることには共感するよ。理論的にはDockerやSnapsはLinuxプログラムとその依存関係をもっと明示的にパッケージ化するはずなんだけど、特にDockerはネットワークに依存してるし、サーバーが動いてないとダメなんだよね。個人的には、何でもかんでもまとめるのは好きじゃないけど、もし人々が軽量な依存関係を最小限に追加することにもっと規律を持てれば、うまくいくかもしれない。あるいは、大きくて一般的で、後方互換性を維持できるものにすれば、重複を避けられる。HTTP APIを通してすべてを処理し、毎月のように古いものを非推奨にして、Electron(ブラウザの複雑さを何にでも持ち込む)や動的言語で依存関係のツリーを引っ張る文化とは真逆だよね。これがLinuxの最大の落とし穴の一つだと思う。これを言うのは、私にとっては最も理にかなったOSだからだけど。問題の根本はもっと広いんだ。開発コストの削減をすべてのユーザーにリソースの使用で押し付ける傾向があるから。大企業がもっと経済的にすることを気にしない限り、あるいはプロジェクトがちょっと変わった趣味人に合っている場合を除いてね。他の誰かが言ったように、大企業はLinuxデスクトップにはあまり興味を持ってないよ。

これはすべてのディストロにある程度当てはまるけど、Archの主な特徴は「ローリングリリース」で、すべての部分が常に更新されてることだね。例えば、RHELは13年のサイクルを提供していて、破壊的な更新は絶対に来ないよ。

C/C++の依存関係管理がWindowsで簡単なの?マジで?そこでソースから何をビルドしたの?

今では「依存関係地獄」ってみんな知ってるよね。Windows 3.1や「DLL地獄」を覚えてるには若すぎる?あれはもっとひどかった。

今、GTKについて考えてるんだけど、誤解しないでほしい。GTKは好きだし、いろんな理由でGUIツールキットの中で優先されるべきだと思ってる。でも、みんなが言ってるように、常に変化があってAPIの互換性の問題があるのも同じように感じてる。場合によっては変わる必要があるけど、どうして3から4に移行する時にメニューが削除されて、他の構造を使わなきゃいけないの?ラッパーを提供してくれない?イベント構造体のメンバーを直接使わないで、アクセサ関数を使ってもいいけど…でもその関数の名前や詳細が変わるんだよね。「ウィンドウ」じゃなくて「サーフェス」になったのは、何で?Waylandがそう呼んでるから?APIの安定性は重要な機能だけど、彼らは毎回(例えば5年ごとに)大きなバージョンアップをして、物事を壊してるんだ。

SQLiteにはこれに関する明確な方針があるよ。「開発者の意図は、2050年までSQLiteをサポートすることです。」 https://www.sqlite.org/lts.html SQLiteの信頼性について話す人は多いけど、その安定性や長寿についても言及すべきだと思う。どちらも一級品だよ。これが真剣なエンジニアリングの姿だね。

SQLiteは2050年以降も複数のライフタイムで存在する計画について話してるのかな?ちょっと皮肉じゃなくて、若い業界だからこそ、将来の開発者のためにこの努力を保存するためのより良いソーシャルツールが必要だと思う。業界全体での人の入れ替わりが激しくて、20年くらい遅れを取ってるかもしれないね。

Express.jsや他の「つまらない技術」についても似たようなことが言えるかもね。

それもあと25年だね。確かに、もう結構長いこと続いてるけど。

"HTTPとHTTPSについて ポート80でこのウィキを参照することが可能です。つまり、https://の代わりにhttp://を使うということです。" "もしあなたのオペレーティングシステムにgitがない場合、マークダウンのソースファイルと生成されたHTMLファイルが含まれたzipファイルをダウンロードできます。パスは修正済みです。このzipファイルは週に一度生成されます。" デジタル署名をミラーサイトに含めるのは適切かな?思考実験:圧縮アーカイブを提供するのが標準的な慣習だったら、ウェブサイトは不要なクローラーに攻撃され続けるのかな?もしそうなら、オンラインページへのアクセスを削除または拒否して、圧縮アーカイブへのアクセスだけを許可するのはどうだろう。