2012년 8월 30일 목요일

요구사항이 계속 바뀌기 때문에 스펙을 적을 수 없다.

소프트웨어 개발 프로젝트에서 스펙을 제대로 적지 않는 회사들에게 그 이유를 들어보면 여러가지가 있다.

1. 프로젝트 기간이 너무 짧아서 스펙을 적을 시간이 없다.
2. 프로젝트가 너무 복잡해서 적어야 할 것이 너무 많아서 적을 수 없다.
3. 요구사항을 계속 바꿔서 스펙을 적을 수가 없다.

위의 어떠한 이유도 적절한 이유가 되지는 않는다. 오직 한가지 이유가 될 수 있다면 다음과 같은 것이 있을 수 있다.
"우리는 분석역량이 떨어져서 스펙을 적을려고 해도 제대로 적을 수 없다. 그래서 그냥 개발한다."

위 1,2,3번의 이유 때문에라도 스펙을 적어야 하는 것이다.
이중에서 3번 "요구사항이 계속 바뀌기 때문에 스펙을 적을 수 없다"에 대해서 얘기를 해보고자 한다.

99%의 소프트웨어 프로젝트는 분석 기간은 당연하고 설계, 구현 중에도 요구사항이 계속 바뀐다. 단지 프로젝트마다 바뀌는 정도의 차이가 있을 뿐이다.

스펙을 제대로 적었다는 전제하에 스펙을 결정한 후에도 요구사항이 계속 바뀌는 이유는 다음과 같은 것들이 있다.

1. 시장 상황의 변경
2. 경쟁 업체의 신제품 출시
3. 기술 환경의 변화
4. 미처 파악하지 못한 비즈니스 요구사항 발견
5. 예상치 못한 개발 상의 난관 봉착
6. 경영진의 변덕
7. 영업, 마케팅 부서의 끊임 없는 요구

이런 저런 이유로 요구사항 변경 요구는 계속 되기 마련이다. 스펙을 제대로 적어 놓지 않으면 이러현 변경 요구가 관리되지 않는다. 또한, 변경 프로세스를 적용하면 좀더 합리적인 변경 관리가 가능한다.

프로세스라고 하니까 뭔가 매우 부담스러워하고 특히, 영업과 마케팅 부서는 싫어하는 경향이 있다. 과거에는 코딩 중이라고 하더라도 친한 개발팀장에게 추가로 요구를 하면 잘 들어 줬는데 변경 프로세스를 밟으라고 하면 싫어하기 마련이다. 하지만 중요한 프로젝트의 일정과 품질에 영향을 줄 수 있는 결정에 큰 Risk를 안으면서 그냥 결정할 수는 없다.

변경 프로세스의 핵심은 "변경 영향 평가"이다. 이것도 그렇게 거창한 것은 아니다. 새로운 요구사항이 프로젝트에 어떠한 영향을 주는지 정량화하는 것이다. 일정이 더 필요할 수도 있고, 오히려 줄어들수도 있다.(드물지만) 또한 기술적인 위험이 증가할 수도 있다. 짧게는 10분, 길면 몇시간 걸리는 일이다. 스펙을 제대로 적어 놓지 않았다면 요구사항 변경으로 인해 아키텍처에 어떠한 영향을 주는지 파악하기 어렵고, 일정에 미치는 영향도 판단하기 어렵다. 그래서 스펙이 필요한 것이다.

변경 영향 평가가 되었다면 이러한 영향이 있는데도 불구하고 새로운 요구사항을 반영해야 하는지 투명하게 판단을 해야 한다. 어떤 요구사항은 정말 간단한 것 같은데 프로젝트에 큰 악영향을 주는 것도 있고, 커보이는 요구사항이 프로젝트에 문제 없이 포함될 수 있는 것도 있다. 즉, 요구사항 변경이 합리적으로 결정될 수 있다.

변경이 쉽지 않다는 것을 잘 알기에 스펙을 제대로 적고 철저히 리뷰하는 문화가 더욱 견고해지는 것이다.

이러한 프로젝스와 문화가 정착된다면 개발자들도 터무니없는 기능 추가 요청에 일정은 절대 안바꿔주는 비합리적인 요구는 줄어들게 된다. 스펙을 제대로 적고 변경을 관리하는 것이 회사에도 이익이지만 개발자에게는 더욱 좋은 문화임에도 많은 개발자들이 거부하는 경향이 있다. 이는 개발자들 탓이 아니다. 그동안 개발환경이 근거없는 일정 강요와 야간에 내몰리다보니 하루라도 빨리 코딩을 해야 한다는 생각에 내몰린 것이다.

또한, 무리한 요구사항 변경 요청에 "아키텍처를 너무 많이 바꿔야 한다". "몇달이 더 필요하다"라고 하면 개발자들은 항상 안된다고 주장한다고 치부를 해버리곤 한다. 그래서 무리한 변경 요구에 개발자들이 주로 약자가 되곤 한다.

스펙이 잘 작성된다면 일정, 리스크, 비용 등 모든 것에 근거가 생기고 합리적으로 결정할 가능성이 훨씬 높아지게 된다. 

스펙은 프로젝트가 끝날 때까지 계속 바뀌게 되어 있다. 그래서 스펙은 계속 업데이트가 되어야 한다. 하지만 합리적으로 변경 관리가 되어야 한다.

