2023년에 C언어가 가지는 의미는 무엇일까? C언어는 절차적 프로그래밍 언어의 맹주인 1972년생 프로그래밍 언어이지만, 객체지향을 넘어 함수형 프로그래밍이라는 패러다임이 몰아치는 현 시기에 C언어는 어떤 가치와 지향을 가지고 개발자들에게 다가설 수 있을까? 물론 나야 C/C++계열의 언어를 가장 좋아하고 있지만, 이제는 다른 신생 모던(Modern) 언어들이 제공하는 문제인식 개념이나 편의성을 C언어는 어떻게 풀어내려고 접근하고 있을까? 하는 궁금점을 가지고 모던 C언어를 살펴보기 위해 이 책을 골랐다.

 이 책의 제목은 '전문가를 위한C'라고 번역되었고, 두께가 무려 900여 페이지에 달할 만큼 위압감을 주는 책이다.  원서의 제목은 "Extream C"이다.  C언어 역시 짝꿍 C++와 함께 발전을 거듭해왔다. C언어는 1989년 ANSI C 스펙이 확정된 이후에도 C95, 99, 11, 18을 넘어 23까지 발전을 해오고 있지만, 그닥 개발자 그룹의 많은 관심을 받지는 못했다.  전문가들이 보아야할 책으로 생각할수도 있겠지만, 이 책을 80% 정도 읽은 시점에서 나는 초급을 벗어난, 고급 개발자가 되고 싶은 컴파일러 방식의 언어 중급 개발자들에게 큰 도움이 될 수 있는 책이라 본다. 단순히 C언어 문법을 익히고자 한다면 이 책은 그 답이 아닐 가능성이 높다.

 

이 책은 크게 7부로 나뉘어진다.

1부와 2부는 컴파일러 언어인 C를 중심으로 어떻게 컴파일러가 실행파일을 만들어 가는지, 실행파일은 기본적으로 어떻게 동작하는지를 설명한다. 특히 4장 에서는 C코드가 목적파일을 거쳐 실행파일까지 변환되는 과정속에서 메모리/데이터가 어떤 식으로 펼쳐지는지를 소개한다.왜 스택과 힙이 있는지를 잘 설명하고 있고, 각 메모리 세그먼트의 역할과 분석 방법을 통해 C코드의 동작원리를 설명한다. 윈도우가 아니라 맥/리눅스를 중심으로 소개하는데에서 한때 윈도우 프로그래밍하면 C였던 시대가 아련하게 느껴졌다.

3부에서는 재미있게도 C언어이지만 객체지향이라는 개념을 다룬다. 사실 C언어에서도 객체지향이 가능하다. 다만 조금 불편할 뿐이지.. 저자는 OOP를 언어의 특징이 아니라 "문제를 생각하고 분석하는 방식"(P.254)으로 설명하면서 C와 C++의 관계까지 소개하고 있다.

4부에서는 유닉스를 소개하면서 커널와 사용자 모드에 대해 설명한다. 다시한번 윈도우에서 길을 잃은 C언어의 모습이 느껴져 시대의 변화가 느껴지기도 한다. 하지만 C가 여전히 임베디드 시장이나 게임엔진, 하드코어 영역에서 중요한 역할을 맡고 있구나 하는 생각도 든다.

5부와 6부는 모든 언어에서 화두가 되는 동시성/병렬성과 프로세스간 통신의 방법을 소개한다. 꽤 많은 분량을 할애하여 쓰레드 동기화 및 IPC, 소켓 통신을 다룬다. 다만 언어 설명서와 같이 아주 상세하게 다루지는 않는다.

7부는 테스트와 빌드시스템 이야기인데, 소프트웨어의 유지 보수 이야기라면 모듈 패키지 관리 솔루션인  vcpkgconan에 대한 설명까지 곁들여졌으면 더 좋을 것 같다.

 

