「プログラミングの本を一冊読み終えたのに、いざ自分で何かを作ろうとすると手が止まる」——これは、独学でプログラミングを学ぶ人がほぼ必ず通る壁です。文法は分かる、サンプルコードも写せる。でも、ゼロから動くものを組み立てる力が、なぜか身についていない。その原因の多くは、「読む・写す」学習に偏り、「自分で設計して作る」経験が足りないことにあります。

この壁を越えるための強力な処方箋が、本記事で紹介する Project Based Learning(プロジェクトベース・ラーニング)、別名「Learn by Projects(作って学ぶ)」です。これはGitHub上で公開されている、「何かをゼロから自作する」チュートリアルを言語ごとに集めた巨大なリンク集。テキストエディタ、OS、データベース、3Dレンダラー、コンパイラ——そうした「本格的なソフトウェア」を、手を動かして一から作り上げる教材が、23のプログラミング言語にわたって厳選収録されています。

注記:当サイトはAI関連OSSの解説を主軸にしていますが、本記事は読者からのリクエストに応える番外編として、AIに直接関係しない学習リソースを扱います。とはいえ、AIにコードを書かせる時代だからこそ「自分でゼロから作った経験」の価値はむしろ高まっており、AIを使う開発者にとっても示唆に富む内容です。

「写経」を卒業し、「自作」へ踏み出したいすべての学習者に向けて、このリストの中身と歩き方を、日本語で読み解いていきます。

1. Learn by Projectsとは — 「作って学ぶ」ためのチュートリアル集

Learn by Projectsは、その名のとおり「プロジェクトを通じて学ぶ」ためのチュートリアルを集めたリポジトリです。READMEの冒頭には、その狙いが端的に書かれています。

プログラミングのチュートリアルのリスト。意欲ある開発者が、アプリケーションをゼロから作る方法を学ぶためのもの。これらのチュートリアルは、各エントリで最初に挙げられている技術のカテゴリに分けられている。

ここで重要なのは「ゼロから(from scratch)」という言葉です。世の中のプログラミング教材の多くは、フレームワークやライブラリの「使い方」を教えます。それも大切ですが、Learn by Projectsが集めているのは一段深い——フレームワークやツールそのものを自分で作ってしまうタイプのチュートリアルです。

たとえばC/C++のカテゴリには、次のような「自作」プロジェクトが並びます。

・テキストエディタをゼロから作る(kilo)
・SQLiteのクローン(データベース)をCで作る
・自作のシェル(コマンドラインの対話環境)を書く
・CHIP-8エミュレータを作る
・x86のOSをゼロから書く(The Little Book about OS Development)
・ソフトウェア3Dレンダラー(TinyRenderer)を作る
・Cコンパイラを書く

「テキストエディタを自作する」と聞くと尻込みするかもしれません。しかし、こうしたプロジェクトを一つでもやり遂げると、それまで「魔法」に見えていたソフトウェアの内部が、理解可能な部品の集合として見えてきます。これこそが、プロジェクトベース学習の核心的な価値です。普段使っているVS Codeやデータベース、コンパイラといったツールが、急に「自分にも作れるかもしれないもの」に変わる——この認識の転換こそが、エンジニアとしての視野を一段引き上げてくれます。

なお、本記事は読者から共有された ckissi/Learn-by-projects を起点としていますが、この種の「作って学ぶ」リスト文化の本流には、practical-tutorials/project-based-learning(数十万スターを集める著名リポジトリ)や、codecrafters-io/build-your-own-x(「自分だけの〇〇を作る」)といったプロジェクトがあります。いずれも思想は共通で、「本物のソフトウェアを自作することで、深く学ぶ」という一点に貫かれています。

2. なぜ「プロジェクトベース学習」なのか

プロジェクトを通じた学習が効果的だとされる理由は、教育学的にも経験的にも、いくつもあります。整理してみましょう。

第一に、知識が「使える形」で定着することです。本を読んで得た知識は、使わなければすぐに忘れます。しかし、実際に何かを作る過程で「この概念をここで使う」という体験を経ると、知識は文脈とともに記憶に刻まれます。ポインタの説明を100回読むより、ポインタを使わないと動かないプログラムを一つ書くほうが、はるかに深く理解できます。