2012년 8월 27일 월요일

주먹구구식 개발이 통하는 이유

우리나라의 많은 소프트웨어 회사들은 주먹구구식 개발에 대한 환상이 있다.
특히, 첫번째 시스템을 주먹구구식으로 개발을 해서 성공했는데 지금은 좀더 체계를 갖췄는데 더 개발이 잘 안된다면 과거 진짜 주먹구구식으로 개발할 때를 그리워하고 그 때로 돌아가고 싶어 한다.

여기 이와 관련된 과거 글이 있다. 

주먹구구식으로 개발을 하다가 현재 체계를 갖추려고 노력하고 있다면 아직은 불완전할 뿐더러 반쯤은 주먹구구인 것이다. 그럼 주먹구구식 개발은 어떤 것인지 정의를 내려보자. 크게 5가지로 설명할 수 있다.

첫째, 스펙/설계 없이 개발을 하는 것이다. 또는 기능명세서, 시방서 등의 문서에 기능만 정리하여 개발하는 것이다. 이 방법은 프로젝트 전체 범위를 알 수 없을 뿐더러 좋은 아키텍처를 만들 수도 없고, 개발자들이 효과적으로 일을 나눠서 개발할 수도 없으며 프로젝트 진척상황을 거의 파악할 수 없다. 일정 지연은 일상이고 그야말로 끝나봐야 아는 것이다.

둘째, SVN, Git 등의 소스코드관리시스템과 Jira, Mantis, Redmine 등의 이슈관리시스템 없이 개발하는 것이다. 둘중 하나라도 사용하지 않으면 심각한 문제이다. 일단 쓰기만 하더라도 다행이지만 제대로 쓰는 것은 정말 어렵다. 대부분은 10% 정도의 기능밖에 사용하지 못하지만, 100% 기능을 활용해야 한다.

셋째, 혼자 북치고 장구치고 다하는 것이다. 일을 전문적으로 나눠서 하는 것이 아니고, 혼자서 기획, 분석, 설계, 코딩, 테스트, 빌드 등등 다 하는 것이고 이런 개발자가 여럿이고 서로 중복되서 일을 하기도 한다. 첫째에서도 언급했듯이 스펙이 제대로 작성되어야 일을 효과적으로 나눌 수 있는데 스펙이 없거나 부실하면 이런 현상이 벌어진다. 또, 회사의 조직이 소프트웨어 개발에 알맞게 효과적으로 구성되어 있지 않아도 이런 일이 벌어진다. 소프트웨어는 전문가들이 협업하여 개발하는 것이다.

넷째, 프로세스 없이 대충 개발하는 것이다. 흔히들 프로세스는 개발을 더 느리게 만든다고 주장하곤 한다. 그러면서 회사에서 프로세스를 만들려고 하면 반대 주장을 펼친다. 과거에 개발하던 방법을 서로 암묵적으로 알고 있다가 대충 개발을 하고 서로 이심전심으로 문제를 해결해 나간다.

다섯째, 리뷰, 공유 없이 개발하는 것이다. 가끔은 대충 기능목록 작성해서 마케팅이나 영업, 경영진과 리뷰를 하기도 하지만 제대로 된 리뷰는 아니다. 개발자를 제외하고는 지금 어떤 제품을 만드는지 정확하게 파악이 안된다. 심지어는 개발자들도 잘 모른다. 다 만들어봐야 어떤 제품을 만들었는지 알게 된다. 그러니 만들기 전에는 무슨 문제가 발생할지 몰라서 만드는 도중에 수많은 문제가 발생하고 재작업은 수시로 이루어 진다. 심지어는 80%쯤 만들었다가 아키텍처가 잘못된 것을 발견하고 다 버리고 다시 만들기도 한다.

정도의 차이는 있을 수 있다. 다섯가지 중에서 하나 이상이면 아직 주먹구구식 개발에서 완전히 벗어난 것이 아니다. 스스로도 주먹구구식으로 개발을 하고 있는지 평가를 해보자.


그럼에도 불구하고 주먹구구식 개발이 여전히 통하는 이유는 무엇일까?

첫째, Software의 크기가 아주 작다.
빌딩은 제대로 된 분석/설계 없이, 프로세스 없이 만드는 것은 불가능하다.
하지만 개집은 그런 것 필요 없다. 대충 만들어도 문제 없이 만들 수 있다. 한 사람이 머리 속으로 모든 것을 설계해서 만들 수 있는 정도의 규모라면 주먹구구식 방법도 훌륭한 방법이다.

둘째, 이직률이 극도로 낮다.
한번 개발을 해 놓으면 개발자들이 절대로 퇴사를 하지 않고 끝까지 책임져준다. 

셋째, 회사 규모가 작다.
개발자도 몇 명 안되서 서로 너무 잘 알고 모든 이슈가 더 구두로도 공유가 되고 급한 이슈는 자리에서 바로 일어나서 공유가 되고 논의할 수 있다. 가족적인 분위기에서 주먹구구식 방법이 훌륭하게 작동한다.

넷째, 소프트웨어 업그레이드가 없다.
한번 개발해 놓은 시스템이 업그레이드가 필요 없는 경우이다. 어떻게 든 첫번째 개발을 해 놓으면 문제가 없다.

그럼, 주먹구구식 개발이 앞으로도 계속 통할까?

