문서·자료
practical-tutorials/project-based-learning. "바닥부터 직접 만들며 배우는(build from scratch)" 프로그래밍 튜토리얼을 프로그래밍 언어별로 모아 둔 거대한 큐레이션 목록이다. 데이터베이스·셸·OS·Git·인터프리터·Redis 클론 같은 "네 손으로 직접 만드는 X" 튜토리얼이 22개 언어 섹션에 약 450개 링크로 정리돼 있다. 실행되는 앱이 아니라 단 하나의 README.md가 상품인 awesome 리스트로, "수동적 강의 시청"이 아니라 "능동적 만들기"가 더 잘 배운다는 철학에 베팅한 레포다. (저장소: practical-tutorials/project-based-learning · 형식 Markdown 큐레이션 · 라이선스 MIT)
"이 레포 자체는 코드를 가르치지 않는다 — '무엇을 만들며 배울지'를 언어별로 안내하는 거대한 지도다."
프로그래밍을 배울 때 강의 영상만 끝없이 보면, 다 본 뒤에도 정작 뭔가를 만들지 못하는 경우가 많습니다. 이 레포의 철학은 정반대입니다 — 처음부터 진짜 프로그램 하나를 만들어 보라는 것. "C로 텍스트 에디터 만들기", "Go로 블록체인 만들기", "Rust로 운영체제 만들기" 같은 실전 빌드 튜토리얼을 언어별로 분류해 한 페이지에 모아 두었습니다. 여러분은 자기 언어 · 자기 수준에 맞는 프로젝트를 골라, 링크를 따라가 끝까지 만들어 보면 됩니다. 다 만들고 나면 동작하는 결과물과 포트폴리오가 손에 남습니다.
README.md 하나에 카테고리별 링크로 정리되며, "awesome-*"라는 이름의 레포들에서 유래한 장르입니다. 품질의 비결은 자동 생성이 아니라 사람의 선별 + PR 검수에 있습니다.이 저장소의 학습 콘텐츠는 README 링크 목록입니다. 별도의 튜토리얼 앱은 없지만 scripts/check_readme.py라는 실제 Python 검사 코드와 GitHub Actions가 있습니다. 문서 구조와 유지보수 자동화를 함께 읽어야 합니다.
"규모, 변치 않는 가치, 그리고 '만들며 배운다'는 강력한 철학 — 그래서 몇 년이 지나도 계속 트렌딩에 오른다."
많은 입문자가 튜토리얼 영상·강의를 끝없이 봅니다. 보는 동안엔 다 아는 것 같지만, 막상 빈 에디터 앞에 앉으면 한 줄도 못 짜는 '튜토리얼 지옥(tutorial hell)'에 빠집니다. 지식이 '읽은 것'에 머물고 '해 본 것'이 되지 못했기 때문입니다.
수동적으로 보기만 하면 '익숙함'이 '능력'으로 착각됩니다. 정작 스스로 설계하고, 막히고, 디버깅하고, 여러 기술을 엮는 진짜 어려운 부분은 한 번도 겪지 않습니다. 그래서 강의 100개를 봐도 작은 앱 하나를 처음부터 못 만드는 일이 흔합니다.
이 레포의 처방은 단순합니다 — "진짜 프로그램 하나를 처음부터 끝까지 만들어 봐라." 데이터베이스·셸·인터프리터를 직접 구현하면, 그 내부 원리가 몸으로 이해됩니다. 막히고 고치는 과정 자체가 학습이고, 끝나면 동작하는 결과물 + 포트폴리오가 남습니다.
| 지표 | 값 |
|---|---|
| 튜토리얼 링크 | 약 450개(다중 파트 시리즈 합치면 ~300개 주제) |
| 언어 섹션 | 22개 + Additional Resources |
| 큰 섹션 | Python ~128 · C/C++ ~97 · HTML/CSS ~74 · Go ~33 |
| 라이선스 | MIT (자유롭게 포크·복사·재배포) |
이 레포가 몇 년이 지나도 계속 트렌딩에 오르는 이유는, 내용이 '유행을 안 타는(evergreen)' 지식이기 때문입니다. "데이터베이스를 직접 만들어 보라"는 가치는 10년 전에도 지금도 유효합니다. 다만 외부 URL은 바뀌므로 현재는 정기 링크 검사와 수정 PR로 관리합니다. README가 "시작하려면 그냥 이 레포를 포크하세요"라고 안내해 입문자의 첫 포크·첫 PR 대상으로도 인기가 높습니다.
이 레포 = 요리 학원이 아니라 '직접 만들어 볼 요리 레시피 색인'. 요리 영상을 100개 보는 것과, 레시피를 보며 실제로 한 끼를 만들어 보는 것은 다릅니다. 이 레포는 "오늘은 이 요리(프로젝트)에 도전해 봐"라며 잘 정리된 레시피 목록을 건네줍니다 — 칼질은 여러분이 직접 합니다.
학습 목록은 Markdown이며 자동화는 Python 3 표준 라이브러리와 GitHub Actions로 구성됩니다. 과거의 Travis·Ruby awesome_bot 설명은 현재 tree와 다릅니다.
| 구성 | 현재 역할 |
|---|---|
| scripts/check_readme.py | 하나의 README 파서로 문법·목차·중복 URL 검사, PR 추가 링크 검사, 전체 URL 상태와 수정 제안을 처리합니다. |
| validate-pr.yml | README·기여 가이드 PR에서 lint → 추가 줄 검사 → 추가 URL 접근 확인을 수행합니다. 자동 접근을 막는 도메인은 확인 불가로 남길 수 있습니다. |
| link-rot.yml | 월요일 06:17 UTC에 전체 링크를 검사하고 상태 파일·통합 이슈를 갱신합니다. 2회 연속 죽은 주요 링크나 정상 페이지로 이동한 URL은 수정 PR 대상으로 삼습니다. |
| stale-prs.yml | 90일 비활성 PR을 표시하고 이후 30일 뒤 닫습니다. 이슈는 자동 stale 대상에서 제외합니다. |
CONTRIBUTING.md는 무료·공개 접근, 완성 결과물이 있는 프로젝트 튜토리얼, 중복 검색, 작성자와의 관계 공개를 요구합니다. 단축 URL과 유료·로그인·뉴스레터 가입 장벽이 있는 자료는 기여 조건에 맞지 않습니다.
# 기여 가이드에 명시된 로컬 검사 예시
python3 scripts/check_readme.py lint
이 명령은 사용자가 기여할 때의 절차입니다. 이번 분석에서는 외부 저장소의 검사·네트워크 자동화를 실행하지 않고 코드를 읽었습니다. 워크플로 설정이 존재한다는 사실과 최근 실행 성공 여부도 구분합니다.
"최상위 구분은 '프로그래밍 언어별'. 큰 언어는 다시 주제·프레임워크로 가지를 친다."
책장을 언어별 칸으로 나눈 도서관을 떠올리면 됩니다. 최상위는 언어(##)로 나뉘고, 큰 언어는 다시 주제(###)로, JavaScript는 프레임워크(####)까지 가지를 칩니다.
| 언어 | 대략 규모 · 특징 |
|---|---|
| Python | ~128개. 웹 스크래핑·봇·데이터과학·ML·OpenCV·딥러닝까지 가장 풍부. |
| C/C++ | ~97개. OS·DB·에디터 등 '바닥부터 시스템 만들기'의 보고. 네트워크·OpenGL 하위. |
| HTML/CSS | ~74개. 웹앱 + React/Angular/Vue/Node 프레임워크 하위 트리. |
| Go | ~33개. 블록체인·REST 서버·컨테이너 직접 만들기. |
| Rust | ~16개. OS·브라우저 엔진·NES 에뮬레이터. |
| 그 외 | Java·C#·Ruby·PHP·Dart(Flutter)·Lua·Haskell·Clojure·Elixir·Kotlin·Swift… 총 22개 섹션. |
# 단일 튜토리얼
- [Build Your Own Text Editor](https://...) (제목+링크, 때로 (video) 태그)
# 다중 파트 시리즈는 부모-자식 들여쓰기
- Building Blockchain in Go
- [Part 1](https://...)
- [Part 2](https://...)
...
이렇게 일관된 한 줄 문법이 있어야 사람이 읽기 좋고, 동시에 check_readme.py의 공통 파서가 링크를 검사할 수 있습니다 — 구성과 자동화가 맞물려 돌아갑니다.
project-based-learning/
├── README.md # 언어별 튜토리얼 목록, 676줄
├── CONTRIBUTING.md # 기여 조건과 lint 절차
├── LICENSE.md
├── scripts/
│ ├── check_readme.py # 공통 파서·lint·URL 검사·prune
│ ├── linkcheck-domains.txt # 자동 접근 제한 도메인 정책
│ └── lint-allow-duplicates.txt # 기존 중복 URL 예외
└── .github/
├── link-rot-state.json # URL별 관측 상태
├── workflows/ # PR 검사·정기 검사·PR stale 관리
└── ISSUE_TEMPLATE/ # 깨진 링크·자료 제안 양식
classify_line은 제목·단일 항목·시리즈·목차를 분류합니다. cmd_prune은 정확히 한 주요 항목과 대응되는 URL에 한정해 수정하고, 모호한 항목은 사람이 판단하도록 남깁니다. 문서 형식을 데이터 계약으로 만들면 lint와 정기 검사가 같은 해석을 공유할 수 있다는 점이 학습 포인트입니다.
"고르는 법은 셋 — 내 언어 섹션으로 가서, 관심 주제를 고르고, 다 만든 뒤 난이도를 올린다."
① 목차(ToC)에서 내 언어 섹션으로 점프 → ② 하위 주제(웹앱·ML·게임·시스템) 중 끌리는 것 선택 → ③ 깊게 배우고 싶으면 다중 파트 시리즈를 고른다. 하나를 끝까지 만든 뒤, 한 단계 어려운 프로젝트로 올라갑니다.
핵심은 '끝까지 완성'입니다. 절반만 따라 하면 튜토리얼 지옥과 다를 게 없습니다.
이 장르의 보석들입니다: 텍스트 에디터 만들기(C, kilo) · 셸 만들기(C) · 간단한 데이터베이스 만들기(C, db_tutorial) · 밑바닥부터 OS 만들기 · CHIP-8 에뮬레이터 · TCP/IP 스택을 코딩하자. Rust에선 순수 Rust로 OS 만들기(blog_os), 브라우저 엔진 만들기, Go에선 밑바닥부터 컨테이너 만들기가 유명합니다.
Python: Flask로 마이크로블로그(Grinberg 메가 튜토리얼) · Django로 블로그 · 신경망 밑바닥부터 만들기 · 레딧 봇. JavaScript/웹: JavaScript30(30일간 30개) · 틱택토·할 일 목록. Java: 인터프리터 만들기(Crafting Interpreters) · HTTP 서버. 언어별로 결이 다릅니다 — 시스템 언어는 인프라, Python은 데이터/ML, JS는 웹앱.
알려진 시스템(Git·Redis·셸·DB·OS)을 직접 다시 만들어 보면, 평소 블랙박스였던 내부가 환히 보입니다. "어떻게 동작하지?"라는 질문에 코드로 답해 본 사람은, 같은 도구를 쓸 때도 훨씬 깊이 이해합니다.
"레포 자체엔 요구사항이 거의 없다 — 브라우저, 그리고 고른 프로젝트의 언어 도구뿐."
| 항목 | 요구사항 |
|---|---|
| 목록 읽기 | 웹 브라우저만 있으면 됨. 설치 불필요. |
| 튜토리얼 실습 | 고른 프로젝트의 언어 도구체인만(예: 에디터 만들기→C 컴파일러, Flask 앱→Python+pip, blog_os→Rust 툴체인). |
| 특별 하드웨어 | 대부분 불필요. 일부 딥러닝 항목만 선택적으로 GPU가 도움. |
| 기여(선택) | 기여 가이드의 lint는 Python 3 표준 라이브러리로 실행합니다. 튜토리얼 자체의 도구체인과는 별개입니다. |
"작은 앱 → 풀스택 → CLI 도구 → 인터프리터 → DB → OS 순으로 난이도를 올려 보자."
JavaScript30이나 틱택토 게임을 골라, 하루 만에 작고 완결된 앱 하나를 끝내 보세요. PBL의 리듬(끝까지 만들기)을 몸에 익히는 게 목표입니다.
Python의 Flask 마이크로블로그(또는 Django 블로그)를 따라가며 라우팅·템플릿·DB·인증을 한 번에 배우세요. 첫 '진짜 웹앱' 경험으로 좋습니다.
Go의 URL 단축기(Gin+Redis)나 C의 셸 만들기로, 다중 파트 시리즈를 읽고 따라가는 호흡을 익히세요.
Crafting Interpreters(Java 트리워커 → C 바이트코드 VM)나 Build Your Own Lisp로 파싱·AST·평가를 이해해 보세요.
C의 Let's Build a Simple Database(db_tutorial)로 페이저·B-트리·영속성을 직접 구현하며 DB의 속을 들여다보세요.
순수 Rust로 OS(blog_os), C로 TCP/IP 스택, Go로 BitTorrent 클라이언트 중 하나로, 0에서 동작하는 저수준 시스템까지 완주해 보세요.
"이 목록을 4주 코스로 쓰는 한 가지 방법."
| 주차 | 주제 | 이 목록에서 고를 것 |
|---|---|---|
| 1주차 | 완성의 감각 | 작은 앱 1개 완주(JavaScript30/틱택토). "끝까지 만들기" 습관 만들기. |
| 2주차 | 풀스택 흐름 | Flask/Django 블로그 — 요청→DB→화면의 한 사이클 체득. |
| 3주차 | 언어·내부 원리 | 인터프리터 또는 셸 만들기 — 파싱·실행 구조 이해. |
| 4주차 | 시스템 도전 | DB/네트워크 스택/OS 중 하나 — 저수준 내부까지 깊이 파기. |
"학습 방법론 + 큐레이션 레포 용어를 한자리에."
| 용어 | 의미 |
|---|---|
| 프로젝트 기반 학습(PBL) | 강의 시청 대신 완성 프로젝트를 직접 만들며 배우는 방법. |
| awesome 리스트 | 한 주제의 자료를 사람이 골라 정리한 큐레이션 목록(보통 README 하나). |
| 큐레이션 목록 | 자동 생성이 아닌, 사람이 선별·검수한 모음. 품질은 유지보수자 + PR 리뷰에서. |
| "build your own X" | 알려진 시스템(Git·Redis·셸·DB·OS)을 직접 재구현해 내부 원리를 배우는 장르. |
| 밑바닥부터(from scratch) | 편한 고수준 라이브러리에 기대지 않고 직접 구현하는 것(예: 라이브러리 없이 신경망). |
| 다중 파트 시리즈 | 여러 글로 나뉜 튜토리얼. README에선 부모 불릿 + 들여쓴 Part 링크로 표현. |
| 링크 로트·prune | 시간이 지나 URL이 끊기는 현상과, 명확히 확인된 죽은 링크·이동 URL만 수정 PR로 제안하는 과정. |
| stale 봇 | 현재 저장소에서는 비활성 PR을 표시·종료하는 자동화. 이슈는 자동 stale 대상에서 제외합니다. |
| 튜토리얼 지옥 | 강의만 끝없이 보고 정작 스스로 못 만드는 상태. PBL이 깨려는 함정. |
"형제 격인 '직접 만들기' 자료들과 함께 보면 좋다."
CONTRIBUTING.md(포크 → PR당 튜토리얼 하나 → 올바른 언어 섹션에 배치)