조엘이 말하는 C를 배워야 하는 이유

최근에 화장실에서 힘쓰면서 읽을 책으로 조엘 온 소프트웨어 한국어판을 사서 읽다가, 조엘이 프로그래머는 C를 배워야한다고 주장에 대한 근거를 읽었습니다. (상당히 앞쪽에 있는데, 웹에서는 못 읽어봤었네용 므흐흐;)

전산과 신입생은 CPU부터 시작해서 C를 활용하는 데까지 차곡차곡 기초를 닦아야 합니다. 저는 솔직히 너무나도 많은 컴퓨터 관련 교육과정들이 자바가 가장 좋은 초보자용 언어라고 선전하는 현실에 질려 버렸습니다. 흔히 자바는 쉽고, 따분한 문자열이나 malloc과 같은 골칫덩어리를 다루는 과정에서 혼란을 겪지 않으며, 아주 큰 프로그램을 모듈로 나눠서 만들 수 있는 근사한 객체지향 프로그래밍 기법을 배울 수 있다는 화려한 이유들이 따라 나옵니다. 하지만 여기에는 교육적인 재앙이 있습니다. 졸업생들은 하향 평준화돼 러시아 페인트공 알고리즘을 여기저기에 만들어내며, 심지어 자신의 잘못을 인식조차 못할 겁니다. 펄 스크립트에서 이런 사실을 결코 볼 수 없을지라도, (물론 어렵지만) 기본적으로 문자열이 무엇인지 아주 깊은 단계에서 이해하지 못하기 때문입니다. 다른 이들이 뭔가를 잘하도록 가르치길 원한다면, 기초부터 시작해야 합니다. 이는 마치 태권소년과 비슷합니다. 마루바닥을 쓸고 닦고 쓸고 닦고, 이렇게 3주만 하면, 자연스럽게 목표물을 향해 발이 쭉쭉 뻗어나갑니다.

— 조엘 온 소프트웨어 (조엘 스폴스키)

참고: 여기서 “러시아 페인트공”이란 이 문단 앞에서 설명하던 O(N²) 알고리즘을 뜻합니다.

그동안 C를 모르고 하이레벨의 언어들만 다루는 프로그래머들이 흔히 오해하는 것들을 보면서, 기초를 위해서는 C가 아무래도 필요하지 않겠는가 생각은 해 왔지만, 뭔가 보수적이라는 생각에 아냐아냐 하고 부정도 해 봤었습니다. 그렇지만, 파이썬만 생각해 보더라도, 파이썬만을 아는 프로그래머라면 list.append, list.insert, str.__add__ 같은 것들이 사실 상 atomic operation처럼 느껴지기 때문에, 하부에서 일어나는 일을 일일이 달달 외우지 않고서는 쉽게 추측하기가 힘듭니다. 그 때문에, 결국은 비슷한 노력으로 코드를 짜더라도, C도 같이 하는 개발자들에 비해 훨씬 비효율적인 코드를 짜기가 일쑤입니다.

그런 면에서, 아무래도 입문은 자바나 파이썬 같은 언어로 하더라도, 결국은 바다 위에서 동동 떠다니지 않고 어딘가에 닻을 단단히 매서 흔들리지 않는 코드를 위해서는 C 같은 저수준의 언어를 배워야 한다는 것이 피할 수 없다고 생각됩니다. 같은 맥락에서 예전부터 매우 좋아했던 Larry Wall의 명언이 하나 생각납니다. 🙂

Real programmers can write assembly code in any language.
— Larry Wall

그래서 젊은 나이에 벌써 저수준과 고수준을 종횡무진하는 토끼군이나 디토군같은 분들을 보면 참 우리나라의 미래가 밝다고 느껴집니다. 🙂