회사가 잘되면 회사는 커지게 되어 있다. 개발자 수는 많이 늘게 되고 더 이상 자리에서 일어나 뒤로 돌아도 모든 개발자의 얼굴을 볼 수 없게 된다. 과거처럼 공유가 그렇게 잘 되지 않는다.

개발자들이 영원히 이직하지 않고 직원으로 있기를 바란다면 너무 큰 욕심이다. 개발자들은 언젠가는 이직을 하게 마련이고, 개발자들이 이직을 해도 개발은 잘 돌아가도록 되어 있어야 한다. 주먹구구식으로 계속 개발을 하게 된다면 아무리 가족적인 분위기라고 하더라도 직원이 Risk 요인이 된다.

Software 회사의 경영자라면 지금 대충 잘 굴러가는 것 같다고 해서 방심하면 안된다. 회사가 잘 되면 회사는 커지고 직원도 늘고 더 복잡해질 것이다. 문제를 모르고 방심하다가 문제가 터지고 나면 터진 댐을 막으려고 하는 것처럼 어렵다. 항상 미리 준비를 해야 하는 것이다.

물론, 처음부터 제대로 하는 것이 가장 빨리 개발하는 방법이고 좋지만 그것을 깨닫기는 매우 어렵다. 대부분은 문제가 터진 후에 우왕좌왕 한다. 주먹구구식 개발이 지금은 통할지도 모른다. 하지만 곧 주먹구구식 개발이 문제가 되는 상황이 올 것이고 이미 문제가 되고 있다면 너무 늦지 않았기만 바랄 뿐이다. 늦었다고 생각할 때가 가장 빠른 때이다.

2012년 8월 23일 목요일

소프트웨어 회사에서의 관리란?



소프트웨어 회사가 경쟁력을 가지려면 전통적인 관리와는 좀 다른 관리 방법이 필요하다.

첫째, 상하관계 탈피이다.

전통적으로 관리자는 윗사람이고 팀원들은 관리자의 지시를 따르고 관리자가 거의 모든 것의 결정권을 가지고 있다. 하지만 소프트웨어 회사에서 관리자는 기술적인 결정을 할 수 없다. 개발자 출신이라고 기술적인 결정도 하려 하는 경우도 있지만, 기술적인 결정은 개발자의 몫이다. 그리고 전사적인 중요한 기술적인 결정은 CTO나 회사의 최고 개발자들이 하는 것이다.

관리자는 위에서 지시하는 사람이 아니고 개발자들이 개발에 매진할 수 있도록 회의, 보고서 작성, 보고, 의견 조정 등 힘든 일을 도와주는 역할을 해야 한다. 물론 경험이 많은 사람들이 잘할 수 있는 일이기 때문에 평균 개발자보다는 나이가 더 많을 수는 있다. 그렇다고 하더라도 상하 관계보다는 개발자를 지원하고 경영자를 보좌하는 역할로서의 관리자가 더 필요하다.

둘째, 투명한 관리이다.

소프트웨어는 인류가 만들어낸 가장 복잡한 지식산업이다. 너무 복잡하고 이슈가 많기 때문에 모든 이슈를 시스템에 저장해서 관리하고 모두 투명하게 오픈하지 않으면 감당하기 어렵다. 버그, 기능, 프로젝트 일정, 개발 현황 등 모든 것은 한눈에 볼 수 있도록 해야 한다. 내용을 채우는 것은 개발자 및 전직원이지만 관리자는 이런 모든 정보가 빠짐없이 시스템화 되어서 제대로 공유가 되는지 확인을 해야 한다. 

경영자도 이런 시스템을 통해서 개발현황을 훤히 볼 수 있어야 하고 관리자는 시스템을 이용하여 보고서를 작성하여 시간을 절약할 수 있다.

셋째, 자율이다.

소프트웨어 개발은 관리자가 하나하나 시켜서 진행하기에는 너무 복잡하다. 그렇게는 일이 진행되지 않는다. 큰 그림에서는 PM이나 관리자가 파악하고 도와주지만 자세한 일은 개발자 스스로가 해야 할 일을 정하고 일정을 조정하고 해나가야 한다. 이렇게 일을 진행하더라도 혼자서 알아서 진행하는 것이 아니고 모두 이슈관리시스템에 기록을 하고 진행해야 한다.

개발자들이 윗사람이 일을 시키기만 기다리고 있다면 개발 프로젝트는 효율적으로 진행되지 않는다. 이슈관리시스템은 이런 자율적인 개발진행에 큰 도움을 준다. 일단 이슈가 등록되면 전사 이슈가 되어서 수많은 사람들의 의견을 더해서 이슈의 우선순위가 정해지고 진행 상황을 훤히 파악할 수 있다.


물론 전통적인 관리자의 모습에서 하루아침에 바뀌기는 어렵다. 하지만 소프트웨어 개발문화와 충돌이 있는 부분은 엄연히 존재하며 조금씩 바꿔나가야 할 부분이 있다. 큰형님처럼 보살펴주고 모든 것을 무한 책임지며 진행하고 도전적인 일정을 달성하기 위해서 무조건 쪼는 모습에서 조금씩 바꿔보자.



2012년 8월 21일 화요일

유지보수의 거미줄에 걸린 고참들

고참은 유지보수를 하고 신참들이 신제품을 개발하는 모습을 어렵지 않게 볼 수 있다.

