おもちゃソフトウェアを作る楽しさ
(blog.jsbarretto.com)- Toyソフトウェアの制作は、ソフトウェア開発の本質的な楽しさと創造性を取り戻す方法である
- AIと産業化によってソフトウェア開発の純粋な喜びが失われつつある時代に、個人プロジェクトとしてシンプルなおもちゃプログラムを作ることは、実務で役立つ知識と深い理解を得るきっかけになる
- おもちゃソフトウェアは80:20の法則に従い、最小限のコードで最大限の機能を実装し、過度な設計や完成度への執着を避けることが核心である
- LLMなどのAIツールに依存せず、自分でぶつかりながら作る経験そのものが、学習と成長の本質的な喜びである
なぜおもちゃプログラムをもっと作るべきなのか
- Richard Feynmanの名言「自分で作れないものは、理解していないということだ」→ 何かを自分で作る経験は深い理解につながる
- これまでの「車輪の再発明をするな」という助言とは逆に、車輪を自分で作ってみる経験は、読書や理論学習よりも多くのことを教えてくれる
- 近年、AIとソフトウェアの産業化が開発の楽しさと職人気質を脅かしている
- おもちゃソフトウェアの制作は、再びコンピュータに夢中になれるシンプルな楽しさを取り戻させてくれる
おもちゃプログラムの原則: Keep it simple
- おもちゃソフトウェアは80:20の原則に従う: 20%の労力で80%の機能を達成する
- 目標は最終製品ではなく、シンプルさと主要な原理を自分で実装することにある
- 過剰な構造設計(over-engineering)を避け、本当に必要なコードだけを書くやり方を重視する
- すべてのコードパスをまだ実装していない状態のままにしておき、必要になるたびに実装を増やしていくようなアプローチを勧めている
- 小さく見えるシステムでも、実際にやってみると意外と簡単に作れることを体験できる
おもちゃソフトウェアの副次的な利点
- おもちゃプロジェクトで得た知識が、実務における問題追跡、バグ修正、ミスの予防に予想以上に役立つことが多い
- 自分でぶつかりながら制約条件を体験することは、ソフトウェアの本質への洞察を与え、革新的な解決策の発見にもつながる
例: さまざまなおもちゃソフトウェアプロジェクト一覧
過去15年間に自分で実装してきたおもちゃプロジェクトの種類を、難易度と予想所要時間つきで整理している。各プロジェクトには簡単な説明と追加の参考資料が含まれる
- Regexエンジン(難易度 4/10、5日) : POSIXスタイルの正規表現を解釈し、一致する文字列を識別することで、正規表現の内部動作を深く理解できる
- x86 OSカーネル(難易度 7/10、2か月) : CLIとシンプルなドライバ、メモリマネージャなどを含み、インメモリファイルシステム、ELF実行ファイル、GUI、プロセス分離などへの追加挑戦も可能
- GameBoy/NESエミュレータ(難易度 6/10、3週間) : シンプルな命令セットとハードウェアへの理解、PPUやPSG、独特なカートリッジ形式の実装
- GameBoy Advanceゲーム(難易度 3/10、2週間) : スプライトベースのシンプルなゲーム。GBA開発コミュニティは活発で、1人でも十分に把握できるシステム構造
- 2D物理エンジン(難易度 5/10、1週間) : 基本的なニュートン力学とシンプルな衝突処理から始め、複雑な図形・慣性・解決アルゴリズム、ソフトボディや複合相互作用へ拡張可能
- 動的インタプリタ(難易度 4/10、1〜2週間) : ツリーウォーキングインタプリタで、自分だけの言語を作ることが技術的・創造的な喜びを与える
- C系コンパイラ(難易度 8/10、3か月) : 単純な型システムとターゲット環境から始め、各種最適化や多様なバックエンドを支えるアーキテクチャ設計へ発展できる
- テキストエディタ(難易度 5/10、2〜4週間) : シンプルなファイル入出力から始め、UIツールキット(QT/GTKなど)も利用可能。コンソールベースを好む人にも向き、unicode、syntaxハイライト、マルチバッファ、LSPなどの追加機能も試せる
- Asyncランタイム(難易度 6/10、1週間) : Rustなら
impl Futureタスク処理と並行性を実装し、I/Oウェイクアップも追加できる - Hash Map(難易度 4/10、3〜5日) : 内部動作の原理、クローズド/オープンアドレッシング、ロビンフッド規則を学び、性能と適切な使いどころを理解できる
- Rasteriser / Texture Mapper(難易度 6/10、2週間) : 3Dグラフィックスパイプラインの構造を学び、ベクトル数学、Zバッファ、テクスチャマッピングやシェーディングアルゴリズムまで深められる
- Signed Distance Fieldレンダリング(難易度 5/10、3日) : 数学的な空間表現とシンプルな可視化を通じて、シェーダとベクトル数学への理解を深められる
- Voxelエンジン(難易度 5/10、2週間) : 3Dグラフィックスやゲーム開発経験があれば理解しやすく、テクスチャ、手続き生成、ネットワークなどにも挑戦可能
- Threaded Virtual Machine(難易度 6/10、1週間) : 高速なインタプリタで、アーキテクチャごとのコード生成なしに最適化された処理系を実装でき、コンパイラに匹敵する性能を体験できる
- GUIツールキット(難易度 6/10、2〜3週間) : 基本的なUIツール作成を経験した後、レイアウトエンジン、テキストシェーピング、アクセシビリティなどの発展機能を自分で実装できる
- 軌道力学シミュレータ(難易度 6/10、1週間) : ニュートン重力モデルをシンプルに実装し、複数天体の相互作用、積分アルゴリズムや可視化への拡張、NASAデータの適用なども可能
- Bitwise Challenge(難易度 3/10、2〜3日) : 64ビットの状態だけで再現されるゲームで、創造的な状態管理の訓練になる。詳しいルールはGitHubで確認可能
- ECSフレームワーク(難易度 4/10、1〜2週間) : Entity-Component-System構造を自分で実装し、言語の型システム統合、高性能化、制約への最適化を試せる
- CHIP-8エミュレータ(難易度 3/10、3〜6日) : 1970年代のシンプルな仮想マシンで、素早く実装でき、さまざまなファンゲームを観察・実行できる
- チェスエンジン(難易度 5/10、2〜5日) : ルール実装から始めて徐々に発展させる。自作エンジンに負ける経験は、開発者として成長する一場面になる
- POSIX Shell(難易度 4/10、3〜5日) : POSIXベースのシェルの原理と限界、実際のShell言語互換性の実装を通じた深い理解、そして数多くのトリックを体験できる
LLMなどのツール利用に関する助言
- LLMなどの先端ツールも有用だが、本当の学びは自分で直接探究するときにより深まる
- 既存のソリューションを見るよりも、未知の領域を探究し、自分なりの答えを見つける過程のほうが、より深い達成感を得られる
- おもちゃプロジェクトをLLMなしで進めると、最初は慣れずに大変かもしれないが、時間が経つほど固有の技術的な喜びと高い達成感を感じられるようになる
- 車で移動していては、走者としての「ランナーズハイ」は味わえない → 近道ではなく自分で体験することから深い喜びを得られる
3件のコメント
LLMを使わずにやってみろというのには共感します。迅速な開発が必要でないなら、自分で一つひとつ理解しながら作っていくほうが、より楽しくてやりがいがある気がします。
トイプロジェクトのことだったんですね。タイトルだけ見て、おもちゃに入るソフトウェアを作ることだと思っていましたね。笑
Hacker Newsの意見
LLMを検索エンジンのように使っている人がいるのか気になる。以前は Google で
pros cons mysql mongodbのように検索して、公式ドキュメント、フォーラム、ブログ、Stack Overflow まで読み漁っていて時間がかかっていた。ただ、読みながら学ぶ時間そのものはいつでも歓迎だった。今は LLM にもう少し具体的に、たとえば「写真保存時の mysql vs mongodb の長所短所、参考リンクも添えて」といった感じでプロンプトを入れている。すばやく要点を把握できるし、リンクも付くので幻覚だけに頼らなくていいのがよい。たまに「postgres で写真メタデータを保存する data schema を作って。X は別テーブルに分けたい」など具体的な依頼もするが、これは自分がどんな成果物になるべきかを正確に分かっている時だけ使う。単にタイピングの時間が惜しい時や、型の正式名称(intとintegerなど)を一瞬忘れた時に使うだけ/src/fooにある自分が clone した repo を分析してbarFeatureがどう実装されているか説明して。次に/src/bazプロジェクトを見て、foo のアプローチが baz に適用しにくい理由を説明して」といった使い方だ。何か新しいものをやらせるのではなく、既存プロジェクトを自分のアイデアに翻訳して活用している。本当に新しくて挑戦的な開発は、自分で直接コードを書いてこそ楽しいキャリア的に見ても、いちばんよかったことの一つは、転職の合間に6か月休んで進めた個人プロジェクトだ。もともと始めたいプロジェクトは多かったが、制約がないとスコープがどんどん膨らみ、結局完成しないことが多かった。そこで各プロジェクトに1週間だけ投資すると決めた。1週間でできるところまでしか作らなかった。ゼロから始めて、新しい言語やフレームワーク、あるいは不慣れな分野で、1週間で実用的な何かを作れた経験は、とてつもなく自信につながった。自分がもともとプログラミングを好きだった理由も思い出せた。もし転職の合間に数か月ほど休みができるなら、シリコンバレー面接の準備をする代わりに、ただトイプロジェクトを作ってみると、自分がすでにどれだけ多くのことを知っていたかに驚くはず
トイソフトウェア開発は、自転車や車、ボートの整備に似ている。楽しい。でも通勤用の自転車を直すのはストレスだ。トイソフトウェアを作るのは楽しいが、いつか自分が本当に使おうとすると、あらゆるバグを発見してしまい、直す時間はないというジレンマが生まれる
LLMに対して否定的な意見が多いのが意外だ。LLMは情報をスプーンで口まで運んでくれる。新しいプロジェクトを始める時、当然ながら最初からすべてを知っているわけではない。ベストを尽くして失敗し、その後で勉強し、なぜ駄目だったのかを理解し、新しい方法で調整することこそ本当の学びだ。何もかも知ったうえでただチュートリアルをなぞるだけでは、手法ごとの限界や本当の長所短所を体験できない。たとえば正規表現でパーサーを作ろうとして、再帰表現を扱えないことを自分で発見し、より複雑な構造や時間計算量の問題なども自分の手でつかんで学ぶべきだ。自分で最適化コンパイラを実装して、あらゆる最適化テクニックに打ちのめされることで、実際のコンパイラがなぜそう設計されているのか理解できる。自分でレイアウトエンジンを書けば、
widthという概念ひとつを適切に扱うことの苦労すら体験できる。試行錯誤を通じて学ぶこと以上によい経験はない。LLMが失敗を防いでくれるからといって、大事な学習機会まで逃してほしくない自分もコンピュータグラフィックスを学ぶために、何年も週末や夜を使って数えきれないほど奇妙なプロジェクトをやってきた。1円も稼げなかったが、そのおかげで夢の仕事を得られた。代表的な成果物へのリンク:
この記事が示した「プログラミングの楽しさ」という精神は本当に必要だと感じる。AIエージェントコーディングの時代にはなおさら貴重だ。ただ、著者が示したトイプロジェクトの想定所要時間は短すぎる気がする。自分は平均的な速さではないが、それでもあのリストの大半は、1日2〜3時間ずつ作業する前提なら数日で終わるプロジェクトではないと思う。始める前のリサーチだけでもかなり時間がかかる感覚だ。たとえば最近、自分の Pelican ブログを個人製の Odin static site generator に置き換えたが、1日2〜3時間しか使わなくても2週間かかった。あのリストのほかのプロジェクトより簡単な部類だったのに、そのくらいかかった
「LLMをこういうプロジェクトに使うな」という助言には自分も同意するが、あまり極端に受け取らないほうがよいという立場だ。AIの助けをどう受けるべきかという助言が、なぜ人に助けを求めるのとは違って感じられるのか、という点も興味深い。ブログの最後に「プログラミングが得意な友人がいるなら絶対に助けを求めるな」と書いてあったら変だろう。専門家の友人なら文脈を理解し、自分で解けるように助けてくれる。AIにも本当に「問題を解いてもらうのではなく、専門家の友人のように導いてほしい」と頼んでみた人は、ほとんどいないはずだ。もちろん今はまだできないか、不十分かもしれないが、1〜2年後にはこういうガイドのされ方がごく自然になっているかもしれない。だから「自分がどんな助け方を望んでいるかを明確に伝える」習慣をつけるとよい。LLMが必ず間違った正解しか返さない、という固定観念を持つ必要はない
Claude ベースの vibe coding のおかげで、本当に久しぶりに楽しいサイドプロジェクトを始められた。ツールとプロセスに慣れてから数週間で、家族向けのカレンダー/天気ダッシュボード、Bluesky の閲覧アプリ(既読の投稿を隠す)、ゲーム化した会社向け PM ダッシュボード、一定時間後に Reddit 投稿を隠す Chrome 拡張、保守されていない WordPress プラグインの代替アプリなど、いろいろなアプリを素早く作っている。初期には Claude に UI 改善など多くを任せていたが、今では90%の完成度で満足し、高度化よりも新しいアプリ機能に集中するコツをつかんだ
このリストは本当に印象的だ。著者には簡単に感じられたプロジェクトのかなりの部分が、自分にはぐっと高難度に見えるだろう。でも実際、自分のトイプロジェクトをまた始めたくなる動機づけには確実になった。ただ、LLM学習についての結論はもう少し繊細だ。どう使うかでまったく違う。たとえば「この問題をそのまま実装して」と頼むのは学習に最悪だし、「ELFの構造を最上位の抽象度で、『なぜ』に焦点を当てて説明して」は逆に強力な学習促進剤になる。毎回自分でリサーチしなくなるのは欠点かもしれないが、本当に知的に考える姿勢があるなら、ソクラテス式の問答をいつでも受けられるのは、学習を大きく加速する
ここで紹介されているプロジェクトは本当にいいアイデアだが、自分にはどれ一つとして面白そうに思えない。こういう時、自分は本当にプログラミングが好きだったのだろうかと疑問になる