원래 이 글은 AI계의 대부(?) PeterNorvig이 쓴 Teach Yourself Programming in Ten Years 입니다. 그 글을 John Hwang 라는 분이 번역을 했는데, 프로그래밍 10년 완성이라는 글입니다. 그런데 이 분이 교포분이신지... 우리말이 매끄럽지 못하더군요. 일부는 그냥 번역기를 돌린것 같기도 하고...

그래서 좀 고쳤습니다. 번역의 원 저작자이신 John Hwang 님에게 연락할 길이 없어서 -_-;;... 일단 임의로 작업부터 했구요. 나중에 문제가 된다면 자삭 하겠습니다 :)

대충 다 번역하고보니... .. 제 번역본도 허접하긴 마찬가지군요..ㅜㅜ.. 번역이 어색해서 더 뜻이 곡해된다고 느껴지는 부분들은 과감하게 의역을 했으니.. . ... 읽다가 이게 아닌데 싶으신 분은 직접 원문을 보시길 권장합니다. ( 어렵지 않은 영어로 쓰여져 있습니다 )


---------------------------------------------------------------------------

프로그래밍 10년 완성

Peter Norvig

Teach Yourself Programming in Ten Years 번역한 문서.
황요한
번역한 날자: 2006년 1월 14일


Magicboy

우리말 다듬은 날자 : 2008년 8월 20일


----------------------------------------------------------------


다들 왜 그리 급한가?

아무 서점이나 들어가 보면, 자바 7일 완성 이외에 비주얼 베이직(Visual Basic), 윈도우(Windows), 인터넷(the Internet)을 불과 몇시간 또는 며칠에 정복하기 같은 제목의 책들이 나란히 진열된 것을 볼 수 있다.


Amazon.com에서 다음과 같은 고급 검색을 하면

출판일: 1992년 이후 / 제목: 몇일
(제목: 정복하기 또는 제목: 배우기)

248개의 결과가 나왔다. 첫 78개는 컴퓨터 관련 책 이었다 (79번째 책은 30 일 안에 벵골어 배우기였다.) 나는 "일(Day)"대신 "시간(Hour)"를 입력해봤다. 놀랍게도 며칠을 " 몇시간으로" 대체했을 때도  아주 근접한 결과를 얻었다: 결과에 따르면 253개의 책 중에 77번째 까지가 컴퓨터 책이였고 제 78번째는  24 시간안에 문법 직접배우기이 있었다. 검색 결과의 상위 200개에서 96%는 컴퓨터 책 이었다.


이런 결과를 보고 결론 지을 수 있는 것은 컴퓨터를 배우려고 하는 사람들이 많거나  컴퓨터 배우기는 그 어떤 것보다도 배우기 쉽다는 것이다. 베토벤, 물리학, 심지어 개 손질법도  며칠 안에 정복하기라는 책은 없다.


3일 안에 Pascal 정복하기이라는 제목 뜻을 분석해 보자:

  • 정복하기: 당신은 3일만에 규모있는 프로그램을 만들지도 못하고, 그런 프로그램을 만들면서 겪는 성공과 실패로부터 배울 수도 없다.  경험있는 프로그래머와 같이 일하는 것이 어떤 것인지. 그런 환경 속에서 일하는 것이 어떤 것이가도 배울 수도 없다. 즉, 많은 것을 배울 시간이 없다. 그런 책들은 깊은 이해없이 표면적으로 이해 할 수 있는 내용들만 다루게 된다.  Alexander 로마 교황 말했듯이, 조금만 배우는 것은 위험한 것 이다.
  • Pascal: 3일안에 Pascal의 문법은 배울 수 있을지 몰라도 (특별히 이미 비슷한 언어를 알고 있다면) 그 문법을 어떻게 제대로 쓰는지는 배울 수 없다. 예를 들어, 당신이 Basic 프로그래머라면 Pascal의 문법으로 Basic 스타일의 프로그램을 짤 수 있을지 몰라도 실질적으로 Pascal이 어떤 과제를 해결하는데 좋은지(그리고 나쁜지) 배울 수 없다. 핵심은 무엇인가?  Alan Perlis는 이렇게 말했다: "당신의 프로그래밍에 대해 생각에 영향을 미치지 않는 언어는 배울 가치가 없다. 당신은 특정 업무를 위해 Pascal(또는 Visual Basic이나 JavaScript)을 약간이나마 배워야만 할 수도 있다.( 역자주  - 기존의 다른 프로그램에서 해당 언어의 기능을 활용하기 위해 ) 그러나 당신은 프로그래밍을 어떻게 하는 지를 배운 것이 아니라 업무를 어떻게 완수하는지를 배운 것이다.
  • 3일 안에: 다음 글에 설명하겠지만 며칠 가지고는 터무니 없이 부족하다.