고참들이 경험도 많고 신제품을 만드는데 더 적임이지만 그럴 수 없는 이유가 있다.

기존 제품의 유지보수에서 도저히 빠져나갈 수 없는 것이 그 한 이유이다. 간단한 업그레이드가 아니고 완전히 새로운 제품을 만들려고 하는 이유도 기존 제품이 유지보수가 너무 복잡하고 기능을 추가하거나 수정하기에 아키텍처가 더이상 감당이 안되기 때문인 경우가 많기 때문이다.

현 제품의 유지보수는 당장 회사의 생존이 달린 문제이기 때문에 신제품이 개발되기 전까지는 고참들이 버텨줘야 한다. 문제는 자칫하면 신제품이 기존 제품보다 훨씬 못하는 경우가 종종 벌어지는 것이다.

이렇게 고참들이 유지보수에서 빠져 나오지 못하는 이유는 무엇인가?

첫째, 유지보수 문서의 부실이다.

고참들은 수시로 기존 제품의 유지보수에서 빠져나오기 위해 온갖 인수인계 노력을 한다. 하지만 쉽지 않고 성공적인 인수인계가 잘 이루어지지 않는다. 인수인계를 위해서 작심을 하고 유지보수에 관련된 모든 내용을 문서화하고 교육도 한다. 하지만 후배들은 그 문서를 보고 유지보수를 잘 해내지 못한다.

개발할 때 개발을 위해서 작성한 문서가 아니고 차후에 유지보수를 위해서 만드는 문서는 제대로 작성하기가 어렵다. 수많은 내용이 빠져도 알아챌 수가 없고 정성껏 작성하기도 어렵다. 문서는 개발 중에 그 때가 아니면 다시 작성하는 것은 거의 불가능하다. 그런데 이미 그 때를 놓쳤기 때문에 유지보수를 위한 제대로 된 문서를 다시 만들어 내기란 몇배 어려운 일이 되어 버렸다.

둘째, History의 부재이다.

또, 그동안 유지보수 History가 잘 기록되어 있으면 다행이지만 그렇지 않은 경우 유지보수 인수인계가 어려워진다. Mantis, Jira, Redmine 등의 이슈관리시스템에 유지보수를 포함한 모든 개발 History가 기록되어야 한다. 이슈관리시스템을 쓴다고 해도 100% 사용하지 않으면 안된다. 소스코드를 한줄이라도 고친 내용은 모두 이슈관리시스템에 기록이 남아 있어야 한다.

셋째, 복잡한 Architecture이다.

첫번째 버전에서 시장의 요구에 따라서 기능이 덕지덕지 붙다보면 어쩔 수 없이 컴포넌트의 구분도 없고 인터페이스가 보통 복잡해지는 것이 아니다. 오랫동안 유지보수를 해온 개발자가 아니면 이를 제대로 파악하기가 어렵다. 그러다보니  고참이 계속 유지보수를 하는 것이다.

이 또한 처음 개발 당시부터 미래의 비즈니스 전략을 고려하여 컴포넌트를 잘 나누어서 깨끗하게 개발을 해야 한다. 그렇지 않으면 아무리 유지보수를 위한 문서를 잘 작성하여도 어려운 상황이 된다.

이런 상황이 계속되다보면 기존에 열심히 일하던 고참들도 즐겁게 일하지 못하고 보람도 떨어지면서 이탈이 많이 일어난다. 

가끔은 이렇게 소수의 핵심인력에 회사가 전적으로 의지하는 시스템을 본인들이 원하기도 한다. 하지만 이런 현상은 나중에 본인들의 발목도 잡고 회사의 큰 리스크가 된다.

해결책은 원인의 반대이다.

개발 당시 스펙/설계 문서를 제대로 작성하고 컴포넌트를 잘 나눠서 개발을 하고 소스코드관리시스템과 이슈관리시스템을 사용해서 모든 기록을 남기고 투명하게 개발하면 되는 것이다. 그렇게 되면 유지보수 단계가 아니라 구현단계에서도 다른 사람들이 얼마든지 도와줄 수 있고 분석이나 설계만 하고 빠져나와 다른 프로젝트를 수행할 수도 있다.

내가 지금 퇴사를 하면 회사에 무슨 일이 벌어지는지 한번 생각해보자. 당장 지금 진행 중인 프로젝트나 유지보수가 문제 없이 진행이 되면 회사에 가장 필요한 인재이다. 그렇지 않고 당장 큰 문제가 되면 당장은 꼭 필요하지만 동시에 회사의 리스크이므로 고민스럽지 않을 수 없다.

2012년 8월 20일 월요일

내인생 최고의 멘토를 만나다.

소프트웨어를 개발하면서 또, 컨설팅을 하면서 하고 싶었던 얘기를 해보자고 블로그를 시작한지가 벌써 4년이 되었다. 3천명이 넘는 구독자와 많은 분들이 글을 읽어 주셨다. 최근에는 Tech it에 칼럼을 기고하기 시작해서 좀더 많은 분들이 글을 읽게 되었다. 

