Box and Whisker

Optimize the World

데이터 분석가를 위한 개발 공부

데이터 분석을 잘하기 위한 방법론 중에서 드류 콘웨이(Drew Conway)데이터 과학 벤 다이어 그램(the Data Science Venn Diagram)을 가장 많이 인용한다. 데이터 과학(data science)이라는 용어가 적절한지에 대해서는 이견이 많지만, 아래 그림이 좋은 분석 결과물을 만들기 위한 좋은 접근 방법이라는데 동의한다.

the Data Science Venn Diagram

<그림 출처: The Culture of Big Data>

통계학을 전공한 입장에서 위의 3가지 영역 중 가장 어려움을 느낀 부분은 Hacking Skills, 즉 개발이다. 개발 지식의 필요성을 깨닫고 나서는 해당 영역을 잘 알기 위해서 노력하였고, 여전히 그 과정에 있다.

왜 개발이 필요한가?

데이터 분석을 하면서 가장 좌절감이 들 때는 분석 결과가 보고서에서 끝나고 세상에 아무런 변화나 영향을 주지 못할 때다. 분석 보고서를 쓰고 실무자들과 회의를 하면, 매우 전형적인 반응은 “아주 흥미롭네요”, “재미있게 잘 봤습니다”, “분석 결과가 매우 인상적입니다”가 대부분이다. 이후 추가적인 실행은 없고, 세상은 전혀 바뀌지 않는다. 수 많은 재미있고 인상적인 분석 보고서는 회의실 책상 위에서 지적 여흥에 그치고 만다.

실행이 빠진 데이터 분석에서 탈피하기 위해서는 실행자를 설득하는 것이 가장 좋은 방법이다. “안 된다”, “못 한다”라는 개발 실무 부서의 대답을 극복하기 위해서는 최소한 그들과 이야기가 통해야 한다. 안 되면 왜 안 되는지, 못 하면 왜 못 하는지 물어보고 함께 해결 방안을 찾을 수 있어야 한다. 분석을 기획한 입장에서 개발 지식을 약간이라도 알고 있으면 해결 방안을 찾는데 큰 도움이 된다. “나는 분석을 담당하였으니 구현은 너희가 알아서 해라”는 태도로는 아무것도 바뀌지 않는다.

개발 조직을 움직이기 어렵다면 직접 실행할 수도 있다. 분석 결과가 세상에 영향을 미치도록 구현하는 작업은 생각보다 재미있다. 직접 무언가 만들어서 의도대로 작동하고 결과를 확인하는 즐거움이 크다. 과정의 재미도 있지만, 무엇보다 통계학보다 시작이 쉽다. 단언하건대, 개발 공부를 시작하는 것이 ‘통계학 입문’을 다시 수강하는 것보다 쉽다.

결국, 실행력을 확보하기 위해서 개발 공부가 필요하다.

어떻게 시작할까?

대학교에서 개발을 어떻게 가르치는지 살펴보니, 모두 CS101 과목에서 시작한다. CS101은 대부분 하나의 프로그래밍 언어를 정해서 핵심적인 문법과 이를 통한 문제 해결 과정을 가르친다. 한마디로 좋은 언어를 기본적인 수준에서 공부하는 것으로 개발 공부를 시작한다. 이 과정을 통해서 컴퓨터로 할 수 있는 일이 무엇이고, 이를 어떻게 코드로 표현하고 생각해야 하는지 공부한다. 우선 이 과정을 따르자.

첫 번째 언어는?

첫 번째 언어로 어떤 것이 좋은지 다른 주장들이 많은데, 파이썬(python)을 추천한다. 파이썬은 데이터 분석을 하기에 부족함이 없는 패키지들을 쓸 수 있고, 범용성이 좋아 분석 이외의 일반적인 개발에도 유용하다. 특유의 간결한 문법을 장점으로 꼽는 사람도 많다. 데이터 분석을 위해서 R을 많이 공부하지만, 개발 공부를 시작하기에 적합한 언어는 아니다.

참고: Python as a First Language

프로그래밍 10년 하기(Teach Yourself Programming in Ten Years)라는 글에서 언어 선택에 대해 3가지 조언을 하는데 아래와 같다.

