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

おもちゃソフトウェアを書くことは楽しい

概要

  • Toyプログラム 作成の意義と魅力について解説
  • 知識の深化 や問題解決力向上のための実践的アプローチを紹介
  • 現代のソフトウェア開発 における課題と喜びを再発見する方法を提案
  • おすすめのToyプログラム一覧 と難易度・所要時間の目安を掲載
  • 学習リソース や追加チャレンジも併せて紹介

なぜToyプログラムをもっと書くべきか

  • Richard Feynman の名言「自分で作れないものは理解できない」への共感
  • 自作経験 が本質的な理解やスキル向上の源泉
  • 「車輪の再発明を避けるべき」 という意見への反論
    • 自分で「車輪」を作ることで、理論書を何冊読むよりも深い理解を得られる体験
  • 2025年のソフトウェア開発 の現状
    • AIの台頭 や開発のコモディティ化・工業化が進行
    • 創造性や楽しさの喪失 への危機感
  • Toyプログラム 作成による純粋な喜びの再発見

Toyプログラム作成のコツ

  • 80:20ルール の活用(20%の労力で80%の機能を目指す)
  • 本番品質を目指さない 割り切り
    • 必要最低限の実装に絞り、過剰設計を徹底的に避ける
  • 未実装部分はpanic/crash させて、必要になった時だけ追加
  • 難しそうに見えるものでも、実際に作ってみると意外と簡単な発見

Toyプログラム作成のその他のメリット

  • 断片的な知識 が本業で役立つ場面の多さ
  • ライブラリやツールの問題発見 ・トラブルシュートのスピード向上
  • ソフトウェアの制約条件 の体感的理解
  • 独自の解決策 や発想の創出につながる可能性

おすすめToyプログラム一覧

  • 難易度所要時間推奨リソース 付き
  • いずれも 汎用プログラミング言語 の基礎がある前提

正規表現エンジン(難易度4/10、5日)

  • POSIXスタイルの正規表現を解釈・判定するエンジン
  • Wikipedia: Regex

x86 OSカーネル(難易度7/10、2ヶ月)

  • マルチブート対応カーネル、CLI、デバイスドライバ、メモリ管理等
  • OS Dev Wiki

GameBoy/NESエミュレータ(難易度6/10、3週間)

  • シンプルなGBやNESゲームのエミュレータ
  • GB DevNES Dev Wiki

GameBoy Advanceゲーム(難易度3/10、2週間)

  • スプライトベースのGBA用ゲーム
  • ToncGBATEK

2D物理エンジン(難易度5/10、1週間)

  • 剛体物理、衝突判定、複雑な形状・運動量対応

動的インタプリタ(難易度4/10、1-2週間)

  • JavaScript風言語のツリーウォーク型インタプリタ
  • Crafting Interpreters

C風コンパイラ(難易度8/10、3ヶ月)

  • シンプルな型付きC風言語のコンパイラ
  • 最適化やIR設計の追加チャレンジ

テキストエディタ(難易度5/10、2-4週間)

  • 基本からUnicode対応やLSPサポートまで幅広い設計

非同期ランタイム(難易度6/10、1週間)

  • RustならFutureタスクの同時実行・I/O対応

ハッシュマップ(難易度4/10、3-5日)

  • クローズド/オープンアドレッシング、ロビンフッド法等
  • Robin Hood Hashing

ソフトウェアラスタライザ/テクスチャマッパ(難易度6/10、2週間)

  • 3Dグラフィクスパイプラインの実装
  • Scratch-A-PixelHow OpenGL works

SDFレンダリング(難易度5/10、3日)

  • 数式で定義された3D空間の可視化
  • Inigo Quilez’s SiteShaderToy

ボクセルエンジン(難易度5/10、2週間)

  • Minecraft風の基礎エンジン
  • 0 FPS: Meshing in a Minecraft Game

スレッド仮想マシン(難易度6/10、1週間)

  • 高速インタプリタの設計と最適化
  • Wikipedia: Threaded codemuforth.dev

