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

プログラミングの美しさ (2001)

概要

  • Linus Torvalds によるプログラミングの魅力についてのエッセイ
  • プログラミングは 創造性論理性 を融合させる活動
  • 物理学数学 との共通点と違いについての考察
  • オペレーティングシステム 開発の意義と難しさ
  • 問題解決における 美しさ発見 の喜び

プログラミングの魅力

  • プログラミングは チェス 以上に奥深いゲーム
  • 自分自身でルールを作り出す ことができる自由度
  • 外から見ると 退屈 に見える活動
  • コンピュータは 命令通りに動作 し、永遠に従順
  • ただし、 盲目的な従順さ だけでは魅力に欠ける
  • 自分で方法を考え出す 必要性がプログラミングの面白さ

物理学・数学との比較

  • コンピュータサイエンス は物理学に似ている側面
  • 物理学は 既存の世界の仕組み を探究
  • プログラミングは 自分で世界を創造 できる点が異なる
  • コンピュータ内の世界 では自分が創造主
  • 制約は マシンの能力自分自身の能力

芸術と工学の融合

  • ツリーハウス の例で、機能性と美しさの違いを説明
  • プログラミングは 芸術性と工学的思考 の融合
  • 機能性よりも 創造性や美しさ が重視される場合も多い
  • 創造的な活動 としてのプログラミング

数学的世界とプログラミング

  • プログラミングの魅力は コンピュータの仕組み を理解する過程
  • コンピュータは 数学の世界 と同様、独自ルールで構築可能
  • 自己矛盾のない世界 を作る必要性
  • 美しい世界には 欠陥がない ことが重要

新しい世界の創造と視覚化

  • コンピュータは 新しい世界の創造可能性の発見 を可能にする
  • Mandelbrot集合 のようなフラクタル図形の視覚化
  • 純粋に数学的な世界を コンピュータで可視化 できる意義
  • プログラミングによる 新しいパターンや美しさ の発見

問題解決とプログラマの資質

  • 多くの場合は 特定のタスク解決 のためのプログラム作成
  • 思考力 が求められる作業
  • 長時間画面を見つめて考え抜く オタク的資質

オペレーティングシステム開発の意義

  • OS はコンピュータ上の全てのプログラムの基盤
  • OS開発は 究極の挑戦
  • OSは 仮想世界の憲法 のような役割
  • 他のプログラムは 通常法 に相当

問題解決の美しさ

  • 最適な解法 を見つける喜び
  • 問題の本質を見抜き、 新しい視点 で解決する重要性
  • Carl Friedrich Gauss の逸話による説明
    • 1から100までの合計を パターン認識 で瞬時に解決
  • プログラミングでも 美しい解法 が最良とされる

発見の喜び

  • 壁にぶつかりながらも、美しい解決策を見つけた時の達成感
  • 三日間悩んだ末の発見 が最高の瞬間
  • プログラミングの本質的な魅力は 創造と発見

Hackerたちの意見

その頃はもっと楽しかったな。

同意!誰かがご飯をくれて、寝かせてくれて、おむつを替えてくれるなら、指一本動かさずに済むよね。

もちろん、でも夜間にC言語でプログラミングして、1999年のように振る舞うこともできるよ。誰かが指摘したように、家ではKubernetesやマイクロサービスなんて必要ないし。

まだ2001年みたいにコーディングしてるよ!