그러므로 파이썬을 선택한다.

무슨 책을 볼까?

프로그래밍에 많은 경험이 없고, 특히 파이썬을 잘 모른다면 CS101 교재 수준의 책을 사서 보는 것이 좋다. 통계학 전공자의 경우에는 R을 조금 안다고 어려운 개발 교재부터 시작하면 중도에 포기할 가능성이 높다. 다 내려 놓고 기초부터 보자. 아래의 몇 권을 추천한다.

이외에도 좋은 입문서가 많다. 그러나 반드시 “파이썬 하루에 마스터하기”류는 피한다. 어차피 다른 책을 또 봐야하기 때문에 시간 낭비다.

IDE는 무엇을 쓸까?

IDE란 프로그래밍을 편하게 할 수 있도록 도와주는 소프트웨어다. 초심자가 처음부터 복잡한 IDE를 쓰면 많은 기능에 질릴 수 있다. 하지만 좋은 도구를 잘 골라서 익숙해지면 앞으로 범할 시행착오를 많이 줄일 수 있다. 추천하는 IDE는 PyCharm Edu 버전이다. 교육용으로 나와서 예제를 따라 하기 좋고, 초심자가 쓰기에 부담 없다. 너무 간략한 기능이 싫다면 PyCharm Community 버전을 사용한다.

IDE 선택은 개인의 취향에 따라 다르므로 좋아하는 방식이 있다면 마음대로 정해도 좋다. 공부를 계속하다보면 더 좋은 환경을 접할 기회가 많아지고 스스로 자신에게 맞는 개발 환경을 꾸미게 된다.

초보 탈출 다음에는?

위에서 소개한 책이나 교육 과정을 잘 따라 공부한다면 기본적인 프로그래밍이 가능해진다. 아마도 무언가를 만들어 보고 싶다는 생각이 들고, 공부를 시작하기 전에는 궁금하지 않았던 것들이 생겼을 것이다.

무엇을 만들어 볼까?

데이터 분석을 위해서 개발 공부를 시작했다면, 파이썬으로 데이터 분석을 시작해보는 것이 좋다. R도 있는데 굳이 파이썬으로 분석을 할 필요가 있을지 의문이 들지만, 나중에 실행 단계를 위해서는 파이썬으로 데이터를 다루는 경험을 해보는 것이 좋다. 우선 데이터를 다루는 방법에 대해서는 아래 책들을 참고한다.

실제 분석 예시를 그대로 따라하는 것도 많은 도움이 된다. 캐글(kaggle)‘Getting Started with Python: Kaggle’s Titanic Competition’을 참고할 수 있다. 타이타닉 문제로 여러 개의 튜토리얼 글이 있으므로 언어와 분석 방법론을 서로 비교해보는 것도 유용하다.

캐글의 Deep Learning Tutorial도 재미있는데, AWS를 활용하는 방법이 간략하게 소개되어 있다. 주된 방법은 ‘Using convolutional neural nets to detect facial keypoints tutorial’ 링크로 대체되어 있는데, 따라하면 되긴 된다. 튜토리얼을 따라할 때 경계할 점은 분석 방법론을 제대로 이해하지 못하고 그냥 코드만 복사하는 일이다. 알고리즘을 제대로 이해하지 못하고 따라하는 튜토리얼은 나중에 도움이 되지 않는다. 튜토리얼과 유사한 자신만의 문제를 찾아 대입해보면서 고민하는 과정이 꼭 필요하다.

프로그래머의 위기지학

김창준(@cjunekim)님의 ‘프로그래머의 위기지학’이라는 글을 보면 프로그래머가 무엇을 만들어야 하는지에 대한 좋은 대답을 얻을 수 있다. 실생활에서 느낀 불편함을 그냥 지나치지 않고, 아는 기술로 이를 개선할 수 있는지 고민해본다. 거창한 패키지나 어플리케이션을 만들지 않더라도 소소한 개발로 도움이 되는 무언가를 만들 수 있다.

