신입생에게 C/C++은 독인가?

CN님의 블로그에서 “가장 어리석은 선택: C언어“라는 약간은 자극적인 글을 보고나니, 제목자체에서는 약간 거부감이 있었습니다만, 본문과 댓글을 보고는 여러가지 공감도 가고 그렇습니다. 여하튼..

제 입장에서 생각하면, C언어는 배울만한 충분한 이유가 있는 언어이나 학교에서의 교육 방법에 문제가 있는것 아닌가 생각하는 것입니다.

컴퓨터 공학 교육이 언어 및 머신에 대하여 독립적이면 좋다는 것은 맞습니다만, 컴퓨터 공학 분야의 대부분의 이론이 언어를 사용하지 않고 수학적 이론으로 풀면 상당히 어려운 수준에 도달합니다. (저 같은 경우 대학원 과정에서 컴퓨터에서의 덧셈 연산 수행 과정을 수학적으로 모델링하고 분석하는 법을 배웠을때 솔직히 머리 터지는 줄 알았습니다. ^^; ) 따라서, 예가 될 수 있는 언어를 사용하는 것이 좋겠지요.

그 예제 언어로서 가장 많이 사용되는 것이 C/C++/java 시리즈인데요..
CN님의 비판 포인트는 C 형제들이 이런 목적에 부합하냐.. 이것이시겠죠.. ^^;
다른 좋은 언어도 많은데.. 교육적으로..

네.. 제 생각에도 학생들이 C언어라는 것을 배우는 것은 매우 이른 시점이며, 대부분 컴퓨터 시스템에 대한 이해가 없는 상태에서 컴퓨터 시스템에 대한 이해가 필요한 C언어를 배운다는 것이 비극의 시작이라고 생각합니다.
더 중요한 문제는 많은 교수님들/강사님들께서 문제 출제를 위하여, 별 필요없는 문법적 지식에 목을 매서, 아주 희안한 코드를 그려넣고 이게 어떻게 동작할지 맞춰보라는 문제를 내기 때문에 좌절스러운 것이라 생각합니다.
예를 들어, printf의 그 많은 format을 알아서 뭐하겠습니까.. 간단히 훓고 지나가서 나중에 필요할때 reference manual보면 되죠.. 포인터의 포인터의 포인터, 포인터의 괄호 결합 순서를 배워서 뭐하겠습니까? ^^; 물론 필요 있습니다만, 이거 쓰는 경우 거의 없잖아요.. 근데, 문제내기 좋은 항목들이니 자세히 알려줍니다.
많은 학생들이 C 언어의 pointer 부분에서 절망하는 가장 큰 이유는 컴퓨터 구조에 대한 이해가 없는 상태에서 pointer를 무지막지하게 가르킨다는 점때문이라 생각합니다.

C언어를 가르키는 이유가 절차적 언어에 대한 감각을 익히고, 컴퓨터 시스템에 대한 전반을 이해하는 것으로 목표를 두어야 하고, 거기에 C를 배우는 가치가 있다고 생각하는데.. 현실의 교육은 언어적 테크닉에 집착하는 경우가 많으니까요..(사실 말이 쉽지 가르킬때 쉽지 않을 것이라는 것을 너무도 잘 압니다.)

Computer architecture를 전공한 입장에서 이야기드리자면..

Computer architecture라는 개념적인 과목보다 C가 앞에 있어야 하냐는 판단하기 어렵습니다. 단, C에 익숙한 친구들은 computer architecture 과목에서 많은 부분을 쉽게 따라오는 것이 사실입니다.

그럼 computer architecture가 1학년 과목으로 가면… 너무 가혹하겠지요.. ^^;
포인터에 사용되는 memory system도 머리가 아픈 판국에 register니, bus니 배우는 건 아무리 봐도 좀 무리가 있습니다. 게다가 assembly 언어를 고급언어에서 배웠을 개념적인 도움없이 직접 들어가는 건 설명하기가 너무 어렵더군요..
3학년 과목으로 간다면.. computer architecture가 기반이 되어야 할 compiler 이론이나(물론 machine dependent optimization을 고려하지 않은 RTL상태의 최적화만 다룬다면 가능하겠습니다만..), OS 이론, digital system쪽은 4학년으로 이동해야 하는 불행이 있겠구요..

여러면으로 보았을때 컴퓨터 시스템에 대한 기반을 알려줄수 있는 C가 선두에 서는 것이 유리하죠..
단지 문제는 받아들일 준비가 안된 학생들에게 C가 튀어나오면서 “언어”와 “구조” 두가지를 모두 강요하다 보니 벅차다는 것이 문제겠죠.. 그걸 잘 연계해서 알려주시는 분들도 부족하구요..

C 언어의 효용성 부분인데요..
우선, C 언어를 배우면서 컴퓨터 시스템 전반에 대한 이해를 얻을 수 있구요(제대로 배웠을때 이야기지요..^^;)
(제가 소프트웨어직에 종사하지는 않습니다만)소프트웨어 분야에서 C/C++/java의 위상이 그렇게 떨어지지는 않았을것이라고 생각하구요..^^;
제가 종사하는 ASIC, SoC 쪽이나 관련있는 embedded 쪽은 C/C++를 모르면 좀 살아가는 것이 어렵겠다 싶을 정도로 중요합니다. 정말 “언어”처럼 사용되거든요.. 문서로 수십장 적어서 동작을 기술하는 것보다 C로 간단히 함수 하나 던져주는 것이 더 명백하거든요.(executable spec이라해서, 매우 일반화되어 있답니다.)

