레저큐 인턴기 2편 – 첫 출근

첫 출근

1월 18일, 첫 출근날 아침. 꿈의 랩탑인 맥북프로 레티나가 주어졌다. 15인치 화면에 RAM이 16 GB나 달려있는 ‘크고 아름다운’ 녀석이다.
설레는 마음으로 전원 버튼을 누르자 ‘쫘안’하는 따스한 부팅음과 함께 검은 화면에서 흰색 사과가 떠오르고, 곧! 널찍하고 시원한 화면이 나타난다.

maxresdefault.jpg
~~내 몸 값보다 비싼~~ 맥북 프로 15인치. (이미지 출처: DetroidBORG)

신나는 마음을 진정시키고 개발 환경을 세팅할 차례다. IDE(Integrated Development Environment: 통합 개발환경)와 플러그인, 개발툴들을 설치하고 테스트 환경을 세팅한다. 가자고 팀에서는 Jet Brains 사의 Java용 IDE IntelliJ를 사용하는데 학교에서 vim만 사용하던 내게, IntelliJ 이거, 정말 신세계다.

마지막으로 GitHub에서 가자고 프로젝트를 클론해서 내려받는다. 자, 이제 개발을 시작할 모든 준비를 마쳤다. 마침내 가자고 프로젝트의 소스코드를 열어볼 시간이다. 아무래도 Java가 익숙하니 백엔드 코드를 먼저 살펴보자…

어라 근데 뭔가 이상하다… 분명 Java로 작성된 코드인데 세상에, 이게 무엇인가. 내 눈앞에 펼쳐진 소스코드는 왜 이렇게 생소한걸까? 웬 듣도 보도 못한 Annotation 들이 덕지덕지 달려있는 건가. 클래스는 왜 이렇게 많으며 무슨 처음 듣는 용어들은 왜 이렇게 많은가.

아아, 뭔가가 잘못되어가고 있다. 하지만 진정하고 프론트엔드 코드를 살펴보자… 여기는 그래도 뭔가 좀 이해할 만한 것이 있을 수도 있다. 그러나 나의 희망은 곧 눈앞에 모습을 드러낸 암호문과 같은 프론트엔드 소스코드와 함께 산산조각이 나버리고 만다. 그제서야 비로소 깨달았다. 그동안 내가 해온 프로그래밍이 장난에 불과한 것이었다는 걸…