GUIツールキット(難易度6/10、2-3週間)

  • 独自のGUI設計・実装・アクセシビリティ対応
  • YouTube: How Clay’s UI Algorithm Works

軌道力学シミュレータ(難易度6/10、1週間)

  • ニュートン重力のシミュレーション
  • Wikipedia: Leapfrog integration

ビットワイズチャレンジ(難易度3/10、2-3日)

  • 64ビットのみで全状態を管理するゲーム設計
  • The Bitwise Challenge

ECSフレームワーク(難易度4/10、1-2週間)

  • ゲーム開発者向けEntity-Component-Systemの自作

CHIP-8エミュレータ(難易度3/10、3-6日)

  • 70年代のシンプルな仮想マシン
  • Wikipedia: CHIP-8

チェスエンジン(難易度5/10、2-5日)

  • 合法手の判定・探索アルゴリズムの実装

まとめと次のステップ

  • Toyプログラム作成 は知識の定着・創造力の刺激に最適
  • AIや自動化時代 においても、人間ならではの発見や楽しさを再認識
  • 学んだ技術 を本業やプロジェクトで活かすための基礎固め
  • 小さな成功体験 の積み重ねが、開発者としての自信と喜びにつながる

Hackerたちの意見

トイソフトウェアって、自転車や車、ボートとかをいじるのと似てるよね。自転車をいじるのは楽しいけど、明日仕事に乗っていく自転車をいじるのはストレス。トイソフトウェアを書くのが恋しいな。楽しいんだよね。でも、結局そのソフトを使いたくなっちゃうから、そこから問題が始まる。バグを見つけるけど、直す時間がないんだよね。

俺も「実用的なソフト」に興味があるけど、時間とエネルギーが足りないんだ。多くは、何度もやった退屈な細かい作業がいっぱい。自分がやりたいことに取り組めるのはちょっとワクワクするけど、それを「AI」に書かせるのは挑戦でもあるし、手間がかかるんだよね。だから、全てがバラ色ってわけじゃない。ちなみに、今はまだ実験段階の初期だから、数ヶ月後にこの意見を持ってるかはわからないけど。

最近、自分の請求書アプリを作ったんだ。欲しい機能を追加する楽しさに夢中になっちゃった。これらの機能は、大手製品では月額料金がかかるものばかり。タイムリーに請求書を出す必要があったんだ。アプリを使いたい気持ちがあったけど、スタイリングや住所の追加など、直さなきゃいけない問題があった。そこで、君が言ってたことに気づいたんだ。ある時点で、自転車をいじる楽しさと、日常使いの自転車の「有用性」を優先する方が良くなるんだよね。そうすることで、楽しさと有用性が時間とともに収束するかもしれない。

以前は自分でメールをホスティングしてたんだ。でも、今はもうやってない。まさにこの理由からね。もちろん、これは「自分でやれ!」っていう他のすべての熱心な呼びかけにも当てはまる。実際、フルタイムでやってる誰かに委任したいんだ。

うーん、わからないな。仕事に行くために使う自転車を修理するのって、唯一の自転車だったらストレスになるかも。仕事に行くのに必要だし、もし一日でも休んだら上司がめっちゃ怒るだろうしね。もし予備の自転車があれば、そんなに大変じゃないんだけど。実はこの比喩がすごく好きで、1) 車の複雑さのせいで、重要な修理ができないことが多い 2) 生活環境をその複雑なものに合わせて構築してしまっている 3) 時々、ランダムに故障して、関係者全員にとってミニ危機になることがあるけど、専門家に見てもらうために仕事を休まないと解決できない 4) 自転車は同じ状況だけど、大抵の問題はちょっとしたキットで自分で直せるんだよね。それなのに、車を持つことは大人の証みたいに見られるのが不思議。ちょっとした考えだけど、カスタマーサービス以外のほとんどの場所は、スループット重視で、誰かが一日休んでもそれほど重要じゃないんだよね。もし本当に「稼働時間」を気にするなら、みんな仕事の近くに住んで、自転車を直せるようにしてるはずだし、バス路線もあったかもね。

