Please enable JavaScript to view the comments powered by Disqus.

[번역] 프로그래머가 되고 싶은가? 그렇다면 대학 학위를 취득하는 일은 큰 시간 낭비일 수 있다

이 글은 Eric ElliottWant to Code? A University Degree Might be a Huge Waste of Time를 번역한 글입니다.


많은 사람은 소프트웨어 엔지니어가 되기 위해서는 대학 학위가 필요하다고 생각한다.

얼마 전 나는 “Learn to Code: 13 Tips that Could Save You Years of Effort”라는 포스트를 작성했다. 그 글에서 제시한 첫번째 팁은 “대학 커리큘럼은 잊어라”였다. 전문은 아래와 같다.

대학 수업 과정은 잊어라. 스탠퍼드나 MIT가 아니라면 당신의 학위는 남들에게 보여줄만한 앱을 개발한 이력보다 큰 의미가 없을 수도 있다. 사실 대부분의 대학 수업들은 변화하는 기술을 따라잡기 위해 고군부투하고 있다. 대학 학위가 커리어의 처음 1~3년간은 학위가 없는 사람보다 몇천 달러를 더 벌게 해 줄 수 있을지 모른다. 하지만 그 이후에는 전혀 상관이 없다. 마치 화장실에서 시간과 돈을 흘려보내고 싶지 않다면…

나는 이런 얘기를 많이 해 왔지만 데이터에 근거한 자세한 글을 쓴 적은 없었다. 이런 민감한 주제에 대해 강하게 주장하라면 그만한 증거를 제시하는 것이 좋을 것이다.

다음이 현실이다. (2016 Stack Overflow servey에서 56033명의 프로그래머를 대상으로 한 조사에서 얻은 데이터)

  • 고액 연봉은 대학 학위보다 멘토링 프로그램과 더 강한 연관관계를 가지고 있다
  • 석사 학위 취득자와 bootcamp 졸업자 사이의 연봉 차이는 1% 이하다.
  • 69%의 현직 소프트웨어 개발자는 교육기관을 통하지 않고 직접 공부했다.
  • 43%가 실무 교육을 가장 주요한 학습 수단으로 꼽았다.
  • 25%가 온라인 교육을 이용했다.
  • 19%만이 컴퓨터 과학과 관련된 학위를 가지고 있다..
  • 8.5%만이 컴퓨터 과학 학사 학위를 가지고 있다.
  • 6.5%는 Bootcamp를 졸업했다.(이 수치는 점점 더 높아지고 있다)

소프트웨어 엔지니어링 직무에서 ‘동등한 경험’이란 96% 정도는 ‘일을 한 시간이 동일하다’라는 의미를 내포하고 있다.(개발자 직무의 4% 정도만이 고급 수학, 과학을 요구한다)

일을 시작한 지 3년이 지난 시점이 되어 그때까지 만들어낸 멋진 소프트웨어들을 보여준다면 누구도 당신이 대학을 다녔는지 상관하지 않는다. 또 이러한 이유로 경험을 쌓으면 쌓을수록 학위가 있는 사람과 없는 사람의 연봉에는 차이가 줄어들게 된다.

학위가 더 빠르고 덜 비싼 선택지보다 더 많은 기회의 문을 열어주지는 않는다.

대학의 컴퓨터 과학 커리큘럼이 당신에게 알고리즘, 데이터 구조, 컴퓨터 과학 기초와 관련된 탄탄한 기초 지식을 제공하는 것은 사실이다. 이는 확실한 사실이며 충분히 가치 있는 일이다. 당신은 이론에 있어 훨씬 더 튼튼한 기반을 가지게 될 것이다.

여기서 핵심은 이론에서이다.

문제는 대부분 대학은 실제 소프트웨어 엔지니어링에 큰 도움을 주지 못한다는 사실이다. 엔지니어링은 응용 기술에 관한 것이다. 이론이 아니다.

대부분의 대학은 잘 알려진 다양한 알고리즘들을 가르친다. 그 알고리즘들은 대부분 최근의 프로그래밍 언어에서는 잘 사용되지 않는 것들이다. 왜냐면 더 좋은 대체물들이 이미 언어 자체나 표준 라이브러리에 포함되어 있기 때문이다.

학생들이 정말로 배워야 하는 것은 소프트웨어가 지금과는 아주 다른 모습을 가진 30년도 전에 첫 번째 판이 집필된 책의 솔루션을 공부하는 것이 아니라 그들 스스로 문제를 어떻게 해결하는지다.

그리고 무엇보다 데이터 구조와 알고리즘은 성능에 관한 해결책을 찾기 위한 기술이다.

