부록 H — 다 배웠는데 못 만들겠다면
이 책을 끝까지 읽은 사람이 가장 자주 부딪히는 벽이 있다.
“ C 를 다 배웠다. 그런데 막상 무엇을 만들려니 아무것도 못 하겠다. 내가 뭘 잘못 배운 걸까? ”
★ 잘못 배운 것이 없다. 배워야 할 다음 것이 C 가 아닐 뿐이다. 이 한 줄을 모르면 문법서를 한 권 더 사고, 또 못 만들고, 자기 탓을 하게 된다. 이 부록은 그 자리에서 길을 고르는 데 쓴다.
왜 그런가 — 표준 C 가 주지 않는 것#
66장에서 표준 라이브러리가 얇다고 했다. 얼마나 얇은지 수로 보면 이렇다 — 표준이 정한 헤더는 서른한 개이고, 그 안의 함수를 다 세어도 오백 남짓이다 (부록 F 가 그 전부를 싣는다).
그리고 그 안에 없는 것이 이 벽의 정체다.
| 하고 싶은 일 | 표준 C 가 주는 것 |
|---|---|
| 창을 띄우고 버튼을 누른다 | 없다 |
| 소리를 낸다 | 없다 |
| 망으로 무언가를 주고받는다 | 없다 |
| 그림을 그린다·이미지를 읽는다 | 없다 |
| 폴더를 훑는다 | 없다 — 파일 하나를 여는 것까지가 표준이다 |
| 갈래를 나누어 동시에 돌린다 | C11 의 <threads.h> 가 있으나 선택 사항이다 |
| 지금 시각을 안다 | 있다(79장) |
표 105.1 — 표준 C 에 없는 것
★ 「하나도 없다」가 아니라 바깥 세상과 닿는 것이 없다가 정확한 진단이다. 표준 C 는 계산하고 파일을 읽고 쓰는 데까지만 답을 준다. 화면·소리·망·장치는 전부 운영체제나 남이 만든 라이브러리의 몫이다.
이것은 결함이 아니라 설계다. 66장에서 본 대로, C 는 운영체제가 없을 수도 있는 자리까지 겨냥했기 때문에 「어디서나 있을 수 있는 최소한」으로 좁혀졌다. 풍부함을 포기한 대가로 이식성을 얻은 것이다.
그래도 표준 C 만으로 되는 것#
「그러면 표준 C 만으로는 아무것도 못 만드나」 하면, 그렇지 않다. 이 오해가 꽤 널리 퍼져 있어서 짚어 둔다.
| 무엇 | 쓸모 |
|---|---|
| 텍스트를 걸러 내는 도구 | 줄·낱말 세기, 치환, 정렬, 뽑아내기 — 유닉스 도구들이 원래 이런 것이다 |
| 자료 형식 읽개 | CSV·INI·간단한 설정 파일. 파싱과 오류 처리의 좋은 연습 |
| 계산기와 작은 해석기 | 수식을 읽어 답을 낸다. 재귀 하강 파싱 |
| 자료구조 라이브러리 | 목록·해시 표·트리. 97장가 실물이다 |
| 파일을 다루는 도구 | 비교·중복 찾기·체크섬 |
| 시험이 붙은 작은 라이브러리 | 102–103장를 실제로 써 보는 자리 |
표 105.2 — 표준 C 만으로 끝낼 수 있는 것
★ 이것들은 플랫폼 지식 없이 오늘 끝낼 수 있다. 그리고 하나같이 이 책이 가르친 것만 쓴다 — 스트림, 문자열, 기억 관리, 계약, 시험. 「못 만들겠다」의 상당 부분은 사실 「무엇을 만들지 못 정하겠다」다.
간극의 정체 — C 실력의 문제가 아니다#
그러나 창을 띄우거나 망을 쓰려는 순간 벽이 온다. 그 벽의 정체를 정확히 부르는 것이 중요하다.
| 이렇게 생각하기 쉽다 | 실제로는 |
|---|---|
| 「C 를 덜 배웠다」 | C 는 다 배웠다. 모르는 것은 그 플랫폼이다 |
| 「문법서를 한 권 더 봐야겠다」 | 문법서에는 창을 띄우는 법이 없다. 앞으로도 없다 |
| 「내가 유난히 못한다」 | 누구나 여기서 멈춘다. 언어와 플랫폼은 원래 별개다 |
| 「C 가 낡아서 그렇다」 | 파이썬으로 창을 띄우는 것도 툴킷을 배우는 일이다. 그쪽은 그 툴킷이 함께 딸려 올 뿐이다 |
표 105.3 — 무엇과 무엇 사이의 간극인가
★ 그래서 다음 걸음은 「C 를 더」가 아니라 「무엇을 얹을 것인가」를 고르는 일이다. 그리고 그 선택이 앞으로 몇 달을 정한다.
이 책은 그 선택을 대신해 주지 않는다. 다만 갈래가 무엇이고 각각 무엇을 치러야 하는지는 적어 둘 수 있다.
갈래 넷 — 무엇을 더 배워야 하는가#
| 길 | 무엇을 더 배우나 | 성격 |
|---|---|---|
| 유닉스·리눅스 시스템 | POSIX API — 프로세스, 파일 기술자, 신호, 소켓, 스레드 | C 와 가장 가깝다. 자료가 압도적으로 많고, 커널·도구가 다 C 다 |
| 임베디드 | 칩의 자료집(datasheet), 레지스터, 인터럽트, 크로스 컴파일 | C 가 대체 불가능한 자리. 104장가 그 도구를 다룬다 |
| 윈도 | Win32 API — 창, 메시지 고리, 핸들 | C 로 부르도록 만들어졌고 문서도 C 모양이다. 다만 오늘의 데스크톱 주류는 C++ 와 그 위의 언어들로 옮겨 갔다 |
| 기반 소프트웨어 | 그 분야의 이론 — 데이터베이스, 드라이버, 커널, 코덱 | 자리는 적지만 C 가 아니면 안 되는 자리다. 들어가려면 그 분야를 알아야 한다 |
표 105.4 — C 다음에 갈 수 있는 길
앞의 둘이 문이 넓다. 유닉스 쪽은 배울 것이 잘 정리되어 있고(POSIX 라는 표준이 있다), 임베디드 쪽은 이 책의 104장가 입구를 보인다.
문. 넷 중에 무엇을 골라야 하는가?
답. 이 책은 답하지 않는다. 고르는 기준만 준다.
- 손에 닿는 것을 고른다. 리눅스가 깔린 기계가 있으면 유닉스 쪽이, 사 둔 보드가 있으면 임베디드 쪽이 문이 가깝다. 없는 환경을 상상하며 고르면 시작을 못 한다.
- 결과가 눈에 보이는 것을 고른다. 창이 뜨거나 LED 가 깜빡이는 것은 계속하게 만드는 힘이 있다. 처음에는 그것이 실력보다 중요하다.
- 자료가 한국어로도 있는지 본다. 막혔을 때 검색이 되는가가 진도를 가른다.
★ 그리고 하나만 골라도 된다. 넷을 다 훑는 것보다 하나를 끝까지 가는 편이 낫다 — 한 플랫폼을 제대로 겪으면 다음 플랫폼은 훨씬 빨리 배운다.
화면에 창 하나 — GUI 로 가는 길#
가장 자주 나오는 물음이 이것이다. 「C 로 창을 띄우려면?」 답은 무엇을 얹느냐에 따라 갈린다. 넷을 성격으로 갈라 둔다.
| 무엇 | 성격 | 치르는 것 |
|---|---|---|
| Win32(WinAPI) | 윈도의 밑바닥. C 로 부르도록 만들어졌고 문서도 C 모양이다 | 윈도 전용. 창 하나에도 손이 꽤 간다 |
| GTK | 리눅스 데스크톱의 주류 툴킷이고 라이브러리 자체가 C 로 쓰였다 | GObject 라는 객체 체계를 따로 익혀야 한다 |
| SDL · Raylib | 창·입력·그림을 얇게 감싼 것. 게임과 시각화 쪽 | 위젯이 없다 — 버튼도 직접 그린다 |
| 한 파일짜리 UI | Nuklear·microui 처럼 소스 한 파일로 끝나는 것들 | 아주 작지만, 화면에 그리는 일은 내가 붙여야 한다 |
표 105.5 — C 로 창을 띄우는 길
고르는 기준도 성격에서 나온다.
- 버튼과 입력창이 있는 보통 프로그램이라면 그 운영체제의 툴킷(Win32·GTK)이 맞다.
- 내가 다 그리는 화면(게임·시각화·계기판)이라면 SDL·Raylib 쪽이 훨씬 빠르다.
- 덧붙이는 것을 최소로 하고 싶으면 한 파일짜리 UI 를 얹고 그리기는 위의 것에 맡긴다.
★ 어느 쪽이든 공통으로 겪는 것이 하나 있다 — 메시지 고리(event loop)다. 프로그램이 위에서 아래로 흐르지 않고, 일이 생길 때마다 불려 가는 모양으로 바뀐다. 이 책의 81장에서 「처리기는 깃발만 세우고 실제 처리는 주 흐름에서」라고 한 것과 같은 성격의 뒤집힘이라, 그 장을 다시 읽으면 낯섦이 줄어든다.
무엇을 만들 것인가#
「프로젝트를 하나 만들어 보라」는 말은 도움이 안 된다. 고를 수 있게 적어 둔다. 위에서 아래로 갈수록 배울 것이 늘어난다.
| 만드는 것 | 무엇을 배우게 되나 | 이 책에서 | 어디서 막히나 |
|---|---|---|---|
| 텍스트 필터 | 스트림, 한 줄씩 읽기, 문자열 다루기 | 68·70장 | 줄 끝과 인코딩(8장) |
| CSV·INI 읽개 | 파싱, 오류를 값으로 돌려주기 | 44·53장 | 따옴표·이스케이프 같은 예외 |
| 계산기·작은 해석기 | 재귀 하강, 자료구조, 수명 관리 | 39·46장 | 기억을 누가 소유하는가 |
| 파일 중복 찾기 | 해시, 큰 입력, 폴더 훑기 | 89장 | ★ 폴더 훑기부터 플랫폼이다 |
| 시험 붙은 작은 라이브러리 | 공개 헤더, 골든 시험, 게이트 | 102–103장 | 무엇을 공개할지 정하는 일 |
| 창 하나 띄우기 | 메시지 고리, 남의 라이브러리 붙이기 | 앞 절 | 빌드에 라이브러리를 잇는 일 |
표 105.6 — 끝까지 만들어 볼 만한 것들
★ 앞의 다섯은 플랫폼 지식 없이 끝난다. 여섯 번째가 간극을 처음 건너는 자리다. 그래서 순서를 권한다면 이렇다 — 작은 것을 하나 끝내고, 그다음에 플랫폼으로 나간다. 끝내 본 경험이 있어야 플랫폼에서 막혔을 때 「내가 못하는 것」과 「원래 어려운 것」을 구분할 수 있다.
★ 고를 것이 더 필요하면 「만들면서 배우는」 길잡이만 모아 놓은 목록이 있다 (Project Based Learning, 아래 표 105.9). C/C++ 칸이 그 목록에서 가장 크고, 셸 · 텍스트 편집기 · 해시표 같은 것이 처음부터 끝까지 따라갈 수 있는 형태로 있다.
반례. 큰 것부터 시작하기
「운영체제를 만들어 보겠다」·「데이터베이스를 짜 보겠다」는 각오는 훌륭하지만, 거의 언제나 중간에 멈춘다. 멈추는 자리가 대개 비슷하다 — 재미있는 부분(설계)이 끝나고 지겨운 부분(오류 처리·이식성·시험)이 시작되는 지점이다.
그런데 이 책이 줄곧 말한 것이 바로 그 지겨운 부분이다. 그래서 권하는 순서는 거꾸로다 — 작아서 끝낼 수 있는 것을 골라 오류 경로까지 다 만들어 보는 것이 큰 것을 절반 만드는 것보다 훨씬 많이 남는다.
큰 것은 그다음에 해도 늦지 않다. 그때는 「무엇이 얼마나 걸리는지」를 몸으로 알고 시작하게 된다.
어디서 배울 것인가#
읽을 책과 온라인 참고서, 연습 문제 사이트는 부록 D 에 모아 두었다. 여기서는 이 책 다음의 자리에 맞는 것들만 성격별로 갈라 둔다.
★ 주소는 오래갈 것으로 골라 적었지만, 인터넷의 자리는 결국 옮겨 다닌다. 링크가 죽었다면 이름으로 찾는다 — 아래의 것들은 모두 이름이 널리 알려져 있다.
C 를 더 파고들 곳#
| 무엇 | 어디 | 성격과 단서 |
|---|---|---|
| 씹어먹는 C 언어 | modoocode.com/231 | 한국어 C 강좌. 「소스 코드는 모두 손으로 직접 쓴다」를 규율로 내건다. 막혔을 때 한국어로 검색되는 것이 진도를 가른다 |
| Beej’s Guide to C | beej.us/guide/bgc/ | C 전용 무료 안내서. HTML·PDF 로 받는다. ★ 저자가 스스로 베타라 밝히므로 이 책이나 표준과 어긋나면 표준을 따른다 |
| Beej’s Guide to Network Programming | beej.us/guide/bgnet/ | 같은 저자의 소켓 안내서. ★ 유닉스 쪽으로 첫걸음을 뗄 때 가장 널리 읽히는 글이다 |
| awesome-c | github.com/oz123/awesome-c | C 라이브러리·도구를 갈래별로 모은 목록. 「창을 띄우려면 무엇이 있나」를 훑을 때 쓴다 |
표 105.7 — C 를 더 보는 자리
컴퓨터 과학을 넓게 볼 곳#
| 무엇 | 어디 | 성격과 단서 |
|---|---|---|
| CS50 (하버드) | cs50.harvard.edu/x/ | ★ C 로 시작해서 파이썬·SQL·웹으로 간다. 공개 강의로 무료. 이 책 다음에 시야를 넓히기에 맞다 |
| MIT OpenCourseWare | ocw.mit.edu | 대학 강의 공개. 운영체제·계산 구조 과목이 이 책 다음의 자리와 맞물린다 |
| Georgia Tech OMSCS 공개 강의 | sites.gatech.edu/omscsopencourseware/ | 대학원 과목 40여 개를 공개한다 — 운영체제, 컴퓨터 구조, 임베디드 최적화. ★ 강의와 연습만 공개하고 과제·시험은 빠진다 |
| K-MOOC | kmooc.kr | 교육부·국가평생교육진흥원이 운영하는 한국 대학 공개 강의. 한국어로 듣는다 |
| OSSU 컴퓨터 과학 | github.com/ossu/computer-science | 공개 강의만으로 학부 과정을 따라가도록 짠 커리큘럼. ★ 가볍지 않다 — 주당 스무 시간으로 이 년쯤 잡는다. 혼자 버티기 어려우므로 함께할 사람을 찾는 편이 낫다 |
표 105.8 — 강의와 커리큘럼
길잡이와 목록#
무엇이 있는지조차 모를 때 펼치는 것들이다. 하나같이 목록이지 교재가 아니므로, 여기서 고른 다음에는 결국 하나를 붙들고 끝까지 가야 한다.
| 무엇 | 어디 | 성격과 단서 |
|---|---|---|
| Free Programming Books | github.com/EbookFoundation/free-programming-books | 무료로 읽을 수 있는 책·강의를 언어별로 모은 큰 목록. 한국어 목록이 따로 있다. ★ 목록이라 품질이 고르지 않다 — 고르는 눈은 부록 D 를 참고 |
| roadmap.sh | roadmap.sh | 분야별로 무엇을 배울지 그림으로 보인다. 「다음에 무엇을 할까」를 훑기에 좋다. ★ 길잡이일 뿐이라 깊이는 없다 |
| Awesome | github.com/sindresorhus/awesome | 주제별 「awesome 목록」을 모은 목록의 목록. C 독자에게 실제로 쓸모 있는 것은 그 안의 awesome-c 다 |
| Project Based Learning | github.com/practical-tutorials/project-based-learning | 만들면서 배우는 길잡이만 언어별로 모았다. C/C++ 칸이 목록에서 가장 큰데, 셸 · 텍스트 편집기 · 해시표 · 할당기 · 가상 기계 같은 것들이 「처음부터 끝까지」 형태로 있다. ★ 다만 운영체제 · 커널 · 데이터베이스처럼 큰 것이 나란히 섞여 있다 — 바로 앞에서 경고한 함정이므로, 이 목록에서는 작은 것부터 고른다 |
| Coding Interview University | github.com/jwasham/coding-interview-university | ★ 결이 다르다. 취업 면접을 겨냥한 학습 계획이라, 이 부록이 말하는 「무엇을 만들 것인가」와는 목적이 다르다. 면접이 눈앞에 있을 때만 편다 |
표 105.9 — 무엇이 있는지 훑는 자리
★ 강의든 목록이든, 이 책이 권하는 기준은 하나다 — 손을 움직이게 하는가. 듣기만 하는 강의와 훑기만 하는 목록은 이 자리에서 별 도움이 안 된다. 이미 문법은 아는 상태이므로, 필요한 것은 설명이 아니라 막히고 풀어 본 경험이다.
문. 이 책을 다 읽었으면 이제 「중급」인가?
답. 그런 눈금은 별 쓸모가 없다. 더 쓸모 있는 물음은 이것이다 — 혼자서 끝까지 만들어 본 것이 있는가.
이 책은 언어와 그 계약, 그리고 여럿이 짓는 방식까지 다뤘다. 그것은 바닥이고, 바닥이 단단하면 어느 갈래로 가든 덜 흔들린다(1장에서 약속한 것이 그것이다). 그러나 바닥은 건물이 아니다. 무엇이든 하나를 끝까지 세워 보기 전까지는, 아는 것과 할 수 있는 것 사이의 거리가 얼마인지 알 수 없다.
그러니 이 부록의 결론은 한 줄이다 — 작은 것 하나를 골라, 오류 경로까지 다 만들어 끝내라. 그다음에 무엇을 배울지는 그때 저절로 보인다.