Browse Month

7월 2016

레저큐 인턴기 3편 – EastskyKang 님이 leisureq/gajago에 push했습니다.

가자고는 매우 복잡하고 방대한 소프트웨어 시스템이다. 전체 소스코드가 500만 줄에 달하고 서브시스템(sub-system)이 5개가 넘는다. 아무리 뛰어나고 생산성이 높은 개발자라고 하더라도 이렇게 크고 복잡도가 높은 소프트웨어를 혼자서 개발할 수 없을 것이다.

가자고 팀에는 6명의 개발자가 있고, 이들이 협업하며 동시에 가자고 프로젝트를 개발한다. 그런데 여기서 잠깐 생각해보자. 도대체 어떻게 협업해서 소스코드를 작성하는걸까? 개발해야 하는 프로젝트는 하나인데 작업을 하고 있는 개발자는 여러명이다. 제일 먼저 상상할 수 있는 방법은 아마, 아래와 같은 모습일 것이다.

개발자 A와 B가 동시에 어떤 시스템을 개발하고 있는데 이들이 각자 다른 부분을 수정하고 있다. 이 프로젝트는 굉장히 잘 모듈화되어있고, 개발자들은 굉장히 전문화되어서 분업이 잘 이뤄지고 있다. 이들은 업무 시간 동안 열심히 코딩을 하고, 각자 수정한 부분을 퇴근하기 전에 합치는 작업을 수행한다. 야근이 잦지만 뭐, 아직까지는 양호하다.

쉽게 상상할 수 있는 그림이다. 그런데 문제가 생겼다.

어느날 개발자 A와 B가 실수로 동시에 같은 부분을 수정했다. 이때부터 문제가 생긴다. 아무리 비슷한 실력의 개발자더라도 생각하는 방식과 코딩 스타일이 크게 다르다. 이 둘은 서로 ‘충돌’이 난 부분을 모여서 같이 고치기 시작했고, 각자가 ‘같은 일’을 하도록 짠 코드가 완전히 다르게 작성되었다는 것을 깨달았다. 기억을 더듬어 일일히 수정한 코드를 한줄한줄 비교해봐도 어떻게 코드를 합치는 작업을 해야할지 결정하기가 쉽지 않다.

불쌍한 개발자 A와 B가 밤샘 작업을 통해서 수정하고 합치는 작업에 성공했다고 해보자. 그러나, 만약 개발자가 2명이 아니라 5명으로 늘어난다면 어떨까? 전체 시스템의 코드가 100만, 1000만 줄에 육박한다면 어떨까?

