개발자가 역량을 쌓아나가는데 정답이 있을 수 없다. 지속적으로 역량을 쌓고 성장하는데 있어 가장 좋은 방법은 스스로 동기부여를 하면서 학습해 나가는 것이다. 또한 자신만의 학습 스타일을 찾아 자신의 속도로 학습하는 것이다. 이 과정에서 다른 사람과 비교하지 않고 어제의 나보다 나은 오늘을 만들기 위해 노력한다면 그 보다 더 좋은 것은 없다. 누구나 다 알고 있다. 하지만 실천하기 어렵다.
나 또한 학습 의욕이 충만했다 외부 요인에 의해 좌절한 경험이 한 두번이 아니다. 좌절하게 만든 중요한 이유 중의 하나는 다음 단계로 무엇을 학습해야할 지 막막할 때이다. 이 같은 이유 때문에 다음 단계로 학습할 내용들을 정리해 본다. 하지만 여기서 정리한 내용이 모든 개발자에게 적합한 것은 아닐 수 있기 때문에 단순히 참고 자료로만 활용했으면 한다.
나는 학습에 대한 가장 큰 동기부여는 필요에 의한 학습이라 생각한다. 즉, 현재 내가 안고 있는 문제를 해결하기 위해 무엇인가를 학습할 때 가장 큰 동기부여가 되고, 이 때 학습하고 문제를 해결한 경험이 진정 나의 것이 될 수 있다. 따라서 가장 큰 학습 동기를 만들려면 현재 내가 해결해야할 문제가 무엇인지를 인식할 필요가 있다. 내가 해결해야할 문제가 무엇인지 인식했다면 다음 단계는 이 장에서 제시하는 내용이나 검색을 통해 학습할 자료를 찾는 과정을 거치면 된다.
프레임워크를 직접 구현하는 경험을 했다면 다음 단계는 프레임워크에 대한 이해도를 높혀 효과적으로 사용하는 방법을 익혀야 한다. 개인적으로 한 단계 더 깊이 있게 학습해봤으면 하는 프레임워크 조합은 스프링과 ORM 프레임워크를 활용해 웹 애플리케이션을 개발하는 경험을 해봤으면 한다.
스프링과 관련해 더 깊이 있는 학습을 하려면 토비의 스프링 3.1(이일민 저, 에이콘/2012년) 책을 추천한다. 이 책은 스프링 프레임워크 뿐만 아니라 객체지향 설계와 개발, 스프링이 등장하게 된 배경에 대해 정말 자세하게 설명하고 있다. 책이 1,2권으로 되어 있고, 상당한 분량을 자랑하기 때문에 컴퓨터 받침대로 전락하는 사태를 막으려면 반드시 스터디와 같은 방식을 통해 여러 명이 같이 학습할 것을 추천한다.
자바 진영에서 웹 애플리케이션을 개발하는데 있어 스프링을 빼놓고 이야기할 수가 없다. 스프링 프레임워크를 학습하라는 것이 스프링 프레임워크 자체를 학습하라는 것이 아니라 스프링 진영에서 제공하는 수 많은 서브 프로젝트를 학습하고 활용하라는 것을 의미한다. https://spring.io/projects을 참고하면 스프링 진영에서 제공하는 다양한 서브 프로젝트를 참고할 수 있다.
“토비의 스프링” 책을 통해 객체지향 개발과 스프링에 대해 학습하면서 추가적으로 학습했으면 하는 프로젝트는 다음과 같다.
- 스프링 Boot: 아무 것도 없는 상태에서 스프링을 설정하는 과정은 쉽지 않다. 스프링 Boot를 활용하면 초반 설정을 쉽게 할 수 있으며, 서비스 운영시 활용할 수 있는 기능을 제공한다. 새로 시작하는 프로젝트라면 스프링 Boot로 시작할 것을 추천한다.
- 스프링 Security: 대부분의 애플리케이션 개발에서 인증(Authentication)과 인가(Authorization) 기능은 반드시 필요하다. 많은 부분이 추상화되어 있어 초반 설정과 개념을 잡는데 어려움이 있지만 일단 적용한 후에는 그 만큼의 보상을 받을 수 있다. 만약 OAuth 기반의 소셜 로그인을 지원해야 한다면 스프링 Social 과 통합해 적용할 수 있다.
- 스프링 Data: 다양한 데이터베이스에 대한 추상 API를 제공하고 있다. 대부분의 웹 애플리케이션이 데이터베이스와 의존관계를 가지기 때문에 스프링 Data에서 제공하는 API는 많은 도움이 될 것이다. 특히 최근에는 다양한 NoSQL을 사용하는 경우가 많기 때문에 더 많은 도움을 받을 수 있다.
위 3개의 서브 프로젝트를 학습한 후 프로젝트 요구사항에 따라 다른 서브 프로젝트로 범위를 넓혀나가면 된다. 스프링이 제공하는 서브 프로젝트는 웹 애플리케이션을 개발하는데 있어 필요한 구성요소들이기 때문에 애플리케이션 아키텍처 관점에서도 충분히 학습할만한다.
국내 자바 진영의 안타까운 점 중의 하나는 세계적으로 널리 사용되고 있는 ORM 프레임워크에 대한 활용도가 낮다는 것이다. 이와 같은 문제의 원인은 개발자의 문제가 아니라 대한민국 IT업계의 구조적인 문제점 때문이다. ORM 프레임워크를 도입할 경우 초반 학습 비용이 든다. 하지만 프로젝트 초반 학습 비용을 허용하지 않는 국내 IT 현실에서의 ORM 도입은 쉽지 않다. ORM 프레임워크의 경우 초반 학습 비용은 다소 들지만 투자에 비해 얻을 수 있는 이점은 너무 많다. 특히 무상태 프로토콜 기반의 웹 애플리케이션을 좀 더 객체지향적인 개발이 가능하도록 하려면 ORM을 사용해야 한다. ORM을 사용하지 않은 상태에서 객체지향적으로 개발하려면 정말 많은 노력이 필요하다.
물론 국내 개발자의 경우 ORM에 대한 호불호가 나뉘는 것으로 안다. 하지만 ORM에 대한 학습을 추천하는 이유는 온라인에 떠도는 선배 개발자의 말을 믿기보다 본인이 직접 경험을 통해 ORM을 학습하고 적용해본 후 사용할 것인지의 여부를 판단했으면 하는 바람 때문이다.
ORM과 관련해 더 깊이 있는 학습을 하고 싶다면 자바 ORM 표준 JPA 프로그래밍 (김영한 저, 에이콘출판사/2015년) 책을 통해 학습할 것을 추천한다.
ORM을 적용하면 애플리케이션 개발 초기의 설계와 개발 과정의 효율성을 높이는데 많은 도움을 받을 수 있다. 이와 관련한 더 자세한 내용은 https://youtu.be/VjbBGjVRxfk 동영상에서 참고할 수 있다.
12장까지 구현한 질문/답변 게시판을 스프링, ORM 프레임워크 기반으로 개발한 소스 코드를 https://github.com/slipp/jwp-basic 저장소의 step16-spring-orm-framework 브랜치를 통해 제공하고 있으니 프레임워크를 적용했을 때 어떻게 달라지는지 분석해 보는 것도 학습에 많은 도움이 될 것이다. 특히 Question 클래스의 canDelete() 메소드가 ORM 프레임워크를 적용했을 때와 적용하지 않았을 때 어떻게 다른지 확인해 보는 것도 객체지향 개발에 도움이 될 것이다.
자신이 생각하는 기능을 프로그래밍으로 구현할 능력을 갖춘 후 다음 단계로 고민해야할 부분은 성능과 보안이다. 지금까지 첫 번째와 두 번째 양파 껍질을 벗기는 단계는 어떻게 하면 웹 애플리케이션을 효율적으로 개발하는 것에 집중되었다. 웹 애플리케이션 개발에 자신감이 생기면 다음 단계는 보안에 안전하면서 대량의 사용자 요청에도 안정적으로 서비스를 운영할 수 있는 방법을 학습할 필요가 있다.
프레임워크 사용법이나 리팩토링을 통해 코드를 깔끔하게 구현하는 역량도 중요하지만 그 보다 성능과 보안에 대한 최소한의 역량을 쌓을 필요가 있다. 시작 단계부터 모든 성능, 보안 관련한 내용을 적용하기 힘들겠지만 최소한의 기능은 적용해야 안정적으로 서비스를 운영할 수 있다.
성능, 보안과 관련해 첫 단계부터 거창하게 생각할 필요는 없다. 현재 자신이 운영하고 있는 서비스에 가장 우선순위가 높다고 생각하는 부분부터 개선해 나가면 된다. 필자가 생각했을 때 먼저 적용하면 좋겠다고 생각하는 우선순위데로 정리해 보려고 한다. 단, 성능, 보안과 관련해 우선순위가 정해진 것은 없기 때문에 서비스 상황에 따라 조정해 적용할 것을 추천한다.
성능과 보안 중 우선순위를 두고 먼저 고려해야할 부분은 보안이다. 물론 성능도 중요하지만 먼저 고려할 부분은 보안이다. 성능은 서비스를 오픈한 후 사용자가 증가하는 시점에 고려해도 괜찮지만 보안과 관련해서는 문제가 발생하면 서비스의 성패를 좌우하는 경우가 많기 때문이다.
서비스 자체적으로 회원가입 기능이 있는 서비스라면 반드시 비밀번호 암호화에 대해 고려해야 한다. 최근에는 라이브러리를 활용해 생각보다 쉽게 적용할 수 있기 때문에 반드시 적용할 것을 추천한다.
안전하게 비밀번호를 저장하는 방법과 관련해서는 http://d2.naver.com/helloworld/318732 문서의 내용을 읽고 적용해도 기본적인 적용은 가능하다.
자바 진영에서 인증/인가, 비밀번호 암호화를 적용할 때 “스프링 Security” 라이브러리를 많이 사용한다. 위 문서에서 제시하는 비밀번호 암호화와 관련한 라이브러리도 지원하고 있다. 단, 초반 설정 과정이 복잡한데 시간 투자 대비 얻을 수 있는 이점이 많기 때문에 스프링 프레임워크 기반으로 개발하고 있다면 적용해 볼 것을 고려해보면 좋겠다. 스프링 Security를 적용하지 않더라도 스프링 Security의 라이브러리의 암호화 라이브러리만 활용하는 것도 의미있겠다.
이 내용과 관련해서는 6장의 추가 학습 자료를 다루면서도 일부 다루었다. 다양한 웹 공격 방법과 이에 대한 대응 전략에 대해 더 깊이 있게 학습하고 싶다면 안전한 웹을 위한 코딩 한줄의 정석(Hiroshi Tokumaru 저/박건태,신대호 공역, 로드북/2012년) 책을 통해 추가 학습할 수 있다.
다음 단계로 적용했으면 하는 보안 강화 방안은 SSL(Secure Socket Layer) 적용이다. SSL을 적용하려면 인증서가 필요한데 비용을 지불해야 한다. 비용 부담 때문에 SSL을 적용하는 것이 꺼려진다면 최근에는 Let’s Encrypt와 같이 무료로 사용할 수 있는 인증서도 있다. 대칭키, 공개키, 개인키 등 SSL 처리 방식에 대한 기본 개념에 대해 더 깊이 있게 학습하고 싶다면 http://minix.tistory.com/395, http://minix.tistory.com/397 두 편의 웹툰을 통해 학습할 것을 추천한다. 웹툰으로 작성되어 있기 때문에 읽는데 부담감도 적고, 어려운 개념을 쉽게 이해할 수 있다.
먼저 서버 측 성능을 개선하기 위한 1단계로 캐시를 적용할 것을 추천한다. 대부분의 웹 애플리케이션은 최근에 사용한 데이터가 또 다시 사용되는 경향을 갖고 있다. HTTP가 무상태 프로토콜이기 때문에 웹 애플리케이션에 캐시를 적용함으로써 상당한 성능 향상을 높일 수 있다.
로컬 캐시 라이브러리는 ehcache를 사용하고 스프링 프레임워크의 캐시 라이브러리를 적용해 구현한다. “spring @cacheable”로 검색해 관련 문서를 찾아 적용할 수 있다.
서버에서 성능을 개선했다면 다음은 클라이언트와 서버 사이, 클라이언트에서 성능을 개선할 필요가 있다. 예를 들어 대부분의 자바스크립트, CSS, 이미지는 일정 기간 동안 변경되지 않는 것이 일반적이다. 따라서 매 요청마다 정적인 웹 자원을 다시 요청해 다운로드하기 보다 웹 브라우저 캐시를 적용하는 것이 성능 측면에서 상당한 개선 효과를 볼 수 있다. 서버에 요청이 많아지면 많아질 수록 성능에 좋지 않다. 따라서 여러 개의 이미지를 하나로 묶어 서비스하는 CSS 이미지 스프라이트 적용도 고려해 볼 수 있다.
이와 관련한 주제는 웹 사이트 최적화 기법 : UI 개발자를 위한 필수 지침서(스티브 사우더스 저/박경훈 역, ITC/2008년) 책에 잘 정리되어 있다. 이 책이 제시하는 내용만 적용하더라도 상당한 성능 개선 효과를 볼 수 있다. 이 책이 제안하는 항목을 체크할 수 있는 YSlow라는 도구도 있다. 이 도구를 통해 자신의 웹 애플리케이션이 부족한 부분을 확인하고 개선해 나갈 수 있다.
앞에서 살펴본 방법은 서버 한 대의 성능을 최대한 높이기 위해 적용해야할 방법이다. 서버 한 대의 성능을 최대화하더라도 사용자가 많아지면 서버 한 대로 모든 사용자의 요청을 처리하기 힘들다. 이 시점에는 여러 대의 서버를 통해 서비스 함으로써 성능을 개선할 수 있다. 여러 대의 서버로 하나의 서비스를 하는 방법은 로드 밸런서를 활용해 가능하다.
한 대의 서버로 서비스를 하다 2대 이상의 서버로 늘어나는 순간 고려해야할 부분이 많아진다. 이 주제와 관련해서는 앞에서 소개한 IT 인프라 구조 : 그림으로 공부하는(야마자키 야스시,미나와 요시코,아제카츠 요헤이,사토 타카히코 공저/오다 케이지 감수/김완섭 역, 제이펍/2015년) 책을 통해 기본적인 서버 아키텍처 설계를 학습한 후 사용자 규모와 우선순위에 따라 하나씩 적용해 나갈 수 있다.
웹이 처음 등장하고 상당 기간 동안 한 명의 개발자가 프론트엔드부터 백엔드까지 전체 영역을 담당했다. 그런데 프론트엔드 기술이 빠르게 발전하면서 한 명의 개발자가 프론트엔드와 백엔드 전체를 감당할 수 없는 상태에 이르러 프론트엔드 개발자와 백엔드 개발자로 전문화되어 가고 있는 상태이다. 하지만 최근의 경향은 수 많은 스타트업이 생기면서 두 영역을 모두 개발 가능한 풀 스택 개발자를 찾는 곳이 많아지고 있다.
프론트엔드와 백엔드 영역이 빠르게 발전하고 있기 때문에 두 영역에 대한 역량을 쌓는 것이 쉽지 않다. 하지만 각 영역에 대해 이해하고 있을 때 좀 더 효과적인 웹 애플리케이션 개발이 가능하다. 따라서 벡엔드 개발자라도 최소한의 프론트엔드 지식은 학습하는 것이 좋겠다. 프론트엔드 개발자 또한 같다. 그런 측면에서 프론트엔드 학습을 높은 우선순위에 두었다.
프론트엔드의 경우 HTML, CSS, 자바스크립트 3개의 영역으로 나뉜다. 이 중에서도 백엔드 개발자가 반드시 학습해야할 부분은 자바스크립트이다. 특히 자바스크립트는 최근에 백엔드 영역에서도 사용되고 있고, 데스크탑 애플리케이션이나 모바일 앱개발등 다양한 영역에서 활용 가능하기 때문에 충분히 투자할만하다. 백엔드 아키텍처를 구성할 때 서비스 요구사항에 따라 자바 백엔드와 자바스크립트 백엔드를 같이 사용하는 경우도 있다.
프론트엔드와 관련해 다음 단계의 학습은 웹 브라우저에서 동작하는 간단하지만 동적인 웹페이지를 만들어 보는 것이다. 특히 Event, AJAX, DOM 를 많이 다뤄볼 수 있는 기능을 구현해 보면 좋다. 대표적인 예로 탭(Tab) UI나 , “더보기” 버튼과 같은 UI 구현을 통해 이벤트가 발생하면 AJAX를 통해 데이터를 요청하고 받은 데이터를 웹페이지에 동적으로 추가하는 것과 같은 것이 있다.
자바스크립트와 관련해 더 깊이 있는 학습을 하고 싶다면 **자바스크립트 프로그래밍 : 프론트엔드 개발자를 위한(니콜라스 C. 자카스 저/한선용 역, 인사이트/2013년)**과 자바스크립트 완벽 가이드(데이비드 플래너건 저/구경택,박경욱,변치훈,이의호 공역, 인사이트/2016년) 두 권의 책 중 한권을 활용해 학습할 수 있다. 이 책들은 모두 무척 두껍다. 따라서 웹사이트 개발을 하면서 궁금한 부분을 찾아서 학습하는 방법이 좋다.
동적인 웹 페이지 개발을 완료하는 단계가 끝나면 다음 단계는 좀 더 복잡한 웹 페이지를 개발하는 경험을 해본다. 이와 같은 복잡한 웹 페이지를 개발할 때 jQuery만을 활용해보거나, react.js, angular.js 와 같은 자바스크립트 프레임임워크를 활용하는 경험을 해볼 것을 추천한다.
개발자가 갖추어야할 중요한 역량 중 하나는 사람이 읽을 수 있는 깔끔한 코드를 구현하는 것이다. 가장 중요하지만 쉽게 쌓을 수 없는 역량 중의 하나이기도 하다. 어쩌면 개발자로서의 생을 마감하는 순간까지 끊임없이 노력해야 하는 부분이 내가 만족할 수 있는 수준의 코드를 구현하는 것일 수도 있다.
깔끔한 코드를 구현하는 가장 빠른 지름길은 지속적인 리팩토링을 통해 설계를 개선하는 연습을 하는 것이다. 코드를 많이 구현하는 것 보다는 의도적 수련 을 통해 코드를 개선해 나갈 때 자신이 만족하는 깔끔한 코드를 구현하는 단계에 도달할 수 있다.
다음에 추천하는 책들은 개발자로 성장하면서 계속해서 읽어야할 책들이다. 반드시 지금 단계가 아니더라도 경험이 쌓이면서 언제가 한번쯤 읽었으면 하는 책들을 소개한다.
깨끗한 코드를 작성하는 방법은 배우기 어렵다. 단순히 원칙과 패턴을 안다고 깨끗한 코드가 나오지 않는다. 고생을 해야 한다. 스스로 연습하고 실패도 맛봐야 한다. 남들이 시도하다 실패하는 모습도 봐야 한다. 그들이 넘어지고 일어서는 모습도 봐야 한다. 결정을 내리느라 고민하는 모습, 잘못된 결정으로 대가를 치르는 모습도 봐야 한다 . 이런 경험을 간접적으로나마 할 수 있도록 도와주는 책이 **Clean Code 클린 코드 : 애자일 소프트웨어 장인 정신(로버트 C. 마틴 저/박재호,이해영 공역, 인사이트/2013년)**이다. 이 책에는 많은 소스 코드를 제공하고 있으며, 어떤 코드가 좋은 코드인지, 나쁜 코드인지에 대해 생각하도록 하는 좋은 책이다.
“클린 코드” 책과 더불어 같이 읽었으면 하는 책은 **켄트 벡의 구현 패턴 : 읽기 쉬운 코드를 작성하는 77가지 자바 코딩 비법 강력추천(켄트 벡저/전동환역, 에이콘출판사/2008년)**이다. 이 책 또한 좋은 코드를 구현하기 위한 다양한 패턴에 대해 설명하고 있다. 단 클린 코드처럼 많은 예제를 제공하고 있지 않기 때문에 초보 개발자에게는 다소 어려울 수 있다. 따라서 클린 코드와 병행해 읽을 것을 추천한다.
이 단계에서 한 단계 더 나아가고 싶은 독자들을 위해 몇 권의 책을 더 추천한다. 테스트 주도 개발은 나무를 보는 것에 집중하고 있다. 좀 더 큰 숲을 보면서 설계하고 개발하는 과정을 경험하고 싶다면 테스트 주도 개발로 배우는 객체 지향 설계와 실천(스티브 프리먼,냇 프라이스 공저, 인사이트(insight)/2013년) 책을 추천한다. 이 책은 테스트 주도 개발에서 한 단계 더 나아가 ATDD(Acceptance TDD) 기반으로 애플리케이션을 개발하는 과정을 다룬다.
네이버에 입사한 첫 해 사내 스터디에서 읽었던 두 권의 책이 있다. 그 당시만 하더라도 번역서가 나오지 않아 원서로 책을 읽었는데 정말 힘들었던 기억이 난다. 힘들게 읽었던 만큼 기억에도 많이 남고 나를 한 단계 성장시키는데도 많은 도움이 되었다. 그 당시 읽었던 두 권의 책은 **도메인 주도 설계 : 소프트웨어의 복잡성을 다루는 지혜(에릭 에반스 저/이대엽 역, 위키북스/2011년)**와 **레거시 코드 활용 전략 : 손대기 두려운 낡은 코드, 안전한 변경과 테스트 기법(마이클 C. 페더스 저/이우영,고재한 공역, 에이콘출판사/2008년)**이다. 이 두 권 모두 경험이 쌓인 후 언젠가는 읽어봤으면 하는 책이다.
자기가 구현한 코드의 문제점을 파악하고 리팩토링하는 과정은 생각보다 쉽지 않다. 따라서 소스 코드에 대한 리뷰를 주고 받고, 토론할 수 있는 동료 개발자를 찾을 것을 추천한다. 나 또한 위 책을 읽을 때 혼자 읽기 보다는 스터디를 통해 읽으면서 토론하는 과정을 거쳤다. 혼자 코드를 분석하고, 이해하는 것에 비해 몇 배로 더 많은 것을 배우고 느낄 수 있다. 회사 내에서 스터디할 동료를 찾기 힘들다면 외부 커뮤니티에 참여하면 된다. 혼자 학습하지 말고 세상 밖으로 나와 더 많은 개발자들을 만나볼 것을 추천한다.
이 책에서도 배포 자동화와 관련해 일부 다루기는 했지만 배포 자동화를 위한 최소한의 내용만 다뤘다. 애플리케이션 개발을 해보면 애플리케이션 로직을 구현하는 시간보다 환경 세팅, 배포와 같은 작업이 계속해서 발생한다. 시간이 지나면서 이와 같은 부수적인 작업에 더 많은 시간을 투자하고 있는 자신의 모습을 볼 수도 있다.
이와 같이 단순, 반복적으로 발생하는 업무에 최소한의 시간을 투자하고 더 많은 시간을 핵심 로직을 구현하는데 투자하려면 꾸준히 자동화에 시간을 투자해야 한다. 이 작업을 담당하는 전담 개발자가 있으면 좋겠지만 대부분의 조직은 이 작업만을 전담하는 개발자가 없고 백엔드 개발자가 겸하는 것이 일반적이다. 또한 이에 대한 학습이 자신이 단순, 반복적으로 발생하는 업무를 자동화할 수도 있기 때문에 반드시 회사, 프로젝트만을 위한 투자가 아니다. 자신을 위해서라도 충분히 투자할만한 가치가 있다.
배포 자동화와 지속적 통합을 하기 위해 활용해야하는 도구가 많다. 활용해야하는 도구와 필요성, 사용 방법과 관련한 전반적인 내용은 성공으로 이끄는 팀 개발 실천 기술(이케다 타카후미,후지쿠라 카즈아키,이노우에 후미아키 공저/김완섭 역, 제이펍/2014년) 책으로 학습할 수 있다.
이 책을 통해 기본적인 학습이 끝났다면 다음 책을 통해 깊이를 더할 수 있다.
- 지속적인 통합 : 소프트웨어 품질을 높이고 위험을 줄이기(폴 M. 듀발,스티븐 M. 마티야스,앤드류 글로버 공저/최재훈 역, 위키북스/2008년) – 오래된 책이지만 지속적 통합에 대한 필요성, 지속적 통합을 위해 필요한 도구와 환경에 대해 설명하고 있다.
- 신뢰할 수 있는 소프트웨어 출시 : 효과적이고 지속적인 소프트웨어 개발의 모든 것(제즈 험블,데이비드 팔리 공저/유석문,김은하,설현준 공역, 에이콘출판사/2013년) – 지속적 통합 다음 단계는 지속적 배포 단계이다.
지속적 배포와 관련해 정말 빠르게 발전하고 있다. 특히 AWS와 같은 클라우드 서비스가 등장하고, 도커(docker)가 등장하면서 그 속도는 더 빨라진 듯하다. 접근 방식 자체도 변화하고 있다. 따라서 앞에서 추천한 두 권의 책은 현재 흐름과 맞지 않을 수 있다. 이 두 권의 책을 통해 지속적 통합과 지속적 배포에 대한 필요성과 과정을 파악하는 용도로 활용하고, 최근에 새롭게 등장하는 좋은 도구를 활용해 지속적 배포 환경을 구축해 나가면 된다. 이와 같이 빠르게 발전하는 분야의 지식을 습득하려면 책 보다는 다양한 온라인 문서를 활용하는 것도 좋은 방법이다.
지속적 배포를 하려면 정말 많은 노력을 기울여야하고, 개발자간에 개발 문화가 정착될 때 가능하다. 현실에서 달성하기 힘들 수도 있다. 하지만 이상적인 꿈을 꾸면서 현재 상태에서 실행가능한 부분을 조금씩 개선해 나간다면 언젠가 이상적인 환경을 구축할 수 있을 것이다.
기술적인 내용을 다루고 있는 이 책에 개발 문화, 개발 프로세스에 대한 주제를 넣을까 한참을 망설이다 넣기로 결정했다. 나는 개발자의 길을 걷기 시작하면서부터 불합리한 대한민국의 개발 환경을 접하면서 개발 문화와 개발 프로세스에 관심이 많았다. 불합리한 환경을 개선하기 위해 새로운 시도를 하고 실패와 성공을 맛보는 경험을 했다. 조금씩 조금씩 나아지고는 있지만 아직도 많이 부족하다. 개발자들이 이와 관련해 좀 더 많은 관심을 가지고 변화를 시도했으면 하는 바람으로 추가했다.
나는 다른 어떤 기술적인 부분보다 개발 문화와 프로세스에 대해 관심을 가지고 역량을 쌓고 경험을 하는 것이 중요하다고 생각한다. 아무리 많은 기술적인 역량을 가지고 있더라도 같이 일하는 주변 개발자 혹은 내 자신이 행복하지 않다면 그 얼마나 불행한 일인가? 직장과 가정에 조화를 이루면서 일을 할 수 없다면 얼마나 불행한 일인가? 개발자로서 지속적인 성장을 할 수 없고 보람을 느끼지 못한다면 얼마나 불행한 일인가? 이 모든 것이 개발 문화와 개발 프로세스를 통해 결정된다.
좋은 개발 문화, 개발 프로세스는 내가 아닌 다른 사람이 만들어 주지 않는다. 내 자신부터 관심을 가지고 시도하고, 실천할 때 조금씩 전진할 수 있다. 내가 꿈꾸는 세상을 실현할 수 있다. 개발 문화, 개발 프로세스는 리더, 팀장만 관심을 가지고 만들어 가는 것이 아니다. 구성원 전체가 만들어 가는 것이다. 초보 개발자일 때부터 조금씩 관심을 가지면서 기존 권위에 맞서 싸울 수 있는 용기를 키웠으면 한다.
내가 이 주제와 관련해 처음 읽었던 책은 **피플웨어(톰 드마르코,티모시 리스터 공저/박재호,이해영 공역, 인사이트/2014년 )**이다. 3,4년 정도 개발 경험을 한 상태에서 읽었는데 그 당시 고민하고 있던 많은 부분에 대한 해결책을 얻을 수 있었다. 하지만 현실에 적용하는데는 나의 영향력도 적었으며, 한계가 있었다. 그럼에도 불구하고 언제가 나의 영향력이 커지면 실현해 보겠다는 마음은 남았다.
개발 문화, 개발 프로세스에 대한 주제에 대한 학습은 일정 기간 경력이 쌓이고, 리더의 역할을 맡는 순간이 가장 학습 효과가 좋았다. 초보 개발자일 때는 프로세스를 통해 뭔가 자유를 억압하는 듯한 느낌이 들어 거부감이 든다. 나 또한 이와 관련해 많은 고민을 하고 집중적으로 학습한 시기는 팀장 역할을 맡았던 때이다. 내가 팀장 역할을 맡았을 때 나의 고민을 덜어준 책을 소개한다.
- 익스트림 프로그래밍(켄트 벡,신시아 안드레스 공저/김창준,정지호 공역, 인사이트/2006년) – 책 제목을 통해서도 느껴지듯 새로운 시각과 프랙티스를 많이 접할 수 있었다. 특히 소프트웨어 개발에서 가장 중요한 역할을 하는 사람에 대한 배려가 느껴지는 책이었다.
- 린 소프트웨어 개발(메리 포펜딕,톰 포펜딕 공저/김정민,김현덕,김혜원,박영주 공역/김창준 감수, 인사이트/2007년) – 이 책은 도요타라는 자동차 회사의 일하는 방식을 소프트웨어 개발에 적용하는 과정을 소개한다. “익스트림 프로그래밍”을 통해 대략적인 방향을 잡았다면 이 책을 통해 소프트웨어 프로젝트를 어떻게 효율화하는 것이 좋겠는지에 대한 구체적인 방법을 찾을 수 있었다. 이 책이 소개하고 있는 린 사고방식은 최근 “린 스타트업” 문화로까지 발전했다.
위 2권의 책을 통해 개발 문화, 개발 프로세스를 만드는 것이 효율적인 프로젝트를 위해, 우리 개발자들의 행복을 위해 얼마나 중요한 것인지를 느낀 후 애자일 프로세스, 지속적 통합, 지속적 배포와 같은 자동화와 관련한 다양한 분야로 관심사를 넓혀갈 수 있다.
좋은 개발 문화, 개발 프로세스를 만들기 위해 이와 관련해 책 몇권 읽고 실천한다고 되는 것이 아니다. 좋은 개발 문화, 개발 프로세스를 만들고 정착시키려면 현재 자신의 조직, 팀이 안고 있는 가장 큰 문제가 무엇인지를 찾는 것이 우선이다. 우리가 리팩토링을 할 때 나쁜 냄새가 나는 코드를 찾아 개선했듯이 조직, 팀의 문제점을 인식하는 것이 중요하다. 다음 단계는 이 문제 중 우리의 영향력하에서 실천할 수 있으며, 적은 비용을 투자해 가장 큰 효과를 볼 수 있는 문제를 찾아 실천해야 한다. 작은 시도라도 괜찮다. 한 번에 큰 변화를 하는 것보다 더 중요한 것은 작은 시도라도 해서 성공을 맛보는 경험이 중요하다. 이런 작은 성공 경험이 쌓이면 더 큰 변화도 수용할 수 있는 힘이 생긴다. 이와 같은 단계를 반복하면서 지속적으로 개선할 때 자기 조직, 팀에 맞는 개발 문화와 개발 프로세스가 만들어진다. 다른 회사, 조직에서 성공한 문화, 프로세스를 무조건적으로 수용하는 것은 실패의 지름길이다.
먼저 자신의 영향력하에서 해결 가능한 문제를 찾아라. 이 문제를 해결하기 위한 해결책을 찾기 위한 방법으로 개발자들의 사례, 책을 활용한다면 개발 문화, 개발 프로세스에 대한 관심도 높아지고, 성공하는 순간의 짜릿함도 느낄 수 있다. 이는 비단 개발 문화, 개발 프로세스 뿐만 아니라 다른 기술적인 지식을 학습할 때도 같다. 우리가 새로운 지식을 학습하기 위한 가장 큰 동기부여는 내가 해결하고 싶은 문제가 있을 때이다. “린 소프트웨어 개발” 책을 보면 “가능한 늦게 결정하라”는 내용이 있다. 학습 또한 다른 사람들의 속도에 맞추지 말고 자신의 속도에 맞춰, 현재 해결하고 싶은 문제가 발생할 때까지 학습할 주제에 대한 결정을 최대한 늦춰보는 것은 어떨까? 그런 의미에서 “내가 무엇을 학습하는 것이 좋을까?”에 대해 고민하기 보다 “내가 소프트웨어를 통해 해결하고 싶은 문제는 무엇인가?”에 대해 먼저 고민해 보면 어떨까?