10년 안에 프로그래밍을 정복하기

체스, 음악 작곡, 미술, 피아노, 수영, 테니스, neuropsychology 연구, 위상 수학, 등 다양한 분야에서 전문가가 되기 위해서는 보통 십년 정도가 걸린다고 연구자(HayesBloom) 들은 말한다. 지름길은 없다. 4살때 부터 신동이라 불려진 Mozart도 세계적인 음악을 만들기까지 13년이 더 결렸다. Beatles는 1964년도에 Ed Sullivan쇼에 출연하고, 연속 #1 히트들로 단숨에 유명해 졌다. 하지만, 그들은 1957년도 부터 Liverpool과 Hamburg의 작은 클럽에서 활동을 시작했었고, 일찍부터 큰 재능은 있었지만, 진정한 성공은 1967년도에 Sgt. Pepper로 비로소 이루어냈다. Samuel Johnson는 10년보다 더 오래 걸린다고 생각했다: "탁월함은 일생의 노력과 노동에 의해서만 달성할 수 있다; 그 것은 그 이하의 값으로 이룰 수 있는 것이 아니다." Chaucer는 "the lyf so short, the craft so long to lerne"라고 호소했다.


프로그래밍을 정복하기 위한 나만의 비법이 있다:

  • 먼저 프로그래밍에 흥미를 가지고, 조금만 해보라. 10년을 투자할 만큼 충분히 재미있는 것이란 걸 확인하라.
  • 다른 프로그래머들과 대화를 하라; 다른 프로그램들의 소스를 읽어라. 이것은 어떤 책 또는 훈련 과정보다 더 중요하다.
  • 프로그래밍하라. 최선의 학습방법은 하면서 배우는 것이다. 더 기술적으로 표현하자면, "특정 분야에서의 오랜 경험이 자동으로 최고 역량을 만들어주지는 않는다.  수준을 향상시키려는 노력의 결과로 역량이 증가하는 것이다. (p. 366)." "가장 효과적인 학습은 적당한 난이도의 잘 정의된 과제, 유익한 피드백, 에러를 수정하고  반복할 수 있는 기회가 필요하다" (p. 20-21) 인식의 실제: 매일 생활 속의 마음, 수학 및 문화는 이 관점에 관련된 재밌는 참고서다.
  • 원한다면, 대학에 4년을 (또는 대학원에 더) 투자하라.당신은 학위를 요구하는 직업을 가질 수 있고,  그 분야에 대한 깊은 이해를 할 수 있다. 하지만 학교에 관심이 없어도  (노력을 한다면) 직업을 통해서 비슷한 경험을 할 수 있다. 어찌됐든, 혼자서 책으로만 배우는 건 부족하다. "붓과 물감을 공부해서 화가가 될 수 없듯이 컴퓨터 과학 교육으로만 전문 프로그래머를 만들지 못한다."라고 Eric Raymond가 The New Hacker's Dictionary에 적었다. 내가 이제까지 고용한 최고의 프로그래머중 한 사람은 고졸이였다. 그는 좋은 소프트웨어를 많이 만들었고, 그의 고유 뉴스 그룹도 가지고 있으며, stock option으로 자신의 나이트클럽을 살 정도로 돈도 많았다.
  • 다른 프로그래머들과 같이 프로젝트들을 하라. 때론 프로젝트의 가장 실력있는 프로그래머가 되고; 때론 프로젝트의 가장 실력없는 프로그래머가 되라. 가장 실력있는 프로그래머일땐 다른 사람들에게 비젼을 주고 그리고 사람들을 이끄는 능력을 시험하게 된다. 가장 실력없는 프로그래머일때는 고수들이 하는 것들과 그들이 싫어하는 것들을 배울 수 있다 (왜냐면, 싫어하는 것들은 당신에게 시킨다).
  • 다른 프로그래머들이 시작한 프로젝트에 뒤늦게 동참하라. 다른사람이 짠 프로그램을 이해하도록 몰두하라. 그 프로그래머가 없었을때 프로그램을 이해하고 고치기 위해서 무엇이 필요한지 파악하라. 당신의 프로그램을 다른 사람이 유지해야 할때, 보다 더 쉽게 관리 할 수 있도록 어떻게 프로그램들을 디자인해야 할까를 고민하라.
  • 최소 다섯가지 프로그래밍 언어를 배워라. class abstractions (자바 또는 C++) 지원하는 언어, coroutines을 (Icon 또는 Scheme) 지원하는 언어, functional abstraction (Lisp 또는 ML) 지원하는 언어, syntactic abstraction (Lisp) 지원하는 언어, declarative specifications를 (Prolog또는 C++ 템플렛) 지원하는 언어, 그리고 parallelism을 (Sisal) 지원하는 언어를 한개씩 배워라.
  • "컴퓨터 과학"안에 " 컴퓨터"가 있는 것을 기억하라. 당신의 컴퓨터가 한 명령을 실행할때, 메모리에서 word를 가지고 올때, 디스크에서 연속 word를 가지고 올때, 디스크안에 새로운 위치를 찾을 때 걸리는 시간과 속도를 명심하라.
  • 언어 표준화 노력에 동참하라. ANSI C++ 위원회가 되거나, 아니면 당신의 현 코딩 스타일을 2칸 아니면 4칸 들여쓰기 할 것인가를 결정하라. 어떤 방법이던 다른사람들이 그  언어의 어떤 것을 좋아는지, 그들에게 그것들이 얼마나 중요한 것인지, 어쩌면 왜 그것을 좋아하는지까지도 알게 될 것이다.
  • 가능한한 빠르게 언어 표준화 노력에서 해방되는 좋은 느낌을 채험하라. ( 역자 주 - 이 부분은... 표준화된 코드를 생산하는 버릇이 몸에 배이는 것을 의미하는 듯 합니다. 신경 안쓰고 코딩해도 그게 표준화된 코드가 되는 경지 ^^ )

