Engineering
고대 유물을 찾아서: 「C언어 기초+α」를 다시 읽고
장정호Walter(월터) / 주문결제개발팀여기어때
2023년 1월 29일
원문에서 보기 ↗
신구 조합
무관심과 수많은 이사 과정에서도 꿋꿋이 살아남아 책장 한쪽을 지켜낸 내 인생 첫 프로그래밍 책이다.
첫 코딩은 생각보다 오래전이다. 컴퓨터를 장만하고 인디아나존스3란 게임을 샀다. 그때는 한글화 그런 개념이 없었다. 어드벤처 게임 특성상 영어를 모르면 진도를 나가기 어려웠다. 흥미를 잃어 갈 때쯤 형이 사 놓은 C언어 기초+α 책이 눈에 들어왔다. 이 책 말고도 프로그래밍 관련 책이 몇 권 더 있었다. 프로그래밍이라는 환상을 가지고 있던 나는 아무것도 모른 채 c:\TC>tc.exe ⏎ 입력하고 터보씨를 실행시켰다. 책을 보고 영어 단어와 이상한 괄호들이 섞여 있는 문장들을 오타 없이 치는 건 어려웠다. 요즘처럼 빨간 지렁이 문법 오류 안내도 없어 컴파일 오류가 나면 한 글자씩 비교해 봐야 해서 따라 치는 것도 만만하지 않았다. Hello World와 간단한 코딩 몇 가지를 하고 이내 흥미를 잃어 책을 덮었다.
실업계 고등학교를 진학해 운에 좋게 첫 시험을 잘 쳐 선생님의 눈에 띄어 기능부에 들어갔다. 기능대회를 목표를 프로그래밍과 전자회로 조립을 했다. 이때 다시 책장에서 책을 꺼냈다. 그때는 기능부 선배와 친구들 간에 경쟁이 붙어 전투적으로 프로그래밍 문제를 풀었다. 남보다 내가 더 빨리 짧은 코드로 문제를 풀었을 때 그 짜릿한 느낌은 지금까지 개발자로 일하는데 밑거름이 되었다.
이 책을 주제로 글을 쓸 생각으로 다시 꺼내 보니 표지부터 눈에 들어오는 단어가 있었다. 원저자 중에 Donald Martin 이란 사람이 있었다. ‘도널드 마틴’이라… 이런게 드라마에서 말하는 운명인가?
책은 다루고자 하는 언어에 대한 장점부터 서문에서 설명하고 있다. 베이직이나 파스칼보다 이식성과 생산성 그리고 융통성 우수하다는 내용이다. 자바만큼 이식성이 뛰어나지 않지만, C도 그 당시 기준으로 보면 훌륭한 이식성을 가졌다. 8051, PIC과 같은 마이컴부터 메인프레임까지 널리 사용할 수 있었다. 결론적으로 C는 지금도 살아남았으니 저자의 말이 증명됐다고 볼 수 있다.
위 사진을 보면 화면 크기는 80 * 25이었다. 이마저도 메뉴, 툴팁, 편집 정보 영역을 빼면 편집영역은 더 줄어든다. 그때는 당연했는데 지금은 답답하기 그지없다. 이거 아는가? 80컬럼이란 크기도 허투루 정해지지 않았다는 것을. 80컬럼짜리 IBM 펀치카트에서 유래 됐다고 한다. 또 하나 우리가 흔히 말하는 ‘패치’라는 단어도 펀치카드 구멍을 잘못 뚫었을 때 종이테이프를 붙여 메웠던 것에서 왔다.
책 목차는 기초지식을 시작으로 C의 소개, 데이터형, … 루프와 제어문, 함수, 배열 포인트, … 화일 입출력 순으로 되어 있다. 요즘 프로그램 언어를 다루고 있는 입문서 목차와 크게 다르지 않다.
이 때는 메모리 1bit도 아껴서 프로그램을 만들었다. 특히 킬로바이트 수준의 메모리를 가지고 있는 마이컴 분야에서는 더더욱 절약이 필요했다. 예를 들어 회원 객체 상태 값을 만들 때 보통은 항목별로 속성을 지정한다.
public class User{
private boolean withdrawal;
private UserType type;
private boolean elite;
}
이런 데이터 구조에서 메모리를 절약하기 위해 회원 상태 정보를 나타내는 1byte(8bit)를 만들고 자리별로 의미를 부여한다. 0번째 자리는 탈퇴 여부, 1~2자리는 회원 유형(00: 일반, 01: 기업회원, 10: 직원), 3번째 자리는 엘리트 회원 여부 이런 식으로 저장했다. 비트 마스킹 기법을 활용해 프로그래밍했다. 이때 흔적이 아직 남아 있는 곳이 있다. java.util.regex.Pattern 클래스를 보면 이런 식으로 플래그를 비트 단위로 저장하는 걸 확인할 수 있다.
public static final int UNIX_LINES = 0x01;
public static final int CASE_INSENSITIVE = 0x02;
public static final int COMMENTS = 0x04;
public static final int MULTILINE = 0x08;
데이터형 챕터에서 부동소수점에 대한 설명이 잠깐 나온다.
`double sum = 0.0`이라고 선언하고 0.1을 10번 더하면 상식적으로 1.0이 돼야 하는데 프로그래밍의 세계에서는 그렇지 않다. 부동소수점을 제대로 이해하기 위해서는 생각보다 깊고 넓은 지식 필요하다. 간단히 설명하면 컴퓨터는 모든 수를 이진수로 처리하는 건 다들 알고 있을 거다. 문제는 0.1을 이진수로 표현할 수가 없다는 거다. 1/3 같은 유리수를 십진수로 표현 못 하는 것처럼. 이 과정에서 오차가 발생해 결국에 십진수 연산하듯 결과가 나오지 않는다.
조건문과 루프 문에 대한 설명은 순서도를 그려 논리적인 흐름을 따라가면 되니 그 당시에도 쉽게 이해했다. 예전 기억을 떠올려 피라미드 문제를 풀어 봤다.

