* 개발 = 상상을 실현하는 힘(https://brunch.co.kr/@wedump/15)
2017년 스터디 모집글을 작성한 바 있다. 모든 구성원들과 끝까지 함께하지는 못 했지만 개인적으로는 다행하게도 거의 처음 계획대로 마무리되었다. 처음에는 수학에 대한 공부를 했었는데 책을 두어 권 볼쯤에는 조금 지루해하는 분위기가 있었다. 이런 과정에서 한 가지 중요한 사실을 깨달았다.
당장 필요한 것만 공부하자
개발이나 머신러닝 공부를 시작하는데 수학이 필요하다고 해서 바로 수학 공부를 하는 것이 아니라 핵심이 되는 부분을 공부하고 수학이 필요한 부분이 오면 그때 가서 공부해도 늦지 않는다. 그렇지 않으면 정작 하고자 하는 부분에 다가가기도 전에 지쳐서 포기하게 될지도 모른다. 그나마 나는 수학과 친해지는 효과를 얻었기 때문에 만족하고 있다.
위에서 깨달은 바에 이어 덧붙이자면 개발 공부는 만들고 싶은 것을 먼저 정하고 그것을 만들면서 필요한 부분을 하나씩 공부해서 해결해 나가는 방법이 더 몰입하는데 도움이 된다. 당장 필요한 것을 능동적으로 만들어 공부거리를 생산하는 것이다.
먼저 만들자. 그리고 공부하자
위와 같은 성찰을 얻은 바, 나는 만들고 싶은 프로젝트를 상상하고 그것을 만들기 위해 필요한 부분을 공부해 나가기로 마음먹었다. 더불어 지금까지는 장난감 정도에서 마무리했던 개인 프로젝트를 기업에서 사용할 수 있는 정도의 오픈소스 프로젝트로 진행하려고 한다. 프로젝트가 성숙하는 데에 적어도 3~4년을 생각하고 있다.
자, 그러면 이쯤에서 내가 계획하고 있는 오픈소스 프로젝트에 대한 소개를 하려고 한다. 프로젝트는 처음 만드는 온라인 게임에서 말한 것처럼 나의 개발 철학인 눈덩이 개발 방법론과 Native 지향을 사용하여 진행될 것이다. 사실 Native 지향은 사람마다 의견이 다를 수 있는데 자동차를 이용해 여행을 가고 싶은 사람은 자동차를 운전하는 방법을 배우면 될 것이고, 자동차를 만드는 자동차 엔지니어가 되고 싶은 사람은 엔지니어링 공부를 하면 될 것이다.
* 처음 만드는 온라인 게임 01(https://brunch.co.kr/@wedump/4)
현실에서는 각 분야의 전문가들이 함께 협력하여 전혀 새로운 분야의 문제를 해결하기도 한다. 예를 들어 기업에서 사람들의 일상을 조금 더 편하게 해주는 어떤 모바일 서비스를 개발한다면 개발 전문가, 기획 전문가, UI 제작 전문가, 영업 전문가, 마케팅 전문가 등 여러 분야의 전문가들이 협력하며 상호작용하여 새로운 서비스를 만들 것이다. 나는 이것을 메타포로 삼고 개발 분야에 적용하여, 여러 종류의 엔진을 만들고 이 엔진들이 서로 상호작용하여 어떤 것이든 만들어 낼 수 있는 시스템을 구축하려고 한다. 즉 범용적인 도메인에 적용할 수 있는 엔진 시스템이다.
왜 하필 엔진일까 하는 생각을 할 수 있는데, 엔진의 기본적인 정의는 '특정 도메인에서 자주 사용되는 알고리즘을 라이브러리화해서 묶은 것' 이라고 할 수 있기 때문이다. 물론 더 복잡한 기능이 추가된 엔진들도 많지만 기본 개념을 보자면 위에서 말한 메타포의 전문가에 해당하는 것이 바로 엔진이다.
나는 가장 기본이 된다고 생각하는 4가지 종류의 엔진을 개발하고, 이들을 통합/관리해주는 중앙 시스템을 둘 생각이다. 여러 전문가들이 회사라는 조직 아래에서 정해진 규칙을 따르고, 같은 목표를 향해 나아갈 수 있는 것과 마찬가지이다. 즉, 여기서 말하는 회사가 곧 중앙 시스템이다. 어떻게 보면 이 중앙 시스템도 전문가 관리의 전문가라고 할 수 있겠다.
지금까지 이야기한 내용을 간단히 도식화하면 다음과 같다.
예쁜 꽃 한 송이가 되었다. 자, 이제 각 분야의 전문가들을 채용할 시간이다. 위에서 4가지 종류의 엔진을 제작한다고 했었다. 엔진 목록은 아래와 같다.
1) Physics Engine
2) Rendering Engine
3) AI Engine
4) Search Engine
위 4가지 엔진을 선별한 이유는 내가 눈에 보이는 지능적인 결과물을 선호하기 때문이다. 또한 앞으로 많은 서비스들은 인공지능과 VR/AR 기술이 결합하여 만들어질 것이라고 예상된다. 이 기본적인 4가지 엔진의 결합이라면 무엇이라도 만들어 낼 수 있을 것 이란 생각이 든다. 내가 생각하고 있는 결과물 중 하나인 창조 게임의 예를 보자.
1) 말이나 문장 등으로 창조하길 원하는 내용(A)을 입력받는다.
2) AI 엔진이 자연어 처리를 통해 입력의 내용을 인식한다.
3) 검색엔진이 크롤러를 통해 축적한 데이터에서 A에 대한 검색을 실시한다.
4) AI 엔진이 검색된 내용을 바탕으로 A의 특성을 분석하고 알맞은 AI 레이어를 구축한다.
5) 물리엔진이 분석된 특성에 따라 자연 현상을 적용한다.
6) 렌더링 엔진이 이를 실체화한다.
7) 이 모든 과정을 통해 최종적으로 A에 생명을 부여하여 실체화한다.
예를 들어 보자, 홀로렌즈 등의 AR 기기를 착용하고 '시바견'이라고 말하면, 내 앞에 살아 움직이는 시바견이 나타난다. 또한 나와 상호작용하며 마치 실제 살아있는 동물처럼 느껴진다.
이쯤에서 '엔진까지 직접 만들어야 돼? 시바..' 라는 말이 나올지도 모른다. 나는 왜 직접 만들려고 하는 것일까? 첫 번째 이유는 앞에서도 이야기가 나왔지만 내 목적은 자동차를 운전하는 것을 포함한 자동차를 만들 수 있는 엔지니어가 되는 것이기 때문이다. 한마디로 단순히 창조 게임을 만드는 것이 전부가 아니라는 이야기다. 두 번째 이유는 여러 엔진이 서로 상호작용하며 협력해야 하기 때문에 기존 엔진들이 어떤 공통된 인터페이스를 따라야 하는데 그렇지 못하기 때문이다. 직접 만드는 것이 하나부터 열까지 전부 자신이 설계한 방향으로 프로젝트를 이끌 수 있어 더 재밌다.
하지만 문제는 역시 난이도다. 여러 엔진들을 만든다니, 참 답이 안 나올 수도 있다. 그래서 전략이 필요하다. 첫 번째는 처음에 언급했던 눈덩이 개발 방법론이다. 아주 간단한 기능만의 코어 버전을 만드는 것을 목표로 하고, 이후 차근차근 시간을 들여 성숙시켜나가는 것이다. 우리가 흔히 알고 있는 유명 오픈소스 프로젝트의 첫 커밋 버전을 보면 의외로 굉장히 간단하다. 나라도 만들 수 있을 것 같다는 생각이 들기 시작한다. 시작은 미약하나 그 끝은 창대하다고 했던가, 한 번에 너무 많은 기능을 넣으려고 한다면 중간에 포기할 수밖에 없다.
눈덩이 개발 방법론을 사용한다고 하더라도 엔진을 만드는 것은 쉽지 않다. 당연히 공부를 해가며 만들어야 한다. 공부를 하긴 하지만 조금 더 쉽게 시작할 수 있는 방법은 없을까? 우선 처음 한 발을 잘 들여놓으면 그 후 시간이 지남에 따라 점차 내 지식수준도 올라갈 것이고, 프로젝트의 상대적인 난이도는 낮아질 것이다. 나는 다음과 같은 전략을 사용하기로 했다.
베이스캠프 전략
베이스캠프는 산을 오를 때 지리적으로 조건이 좋은 지점에 설치하는 고정 시설을 말한다. 정상이라는 목표를 향해 도전하는 이들에게 어디로 가야 할지 알려주는 방향이 되고, 어떻게 가야 할지 알려주는 지도가 되어준다. 도중에 악천후 등으로 문제가 생긴다면 다시 돌아올 수 있는 곳 이기도 하다.
당장은 지식과 실력이 부족하여 공부를 하면서 코드를 구현해 나가야 하는데 조금 어렵다면, 책의 저자들이 만들어 놓은 예제 코드를 베이스 코드로 하여 시작해보면 어떨까. 베이스캠프 전략은 다음과 같은 순서로 진행된다.
1) 처음에는 내가 공부해서 이해한 내용만 예제 코드를 따라 해 보며 구현해 본다.
2) 책 한 권을 마무리하면 예제 코드로 이루어진 한 벌의 베이스 코드가 탄생한다.
3) 원하는 개발 결과물을 만들면서 필요한 기능을 추가하고, 적합하지 않거나 잘못된 부분을 수정하고, 코드의 설계 구조를 리팩토링 하면서 결과물과 함께 베이스 코드를 진화시켜 나간다.
4) 또다른 결과물을 만들면서 3번 과정을 반복한다.
5) 위 과정을 거치다 보면 어느새 베이스 코드가 나만의 멋진 코드로 바뀌어있을 것이다.
베이스캠프 전략을 사용하기 위해서는 예제 코드가 잘 정리되어있고, 완성도가 높은 책을 선별해야 한다. 나는 위에서 말한 4가지 엔진을 만들기 위해 아래와 같은 책들을 선별했다.
먼저 물리 엔진을 만들기 위한 Nature Of Code 이다. 벡터, 힘, 진동, 파티클 시스템, 자율 에이전트, 세포 오토마타, 프랙털, 유전 알고리즘, 퍼셉트론 등의 내용이 있어 물리 엔진뿐만 아니라 AI 엔진을 만들 재료도 포함되어 있다.
다음은 AI 엔진을 위한 밑바닥부터 시작하는 딥러닝 이다. 이 책의 예제 코드로 Fully-connected Network와 CNN(Convolutional Neural Network)의 베이스 코드를 만들 수 있다.
집단지성 프로그래밍은 데이터를 수집하여 처리하는 인공지능 기법들을 소개하는 책이다. 데이터 수집에 대한 내용이기 때문에 크롤러를 포함한 검색 엔진의 구현 코드를 제공한다. 또한 추천 시스템, 군집, 최적화, 문서 필터링, 의사결정 트리, kNN, SVM, 유전 알고리즘 등을 다루기 때문에 AI 엔진의 풍부한 재료가 된다.
마지막으로 안드로이드 게임 프로그래밍 이다. 이 책은 일반적인 게임을 구현해 보고, 2D/3D 게임 엔진을 만들어 엔진을 적용시킨 게임을 구현해 보는 구성이다. OpenGL ES를 사용하여 렌더링 엔진을 구현하는데 도움이 될 것으로 기대하고 있다.
위 책들의 공통점은 완성된 프레임워크를 사용하지 않고, 최소한의 라이브러리만을 사용하는 From scratch 컨셉으로 예제 코드를 제공한다는 점이다. 나는 이런 책들을 참 좋아한다.
이제 슬슬 마무리를 해야 할 시간이다. 마지막 나의 개발 전략은 사람이다. 오픈소스 프로젝트로써 어느 정도 결과와 매력을 보여주어 다른 사람들의 관심을 이끌어 내고 싶다. 그리고 나 혼자서는 불가능한 일을 다른 사람들과 함께 해내고 싶다.
지금까지 2017년 스터디 회고에 이어 앞으로 내가 가야 할 방향과 만들어야 할 프로젝트에 대한 소개를 했다. 이제 행동으로 옮길 차례이다. 이렇게 장대한 계획을 작성하고 있는 지금, 앞으로 몇 년 후에 내가 얼마만큼 이루어 낼 것인지 벌써부터 기대가 되고 또 궁금하다.