school vs world.jpg
젠장, 학교를 5년이나 다녔는데! (이미지출처: http://preemploymentassessments.com/)

컴퓨터공학을 공부한다는 것, 프로 개발자가 된다는 것.

학부 컴퓨터공학(혹은 컴퓨터과학) 수업에서도 프로그래밍을 한다. 단순한 알고리즘을 구현하는 간단한 코딩을 할 때도 있지만 때로는 꽤나 복잡한 시스템을 구현하기도 한다. 이를테면 DB 시스템을 구현하거나 linux 커널을 해킹한다거나하는 것들 말이다. (사실 linux 커널 해킹 수준이 되면, 그 누구도 절대 단순한 프로그래밍을 한다고 할 수는 없을 것이다.)

그럼에도 불구하고 현업에서 프로그래밍을 한다는 것과 학교에서 프로그래밍을 한다는 것은 완전히 다른 일이나 마찬가지다. 사실 어느 것이 ‘우위에 있다’고 얘기하기 보다는 ‘다른 영역의 일이다’라고 얘기하는 편이 나을 것 같다. 구체적으로는 이런 것들이 다르다.

  1. 학교에서의 프로그래밍과 현업에서의 프로그래밍은 초점과 지향점이 다르다. 컴퓨터공학 수업은 우리가 사용하는 컴퓨터 기술들의 토대에 대해서 가르친다. 따라서 프로그래밍도 원리와 이론의 학습이나 검증을 목표로 한다. 반면에 현업 프로그래밍에서는 이론보다는 구현 그 자체가 더 중요하다. 사실 너무나 당연하다. 그 구현이 곧 회사의 비지니스이기 때문이다.
  2. 문제의 핵심이 다르다. 학교에서의 프로그래밍에서 핵심은 아이디어이다. 협업에 대한 고려와 코드의 질에 대한 고려는 상대적으로 중요도가 덜하다. 그러나 현업에서의 프로그래밍은 코드의 질과 협업에 대한 고려가 가장 중요한 요소 중 하나이다.
  3. 접근 방법이 다르다. 학교에서의 프로그래밍은 현실적인 문제들에서 자유로울 수 있다. 문제들을 추상화시키고 단순하게 생각해도 괜찮다. 현업에서는 그렇지 않다. 항상 현실적인 문제들과 맞닥뜨리고 계속해서 새로운 균형을 찾아나가야 한다. 반면에 현실적으로 큰 문제가 되지 않는 것들은 과감히 무시할 수도 있다.
  4. 기술의 범위가 다르다. 학교에서의 프로그래밍은 가장 로우레벨의 기술들에서부터 차근차근 구현해나간다. 현업 프로그래밍에서는 이미 개발되어 있는 기술들을 얼마나 빠르게 잘 활용하느냐가 중요하다.

컴퓨터공학을 전공한 학생들 중에는 뛰어난 프로그래밍 실력을 가진 학생들이 많다. 그러나 모두가 그런 것은 아니고, 사실 그럴 필요도 없다. 컴퓨터공학에서 뛰어난 프로그래밍 실력을 요구하는 분야는 일부에 불과하기 때문이다. 이를테면, 알고리즘이나 전산학 이론에 대해 공부하고 연구하는 학생들은 프로그래밍 언어보다 수학에 더 익숙하다.

마찬가지로, 좋은 프로그래머가 되기 위해서 반드시 컴퓨터공학을 전공할 필요는 없다. 프로그래밍에서 컴퓨터공학적 지식을 요구로 하는 경우 역시 일부에 불과하기 때문이다. 그보다 자신의 코드의 품질에 집착하고, 얼마나 프로그래밍 생산성을 높일 수 있는지에 대해서 고민하는 사람이 더 좋은 프로그래머의 자질을 가진 사람이라고 할 수 있을 것이다.

difference_between_a_programmer_a_developer_a_computer_scientist.png
프로그래머와 개발자 그리고 컴퓨터 과학자. 학교는 컴퓨터과학자를 길러내는 곳이지 프로그래머나 개발자를 길러내는 곳이 아니다. (이미지 출처: http://www.improgrammer.net/)

다시 처음부터 다시 처음! 처음!

나의 인턴 생활의 첫 날은 ‘현업과 학업의 차이’라는 아주 근본적이면서 또한 아주 거대한 간극에 대한 깨달음으로 귀결되었다. 그러나 이대로 포기할 수 없다. 나의 뇌가 백지 상태임을 깨달았으니 첫 획부터 다시 차근 차근 그려나가야 한다.

그 첫 획을 긋기 위해서, 부랴부랴 데이터베이스의 구조부터 공부하기 시작했다. 가자고는 관계형 데이터베이스 (key와 value들의 간단한 관계를 여러개의 테이블로 정리한 형태의 데이터베이스) 시스템 MySQL을 이용하고 있고, 복잡한 구매와 상품 정보를 저장하기 위한 수십개의 테이블들이 서로 얽혀 있기 때문에 이 관계들과 구조에 대해서 제대로 이해하는 것이 개발을 위한 첫걸음이라고 할 수 있다.

처음엔 몇개의 테이블을 JOIN 해서 데이터를 가져오는 간단한 SQL(Structured Query Language: 관계형 데이터베이스 시스템에서 데이터를 관리하기 위해 이용하는 프로그래밍 언어)스크립트부터 시작했다. 이를테면 특정 상품을 2016년 1월 한달 동안 구매한 고객들의 리스트라던가 1월 한달 동안 어떤 상품 옵션을 통해 발생한 매출을 구해본다던가, 하는 것들이다.

그리고 나서는 점점 복잡한 데이터들을 추출할 수 있는 쿼리 명령어들을 짜봤다. 특히 마케팅이나 매출 집계에 활용할 수 있는 각종 통계 데이터들을 추출하기 위한 쿼리를 작성했다. 활발하게 구매활동을 지속하고 있는 고객들, 다소 장기간 동안 구매활동이나 접속 기록이 없었던 고객들의 리스트 등…

그렇게 레저큐에서의 첫 일주일 동안은 가자고 프로젝트 소스코드는 단 한줄도 손대지 않은채, SQL 문법과 DB 구조에 충분히 익숙해지기 위한 훈련을 했다. 조금 감을 잡고 나서는 쿼리 성능에 중요한 요소들이 어떤 것들이 있는지, 어떤 식으로 쿼리 최적화를 할 수 있는지 고민도 해보면서.

사실 SQL 스크립트를 작성하고 최적화하는 작업은 굉장히 지루한 작업이다. 그러나, 나의 오랜 학부 생활은(햇수로는 7년에 달한다…) 적어도 매우 중요한 한가지 가르침을 내게 남겨주었다. 항상 새로운 지식을 터득할때는 최초의 문턱을 넘기 위해 지난한 시간들을 견뎌내야 한다는 것. 그래서 조금은 우습지만, 나의 첫 커밋(commit)을 잠시 연기해두고 가장 기초가 되는 것들부터 차근차근 공부해나가기 시작했다. 마치 운동 선수들이 본격적인 시합에 앞서서 곳곳의 세밀한 근육들을 단련시키는 것처럼 🙂

By Eastsky Kang