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

柔軟なソフトウェア:制限されたアプリの世界でユーザーの主体性を取り戻す

概要

  • 物理的な環境 は個人のニーズに合わせて柔軟に調整可能
  • ソフトウェア環境 は一般的に硬直的でカスタマイズが難しい現状
  • ユーザー主体の適応性 を持つ「malleable software(可塑的ソフトウェア)」の必要性
  • 現行の 設定・プラグイン・オープンソース・AI支援 の課題と限界
  • 今後求められるのは 摩擦の少ない適応性 とユーザーのエージェンシー

環境を自分仕様に適応する動機

  • 最適な作業や生活 には、個々の可能性を引き出す環境が不可欠
  • ギター職人や家庭料理人のように、 道具や空間のカスタマイズ が日常的に行われる
  • 物理空間では、小さな工夫(ポストイット、家具の移動等)が 即座に実行可能
  • 大規模な改造も スキルや地域の職人の協力 で実現可能
  • Stewart Brand の「How Buildings Learn」では、建物も住人との相互作用で進化するという指摘

マスプロダクトソフトウェアの硬直性

  • デジタル環境では 即時のカスタマイズ が難しく、柔軟性が失われがち
  • 例:物理的なインデックスカード管理からWebベースのトラッカーに移行した際、 プロセスの柔軟性が損なわれた 事例
  • ソフトウェアの硬直性は 生産性や満足度の低下 を招く
  • Atul Gawande による医療現場の例では、電子カルテの不自由さが バーンアウトの一因
  • ユーザーの多様なニーズに 中央集権的な開発体制 は対応しきれない現状
  • ニッチな要望は 切り捨てられがち で、個別最適化が困難

ユーザー主導のソフトウェア適応事例

  • Gawande による神経外科医とITアナリストの協働で、 部門特化のインターフェース を開発
  • こうした事例は例外的で、 多くのソフトウェアはユーザーを受動的存在とみなす
  • アプリストアの仕組み も企業→消費者モデルが主流で、個人間のツール共有は困難
  • マスプロダクトソフトウェアの恩恵(信頼性、アクセシビリティ、価格等)は大きいが、 適応性の欠如による不便さ も顕著

目指すべき姿:malleable software

  • ユーザーが共創者となり得る 新たなコンピューティング生態系の提唱
  • 「malleable software」とは、 誰でも低い障壁でツールを自分仕様に適応可能 なエコシステム
  • 適応の範囲は 小さな調整から大規模な改造、新規ツール作成まで多岐
  • 「摩擦の少なさ」 が鍵。思いついた瞬間に編集できる軽やかさが理想

既存のカスタマイズ手法とその限界

  • 設定(Settings)

    • 開発者が用意した範囲内でのみ変更可能
    • 設定項目が増えると 一貫性や直感性が損なわれる
  • プラグイン(Plugins)

    • サードパーティによる拡張が可能
    • プラグインAPIの範囲外は カスタマイズ不可
    • 各アプリごとに異なる仕組みで 相互運用性が低い
    • 例:ObsidianのMarkdownエディタの豊富なコミュニティプラグイン
  • モッディング(Modding)

    • 設定や公式APIで不十分な場合、 ユーザーが独自に改変
    • ブラウザ拡張などは 公式のサポートがなくても介入可能
    • ただし、 逆コンパイルや保守の困難さ、互換性問題 が大きい
    • 例:BoA Checklistのブラウザ拡張
  • オープンソース(Open Source)

    • ソースコードへのアクセスと改変が可能
    • しかし、 専門知識や開発環境構築のハードル が高く、気軽な編集が難しい
    • 例:GitHubでのコントリビュート
  • AI支援コーディング(AI-assisted coding)

    • プログラミング未経験者でも AIによるサポートでカスタマイズが容易になる可能性
    • しかし、現時点では 摩擦ゼロの適応性実現には至っていない

このように、 現行手法ではユーザーの即時的・直感的なカスタマイズ欲求 を十分に満たせない。今後は、 摩擦の少ないmalleable software の実現が重要課題となる。

Hackerたちの意見