내 글을 읽는 분들의 반응은 무척 다양하다. 꾸준히 읽고 호응하는 댓글을 계속 남기시는 분들 중에는 기억에 남는 분도 많다. 댓글은 없어도 꾸준히 읽고 계신 분들도 있고 물론 호응하지 않는 분들도 있을 것이다. 가끔은 반대의견을 제시하는 분들도 있다. 그런 모든 분들이 소중하지만 가끔은 제 글에 대해 "컨설턴트의 말빨이다.", "현실을 모른다", "실제 개발 경험은 있는 것일까?"라는 종류의 의구심을 가진 분들이 있다. 내 글들이 워낙 직설적이라서 가끔은 오해와 충돌을 불러 일으킨다. 물론 어느 누구도 모든 사람을 이해시킬 수는 없지만 오늘은 나에 대해서 조금 설명해보고자 한다. 나에 대한 이해가 내 글을 약간이나마 더 이해하는데 도움이 되길 바란다.

나는 여러분들과 같은 대한민국 개발자이다. 블로그에서 하지 말라고 하는 거의 모든 것을 다 해봤고 문제점도 직접 다 겪어본 개발자다. 대한민국 보통의 개발자와 크게 다르지 않았다. 

18년 전 첫직장은 운좋게 그당시 우리나라 최고의 Software회사였던 한글과컴퓨터였다. 우리나라에서 둘째가라면 서러워할 최고의 개발자들과 같이 일했고, 나또한 코딩을 정말 잘했다. 그때 Daily build라는 것도 배우고 소스코드관리 등 소프트웨어 회사가 기본적으로 갖춰야 할 것을 잘 배웠다. 이런 좋은 환경에서 최고의 개발자들과 같이 일할 수 있었던 것은 내게 큰 행운이었다.

그리고 스타트업컴퍼니에서 일해도 보고 직접 회사도 해보면서 내 블로그에서 문제점이라고 지적하고 있는 것의 대부분은 해본 것 같다. 그래서 많은 개발자들이 왜 그런 문제점에 빠져드는지 정말 잘 알고 있다. 그당시도 나름대로 기반시스템이나 스펙, 설계 등에 노력을 했지만 항상 풀리지 않은 수수께끼와 같았다. 인터넷을 뒤지고 책을 봐도 해결되지 않았다.

그러다가 안철수연구소에 입사하고 그당시 CTO로 계시던 김익환 부사장님을 만나면서 나의 개발자로서의 인생이 바뀌었다고 볼 수 있다. 김익환 부사장님은 미국 스탠포드에서 소프트웨어를 공부하고 20년간 GE, 선마이크로시스템즈 등에서 소프트웨어를 개발하셨다. 그래서 오랫동안 해결되지 않았던 수수께끼들이 해결되기 시작했다. 안철수연구소의 동료 개발자들과 같이 실리콘밸리의 개발문화도 배우고, 스펙/설계 작성하는 방법도 배우고 개발 프로세스도 제대로 배워 나갔다. 

지금 생각해보면 내가 그때 안철수연구소를 가지 않았더라면 대부분의 개발자들과 같이 지금도 수많은 문제를 안고 비효율적으로 힘들게 개발을 하고 있을 것이다. 지금도 김익환 사장님(현재)과 10년째 같이 일하면서 계속 배우고 어제와 또 다른 내가 되어가고 있다.

나는 현재 컨설턴트이지만 지금도 개발을 계속 하고 있는 실전 소프트웨어 개발자이다. 내 글들의 대부분은 나의 개발과 컨설팅 경험에서 나오는 것이고 또 상당분분은 김익환사장님의 말씀에서 영감을 얻어서 작성한다. 그냥 말만 앞세운 공허한 소리는 아니다.

블로그의 글들이 한번 생각해보는 계기를 만들 수는 있다. 하지만 글만 보고 배울 수는 없다. 문제를 인식할 수는 있지만 방법을 알수는 없다는 얘기이다. 내가 최고의 멘토를 만났듯이 여러분들도 좋은 멘토를 만나기를 바란다. 결코 혼자서는 제대로 배울 수가 없다. 물론 내가 여러분들의 멘토가 될 수 있다면 정말 기쁜일일 것이다. 그것이 블로그의 가장 중요한 목적이다. 주변에 멘토가 없다면 찾아 나서야 한다.

블로그에 댓글로 독자들과 약간의 소통을 하지만 나에게 직접 메일을 보내도 언제든지 환영한다. 블로그 글을 읽는 것만으로 해결되지 않는 궁금증은 블로그 상단에 메일보내기 버튼을 눌러서 내게 메일을 보내면 된다. ^^

2012년 8월 15일 수요일

7명이 할 수 있는 일을 70명이 하고 있는 이유

최근에 한 글로벌 소프트웨어 회사(Y사, 가칭)의 한국 지사 관계자에게 들은 이야기이다.
비단 Y사 얘기만은 아니다. 세계적인 소프트웨어 회사의 한국지사에서 종종 벌이지는 일이다.

Y사의 본사에서는 처음에 한국지사를 만들었을 때 한국에서도 미국의 개발 프로세스를 따를 것을 종용했다고 한다. 하지만 한국에서 채용된 개발자들은 미국의 개발 프로세스는 너무 무겁다고 한국 방식으로 개발했다고 주장을 했다. 그리고는 미국의 개발 주문에 대해서 믿을 수 없는 속도로 해결을 해나가기 시작했고, 미국 본사는 이런 경이로운 결과를 보고는 한국식 개발을 묵인할 수 밖에 없었다.

