나의 공부를 방해했던 잘못된 사고방식
우연히 읽은 어떤 글
작년에 분명한 계획도 없이 분주히 컴퓨터 공학 공부를 하던 때였다. 우연히 재능과 열정이 없어도 프로그래밍을 하는 사람들이라는 글을 읽게 되었다. 글을 읽고 나서 나는 뒤통수를 얻어 맞은 것 같은 충격을 받았다.(크게는 아니고 많이 아프게… 그게 그거…)
위의 글은 원래 medium에 게시된 영어로 작성된 원글을 번역한 글이었는데, 글의 주요내용은 이랬다.
프로그래밍은 프로그래밍에 대한 특별한 재능과 열정이 있는 사람들만 할 수 있는 것이 아니다. 프로그래밍은 꾸준히 학습해서 연마해야 할 일련의 기술들일 뿐이다.
그러면서 Django의 Co-Creator인 Jacob Kaplan-Moss(이하 Jacob)를 비롯하여 Bootstrap, PHP, Rails를 만든 사람들이 공통적으로 자신들이 프로그래밍에 특별한 재능이 있는 사람은 아니라고 밝힌 글이나 인터뷰들을 인용한다. 나는 이 사람들이 정말 이런 말을 했는지 궁금했는데, 당장 내가 Django를 공부하고 있어서 Jacob이 어떤 맥락에서 그런 말을 했는지 찾아보게 되었다. 해당 글에서 인용된 말은 Pycon 2015에서 그가 keynote 강연에서 했던 발언이었다. Jacob의 강연은 글에서 인용된 내용 이상으로 유익한 내용이 많았다. 강연의 일부 내용을 소개하겠다.
Jacob의 Pycon 2015 Keynote
Hi, I’m Jacob, and I’m a mediocre programmer
Django의 창시자로 유명한 Jabob은(스스로 Inventor는 아니고 Co-Creator라고 말했다.) 2015 Pycon에서 기조 연설을 하는데, 그는 연설을 시작하면서 겸손하게 자신이 기조 연설을 할만한 자격이 없음에도 불구하고 연설자가 된 사실을 영광스럽게 생각한다고 말한다. 그리고 그의 시작하는 말은 앞으로 그가 전달하고자 하는 메세지와 큰 연관이 있었다. 사람들 대부분이 Jacob 자신이 훌륭한 개발자이기 때문에 성공했다고 생각하지만 그는 자기 자신을 이렇게 소개한다. "I'm at best average programmer"
라고.
Bell Curve
Django라는 거대한 프레임워크를 개발한 사람의 지나친 겸양이라고 생각할 수도 있지만, 그는 bell curve, 우리가 잘 알고 있는 표준 정규 분포 그래프를 보여주면서 표준 정규 분포에 대한 우리의 상식을 상기시킨다. 그 상식은 바로 대부분의 분포는 정규 분포를 따르게 되어 있으며, 대다수의 사람은 분포의 중앙에 위치하고 특별하게 잘하거나 못하는 사람들이 양쪽 끝에 위치한다는 것이다. 그런데 이상하게도 개발업계에 정규분포에 반하는 상식이 있다는 것을 지적한다. 특히 자기 자신이 아주 뛰어난 개발자라는 사실을 어떻게 알 수 있냐고 묻는다. 코드의 라인 수를 보고서 할 수 있는것인지, 아니면 story point(agile 개발에서의 평가 기준 중 하나)를 보고서 평가하는 것인지, 그렇다면 도데체 story point는 무엇인지 질문한다. 그는 개발자들이 논리적이고 분석적이고 사실에 기반한 분야에서 일한다고 믿고 싶어하지만 실제로 우리가 하는 일(개발 실력)에 대해서 말할 수 있는 기술적이거나 시스템적인 방법이 없다고 말한다. 그래서 우리가 평가할 만한 마땅한 방법이나 데이터가 없기 때문에 스토리를 말하는데, 사람들의 프로그래밍 능력에서도 마땅히 평가할 지표가 없기 때문에 흔히 그 사람의 일화나 이야기들을 말한다.
Talent Myth
문제는 이런 이야기들은 이야기로 전달되기 때문에 결론적인 평가가 단순화 된다는 것이다.(어떤 기준에 따라서 평가되기 보다는 그 사람의 개발 능력에 대한 추상적인 이미지밖에 없기 때문에) 그래서 그 사람이 끔찍하다거나 그 사람이 쩌는 능력을 가졌다는 식의 이야기를 하게 되고 끔찍함과 쩜(?)의 사이에는 그 어떤 공간도 없게 된다. 사람들은 어떤 사람을 훌륭한 프로그래머라는 바구니와 앉을 자리도 아까운 프로그래머라는 바구니 이 두 바구니 안에만 집어 넣게 되는데, 이런 양극단적인 평가는 앞서 언급한 정규 분포와는 정반대의 분포를 만든다. 이런 평가가 적절하려면 가운데에 분포한 사람이 가장 없고 대다수의 사람들이 끔찍하거나 훌륭한 양쪽 끝에 분포해야 한다. 하지만 개발자들에 대한 분포만 정규분포를 따르지 않는다는 것은 재능 미신(talent myth)일 뿐이다. 이런 재능 미신의 문제는 결국 프로그램 실력이 rock star나 ninja급이 아니라면 프로그램 할 수 없는 세계를 만들어 낸다는 것이다. 그는 만약에 이런 미신이 개발업계에 만연하게 되면 사람들이 계속 개발 분야에 남아있을 수 없게 만들고, 개발 업계에서 떠나게 만들고, 계속 성장하고 발전하는 것을 방해하게 된다고 말한다.
Programming isn’t a “passion” or a “talent” but a collection of acquired skills
그는 몇년 전에 Kansas University에서 열린 GIS(Geographic Information System)-day 행사에 참석했을 때의 일화를 이야기 한다. 해당 행사 오후 프로그램 중에는 학생들이 자신들의 연구 성과물을 발표하는 프로그램이 있었다. 학생들의 발표들은 기술적으로도 준비가 잘되어있을 뿐더러 흥미로운 주제들을 다루었었다. 그 프로그램에서 한 학생이 매우 뛰어난 발표를 했었다. Kansas 지역에서의 계절성 홍수를 예측하는 시스템이었는데, 역사적인 데이터들과 유량 분석, 강우량 데이터들 등을 사용한 시스템이었다. 그 학생이 사용한 프로그램 도구들은 Pycon 참석자들에게 꽤 익숙한 도구들인데, 그 학생은 AWS, Linux, PostgreSQL, Django, Geodjango를 사용했다. Jacob은 당시 파이썬 개발자를 고용하고 있었기 때문에 몇천줄의 파이썬 코드를 작성한 그 학생에게, 학생이 원하면 면접을 보고 싶다고 말했다. 그런데 그 학생의 대답은 ‘아니요, 그럴 수 없어요, 저는 진짜 프로그래머가 아닌걸요.’이었다. 그 학생은 클러스터 분산 GIS 처리 데이터 파이프 라인을 만들었다. 그럼에도 불구하고 그 학생은 진짜 프로그래머가 아니라고 대답했다. 왜냐하면 ‘개발은 talent myth안에 속한 사람이 하는 일이지 결과물을 만들기 위해 내가 한 일이 아니다’라는 생각 때문이다. 그러나 진실은 개발은 열정이나 선천적인 재능이 아니라 일련의 습득해야 하는 기술들일 뿐이다.
개발은 배울 수 있다. 대다수의 다른 기술들처럼 개발 역시 뛰어난 수준으로 할 수도 있고, 취미생활로도, 파트타임으로도 풀타임으로도 할 수 있다. 만약 우리가 이런 기술들을 평균정도로 가지고 있어도 괜찮다는 것을 인정한다면, 개발 업계에 새로 들어오는 신입들을 더 친근하게 맞아들일 수 있다.
이전에는 그렇지 않았었는데
한동안 나 스스로도 개발에 재능이 없는 한 개발자가 될 수 없는데 나는 재능이 없다. 하지만 당장 상황이 산업기능요원을 해야하니깐 현실적으로 공부는 해야겠지
라는 생각으로 공부를 하고 있었다. 안타깝게도 이런 마음 상태로는 좀 더 발전하고 싶다던가, 가능성이 있다는 생각보다는, 역시 나는 안되는 건가 하는 생각이 더 많았다. Jacob의 강연을 들으면서 왜 이런 생각을 가지게 되었을까? 생각해보았다. 고등학교 1학년 겨울방학 때였던 것 같다. 당시 나는 수학 공부를 잘 해보고자 꽤 노력 중이었다. 그 노력 중 하나로 방학 때 개설되었던 수학특별반을 수강 신청했다. 이름은 거창하게 수학 특별반이지만 문과였던 우리가 경시대회에 나갈 것도 아니었고, 주로 다루었던 내용은 이전에 배웠던 내용들의 기초들을 질문해보는 것이었다. 지금 기억나는 것은 예를들면 함수의 그래프가 양의 방향으로 움직이는데 왜 함수식은 마이너스로 표시하는지
, 허수
i
의 제곱이 정말 -1이 되는지
, 원을 정의하는 몇 가지 방식들
이런 것들이었다. 나는 그 수업이 어려웠다. 나와는 다르게 다른 친구들은 대답도 잘했고 탈레스 정리니하는 것들을 잘 알고 대답한다는 것에 위축되기도 했다. 그러면서도 당시에 위축될 때마다 ‘오늘부터 알면 되지’라는 생각으로 쉽게 전환이 되었다. 내가 수학자를 할 것도 아니었고, 오늘 모르는 걸 오늘 학습하면 된다고 생각을 했기에 이렇게 공부해봤자 얼마나 잘 할 수 있을지라던가 그런 고민은 없었다. 그래서 비록 입시 수학이라고는 했지만 수학적 사고를 연습하고 문제를 해결하는 과정을 굉장히 즐거운 공부였다. 수학공부에 꽤나 재미를 붙이게 되어서 문과였음에도 불구하고 다른 과목들보다 시간을 많이 쏟았다.(그래서 언어와 외국어 점수가 안좋았…)
대학교에 가고 보니
내가 졸업한 대학교는 모든 1학년 학생이 무전공인 단일 학과에 속해있다가 1학년 말에 전공을 선택하고 2학년때부터 전공을 시작하는 시스템이었다. 그래서 고등학생때 문과였던 친구가 이과를 선택하거나 반대인 경우가 흔했다. 나도 본래 문과였으나 1학년 떄 들었던 교양과목에서 배운 html css가 나름 재밌었기에 전산공학을 전공으로 선택했다.(그리고 그 결정을 후회했다…) 지금 돌이켜 보면 나의 커리큘럼은 상당히 엉망이었는데, 딱히 조언을 받지 않았기 때문에 2학년 때 들어야 할 자료구조 수업을 건너뛰거나 3학년때 4학년 전공을 듣거나 했다. 이렇게 하더라도 프로그래밍을 어떻게 하면 될지 터득할 수 있었으면 상관 없었겠지만, 졸업할 때까지 계속 헤멨다. 특히 2학년 때 들었던 외부 강사 특강에서 프로그래밍은 여기에 맞는 재능을 가지지 못하면 할 수 없는 것처럼 잘못 받아들이게 된 것 같다. 그 뒤에 프로그래밍이나 공학 공부, 그리고 진로 문제에서 헤멜 때마다 ‘아 역시 나는 재능이 없어서 이 분야에 계속 할 수 없는건가’라는 생각에 자주 휩싸였다. 이런 생각 때문에 고등학교 때처럼 내가 모르는 것에 부딛혔을 때에 새로 터득하면 된다는 사고방식으로의 회귀가 이루어 지지 않았다. 그래서 더 발전할 수 있었던 것도 하지 못했던 것 같다.
앞으로는 어떤 태도로 공부하는 게 좋을까
코드스피츠에서는 현업 개발자들을 위한 스터디 강의를 유투브에 무료로 공개한다. 지금 코드스피츠의 강의들이 굉장히 큰 도움이 되고 있고, 학부 때 따로따로 존재했던 컴퓨터 공학 지식들이 서로 연결이 되고 있는데, 강의를 진행하는 맹기완 대표님은 Javascript 스터디 1강에서 개발자에게 요구되는 자세가 무엇인지를 언급한다. 개발자에게 가장 먼저 요구되는 자세는 개발에 대한 흥미나, 열정이 아니라 개발 산업에 대한 진지함이라고 이야기 한다.
개발산업은 산업이기 때문에 산업에 맞는 진지함이 필요하다. 물론 흥미나 열정이 있는 사람에게 진지함이 있을 가능성이 높겠으나, 우리가 쉽게 이 둘의 차이점을 혼동한다고 말했다. 대표님이 2016년에 신입사원 공채를 위해 작성한 글에서 자신의 회사가 추구하는 것을 고객의 니즈와 예산, 시장의 변화 속에서의 제품의 가치와 방향을 기획하여 뛰어난 프로그래밍 실력으로 이를 실현하는 회사
라고 말하는데, 개발을 열정적으로 한다던지 기술을 배우는 것에 아주 큰 흥미가 있다던지가 아니었다. (물론 산업종사자가 아니라 컴퓨터 공학 학문을 하는 사람에게는 해당 주제에 대한 열정이나 흥미가 더 중요할 수도 있다.) 나는 여태까지 재밌는 취미활동을 열정적으로 하듯이 개발 공부를 했다는 것을 깨닫게 되었다.
우선 기본적으로 나도 리누스 토발즈 급의(뭔가 기준을 너무 극단적으로 잡은 것 같다…) 개발자가 되지 못한다 하더라도 당연히 괜찮고, 평균적인 프로그래머가 되어도 괜찮다. 다만 이 말은 극복할 지점에서 노력하기를 포기하고 안주하겠다는 것이 아니라, 특별히 뛰어난 이름난 개발자가 되지 못한다 하더라도 계속해서 개발 산업에 종사할 수 있으며, 개발 산업에 종사하기 위한 공부와 노력을 지속해 나가겠다는 뜻이다. 아직까지도 나의 컴퓨터 공학이나, 개발의 수준이 얕지만(매우 얕…) 더 노력하면 더 발전이 가능하며 할 수 있는만큼 발전이 가능하다.
이런 마음을 가지다 보니 내일 배울 내용들이 더 기대가 되고 지식들이 살처럼 붙는 것 같다. 앞으로 배울 개발 공부들이 더 기대가 된다.