大量生産されたソフトウェアは硬直的すぎる。 うん、ほんとにそうだよね。色みたいなちょっとしたことすら変えられないし、もっと複雑なUIの部分なんてなおさら。 柔軟性のない電子カルテシステムが医者を燃え尽きさせてる。 異なるユーザーが異なるニーズを持ってると、中央の開発チームがみんなの問題を解決するのは無理だよね。 それが主な問題じゃなくて、実際のユーザーがほとんど力を持ってないから、開発者は実際のユーザー体験からかけ離れてるってことだよ。無駄なフィールドを埋める例みたいに、誰の役にも立ってないし! 開発者が一つの製品に解決策を詰め込みすぎると、結果的に膨れ上がったゴミになっちゃう。 ちゃんと整理されてれば別だけど? 多くのものが混乱や膨張を引き起こす理由は特にないよ(例えば、解決策がモジュールで無視できたりインストールしなくてもいいなら、自分が気に入った解決策だけのアプリには膨張はない)。でも一般的には、すごく称賛すべき目標だし、そんな原則に基づいてソフトウェアが作られる夢の世界に住むことができたら、多くのユーザーにとって力強いことだよね。

最近ここで言及されたこういうツールがあるよ: https://news.ycombinator.com/item?id=44118159 でもあまり注目されてなかったみたい。 https://pontus.granstrom.me/scrappy/ だけど、これはほぼJavaScriptプログラマーとその友達(またはJavaScriptを学びたい人)向けにしか機能しない。他にこの文脈で話し合う価値があると思うツールは:

  • LyX --- 新しいレイアウトファイルを作ることで、ユーザーがほぼどんな文書でもカスタマイズできるツールを作れる --- LaTeXのフロントエンド
  • pyspread --- 各セルがPythonプログラムかその出力で、セルが画像になる可能性があれば、ファイルを作ったり読むオーバーヘッドなしでほぼ何でもできる
  • Ipe https://ipe.otfried.org/ --- 拡張可能な描画プログラム、これにはもっとシンプルなメカニズムが必要だし、ベクタードローイングの分野でそれに対応したツールが見たい --- もしかしたら、まだ発展途上の https://graphite.rs/ ?

最初の二つのリンクは今Scrappyに行くけど、あなたのテキストだと違うものを対比してるように聞こえる?

LyXとIpeがここにあって嬉しい! 学業のキャリアを通じてとても役立ってきたし、使ってて楽しい(慣れればね)。Qt/KDEの世界には(私見だけど)今まで使った中で最高の品質のソフトウェアがあるし、驚くことにFOSSの競合に比べて比較的人気がない。 Ipeは今、ウェブインターフェースを持ってる(Qtの魔法で)し、LyX用のものを作る計画があったのを覚えてるけど、それが実現したかは見つけられなかった。

いいね — Scrappyは素敵なプロトタイプに見える!クリエイターたちが書いているように、HyperCardスタイルの「オプションのスクリプト付きメディア」エディタの系譜にうまくフィットしていて、プログラミングへの優しい入り口を提供している。私たちのエッセイの最後の方にあるダイナミックドキュメントのセクションでは、私たちのラボのこのツールのカテゴリーに対するいくつかのアプローチを紹介していて、リアルタイムでプログラム可能なドキュメントの上にAIをオプションのレイヤーとして統合する例も含まれているよ。

いじったり、遊んだり、分解したり、どう動くか学んだり、また組み立てたりするのが好きな人がいるよね。 その中には新しいものを作る人もいるし、世界を変えるものを作る人もいる。もっと想像力や創造性を促進する世界に住みたいな。 人々が自分の未来を作ることに参加できるような世界がいいよね。ソフトウェアは全部が「ユーザーが修理できない部品なしの黒い箱」じゃなくてもいいんだ。 HyperCardやVisual Basic、Excelみたいなもので人々が何をできるか見てきたし、楽しみながらやってるよ。

投稿のアイデアには感謝してる。確かに、今や全てがアーカイブやハッキングができないSaaSになってるから、もっとハッカブルなアプリが必要だよね(WinAmpやWindowsの主要リリース、そのファンのアップデート、またはもっと一般的なゲームのMODとは違って)。 残念ながら、深くカスタマイズ可能なソフトウェアを利用するパワーユーザーやその可能性のある人は一定数いるけど、そういうソフトウェアを見ない人や学ぶことに興味がない人が圧倒的に多いと思う。 人々は状況がこうなっている理由をすぐに指摘するけど、実際にはコンピュータが広く普及した時点でこうなるのは避けられなかった。 車を運転するほとんどの人が自分で修理できないのと同じで、家やアパートを改造することに自信を持つ人が少ないのも同じ。 平均的な個人の注意の範囲と深さには限界があって、技術的な専門性が求められることは多くない。 どんなに優しく段階を踏んでも、これを回避することはできない。 だからと言って、柔軟なソフトウェアを作るべきじゃないってわけじゃない…ぜひ作ってほしいけど、MicrosoftやGoogleをすぐに倒すとは思わない。 ただ、技術的に能力のある人たちは、柔軟でローカルファースト、ハッカブルなソフトウェアの開発を進めるためにできることを何でもすべきだと思う。 サーバーに強く依存しているものは完全に除外されるべきで、開発者の運命に関係なく自分のマシンで動かし続けられるものが、より儚い選択肢よりも優先されるべきだ。

