조대협님의 책을 읽고(부제: 풀스택 개발자로서의 반성)

최근, 미국에서 개인적으로 큰 이슈가 마무리되고 생각보다 엄청나게 자유로운 기분에 그간 쌓아만 두었던 책을 읽기 시작했다. 그 중, 그간 가장 읽고 싶었던 조대협님의 저서인 '소프트웨어 개발과 테스트' 와 '대용량 아키텍처와 성능 튜닝' 을 이번 주말을 할애하여 전부 읽었는데 감상평을 짧게 요약하면 '왜 이제 봤을까'라는 생각이다.

조대협님을 알게 된 것은 (물론 오프라인에서는 안면이 없지만..) 이분의 뛰어난 블로그를 통해서 이다. 2011년 갓 시니어를 달고부터 였다. 워낙 팀에서 형상관리가 제대로 되지 않은 채 유지가 되자 (VCS하나 없이 소스코드 zip파일로만 관리되는 현실이 안타까웠다.) 테스트 PC한대 신청해서 Redmine 과 Subversion을 설치하고 기존 소스들을 긁어모아 버전관리와 이슈트래킹을 시작했다. 그러던 와중에 Hudson을 이용한 CI설정(http://bcho.tistory.com/172) 글을 보게 되었고, 이때부터 '이거다' 싶은 생각에 관심있게 살펴본 결과 나 스스로도 심지어 개인 프로젝트를 할 때에도 기본적으로 VCS, Issue Tracker, C.I 까지는 구현하고 들어갈 정도로 일종의 소프트웨어 공학의 팬이 되었다.

그러던 중, 병특을 끝내고 학부로 돌아가서 바로 Software Engineering수업을 들었는데 이 수업에서 병특시절 고민하던 개발 프로세스와 협업의 과정은 사실 오래된 학문으로 존재한다는 것에 큰 감명을 받았다. 그리고 그때부터는 정말 스스로 단순한 개발자가 아닌 누군가 나의 작업물을 볼 것을 생각하고, 보다 더 큰 틀에서 개발 프로세스를 설계하기 시작했다. 학교에서 해오던 팀 프로젝트에 조금씩 적용을 시키며 한편으로는 프리랜서 생활을 하면서도 이에 대한 구축을 도맏아 해왔었다.

덕분에 수 년에 걸쳐 클라우드 기반의 안정적인 개인 VCS/CI/CD/Testing/Issue Tracking 시스템을 만들어 두니 나 스스로도 DevOps로써, 혹은 1인 개발자로써 나아가는데에도 상당한 도움을 주었다. 이를 토대로 작년 학업을 이유로 이곳 실리콘벨리에 오게 되고, 스타트업을 시작하게 되었다.

하지만 스타트업을 시작하며 약 8개월 간 기초 작업에 정신이 없었는데, 최신의 트랜드를 따라잡고자 하는 나의 고민과 오로지 소규모의 스타트업 팀에 맞는 환경을 구축하기 위해서, Agile이나 마이크로아키텍처 등에 대한 공부와 이해가 필요했다. 더불어 stateless한 개발 환경을 만들기 위해서는 Async환경이라던가, RDBMS의 대용량 처리에 대한 고민이라던가, 혹은 빠른 배포/Rollback을 위한 과정이라던가.. API를 토대로 한 엔드포인트가 달라지니 너무나 공부할께 많았다. RESTful에서의 보안이나 토큰, 암호화 등에 대해서는 정말 학업과 별개로 수개월을 공부했던 것 같다. 물론 원천적인 공부가 아닌, 수박 겉핥기 식으로 말이다.

그런데 정말 한숨 돌리면서 조대협님의 책을 보는 순간 '아차' 싶었다. 그간 내가 고민했던 모든 과정이 총망라된, 내게있어서는 백과사전과 같은 느낌의 책이었다. 전통적인 SE개발 아키텍처에서부터 마이크로아키텍처까지. 그뿐이랴, 테스트와 형상관리, 통합 및 배포에 대해서도 최신 트랜드에 맞게 전문가 수준으로 서술되어 있었다.

사실 어느정도 개발, 테스팅 및 배포 프로세스를 잡아두고서는 배부른 소리로 '이제 뭐 하지' 라는 생각에 우왕자왕 하고 있었는데, 생각보다 훨씬 많이 고려해야 할 것이 많았다. 아래는 내가 잠깐 느꼈던 내가 만들고 있는 서비스에는 부족한 부분들이다.

(개발 환경)

Backend: Scala/SBT/Play Framework/Akka/Slick

Frontend: AngularJS/Grunt HTTP Server

DBMS: Google SQL의 MySQL 2nd Generation

IaaS: Google Cloud with Docker and Kubernetes/Google Cloud Loadbalancer

협업/CI 도구: Gitlab EE/JIRA with Agile/Jenkins

(내 서비스의 문제점/개선사항)

– 위키 등을 이용한 아키텍처/환경 등에 대한 공유(언제부터인가 Redmine을 사용하지 않아서 위키가 절여되어 있었다.) -> Confluence등으로 연동

– RESTful의 이상한 사용. 전혀 이해하지 못하고 사용해 왔었음. Response Body의 코드에 대해서도 규격화 하지 못했음. 페이징, 부분응답 처리에 대해서도 트랜드를 따르지 않고 무분별한 JSON객체 송/수신

– 분산 데이터 처리의 람다 모델의 미사용. Sharding/Replica등에 대해 전혀 고려하지 않음. (책을 보고 비로서 Replica를 만들었다.) master/slave의 Select/Update에 대한 구분

– 웹캐시를 토대로, CDN을 고려할 생각을 안함. -> 허나 Docker환경에서는 어떻게 할지.

– DB상으로 사용자 권한, 로그인 로그 등에 대한 부재.

– Rabbit MQ vs Akka. Akka만 맹신했는데, Actor모델과 Queue모델의 장/단점에 대한 분석 필요

– Temporarily Storage에 대한 부재. Local Storage에서만 처리한 결과가 자원을 차지할 것을 예상하지 못함.

– Big Data분석에 대한 설계 부족.(물론 아직 서비스를 만든 것은 아니지만) Google Cloud를 사용하므로, Dataproc라는 좋은 것이 있긴 하다. -> 어떻게 쓸 것인가.

– 법적 이슈. 미국에 와서는 아직도 미국의 법을 잘 모른다. 미국/한국의 법적 이슈에 대한 이해 필요.

– Localization. L10N/i18n에 대해 이해는 하고 있었지만 아직 적용하지 못함.

– 성능 엔지니어링. nGrinder등에 대해 사용은 해야.. 솔직히 한번도 해보지 못했다. -> 목표 TPS, HPS 설정 필요

– JVM의 -server -client 옵션. Scala를 쓰니깐 별로 옵션도 건드리지 않은 듯 한데.. Future/Promise모델에서의 Garbage Collection 처리는 어떻게?

– Git에서의 Branch별 전략 필요. -> 어떤 브랜치를 Continuous Deployment에 적용 시킬것인가?

– Open API 제공시, OAuth인증 등에 대한 설계 필요.

– SSL적용해야함.. (개발때문에 못하는 실정)

개발적인 부분만 생각하면 이정도는 되는 것 같다. 이 외에도 아키텍처 설계에 대해, 특히 비즈니스 아키텍처에 대해서 내 Business Plan대비 내가 누락한 부분이 많이 있었다.

책을 읽으면서 가장 크게 든 느낌은, 내용이 다 좋다. 그리고 내가 모르는 부분이 너무 많다. 하지만 이를 다 수용하고 적용하려면 적어도 수 개월은 걸릴 것 같은 느낌이다. 당장 위에 나열한 것들에 대한 고려를 해도 아직은 답이 안나온다. 허나 중요한 것은 '점진적'으로 수용하는 것이랄까, 아키텍처란 물론 왠만하면 완벽하게 설계하고 들어가는 것이 중요하겠지만 비즈니스적 입장에서는 제한된 시간이라는 것이 있으므로 이를 모두 완벽하게 수용할 수는 없다.

따라서 이미 나는 서비스를 개발하고 있는 입장에서는, 끝없이 개선해 나가는 수 밖에 없다. 아키텍처에도 Continuous 라는 개념이 있지 않을까, 학문처럼 규격화된 아키텍처란 있을 지언정 모든 서비스의 요구사항이 다르기 때문에 지속적으로 변화를 수용하되, 그래도 왠만하면 문제를 일으키지 않도록 이에 대한 철저한 설계가 필요할 것 같다.

하지만 나와 같이 혼자서 프로토타입 까지는 비즈니스/웹 및 앱 디자인/Devops 까지 하는 상황이라면 솔직히 말해 아키텍처에 투자할 시간이 많지 않다. 그래서 더욱이나 이 책이 좋았던 것은 나같이 시간없는 사람들을 위해 핵심만을 나름대로 쉽게 설명해 놓은 책이어서 그런 것 같다. 개인적으로 수백장의 SOA레퍼런스는 읽는 데만 최소 한달은 걸리니깐.

다만 책에는 아쉽게도 디자인 팀과의 커뮤니케이션은 잘 보이지 않았단 것 같다. 그리고 이 부분은 내가 특히나 관심을 가지고 고민하고 있는 부분이기도 하다. 예전에는 포토샵으로 Dropdown이라던가, mouse-over등의 Action등을 Slice만 해두면 html으로 뽑아낼 수 있었는데 지금은 워낙 웹이나 앱의 기능이 인터렉티브해지고 복잡하다 보니 아직까지는 이를 완만하게 개발쪽으로 뽑아낼 수 있는 툴이나 방법론을 보지 못했다. 하지만 이 또한 어디선가 연구하고, 이미 학문으로 정립하고 있지 않을까 라는 생각이다. 프로토타이핑 툴 처럼.

스스로 반성한 부분. 조대협님의 직업은 아키텍트로 알고 있지만 책이나 블로그를 보면 상당 부분이 왠만한 실무자 수준에 이른다. 이 말은 즉, 그토록이나 깊게 공부를 했다는 말이다. 나도 최근에 느끼지만 IT의 영역에 발을 담군 이상 공부는 끝 없이 해야만 한다는 생각이다. 난 특히 그걸 크게 느꼈다. 그래서 지금까지 내가 알고있던 지식은, 웹 개발만 20년을 해왔지만, 조대협님의 책의 10%도 안된다는 것이다.

결국 내 공부방법이 잘못된 것일지도 모른다. 학부에서 배우는 것도 사실 PPT슬라이드로 요약해서 배우기 때문에 교재의 여러 부분을 빼먹고 공부한다. 개발에서 궁금해서 배우는 것은 태반이 Stackoverflow에서 기껏해야 어떤 사람이 조금 더 심도있게 설명한 부분 외에는 없다. 실제로 나는 어떤 사람이 Manual로 링크한 사이트에 들어가면 조금 읽다가 만다. 하지만 그 메뉴얼이야말로 개발자나 실무자가 공을 들여 여러 경험을 토대로 작성한 최고의 문서이자, 공부거리가 아니겠는가.

그래서 어쩌면, 주경야독을 택한 나의 선택이 틀리지는 않았다는 생각이 든다. 그리고 다시한번 반성하게 된다. 진짜 풀스택 프로그래머는 전 분야에 걸쳐 지속적으로 공부하는 사람이라는 생각이다. 특히, 스타트업을 하는 이상 더 많은 범주가 요구된다. 그것을 얼마나 즐겁게 하느냐에 따라 스타트업의 승패가 달리지 않을까. 한편으로는 모든 것들을 나 혼자는 할 수는 없으니 함께 토론하고 논의하여 이해하는 것이 중요하다는 생각이다.

많은 것을 느끼게 해준, 정말 감사한 책이었다. 뭐랄까, 2008년 조엘 온 소프트웨어를 읽으며 느꼈던 그런 기분이랄까.. 이런 좋은 책을 집필해 주신 조대협님께 감사드리며, 앞으로 나도 더 많이 공부해서 좀더 우리나라의 소프트웨어 산업에 기여하고 싶은 생각이 든다.