고등 교육과 정렬 알고리즘

컴퓨터 과학 커리큘럼의 초반부는 알고리즘을 가르치는 데 집착한다. 당신은 아마 학기 대부분의 시간을 그 알고리즘들을 공부하는데 보내게 될 것이다. 6개의 서로 다른 알고리즘 중에서 가장 효율적인 알고리즘 1개를 고를 수 있는 능력을 갖춰야 하기 때문인가?

아니다. 절대로 아니다. 알고리즘을 배우는 이유는 성능 특성이 크게 다른 여러 종류의 정렬 알고리즘이 존재하기에 성능 프로파일링에 대한 흥미로운 연구가 가능하고, 알고리즘의 성능 특성을 이해하는 방법인 big O 표기법을 배울 방법이기 때문이다.

문제는 big O 표기법이 유용하다 하더라도 당신은 ‘더 많은 작업 = 더 나쁜 퍼포먼스’라는 간단한 직관으로 문제를 가늠할 수 있다는 점이다.

  • 큰 리스트에서 반복과 계산은 느리다.
  • 반복문의 횟수를 늘리면 느려진다.
  • 여러 반복문을 중첩하면 매우 느려진다.
  • 반복문들을 중요도에 따라 차례로 중첩해버리면 프로그램이 그냥 기어가게 한다.

요점은 이거다. 아주 큰 사이즈의 컬렉션이나 몹시 나쁜 알고리즘을 상대하고 있는 것이 아니라면 학생들에게 네트워크, 디스크, 렌더링의 비용이 더 많이 든다는 사실을 가르치는 것이 Array.prototype.sort() 보다 모두 느린 6개의 서로 다른 알고리즘을 가르치는 것보다 낫다는 말이다.

기존 알고리즘들을 공부하고 비교하는 일이 유용하다는 사실은 나도 모르는 건 아니지만 정말로… 이건 바보스러운 일이다.

그렇다. 그들은 다양한 데이터 구조 전략을 가진 아주 다양한 알고리즘들을 아주 많은 수업에서 다루고 있다. 하지만 시간이 지나 학생들이 마침내 믿을만한 quick sort를 만났을 때 그들은 이미 관심을 잃어버렸을 것이다. 그들은 요점을 놓쳐버렸고, 의문만이 남을 것이다.

만약 quick 정렬이 merge, heap 정렬보다 그렇게 빠르다면 왜 처음부터 merge, heap 정렬을 배워야 했을까?

저런 의문을 가지게 되는 건 건 전적으로 자연스럽고 정당한 결과다.

현실 세계

현실에서는 저 알고리즘 중에 어떤 것을 선택해도 네트워크 사용량이나 디스크 접근량 줄이기, 또는 계산을 지연시키는 것만큼 큰 효과를 내지 못한다는 것이 판명되었다.

그리고 웹 개발에서 데이터를 다룸에 있어 알고리즘 효율이 매우 중요한 경우가 생겼을 경우에는 성능 측정에 네트워크, 디스크 접근량, 데이터 스트림이 매우 큰 골칫거리가 된다. 그리고 어떤 알고리즘의 구현 가능성도 공유 메모리의 사용에 가장 큰 의존성을 가진다.

이론에 치우쳐 시간을 낭비하는 동안 학생들은 성능 측정에 있어 왜곡된 인식을 하게 된다. 그리고 그 이론들은 모던 애플리케이션에서는 고려하지 않는 물리적인 현실성이 없는 것들이다. 학생들은 실제 앱에서는 실질적인 차이가 없는 성능 특성을 고민하도록 배우고 있는 것이다.

좋은 소식은 당신은 저런 가치가 없는 내용을 거르고 동시성, 스트림, 머신 클러스터와의 연동, 지연(lazy) 처리를 공부할 수 있다는 점이다. 오래된 책에서 가져왔으며 이제는 시대에 뒤처진 1980년도의 하드웨어에 최적화되어 있고 지금껏 천만번 이상은 구현된 비현실적인 공유 메모리 정렬 알고리즘을 공부하는 대신 말이다.

그래도 다양한 데이터 구조와 알고리즘을 알아야 할 필요는 없는가?

대학은 정렬 알고리즘을 정말 좋아한다. 문제는 정말로 알아야 할 알고리즘은 딱 하나만 있다는 사실이다. 그것은 당신이 사용하는 언어나 표준 라이브러리에 구현된 알고리즘이다. 진짜로 알고 있어야 하는 건 그 알고리즘의 API에 대해서 숙지하는 것이다.