第二に、「分からないことを調べる力」が鍛えられることです。実際のプロジェクトでは、教材に書いていない問題に必ずぶつかります。エラーメッセージを読み、ドキュメントを探し、試行錯誤する——この一連のプロセスそのものが、実務で最も重要なスキルです。チュートリアルは、そのトレーニングの「足場」を提供してくれます。

第三に、全体像をつかめることです。断片的なサンプルコードをいくら集めても、「ソフトウェアがどう組み上がるのか」という全体像は見えてきません。一つのプロジェクトを最初から最後まで作り切ることで、設計・実装・デバッグ・改善という開発の流れを、身体で覚えられます。実務の開発も、結局はこの流れの繰り返しです。チュートリアルという安全な環境で、この一連のサイクルを何度も回せることが、実務への橋渡しになります。

第四に、ポートフォリオになることです。「テキストエディタを自作しました」「簡易データベースをゼロから書きました」という経験は、就職や転職の場面で、どんな資格よりも雄弁にあなたの実力を語ります。

「読む・写す」から「設計して作る」へ ① 文法を学ぶ 入門書・講座 写経・サンプル ② 作って学ぶ エディタ/DB自作 完成させる ③ 改造する 機能を足す 深い理解 ④ 発信 公開・解説 実力の証明
Learn by Projectsが埋めるのは「①文法を学ぶ」と「実務」の間の谷。作って・改造して・発信するまでが一連の学習サイクル(出典: ckissi/Learn-by-projects の趣旨をもとに作図)
ポイント:写経の次の一歩

入門書やオンライン講座で文法を学んだ「次」に、多くの人が立ち止まります。Learn by Projectsは、まさにその「次の一歩」を埋めるリストです。文法は分かるが何を作ればいいか分からない——という人に、「これを作ってみよう」という具体的な題材を、無数に提供してくれます。

3. 23言語をカバーする網羅性

Learn by Projectsの大きな魅力は、その言語カバレッジの広さです。READMEの目次には、23ものプログラミング言語・技術が並びます。

