본문 바로가기
코스웨어/09년 내장형하드웨어

[TY][펌] 어떻게 하면 C를 잘할 수 있죠??

by 알 수 없는 사용자 2009. 8. 4.
728x90
반응형


후배 "어떻게 하면 C를 잘할 수 있죠?"
선배 "글쎄, 어느날 갑자기 그냥 되던데…"

후배 "어떻게 하면 영어를 잘할 수 있죠?"
선배 "몰라~ 어느날 자고 일어나니까 막 들리던데"

후배 "어떻게 한글을 깨우치셨죠?"
선배 "그르게?"


어디서 많이 듣던 질문 아닙니까?  혹은, 하던 질문이던지요.
물론 저 선배가 저는 아닌 것 같고요.  3번째는 저 비슷하네요. 하하

사실 저는 잘 기억이 안 납니다.
어느날 갑자기 아침에 일어나보니, 그런 능력이 생긴 것 같습니다.  코딩 문제를 들려주면, 설계랑 코드가 그냥 머리에 떠오르게 되었죠.  그걸 문서에 적으면 설계가 되는 것이고, 컴퓨터에 치면 코드가 되는 거죠.  문제가 복잡해지면 종이랑 연필이 필요하게 되지만 말입니다.

그건 아마 운이 좋아서라고 생각합니다.  제가 C코딩을 배울 때는 Object-Oriented나 UML 이런 것들이 아주 생소한 개념이었을 때라서 Sorting이나 linked list 같은 것을 그냥 구현해서 사용했으면 되니까요.  어떤 컨셉을 가지고 있었는지는 문제가 되지 않았죠.  그냥 돌기만 하면 됐습니다.  처음에는 몇 백 줄에 진땀을 흘리곤 했는데, 얼마되지 않아 몇만 줄의 코딩도 감당할 수 있게 되었죠.

사실 양이 늘어나면서 실수를 많이 했습니다.  희한하게도 양이 늘어나면서 복잡도가 증가하는데, 그것이 가장 어려운 부분이었죠.  설계를 해보기도 하고, 같은 일을 하는 부분끼리 나누어 보기도 하고, configuration file같은 것으로 해결도 해보고.  자연히 수많은 시도와 실패를 반복 하면서 '아 이렇게 하면 안 되는구나!' 라는 것을 깨달은 것 같습니다.  그 실패는 지금도 여전히 이어지고 있답니다.

그리고 나서, Object-Oriented개념을 도입하기도 해보고, UML를 적용하기도 해봤죠.  도움이 되는 것도 있고, 그렇지 않은 것도 꽤있었죠.  여기서, 더 많은 실패들이 이어졌으며, 지금도 그 도전과 실패는 여전히 진행형입니다.  사실 UML은 지금도 왜 하는지 잘 모르겠어요. 조금 더 실패를 해야 되나 봅니다.  하하.


후배들이 물어온다면 그 질문에 이렇게 답하고 싶어요.

지금 생각하는 것이지만, 코딩이라는 것은 자전거 타기와 비슷한 것 같습니다.  OO, UML이런 것은 자전거 묘기에 비슷한 것이고요.  누군가가 묘기를 부리는 것을 보면, 저도 따라 하고 싶습니다.  멋져보이거든요.  하지만… 따라 해보면 결코 쉽지 않습니다.  내가 익숙한 방식이 아니거든요.  그러니, 자전거를 처음 타는 신참에게는 얼마나 어렵겠습니까?  자전거도 제대로 못 타는데, 점프를 하라고 하니…

자전거를 처음 배우는 사람은 점프이전에 기본 기술을 배우라고 합니다.  물론 곧 묘기를 부릴 수 있다는 꿈을 가지고 말이죠.  기본기술이란 앞으로 전진하기, 왼쪽으로 회전, 오른쪽으로 회전, 정지하기 등일 겁니다.  참 재미없는 것들이고 따분한 것들이죠.  C라고 한다면 local/global variable, structure, union, byte size, pointer, string, stack 뭐 이런 것들이 될까요?  이런 것들을 어느 정도 이해한다면 아래의 조엘 추천 문제는 쉽게 풀 수 있을 겁니다.

1. 원래 저장 위치에서 문자열을 역순으로 변환하기
2. 연결 리스트를 역순으로 만들기
3. 한 바이트에서 1인 비트 세기
4. 이진 검색
5. 문자열에서 "연속적으로 문자가 반복되는 길이'가 가장 긴 부분 문자열 찾기
6. atoi
7. itoa (스택이나 strrev를 써야 하기 때문에 좋은 문제임)

제가 '버블 소트' 하나 추가하겠습니다.  이진 검색 하려면 필요할 테니까요.


기본기가 갖추어 지면, 두 번째 계단인 복잡도에 대한 도전을 하십시오.  결코 만만치 않다는 것을 몸을 느끼실 겁니다.  만줄 프로젝트를 해보시고, 십 만줄, 백 만줄 프로젝트를 해보십시오.  난이도에 대한 도전도 같은 맥락이고요.  그렇게 충분히 실패를 하시고, 그 이후에야 고수들의 책을 펴 보십시오.  선배들의 글을 읽어보십시오.  이전에 느꼈던 안개가 걷히면서 많은 것이 깨끗하게 보일 겁니다.  비로소 내 것이 될 수 있는 혜안을 갖게 되는 거죠.

마지막 단계는 C가 아닌 것을 이해하는 일이랍니다  이건 OS일수도 있고, DBMS일 수 도 있고, VC같은 Tool일 수도 있고, Protocol일수도 있고, Embedded라면 Device일 수 도 있습니다.  또 다른 Language일 수도 있고요.  엄밀히 말하면 이건 코딩에 직접 관련된 부분은 아니지만, 오늘날 코딩을 잘하기 위해서 (디버깅일 가능성이 높지만) 주변의 수많은 내용들을 잘 이해하고 있어야 하기 때문이죠.  이건 끝이 없는 일이고, 또 가장 재미있는 부분이기도 한 것 같아요.


(이 글을 케틴님께 드립니다.)


PS. "근데, 영어는 어떻게 하면 잘할 수 있는 거죠?"

[출처] 소프트웨어 이야기(jamestic.egloos.com)

728x90