2 ポイント 投稿者 GN⁺ 2024-08-06 | 1件のコメント | WhatsAppで共有
  • 長く使い続けられるプログラムを選び、信頼できるインフラを構築する方法について語ってきたが、それでも自分はまだそれをうまくできていないと認めている
  • この2年間使ってきたプログラムの中核をこの1か月で書き直し、それを通じてこれまでの人生におけるプログラミングの変化を振り返る

2015年

  • 抽象化を疑い、テストとバージョン管理を重視していた
  • 抽象化の乱用とテスト/バージョン管理の不足が問題の原因だと考えていた
  • テストとレイヤーを基本的な制約とするプラットフォーム Mu1 を設計した

2017年

  • Mu1 を現在の Mu へと作り直し始めた
  • 当初は新しいテストとレイヤーのアイデアをすべて使っていたが、徐々に使わなくなった
  • Mu には多くのテストがあるが従来型のものであり、レイヤーインフラは移植しなかった

2022年

  • Freewheeling Apps の作業を開始
  • 最初はテストなしで始めたが、テキストエディタの中核部分については徹底したテストを書いた
  • 残りの部分はテストしにくかったが、うまく動作した

2024年

  • 1か月前にすべてのテストを削除した
  • 他の Freewheeling Apps とのマージコンフリクトを心配していたやり方で、テキストエディタを抜本的に作り直した
  • バージョン管理について悩まなくなった
  • テストとバージョンを手放したことで、はるかに良いプログラムを作れるようになった

持続可能なプログラミングについての現在の統合的な見解

  1. 多くの人のために持続可能な形で構築するのは難しすぎるので、そもそも試みないこと
  2. ほとんどのソフトウェアは、短期的に多くの人へ奉仕しようとするインセンティブにむしばまれている。ロゴが少なく、構築しやすく、依存関係が少なく、自動更新をしないソフトウェアに焦点を当てること
  3. コンテキストの小さな変化が、プログラムがそのコンテキストにどれだけ適合するかを根本的に変えうる
  4. 新しいプログラムは、どんな形であれ未知の世界へ向かうことになる。どの方向にせよ、自分が何をしているのか正確には分からないことが多い
  5. 型、抽象化、テスト、バージョン、状態機械、不変性、形式的解析などは、不慣れな地形で使える道具である
  6. こうした道具のいくつかは、どうしても過剰に使ってしまう。理想的な使用量は私たちが思っているよりはるかに少ない。使いすぎは技術的負債である
  7. 文脈への理解が安定したら、プログラムのかなりの部分を捨てて最初からやり直す価値がある
  8. 書き直す前に、プログラムに求めるすべてのことと、プログラムが扱うべきすべてのシナリオを一度に頭の中へ入れなければならない
  9. すべてを一度に構築すること
  • テストとバージョン管理は、この進化の最後の段階に到達するうえで妨げになる
  • テストは懸念を忘れさせ、バージョン管理は過去に執着させる

GN⁺の見解

  • プログラムが複雑になりすぎると、8段階目であらゆることを記憶しておくのは不可能になるかもしれない。これはほとんどのソフトウェア、特に2人以上で書かれたソフトウェアに当てはまる
  • すべてのソフトウェアが必ずしも9段階目に到達する必要はない。多くの Freewheeling Apps は、初期設計の選択にかかわらず、数人が使うだけでもバグのない状態に安定化できるほど、十分に単純でゆっくり進化する
  • 9段階目に到達するうえで、データ中心設計は明らかに有用である。これは盲目的に適用できる道具ではなく、immediate data structure choices を超えて、プログラムがデータへどうアクセスするかという全体像を見るための考え方である
  • これらの段階は完全に正しいとは限らない。経験の少ない道具を過小評価している可能性もある
  • こうした段階の先にどんな段階があるのか気になる

1件のコメント

 
GN⁺ 2024-08-06
Hacker Newsの意見
  • テストがなければ問題が見えず、問題が消えたように見える

    • テストをすると、いつもバグが見つかった
    • テストを削除するのは自分をごまかすことだ
    • ページを読んだ後、変更/構成管理にうんざりしているという印象を受けた
    • ユーザーが多くなければ収益は得られない
  • テストとバージョンを捨てたら、より良いプログラムが得られた

    • 2024年にソースコード管理を使わないのは理解できない
    • 複数のデバイスで作業し、履歴を見て、ロールバックし、ブランチを作る機能は非常に有用だ
  • 最初は著者が間違っていると思ったが、良い洞察がある

    • このワークフローは著者にとても合っている
    • Gitや自動テストで生産性が下がった経験があるのだろう
    • シンプルな代替手段もある(例: Dropbox、FTP)
    • 著者は小さなプログラムを作るのが好きだ
    • 自動テストは有用だが、著者の場合は価値が現れないのかもしれない
  • バージョン管理と自動テストは現実の問題を解決する

    • 今日、プロジェクトをバージョン管理なしで始めるのは正気ではない
    • 自動テストはベストプラクティスだ
    • 著者の特定のユースケースでは合理的かもしれない
  • 大きなプログラムを書いたりリファクタリングしたりするときは、書いて捨ててまた書くことが重要だ

  • この記事は混乱している

    • なぜ最初にアップボートされたのか不思議だ
  • 小さな変更がプログラムの適合性を大きく変えることがある

    • K9 Mailの例がある
    • K9 Mailは非伝統的なUIで始まった
    • 多くのユーザーが新しいUIに不満を持った
    • 小さな変更がアプリの適合性を壊した
    • 今でも古いバージョンを使っている
  • 一人でソフトウェアを作るのと、チームで作るのはまったく違う

    • テストは手段であって目的ではない
    • 自信があるときはテストを減らす
    • 重要な部分に統合テストを追加する
    • 新しいAPI設計には単体テストが有用だ
  • 2022年にFreewheeling Appsの作業を始めた

    • テストがなくてフラストレーションを感じた
    • テストスイートはシステムを発展させる自信を与える
    • 機能の複雑さが増すとテストが難しくなる
    • 2024年にすべてのテストを削除した
    • この哲学は一人の人間にしか当てはまらない
  • 小さな変更がプログラムの適合性を大きく変えるという点には同意しない

    • 短期主義は小さな変更に適応するためのものだ
  • 著者が好きで、Muプロジェクトも好きだ

    • 現代的なLispマシンだ
  • ソフトウェアエンジニアリングの複雑さに圧倒される

    • すべてのアイデアを拒否することは解決策ではない
    • テストを書き、VCSを使い、抽象化を使うべきだ
    • なぜ使うのかを理解し、理由がなければ再評価すべきだ