ハクソク

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

良いソフトウェアは、いつ停止すべきかを知っている

概要

  • Linuxのアップグレード後にlsコマンドがAI化するという架空のシナリオ
  • ソフトウェアは本来の目的を理解し、過剰な機能追加を避けるべきという主張
  • 37Signalsの書籍から学ぶプロダクト設計の原則
  • シンプルさや本質的な価値を重視する姿勢の重要性
  • トレンドに流されず、役割を守ることの価値

ソフトウェアの進化と本質的な価値

  • ある朝、Linuxディストリビューションとパッケージを最新バージョンにアップグレード
  • 再起動後、いつものようにlsコマンドでディレクトリ内容を表示しようとする
  • しかし、lsが突然「AI-Powered Directory Intelligence™」として進化し、**Adaptive Listing System(als)**への移行を促す通知が表示される架空の出来事
  • lsの従来の役割がAI予測やランキング機能に置き換えられ、30日後には従来版が非推奨となる警告
  • 幸いにもこれは現実ではなく、良いソフトウェアは自らの目的を理解し、過剰な進化をしないという教訓

37Signalsの教えとプロダクト設計の原則

  • **37Signals(Basecamp創業者)**による書籍「Rework」「Getting Real」から学ぶプロダクト設計の知恵
    • 制約こそが意思決定を洗練させる
    • ユーザーの要望をそのまま実装せず、根本的な課題を見極める
    • 早くリリースし、頻繁に改善することで現実的な価値提供
    • UI設計は周辺部分ではなく本質から着手
    • 機能追加はデフォルトで「NO」、複雑さや保守コストを意識
    • 自分自身の課題を解決するものを作ることで良い判断ができる

流行や過剰な変化への警鐘

  • MinioがAIStor、Oracle DatabaseがOracle AI Databaseへと変貌する現代
  • すべてを「AI化」する風潮に対し、本質的な役割を守ることの重要性を再認識
  • 既存の標準的なツールやソフトウェアが安易にトレンドに流されず、本来の価値を保つことの意義
  • 変化や進化が常に必要とは限らないというメッセージ

Hackerたちの意見