panic
다 망해버려라! (이미지 출처: http://www.itworld.com)

개발자의 영원한 친구 Git과 GitHub

다행히도 세상에는 버전 컨트롤 시스템(Version Control System)이라는 훌륭한 것이 존재한다. 이름에서 유추할 수 있듯이, 개발자가 작성한 소스코드의 버전을 관리하고 협업을 가능하게 해주는 시스템이다. Git이나 Subversion, Mercurial 등이 여기에 속한다.

가자고는 근래의 많은 개발 프로젝트들이 그렇듯이, Git이라고 불리는 VCS를 사용하고 있다. 참고로 Git은 Linux의 아버지, Linus Torvalds가 발명한 것이다. 리눅스 커널(리눅스 OS의 핵심부)을 개발할 때 전 세계 수많은 개발자들의 협업과 배포 버전 관리를 할 수 있는 방법이 필요했는데 적당한 방법을 찾지 못해 짜증이 난 Torvalds가 무려 2주만에 Git을 개발했다고 한다.

linus_torvalds_nvidia_fxxk_you
현존하는 가장 위대한 프로그래머, 오픈소스계의 영원한 아이돌, Linus Torvalds. (Linus Torvalds를 구글에 검색하면 제일 위에 이런 사진이 뜨는데 어떤 상황이었는지는 이 글을 참조…)

마이크로소프트 (악의 제국…) 페이스북, 트위터, 모질라 등 굵직굵직한 기업과 단체에서 Git을 사용하고 있다. 뿐만 아니라 전 세계의 수많은 개발자들, 학생들도 Git을 이용해서 소스코드를 관리한다.

Git의 방식은 프로그래머가 소스코드를 수정하고나서 ‘커밋'(commit)을 하면, 그 때까지의 수정 기록들을 커밋 단위로 모두 저장하는 것이다. 따라서 열심히 수정한 소스코드가 날아가버릴까봐 걱정할 필요도 없고, 지금 작업한 것을 버리고 예전 버전의 소스코드로 되돌리는 것도 자유롭게 할 수 있다. 뿐만 아니라, 버전을 분기시켜서 별도로 관리할 수도 있다. 커밋을 줄줄이 이어놓은 것을 하나의 ‘브랜치'(branch)라고 하는데 이 branch를 새로 분기시켜서 새로운 버전의 소스코드를 작성하는 것이다.

git_branch
Git branch. Git에 대해서 더 자세히 알고싶다면 여기 혹은 여기을 참조하시길… (이미지 출처: git-간편안내서)

여전히 풀리지 않는 의문이 하나 있다. Git을 써서 소스코드의 버전을 관리하기 좋다는 것은 알겠는데 어떻게 여러명의 개발자들이 Git으로 협업을 할 수 있는 걸까? 이런 의문에 대한 답이 Git 원격저장소(Git remote)라고 불리는 기능이다. 쉽게 말하면 서버나 클라우드 어딘가에 Git 저장소를 만들어놓고 여러명의 개발자들이 접근 할 수 있도록 하겠다는 것이다. 이런 Git 원격저장소를 호스팅하는 서비스가 여러군데 있는데 이 중에서 제일 유명한 것은 당연 자유소프트웨어의 성지(?)라고 불리는 GitHub이다.

github_logo
깃허브의 로고. (문어고양이…?) 깃허브는 social coding을 표방한다. 개발자들이 사진이나 글 대신에 소스코드를 공유하고 같이 협업하는, 즉 개발자들의 SNS이다.

GitHub는 개발자들이 무료로 git 저장소를 만들고 접근할 수 있도록 해준다. 다만 전제조건이 있는데, 무료 저장소는 모든 유저들이 볼 수 있도록 공개로 해놓아야한다. 이런 특성 때문에 많은 오픈소스 프로젝트들이 GitHub를 이용해서 git 저장소를 호스팅한다. 참고로 2016년 기준으로 가장 인기 있는 github 오픈소스 저장소는 트위터에서 만든 웹 UI 프레임워크 bootstrap, 구글의 angular.js, 페이스북의 react 등이다.

가자고도 GitHub를 이용하는데 우리의 소중한 소스코드를 누구에게나 공개할 수는 없기 때문에 GitHub의 기업용 유료계정을 통해 Git 저장소를 비공개로 관리하고 있다. 각 개발자들은 GitHub에 올라가 있는 Git 저장소를 자신의 개발머신에 ‘복제'(clone) 하고 자신의 커밋을 GitHub 저장소로 ‘푸쉬'(push) 하는 식으로 공동작업 한다. 이 과정에서 ‘풀 리퀘스트'(pull request)라는 기능을 사용하기도 하는데, 간단히 말하면 개발자가 자신이 개발하려는 기능을 아예 새로운 브랜치 에 만들어놓고 코드 리뷰를 요청하는 것이다. 이 브랜치는 프로젝트의 ‘마스터 브랜치'(master branch: 프로젝트의 기본 브랜치. 보통 실 서버에서 운영하고 있는 어플리케이션의 코드에 해당)와는 별도로 운영되기 때문에 코드 리뷰를 한 사람이 머지하기 전까지는 서비스에 아무런 영향을 끼치지 않는다.

github_gajago_repository
GitHub에 올라가 있는 가자고 저장소. 얼마전에 1주년을 맞이했다.

EastskyKang pushed to master at leisureq/gajago

나도 Git와 GitHub를 꽤 오래 전부터 써오고 있었다. 다만 지금까지 협업을 할 만큼 복잡한 시스템을 개발해 본 적이 없었기 때문에 늘 Git 저장소를 혼자서 썼을 뿐이다. 앞에서 얘기했듯이 혼자서 쓰더라도 Git과 GitHub는 굉장히 훌륭하다. 적어도 아래 그림과 같은 상황은 생기지 않는 것이다.

version_management_failured
최종…최종…최종… 버전관리 실패의 예 (이미지출처 : http://slowalk.tistory.com/)

하지만 역시 Git과 Github의 진가는 여럿이서 동시에 개발을 할 때 발휘된다. 특히 Git을 효과적으로 쓸 수 있게 해주는 몇가지 툴을 함께 사용한다면 여러명이서 동시에 개발하면서 발생할 수 있는 비효율(위에서 우리의 개발자 A와 개발자 B가 겪었던…)을 거의 느끼지 않고 협업을 할 수 있다. 심지어 각자가 고친 소스코드를 리뷰하고 함께 고민하는 과정에서 자연스러운 성장을 경험하기도 하고, 이전에는 찾을 수 없었던 문제들을 발견해내어 고치기도 한다. 1+1 = 1.5 였던 것이 1+1 = 3 정도가 되었다고나 할까…

나의 첫 커밋은 회사에 입사한지 정확하게 4일 뒤에 이루어졌다. 수정한 코드 라인은 정확하게 1줄… 고작 이 한줄을 고쳤을 뿐인데도 혹시나 내가 수정한 코드 때문에 서비스에 장애가 날지도 모른다는 걱정에 덜덜 떨면서 커밋을 했던 기억이 난다. (물론 모바일 앱의 개발에 필요한 플러그인을 추가해준게 다라서 뭔가 문제가 있었더라도 아무일도 일어나지 않았을 것이다 ^^;)

first_commit
가자고 저장소에 등록된 나의 첫 커밋. 수정한 줄수는 정확히 한줄.

6개월이 지난 지금, GitHub에 기록된 EastskyKang의 커밋은 총 197번. 대략 20000 줄의 코드를 추가하거나 수정했고, 수정의 범위도 예전에 비해서 훨씬 넓어졌다. 참으로 장족의 발전이 아닐 수 없다 🙂

이제는 매일같이 브랜치를 새로 만들고, 코드를 수정해서 풀 리퀘스트를 만들고 이슈와 코멘트를 남기고 브랜치들을 머지하고 있다. 때로는 고급 Git 기능들을 이용하기도 한다. 하지만 이 기간동안 내가 배운 것은 단순히 프로젝트를 이해하고 Git을 쓰는 법을 배운 것 뿐이 아니었다. 이 과정에서 자연스럽게 여러명의 개발자들과 협업하고 같이 프로젝트를 발전시켜가는 방법을 배울 수 있었다.

협업은 혼자서는 절대 할 수 없었던 일들을 가능하게 해준다. 특히 개발 프로젝트에서의 협업은 때로 1+1 > 3 의 기적을 만들어내기도 한다. 개발자들은 항상 어떻게 해서 협업의 효율성을 높이고 협업의 생산성을 높일지 늘 고민한다. Git과 GitHub도 그런 개발자들의 문화와 오랜 고민에서 탄생한 결과물이라고 할 수 있을 것이다.

협업의 중요성과 더 나은 협업에 대한 고민, 내가 가자고 팀에서 인턴을 하면서 얻을 수 있었던 가장 소중한 배움이다.

by EastskyKang

레저큐 인턴기 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

레저큐 인턴기 1편 – 시작하며

시작은 거창하게

This is just the beginning, the beginning of understanding that cyberspace has no limits, no boundaries.
이것은 시작일 뿐입니다. 사이버 세상은 한계도, 경계도 없다는 것을 이해하게 되는 시작 말입니다.

Nicholas Negroponte, co-founder of MIT Media Lab.

할일이 없으면 생각이 많아진다. 오늘이 그랬다. 무던히도 더웠고 마침 아무런 계획 없는 일요일이라 빈둥거리다 문득 이런 생각이 들었다. ‘우와! 우리는 정말 신기한 시대에 살고 있구나!’ 이게 갑자기 무슨 소리인가 싶지만 오늘 하루 있었던 일을 떠올려보면 이런 생각이 드는 것도 무리가 아니다.

  1. 아침. 지구 반대편, 스위스에 있는 선배와 마치 옆에 있는 것처럼 실시간으로 카카오톡 메시지를 주고 받는다.
  2. 점심 무렵. 넷플릭스로 영화 한편을 본다. 미국 대통령 암살 사건에 대한 영화인데 이거 완전 내 스타일이다. 어떻게 골랐을까? 그냥 넷플릭스가 이걸 보라고 추천해주고 아이패드에 끊김 없이 영화를 전송(스트리밍)해주기까지 했다.
  3. 무더운 오후. 날씨가 너무 덥다고 생각하며 온라인 쇼핑몰에서 흰색 반팔 티셔츠를 하나 구입한다. 클릭 몇번으로 마음에 드는 티셔츠를 선택하고 결제까지 완료했다. 아마 내일이나 늦어도 모레 쯤 우리 집 앞에 택배로 도착할 것이다.
  4. 저녁 즈음. 음악을 듣다가 곡에 대해서 궁금해져서 구글에 검색을 한다. “구프타프 말러, 교향곡 6번”. 고급 정보가 주르륵 쏟아진다. “말러 교향곡 중에서 고전적 형식미와 혁신적인 요소들을… 불라불라” 수 분 내에 나는 말러의 인생과 그의 교향곡들에 대해 전문가가 된다.
  5. 하루 종일. 언제나 그렇듯, 페이스북을 공연히 들락날락 거리며 친구들의 여름 휴가 사진을 흘깃흘깃 훔쳐본다. 아 부럽구나 나도 어디론가 떠나고 싶다 생각하며.

20~30년 전만 해도 누가 알았겠는가, 이런 세상이 오게 될지. 남녀노소 가릴 것 없이 전세계 모든 사람이 현실 세계와 인터넷 세계, 두개의 평행 세계에서 살아가고 있다. 하나의 세계에서 살아가는 것만 해도 충분히 터프한 일인데 사람들은 두개의 세상에서 동시에 살아가는 고달픔을 마다하지 않는다. 왜 그런가? ‘인터넷 세계의 나’가 전지전능하기 때문이다. 수만 km 를 날아 지구 반대편 사람과 대화를 할 수 있고 쇼핑몰에 갈 필요 없이 마음에 드는 물건들을 살 수 있다. 심지어 가만히 앉아만 있어도 내 어리석은 친구들은 스스로 자기가 뭘하고 있는지, 어떤 생각을 하고 있는지 주기적으로 보고를 해준다. 오늘은 어느 카페에 가서 어느 원산지의 커피를 마셨다느니, EU를 탈퇴한 영국 때문에 주식이 망했다느니, 유로 2016 결승컵은 누구에게 돌아갈지 궁금하다느니…

facebook-graph-network
초연결사회이다. 지구 상의 모든 인류가 인터넷을 통해 서로 연결되어 있다.

인터넷 그리고 웹 프로그래머

이게 전부 다 인터넷이란 것 덕분이다. 그런데 놀랍게도 인터넷은 만들어진게 채 30년이 되지 않는다. 우리가 인터넷이라고 부르는 WWW(World Wide Web – 월드와이드웹)은 유럽 입자 물리 연구소의 컴퓨터 과학자인 팀 버너스 리(Tim Berners-Lee)에 의해 1989년에 개발되었다. 처음에는 학자들이 서로 빠르게 학술 정보를 교환할 수 있도록 하기 위해서 이런 세계를 고안했다고 한다. 어째 이런 고상한 기술을 친구들이 어떤 디저트를 먹었나 훔쳐보는 용도로 사용하고 있는 내 자신이 비참하게 느껴지긴 하지만 우리는 닐 암스트롱을 달에 보낼 때 사용했던 컴퓨터보다 몇 배 더 좋은 컴퓨터를 쓰고 있고 그 컴퓨터로 앵그리버드를 쏘아 보내며 살고 있는 세대가 아닌가. 원래 세상은 그런것이라고 위안을 해본다.

angry-bird
우리는 NASA의 과학자들이 닐 암스트롱을 달에 보낼 때 썼던 컴퓨터보다 몇 배는 더 좋은 컴퓨터로 앵그리버드를 날려 보내고 있다.

여하튼 WWW이 탄생하고 나서 얼마후 세상에 웹 프로그래머 라고 불리는 사람들이 나타났다. 이들은 스스로를 해커(Hacker)라고 부르며 인터넷 세상에 무엇인가를 뚝딱뚝딱 만들어내는 신기한 사람들이다. 채 30년이 지나지 않아서 이들은 WWW 세계에 검색엔진, 온라인 쇼핑몰, 소셜 네트워크라는 어마어마한 것들을 만들어 낸다.

웹 프로그래머들의 능력은 대단하다. 요새는 한명의 웹 프로그래머가 하루 밤 사이에 웹 사이트 하나 만들어 내는 것은 일도 아니다. 더 신기한 것은 이들은 심지어 자기가 만든 것을 인터넷 세상에 공짜로 공개하기까지 한다는 것이다. “누구나 가져다 쓰시오. 발전 시킬 수 있다면 더 좋음.” 자본주의 논리로는 쉽게 이해할 수 없는 행동이다. 왜 이런 짓을 할까? 요약하자면 내가 만든 것을 다른 사람들과 같이 쓰면 더 나은 것으로 발전시킬 수 있기 때문이다. ~~사실 어차피 돈은 다른 방법으로 벌 수 있다~~

이젠 이들의 엄청난 능력과 특별한 문화가 ‘일반인’들에게도 별로 낯설지 않다. 요새는 일반인들도 전공과 무관하게 금방 해커가 된다. 오픈소스와 클라우드, 그리고 인터넷 세상에 널려있는 수많은 정보들을 이용하면 생각보다 그리 어렵지 않다. 해커가 해커를 만들어내고 또 다시 그 해커들이 새로운 해커들을 만들어낸다. 언제까지? 세상 사람들 모두가 해커가 될 때까지.

새옹지마

사실 10년 전만 해도 이 정도는 아니었다. 대학 입시를 앞두고 있었던 2008년 쯤, 어느 과에 지원해야 하나 하는 깊은 고민에 빠져 있는 내게 컴퓨터 과목 선생님이 하신 말씀이 아직도 기억에 생생하다. “어디를 가도 다 괜찮아. 그런데 컴퓨터과는 가지마. 여긴 3D야.” 그 때만 해도 컴퓨터 공학의 위상은 이랬다. 이 분야는 소수의 재능있는 친구들의 영역이었고 나와 같은 범인들에게는 위험하고, 지저분하며, 고통스러운 분야였다. 2009년에 나의 모교를 졸업한 150명 정도 되는 학생들이 이공계열 대학으로 진학 했는데 그 중에 컴퓨터 공학과로 진학했던 사람은 손에 꼽힐 정도로 적다.

지금은 어떨까? 서울대학교 컴퓨터공학부의 정원이 50명 남짓인데 모든 전공 과목마다 150명이 들어갈 수 있는 대형 강의실들이 꽉꽉 들어찬다. 컴퓨터공학 학생들 50명에 복수전공, 부전공 학생 50명, 그리고 타과생 50명이 같이 수업을 듣기 때문이다. 강의실이 좁아서 수업을 하기가 쉽지 않다는 교수님들의 투정이 그냥 투정으로만 들리지는 않는다. 심지어 갑자기 개설해야하는 전공과목 숫자가 늘어나서 강의할 교수님이 부족하다는 얘기까지 들린다. 미국, 유럽, 중국… 어딜가나 컴퓨터공학(혹은 컴퓨터과학)과가 가장 인기가 많다. 참으로 글로벌하게, 인생사 새옹지마가 아닐 수 없다.

컴퓨터 공학의 위상이 이렇게 변한것은 지난 10년 동안 컴퓨터 기술과 IT 산업이 엄청난 속도로 발전했기 때문이다. 컴퓨터 과학의 발전과 함께 프로그래머란 사람들이 어마어마한 일들을 저질렀고 그들이 세운 구글, 페이스북, 마이크로소프트, 애플 같은 회사는 전세계에서 가장 덩치가 큰 회사들이 됐다. 전 세계에 스타트업 열풍이 불고, 프로그래머들의 몸값이 높아지고 있다. 새벽녘 드럼통에 개발자들이 불 피워놓고 기다리고 있으면 봉고차에서 “여기 자바 2명!” 라고 외치는 시대는 확실히 지나갔다.

yogi-java-du-myung!
IT 산업의 흑역사: 여기 자바 2명 타요!

멀리 돌아서

나는 2013년에 컴퓨터공학 복수전공을 시작했다. 여러가지 이유가 있었지만 사실 컴퓨터 공학을 공부하게 된 동기 중에 하나는 인터넷 세상에 대한 호기심이었다. 웹 기술과 소프트웨어 공학이 만들어낸 이 엄청난 변화, 도대체 어떻게 이런 일이 가능한 것인지에 대한 궁금증, 그리고 나도 해커들 같이 강력한 ‘힘’을 가진 사람이 되면 좋겠다는 생각. 그 때는 그 시작이 컴퓨터 공학을 공부하는 것이라고 생각했다.

그러나 꿈과 현실은 늘 다르다. 학교에서 열심히 공부를 한다고 해서 그런 능력을 얻을 수 있는 것은 아니라는 것을 깨닫는데 그리 오랜 시간이 걸리지 않았다. (그렇다고 후회를 한다는 것은 아니다! 나중에 여기에 대해서 좀 더 자세히 얘기해볼까 한다.) 열심히 공부했지만 마지막 학기가 되기까지 그 동기를 충족시킬 만한 변화를 찾기는 힘들었다.

그래서, 졸업하기전 마지막으로 새로운 도전을 한 번 더 시작하기로 했다. 스타트업에서 웹 프로그래머의 삶을 경험해보자! 웹 프로그래밍에 대해서 배우는데 웹 프로그래머로 일하는 것 보다 더 좋은 방법이 어디있겠는가? 갑자기 새로운 흥분이 느껴졌다. 오 이제야 말로 나도 이제 해커들의 세계로 들어간다! 근데 한가지 문제가 있었다. 나는 코딩 실력도 형편 없고 웹 프로그래밍의 웹자도 모른다는 것이었다. 아니 세상에 컴퓨터공학을 전공한다면서 코딩도 능숙하지 않다니 도대체 학교에서는 무엇을 가르친단 말인가? 라고 생각할 수도 있다. 근데 원래 그렇다. 컴퓨터 공학을 공부한다는 것이 프로그래밍을 잘하게 된다는 것을 의미하지는 않는다.

여하튼, 방황하고 있던 그 때에 이 미천한 공학도에게 한 회사가 기회의 손을 내밀었다.

다시 본론으로

레저큐는 여행 레저 전문 이커머스(e-commerce) 서비스 가자고를 운영하고 있고 빠르게 성장하고 있는 IT 스타트업이다. 복잡한 웹 시스템을 어떻게 구축하고 운영하는지 경험할 수 있고, 무엇보다도 복잡한 오프라인 비지니스 로직을 어떻게 인터넷 세계의 소프트웨어로 구현해낼 수 있을지 고민할 수 있는 기회를 가질 수 있다는 점에서 새내기 프로그래머에게 최고의 직장이다.

사실 무엇인가를 처음부터 시작해야한 다는 것은 꽤나 고통스러운 일이다. 2016년 1월에 레저큐 가자고 팀에 합류하고 나서, 밑바닥부터 공부를 해야했다. 지루하고 힘들었지만 비로소! 이 과정에서 내가 기대했던 것들을 배울 수 있었다. 웹이란 것이 대체 무엇인지, 웹 프로그래밍은 어떻게 하는 것인지, 프로그래머의 삶이란 것이 어떤 것인지, 성장하는 스타트업은 어떤 문화를 가지고 있는지.

어느새 6개월이 지났다. 기술적으로 성숙하기엔 충분하지 않은 시간이다. 하지만 그 동안 겪었던 일들, 가졌던 생각들을 간단하게 정리해보려고 한다. 새내기일 때의 시각과 감상은 ‘헌내기’의 그것보다는 미숙하고 무딜테지만 나름의 풋풋함과 신선한 시각들을 담고 있을 것이므로.

독자가 아무도 없다고 해도 사실 별 상관 없다. 이 글을 쓰면서 내가 얼마나 성장했는지 확인하고, 또 앞으로 나는 엔지니어로서 어떻게 살아가야 할 것인가를 차분히 고민해보게 될 것이다. 여느 때와 조금 다르게 글을 쓴다는 것이 가슴 설렌다.

By Eastsky Kang