明日仕事に行くために必要な自転車を修理するのはストレスだよね。他の人も毎日使ってる自転車を修理するのはどう?それが仕事だよ。

これはかなり印象的なリストだね。著者にとって難易度が低いものも、俺にはかなり高いかも。刺激を受けるし、自分のトイを引っ張り出したくなる。だけど、LLMを使った学習についての結論にはもう少しニュアンスが必要だと思う。使い方次第だよね。これは学習には最悪なプロンプトだね:> この解決策を実装してくれ これは学習には素晴らしいプロンプトだよ:> ELFについての概要を教えて。高レベルの抽象に焦点を当てて、「どうやって」より「なぜ」にもっと重点を置いて。確かに、質問が出たときに自分で調査しなくて済むのは何かを奪っていると言えるけど、もし誠実に知的な作業(つまり、本当に考えること)をしているなら、常に質問を議論できるソクラテス的な教師がいるのは学習プロセスを加速させる素晴らしい助けになるよ。

キャリアに関して自分のためにやった最高のことの一つは、仕事の合間に取った6ヶ月のサバティカル中に起こった。やりたいプロジェクトがたくさんあったけど、スコープクリープに悩まされてたんだ。制約がないと、プロジェクトの大きさを決めるのが難しくて、どんどん巨大で終わらないものになっちゃう。だから、プロジェクトごとに1週間だけに自分を制約することにした。1週間でできることがそのプロジェクトの内容。新しい言語やフレームワーク、新しい分野でゼロから使えるものを作る経験は、自信を大きく高めてくれた。プログラミングが実際に得意だって気づいて、今まで直面してきた壁を突破できたことで、新しい挑戦に取り組む自信がついたんだ。新しい仕事を探してるときにすごく役立ったよ。同時に、プログラミングの楽しさを思い出させてくれた。1週間で、自分や知り合いが抱えていた問題を解決するものを作れたし、創造的で知的に挑戦的な方法でできたんだ。もし仕事の合間に数ヶ月の休みが取れるなら、リートコーディングとかはやめて、トイプロジェクトを作ってみて。自分がどれだけ知ってるかに驚くと思うよ。

自分も同じことをやったけど、AIがいろいろな定型文を生成して、自動テストを作る手助けをしてくれるおかげで、このプロセスがかなり加速したよ。

ジェネAIは、自分のためにちょっとしたおもちゃプロジェクトを作るときには本当に素晴らしい助けになるよ。自分は主にバックエンドエンジニアだけど、フロントエンドもできるし、特に遅くはないけど、CSSの魔法には特に時間がかかる。昔は、CSSとの戦いで何時間もかかるのが分かっていたから、個人的なプロジェクトをやる気が起きなかった。AIツールを使えば、「きれいにして」って言うだけで済むから、85%くらいはできちゃう。重要なのは、スタイリングのフレームワークを入れてくれるから、あとはバグを直したり、編集したり、調整したりするだけで、すごく早く終わるってこと。だから、今は過去にクイックサンドのように感じていたことを乗り越えられるから、個人プロジェクトを作ることが増えたんだ。

若い頃、Classic ASP + SQLは簡単だったし、家のサーバーにIIS + SQL Serverをセットアップしてた。HTML/CSS/JavaScriptも書けたし。デプロイは... アップデートスクリプトを実行して、FTPでASPファイルをプッシュする感じだった。今は新しいやり方があるのは知ってるし、個人的にCI/CDを設定したいんだけど、「おもちゃプロジェクト」をやろうとすると、自分のソフトウェア開発ライフサイクルについて調べたり考えたりしてつまずいちゃう。おもちゃプロジェクトのホスティングやデプロイには何を選んでる?

残念ながら、レトコードが次の仕事を得るための鍵なんだよね。

Hacker Newsで議論の続きを見る