시스템을 개발하는 방식에는 여러가지가 있을 수 있다. 가장 크게는 남이 개발해주는게 있고, 내가 개발하는게 있겠다. 우리나라에서 소위 SI(혹은 외주)라고 부르는 방식이 남이 개발해주는 방식이다. 이런 개발을 “프로젝트” 방식이라고 한다. 대체로 요구 사항과 기간을 개발사에게 전달한다. 물론 돈과 함께. 개발사는 최대한 맞춰 개발하고 그 결과를 전달한다. 물론 필요하면 설치와 운영에 필요한 사항까지 잘 마무리해야지. 그리고 남은 돈을 받는다! 돈을 받으면? 끝이지! 개발하는 사람의 책임은 여기서 끝난다. (물론 구질구질하게 붙잡고 늘어지는 경우가 매우 빈번하다는…)
내(회사)가 직접하는 시스템 개발 방법은 다른가?
내(회사)가 개발해서 내(회사)가 사용할 시스템을 만드는 개발 그 자체는 남이 만들든 내가 하든 비슷하다. 다름은 개발이 끝난 후 사용하고 고치기 시작할 때 생긴다.
자체적으로 개발할 진행할 때도 마찬가지로 남이 하는 프로젝트 방식을 쓸 수 있다. 이 방식은 앞서 언급한 바와 같이 “끝”이 있다. 끝나면 개발을 진행하던 사람들은 보통 흩어지고, 시스템은 운영 전담 조직이 맡는다. 운영 과정에서 생기는 자잘한 수정 사항들은 운영 선수들이 직접 고치기도 한다. 하지만 시간이 흐르고 자잘하지 않은 문제점들이 쌓이면? 결국 남들이 하듯이 “고도화” 프로젝트 후, “차세대” 프로젝트에 돌입한다. 대체로 새로운 선수들이 새로운 마음 가짐으로 “고도화” 혹은 “차세대”를 진행한다. Original 프로젝틀 진행했던 사람들이 참여할 수 있다면 운이 좋은 편이다.
현재 사용중이지만 과거에 끝나버린 프로젝트를 새로운 마음으로 다시 한다는 건 생각 이상의 비용을 요구한다. 혹자는 소스도 가지고 있고, 개발자도 있는데 그게 왜 문제인지 질문할지 모른다. 신이 내려주신 “망각”이라는 재능을 잊지 말자. 이외에도 개발하던 환경이 홀라당 날라가버렸을 수도 있다. 혹은 믿었던 소스가 알고보니 스파게티 짜장이었을 수도! 사실 이게 더 큰 비용 유발자일수도 있다. 끝내는데 급급한 경우가 많을수록 파스타/짜장면 잔치가 벌어질 가능성이 더 많으니까.
남이 아닌 내가 하는 방식은 그럼 뭘까?
개발하면서 운영하고, 운영하면서 또 개발하는 방식이다. “끝”없이 계속 개발하는 것이다.
개발이 끝없이 이어지는 경우에는 다른 관점이 필요하다. 어제 작성한 코드를 가지고 오늘 작업하고 내일 또 이어져야 한다. 결국 코드가 이뻐야 한다. 지속 가능하고 관리 가능한 코드를 뽑아야 한다. 마찬가지로 이번주에 고친 코드를 배포해야하고, 또 다른 개발이 이어져야 한다. 손쉽게 배포할 수 있는 환경이 있어야 한다. 분리된 독립적인 개발 환경을 사용할 수 있어야 하고, 또 손쉽게 개발 환경을 만들 수 있어야 한다. 나만 개발하는게 아니니까.
고치다보면 고장나기 쉽다. 어찌되든 실수는 피할 수 없다. 그리고 실수는… 비난하지 말자. 사람은 실수를 통해서 배우고, 성장한다. 그럼에도 서비스는 계속되어야 하는데… 가장 좋은 방법은 고장의 영향도를 최소화하는 것이다. 서비스 전체가 죽어버리는 것보다도 절반은 살아남는게 그나마 다행이지 않을까? 그래서 요즘 마이크로 서비스 아키텍처가 대세가 된게 아닐까 싶기도 한다. 잘게 쪼갠 협력 모델이면 그나마 장애의 영향 범위를 제한시킬 수 있으니까.
그럼 “끝”없는 개발은 언제 끝나는 거지? 마침표를 찍는 지점은 더 이상 이 기능(서비스)를 사람들(고객)이 찾지 않을 때다. 이 지점에서 서비스는 종료되고, 시스템은 폐기된다. 버뜨… 서비스는 없어지는 경우는 그닥 없다. 다만 마이크로한 기능이 사라질 뿐이지. 소위 현대적인 방법으로 시스템이 만들어졌다면, 없어지고 새로 태어나는게 일상 다반사여야 한다.
어떤게 더 좋은 모델일까?
사실 정답은 없다. 다만 서비스를 제공하는 회사/조직 안에 답이 있는 것 같다. 규모가 있고 결과론을 중시하는 조직 스타일이라면 프로젝트 방식이 적합한 개발 모델일 수 있다. 능력있는 개발 집단을 구성하고 수행해야할 프로젝트를 빠른 속도로 개발한다. 안정화 후 별도 팀이 이를 넘겨 받아 이후 운영한다. 능력자들로 구성된 강력한 개발 파워를 최대화할 수 있고, 적절한 운영 조직을 갖춘다면 안정된 체계를 완성할 수 있다.
그러나 도메인에 대한 지식을 개발자의 쌓을 수 없다는 치명적인 단점이 있다. 또 개발이 기획서 중심으로 나갈 수 밖에 없다. 개발하는 사람들이 그 도메인에 대해서 모르니 “상세한 과업 지시서“가 있어야 개발이 가능하다. 때문에 중간에 뭔가가 바뀌는 걸 극히 싫어할 뿐만 아니라 이런 경우가 발생하면 차세대 시스템용 기획서가 나와야 할지도 모른다. 능력자분들이 개발만을 특히 좋아하는 개발자들이라면, 되려 이 방식을 매우 선호할 수 있다. 이 방식에서 마이크로 서비스 아키텍쳐? 명확하다면 Monolithic이 답이 아닐까? 굳이 쪼갤 필요가…
서비스 방식의 개발은 그래서 소규모 조직에서 작게 시작해서 점진적으로 성장하는 환경에서 활용될 수 있다. 작은 조직에서 작은 규모로 개발을 시작한다. 고객의 피드백에 따라 빠르게 변화를 가져간다. 빠른 변화를 위해서 제품의 핵심을 명확히 한다. 각각의 구성 요소들을 개별적인 소규모 서비스로 정의하고 개발한다. 이래야 빠른 피벗(Pivot)을 위해 뭘 가져가고, 뭘 버릴지 빠르게 판단할 수 있기 때문이다.
문제가 없는 건 아니다. 이 방식도 많은 중복이 있다. 마이크로 서비스 구조라고 하더라도 각각이 독립적인 어플리케이션이 되야하기 때문에 Server, Application Framework, CI/CD 등등의 중복 투자가 필요하다. 이런 Redundancy를 관리하기 위한 Governance 조직도 필요하다. 그래야 어느 정도의 일관성이라는 것을 유지할 수 있으니까. 또한 잘게 쪼개져있다보니 서비스적으로 업무적으로 조율이 있어야 한다. 누가 어느 기능을 개발하지, 혹여라도 이미 다른 마이크로서비스에서 개발된 기능을 중복해서 개발하고 있는건 아닌지 역할에 따른 기능을 매번 확인하고 확인해야 한다. 개발자 입장에서 또 다른 문제는 하나의 도메인에 개발자가 종속된다는 것이다. 좀 다른 일좀 해보고 싶더라도 업무에 깊숙히 들어가있으면 빠져나갈 도리가 없는 경우가 왕왕 있다.
그래서 나는?
나한테 질문한다면 “고객/사용자“를 먼저 생각할 것이다. 그럼 서비스 중심 개발이 답이다. 고객과 사용성에 빠르게 반응할 수 있기 때문이다.
끝없는 단거리 경주를 언제까지 해야할지 모르지만, 사용자에게 사용자를 위한 서비스 시스템을 만든다면 이 방법이 정답이다!
– 끝 –