Proven C Book←↑→

부록 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장가 입구를 보인다.

문. 넷 중에 무엇을 골라야 하는가?

답. 이 책은 답하지 않는다. 고르는 기준만 준다.

  1. 손에 닿는 것을 고른다. 리눅스가 깔린 기계가 있으면 유닉스 쪽이, 사 둔 보드가 있으면 임베디드 쪽이 문이 가깝다. 없는 환경을 상상하며 고르면 시작을 못 한다.
  2. 결과가 눈에 보이는 것을 고른다. 창이 뜨거나 LED 가 깜빡이는 것은 계속하게 만드는 힘이 있다. 처음에는 그것이 실력보다 중요하다.
  3. 자료가 한국어로도 있는지 본다. 막혔을 때 검색이 되는가가 진도를 가른다.

★ 그리고 하나만 골라도 된다. 넷을 다 훑는 것보다 하나를 끝까지 가는 편이 낫다 — 한 플랫폼을 제대로 겪으면 다음 플랫폼은 훨씬 빨리 배운다.

화면에 창 하나 — GUI 로 가는 길#

가장 자주 나오는 물음이 이것이다. 「C 로 창을 띄우려면?」 답은 무엇을 얹느냐에 따라 갈린다. 넷을 성격으로 갈라 둔다.

무엇성격치르는 것
Win32(WinAPI)윈도의 밑바닥. C 로 부르도록 만들어졌고 문서도 C 모양이다윈도 전용. 창 하나에도 손이 꽤 간다
GTK리눅스 데스크톱의 주류 툴킷이고 라이브러리 자체가 C 로 쓰였다GObject 라는 객체 체계를 따로 익혀야 한다
SDL · Raylib창·입력·그림을 얇게 감싼 것. 게임과 시각화 쪽위젯이 없다 — 버튼도 직접 그린다
한 파일짜리 UINuklear·microui 처럼 소스 한 파일로 끝나는 것들아주 작지만, 화면에 그리는 일은 내가 붙여야 한다

표 105.5 — C 로 창을 띄우는 길

고르는 기준도 성격에서 나온다.

  1. 버튼과 입력창이 있는 보통 프로그램이라면 그 운영체제의 툴킷(Win32·GTK)이 맞다.
  2. 내가 다 그리는 화면(게임·시각화·계기판)이라면 SDL·Raylib 쪽이 훨씬 빠르다.
  3. 덧붙이는 것을 최소로 하고 싶으면 한 파일짜리 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 Cbeej.us/guide/bgc/C 전용 무료 안내서. HTML·PDF 로 받는다. ★ 저자가 스스로 베타라 밝히므로 이 책이나 표준과 어긋나면 표준을 따른다
Beej’s Guide to Network Programmingbeej.us/guide/bgnet/같은 저자의 소켓 안내서. ★ 유닉스 쪽으로 첫걸음을 뗄 때 가장 널리 읽히는 글이다
awesome-cgithub.com/oz123/awesome-cC 라이브러리·도구를 갈래별로 모은 목록. 「창을 띄우려면 무엇이 있나」를 훑을 때 쓴다

표 105.7 — C 를 더 보는 자리

컴퓨터 과학을 넓게 볼 곳#

무엇어디성격과 단서
CS50 (하버드)cs50.harvard.edu/x/★ C 로 시작해서 파이썬·SQL·웹으로 간다. 공개 강의로 무료. 이 책 다음에 시야를 넓히기에 맞다
MIT OpenCourseWareocw.mit.edu대학 강의 공개. 운영체제·계산 구조 과목이 이 책 다음의 자리와 맞물린다
Georgia Tech OMSCS 공개 강의sites.gatech.edu/omscsopencourseware/대학원 과목 40여 개를 공개한다 — 운영체제, 컴퓨터 구조, 임베디드 최적화. ★ 강의와 연습만 공개하고 과제·시험은 빠진다
K-MOOCkmooc.kr교육부·국가평생교육진흥원이 운영하는 한국 대학 공개 강의. 한국어로 듣는다
OSSU 컴퓨터 과학github.com/ossu/computer-science공개 강의만으로 학부 과정을 따라가도록 짠 커리큘럼. ★ 가볍지 않다 — 주당 스무 시간으로 이 년쯤 잡는다. 혼자 버티기 어려우므로 함께할 사람을 찾는 편이 낫다

표 105.8 — 강의와 커리큘럼

길잡이와 목록#

무엇이 있는지조차 모를 때 펼치는 것들이다. 하나같이 목록이지 교재가 아니므로, 여기서 고른 다음에는 결국 하나를 붙들고 끝까지 가야 한다.

무엇어디성격과 단서
Free Programming Booksgithub.com/EbookFoundation/free-programming-books무료로 읽을 수 있는 책·강의를 언어별로 모은 큰 목록. 한국어 목록이 따로 있다. ★ 목록이라 품질이 고르지 않다 — 고르는 눈은 부록 D 를 참고
roadmap.shroadmap.sh분야별로 무엇을 배울지 그림으로 보인다. 「다음에 무엇을 할까」를 훑기에 좋다. ★ 길잡이일 뿐이라 깊이는 없다
Awesomegithub.com/sindresorhus/awesome주제별 「awesome 목록」을 모은 목록의 목록. C 독자에게 실제로 쓸모 있는 것은 그 안의 awesome-c 다
Project Based Learninggithub.com/practical-tutorials/project-based-learning만들면서 배우는 길잡이만 언어별로 모았다. C/C++ 칸이 목록에서 가장 큰데, 셸 · 텍스트 편집기 · 해시표 · 할당기 · 가상 기계 같은 것들이 「처음부터 끝까지」 형태로 있다. ★ 다만 운영체제 · 커널 · 데이터베이스처럼 큰 것이 나란히 섞여 있다 — 바로 앞에서 경고한 함정이므로, 이 목록에서는 작은 것부터 고른다
Coding Interview Universitygithub.com/jwasham/coding-interview-university★ 결이 다르다. 취업 면접을 겨냥한 학습 계획이라, 이 부록이 말하는 「무엇을 만들 것인가」와는 목적이 다르다. 면접이 눈앞에 있을 때만 편다

표 105.9 — 무엇이 있는지 훑는 자리

★ 강의든 목록이든, 이 책이 권하는 기준은 하나다 — 손을 움직이게 하는가. 듣기만 하는 강의와 훑기만 하는 목록은 이 자리에서 별 도움이 안 된다. 이미 문법은 아는 상태이므로, 필요한 것은 설명이 아니라 막히고 풀어 본 경험이다.

문. 이 책을 다 읽었으면 이제 「중급」인가?

답. 그런 눈금은 별 쓸모가 없다. 더 쓸모 있는 물음은 이것이다 — 혼자서 끝까지 만들어 본 것이 있는가.

이 책은 언어와 그 계약, 그리고 여럿이 짓는 방식까지 다뤘다. 그것은 바닥이고, 바닥이 단단하면 어느 갈래로 가든 덜 흔들린다(1장에서 약속한 것이 그것이다). 그러나 바닥은 건물이 아니다. 무엇이든 하나를 끝까지 세워 보기 전까지는, 아는 것과 할 수 있는 것 사이의 거리가 얼마인지 알 수 없다.

그러니 이 부록의 결론은 한 줄이다 — 작은 것 하나를 골라, 오류 경로까지 다 만들어 끝내라. 그다음에 무엇을 배울지는 그때 저절로 보인다.