그뒤 몇 년이 지난 지금은 어떻게 되었을까? 미국 본사의 개발 프로세스를 착실히 따른 호주 지사와 엄청난 차이를 보이고 있다고 한다. 똑같은 일을 호주 지사에서는 7명이 처리를 하고 있고 한국 지사에서는 70명이 야근까지 해야 간신히 처리를 하고 있다고 한다. 

그렇게 된 이유가 분석/설계도 없이 빨리빨리 개발을 하다보니 아키텍처가 엉망이고 개발자들이 많이 바뀌었는데 내용을 아는 사람도 별로 없다고 한다. 뭐 하나 고치려고 해도 보통 어려운 것이 아니라고 한다.

전해 들은 얘기라서 과장이 있다고 해도 문제가 심각하고 이미 많이 망쳐 놓은 것은 사실이다.

글로벌 소프트웨어 회사라고 하더라도 한국에 와서 착각하는 것들이 있다. 놀라운 속도를 보여주는 한국식 개발방식을 신기해 하지만 그 문제점을 피부로 심각하게 알지 못한다.  스펙도 제대로 작성하지 않고 분석/설계/구현을 섞어서 빠르게 개발하는 것이 신기해 하지만 얼마나 큰 문제가 있는지 실리콘밸리 회사들도 잘 모른다. 그런 식으로 개발해 본적이 없기 때문이다.

그렇다고 글로벌 소프트웨어 회사가 본사의 개발 프로세스를 강제화 한다고 잘 적용되는 것은 아니다. 한국에서 잔뼈가 굵은 개발자들은 몸에 밴 개발 방식 때문에 적응하기가 매우 어렵다. 차라리 신입사원들을 뽑아서 교육시키면서 개발을 하는 것이 더 빠를지도 모른다.

이는 한국의 소프트웨어 회사 내부에서도 그대로 적용된다. 글로벌 소프트웨어 회사의 개발 프로세스가 아무리 좋다고 하더라도 한국의 소프트웨어 회사에는 바로 적용이 안된다. 대부분은 무리한 시도이고 실패한다.

변화를 감당할 수 있을만큼씩 조금씩 바꿔나가야 한다.

2012년 8월 13일 월요일

일을 잘하는 조직 vs. 못하는 조직


 일 잘하는 조직
 일을 잘 못하는 조직
겉에서 보기에 여유있게 일한다.
항상 부산하고 바쁘다. 
위임이 잘 되어 있어서 알아서 처리하는 업무가 많다.
사소한 이슈도 모두 보고하고 처리를 해야 한다.
효과적인 업무 프로세스가 있다.
프로세스가 없거나 비효율적이다. 
꼭 필요한 이슈만 모여서 회의를 한다.
모든 결정을 회의를 통해서 결정해야 한다.
회의 시간이 짧고 회의도 적다.
회의가 너무 많아서 일할 시간이 없다. 
회의 Agenda에 집중하여 효율적으로 결정한다.
회의 시간은 길지만 결론이 없다.
회의 후 항상 회의록을 기록하고 후속처리가 잘된다.
회의 후에도 후속처리에 대한 관리가 잘 안된다.
커뮤니케이션 시스템이 잘 구축되어 있다.
구두와 메일에 의존한 커뮤니케이션으로 관리가 안된다.
시스템을 통해서 누가 무슨 일을 하는지 다 알 수 있다. 
누가 무슨 일을 하는지 파악이 잘 안된다. 
필요한 정보에 신속하게 접근할 수 있다. 
어디에 무슨 정보가 있는지 파악이 잘 안된다. 
업무가 효율적으로 분배되어 있다. 
바쁜 사람만 바쁘고 노는 사람은 논다. 
꼭 필요한 문서를 효율적으로 만들어서 공유한다. 
문서가 없는 경우 많고, 있어도 잘 안본다. 
일 잘하는 조직의 특징을 요약하면, 합리적이고 명시적인 프로세스가 있고 적절한 시스템을 도입하고 있으며 회의를 효과적으로 진행하고 적절한 문서를 통해서 업무를 진행한다. 이렇듯 효과적으로 일하는 조직은 의욕만으로 되는 것은 아니고 회사에서 제공해야 할 것이 상당히 많다. 즉, 투자가 필요하다.

2012년 8월 9일 목요일

해외 진출하는 족족 실패하는 이유

대한민국 이름을 걸고 해외에서 크게 성공한 Software가 없는 것은 안타까운 일이 아닐 수 없다. 내가 아는 한 그런 Software가 없다. 그런 Software가 있다면 알려주기 바란다.
게임 등 일부 분야에서는 성공 사례가 있지만 일부 특수 분야의 일이다.

그렇게 실패하는 이유는 여러가지가 있겠지만 내가 보는 가장 큰 이유는 소프트웨어를 개발하는 기초 역량이 부족해서이다.

누구는 해외 문화를 이해하지 못했다고 하기도 하고, 영업을 잘 못했다고도 하지만 가장 큰 이유는 개발 역량의 차이이다.

국내에서 개발했던 주먹구구의 방식이 해외에서도 그대로 먹힐 것이라고 생각하는 것은 큰 착각이다.

국내에서 성공했던 대부분의 회사들의 성공요인은 국내에서만 먹히는 서비스 전략 때문이었다. 대충 만들어 놓고 고객이 불만을 표시하면 무한 감동 서비스를 제공하는 것이 그것이다. 많은 회사들이 이 전략을 사용해서 국내에서는 성공을 했다.

