“실리콘밸리에 본사를 두고 있는 A스타트업의 핵심 개발자들은 한국에서 원격으로 근무하는 한국 개발자들로 구성되어 있다. 각자 할 일을 등록하고 기록하는 이슈관리 서비스를 활용해서 집에서 혹은 카페에서 자신의 스케줄에 맞춰 일을 한다. 어떤 개발자는 자유롭게 다른 나라로 여행을 다니면서 디지털 노마드 삶을 살아가기도 한다. 어떤 개발자는 자신이 개발하는 일부분은 오픈 소스로 만들어서 github에 공유하고 전세계 개발자들과 공유한다.”
위 내용이 신입/주니어 개발자에게는 이름모를 소설이나 SNS에서 떠도는 꿈만 같은 이야기다. 하지만 실제로 이렇게 우아하게 일하는 개발자들과 함께 동시대를 살고 있다. 과거에 선배 개발자들은 GNU와 리눅스를 만들면서 오픈 소스 정신과 문화를 퍼트렸고, 그 유산을 바탕으로 전세계 개발자들이 공유하고, 협업하고, 성장하고, 개선하는 속도가 점점 더 빨라지고 있다.
이렇게 시대가 흐르면서 알아야 하는 것들, 배워야 하는 것들, 사용하는 도구들도 함께 성장하고 변화하고 있다. 현장에서는 어느 곳에서 일하든지 소통하기 위해서, 열린 마음으로 다른 개발자와 함께 일하는 오픈커뮤니케이션이 반드시 필요하지만, 우리가 경험하는 교육 과정에서는 이런 협업 과정을 경험하고 배워볼 기회가 사실상 거의 없었다.
고품질 소프트웨어 교육캠프
오픈 소스 활동은 열린 개발자 문화이며, 이미 만든 소스를 가져다가 쓰기만 하는게 아니라 언제든지 스스로 기여할 수 있다는 것을 알려주고 싶었다. 오픈 소스 개발자들이 어떤 방식으로 어떤 도구를 활용하고 어떻게 협업하는가 경험해볼 필요가 있었다. 개발자는 단지 코드를 만드는 것으로만 끝나는 것이 아니라는 것을 알려주고 싶었다. 그래서 코드를 사용해서 서비스가 가져다주는 더 큰 가치를 생각하는 고품질 소프트웨어 교육캠프가 필요했다.
7–8월 여름 방학동안 운영할 캠프는 8주만에 기술 교육도 하고, 협업을 경험하는 프로젝트도 진행해야 했다. 어떻게 하면 짧은 기간동안 개발 과정이 즐겁다고 느낄까 고민하고 어떻게 더 좋은 소프트웨어를 만들 수 있는지 경험할 수 있도록 설계했다.
우선 큰 틀에서 <코드스쿼드> 마스터즈코스 운영 방식을 가져와서, 전반 4주는 기술 교육 중심으로 운영하고 후반 4주는 프로젝트 중심으로 운영하기로 했다. 내부적으로 전체 인원을 웹프론트엔드와 모바일 2트랙으로 나눠서 교육을 진행하지만, 트랙별 2명씩 총 4명이 한 팀이 되도록 구성했다. 캠프 첫날부터 팀을 구성하고, 모든 미션과 의사 결정은 팀단위로 하도록 설계했다.
캠프 참가자는 최소한의 프로그래밍 개발 경험만 있으면 된다고 가정했고, 다양한 배경을 가진 사람들이 모여서 서로에게 긍정적인 영향을 줄 수 있기를 바랬다. 그래서 선발 과정부터 성장 가능성과 열정, 다양성, 근면성실 자세와 최소한의 프로그래밍 개발 경험을 기준으로 했다. 팀 구성할 때도 비전공/전공 구분없이 다양한 사람들끼리 어울릴 수 있도록 신경썼다. 세부 커리큘럼을 설계하면서 팀 프로젝트는 웹과 모바일이 합쳐서 하나의 프로젝트를 하고, 프로젝트를 위해서 필요한 최소한의 팀빌딩, 백엔드 기술, 프로젝트 기획과 설계, 트랙별 협업과 팀별 협업을 경험할 수 있도록 교육 과정을 만들었다.
1주차 교육 목표는 팀빌딩과 공통 교육이었다. 처음 만난 팀원들과 인사하고, 지급한 맥북 개발환경 설정하고, 짧게 팀빌딩을 위한 미션을 몇 개 진행했다. 교육 내용은 HTML/CSS를 수업하고, 개인 홈페이지를 만들어서 팀단위로 합치고 팀 홈페이지를 만든다. AWS와 리눅스, Node.js 기초를 수업하고 팀 홈페이지를 배포해보는 경험을 가졌다. 팀이 만들어지고 초반에는 커뮤니케이션도 개인의 임기응변으로 끝나는 경우가 많다. 결국 팀미션이지만 누군가 한 명이 그걸 해결하면 팀이 해결한 것처럼 포장된다. 그 느낌을 적어도 후반기 팀 프로젝트할 때는 깰 수 있기를 바랬다.
2주차부터 4주차까지는 웹트랙과 모바일트랙으로 구분해서 진행했다. 2주차에 모바일 트랙은 스위프트 기초 문법을 익히고, 개발환경 Xcode에서 다양한 프로젝트 템플릿을 경험했다. 객체지향프로그래밍과 함수형 프로그래밍 개념을 배우면서 작은 함수, 추상화된 데이터 구조, 응용 클래스까지 점차 만드는 경험을 늘려갔다. 앱 기본 아키텍처와 iOS SDK를 배우면서 동작 원리를 이해하고, MVC 디자인 패턴을 배우면서 어떻게 코드를 역할과 책임에 맞춰 구분하는지 경험했다. 웹 트랙은 자바스크립트 기초부터 시작해서 브라우저 동작원리와 디버깅 방법 등을 배우면서 기본적인 화면을 구성하기 위해 모듈을 만드는 경험을 했다. DOM, AJAX, EVENT, Template 조작과 같은 웹프론트엔드의 핵심요소를 다루었다. 그 과정에서 작은 문제를 연속적으로 풀면서 웹UI요소를 어떻게 개발할 수 있는지 알게 했다. JavaScript로 객체지향 개발에 필요한 prototype,this, bind 개념을 이해함으로써, 프로젝트 단계에서 팀단위로 모듈방식 개발이 가능하도록 준비했다. 이 과정에서 생기는 문제들을 쉽게 풀 수 있도록, 웹을 검색하고 소스코드를 디버깅하는 방법에 대해서 익숙해지도록 지속적으로 학습을 반복했다.
모바일/웹 트랙 모두 진행 방식은 이론적인 내용을 설명하고, 간단한 실습 미션을 주고 해결 방법을 찾아서 해결하고, 코드를 보고 서로 피드백을 주는 방식을 반복했다. 서로의 코드를 리뷰하면서 생각하는 방식의 차이를 이해하고, 다른 사람 코드에 대해 피드백을 주는 방법을 차츰 배워나갔다.
웹과 모바일 트랙으로 나눠서 진행하지만, 공통적으로 예제 코드나 미션으로 만들어야 하는 내용은 배민프레시 서비스를 기준으로 삼았다. 신입 개발자들에게 필요한 서비스 이해나 시스템 구성, 아키텍처 등을 연습하기 위해서 팀별로 배민프레시 서비스를 분석해서 역기획서를 만들고, 시스템 구성도를 그려보고, 개발을 위한 설계서를 만들어보는 경험도 했다. 마스터들은 미리 배민프레시 웹과 앱을 분석해서 수업 설계에 반영했다. 예를 들어 메인 화면의 구성요소를 만들면서 배울 수 있는 요소들을 나열하고, 화면을 구성할 수 있도록 교육용 API를 만들어서 제공했다.
3주차부터 웹 트랙은 배민프레시 홈페이지를 분석하고, 주어진 API와 요구사항을 기반으로 메뉴를 구성하고, 애니메이션으로 개선하는 과정을 거쳤다. 백엔드보다는 프론트엔드 기술에 집중하기 위해서 여러 API를 활용해서 웹 프론트엔드를 완성하도록 설계했다. 어떻게 데이터 통신을 하는지, 데이터를 어떻게 파싱하고 캐쉬해서 효율적으로 쓸 수 있는지 고민하도록 했다. 애니메이션 기술을 배울때도 간결하면서 동적인 UX를 구현해내는 방법으로 어떻게 하면 더 나은 UX를 제공할 수 있을지 생각하길 기대했다. 모바일 트랙도 서버와 통신해서 화면을 구성하는 방법을 배웠다. 서버 API에 접근해서 비동기로 JSON 데이터를 받아오고, 객체로 만들어서 화면을 동적으로 구성하고, 새로운 데이터를 작성해서 객체로 만들고 서버로 보내는 과정을 경험하면서 좀 더 복잡한 화면을 만들수 있다. 더불어 좀 더 복잡한 구조의 다양한 iOS 프레임워크를 활용하는 방법을 경험했다.
짝프로그래밍과 전체코드리뷰 시간에는 더 좋은 코드가 무엇인지 고민하고 토론하며 서로 배우도록 진행했다. 강제적으로 두 명당 노트북 한 대만 가지고 작업하고 15분마다 역할을 바꿔가면서 함께 문제를 해결해보기도 했다. 그리고 매일 아침에 전날 작업했던 다른 팀의 코드를 함께 리뷰하는 시간을 가졌다. 무작정 코드를 먼저 구현하기 보다는 코드설계를 먼저하도록 많은 시도를 했다. 하지만 대부분 설계 경험이 부족했고, ‘먼저 구현하고 수정’하는 습관 때문에 먼저 설계 하는 방식을 어려워했다.
4주차부터 모바일 트랙은 앱에서 필요한 정교하고 세부적인 기능을 개발하기 위해서 고급 주제들을 학습하고 활용하는 미션이 많았다. 동시에 여러 작업을 하기 위해 작업 스케쥴링을 어떤 방식으로 해야하고, 어떻게 최적화 할수 있는지 경험했다. 웹 트랙은 모바일 웹, 반응형 웹을 만들기 위한 기법들을 공부하고 개선하는 경험을 진행했다. 배민프레시 주문페이지를 설계하고, 개발하고, 모바일 웹으로 개선하고, 코드리뷰하는 과정을 거쳤다. 그리고 팀단위 프로젝트를 하면서 프로젝트는 어떤 구조를 가져야하며 어떻게 설계해야할지, 어떻게 통합하고 배포를 해야할지를 강조했다.
더불어 두 트랙 모두 단위 테스트와 통합 테스트에 대해 배우고 직접 자신의 코드를 테스트하도록 했다. 다른 팀이 설계한 코드를 테스트하기도 했고, TDD 방식으로 미션을 해결해보기도 했다. 마지막으로 애플 개발자로 등록하고 직접 폰에 올려보고, 직접 만든 앱을 다른 사람에게 배포하도록 했다. 하지만 자신이 만든 앱의 성능을 분석하고, 최적화하고, 사용성 분석을 통해 개선하는 경험을 준비했었지만 수업만 진행하고 가볍게 경험했을 뿐 깊이있는 실습을 해보지는 못해서 아쉬웠다.
팀별로 2명씩 흩어져서 진행한 전반 4주 교육이 끝나고, 5주차부터는 모든 팀원이 한 공간에 모여서 수업을 진행했다. 본격적으로 팀별로 프로젝트를 하기 위한 아이디어를 구체화하기 시작했다. 프로젝트를 진행하기 위해 팀단위 미션들이 주어졌다. 그라운드룰을 정하고, 회의시간과 진행방법, 코딩스타일 등을 정리해서 저장소 read.md 파일에 기록하는 것이 첫 미션이었다. 기획서를 만들고, 설계도 직접하고, 프로젝트 전체를 가늠해보고, 기능 목록을 작성하고, 백로그로 나눠서 칸반으로 관리하는 방법을 단계별로 경험한다. 이 단계에서 특별히 디자인팀이 구체적인 피드백을 주고, 기본 디자인 가이드를 만들어 제공했다. 디자인팀이 도와준 게 프로젝트 결과물 품질에 긍정적인 영향을 준 것 같다.
6주차부터 8주차까지는 매주 플래닝 회의를 해서 한 주의 목표를 정하고, 아침마다 데일리 스크럼을 하며 현황을 공유하고, 금요일에 기능 데모와 회고를 통해서 부족한 점을 채우거나 개선하도록 했다. 당연히 팀마다 개발 속도도 다르지만, 스스로 만들어가는 개발 문화도 달라서 전체 공유하는 금요일에는 서로에게 배울 수 있는 점이 더 많았던 것 같다. 특히 회고를 하면 할수록 솔직한 피드백을 전달하고, 피드백을 받고나서 팀을 위해서 스스로 노력하고 개선하는 모습이 보였다. 물론 모든 팀에 있는 모든 팀원들이 소통과 협업에 완벽했던 것은 당연히 아니다. 적어도 하루전보다, 일주일전보다 협업을 하기위해서 필요한 태도와 마음가짐, 대화 방법과 설득, 도구의 활용을 스스로 배우는 기회였다.
인턴형 교육 캠프 vs 인턴 교육 프로그램
모든 교육에서 가장 중요한 요소 중에 하나는 바로 ‘동기부여’다. 우아한 테크캠프는 단지 인턴 교육 프로그램이 아니길 바랬다. 그래서 교육 설계부터 다른 교육 프로그램과 달리 포함했던 사항들이 몇 가지 있었다.
캠프 시작부터 팀단위 학습이 이뤄지도록 의도했고, 매주 금요일에는 “배민다움”을 배울 수 있도록 김범준 CTO님이나 김봉진 대표님, 한명수 이사님, 장인성 이사님 강연이 있었다. 그리고 인턴출신 우아한멘토가 있어서 팀단위로 소통을 한다거나, 피플팀과 워크숍이나 내부 개발자들과 대담, 개발자런치 등 다양한 접점을 통해서 동기부여를 자극하고, 교육 효과를 높여주는 요소가 포함되어 있었다.
‘우아한테크캠프’는 아이돌이나 슈퍼스타를 키워내기 위한 공개 오디션 프로그램이 아니었다. 미운 오리 새끼처럼 스스로 성장할 수 있는 태도와 더 좋은 소프트웨어 개발자가 되기 위해 끊이없이 노력하는 우아한 백조에게 기회를 주는 열린 교육 캠프였다. 단기간 교육 캠프임에도 불구하고 캠프 과정을 비롯해서 프로젝트 결과를 보더라도, <우아한형제들> 구성원들이 가진 발랄한 에너지와 밝고 노력하는 모습과 <코드스쿼드> 마스터들이 추구했던 교육 목표와 교육 방식이 만나서 좋은 시너지가 됐다. 덕분에 경쟁과 평가가 없이 온전히 성장을 위한 이상적인 교육 목표에 가깝게 다가갔다.
“난 위대한 프로그래머가 아니다. 단지 위대한 습관을 가진 좋은 프로그래머일 뿐이다(I’m not a great programmer; I’m just a good programmer with great habits).”
- 켄트 벡
앞으로 우아한 테크 캠프를 통해서 위대한 습관을 가진 좋은 프로그래머가 더 많아질 수 있기를 바란다.
이 글은 마이크로소프트웨어 잡지에 기고된 글입니다. 편집된 내용은 잡지에서 읽으실 수 있습니다.