C 언어는 computer architecture로 가는 길을 열어주는 언어이기 때문에 어찌보면 최선의 선택이라 할수 있지만, 학생의 입장에서는 부담되는 언어임이 확실하고.. 만일 C 언어의 교육 이유를 이해하지 못하는 교육자분들께서 수업을 맡으신다면 최악의 선택이 되겠습니다.

역시 최선과 최악은 붙어있는 건가요..^^;

p.s.
그러고보니, computer architecture에 대한 이해가 필요없는 분야에서는 뭐 굳이 C가 필요없지 않을까요?
교양과목으로서의 컴퓨터 언어로는 정규식도 배울수 있고 제어구조도 나쁘지 않은 perl, python 형제같은 것이 훨씬 더 편하지 않을까 생각되네요..(다른 많은 언어가 있겠습니다만.. 제가 아는 언어는 몇개 없는 관계로..)
그런데.. computer architecure의 기반이 필요치 않은 CS쪽 과목이 많나요? ^^; (직접적인 출신이 CS가 아닌 EE다 보니..^^;)

10 thoughts on “신입생에게 C/C++은 독인가?

  1. Pingback: CN's note
  2. 교육 방법에 문제가 있다는 것은 정말 대공감 입니다~ ㅠ.ㅠ
    제가 개인적으로 효과적이라고 생각하는 교육 방법은
    (i) 단순 따라하는 정도의 지식/개념 전달
    (ii) 노가다 실습/체험
    (iii) 위 노가다에 대한 깔끔/강력/범용적인 솔루션 제공
    (iv) 프로젝트 수행
    입니다…
    특히 (iii) 과정에서 썩소 한방 날려주면 배우는 입장에선 정보보다 깨달음을 얻으리라고 봅니다 -_-;;

    가령 예를 들면,
    (1) CLI(Command Line Interface) 전용 simulator에서만 풀 수 있는 H/W를 주고
    다양한 실습을 하면서 CLI 환경이 익숙해짐과 함께 자연스럽게 shell script를 익힐 수 있도록 함.
    더 나아간다면 perl/python/tcl 등과 같은 언어도…
    (2) 마이크로 컨트롤러 실습으로 오직 어셈 갖고만 다루다가 익숙해질만하면 C언어 컴파일러 던져주기
    (3) 컴파일러에서 문법 처리기를 오직 C언어로만 짜다가 익숙해질만하면 lex/yacc 던져주기
    (4) 그외에도 paper and pencil로만 하다가 나중에 computer를 이용하여 풀어서 비교하는 것도 효과적이라고 봅니다.

    1. ㅎㅎ 그렇지요.. 저도 CWEB을 써봐야 할텐데, 요즘 설계에 정신 없어서..
      요즘에는 CWEB비슷한 것이 Verilog HDL에서도 있었음 좋겠다는 생각을 백만번은 하고 있습니다… 🙂

  3. 물리계산이나 기타 연구분야에서도 요즘에는 자바가 많이 쓰이고 있는 것 같습니다.
    아무래도 어느정도 심도있게 들어가다보면 기존에 만들어 져 있는 API를 충분히 이용 할 수 있으니 그러것 같습니다. 게다가 요즘에는 프로그래밍언어를 배우는 과정에서도 이미 미국쪽에서는 국내에서 처럼 C부터 배우는 것이 아니라 아예 자바면 자바 C#이면 C#그렇게 나가더군요. 뭐 아마도 객체지향과 절차지향의 차이가 조금 있는 것 같습니다.

    1. 알고리즘이나 다른 여러가지에서 java도 훌륭하다고 생각합니다. 프로그래밍 언어의 개념을 익히는데도 그렇구요..
      저는 C/C++이라는 언어가 컴퓨터 아키텍쳐(와 이를 기반으로 하는 여러 학문)를 배우는데 있어서 매우 유용하다고 생각하고 있습니다만, 이 분야가 아닌 응용분야들에서는 굳이 C/C++이 아니어도 관계없다고 생각합니다.
      사실 java/C#는 (simple stack based)virtual machine에 기반을 두고 언어가 진행되어서, 실제적으로 프로세서의 동작을 알기는 좀 어렵거든요.. (물론, 그런 부분때문에 java/C#이 각광받은 것이지만요..) 그래서, 프로세서에 대해 알 필요가 있는 사람에게는 매력이 적은것 같습니다. 단, 앞에 이야기했듯, 응용분야에서는 java/C#의 장치 독립적인 면에 더 장점이 되겠지요..

  4. 컴퓨터 구조 쪽에서야 .. C는 필수죠. 저도 백만번 공감합니다. -_-;; 그러나 학생들이 못 따라오니 문제. 이건 학생들의 노력 부족도 있을 뿐더러 교수(사실은 대부분 소프트웨어쪽 강사가 하죠.)님들의 지도 방법에도 문제가 있습니다. 전 중학교때 C++에 관심이 있어서 그때부터 C++을 사용했었는데 그래서 대학교때 가르치는 내용은 거의 껌 수준이었죠. 그런데 수업을 들으면 들을수록 ‘이건 아니다..’ 싶었더랩니다. 프로그래밍 방법을 가르치는것도 아니고 그렇다고 C를 가르치는 것도 아니고, 단순 암기 형식이더군요 OTL…

Leave a Reply