위의 것들을 고려할때, 책으로만 어디까지 배울 수 있을까를 의심해볼 수 있다. 나는 내 첫째 아이가 태어나기 전에, 찾을 수 있는 모든 How To 책들을 읽었지만, 그래도 초보자로 느껴졌다. 30달 후, 둘째 아이가 태어났을때, 난 예전에 읽었던 책들을 다시 들여다 봤을까? 아니다. 대신 나는 전문가가 쓴 수천장의 페이지보다 나에게 더 유용고 자신감을준 내 경험에 의지했다.


Fred Brooks는, 그의 에세이 No Silver Bullets에서 굉장한 소프트웨어 디자이너들을 찾는 3 단계를 이렇게 구분했다.

  1. 가능한 빨리 (아무나) 최고 디자이너들로 구분하라.
  2. 그 디자이너들의 발달과 경력 파일을 책임질 경력 지도자를 선임하라.
  3. 그 성장하는 디자이너들이 서로 자극할 수 있는 기회를 제공하라.

이것은 누구나 굉장한 디자이너가 되기 위해 필요한 자질들을 가지고 있다고 가정한다. 할 일은 그들을 적절하게 엮는 것이다.  Alan Perlis는 그것을 명확하게 표현한다: "조각하는 방법은 누구나 배울 수 있다: 미켈란젤로는 어떻게 조각을 안하는 가를 배워야 했을 것이다. 훌륭한 프로그래머들도 마찬가지다." ( 역자주 - 은유적 표현인데... 내공이 딸려서 어떻게 표현해야 할지 모르겠네요.. 그냥 누구에게나 재능이 있다 정도로 이해하면 될 듯 )


자, 계속해서 저런( 24시간 안에 배우는 ) 자바 책을 사라. 어쩌면 당신은 그 이상의 것을 얻을 지도 모른다. 그러나  당신의 인생, 프로그래머로서의 역량은 24시간, 며칠, 심지어 몇 달안에는 바뀌지 않을 것이다.


(역자주 - 결론적으로 누구나 재능은 있으니 흥미를 가지고 10년동안 공부하라. )



참조

Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.

Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.

Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.

Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.

신고

+ Recent posts