車に関しては、多くの人がもっと柔軟だったらいいなと思うだろうね。 父が昔持ってた車は本当に修理が簡単だったってよく言ってた(編集:それはVWビートルだった)。 今の車でそんな経験をする人は少ないだろうね。

車を運転するほとんどの人が、それを修理できないのと同じことだよね。 車や運転の代わりに、メディアやユーティリティコンピューティングの比喩として、読書や執筆を使ったらどうなるかな。そうすると、議論の本質が変わると思うんだ。

うん、それには同意できないな。コンピュータユーザーは、自分が使えるツールによって形作られるんだよね。カスタマイズの度合いにはバラつきがあるけど、環境がカスタマイズを前提に設計されていると、ユーザーは与えられたツールを使うことになる。

Patchworkを作ったんだ—柔軟なソフトウェアのためのウェブベースのコラボレーション環境... ユーザーデータとソフトウェアコードをAutomergeドキュメントに保存する。 その上で、履歴ビューや簡単なブランチのようなバージョン管理ユーティリティを追加している。 これらのツールはシステム内のどんなドキュメントにも適用される—文章でも、ソフトウェアツールのコードでも... 最終的にはPatchworkをオープンソースツールとしてリリースする計画もある。 オープンソース化する前に達成したいマイルストーンは? 外部から見ると、すごく多くの機能があるように見えるし、機能の増えすぎが心配。 それでも、全てに対するバージョン管理は大変なことだから、じっくり時間をかける必要があるかも。

実は、Patchworkは意外と機能が少ないんだ!製品というよりはOSみたいな感じ。目指しているのは、ドキュメントやツール、ブランチ・差分、プラグインなど、いろんなものを作れる小さな組み合わせ可能なプリミティブのセットなんだ。質問に答えると、Patchworkを毎日使ってるけど、今はまだ粗削りな状態。何かを作るためのSDKは改善が必要だし(SDKは後から変更するのが難しいからね…)、信頼性やパフォーマンスも、Automergeとの連携で改善が求められてる。もっと広いリリースの前に、私たちのラボ以外のアルファユーザーにも使ってもらって、いくつかの問題を解決する予定なんだ。要するに、期待できそうだし、いい方向に進んでるけど、まだ完成には程遠いって感じ。

Delphiをくれ。いや、本気で、ウェブ用のDelphiを、現代の人気プログラミング言語で作ってほしい。Pythonがいいけど、TypeScriptやGo、Luaでも全然OK。知らない人のために言うと、DelphiはWindowsアプリ用のビジュアルコンストラクタで、Pascalの方言を使ってたんだ。マジで魔法みたいだった!今のウェブエコシステムはすごく速くてバラバラだから、選択肢が多すぎて逆に動けなくなるし、自信も持てない。やらなきゃいけないことが多すぎて、頭が痛い。ツールはあるけど、クッキー型やnpx、CRA、コパイロット、カーソルみたいなのが大量のコードを吐き出してくれるけど、すぐにこの混乱の中に放り出される。まだ解決策は見つけてないんだ。

最近更新された(名前もぴったりな)Lazarusは合わないの? https://news.ycombinator.com/item?id=43913414 ちょっと検索したら、こんなのが出てきたよ: https://wiki.freepascal.org/Developing_Web_Apps_with_Pascal と https://www.reddit.com/r/pascal/comments/es8wlh/free_pascal_...

