필자는 요즘 프로그래밍을 다시 배우고 있다. 어떤 광고 문구에 나오는 것처럼 그동안 2% 부족하다고 느끼던 부분들을 손대기 위해서다. 완벽한 것은 없지만 중요하다고 느끼던 부분들이다. 프로그래머 생활을 한 사람으로 컴퓨터 언어로 표현하는 능력에 무엇인가가 부족하다는 것은 좋은 일이 아니다. 표현능력의 부족은 코딩 스타일에 문제가 있다기보다는 프로그래밍을 배우는 과정에 문제가 있거나 문제에 대해 접근하는 방법에 문제가 있을 지도 모르는 것이다. 좀 더 심하게 말하면 생각하는 방법에 문제가 있을 수도 있다. 개인적으로는 중요한 문제다. 그렇다면 신중하게 접근해야 한다.
일의 발단은 10년 전에 LOGO로 프로그래밍하면서 느꼈던 기묘한 궁금증들을 나중에 생각해보니 상당히 중요한 문제였다는 것을 알게 되면서부터였다. 메시지를 보내는 여러 객체들의 역할을 다루는 actor model과 message passing의 문제였으며 일부는 lambda 함수의 문제이기도 했다. 그때나 지금이나 까다로운 문제다. 다시 붙잡고 보아도 과거보다 이해력이 좋아졌다는 증거는 없었다. 누구나 오래 생각해보던 문제들은 있는 법이다. 필자의 경우는 예전에 만들어보고 싶어 했던 어떤 에이전트를 표현할 수 없던 표현력의 문제를 갖고 있었다. 수학도 그렇고 코딩을 하는 것도 그랬다. 그런데 10년 동안 전혀 변화가 없었다.
많은 시간을 들인 일이 답 없이 끝날 수 있고 필요한 시간은 1년이 아니라 몇 년이 될 수도 있으며 그동안 많은 일들을 못할 뿐만 아니라 별로 생산성을 내지 못할 수도 있다. 그리고 무엇보다 머리는 자꾸만 더 나빠질 것이 확실하다. 비관적인 결론을 내리면 어떤 문제의 일반화는 1년이 아니라 10년이 걸릴 수도 있다. 다른 중요한 선택들처럼 판돈이 큰 도박이다. 그리고 기다라는 보상은 대박과 같은 것이 아니라 자기만족이다. 어느 정도 좋아서 하지 않으면 안되는 것이다.
아마추어 프로그래머가 이 정도의 스트레스를 느낄 정도라면 현장에 있는 프로그래머나 관리자의 시간적인 압박은 상당할 것임에 틀림없다. 하지만 현장은 해결할 수 있는 해결책 안에서 고민하는 것이라 압박의 성질이 다르다. 현장은 것은 할 수 있는 일을 열심히 하고 할 수 없으면 포기하거나 운에 따르는 수밖에 없는 곳이다. 현장에서는 쓸데없는 일로 고민하지 않는다. 고민할 시간을 주지 않기 때문이며 이번에 못한 일이라면 다음에 잘 하는 수밖에 없다. 프로젝트만 놓고 보자면 이번에 잘한 팀이 훨씬 유리해지는 게임이다. 물론 생각이나 공부는 그 프로젝트의 시간 안에서 일어난다. (예전의 학생에서 이제는 교수가 된 친구들이 자주 하는 이야기가 있다. 시험을 통과하지 않은 공부는 흔들린다는 것이다. 수업이 중요한 것이 아니라 시험 기간 동안 쌓이는 집중이 기본기를 만든다는 것이다. 다 수긍할 수는 없지만 많은 부분이 사실인 것은 어쩔 수 없다. 현실에서는 더 무서운 시험인 현장의 프로젝트가 있다.)
그러나 아무리 성공적으로 프로젝트를 진행한다고 해도 사람들마다 그 안에서 무언가 중요하다고 생각하던 주제는 반드시 있었을 것이라고 생각한다. 없었다면 그것은 너무나 바빴던 것이 틀림없다. 몇 번의 프로젝트를 진행하고 나면 보통 몇 년의 세월이 흐른다. 하던 일들은 대체로 비슷하기 때문에 문제를 일으키는 어떤 걸림돌 같은 부분이 있다. 개선이나 변혁을 기다리는 요소들이다. 성공적인 프로젝트를 오랜 기간 진행하고 나서도 경험곡선을 상승시킬 그 무엇이 없었다면 역시 무엇인가가 부족한 것임에 분명하다. 그리고 실패한 프로젝트는 원래 배울 것이 많은 것이니 말할 필요도 없다. 성공을 하건 실패를 하건 시간은 흘러간다.
피터 노빅은 왜 10년이라 했을까?오랜 기간이 필요하다는 생각이 들자 첫 번째로 떠오르는 생각이
피터 노빅의 글이었다. 노빅은 작년까지 구글의 Search Quality의 책임자였다가 요즘은 연구 책임자로 있다. 구글에 오기 전까지는 NASA AMES의 컴퓨터분과 책임자로 있었다. 인공지능과 머신러닝 분야에서 잘 나가는 연구자이기도 했다. 피터 노빅의 글중에 10년동안 프로그래밍 배우기(Teach Yourself Programming in Ten Years)라는 유명한 에세이가 있다. 우선 제목을 잘 붙였다. “10년 동안 프로그래밍 배우기” 아니면 책방의 책들처럼 “프로그래밍 10년 완성”. 인상적인 제목이다.
|
피터 노빅 |
10년이면 상당히 긴 세월이다. 단 몇 줄을 읽고 싶지 않아 건너뛰기도 하는 필자와 같은 사람들에게 10년이면 거의 영원에 가까운 세월이다. 그러나 10년은 돌이켜 보면 금방 흐르는 세월이다. 프로그래밍이나 전자공학의 흐름에서 10년은 아주 긴 것 같으면서(많이 변한다.) 덧없이 금방 흘러버리고 마는 시간이다. 만약 이 10년이라는 시간이 잘 사용할 수 있으면, 그리고 성취의 흐름을 10년 정도로 잡는다면 그렇게 조급해 하지는 않아도 될지도 모른다. 만약 시간의 흐름을 1년이나 3년 정도로 잡는다면 약간 조급해 질지도 모른다. 1달이나 몇 개월의 흐름으로 잡는다면 조급해져서 복잡한 일은 할 수 없을 것이다. 세월이 아무리 빨리 흘러도 일들의 진행에는 시간이 필요한 법이다. 프로그래밍을 소화하는 정도가 아니라 밥을 소화하는 데에도 몇 시간이 필요하다. 필자 역시 조급해져서 하던 일을 중간에 팽개친 것이 한두 번이 아니기 때문에 10년이라는 척도를 다시 생각해 보았다.
정말 긴 시간이기는 하지만 어떤 일의 마스터링에는 대략 10년 정도가 걸린다는 것이 노빅의 주장이다.
글의 시작은 서점에 들어서면 “자바 7일 완성 (Teach Yourself JAVA in 7 days)” 과 비슷한 제목의 인터넷, 윈도우, 비주얼 베이직에 대한 책들이 끝없이 늘어선 것에 대한 비판으로 시작한다. 아마존을 검색해보면 이런 서적이 대부분 컴퓨터분야에 몰려있다는 것이다. 노빅은 이 검색의 결론을 컴퓨터를 배우려는 사람들의 엄청난 붐이 있거나 컴퓨터를 배우는 일이 너무나 쉽기 때문에 그럴지도 모른다고 했다. 물리학이나 베토벤에 대해서는 당연히 며칠 만에 배우기가 없으며 개의 손질법마저도 몇 일만에 배우는 책은 없다고 했다. 이를테면 “3일 동안 Pascal 배우기” 같은 책이 알려줄 수 있는 것은 Pascal과 비슷한 그 무엇이다. 비슷한 언어를 잘 알고 있다고 해도 그 동안에 배울 수 있는 것은 문법정도라는 것이다. 3일이나 일주일 동안에 일어날 수 있는 변화는 그것뿐이다. 인생이 바뀌지도 않는다고 한다.
노빅이 제시한 것은 “10년”이라는 긴 시간이었다. 10년이라는 시간을 잡은 데에는 이유가 있다. 보통 한 분야에서 정통하거나 대가가 되기까지 일반적으로 10년 정도의 세월이 걸린다는 연구 결과를 인용한 것이다. 체스, 음악 작곡, 미술, 피아노, 수영, 테니스, 정신심리학, 위상 수학 기타 다양한 분야에서 전문가가 되기 위해서는 보통 십년 정도가 걸린다는 것이 정설이라는 것이다. 지름길이나 단축코스가 없었다고 한다.
신동이라 불린 모짜르트도 최고의 음악을 만들기까지 13년 이상이 걸렸다. 비틀즈 역시 비교적 빨리 유명세를 타긴 했지만 훨씬 이전인 1957년부터 작은 클럽에서 활동을 시작했다. 결정적인 작품들은 10년 정도 지난 1967년 Sgt. Peppers에 이르러서야 만들 수 있었다. 그러니 일반적인 사람들 역시 목표의 눈높이는 낮을지 몰라도 어느 정도 정통해지기 까지는 당연히 세월이 필요한 것은 분명하다. 그리고 이 기간 동안 부단히 개선하고 노력해야 한다는 당연한 글을 쓴 것이다.
노빅의 프로그래밍을 배우는 방법노빅이 제시한 프로그래밍을 배우는 방법은 아주 간단하다.
- 프로그래밍에 관심을 가져보고 정말 재미가 있다고 생각해야 10년 정도를 기꺼이 쏟아 부을 수 있다(필자의 생각에 이것은 당연한 것 같다.).
- 다른 사람의 프로그램을 읽어보고 다른 사람과 이야기해야 하는데 이 과정은 어떤 책이나 교육과정보다 중요하다(다른 사람의 작품을 읽어보지 않으면 당연히 다른 사람에게 읽힐 작품을 쓸 수 없다.).
- 가장 좋은 배우기는 실제로 해보면서 배우는 것이고 이 방법을 더 적극적으로 체계화해야 한다는 것이다. 최고의 성취는 오랜 기간 경험을 쌓으면서 생기는 것이 아니라 노련한 사람의 경우에 있어서도 끊임없는 개선으로 이루어지기 때문이다(이 과정에서 엄청난 에너지가 필요하다는 것을 알고 있다. 버전업과 점진적인 발전 앞에는 장사가 없다.).
- 컴퓨터 학과가 가르쳐주는 것이 전부가 아니며 일을 하면서 배울 수도 있다.
- 프로젝트를 다양하게 해보면서 어떤 프로젝트에서는 최고의 프로그래머가 되어 다른 사람들을 리드하고 비전을 제시해 보기도 하고 어떤 프로젝트에서는 다른 사람으로부터 지도 받을 필요가 있다(다른 사람에게 무엇인가를 가르쳐보는 것이 최고의 학습이라는 말이 있다.).
- 다른 사람이 이끄는 프로젝트에 참여하여 다른 사람의 프로그램을 이해한 후 원래의 작성자가 놓친 부분을 고쳐보기도 하고 자기의 프로그램을 관리할 다른 사람들이 쉽게 작업할 수 있는 프로그램을 작성하기도 해야 한다(작가의 표현력은 여러 번 고쳐 써 보면서 증가한다고 한다.최고의 글쓰기는 다시 써보기라는 말도 있다.).
- 다양한 프로그래밍 언어를 배워라(여러가지의 패러다임을 배울 필요가 있다.).
그리고 몇 가지가 더 있다.
읽다보면 10년 정도의 기간으로 부족할 것 같기도 하다. 10년 동안 이렇게 배우는 것은 10년을 열심히 살라는 이야기와 다를 것이 없어 보인다. 써보고 가르치고 배우고 참여하여 몸으로 체득하는 일을 게을리 하면 안 되는 것이다.,
프로그래밍은 스스로 인지하는 과정에서 배운다노빅의 주장 가운데에는 몇 가지의 핵심적인 요소가 있다. 책이나 문서라는 것은 스스로 배우거나 사람들에게 배우는 것보다 훨씬 약하다는 사실이다. 때로는 책이나 문서를 읽는 것 보다 그냥 프로그램을 만들고 그 안에 빠져 들어가는 편이 더 낫다는 것이다. 그리고 많은 일들은 일 그 자체를 해나가는 과정이 바로 배우는 과정이라는 사실도 바로 이해할 수 있다. 어떻게 보면 책이나 문서라는 것은 이 과정을 배우는 데 필요한 하나의 주석이라고 볼 수 있다. 결국은 프로그래밍을 배우는 것은 하나의 커다란 인지과정이다. 다른 분야와 다를 것도 없다. 10년이라는 것은 소모되는 세월이기도 하지만 변화에 투입되는 기본적인 자원이다.
글의 뒷부분에는 노빅 자신의 이야기가 나온다. 노빅은 첫째 아이가 태어날 무렵 수없이 많은 "How to.." 책을 읽었다고 한다. 그러나 정말 어쩔 수 없는 초보자라는 느낌을 지울 수 없었다고 한다. 30 개월이 지나 둘째가 태어날 무렵 노빅은 책을 새로 읽은 것이 아니라 자신의 경험을 믿기로 했다. 그러자 자신의 경험을 바탕으로 하는 일이 전문가가 쓴 수 천 페이지의 책보다 유용하고 더 확실한 것이었다고 한다. 차라리 프로그래머에게 How To가 아니라 How Not To를 가르치는 편이 어떨까하고 이야기한다. 스스로 배운다는 것은 HowTo에 지배되지 않는다는 사실이다. 그래서 어떤 사람들은 잘 할 수 있는 일과 함께 하는 경우에 커다란 능력을 발휘할 수 있다고 한다. 소질을 타고나는 경우도 있다. .
노빅은 글의 끝머리에서 책방에 가서 책을 사서 읽으면 어떤 유용한 가르침을 줄지는 모르지만 그 것이 며칠이나 몇 달 안에 인생을 변화시키지도 않을 것이고 통달을 가르쳐 주지도 않을 것이라고 말한다. 당연한 말이다.
필자의 생각은 책의 제목이 Teach Yourself XXX in Ten Years 라고 쓰여 있다고 해도 답은 종잇장에 있는 것이 아니라 문제를 풀어나가는 사람에게 속해있다는 것이다. 실제로 생각하고 풀어보고 시간을 들여서 답을 만드는 사람 자체가 답이며 문제들과 함께 변한다. 꼭 정신수양의 과정처럼 보이지만 이런 것들을 잘 엮어서 생각해보면 답이 나올 것 같기도 하다. 그리고 한편으로는 필자 스스로의 변화에 대한 기대이기도 하다. 기대가 없으면 행동은 나오지 않는다.
필자의 생각에 이 게임에서 10년 동안 가르치고 배우는 사람은 바로 자신(Yourself)이다.@