-
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 개발 커뮤니티 활발, 혼자서 충분히 파악 가능한 시스템 구조
-
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 없이 진행할 때 초반에는 익숙하지 않아 힘들 수도 있으나, 시간이 지날수록 고유의 기술적 기쁨과 높은 성취감을 느끼게 됨
- 자동차로 이동하면 주자(달리기)로서의 ‘러너스 하이’는 느낄 수 없음 → 지름길이 아닌 직접 경험에서 깊은 즐거움을 얻을수 잇음