LOB(業務用アプリ)向けなら、これを試してみるといいかもね:https://serenity.is/ 自分は50歳で、数十年の経験があるよ。ここ4年間、Serenityの商用版(StartSharpって呼ばれてる)を自分からお金を払って使ってる。彼らをサポートしたいし、精神的に助けてもらったことへの感謝の気持ちもあるからね。技術的には、彼らの無料のオープンソース版でも十分なんだけど、機能はかなり充実してるよ。C# / TypeScript / ASP.NET Core / Visual Studio / Linuxデプロイにも優しいし、Dockerでも動くし、Postgresとも相性がいい。長い間HNを見てたけど、今日はこのメッセージを伝えるためだけに登録したんだ。

記事に書いてある通り、アプリ間でデータを共有するのは今のところ不可能だね。Solid/PODsがもっと広まってほしかったけど、プロジェクトがオントロジーに時間をかけすぎて、実用的なものを作るのが後回しになってる気がする。どうやってアプリをユーザーが所有する共通のデータバックエンドを使わせることができるんだろう?

自分がやりたいことをするために、いくつかのプログラムをリバースエンジニアリングしたことがあるよ。デフォルトを変更できないプログラムでデフォルトオプションを設定したり、古いWindowsプログラムを正しく動作させたりね。オープンソースのプログラムをローカルでパッチを当てて、自分がやりたいことをするために改造したこともあるけど、アップストリームには適さないものもある。例えば、アップデートで「保存しますか?」のダイアログのボタンの順番が変わった時に、元に戻したり。小さなことだけど、こういうことができるのはすごいよね。問題は、開発者、特にクローズドソースのプログラムの開発者は、そういうことをできないようにしたがること。彼らはお金を稼ぐためにセキュリティのために隠すことに頼っているから。だから、開発者がこういうことに賛同するためには、何を変更できて何を変更できないかを指定できるようにするのが唯一の方法だと思う。それは、開発者がすでにINIファイルやレジストリでやっていることなんだ。だから、UNIX系のシステムを使っている人たちは、一つのことをうまくやる小さなプログラムを求めるんだよね。これらの小さなプログラムを組み合わせて、自分がやりたいことを正確に実現できるようになるのは、本当に素晴らしいことだよ。

自分もオープンソースのプログラムをローカルでパッチ当てて、自分がやりたいことを実現することがあるんだ。プログラムがすごく大きいときは、コンパイルに時間がかかることもあるし、逆に小さいプログラムだとサクッとコンパイルできることもある。バイナリを修正したり、プログラムを完全に書き直して自分の思い通りに動かすこともあったよ。時には、UIを使わずに設定ファイルを手動で編集したり、ファイルの権限を変更することで解決できたりもした。

COM/OLEオートメーションをじっくり見てるといいと思うよ。これらのことをほぼ全て実現してるから。 - プロセス内外で使える言語に依存しないAPIバインディング。 - プロセス境界を越えたオブジェクトや複雑なデータ構造のマーシャリングに対する詳細なサポート。 - 外部アプリやアプリのアドオンが使えるアプリケーションおよびドキュメントオブジェクトモデルを宣言するための標準化された方法。 - アプリケーション拡張のための標準化された配布システム、マネタイズの機会も含む。 - アプリケーションAPIをウェブサービスやデータベースサービスにバインドするための標準化されたツール。 - アプリケーションに埋め込むことができるデフォルトのスクリプトエンジン(VBA)。 - 自動型オブジェクトや合成オブジェクトに対する、正直言って原始的であまり推奨されないサポート。これで、君が探しているアプリケーションカスタマイズのレベルに対する機会が提供されるよ。 - アプリ内VBAを使ったちょっとしたカスタマイズ。 - マーケットプレイスからダウンロードできるアドオンを使ってアプリの動作を拡張することができる。ライセンス収入の一部を取ることなくね。 - 様々なアプリの公開されたドキュメントオブジェクトモデル間でデータを移動させるスクリプトを書くことができる。 - アプリ内で動作し、UIやライブドキュメントと相互作用する完全にカスタムなコードを書くことができる(つまり、自分でアドオンを書くことができる)。COM/OLEの機能を再構築するのはすごく楽しいだろうし、Visual Basicの余計な部分を省いて、COMがうまくできなかったことの教訓を活かせるからね。(SVGをグラフィック輸送に使うとか?スレッドモデルのオプションをもっと整理するとか?非同期メソッドのサポート?標準化されたイベントメカニズム?)考えられる質問: - COMがやってることをやらなくても大丈夫なことは何?あまりないと思う。 - どうやってもっと良くできる?いろんな方法があるよ!

モッダーは、自分が好きなゲームをいつもいじったり変えたりしてるよね、柔軟性があってもなくても。