데이터 분석도 마찬가지인데, 처음부터 세상이 깜짝 놀랄 통찰을 발견하지 않아도 된다. 평소에 느끼던 사소한 궁금증을 그냥 넘기지 않고 데이터로 확인하려는 시도를 하는 것이 좋은 시작이다. 뻔한 결과를 얻었더라도, 데이터로 그 뻔함을 드러냈으니 그것만으로도 족하다. 좋은 질문 없이, 시류에 따라 흉내내기만 반복하는 것보다는 실생활의 사소함에서 시작하는 분석이 공부에 더 도움이 된다.

파이썬을 더 잘하고 싶다면?

더 많은 경험을 하다보면 얼마나 모르는 게 많은지 깨닫게 된다. 이제 입문서가 아니라 더 깊은 내용을 담은 책을 공부할 필요가 있다.

프로그래밍 언어 외에 공부할 것은?

파이썬을 이 정도로 공부하다 보면, 파이썬이 문제가 아니라는 것을 깨닫는다. 프로그래밍 언어 하나로는 다 설명할 수 없다는 것을 알게 된다. 추가로 알아야 할 것이 참 많다.

영어

당연하지만 굳이 영어를 언급하는 이유는 번역본 읽기를 포기했기 때문이다. 세상 어딘가에서 누군가 가치 있는 생각을 해냈다면, 그 사람은 모국어가 무엇이든 상관없이 가장 먼저 영어로 그 생각을 적어서 퍼트린다. 이런 생각들이 책으로 정리되려면 한참의 시간이 걸리고, 그것들이 다시 번역되는 시간은 더 길다. 게다가 운이 나쁘면 절대로 번역되지 않는 책도 있다. 수 많은 웹 문서는 언급할 필요도 없다. 번역의 품질도 문제인데, 꽤 많은 기술서는 번역본이 더 어렵다.

번역서가 없을 때만 원서를 보는 것이 좋은 전략 같지만, 그 번거로움을 생각하면 번역서를 아예 고려하지 않는 것이 효율적이다. 번역서가 있는지 없는지 확인하고, 번역 품질이 괜찮은지 알아보고 나서 책을 읽는데는 꽤 많은 노력이 들어간다. 게다가 번역서 읽기를 포기하면 반대로 원서 독해 시간이 짧아진다. 처음에는 익숙해지는데 시간이 걸리지만, 약간의 시간이 흐르면 매우 수월해진다. 게다가 기술서는 문장 구조나 어휘가 아주 쉽다. 좋은 개발자가 되려면 영어로 된 기술서를 빨리 읽는 능력이 필요하다.

Git

요즘은 데이터 분석가들도 깃(git)을 쓴다. 심지어 대부분의 R 패키지들도 깃헙(github)을 통해 공유된다. 학교 숙제도 깃헙으로 공유하고 제출한다. 수 많은 오픈소스 프로젝트도 깃을 통해 만들어지고, 배포된다. 꼭 알아야 한다. 모르면 할 수 있는 것이 갈수록 적어진다. 깃이 뭐하는 건지 일단 Try Git으로 연습한다. 깃헙은 가이드에서 기본 개념을 익힌다. 뭔지 알게 되었다면, Pro Git 을 읽어본다. 그리고 모든 코드는 깃으로 관리한다.

리눅스

특별한 경우를 제외하면, 대부분의 개발은 리눅스(Linux) 환경이 편하다. 많은 개발자들이 맥을 쓰는 이유는 맥 OS가 리눅스와 상당 부분 유사하기 때문이다. 개발을 하면서 사용할 많은 도구들은 대부분 리눅스 환경 하에서 먼저 만들어진다. 또 리눅스에는 도구가 풍부하다. 리눅스를 깊이 있게 이해하지 못하더라도 command line interface에 익숙해질 필요가 있다. 아래 책을 추천한다.

리눅스에 상당한 관심이 생겼다면, 집에서 노는 컴퓨터에 우분투 데스크탑 버전을 설치해보는 것도 좋다. 가지고 놀면서 공부하다 보면 빨리 익숙해진다.

테스트 주도 개발

테스트 주도 개발(Test-driven development)은 개발자와 함께 일하면서 가장 놀란 개념 중에 하나다. 처음에는 매번 코드를 작성할 때마다 테스트 케이스를 만들고 테스트 코드를 작성하는 일이 참 무의미하게 느껴진다. 하지만 프로젝트가 오래 진행되고 연관된 모듈이 많아지기 시작하면 테스트가 없는 상황에서 무언가 수정하는 일은 거의 불가능하다. 지금은 테스트 없이 개발을 진행하는 것이 무서울 정도다.