가장 빠른 메모리 기반의 일반적인 용도의 알고리즘은 언어나 표준 라이브러리에 구현되어 있고 다른 조건들이 거의 모든 애플리케이션에서 더 중요하다. (네트워크, 디스크 접근, 레이지 또는 즉시 계산, …).

난 지난 20년 동안 표준 정렬 알고리즘의 대안을 사용한 일이 딱 한 번 있었다. 어쩌면 당신은 결코 사용할 일이 없을지도 모른다.

나는 다양한 정렬 알고리즘에 대한 지식을 가지고 의식적으로 어떤 방법을 적용할지 고려하는 한 대부분의 경우 실제 애플리케이션의 성능 문제를 파악하기 어려울 것으로 생각한다. “선택의 역설”이 이와 관련이 있다.

성능에 관한 결론은 프로파일링을 먼저 하고 테스트를 한 후 애플리케이션에 정말로 병목 현상이 생기는 부분이 어디인지 파악하는 것이다. 문제를 찾았으면 그것을 고치는 일에 집중하면 된다.

섣부른 최적화는 만 가지 악의 근원이다 ~ Donald Knuth

big O 표기법에 대한 요약서를 읽어보고 기초에 대한 이해는 다져주자.

하지만 일을 하면서는 머릿속에 적절한 해결책으로 떠오른 첫 번째 알고리즘을 선택해서 사용하면 된다. 그것이 좋은 방법이다. 테스트를 통해 수정할 필요성이 증명되면 그때 수정하면 된다.

이런 말이 처음에는 이상하게 들리겠지만, 실제 작업을 하다 보면 big O 계산을 하지 않더라도 적절한 알고리즘을 잘 선택하는 자신을 발견하게 될 것이다.

이것이 현실에서 프로그래밍이 이루어지는 방식이다. 위대한 개발자는 작업할 때 문제에 대해 의식적으로 생각하고 고려하는 경우가 그렇게 많지 않다. 마찬가지로 위대한 음악가는 의식적으로 음표를 생각하며 연주를 하지 않는다. 그저 음악을 느끼고 그들 스스로 연주할 뿐이다.

일단 프로파일링을 하고 문제가 발생하는 지점을 찾았으면 구글을 검색해서 좋은 방법을 확인하면 된다. 그리고 그 선택을 과거의 유물이 되어버린 컴퓨터 과학 도서의 저자로부터의 조언이 아니라 현재 작업 중인 애플리케이션의 머신 아키텍처를 기반으로 할 수 있다.

유료 대학 프로그램들은 최악이다

대학 커리큘럼은 구글이 나오기 전의 시대에 맞춰져 있다.

대학 프로그램 수강은 경제적인 면에서나 커리큘럼의 면에서나 정말로 나쁜 선택이다.

내가 이런 비판을 하게 된 가장 큰 동기는 미국의 평균 대학 등록금은 연당 18,400달러라는 사실이다. 대학을 졸업한 후 학생들은 주니어 레벨의 프로그래머로 경력을 시작하게 되고 학위가 없는 사람보다 1년에 대략 1만 달러를 더 벌 수 있다. 하지만 학위가 없는 사람보다 더 많은 버는 기간은 오직 처음 3년뿐이다. 말하자면 7만 6천 달러를 들여서 얻은 학위로 얻을 수 있는 이익은 3만 달러이며 손해는 약 4만 6천 달러라고 할 수 있다. 그리고 이 수치는 평균값일 뿐이며 사람에 따라 더 큰 손해를 볼 수도 있다.

많은 미국 대학들은 당신이 일하면서 결코 돌려받을 수 없는 큰돈을 아주 즐겁게 뺏어가고 있다.

대학 교육이 무료인 나라에서는 상황이 이만큼 나쁘지는 않다.

나는 많은 대학의 프로그램을 살펴봐 왔다. 나는 그 학교들이 무엇을 가르치고 있는지 알고 있다.

슬픈 현실은 대부분의 프로그램이 C/C ++ 기반을 둔 현실과는 다소 동떨어진 오래된 이론들에 집중하고 있다는 점이다. 또 LISP는 흥미로 접하기도 하며 몇몇은 Python이나 Javascript 겉핥기를 하기도 한다.

안타깝게도 함수형 프로그래밍이나 프로토타입 상속 같은 다양한 프로그래밍 패러다임을 소개하지 않는 프로그램은 당신에게 클래스 상속이나 서툰 객체지향 디자인 같은 나쁜 습관을 지니도록 만들 수 있다. 그러한 습관들은 당신을 도와주기보다는 높은 수준의 소프트웨어를 만들기 어렵게 하고 좋은 직업을 가지기 어렵게 만든다.