スポティファイの音楽抽出ツール「ハーモニ」を作ったんだけど、これで完成かな。プレイリストをダウンロードするのに役立つし、技術に詳しくない人でも使えるようになってる。
でも、Spotifyは動き続けるターゲットだよね。APIが変わったり、完全に削除されたりするかもしれない。第三者に依存しない限り、本当に終わったと言えるのはそれだけだと思う。
>機能リクエストは無視しろ — ユーザーが求めるものを作るな; その代わりに根本的な問題を理解しろ。ちょっと違う話だけど、このアドバイスはブリザードとワールド・オブ・ウォークラフトを思い出させる。何年も何年も、人々は「クラシック」WoWを求めていた(プレイヤーじゃない人のために説明すると、クラシック版は2004-2005年のオリジナル版のほぼバグそのままのコピー)。何年も、ブリザードの返事は「それが欲しいと思ってるかもしれないけど、実際はそうじゃない。信じて、欲しくないから。」だった。結局、彼らは折れてクラシックWoWをリリースし、大成功を収めた。その後、インタビューで、アイオン・ハジコスタス(ゲームディレクター)とホリー・ロングデール(副社長&エグゼクティブプロデューサー)は、彼らがWoWクラシックを大きく間違えたことを認め、「人々は本当に自分が何を求めているかを知っていた」と言った。要するに、時には機能リクエストを出す人が自分が何を求めているかを正確に知っていることがある。デフォルトのモードが(そしておそらくそうあるべき)機能リクエストを無視することかもしれないけど、それを無視することで自分が損をしている可能性があることを認識する価値がある。結局、あなたは製品のすべてのユーザーの根本的な問題を完全には理解できないかもしれないけど、彼らが求めている機能をコーディングする方法は理解できるかもしれない。
これはいい指摘だね。ただ「根本的な問題を理解する」にはある程度の人間性が必要かもしれない。ブリザードはある時点で企業化して「本筋を見失った」と言えると思う。彼らは人々が何を求めているかを知っていると思い込んでいたけど、実際にはそうじゃなかった(「みんなスマホ持ってるでしょ?」って感じ)。
私はWoWプレイヤーじゃないから、もしかしたら余計なことを言ってるかもだけど — その例は、ユーザーが求めていない余計な機能を知っているだけで、求めている余計な機能を知らないってことを示してるんじゃない?
ブリザードの例について公平に言うと、ブリザードはプレイヤーベースを幸せにするために、あなたの引用が言っているように、根本的な問題を理解することもできたと思う。「バグそのままのWoWクラシックが欲しい」だけじゃなくて、「現代のゲームがあまりにも認識できないものになってしまって、基本的にWoW 2.0になってしまった。現代のシステムでそれを台無しにした」ってことだった。ブリザードはLFR/LFGを戻したり、クラスの均一化をやめたり、複雑でユニークなタレントツリーを復活させたり、遺物を取り除いたり、グループゲストやワールドミニボスを再追加したり、飛行を取り除いたりすれば、プレイヤーはきっと喜んだと思う。クラシックは新しいコンテンツを作らない限り、長くは持たないけど、クラシックのシステムを使うことで。だから、ある意味で、やっぱり根本的な問題を理解する必要があるってことだと思う。ユーザーは一般的に自分が何を求めているかを知っているけど、どうやってそれを求めるかは必ずしも知っているわけじゃない。
それが著者のポイントを強調してるね:クラシックゲームはすでに存在していて、ユーザーはただメンテナンスアップデートが施された同じゲームを求めていただけで、新しい機能のある新しいゲームを求めていたわけじゃない。この場合、間違っていたのはユーザーではなく、何かうまくいっていたものを捨てようとしたプロデューサーたちだったと思う。彼のポイントは、ユーザーが自分が何を求めているかを知らないということではなく、進化的デザインと「機能を積み重ねる」こととの間の緊張関係についてだと思う。
ユーザーは自分が本当に何を求めているか分からないことが多い。でも、開発者やプロダクトマネージャーも同じだよね。「根本的な問題を理解する」って部分が難しいし、自分を誤解させやすい。浅い欲求と深い欲求もあるし、私にはその経験がないけど、クラシックなWoWは浅い欲求だったんじゃないかな。人々はそれを手に入れてすごく喜んでたけど、深い欲求はゲームプレイのスタイルや感覚に関するものだったと思う。プレイヤーはクラシックゲームの魔法を保った新しいものがあればもっと幸せだっただろうけど、Blizzardが何かを追加して台無しにすることを信頼できないってことも分かってた。だから、欲求を満たすための実践的な方法は、クラシックバージョンに戻ることだけだった。完璧な世界では、デザイナーが新しいバージョンの中から慎重に選んだ部分を取り入れて、クラシックと新しいWoWの両方を超えるものを作り出すはずなんだけど、それは本当に難しいし、疑い深いプレイヤーたちが反発するだろう(その疑念には十分な理由があるし)。結局、何を残して何を捨てるかで意見が分かれる大混乱になりそう。
ユーザーが機能リクエストをしてきて、それが理にかなってないと思ったことがあるけど、相手が礼儀正しく理解を示してくれたら、なぜそれがうまくいかないかを説明する時間を取ることにしてる。その過程で、基本的にラバーダックしながら問題の解決策を考え出すこともあるんだよね(ユーザーはまだ気づいてない問題)。時には、その結果、機能を実装しない理由がさらに強くなることもあるし、逆に全ての返信を削除してその問題に取り組むことになることもある。そうすることで、フルの返信を書くよりも時間がかからないこともあるし、最終的に機能が元々のリクエストよりも良くなることも多い。逆に、ユーザーが失礼で、わがままで、手がかかる場合は、最初から返信しようとも思わないことが多い。なぜなら、彼らがずっと対立的で、求めるものを与えたらさらに要求が増えるのが分かってるから。こういうユーザーは、特定の方法で何かを求めていて、その要求が他の人のためにインタラクションを台無しにすることを理解しようとしないことが多いから、私はそういうことはしない。この話は、最初に考えていたよりも大きな脱線になっちゃったけど、結局のところ、何かを頼む相手に対して失礼にならないようにしようってことだね。
逆の例として、クラシックMMOの観点から言うと、Ultima Onlineがプレイヤーのフィードバックに応じて非PVPゲームインスタンスを追加したことがある。PVPの対立の脅威がないと、UOは感情的にあまり引き込まれなかった。非PVPプレイヤーは、アドホックなPVPの感情的な興奮(ストレスや危険など)がないと退屈してしまった。PVP重視のプレイヤーも、PKerだけがいる世界では評判のメカニクスがほとんど意味を持たなくなって退屈していた。Arc Raidersのリリースは、元々のUOの社会的ダイナミクスを完璧に捉えていた。プレイヤーたちは、PVPをオプションにしてほしいとフォーラムにリクエストを殺到させた。その場合、開発者たちは聞かない方がいいと分かっていたんだ。
これに関連して、リテールのWoWアドオンにこのパターンが見られるようになってきた。新しいアドオンの多くは、ArcUIのように、最後の最後でWoW APIが変更されたために、重いバイブコードになっている。アドオンは表示をカスタマイズする方法がめちゃくちゃ多くて、その設定メニューは、無限のフィールド、スライダー、ドロップダウンのリストが並んでいるラブクラフト的なB2B製品みたいに見える。私のギルドのレイダーたちから、ちゃんと機能するUIを作るのがどれだけ大変かという不満をよく聞く。これらのツールが、開発者たちにソフトウェアの機能を簡単に増やすことを許可しているのか、またはそうさせているのか、ちょっと気になる。
でも、彼らは実際にWoWクラシックを作ったわけじゃない。ゲームの別バージョンを作っただけだ。ゲームプレイ的には全然違うし、経済やビジネス的にはシンプルだけど、人気があるのはマネタイズのせいだね。
もっと深い理由があるかもしれないね。何年も経って、求める人たちも変わってきたし。例えば、「4年前に戻って、あの頃をもう一度体験したい」と「20年前に戻って、あの頃をもう一度体験したい」って、全然違うよね。もしかしたら、彼らが言ってたことは正しかったのかも。昔、WoWクラシックを求めてた人たちの中で、実際に戻った人はどれくらいいたんだろう?例えるなら、17歳の時に父親が「ミニバンを買った方がいいよ、絶対必要になるから」って言って、35歳になって子供ができてミニバンを買ったら、「ほら、俺はいつも正しかった!」って言われる感じかな。もう一つの考え方として、これを共有の問題として考えるのもいいかも。「WoWに使ってるリソースをどうするべきか?」って。「WoWクラシックをやろう!」ってのは、実際には多くの人を幸せにする(そしてお金を稼ぐ)ためには、長い間間違った答えだったかもしれないね。特にテクノロジーに詳しいユーザーは、物事がどう動いているのか全然分かってないし、関連するコストについても全く感覚がないからね。WoWには、マルチドル企業が特定のことをするのがどれだけ難しいかについて、すぐに意見を言う人がたくさんいたけど、気が散ったり方向転換したりすることに伴う難しさについては全然理解されてなかった。
だからこそ、私はSublime Textが大好きなんだ。めちゃくちゃ速いし、すごく使いやすい。AIになろうとしてないし、メールを読んだり、ACME経由でSSL証明書を発行しようとしてない。ひとつのことに集中して、それを極めてる。
だから、私はまだVimを使ってるんだ。
確かに、限られた範囲で完成されたソフトウェアは美しいよね。でも、今のソフトウェアのほとんどは「永遠のベータ版」って呼んでる。ユーザーが常にインターネットに接続している前提があるから、「いつでもアップデートできる」っていう変なインセンティブが生まれちゃうんだよね。大体の場合、新機能(誰も求めてないけど)とバグ修正が一緒に来るから、分けられないし。YouTubeみたいなウェブサービスでは、使うバージョンを選べないしね。
Evernoteがサブスクリプション料金を上げたからObsidianに移ったけど、ObsidianもEvernoteと同じ道を辿ってる気がする。どんどん新機能を追加していくけど、もう完成したって言ってメンテナンスモードに入ってほしい。Obsidianにとっての転機はCanvas機能だった。最初はリンクや他のクールなことができるディレクトリやMarkdownファイルのための優れたエディタだったのに、それを超える大きな動きだった。特別なものは何もなく、ファイルのディレクトリと設定ストアだけ。個人的には、Canvas以降は新しい製品にすべきだったと思う。もしObsidianがオープンソースだったら、その時点でフォークしたくなったかも。
自分のGitHubリポジトリの星が多いほど、そのプロジェクトは週末にちょっとした気まぐれで作ったもので、まあまあ放置しちゃったってことが多い。たぶん、その気まぐれには十分すぎるくらい良かったのかも。
機能の追加をやめて、バグ修正とセキュリティアップデートに専念する「完成した」ソフトウェア製品を普通にすべきだと思う。ビルダーが「十分良い。完成した。コアユースケースにはしっかり対応してる」って言うのは本当に勇気がいることだよね。もっと機能が欲しい人がいるなら?それなら新しいブランドの別製品にすればいい。EvernoteやDropboxは2012年には完璧だった。新しいユーザーの成長を追いかけるために機能を追加することは、既存のユーザーを混乱させるだけで、良くないよね。
これがソフトウェア開発の最大の問題の一つだと思う:完成したと認めるプロジェクトが本当に少ない。毎日使っているソフトウェア製品の中で、実際にアップデートで良くなった(または同じままでいる)ものは、片手で数えられるくらいしかない。ほとんどはv1.0あたりでピークを迎えて、その後は開発者が触るたびに悪化していく。
これは、ウェブアプリやオンラインアップデートが登場する前に出荷されたすべてのソフトウェアを説明しているようなものだね。企業はソフトウェアを作って、箱に入れて売っていた。1回支払えば、永遠に自分のものだった。箱に入っているものがそのまま手に入って、余計なものはなかった。企業は1〜3年後に別の箱で新しいバージョンを出していた。気に入ったら、新機能が欲しくて新しい箱を買った。
今のところ、notepad.exeがその最強の例だと思う。Win11でそのexeにテキストファイルを再関連付けするために必要なハッキングの量には驚いたよ。Windowsがユーザーに対して非常に敵対的な方針を持っているのは分かるけど、これは特にひどかった。
いいソフトウェアって、生き物みたいなものなのかな?成長して、成長して、最終的には成長しすぎて死んじゃう(がんみたいに)。でも、成長の中で生き残った良い部分から新たに再生されるとき、上に重心が偏った構造を脱ぎ捨てる感じ?ただ分岐して、分岐して、再起動する。個々のソフトウェアやそのコミュニティが、全体的に成長を管理する役割を持つわけじゃなくて、最終的には去って、その良い部分を次のものに渡すだけなんだ。
2020年にフルタイムのJava開発者になったんだけど、それまではインフラの役割でJavaコードを扱っていたけど、アプリケーションサーバーで管理するアーティファクトとしての扱いだった。だから、実際のコードを扱い始めたとき、標準のjsonライブラリが数年前からメンテナンスモードだったことに怖さを感じた。標準のユニットテストフレームワークや他の重要な部分もそうだった。「Javaは死にかけている」と解釈したんだ。でも6年後、彼らは機能が完全だったことが分かった。めちゃくちゃ速いし、どれだけのコーナーケースがカバーされているかは神のみぞ知る。彼らは問題解決済みで、1億分の1のエッジケースがカバーされた機能完全な状態だった。放置されているわけでもなく、パッチは数日や数時間で組み込まれる。とにかく…安定している。今は静かで、何百万もの人に使われているけど、安定している。完璧ではないけど、その欠陥は多くの人に信頼されている。知られているバグは今や機能になっている。でも、誰も本当にそれを望んでいないみたい。私たちはキラキラしたものが欲しい。私たちは同じフレームワークをJavaで書き、その後Python、Go、Node、JavaScript、TypeScriptで書いた。何か人間的な本質が、物事を変えて書き直すことにあるのかもしれない。Javaエコシステムには確かに変化があるけど、人々はただ別の名前を選んで進んでいく。戦闘テスト済みのユニットテストフレームワークであるJUnitは、pytestのような新しいやり方から学ぶことがたくさんあった。安定性を損なうのではなく、彼らはただ別の名前、JUnit5を選んで進んでいった。
「自分のソフトウェアがどの役割に当てはまるかを知る」って、そうだね!これは私のキャリアの中で最も重要な教訓の一つだと思う。ジュニア開発者として始めた頃、私のソフトウェアが会社の製品にどのようにフィットするのか、ましてや既存のオープンソースのエコシステムの中でどうなのか全く分からなかった。今はシニアとして、ジュニアたちが同じ間違いを犯しているのを見ている。すでにやられたことを無駄に繰り返したり、車輪を再発明したりしているんだ。そして今、コーディング能力が安価な商品になっているから、製品開発やエコシステムの中で自分の位置を知ることが主なスキルセットになっている。