프로그래밍 10년 완성
Peter Norvig
Teach Yourself Programming in Ten Years 번역한 문서.
황요한
번역한 날짜: 2006년 1월 14일
다들 왜 그리 급한가?
아무 책방이든 상관없이 들어가서 보면, 7일 안에 자바(Java) 완성이외에 비주얼 베이직(Visual Basic), 윈도우(Windows), 인터넷(the Internet)을 불과 몇시간 또는 몇일에 정복하기의 제목의 책들을 끝없이 나란히 진열된 것을 볼 것이다. Amazon.com에서 다음과 같은 고급(파워) 검색을 했었을때
출판일: 1992년 이후 / 제목: 몇일(제목: 정복하기 또는 제목: 배우기)
결과가 무려 248개나 나왔다. 첫 78개는 컴퓨터 관련 책 이었다 (79번은 30 일안에 벵골어 배우기였다.) 나는 "일"대신 "시간"를 입력해봤다. 몇일을 " 몇시간으로" 대체했었을때 놀랍게도 아주 근접한 결과을 얻었다: 곁에 따르는 253개의 책중에 77개의 컴퓨터 책이였고 제 78에 24 시간안에 문법 직접배우기이 있었다. 결과의 최고 200개에서, 96%은 컴퓨터 책 이었다.
이런 결과를 보고 결론 지을 수 있는 것은 컴퓨터를 배울려고 하는 사람들의 큰 붐이 있거나, 컴퓨터를 배우기는 그 어떤것보다도 엄청 배우기 쉽다는 것이다. 베토벤, 물리학, 또는 심지어 개 손질법을 단 몇일 안에 정복하기라는 책은 없다.
3일 안에 Pascal 정복하기이라는 제목 뜻을 같이 분석해 보자:
- 정복하기: 3 일 안에 규모있는 프로그램을 쓸 시간이 없다 그리고 그 프로그램을 쓰는데 성공 아니면 실펴함으로의 경험을 통해 배우지 못한다. 경험있는 프로그래머와 같이 일하고 그런 환경 속에서 일하는 것이 어떤 것이가를 알 수 없다. 짧게 말해서 많은 것을 배울 시간이 없다. 그러므로 이런 책 내용들은 깊은 내용들은 물론 못하거니와 표면상으로 이해 할 수 있는 내용들만 다룰 수 밖에 없다. Alexander 로마 교황 말했듯이, 조금만 배우는 것은 위험한 것 이다.
- Pascal: 3일안에 Pascal의 문버은 배울 수 있을지는 몰라도 (특별이 미미 비슷한 언어를 알고 있다면) 그 분법을 어떻게 제대로 쓰는지를 배울 수는 없다. 예를 들어, 당신이 Basic 프로그래머이라면 Pascal의 분법으로 Basic 스타일의 프로그램을 짤 수 있을지는 몰라도 Pascal이 어떤 과제 위해 좋으며 무슨 일를 위해 나쁜지 배울 수 없다. 내 취지는 무엇인가? Alan Perlis는 이렇게 말했다: "당신의 프로그램잉 관한 생각 하는 부분에 영향을 미치지 않는 언어는 아니면 배울 가치가 없다. 당신이 업무를 때문에, 현재 쓰는 도구와 연결해서 쓰기 위해 Pascal(또는 더 현실적인 Visual Basic이나 JavaScript)를 약간 배웠다고 하자. 그러나 당신은 프로그램잉을 어떻게 하는 지를 배운 것이 아니라 업무를 어떻게 완수하는지를 배운 것이다.
- 몇일 안에: 다음 글에 설명하듯이 몇일 가지고는 터문이 없이 부족하다.
10년 안에 프로그램잉을 정복하기
체스, 음악 작곡, 미술, 피아노, 수영, 테니스, neuropsychology 연구, 위상 수학, 등, 어느 많고 다양한 분야에서 전문가가 되기 위해서는 보통 십년 정도가 걸린다고 연구자(Hayes와 Bloom)들은 말한다. 지름길은 없다. 4살때 부터 신동이라 불려진 Mozart도 세계적인 음악을 만들기까지 13년이 더 결였다. Beatles는 1964년도에 Ed Sullivan쇼에 출연하고, 연속 #1 히트들로 단숨에 유명해 졌다. 하지만, 그들은 1957년도 부터 Liverpool과 Hamburg의 작은 클럽에서 활동을 시작했었고, 일찍부터 mass appeal이 있었지만, critical success는 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에 굉장한 소프트웨어 디자이너들을 찾아주는 three-part계획을 확인했다:
- 체계적으로 가능한한 빨리 최고 디자이너들을 확인하십시요.
- 유력 후보자의 발달과 경력 파일을 책임질 경력 지도자을 선임하십시오.
- 성장하는 디자이너들이 서로 자극할 수 있는 기회들을 제공하십시오.
이 것들은 이미 굉장한 디자이너가 되기 위해 필요한 자질들을 가지고 있다고 가정한다. 직업이 그들을 적당하게 coax할 것이다. Alan Perlis은 그 것을 명확하게 표현한다: "조각하는 방법은 누구나에게 가르칠 수 있다: Michelangelo는 조각 방법을 못하는 방법을 가르켜 줬을야 했을 것이다. 훌륭한 프로그래머들도 마찬가지다."
이렇게 전방 가고 자바 저 책을 사십시요; 너는 사실 같게 그것의 얼마간 사용을 밖으로 얻을 것이다. 그러나 너는 24 시간, 일,또는 조차 개월안에프로그래머으로서 너의 일생, 또는 너의 진짜 전부전문가적 의견을 변경하지 않을 것이다.
참조
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.
답
2001년 여름 전형적인 1GHz PC에 각종 작업을 위해 타이밍:
단순한 명령를 수행하십시요 1 nano sec = (1/1,000,000,000) sec L1 케쉬 메모리에서 word을 가져오십시요 2 nano sec 메인 메모리에서 word을 가져오십시요 10 nano sec 연속 적인 디스크 위치에서 word을 가져오십시요 200 nano sec 새로운 디스크 위치 (탐색)에서 word을 가져오십시요 8,000,000nsec = 8msec 비고
T. Capey가 Amazon의 Complete Problem Solver Page에 "Teach Yourself Bengali in 21 days"와 "Teach Yourself Grammar and Style" 책들을 "Customers who shopped for this item also shopped for these items" 구역에 보여주고 있음을 지적했다. 이 책들을 본 사람들 중에 많은 사람들이 이 페이지에서 찾아 가고 있는 가보다.