작은 땅덩어리에서는 고객이 부르면 언제든지 달려갈 수 있지만, 시장이 세계로 넓어지면 그런 고객 감동 서비스는 꿈도 꿀 수 없는 일이 된다. 고객이 부르면 비행기 타고 날아가고 호텔에서 숙박을 해야 하기 때문에 비용과 시간이 너무 많이 들어간다.

해외에서 성공하려면 진짜로 제대로 개발을 해야 한다. 고객이 해달라는대로 개발하는 것이 아니고 제대로 전략을 세워서 제품 기획을 하고 분석/설계를 해서 개발을 해야 한다. 또, i18n Technology(국제화 기술)도 제대로 적용해야 하는데 99%의 회사는 나름대로 방식으로 또 엉터리를 만들어서 적용하기 때문에 해외에서 대패를 하게 된다.

이런 것을 모두 갖추어야 비로소 비슷한 출발선상에서 경쟁을 시작하는 것인데, 국내에서 하던 방법대로 해외서 성공하려고 하는 것은 100m 달리기에서 20~30m 뒤에서 출발하는 것과 다를 바가 없다.

근본적인 역량을 되돌아볼 때이다.

2012년 8월 6일 월요일

소프트웨어 개발자의 나아갈 길

소프트웨어 개발자의 경력이 제대로 보장 받지 못하는 가장 큰 이유는 회사, 사회, 문화의 문제 때문이다. 그렇다고 개발자 된 입장에서 회사가 바뀌고 사회가 바뀌기만을 기다릴 수는 없다. 이는 마치 닭과 달걀의 관계처럼 누가 먼저인지 알기 어렵다. 어느 한쪽이 먼저 깨끗하게 해결되면 자연스럽게 전체가 해결되지만 그걸 기대하기는 현실적으로 어렵다. 경영자도 회사가 살아남고 경쟁력을 키우기 위해서는 바뀌어야 하지만 개발자도 뭔가 대책을 수립해야 한다.

주변에 좋은 롤모델이 없는 개발자들은 자신의 개발자로서의 경력을 보장 받고 더 뛰어난 개발자가 되기 위해서 어떻게 해야 하는지 알아내기가 정말 어렵다. 그냥 상황이 주어진 대로 열심히 할 뿐이다. 그러다 보면 정치적으로 밀리고 실력에서도 뒤쳐져서 최악의 상황이 되곤 한다. 단지 열심히 밤새워 일했을 뿐이데 결과는 그리 좋지 않고 미래는 더움 암울하다.

그렇다면 쉽지 않은 일이지만 개발자가 어떻게 해야 하는지 알아보자. 물론, 소프트웨어 개발자의 종류가 너무 많고 OS Kernel 개발자 등 특수분야의 개발자들은 특성이 매우 독특해서 여기에 해당이 되지 않을 수도 있지만, 대부분의 개발자에게는 해당하는 얘기일 것이다.

첫째, 관리와 개발 일을 분리하라.

관리자가 될 것이 아니라면 관리 일은 아무리 열심히 해도 개발자 경력에 별 도움이 안된다. 하지만 회사의 사정상 싫어도 관리 일을 떠맡을 수 밖에 없는 경우가 있다. 그런 경우에도 본인의 정체성을 명확히 해야 한다. 개발과 관리 일을 섞어서 하지 말고 구분해야 한다. 즉, 자신이 하고 있는 일 중에서 어떤 일이 관리고 어떤 일이 개발인지를 구분해야 한다. 물론 모호한 경우도 있다. 여기서 개발이 주업이고 관리는 부업임을 명확히 해야 하고, 언제든지 관리 일은 버릴 수 있도록 준비를 해야 한다.

경영자에게도 개발자가 관리일 때문에 부담이 되고 효과적이지 않다는 것을 알려라. 많은 경영자들이 그 사실을 잘 모르고 있기 때문에 자주 세뇌를 시켜야 한다. 그럼으로써 관리 일은 점점 최소화를 시켜나가야 한다.

보고서 작성, 경영회의 참석, 팀원 관리, 일정관리, 고객 접점 업무 등은 거의 관리 일이므로 최소화 노력을 해야 한다.

둘째, 경력과 수준에 맞는 일을 해라.

경력이 많아지면 그게 걸맞는 수준의 일들을 해야 한다. 경력이 늘어가도 똑같은 일을 그저 더 빠르고 능숙하게 하고 있다면 밥값을 못하고 있을 가능성이 높다. 그런 상태라면 개발자 경력을 오래 보장 받기는 어렵다. 결국 도태될 것이다.

경력이 늘어갈수록 누구나 할 수 있는 일들은 후배에게 물려 주어야 한다. 그리고는 설계, 분석 업무의 비중을 높이고 회사의 기술 전략에 신경을 써야 한다. 경력이 더욱 늘어갈수록 자신의 팀 뿐만 아니라 타팀, 더 나아가서 회사 전체의 프로젝트에 기여를 해야 한다.