이러한 이유로 인해 대학의 컴퓨터 과학 커리큘럼에는 사실상 빨간불이 들어와 있다. 나는 대학을 갓 졸업한 개발자가 훌륭한 코드 샘플을 제출하지 않고 심층 면접에서 중요한 이론을 제대로 이해하고 있다는 것을 증명하지 못한다면 절대 채용하지 않는다.

하지만 대학의 커리큘럼에 저렇게 문제가 많고, 또 학위를 얻는데 치러야 하는 비용이 저렇게 놓다 하더라도 대학의 좋은 컴퓨터 과학 커리큘럼은 쉽게 접할 수 없는 보물이기도 하다. 좋은 소프트웨어 개발자는 꾸준히 공부한다.

인맥의 가치

정말 너무하다 싶을 정도로 비싼 대학 프로그램의 진정한 가치는 당신이 대학에서 만날 수 있는 사람들이다. 하지만 인맥의 수준과 기회는 매우 불균등하게 분포되어 있다. 만약 당신이 스탠포드에 갈 수 있다면 그 인맥들은 정말로 높은 가치를 가질 것이다.

또 주립 대학이나 아이비리그에 속해있지 않은 대학을 졸업한 후에도 실리콘 밸리의 창업센터나 투자 생태계에 곧바로 들어간다면 SOMA와 샌프란시스코의 어떤 카페에서도 4달러의 커피보다 훨씬 높은 가치의 인맥을 쌓을 수 있을 것이다.

어디서 사람들을 만날지 잘 모르겠는가? Meetup.com에서 시도해보라.

대학을 가는 대신 무엇을 해야 할까?

  • 그냥 코딩을 시작하기.
  • 좋은 스승을 만나기
  • bootcamp를 찾아보기
  • 온라인 교육 수강
  • 다른 개발자와의 만남
  • 블로그, 책, 기타 등등

(역주: 2ality.com의 Dr. Axel Rauschmayer이 Erric Elliott에게 전달한 트윗)

예외

만약 정말로 훌륭한 대학 프로그램을 찾았다면 너무 비싸거나 돈이 없다 하더라도 어떤 방법이라도 써서 그 프로그램에서 얻을 수 있는 모든 것을 가져와야 한다. 나의 대학에 대한 비판은 수만 달러를 학비로 손쉽게 가져가고도 졸업 후의 수입을 통해 돌려받지 못하게 하며 정말로 배워야 할 내용을 가르치지 않는 대부분의 미국 대학들을 향한 것이다.

최첨단의 연구 & 과학 직무는 학위를 선호한다.

대학 학위가 확실히 차이를 만드는 분야가 몇몇 있으며 보수도 평균보다 높다. 그런 자리는 Stack Overflow에 의하면 개발자 직군 중에서 약 4%에 해당한다.

머신러닝 전문가, 데이터 과학, 생명과학, 그리고 양자컴퓨터 전문가들은 고학력자일 가능성이 높다. 또 증강현실 플랫폼의 개발자들은 높은 수준의 수학이 필요하다.

앞서 말한 직무와 관련된 내용을 온라인에서 배울 수는 있다. 하지만 학위는 저 분야에서 일할 사람이 가져야 할 능력에 대한 신뢰도를 높여준다. 만약 당신이 저 분야 중 하나에 대해 열정을 가지고 있으며 또 일하고 싶은 마음이 있다면, 대학에 가서 학위를 취득하라.

하지만 대학에 갔더라도 공부 중인 분야에 순수한 관심이 없고 수학이나 과학에 대한 적성이 없다면, 당신은 돈과 시간을 낭비하고 있을 수도 있다.

모든 농구선수가 NBA에서 뛸 수는 없다.

운 좋게도 저들이 지금껏 만들어 온 플랫폼을 기반으로 앱을 만들기 위해서는 그렇게 많은 훈련이 필요하지 않다. 하지만 또 다른 Oculus Rift나 Tesla 자동주행 기술을 만들고 싶다면 관련 스타트업을 배출한 이력이 있는 대학을 찾아가길 바란다.

그리고 고급 연구 학위 없이도 수익을 배로 늘릴 방법은 많이 있다. 하지만 그러기 위해서는 기업가적 성향이나 좋은 운이 있어야 할 것이다.

결론

만약 또 다른 Tesla, Oculus Rift, AI Go 챔피언을 만들고 싶고 남들과는 다른 수학과 과학에 대한 적성을 가지고 있다면 학위를 취득해야 한다.

만약 최신 기술 스택을 기반으로 훌륭한 앱을 만드는 좋은 직업을 가지고 싶다면 학위를 가질 필요가 없다. 그건 엄청난 돈과 시간 낭비다.