flowchart TD ROOT["Learn by Projects
言語別カテゴリ"] --> SYS["システム系
C / C++ / Rust / Go"] ROOT --> WEB["Web系
JavaScript / TypeScript
HTML/CSS / React"] ROOT --> APP["アプリ系
Java / Kotlin / Swift
Dart/Flutter / C#"] ROOT --> FUNC["関数型
Haskell / Elixir
Clojure / Scala / F#"] ROOT --> SCRIPT["スクリプト系
Python / Ruby / PHP
Lua / R"] SYS --> EX1["OS・DB・
エミュレータ自作"] WEB --> EX2["ブラウザアプリ・
フレームワーク自作"] FUNC --> EX3["インタプリタ・
言語処理系自作"]

C/C++、C#、Clojure/ClojureScript、Dart/Flutter、Elixir、Erlang、F#、Go、Haskell、HTML/CSS、Java、JavaScript、Kotlin、Lua、PHP、Python、R、React、React Native、Ruby、Rust、Scala、Swift——主要な言語はほぼ網羅されています。各言語のセクションには、その言語で「何かを作る」チュートリアルが、それぞれ十数件から数十件、リンクとして並んでいます。

この網羅性のおかげで、学習者は「自分が学びたい言語」を起点にプロジェクトを探せます。Rustを学びたいならRustのセクションへ、Goを深めたいならGoのセクションへ。そして、そこには「Build Your Own Lisp」「Ray Tracing in One Weekend」「Let’s Build a Simple Database」といった、定評ある名作チュートリアルが厳選されています。各エントリは「最初に挙げられた技術」でカテゴリ分けされているため、目当ての言語のセクションを開けば、その言語で挑戦できるプロジェクトが一望できる構成です。

特にシステムプログラミング系(C/C++/Rust/Go)のセクションは充実しており、OS、コンパイラ、データベース、ネットワークサーバー、エミュレータといった「コンピュータサイエンスの王道テーマ」を自作する教材が揃っています。これらは、大学のコンピュータサイエンス課程で学ぶような内容を、独学で体験できる貴重なリソースです。

言語の選択肢が広いことには、もう一つ隠れた利点があります。それは、同じ題材を別の言語で作り直すという学び方ができることです。たとえば、Cで簡易データベースを作った後に、同じものをRustで書き直してみる。すると、メモリ安全性に対する両言語のアプローチの違いが、身体でわかります。あるいは、Pythonでインタプリタを書いた後にHaskellで書き直せば、命令型と関数型のパラダイムの違いが、抽象論ではなく具体的なコードとして腑に落ちます。一つのリストの中に多言語の教材が揃っているからこそ、こうした「言語をまたいだ学習」が容易になるのです。

また、Web系(JavaScript/TypeScript/React)のセクションには、軽量なフロントエンドフレームワークやステート管理ライブラリを自作するチュートリアルが含まれます。普段ReactやVueを「使う」だけのフロントエンド開発者が、その内部で起きている仮想DOMの差分計算やリアクティビティの仕組みを自作を通じて理解すれば、フレームワークの挙動に振り回されることが格段に減ります。「使う」から「仕組みを知って使う」への飛躍は、エンジニアとしての一段の成長を意味します。

4. 何を作れるのか — 代表的なプロジェクト例

リストに収録されているチュートリアルの中から、特に人気が高く、学びの大きい「定番プロジェクト」をいくつか紹介します。これらは、プログラミング学習者の間で「一度はやるべき」と語り継がれてきた名作です。

作るもの 何が学べるか 代表的なチュートリアル
テキストエディタ 端末制御・バッファ管理・低レベルI/O Build Your Own Text Editor (kilo)
データベース B-Tree・ストレージ・SQLパース Let’s Build a Simple Database
OS ブート・メモリ管理・割り込み The Little Book about OS Development / xv6
3Dレンダラー 線形代数・ラスタライズ・シェーディング TinyRenderer / Ray Tracing in One Weekend
インタプリタ/コンパイラ 字句解析・構文解析・コード生成 Writing a C Compiler / Build Your Own Lisp
ネットワークサーバー ソケット・HTTP・並行処理 Beej’s Guide / C-Web-Server

これらのプロジェクトに共通するのは、完成したときに「仕組みが腑に落ちる」感覚です。たとえば「Ray Tracing in One Weekend」は、週末の数時間でフォトリアルな3D画像をレンダリングするプログラムを書き上げる、という体験を提供します。完成すると、3Dグラフィックスの裏側で何が起きているのかが、ただの知識ではなく「自分が作ったもの」として理解できます。

同様に、「Let’s Build a Simple Database」でSQLiteのクローンを作れば、普段何気なく使っているデータベースが、内部でどうデータを保存し、どうクエリを処理しているのかが見えてきます。「Build Your Own Lisp」でインタプリタを書けば、プログラミング言語そのものがどう動くのかを、作り手の視点から理解できます。

こうした「定番プロジェクト」が長く語り継がれてきたのには理由があります。それは、ちょうどよい難易度と、明確なゴール、そして完成したときの感動の大きさが、絶妙にバランスしているからです。簡単すぎれば学びが浅く、難しすぎれば挫折します。これらの名作チュートリアルは、その「ちょうどよさ」を長年の淘汰の中で獲得してきました。だからこそ、世界中の学習者に選ばれ続けているのです。リストに収録されているということは、すでに多くの先人が「これは良い教材だ」と認めた証でもあります。玉石混交のインターネットの中で、厳選された良質な教材に最短でたどり着ける——これがキュレーションされたリストの価値です。

最初の一つに何を選ぶか

初めてのプロジェクトには、規模が小さく、完成までの道筋が明確なものを選ぶのがコツです。「Build Your Own Text Editor (kilo)」や「Ray Tracing in One Weekend」は、ステップが細かく区切られていて、各段階で動くものができるため、挫折しにくい定番として人気があります。まず一つやり遂げ、「自分にも作れる」という自信を得ることが、次への原動力になります。

5. このリストの賢い歩き方

これだけ膨大なリストを前にすると、「どこから手をつければいいのか」と圧倒されるかもしれません。Learn by Projectsを効果的に使うための、いくつかのコツを紹介します。

第一に、「学びたい言語」ではなく「作りたいもの」から選ぶという発想です。「Rustを学ばなきゃ」というモチベーションは長続きしませんが、「自分でOSを作ってみたい」という好奇心は、困難なプロジェクトを最後までやり遂げる燃料になります。リストを眺めて、純粋に「面白そう」と思えるプロジェクトを探しましょう。

第二に、一つを最後までやり切ることです。あれもこれもと手を出すと、どれも中途半端に終わります。プロジェクトベース学習の効果は、「完成させる」ことで初めて得られます。途中で詰まっても、調べ、質問し、粘り強く完成まで持っていく——その経験こそが財産です。

第三に、写すだけでなく「改造する」ことです。チュートリアルどおりに作り終えたら、そこで止めずに、自分なりの機能を足してみましょう。テキストエディタにシンタックスハイライトを追加する、データベースに新しいコマンドを足す——この「改造」のフェーズで、本当の理解が試され、深まります。

第四に、詰まったらコミュニティを頼ることです。多くのチュートリアルにはコミュニティやIssueがあり、同じところで詰まった人の質問と回答が蓄積されています。一人で抱え込まず、先人の知恵を活用するのも、立派なスキルです。

第五に、完成までの期間を区切ることです。「いつか終わらせる」プロジェクトは、たいてい終わりません。「今週末でレイトレーシングの基礎部分まで」「今月中にエディタを動くところまで」というように、小さな締め切りを自分に課すと、ダラダラと中断するのを防げます。プロジェクトベース学習で最も多い失敗は「途中で飽きて放置」であり、期間を区切ることはその特効薬です。完成の達成感を早めに味わうことが、次のプロジェクトへの最大の燃料になります。

学び方の段階 やること 得られるもの
1. 選ぶ 「作りたい」と思えるものを選ぶ 完走するモチベーション
2. 作る チュートリアルに沿って完成させる 全体像と達成感
3. 改造する 自分の機能を足す 深い理解と応用力
4. 共有する コードを公開・解説する ポートフォリオと発信力

6. AI時代に「自作する」ことの意味

最後に、当サイトのテーマであるAIとの関連で、このリストの現代的な意義を考えてみます。「AIがコードを書いてくれる時代に、わざわざゼロから何かを自作する意味はあるのか?」——もっともな疑問です。

結論から言えば、その意味はむしろ高まっています。理由は明快です。AIに的確な指示を出し、AIが生成したコードの正しさを判断し、AIが詰まったときに自力で解決するには、「中身を理解している」ことが不可欠だからです。データベースの仕組みを自作を通じて理解した人と、ブラックボックスとして使うだけの人とでは、AIを使いこなす深さがまるで違ってきます。

AIへの指示が的確になる:仕組みを知っていれば、曖昧でなく具体的に指示できる
AIの出力を評価できる:生成されたコードの良し悪し・バグを見抜ける
AIが詰まったとき助けられる:AIも万能ではない。最後は人間の理解が頼り
学習そのものがAIで加速する:チュートリアルで詰まった箇所を、AIに質問しながら進められる

つまり、Learn by Projectsのような「自作」教材は、AIを「使われる側」ではなく「使いこなす側」に回るための土台を作ってくれます。そして皮肉なことに、AI自身が、これらのチュートリアルを進める上での最高の家庭教師にもなります。詰まった箇所を質問し、エラーの意味を尋ね、設計の選択肢を相談する——AIと自作学習は、対立するどころか、最高の相棒なのです。

ここで一つ、注意したい落とし穴があります。それは、AIに最初から最後まで作らせてしまうと、学びがほとんど残らないということです。プロジェクトベース学習の効果は「自分の頭で設計し、自分の手で詰まり、自分で乗り越える」過程から生まれます。AIに「テキストエディタを作って」と丸投げして完成したコードを眺めるだけでは、写経と何も変わりません。むしろ、AIには「ヒントだけくれ」「この設計の問題点を指摘して」「なぜこのエラーが出るのか説明して」というように、自分の思考を補助させる使い方が理想です。AIを答えの自動販売機にするのではなく、優秀な対話相手として使う——この姿勢が、AI時代の学習者に求められる新しいリテラシーと言えるでしょう。

まとめ:読むのをやめて、作り始めよう

Learn by Projectsは、「写経」から「自作」へ踏み出すための、巨大で良質な道標です。23言語にわたり、テキストエディタからOS、データベース、3Dレンダラーまで、本物のソフトウェアをゼロから作るチュートリアルが厳選されています。プログラミングは、最終的には手を動かして作ることでしか身につきません。そしてAI時代だからこそ、「中身を理解している」ことの価値は高まっています。まずは一つ、「面白そう」と思えるプロジェクトを選んで、作り始めてみてください。

まとめ

本記事では、「作って学ぶ」ためのチュートリアル集 Learn by Projects(Project Based Learning) を、当サイトの番外編として日本語で解説しました。

このリストの本質は、フレームワークの「使い方」ではなく、ソフトウェアそのものを「ゼロから自作する」チュートリアルを、23言語にわたって厳選している点にあります。テキストエディタ、OS、データベース、3Dレンダラー、コンパイラ——こうした本格的なプロジェクトを一つでもやり遂げることで、断片的な知識が「使える理解」へと変わります。

プロジェクトベース学習が効くのは、知識が文脈とともに定着し、「調べる力」が鍛えられ、全体像がつかめ、そしてポートフォリオが残るからです。そしてAIがコードを書く時代だからこそ、「中身を理解している」ことの価値はむしろ高まっています。

「本を読み終えたのに作れない」という壁の前で立ち止まっているなら、答えはシンプルです——読むのをやめて、作り始めましょう。Learn by Projectsは、その第一歩のための題材を、惜しみなく提供してくれます。

よくある質問(FAQ)

Q1. プログラミング初心者でも使えますか? リストには難易度の幅があります。完全な初心者がいきなり「OS自作」に挑むのは厳しいですが、入門書で基礎文法を学んだ後の「次の一歩」としては最適です。まずは規模の小さい、ステップが明確なプロジェクト(テキストエディタやレイトレーシングなど)から始めるのがおすすめです。

Q2. どの言語から始めるべきですか? すでに学んでいる言語があれば、それを起点にするのが自然です。特にこだわりがなければ、システムプログラミングの王道テーマが揃っているC/C++、あるいはモダンで人気のあるRustやGoのセクションが、学びの大きいプロジェクトの宝庫です。

Q3. 「ゼロから作る」と聞くと難しそうですが、本当にできますか? チュートリアルはステップごとに細かく区切られており、各段階で動くものができるよう設計された名作が多く収録されています。一行ずつ理解しながら進めれば、初心者でも「テキストエディタ」や「簡易データベース」を完成させられます。詰まったらAIに質問するのも有効です。

Q4. AIがコードを書く時代に、自分で作る意味はありますか? あります。むしろ意味は高まっています。AIに的確な指示を出し、その出力を評価し、AIが詰まったときに解決するには、仕組みを理解していることが不可欠です。自作の経験は、AIを「使いこなす側」に回るための土台になります。

Q5. ckissi/Learn-by-projects と practical-tutorials/project-based-learning は何が違いますか? どちらも「作って学ぶ」チュートリアルを言語別に集めたリストで、思想は共通です。practical-tutorials/project-based-learningは数十万スターを集める本流のリポジトリで、ckissi/Learn-by-projectsはその文化に連なる派生・関連プロジェクトです。中身の方向性は同じなので、どちらを入口にしても構いません。

Q6. 一つのプロジェクトを終えたら、次は何をすべきですか? まずは、作ったものを「改造」してみましょう。機能を足したり、別の言語で書き直したりすることで、理解が一段深まります。その後、別のカテゴリのプロジェクト(エディタを作ったなら次はコンパイラ、など)に挑むと、コンピュータサイエンスの全体像が立体的に見えてきます。

参照ソース

Learn-by-projects(ckissi / 本記事が起点としたリポジトリ) — 言語別の「作って学ぶ」チュートリアルリンク集
Project Based Learning(オリジナルの人気リポジトリ) — この文化の本流。数十万スターを集める
Build Your Own X — 「自分だけの〇〇を作る」関連チュートリアル集