그러기 위해서 문서화는 필수다. 개발 내용이 문서로 적혀 있어야 서로 리뷰가 가능하고 타팀의 프로젝트도 검토를 해서 나의 전문지식을 불어 넣을 수가 있다. 물론 내 프로젝트도 문서화를 해야 다른 사람들의 도움을 받을 수 있다. 문서화 되지 않은 내용은 뇌를 꺼내서 리뷰할 수는 없다. 아무리 빨리 개발한다고 해도 리뷰 없이 개발되는 프로젝트는 주먹구구로 개발이 되는 것이고 아주 작은 프로젝트이거나 아주 재수가 좋은 경우를 빼고는 폭탄을 안고 있는 것과 같다. 이런 주먹구구식 개발은 대부분 첫번째 프로젝트부터 더 오래 걸리고, 시간이 지날수록 점점 비효율적으로 된다.

그런 주먹구구 환경에서는 개발자가 경력에 맞는 수준의 일을 할 수 없다.

셋째, 권력욕을 버려라.

상황에 따라서 매우 어려울 수 있다. 특히 대기업인 경우 더욱 그렇다. 조직에서 권력을 얻어야 제대로 대우를 받을 수 있다면 이를 뿌리치기는 어렵다. 이런 경우는 차라리 개발자로서의 경력은 포기하는 것이 나은 판단일지도 모른다. 개발자로서 계속 나아가겠다고 결심을 했다면 어쨌든 권력욕은 버려야 한다. 권력을 얻기 위한 거의 모든 행동은 개발 일과는 거의 관계가 없다. 방해만 될 뿐이다.

개발자는 권력보다는 뛰어난 기술력에서 자연스럽게 나오는 파워를 가져야 한다. 물론 조직 문화가 이를 받아들이지 않는 경우도 많이 봐왔기 때문에 쉽지 않은 일임을 잘 알고 있다. 그렇다고 권력을 쫓아서는 개발자의 길과는 멀어질 것이다.

넷째, 끊임 없이 코딩하라.

개발자는 30년을 일해도 감독, 코치가 아니라 선수다. 코딩에서 손을 놓으면 급속도로 개발자의 길과 멀어진다. 주변을 보면 관리나 좀 하고 코딩은 전혀 안하면서 여기저기 감 놔라 대추 놔라 훈수를 두는 무늬만 개발자가 매우 많다. 이들은 개발자가 아니고 개발자였을 때 쌓아 놓은 지식의 약발도 별로 오래 가지 않는다.

물론 경력이 늘어 갈수록 코딩 시간은 줄어들 것이다. 하지만 여전히 코딩은 계속 해야 한다.

다섯째, 새로운 기술을 익혀라.

개발자라면 좋아하는 기술 몇 가지만 평생 써먹기 어렵다. 꾸준히 새로운 기술을 익혀야 한다. 시간이 흐를수록 점점 더 많은 새로운 기술들이 나오고 있다. 이를 따라잡기는 보통 어려운 일이 아니다. 그래서 개발자들이 다른데 신경 쓸 시간이 어디 있겠는가? 그렇다고 모든 새로운 기술을 익히는 것은 불가능하다.

어떤 기술은 용어 정도만 익히기 위해서 10분 정도 투자를 하고, 어떤 기술은 1시간 정도 투자를 해서 뭔지 돌려봐야 하는 것도 있다. 또 어떤 기술은 하루를 투자해서 샘플을 만들어 봐야 하는 기술도 있다. 이를 잘 구분해서 적절하게 시간 투자를 해야 한다. 모든 기술을 다 마스터 할 필요는 없다. 나중에 필요할 때 언제든지 생각이 나게 하면 된다. 필요할 때 필요한 만큼 더 익히면 된다.

오랫동안 써왔던 기술만 고집하면 한계에 다다른다.

여섯째, 소프트웨어 개발 전문가로 포지셔닝을 하라.

본인의 정체성을 명확히 하라. 경영자가 본인을 소프트웨어 전문가로 믿도록 하라. 경영자가 기술 전략을 같이 의논하게 하고 기술 관련된 정책을 제대로 수립할 수 있도록 보좌하라. 만능인 것처럼 행세하는 것은 효과적이지도 않고 신뢰도 떨어진다. 개발이 아닌 일은 다른 사람들이 더 잘할 수 있다. 고객도 잘 알고, 영업도 알고, 전략도 잘 안다고 아무리 아는척 해봤자 밑천이 금방 드러난다. 제일 잘하는 개발로 승부를 하라. 이는 회사 내에서 누구도 넘보지 못한다.

애매한 만능맨보다는 개발 전문가의 위치가 회사 내에서 더욱 확고할 것이다. 구조 조정 시에도 관리자나 애매한 위치의 사람들은 자를 수 있어도 개발 전문가로 잘 포지셔닝하면 쉽게 자를 수 없다. 물론 제대로 생각이 박힌 경영자가 있는 경우에 그렇다.

일곱째, 후배들의 롤모델이 되어라.

세상은 결국 돌고 도는 것이다. 본인에게는 롤모델이 없어서 고생을 많이 했을 것이다. 하지만 후배들에게는 롤모델이 되어서 후배들이 그 고생을 하지 않도록 하라. 더 많은 시행착오를 겪겠지만 이는 선구자이기 때문이다. 선임 개발자가 어떤 식으로 일하는지 보여주고 기술력에서 오는 파워를 보여줘라. 이는 본인을 위해서도 더 일하기 좋은 개발환경을 만드는데 도움이 되는 일이다.

이 글은 Tech it에 기고한 글입니다.