본문 바로가기
컴퓨터/전산, 그 외

C/C++ 을 처음에 하지 마라

by adnoctum 2010. 9. 8.


   

2020.07.10

   이 글은 처음 쓰여진 2004년 이후 여러 번 덧붙여 졌다. 그러다 보니 글이 다소 혼란스럽다. 오늘은 간략히만 이야기하고, 나중에 차분히 정리하려 한다. 

   이 글의 목적은 생전 프로그래밍이라는 것을 해 본 적이 없는 사람이 취미로 컴퓨터 언어를 하나 배워 볼까, 할 때 C++은 결코 좋은 선택이 아니고, 하나 추천하자면 그것은 파이썬이라는 것이다. 그런 상황에서 C/C++ 은 결코 좋은 선택이 아니라는 것이다. 살면서 코딩 비슷한 것이라고는 엑셀에서 =IFERROR 정도밖에 없는, 이공계 출신이 아닌 사람이, '한번 프로그램을 배워 볼까', 할 때 선택할 언어가 C++ 은 아니라는 것이고, 굳이 추천하자면 파이썬 정도라는 것이다. 

   15년간 이어진 이 글에 대한 무수한 댓글과 반응들 - 아래 있는 댓글들이 다가 아니다, 많은 사람들이 썼다 지운다 - 중 대다수는 자신이 C++ 을 얼마나 아는지, 잘 하는지를 과시하려는 목적일 뿐 이 글의 원래 목적인 "프로그래밍 문외한이 취미로 해보려고 할 때 시작할 언어로는 어떤 것이 적당한가?"에 대한 이야기는 좀체 보이지 않았다. 다시 말하지만, 이 글은 C++ 을 아무도 하지 말라는 것이 아니다. 전산과는 C나 C++ 하세여, 누가 전산과 사람들한테도 C++이 필요 없다고 했나. SI 나 개발자들은 C++ 을 결국엔 배워 두면 좋다고, 누가 아니랬나. 개발을 업으로 할거면 C++ 을 하는 게 나쁘진 않다고, 누가 아니랬나. 그러면 또 누군가는, 요즘엔 잘 쓰지도 않는 C++ 대신 자바를 하거나, 웹이 대세니 javascript 를 안 하면 안된다거나, 뭐, 그럴지도 모르겠다. 그럼 그거 하세여, 누가 자바나 자바스크립트는 하면 안된다고 했나. 대체 왜 문맥에서 벗어 난 그 수많은 반응들이 있는지 모르겠다, 구매 목록 삭제도 아니고, 원. 그것도 대다수가 자신의 C/C++ 에 대한 지식/능력을 과시하기 위한. 이 글은 C++ 만 하라는 얘기도 아니고, C++ 을 무조건 하지 말라는 것도 아니고, C++ 을 안 하면 안된다는 얘기도 아니고, C++ 이 최고란 얘기도 아니고, C++ 이 몹쓸 것이란 얘기도 아니다. 그게 아니라, 취미로 개발을 해보고 싶은 사람이 C++ 로 시작해선 십중팔구 하다 포기할 것이니 차라리 쉽고 유용한 파이썬으로 시작해 보란 이야기다. 취미로 프로그래밍 언어를 배워 보고 싶은 사람은 C++ 이나 자바 대신 파이썬을 배워서 직접 사용해 보길 권하고, 시간이 나면 차라리 이산수학이나 재미로 읽는 알고리즘류 책을 보는 게 도움이 될 것이다. 취미로 언어를 배워 보려는 사람한테 C++ 로 시작하라는 것은 영어를 공부하려는 사람한테 우선 영어 사전을 다 외워 오라거나, 단어 하나 배울 때마다 그 어원까지 따지는 것만큼 비효율적인 것이다. 문맥에 좀 잘 안 맞고, 쉬운 영어 단어지만 일단 말을 해봐야 영어가 늘 거 아녀, 말하자면 그게 바로 파이썬이란 얘기란 말이다. 

   장자에 보면 이런 이야기가 나온다. 물고기가 길바닥에서 파닥거리고 있었다. 그 때 한 선비가 지나가길레, 물고기가 나에게 물 한 바가지만 퍼다 주쇼, 라고 했다. 그러자 선비가, "지금 내가 관리가 되기 위한 시험을 치르러 가는 중이데, 관리가 되어 이 위에 큰 저수지를 만든 후 너를 거기다 풀어 주겠다." 하니, 물고기가 "이 양반에, 나한테는 지금 당장 물 한 바가지가 필요한 것이지, 뭔놈의 저수지냐. 이 다음에 나를 어물전에서나 찾아 보게나." 했다는 이야기가 있다. 생전 프로그래밍이라고는 해 본 적도 없는 사람이 성인이 되어 개발을 취미로 가져볼까 할 때 C++ 을 추천하는 것은 마치 저 선비와 같다고 느껴진다. 그러면 십중팔구 포기한다. 이 말에도 "나는 했다"부터 시작해서 "그것도 못하면 개발을 어떻게 할거냐", 같은 수많은, "예외적/희박한 상황을 근거로 한 반론"이 있을 수 있다. 지친다 지쳐. 그런 사람은 생전 처음 프로그래밍을 해보려는 사람한테 C++ 추천하고 다니세여, 그럼. 

   삶의 많은 것이 그렇듯, 이 글도 가장 일반적인 경우에 대한 이야기이고, 저마다가 처한 모든 상황에 이대로 적용될 수는 없을 것이다. 파이썬도 내가 그냥 강력 추천하는 것일 뿐, 각자의 상황에 맞게 선택해야 할 것이다. 아는 누나/형/동생/언니가 알고 보니 R 의 전문가더라, 그러면 R 로 시작해서 도움 받으면서 배워도 좋다. C++ 전문가는 결코 찾기 쉽지 않다. 그리고, C++의 경우 제대로 도움을 주기 힘들 수 있는데, 마치 유치원생에게 함수의 좌극한 값과 우극한 값이 다르면 미분 불가능함을 설명해야 할만큼 설명해야 할 게 많기 때문이다. 집 앞에 컴퓨터 학원이 있는데, 거기서 vbscript 를 가르쳐 준다더라, 그러면 그것이라도 들어 보면 좋다는 것이다. 매일 게임만 하는 것 같았던 남동생이 알고 보니 C# 을 잘 하더라, 그러면 도움좀 받아 C# 으로 시작해도 되는 것이다. 대부분의 프로그래밍은 에러가 났을 때 그 원인을 찾아 고치는 디버깅이 어렵다. 이것은 숙련된 개발자에게도 결코 쉽지 않다. 초심자는 더더욱. 그래서 이 때 곁에서 디버깅을 도와 줄 사람이 있으면 아주 큰 도움이 되고, 그래서 주변에 그 언어를 알고 도움을 줄 사람이 있는 언어를 선택하는 것도 좋은 방법이란 이야기이다. 

   이 글은 또한 C 와 C++ 을 구분하지 않고 쓰는데, 뭔, 자바랑 자바스크립트가 비슷한 것 같다고 할 사람들한테 이 둘을 구분해, 구분하긴, 그냥 퉁 쳐서 얘기하는 것이지, 어차피 대다수가 이 두 언어가 공통으로 갖고 있는 포인터란 것에서 일차 좌절을 하니 말이다. 변수가 뭔지 처음 듣는 사람한테 oop 와 generic 을 어떻게 설명할겨. 깔끔한 C/C++ 코드로 가능한 일은 그냥 파이썬으로 해도 충분할 경우가 많고, 그렇지 않고 정말로 C/C++ 을 이용해 성능을 극대화시키게 되면 코드는 결국 지저분해진다. 이러면 또 아는 체 하고 싶은 사람은 코드 레벨에서는 최적화 해 봤자 별로 효과 없다고 얘기하겠지? 그래, 하지만 결국 나중엔 그렇게 해야 할 때가 온다. 제일 우선적으로는 문제를 수학적으로 최적화 시키고, 그 후 프로그램 전체 구조 관점에서 최적화 시킨 이후, 결국엔 코드 레벨에서 한줄한줄 보면서 최적화를 하는데, 그러면 지저분해 진다. 깔끔하게 짤 수 있다면 그냥 다른 언어로 해도 충분할 수 있다. 프로그래밍을 처음 배우는 사람에게는 이러한 최적화가 필요하지 않은 경우가 대부분일테니 굳이 C++ 로 할 필요는 없고, 그러니 더더욱 처음에는 배우기 어렵고 디버깅 어려운 C/C++ 말고 쓰기 편한 파이썬으로 시작하라는 것이다. 

   내가 입만 살아서 20년동안 C++ 쓰면서[각주:1] std::cout 만 하고 있는지 아는 사람들이 있나 본데, 한국 프로그래밍 업게 평균 연봉보다 많은 돈을 세금으로 내야 할 정도는 벌고 있을만큼 개발로 먹고 살고 있으니 빈 수레가 요란한 것 아닌가 하는 걱정은 잠시 접어 둬도 되겠다. 

   다시 한번 말하지만 댓글은 "프로그래밍이란 것을 취미로 해보고자 시작하려는 사람"에게 도움이 되는 내용을 부탁한다. 자신이 C++ 을 C를 잘 하는지, 아는지를 굳이 과시하기보다는.




   원 글을 작성한 지 15년이 지났다. C++ 을 한 지는 20여년이 되어 간다. 여전히 일의 대부분을 C++ 로 한다. 하지만, 역시나, 프로그래밍을 한다는 사람 있으면 파이썬 추천한다. 프로그래밍 그 자체의 효용, 그것에 대한 흥미를 위한 시작 언어라면 C++ 보다 파이썬이 훨씬 좋다. 왜 미국을 포함한 수많은 대학에서 C/C++/JAVA 대신 파이썬으로 학생들을 교육시키는지 생각해 보면 더더욱 파이썬이 좋은 선택임을 느낄 수 있을 것이다. 

   하도 C++ 어렵다고 징징대니까 능력 부족인 내가 지극히 개인적인 이야기를 하는 것으로 보이는지, C++ 이 얼마나 중요한지 내게 알려 주려는 사람이, 또는 능력만 충분하다면 C++ 을 첫 언어로 해도 충분하다는 사람이 몇 년에 한두번씩 꾸준히 나오는데, 그냥, 까놓고 얘기하자면, 대기업/국책연구소/중소기업 등등에서 함께 일하자는 제안이 박사과정 때부터 학위가 끝난 후 5년이 지난 지금까지 일년에 한두번씩 지속적으로 올만큼 C++/수학/통계에 익숙하며 20여년 동안 일의 90%를 C++을 사용하는 사람이 "첫 언어라면 파이썬이 좋다", 라고 하는 것이니 하려면 파이썬을 하는 게 좋을 것이다, 굳이 언어를 하나 배워 보고 싶다면. 

   자신이 진짜 C++ 잘 한다고 생각되면 double 형 데이터 1000억개 정렬하는 코드 작성해서 github에 올린 후 링크 달아보자. 이 글에 댓글 아무리 달아도 아무도 그 댓글 보고 C++ 잘 하는 사람이라고 생각하지 않는다. 책에 나오는 포인터 따위는, 그냥 한글 읽고 쓸 줄 안다고 대하소설 쓰기 쉽다고 하는 것이랑 같아서 그거 안다고 포인터 잘 쓰는 거 결코 아니다. 그리고 이 블로그에 있는 코드는 내가 작성한 코드의 1%도 안 되긴 하지만 적어도 내가 쓴 글은 몇 개 읽어 보고 답글 달자. 옆에 C++ 이나 수학이랑 카테고리의 글 말이다. 글이 많지도 않다. 댓글 썼다 지우는 사람 많다. 

   C++이 안 중요하다는 게 아니라, 프로그래밍을 해보지도 않은 사람이 처음 배울 언어로는 부적합하다는 것이다. 아마도 당신이 첫 언어로 C++ 을 했는데 아직까지 별 문제가 없었다면 가능성은 둘 중에 하나이다. 당신이 정말 초천재이거나, 아니면 당신이 여태까지 한 일이 실무에선 쓰이지도 않고 그저 책에만 나올만큼 아주 기초적인 것 뿐이라는 것. 만약 전자라면 이미 구글에서 당신에게 연락이 갔거나 지금 적어도 시급 3만원 이상은 받으며 일하고 있어야 한다. 만약 자신은 C++을 잘 한다고 생각하고 있지만 시급 3만원도 못 받으며 일하고 있다면 자신의 생각보다 C++을 잘 하는 게 아니다, 회사는 냉정하리만큼 딱 필요한 그 만큼만 돈을 쓰기 때문이다. 이 글은 천재적인 사람들에게 언어를 추천하는 게 아니라 우리들같은 보통의 사람들에게 추천하는 것이다. 그럴 때 파이썬이 좋다고 하는 것이다. 나는 C++ 좋아한다, 포인터 엄청 많이 사용한다, 이런 말을 이 글에서만 벌써 몇 번을 쓰고 있냐고, 내가, >.<""";;; 막상 코드 보면 어디 책에서 나온 것 조금 응용한 것 몇 줄 적어 놓은 것이 고작인 사람이, 그것도 특정 운영체제에 국한된 그런 코드, 그런 사람이 C++을 그토록 옹호하면 내가 그 말을 얼마나 신뢰할 수 있을까나? GUI는, 각 국의 수도를 '아는 것'같은 노하우에 속하는 것이지 능력과는 상관성이 별로 없는 것이라서 멋드러진 UI를 가진 프로그램을 작성했다고 프로그래밍을 잘 한다고 말하기도 어렵다. 

   다시 말하지만, 나도 C++이 필요한 곳이 충분히 있다는 것을 인정하며, C++을 배워 두면 매우 좋다는 것을 알고 있으며, 나는 개인적으로 C++을 매우 좋아하며 포인터를 아주 좋아하고 많이 쓴다!! 함수 포인터, 함수 포인터 배열, 배열 포인터, 등등등 하여튼 온갖 형태의 포인터를 자유 자재로 쓴다! 하지만!! 프로그래밍을 처음 하는 사람인데 코드에 const unsigned char (* const tag_color)[3]; 이런 게 나오면 얼마나 당황하겠냐고. 책에 보거나 교수님한테 물어 보니 const는 쓰면 좋은 것이지 안 써도 크게 상관 없다고 하는데 왜 컴파일이 안 되는 거야? 할 것 아니겠는가[각주:2]. 겨우겨우 이해는 하겠지만 이런 걸 제대로 쓰기까지 얼마나 오래 걸리겠으며, 여기서 run time 에러가 나면 어떻게 잡겠나, 프로그래밍 초심자가.함수의 파라미터 형태가 이런 것일 때, 이런 함수 호출하기 위해 제대로 인자를 넣을 수 있을까? 처음 하는 언어가 C++ 인 사람이? 내가 포인터를 어려워 하는 게 아니라, 포인터의 '개념'이 어려운 게 아니라, 프로그래밍을 처음 하는 사람이 실제로 코드에서 사용하기 어렵다고, 포인터는. 바로 그 말인 것이다.  상속/다형성 많이 쓰며, generic 기능 많이 쓰는, 그러니까, 이런 것을 내가 잘 몰라서 어렵다고 징징대는 게 아니라, 나는 이런 개념 좋아하고 잘 쓰고 많이 쓰고, 이런 개념이 중요하고 배워 두면 좋다는 것을 다 인정하는데, 프로그래밍을 처음 하는 사람이 이런 것을 배워서 제대로 쓰기엔 너무나 힘드니 차라리 파이썬을 해서 프로그래밍 자체에 흥미를 갖고 쓸모를 느낀 후 해도 된다는 말을 하는 것이다. 나도 상속 무지하게 쓴다고, pure virtual function 많이 쓴다... 부전공이었던 수학과 수업 중에는 abstract algebra를 좋아했기 때문에 generic 개념이 매우 쉽게 다가 왔고, 아주 좋아해서 자주 사용한다. 

   그리고, 학부를 KAIST 나온 애들도 어려워 하는 게 C++ 인데[각주:3], 이것조차 이 아이들의 능력 부족 때문이라면, 뭐, 그렇다면 할 말은 없다. 얘들은, 반면 파이썬의 경우 그날 배우면 다음 날 쓰더군. 이 블로그에는 없지만 실제로 내가 직접 구현해 쓰고 있는 많은 수학/통계적인 것들이 있다. 바로 이런 게 필요한, 즉, 상용 툴들이 지원하지 않는 수학/통계 처리 루틴들을 직접 구현하되 실행 속도가 빨라야 하는 작업에 C++이 적합한 것이다. 요즘엔 다른 언어들도 좋아지고 하드웨어도 좋아지기 때문에 이렇게 속도가 중요한 경우가 많이 줄어 드는 추세이고, 따라서 메모리 구조 바꾸는 데 시간 쓰기 보다는 좀 더 '문제'의 본질에 집중하는 게 좋다. 나의 경우 코딩하는 문제가 풀려고 하는 유전/의학/생물학/신약 관련 내용에 집중하는 게 더 이득이다. 속도나 메모리 때문에 STL 사용한 부분 전부 포인터로 바꾸는 것 안 해도 된다, ㅋㅋ. 100배 1,000배 빠르게 해야 되면 그냥 파이썬으로 작성해서 클러스터에서 CPU 100개 1,000개 쓰면 된다. 뭐... 그래도 여전히 포인터로 도배하는 코딩이 필요할 때가 가끔 있지만 말이다. 데이터가 워낙 커지는 추세다 보니... 

   요즘 공익이 파이썬을 한 것이 조금 이슈가 되었었는데, 그래, KAIST에는 어느 연구실이든 그런 애들 한두명은 있다. 우리 연구실에도 그런 애들 많았고, 그리고 내가 그들을 주로 알려 줬었다. 우리한테 그 정도는, 조금 과장하자면 MS의 파워포인트 하는 정도일 뿐이다. 그런 곳에서 많이 쓰는 게 파이썬 정도, 물론 매틀랩이나 랩뷰도 쓰지만 그것들은 다소 제한적인 용도이고, 비싸며 좀 (많이) 느리다. 대기업 연구소/국책 연구소에 있는 박사들 만나면 결국 비슷한 수준의 고민을 하고 있으며, 이 고민들 중 몇몇은 회사들에서 풀지 못해 국책기관으로 갖고 오는 문제들이다. 

   윈도우즈에서, 리눅스에서, 맥에서, GUI[각주:4]도, 서버 프로그램도, 수학적인 것도 모두 C++로 작성할만큼 내게 익숙한 언어가 C++ 일뿐 결코 쉽게 다가갈 수 있는 언어가 아니다, 특히나 처음 하는 사람이라면. C++ 을 칭찬하는 사람은 주로 C++을 안 해 보고 어디서 C++이 성능이 좋다는 것을 들어 봤거나, 그냥 학부생 term project 정도 되는 것 해보고, 그것도 죄다 외부라이브러리만으로도 구현할 수 있는 일 정도 해본 경우가 대부분이 아닌가 한다. KAIST 학부생의 term project면... 외부에선 어떻게 보일지 모르겠는데, 우리는 그런 거 보면 대~충 견적 나온다, 그런 애들 워낙 익숙하게 봐 왔어서. 외부에서는 와~~ 할지 몰라도, "음, 저 정도면 대략 한 달 정도면 되겠군.", 하는 것처럼. 회사에서? C++은 기계에 가까운 곳에서만 주로 들어 가거나, 아주 특수한 몇 군데를 제외하고는 대부분 다른 언어로 한다고 하며, C++ 처럼 메모리 뻗을 위험이 높은 언어는 어지간해선 쓰지 않는다고, 얼마 전 만난 외국계 의료장비에 들어 가는 소프트웨어를 작성하는, 오랜만에 만나니 차장이 되어 있는 동기가 얘기하더군. 언어가 발전함에 실행 시간 오류를 컴파일 할 때 잡아 낼 수 있는 언어들, rust나 C#같은 것들이 외려 더 나을 수 있다. 

  "나는 머리가 좋아서 포인터도 잘 이해했고, C++을 잘 할 수 있어." 아, 네... "포인터는 주소를 가리키는 변수이다" 를 한 번 읽어서 아는 것과, const 와 *과 & 로 엮인 2중 3중 포인터, 함수 포인터, 멤버 함수 포인터, 배열 포인터, 이런 거 쓰는 게 결코 쉬운 게 아니다. (unsigned char** const)&buf 이런 건 정말 수시로 나오고, ABC* (*creator)() = (ABC*(*)())dlsym(lib_handle, "create"); 이런 게 그냥 만들어 낸 예가 아니라, 이런 코드를 진짜 실제로 사용한다고... *(double**)&(buf[offset]); 이런 거, 엄청 많이 쓴다고. 포인터 쓸 줄 안다는 사람 중에 절반 정도는 이중 포인터 쓰면서 생기는 메모리 누수는 신경도 안 쓰더군. 이런 사람들은 예제 코드 말고, 실제로 사용하는 코드에서 포인터 때문에 메모리 뻑나고 segmentation fault 나면 그 때부터는 멘붕에 빠진다. 할당과 해제가 아주 멀리 떨어질 수밖에 없는 경우가 많고, 거기다 다중 쓰레드면 그 때부터는 지옥인 것이다. 무슨, 연습문제처럼 10번째 줄에서 메모리 할당하고 15번째 줄에서 해제하는, 그런 경우는 거의 없다. 그런 거 해서 에러 안 난다고 포인터 잘 쓰는 게 결코 아니다. 프로그램이 비정상적으로 종료되지 않았다는 것이 포인터를 제대로 사용하고 있다는 것을 의미하는 것도 아니다. 포인터를 잘못 다뤘지만 상황에 따라 정상적으로 끝나는 것처럼 보일 수도 있다. 포인터를 선언하고 해제하는 곳 근처에서 에러가 나는 것도 아니다. 그래서 포인터를 잘못 사용해서 에러가 날 경우 초보자일 경우 디버깅이 매우 어렵다. 수많은 사람이 포인터 사용에 어려움을 느끼는 것은 그 많은 사람들이 능력이 딸려서 그렇다기보단 포인터를 실제로 사용하는 것이 그만큼 까다롭다는 것을 의미한다. 하물며 프로그래밍 초심자에게는 어떻겠는가. int *p, 이런 게 문제가 아니라, const int**&, void (*f)(const double**), (*g)(), 등등, 다소 복잡한 형태의 포인터를 선언하고 사용하는 것, 그게 힘들다는 것이다. int *p = &a; 이런 것은 예제를 위한 예제일 뿐 실무에선 안쓴다. 대신, double r = (*func)(p*(*(double*)*(pos+offset)), (const char** const)&(buf+offset)); 이런 것은 곧잘 사용한다. 왜냐 하면, 포인터를 사용하는 것 자체가 메모리를 효율적으로 쓰기 위한 것일 때가 많고, 그럴 경우 메모리를 단순하게 구조화하게 되면서 접근이 저렇게 복잡해 질 때가 있기 때문이다. 이렇게 조금만 복잡해져도 이해하기조차 힘들텐데, 저런 것을 직접 생각해 내서 쓴다는 것은 쉽게 생각하기 힘들다, 프로그램을 처음 하는 사람이 말이다. 그냥 파이썬 써서 하면 얼마나 편하겠는가.  

   C++ 좋다는 이야기를 하고자 한다면, 뭐랄까, 대략 1만 줄 정도 넘어 가는 단일 프로그램을 외부 라이브러리 최소한으로 사용해서 작성해 보고 이야기 했으면 한다. 파일 100만개를 다루거나, 처리해야 할 데이터가 1TB 라거나, 간단한 정렬조차도 제시간에 끝내기 힘든, 100억개 정렬하기, 3차원 영상에서 주어진 점에서 가장 가까운 점 찾기 그런데 이 때 영상 크기가 1만 pixel x 1만 pixel x 1만 pixel 인 경우 등등이 포함 된, 그런 일, 또는 중단 없이 6개월 이상 잘 실행되어야 하는 것. 그렇지 않으면 python 같은 것으로 더 쉽고 빠르게 짤 수 있다. 그냥, 여기저기 있는 코드와 외부 라이브러리 짜깁어 만드는 것은 딱히 C++ 로 안 해도 될 때가 많다. 왜냐, C++은 바로 그렇게 라이브러리화를 시켜야 할만큼 성능이 중요할 때 딱 그 일만 하도록 짜기 좋거든. RAM/HDD/SDD 접근에 따른 일장일단을 조화시키기 위한 코드이면서도 라이브러리의 실제 목적을 수행하기 위한 코드를 구현하는, 딱 그 정도의 일이 C++ 로 하기 좋다. string 은 매우 메모리 비효율적이기 때문에 무작정 때려 넣으면 1억개도 못 넣고 16GB 메모리 다 쓴다. 그럴 땐 생짜 byte로 넣고 구분자인 null 로 데이터 간 구분을 짓고 포인터 연산을 하거나 하는, 아주 지저분한 일이지만 대용량 데이터를 처리하기 위한 메모리효율/속도를 위한 것일 때에나 C++이 좋다. 하루에 1백만 개 데이터 처리 두어 번 하는 정도면 그냥 파이썬으로 해도 충분할 것이다. 

   과고/영재고 나온 아이들 여럿 가르쳐 봤지만 누구 하나 쉽게 C++ 을 사용하지 못했다. 물론, 이 아이들은 그래도 습득능력이 매우 빨라서 대략 2~3달 정도 가이드만 해줘도 그냥저냥 쓰기는 하지만 포인터/상속/템플릿/다형성 제대로 사용하기 까지는 이 아이들도 1년 이상 걸리더군. 

   C++을 하도 오래 해서, 파이썬은 두 시간 책 보고 바로 작업에 썼고, 나머지 언어들은 필요할 때 그냥 찾아서 하고 잊어버리는 식이다. 주로 다뤘던 언어는 비주얼베이직/델파이/C/C++/파이썬 이지만 펄/R/java 같은 것도 필요하면 그냥 그때그때 작업한다. 나머지 언어들도 비슷한데 저 언어들만 해도 어지간한 일들이 해결돼서 다른 언어를 일부러 해야 할 필요는 없었다. 특히 파이썬을 하면서는 간단하지만 굳이 C++ 로 구현하려면 신경 쓸 게 많은 것들은 파이썬으로 처리, 인생이 편해졌다. 


   아래 글 작성 후 약 6년의 시간이 흘렀다. 저 당시는 주가 생물학 공부였기 때문에 C++ 같은 것은 방학 때 아르바이트 정도로만 했었지. 그런 와중에도 저런 생각을 했었던 것. 그 후 대학원을 들어 오고, 근 6년 간 죽어라 프로그래밍을 했다. 그러면서 아래와 같은 생각은, 더더욱 굳어졌다. 


작성일: 2004-11-30 16:01

 "프로그래밍좀 배워 볼까?" 하는 사람을 봅니다. 그런 사람들은 대부분, 현재 가장 인기있는 언어가 뭐지, 라는 질문으로 시작을 해서 java나 C/C++을 선택하게 되죠. 자바는 제가 안 해봐서 모르겠고, 처음 접하는 프로그래밍 언어로 C/C++을 선택한다는 것은 정말 잘못된 만남입니다.


C/C++을 처음으로 접한 사람들은 얼마 후,
"아, 프로그래밍이라는 것은 내가 할 게 아니구나."
라는 자괴감에 빠지죠. 용케 포인터 앞까지 나간다 하더라도, 포인터 부분을 만나면, [드디어] 포기하게 됩니다.

C++을 한지 5년이 되어가고 있는 요즘, 필요에 의해 Perl, PHP, haskell 을 보고 있고, 또 숙제 때문에 mathematica에 있는 간단한 interpreter를 이용하는데, 이것들을 이용하면서 느낀 건,

"아, 확실히, C/C++은 처음에 할 게 아니구나."
입니다.


그 이유를 알기 위해서는 우선 프로그래밍이 무엇인지 정의할 필요가 있습니다. 프로그래밍이란, "일련의 사고를 거쳐 만들어 낸 논리를 컴퓨터가 알아들을 수 있게 표현하는 것"이라고, 대충 말할 수 있습니다. 즉, 사람이 생각하여 어떤 논리 A 를 만들고, 그 논리 A를 컴퓨터가 이해할 수 있게 B로 만든다. 라고 생각해도 되죠.


그런데 C/C++을 하려면 B 단계, 즉 생각해 낸 논리를 컴퓨터가 이해할 수 있게 하기 위해서 매우 어렵운 개념들이 사용된다는 것입니다, 특히 포인터. STL이 있긴 해도, 다른 언어에서 기본으로 제공해주는 list나 hash도 없고, reference니, virtual function이니 하는 것들이 나오면, 단순히 '프로그램 언어 문법'이 아닌, '컴퓨터 구조 등'에 대해서도 알아야 하죠. 하다못해 다른 대부분의 언어에서 단순히 '=' 연산자 하나로 쉽게 되는 문자열 할당조차도, c에서는 포인터 개념을 안 이후에 마음 편안히 쓸 수 있죠.


즉, 다시 말해, 무엇을 만들기 위해 어떤 생각을 해 놓긴 했는데, 그것을 컴퓨터로 알아듣게 하기가, C/C++을 이용하면, 다른 언어들에 비해 '매우' 어렵다는 것입니다. 그러니, 논리적으로 생각해 낼 기회조차 갖기가 힘들죠. 왜냐 하면, 프로그램 언어를 배우기 위해서는, 우선 언어에 익숙해 진 후, 자신의 논리를 그 언어에 적절하게 훈련시켜 나가는데, C/C++은 단순히 '그 언어 자체'를 배우기가 힘들기 때문이죠.


그렇다면 어떤 언어들이 좋을까? 처음에는 쉽고 직관적인 언어들이 좋을 것입니다. Python이나 Perl같은 언어들도 괜찮더군요. 또한 Visual Basic도, 사용처를 생각한다면, 해볼만 합니다. 언어 자체는 별로지만, MS Office 제품들이 Visual script를 통해 제어되므로, 익혀두면 요긴하게 써먹을 수 있죠. 그리고 haskell이란 언어도, functional 이란 개념을 사용해서 하는, 좋은 언어인 것 같습니다.


노파심에, 그렇다고 제가 C/C++이 나쁜 언어라 말하는 것이 절대 아닙니다. 개인적으로, 작성해야 할 프로그램이 있으면, 아직도 가장 먼저 선택하는 언어가 C++이고, 포인터를 안 쓰고 어떻게 저걸 구현하나...하는 생각이 들 때도 많습니다. C/C++의 힘은 정말 막강하죠. 다른 언어에서 속도나 구조가 꼬이면 C++로 돌아오기도 합니다. 단지, "프로그래밍을 처음 배울 때 C/C++을 선택하지 마라."라고 얘기하고 싶을 뿐입니다.




다시 2010년. 굳이 전산과나 전자과가 아니라면 프로그래밍 언어로 C나 C++, 특히 C++ 을 첫 언어로 선택하는 것은, 좋지 못한 것을 뛰어 넘어 잘못된 것에 근접한다. 객체지향이라는 추상적 개념을 이해하는 것 자체도 어려울 뿐더러, C++ 은 generic 까지 끌고 들어가기 때문에 더더욱 어렵다. 문법 자체가 매우 어렵다. 문법 배우다 지쳐버릴 지경이다. 심지어 지져분해 보이려고까지 한다. C는 그나마 좀 깔끔하지만, 역시나 포인터를 만나는 순간 당황하게 된다. STL로 했다가 속도 때문에, 포인터 남발하면서 작성한 부분을 보면,


난 저런 코드, 좋아한다. 게다가 사실 위 코드는 포인터를 사용하긴 하지만 단순하다. 좀 더 복잡한, 이게 정말 문법적으로 맞는지조차 의아한 코드는 동적 라이브러리 만들고 사용하는 코드를 보면 나온다. 구경만이라도 해보자.

   20                 ABC* (*creator)() = (ABC*(*)())dlsym(lib_handle, "create");

   21                 ABC* p = (*creator)();

   22                 p->show_message();

   23                 void (*destructor)(ABC*) = (void (*)(ABC*))dlsym(lib_handle, "destroy");

   24                 (*destructor)(p);


하지만, 역시나 쉽지 않다. 난 다루는 데이터의 특성 상 저런 짓 자주 한다. 그러면서 더더욱 이놈의 C/C++ 은 처음의 언어로는 부적합하다는 생각을 하게 된다. 역시나 추천하자면 파이썬 정도.

참고로, 내가 작업한 양을 간단히 확인해 보자.
adnoctum@bioism Research]$ find . -name '*.h' -exec more {} \; | wc -l
466
[adnoctum@bioism Research]$ find . -name '*.cpp' -exec more {} \; | wc -l
55590
[adnoctum@bioism Research]$ find . -name '*.py' -exec more {} \; | wc -l
5207
[adnoctum@bioism Research]$

C++ 이 5만 라인을 넘어가는군. 파이썬은 5천 라인 남짓. 뭐, 물론 윈도우즈에서까지 고려하면 C++ 은 6만 라인도 넘는다, 이미 프로그램 하나가 1만 라인을 넘어갔으니까. 많은 경우 주석이 좀많이 있으니 심하게 잡아 반절이라고 쳐도 개인이 한 양으로는 결코 적지 않은듯. 그리고 나름 꽤 구조화시켜서 작성한다, 상속도 종종 사용하고. 그런데, 이런 '상속'과 같은 개념도 결코 쉽게 익숙해지지 않는다. static function 은 virtual 로 할 수 없겠지, 하는 것을 설명하려면 또다시 문법적 어려움에 직면하게 되고...



  1. 하지만 유사한 domain 에서 있었기 때문에 잘 봐줘 봐야 중급 개발자 정도라고 나 스스로는 생각하고 있다. 세상엔 뛰어난 사람들이 정말 많다. [본문으로]
  2. 이 경우 초심자가 잘 몰라서 질문을 잘못 했기 때문에 숙련자로부터 잘못된 답을 들은 것이고. [본문으로]
  3. 물론 특출나게 잘 하는 애들도 있다. 그런 예외적인 상황을 이야기 하는 게 아니다. 그런 예외적인 것이 논의에 끼어 든다면 우리는 아무 이야기도 할 수 없다. [본문으로]
  4. 리눅스 사용자이니 무슨 Tcl/tk나 qt로 작성하는 것처럼 보일지 모르겠는데, 주로 MS-Windows에서 MFC 로 GUI 작성한다. form-based 가 아닌 형태의 GUI 도 많이 만들어 사용한다. 버튼 몇 개, list box 몇 개 있는, 그런 toy program 을 얘기하는 게 아니라, 실제로 매우 복잡다단한 GUI 프로그램도 무리 없이 만들 수 있다는 말이다, 그것도 전부 C++/MFC로만. 의료영상장비 만드는 회사에서 기기를 다루기 위해 만드는 복잡한 프로그램들, 그런 UI 도 충분히 만들 수 있다는 얘기다, form에다가 컨트롤 몇 개 가져다 놓고 GUI 프로그램 만들 줄 안다고 얘기하는 게 아니다. [본문으로]