フレデリック・ブルックスの言葉が好きだな: 「プログラミングはなぜ楽しいのか?プログラマーが期待する報酬は何か?まずは、ものを作る楽しさだ。子供が泥団子を楽しむように、大人も自分のデザインで何かを作ることに喜びを感じる。この喜びは、神がものを作ることに対する喜びのイメージだと思う。それは、葉っぱや雪の結晶の独自性や新しさに表れている。次に、他の人に役立つものを作る楽しさがある。心の奥底では、他の人に自分の作品を使ってもらい、役立ててもらいたいと思っている。この点で、プログラミングのシステムは、子供が「パパのオフィス用」に作った最初の粘土のペン立てと本質的には変わらない。三つ目は、複雑なパズルのような動く部品を組み合わせて作り、それが微妙なサイクルで動くのを観察する魅力だ。プログラムされたコンピュータは、ピンボールマシンやジュークボックスのメカニズムの魅力を最大限に引き出している。四つ目は、常に学ぶ喜びだ。タスクの非繰り返しの性質から生まれる。問題は常に新しく、解決者は何かを学ぶ:時には実用的で、時には理論的、時にはその両方だ。最後に、扱いやすいメディアで作業する喜びがある。プログラマーは詩人のように、純粋な思考の素材から少し離れたところで作業する。彼は空気から空気で城を作り、想像力を駆使して創造する。創造のメディアの中で、これほど柔軟で、磨きや再作成が簡単で、壮大な概念構造を実現できるものは少ない。しかし、プログラム構造は詩人の言葉とは異なり、実際に動いて機能し、構造自体とは別に目に見える出力を生み出す。結果を印刷したり、絵を描いたり、音を出したり、腕を動かしたりする。神話や伝説の魔法が私たちの時代に現実になった。正しい呪文をキーボードに打ち込むと、ディスプレイが生き生きとし、存在しなかったものや存在できなかったものを見せてくれる。だからプログラミングは楽しい。私たちの内に深く根付いた創造的な欲望を満たし、全ての人間が共通して持つ感性を喜ばせるからだ。」

それは素晴らしかった。シェアしてくれてありがとう。

最後に、扱いやすいメディアで作業する喜びがあります。これが、多くのプログラマーがAIコーディングをあまり好まない大きな理由の一つです。プロンプトとLLMの出力の関係は、あまり扱いやすくないですからね。

素晴らしい抜粋ですね。出典はどこですか?

プログラマーは詩人のように、純粋な思考から少し離れたところで働いている。彼は空中に城を築き、空気から作り出し、想像力を駆使して創造する。これがプログラミングが楽しい理由の一つであり、同時に、なんとか動く巨大な混乱に陥りやすい理由でもある。

個人的には、自動化の側面が好きで、時間を節約してエラーを減らすものを作ったり、非現実的な物理法則みたいなルールを考えたりして、それがどう展開するかを見るのが楽しい。インタラクションやフィードバックを加えるとさらに良くなるし、デバッグやエッジケースを考慮するのに頭を悩ませるのも、すごくいい気分なんだ。

何かに没頭して、ビジョンを達成するために無理して起きているのが懐かしい。

2001年から

仕事でのプログラミングは好きだったけど、今はプレッシャーや制約なしでできるプログラミングが大好き。自分のリアルな環境で、すべての行や機能が反映されているのが見えるし、外部の誰かに取り上げられることもない。ハードウェアやスタックの自由な選択もあって、文化やスタイルガイド、ベンダーロックインに合わせる必要もない。ブロブ?corebootを使うと、自分のハードウェアが生きているように感じる。それ以来、プログラミングを仕事だと思わなくなって、嫌悪感もなくなった。アイデアがリアルな電子の中で踊る、完全なプラトン的な領域だ。この記事に感謝、幸運を感じることができることを思い出させてくれて、同じような考えを持つ人たちに会えるのは嬉しい。頑張れ!

だから、お金のためだけじゃなくて楽しむためにプログラミングをすべきなんだ。APIのためのインターフェースを作るのは楽しいし、顧客が抱えている問題を解決するのも面白い。会社の製品の一部として新しいシステムを作るのもやりがいがある。でも、本当に楽しいのは、ゼロから何かを作り出すことなんだ。形を作ったり、リファクタリングしたり、試したり、切ったり、学んだり、新しいアイデアを探求したりすること。お金が絡むと、こういうことはなかなかできない。純粋なプログラミングのアートに再接続したいなら、趣味のプロジェクトを始めてみて。両方の端でそのキャンドルを燃やして、自分の疑念を乗り越えて、挑戦を乗り越えて、ただその1つのアイデアを追い続けて。完成すれば、自分だけの小さな宇宙を作ったことになる。誰も見なくても、気にしないで。アートは表現の一形態で、プログラミングもそうなんだから。