실용적인 의미에서는 테스트가 훌륭한 보안 장치 역할을 하지만 실제로는 그 이상의 의미가 있다. 해야할 일을 미리 생각하고 범위를 정해서 조금씩 진행하면 큰 그림이 그려지고 전체 프로젝트가 완성된다. 이 과정이 테스트 덕분에 아주 부드럽게 진행된다. 짧은 글로 표현하기 어려운데, 아래 책을 꼭 읽어보고 실천한다. 훌륭한 개발자와 짝 프로그래밍(pair programming)을 할 기회가 있다면 많이 배울 수 있다.

작게 시작하고 빠르게 만들기, 그것을 반복하기

짝 프로그래밍을 하는 개발자(@alankang) 덕분에 배운 또 한가지 놀라운 개념이다. 몇 개의 문장으로 정리하기에는 참 많은 내용이 있지만, 특히 인상적인 점은 거대한 계획을 세우지 않고 작게 시작한다는 점이다. 소위 설계라는 것을 크게 하지 않고, 필요에 의해서 시작한다. 결과물을 밀어내는 방식이 아니라 수요에 의해서 끌어당기는 방식으로 일한다. 이런 작은 과정을 반복하면서 개발을 하면 매우 생산적이다. 짧은 문장으로만 표현하면 참 별 거 없지만, 이런 생각으로 실제 개발 프로젝트를 수행해보면 그 놀라움을 느낄 수 있다.

애자일 개발론(agile software development)의 일부인데, 아직 애자일을 이야기할 정도로 이해가 깊지 않다. 사상을 이해하는 것이 중요하다. 어떤 부분에서는 기술보다 어떤 원칙으로 일을 진행할 것인지가 결과물에 더 큰 영향을 미친다. 이 부분은 더 공부할 부분이다.

자료구조와 알고리즘

조금 어려운 기술서를 읽다보면, 항상 저 두 단어가 반복해서 등장한다. 몰라도 당장 무언가 만드는데 지장은 없지만, 항상 궁금하다. 공부하는데 상당히 오래 걸리고 노력도 많이 필요한 주제지만, 한 번은 봐야할 부분이다. 좋은 책을 찾느라 상당히 고생했는데, 아래 책이 가장 추천할 만하다. 아직 다 읽지 못했는데, 새로운 알고리즘이 나올 때마다 상당히 놀라고 있다. 똑똑한 사람 참 많다.

갈림길

개발 공부가 재미있어지면, 두 가지 고민이 생긴다. 지금 유행하는 최신 기술들을 공부하고 적용해서 좋은 사례를 만들고 싶다는 생각이 든다. 혹은 아직 잘 모르는 기본 지식을 더 공부하고 싶기도 하다. 둘 다 하는 게 맞지만, 현실적으로 시간이 부족하다. 게다가 경험이 적다는 것은 큰 장애 요소다. 지금까지 소개한 책을 아무리 잘 이해해도 경험 많은 훌륭한 개발자들과 함께 일하면서 배울 수 있는 것은 항상 그 이상이다. 이런 사람들은 이미 알고 있는 것이 많은데, 이런 과정을 생략하고 최신의 무엇을 살펴보는 게 시기상조라는 생각이 든다.

통계학 공부를 주로 했던 사람이 개발 공부를 해서 무언가 더 좋은 것을 만들려면, 두 지식을 함께 쓸 수 있는 방향이 이상적이다. 이런 융합이 일어나기에 적합한 곳은 아마도 잘 변하지 않는 기본 지식이 아닐까 싶다. 게다가 개발 관련 지식은 하루가 다르게 확장된다. 지금 이를 모두 습득하려고 노력하기에는 통계 공부할 시간이 없다. 유행을 따르지 않고 앞으로도 중요한 개념을 먼저 공부하는 것이 맞다는 생각이 든다.

언제나 강조해도 지나침이 없는 것은 기본이 중요하다는 점이다.