10 thoughts on “조엘이 말하는 C를 배워야 하는 이유”

  1. 100% 동감.

    자바를 가르쳐 주다 느낀건데,
    메모리 구조나 조금만 밑단을 이야기 해도
    설명하기 힘든 어려움이 있더라고…
    확실히 기초부터 시작하는게 좋은 것 같애.

    잦은 실수와 메모리 Free 같은게 귀찮긴 하지만 -_-;;

  2. C를 알아도 저수준에 감이 없는 경우도 있더군요. 제가 첫 직장에서 한 동료로부터 들은 이야기: “malloc이나 ‘+’나 다 C에서 기본으로 제공하는 기능이니까 비슷한 정도의 실행 시간이 소요되지 않나요?”

    같은 직장에서 멀티미디어 브로드캐스팅을 위해 멀티캐스트를 연구하던 다른 동료에게 멀티캐스트가 실제로 네트웍에 패킷을 한번만 날리는 것이냐고 물어봤더니, 대답이 “글쎄요, 거기에 대해선 생각해본 적이 없는데, 어차피 우리는 OS API만 호출하면 되니까 내부에서 어떻하든 상관없는 것 아닌가요?”

    지금 직장에서 휴대폰용 소프트웨어 개발하던 직원에게 C struct에서의 memory align 문제와 #pack pragma에 대해 얘기했더니 첨에 무슨 얘긴지 잘 모르다가 대충 이해하곤 “어휴, 휴대폰 개발자중에 그렇게까지 깊이 신경쓰는 사람 없어요.”

    물론 위에서 든 예가 일반적이진 않겠지만, 모두들 C를 쓰는 개발자들이었습니다.

  3. 그 젊은 나이에 이미 저수준과 고수준을 종횡무진하는 걸로도 모자라 새로운 수준을 만들어가는 퍼키군 같은 분들을 보면… 저의 미래가 참 암울하다고 느껴집니다 :'(

  4. ”그런 면에서, 아무래도 입문은 자바나 파이썬 같은 언어로 하더라도, 결국은 바다 위에서 동동 떠다니지 않고 어딘가에 닻을 단단히 매서 흔들리지 않는 코드를 위해서는 C 같은 저수준의 언어를 배워야 한다는 것이 피할 수 없다고 생각됩니다.”

    진정한 전문 개발자가 되려면 제 생각에, C 같은 저수준의 언어를 배우는 것만 중요한 것이 아니라, 많은 것을 배우는 것이 중요한 것 같습니다. 저수준을 아는 것이 중요한 것이 아니고 다양한 수준과 다양한 폭을 갖추는 것이 중요하다는 것이지요. 예컨대, C언어를 잘 알지만 다른 사람과 협력을 잘 못한다면 이 시대의 진정한 전문 개발자가 되기 어려울 것입니다. 하지만 사람들은 이런 이야기에서 머리 꼬리 자르고 “C언어가 가장 중요해”만 빼가기 쉽죠.

    론 제프리즈는 인터뷰에서 이런 이야기를 했습니다. (http://no-smok.net/nsmk/RonJeffries ) Work with as many other people as you can, … Read _everything_, … (강조는 김창준)

    올 연초에 조엘의 에세이(http://www.joelonsoftware.com/articles/CollegeAdvice.html )를 봤습니다. 상당 부분 공감을 하지만 C언어에 대한 강조는 좀 지나치다고 봅니다. 현실적으로 C언어가 필요한 경우가 있긴 하지만, “you’ll never be able to create efficient code in higher level languages”라는 말은 과하지 않나 싶습니다.

    기본적으로 저는 http://www.stucharlton.com/blog/archives/000066.html 의 글에 동의합니다.

  5. 아아 넵. 그러고보니, 고수준 객체지향 언어들이 중요하다는 사실이 너무 일반화되어 있다보니, 저수준을 알아야한다는 면에 너무 심취해서 C 언어에 너무 치중해서 감탄한 면이 있네요. 🙂

    alphageek님 말씀대로, C언어만 배웠다고 해서 동적 링킹이나 mmap, 런타임 심볼, JIT 같은 또 다른 하위 구조들을 다 파악할 수도 없고.. 정말 가급적이면 많은 것들을 있다는 존재만이라도 파악하는 것이 중요한 것 같습니다. 알려주신 URL의 글의 “know to how to organize …” 부분이 강하게 가슴에 꽂히는군요.. 🙂

  6. 이번글에는 그다지 들어나보이진 않지만,
    조엘이라는 사람은 정말 미친 천재같은 느낌이 파다닥 ==33

  7. 아마도 원문에서는 ‘태권소년’ -> ‘karate kid’ 겠죠. 번역시에 한국 실정에 맞춘다고 … 조엘 온 소프트웨어 원문 본게 아니라서 확실친 않지만 서양인들 인식구조를 생각해보면 거의 맞지 않나 싶은.. 태권도를 가라데의 아류정도로 치부하는 인간들이 많아서.. 토픽에서 어긋난 이야기지만서도 ㅎ;; C도 C++도 다 공부하고 싶긴 하지만 귀차니즘의 압박으로 조금씩만 하다 말고.. php만 열라 파는 -_-;

  8. 그 발언도 성질을 많이 죽인 발언이라고 봅니다.
    setjmp/longjmp 나
    interlocked increment 를 이해하려면 c 가지고도 부족합니다. 어셈블리와 아키텍쳐에 대한 이해까지 필요합니다.

    저는 개인적으로 조엘의 발언을 다음과 같이 받아들입니다.

    어떤 언어로 프로그래밍을 잘하기 위해서는 그 언어에서 as-is 로 제공되는 run-time system 에 대해서 충분한 이해가 필요하다. 그것을 이해하기 위해서는, run-time system 이 거의 없는 랭귀지로 그런것들을 얼추 다 만들어본 경험이 필요하다.

    다음은 개인적으로 하이레벨 랭귀지를 쓸때 주의할 사항에 대해서 간략히 써본것입니다.

    http://nahodoom.blogspot.com/2005/03/implicit-things.html

  9. Pingback: 까먹지말자!

Comments are closed.