自分で学ぶ必要があるかもしれないアドバイスを一つ:仕事の習慣が入り込まないように気をつけて—依存関係、ツール、コードスタイル、きれいなドキュメント、マルチプラットフォームサポート、適切なコミットメッセージ、そして最も重要なのは「MVP」や「フィーチャークリープ」の概念。気を散らされているときは、気を散らされることを楽しむ努力をして、仕事では正当化できないことをやってみて。ユーザーが気づかないようなこと、いつも後回しにしていた磨き作業、あるいは自分の本のライブラリにある過剰に設計された仕様準拠のOAuthサーバーなど。誰もそれを評価することはできない。締切もないし、完成しなくてもいいじゃん?ウサギの穴にどこまででも深く入っていくのはカタルシスがあって、日常の仕事では得られない自由だから、もっと価値がある。少なくとも、サイドプロジェクトが面倒になった瞬間に興味を失うことに気づいたし、またDependabotに地獄に行けって言うのを思い出す。

オスカー・ワイルドからの引用 有用なものを作ることは許せるが、それを賞賛しない限り。無用なものを作る唯一の言い訳は、それを強く賞賛することだ。すべての芸術はまったく無用だ。

でも、本当に楽しいのは何かをゼロから作り出すことなんだ。形を作ったり、リファクタリングしたり、色々試したり、切り捨てたり、新しいアイデアを探求したり。お金が絡むとあんまり合わないことばかりだけどね。俺のプログラミングはアートの文脈で行われてる(コンピュータ音楽やメディアアート)。お金を稼ぎながら、君が言ってることを全部やってるよ。自分が心から楽しめるものを作れば、お金はその喜びを奪わないと思う。普通の企業の仕事では、ただの代替可能な歯車に過ぎなくて、数年後には自分のコードも置き換えられるから、こういう満足感を見つけるのは難しいんだろうね。

プログラミングは楽しいです。99.99%の時間、エラーは自分のせいだから。他の人と関わるときは、数字が曖昧になるし。コンピュータの方が、非技術系の人とのやり取りよりも全然いいよ(亡くなった偉大な本や音楽を残した人を除いて)。

ビットシフト >> って何? ここで、非コーダーと関わらずに過ごせる日は俺にとって贈り物だって認められるよ、笑。

なんでこれが今日シェアされたの?それに、ブリン・モーアでの抜粋は何なの?文句は言わないけど、何か見落としてるコンテキストがあるのかなって思って。

僕のプログラミング脳には二つのモードがある。一つは遊びモード、もう一つは作業モード。月曜から金曜の9時から5時は作業モード。その他の時間は遊びモード。実際、どちらかのモードでは僕はずっと良いプログラマーなんだ。どっちかは簡単に想像できるよね。作業モードでは、午後の3時間をかけて問題を解決しようとすることもある。後戻りはできない、時間がどんどん過ぎていく!遊びモードでは、同じ問題で3時間遊んでも、うまくいかなかったら、まあ、いいや。それはちょっと楽しかったけど、もう少し遊んでみて、他のことを試してみよう。バン!エルドシュの本からの、素晴らしく明快で美しい解決策が出てきた。後者のモードでの喜びは、プログラミングへの愛を支えてくれるけど、仕事の時間に作業モードの暗い沈滞に引き込まれずに、遊びモードに留まる方がいいって、爬虫類脳を納得させられたらいいなと思う。

何かへの情熱を失いたいなら、それを仕事にしちゃいなよ。

散歩したり、窓の外を眺めたり、Redditをブラウジングしたり、脳を休ませるために昼寝したりするのは、プログラミングの仕事にとって欠かせない部分だと思う。これを理解してほしいのは、雇用主も従業員も同じだよ。

地球上で一番バカな人間だと感じる瞬間から、一番賢い人間だと感じる瞬間への、絶え間ない切り替えに勝るものはない。

ちょっと待って…スマートモードってあるの?