이 책은 전체적으로 초/중급 개발자(초년~5년차) 정도의 개발자들이 개발의 경험을 바탕으로 지식을 좀 더 깊게 만들때 도움이 될만한 책이라 생각한다. 단순히 C언어 책으로 인식되기엔 아깝고, 컴파일러 언어를 사용하는 개발자라면 한번씩 읽으면서 C가 만들어내는 방식을 이해해 보는 것도 유용하리라 생각한다. 윈도우 프로그래밍과 관련해서는 다른 책을 더 읽어야 한다. 이 책은 그런 내용을 다루지는 않는다.

일본에서 만들어진 C언어 캐릭터

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

반응형

요즘은 모듈/패키지/프레임워크를 이용하여 기능을 구현하는 경우가 많다. 생산성을 위해서는 그럴 수 밖에 없다고 생각한다. 그러다보니 그냥 동작하는 것처럼만 보이면 OK인것처럼 인식하는 경우도 많다. 하지만 문제와 해결방안, 그 원리를 이해하지 않으면 작성된 코드들이 결국 유지보수하는 과정에서 복잡도가 증가하여 오래 살아남기 힘들다.

이런 문제의 해결 방법은 의도를 가지고 코드를 작성하는 것이라 생각하는데.. 의도를 가지려면 본인이 해결하고자 하는 문제를 인식하고 그에 대한 해결 방안에 대한 이론과 가설을 세워야 한다. 문제를 어떻게 인식하고 접근할 것인가에서는 세상을 바라보는 사상이나 철학이 반영된다고 생각한다. 중요한 것은 자신의 접근방식 모델을 세운 다음 코드를 작성해야 한다는 점!

즉, 자신이 해결하려는 문제를 인식하여 과제로 정리한 후, 문제에 대한 이해를 바탕으로 나름의 이론과 가설을 세워 해결방안 또는 접근방안을 만들고, 이를 코드로 녹여내려는 의식적인 흐름이 필요하다. 이런 생각을 가지고 있던 중 실용주의 프로그래머 20주년 기념판 288쪽-289쪽에 좋은 내용이 나와있어서 핵심 문구만 소개한다.

 

  • 코드를 마주 찍어내는데에 드는 시간을 줄이고 싶고, 가능한 한 개발 주기 초기에 오류를 잡아서 고치고 싶고, 애초부터 오류를 더 적게 만들고 싶다면 의도적으로 프로그래밍 해야 한다.
  • 언제나 지금 무엇을 하고 있는지 알아야 한다.
  • 더 경험이 적은 프로그래머에게 코드를 상세히 설명할 수 있는가?
  • 자신도 잘 모르는 코드를 만들지 마라
  • 계획을 세우고 그것을 바탕으로 진행하라
  • 신뢰할 수 있는 것에만 기대라
  • 가정에 의존하지 마라. 무언가를 신뢰할 수 있을지 판단하기 어렵다면 일단 최악의 상황을 가정하라
  • 가정을 기록으로 남겨라
  • 코드 뿐만 아니라 여러분이 세운 가정도 테스트 해보라.
  • 추측만 하지 말고 실제로 시험해보라
  • 중요한 것에 먼저 시간을 투자하라. 중요한 부분이 가장 어려운 부분이기도 한 경우가 많다
  • 더는 적절한 코드가 아니라 싶으면 어떤 코드라도 교체할 수 있다. -> 리팩토링

 

실용주의 프로그래머 20주년 기념판/인사이트

 

사족> 실용주의 프로그래머 20주년판 2/3 정도 읽었는데, 정말 세월의 흐름에 상관없이 읽어볼 책이다. 저자는 20년동안 정체된 것이 아니라 발전하는 개발자의 모습을 보여준다.

사족#2> ChatGPT를 개발에 많이 활용해 보고 있다. ChatGPT가 주는 답이 기존 구글링보다 좋은 검색결과라기 보다는 내 머리속에 혼재되어 있는 생각들을 ChatGPT와 대화하면서  모델로 만들 수 있기 때문에 큰 도움이 된다고 생각한다. 그 모델에 확신을 더해 의도를 명확하게 하여 코드를 작성하는 것!

반응형

+ Recent posts