피라미드, 역 피라미드, 다이아몬드
내가 프로그래밍을 배울 때 다중 for 문 예제 첫 번째는 구구단이었고 그다음은 피라미드가 나왔다. 사반세기 만에 터보씨를 이용해서 코딩하려니 문제를 푸는 것 보다 편집기가 익숙하지 않아 고생했다. 복사 붙여 넣기를 어떻게 하는지 기억이 나지 않아 일일이 타이핑했다. 습관적으로 controll + space를 누르기도 했다. 함수를 어떻게 사용했는지 가물가물하다. 이때는 프로그래밍 계의 사전의 포지션을 담당하는 라이브러리 책이 있었다. 사전이 사라진 것처럼 라이브러리 책도 사라졌다.
배열과 포인터는 C언어를 배우는데 첫 번째로 맞이하는 커다란 산이었다. 여기부터 `[], *, &, ->` 그동안 못 보던 문자들이 대거 출몰하기 시작한다. 학년이 올라갈수록 수학 교과에서 숫자는 사라지고 이상한 기호들이 나타나는 것처럼.
포인터를 알기 위해서는 메모리 구조 이해가 필요하다. 주니어 또는 의심 가는 시니어 개발자 면접 때 “Call by reference와 Call by value에 대해 차이점에 관해 설명해 보세요.”라는 질문을 한다. 이 질문의 핵심은 포인터와 메모리다. 책에서는 포인터, 배열 그리고 구조체가 결합한 변수에 값을 초기화하고
`++(*++(*ptr)->sp).a` 이렇게 하면 값이 어떻게 나올까? 라고 물어보는 변태 같은 문제도 있다. 내가 실무 경험이 없어 모르겠는데 실제 현장에서도 이렇게 사용하는지 궁금하다.
함수형 프로그래밍을 공부하다 보면 포인터를 공부했을 때 느낀 벽을 떠오르게 한다. map, reduce, group by, filter, curry 하나씩 보면 이해가 되는데 조합하면 너무 헷갈린다.
파일 입출력은 지금과 비교하면 너무 복잡하고 어렵다. 간단한 텍스트 파일 하나를 읽고 쓰는데 메모리 할당, 해제, 파일 포인터 등 관리해야 할 게 많다. 그리고 이 당시에 유니코드는 먼 나라 이야기라서 호환성 문제로 한글이 깨지는 경우도 많았다. 첫 번째 사진을 보면 편집기 외곽선이 `쳐컴캑` 이렇게 깨진 것을 볼 수 있다. 외곽선을 나타내는 특수문자 영역과 한글 도스의 한글 영역과 겹쳐서 발생한 현상이다.
책을 다 읽고 덮었다. 이 책은 주로 고등학생 때 읽었다. 그 시절 이런 생각을 한 적이 있다. ‘지금 살아온 만큼 더 살았을 때 나는 어떤 모습일까?’ 그때는 까마득히 먼 이야기라 생각했는데 지금은 지나간 이야기가 돼버렸다. 역사에 남을 만한 개발자는 여럿 있다. 손 코딩으로 아폴로 비행 시스템을 개발한 마가렛 해밀턴, 도스 시절 컴퓨팅 파워에서 돌아가는 3D게임을 개발한 존 카맥, 개발자라면 누구나 사용하고 있는 리눅스와 Git의 개발한 리누스 토르발스. 모두 지금 나보다 훨씬 어린 나이에 이룩한 성과들이다. 한때는 나도 이들처럼 영웅적인 개발자가 되고 싶었다. 그게 아니더라도 이력서에 구구절절한 내용 대신 아파치 커미터, 킷헙 스타 3000개 달린 내 프로젝트 링크를 쓰고 싶었다. 그러나 지금 마음 졸이며 배포 버튼을 누르고, 대규모 배포가 있기 며칠 전부터는 어지러운 꿈을 꾸는 개발자다. 내 몫을 다하고 있을까? 그동안 내가 욕했던 사람들과 나는 다를까?
형이 이 책을 구입하고 얼마 있다 컴퓨터를 샀다. 많은 밤을 보내고 기다리다 지칠 때쯤 컴퓨터가 왔다. 박스를 열었을 때 처음 느껴보는 보는 고급스러운 냄새. 묵직한 부팅소리. 반짝이는 커서. 날 흥분시켰다. 이제는 주인집 아들의 게임기가 부럽지 않다.
어느 날 친구와 백화점 게임코너에 놀러 갔다. 눈칫밥을 감수하고 진열대에 놓여 있는 게임을 하기 위해서다. 사지도 않을 게임박스를 보다 ‘최소 사양: 386SX’라는 글귀를 봤다. 이내 내 컴퓨터에서는 실행할 수 없다는 뜻이라는 걸 친구의 도움으로 알게 되었다. 항상 우리집 컴퓨터가 최고라고 믿고 있었는데 세상은 변하고 있었다.