2008년 12월 24일 수요일

Agile에 대한 단상

올 여름 휴가 차 미국에 방문 했을 때 나의 오랜 친구이며 소프트웨어 개발 동지인 Eddy를 만났습니다. 
그 친구는 UC버클리에서 컴퓨터 사이언스를 전공하고 실리콘밸리에서 오랫동안 잔뼈가 굵은 친구인데, 같이 소프트웨어 공학에 대해서 토론을 하게 되었습니다. 그때 대뜸 "Agile을 아냐"고 물어보더군요. 그리고는 현재 미국에서 Agile이 얼마나 인기가 있는지 장황하게 설명을 해주더군요. 이때 저는 한국의 열악한 소프트웨어 개발 실정을 적나라하게 설명해 줬습니다. 이 친구 역시 한국 업체와 몇 번 일을 해본 경험이 있어서 이해를 하더군요.

지금 한국에서도 Agile에 대한 관심이 참 높은 것 같습니다. 저는 Agile을 헐뜯을 의도는 전혀 없습니다. 하지만 소프트웨어 개발에 꼭 필요한 기초조차 갖추지 못한 회사라면 Agile방법론을 시도한다고 해서 문제가 해결될 수는 없을 것입니다. 과거에 나왔던 수많은 방법론처럼 또 이를 맹신하고 따른다면 과거와 똑같은 실패의 경험을 또 하게 될 것입니다. 또하나의 Silver bullet이 될 수도 있습니다.

소프트웨어 역량평가표를 올린 적이 있습니다. 여기서 10점 이하의 하위 점수를 받는 회사라면 먼저 기초를 갖추고 개발자들의 역량을 끌어올리는 일이 우선이라고 생각합니다. 그리고 나서 Agile이 되었든, 무슨 방법이라도 효과를 발휘할 수 있을 것입니다.

2008년 12월 23일 화요일

사업부가 소프트웨어 조직에 미치는 영향

주변 소프트웨어 회사에서 사업부 형태의 조직을 접하는 것은 어려운 일이 아닙니다.
사업부라는 조직 구조가 꽤 인기를 끈 것은 사실입니다.
사업부란 특정 시장에 집중하고 시장의 요구에 빠르게 대응하기 위해서 만든 특수한 형태의 조직입니다.
보통 사업부는 상당히 많은 독립권을 가지고 있고 대부분의 결정을 사업부 내부에서 독립적으로 할 수 있습니다.
하지만 작은 회사를 사업부로 나눠서 각 사업부에 독립적인 책임과 권한을 주게 되면 득보다 실이 더 많아집니다.
하지만 사업부가 가지고 있는 단기적인 성과에 대한 욕심 때문에 사업부 조직 형태에 현혹이 되곤 합니다. 하지만 장기적으로는 잃는 것이 더 많을 수 있습니다.
사업부는 장점도 가지고 있는 조직 구조이지만 다음과 같은 단점들을 가지고 있습니다.

  • 사업부 간에 지식과 정보가 서로 공유하기 쉽지 않다.
  • 사업부 간에 인력을 공유하기가 어려워져서 한쪽 사업부의 인력이 모자라도 인력을 공유하는 등의 효과적인 인력활용이 어렵다.
  • 사업부 간에 기반시스템이 달라지고 개발 표준이 상이해져서 전사적인 개발 효율이 떨어지고, 미래에 다시 통합을 하려고 해도 쉽지 않게 된다.
  • 영업 위주로 개발을 하게 되어서 제품의 아키텍처가 점점 취약해진다. 버그가 많아지고, 시간이 흐를수록 신규 개발보다는 유지보수에 시간을 많이 소비하게 된다.
  • 단기적인 성과에 집착하여 개발자들의 역량 향상에 소홀해지고 장기적으로는 개발 생산성이 떨어진다.
  • 각 기능 조직의 인원이 분리되어 사업부끼리 기능이 중복되고 각각의 전문성도 떨어진다.
  • 사업부의 이익과 회사의 장기적인 이익이 서로 일치하지 않을 수 있다.

사업부를 시행하기 적당한 조직의 크기는 몇 백명 단위가 아닙니다. 몇 천명, 몇 만명의 조직 정도의 규모가 되어야 사업부를 시행할 수 있는 조직이라고 할 수 있습니다.
조직규모가 대단히 크거나 특수한 시장 상황에 대응하기 위한 특별한 목적이 있는 경우라면 상관이 없지만, 회사의 규모가 몇 백명 이하라면 개발조직은 한 조직에 속해서 관리되는 것이 좋습니다.
이미 사업부를 시행하고 있는 조직이라면 각 사업부의 개발 및 기술 전체를 통제할 수 있는 조직이나 CTO가 필요합니다. 그리고 가능하면 개발 조직은 하나로 합쳐서 전사적인 개발조직으로 움직이는 것이 좋습니다.
사업부 조직으로 인해서 개발조직이 이미 통합이 어려운 상태라면 개발 조직을 쪼갤 때보다도 몇배의 배용을 치뤄야 합니다.
따라서 개발조직은 장기적인 안목으로 신중하게 다뤄야 합니다.


2008년 12월 22일 월요일

개발자 5적

소프트웨어 회사의 가장 중요한 자산은 개발자입니다.
개발자는 회사를 흥하게도 하지만 망하게도 합니다.
안타깝게도 우리 주변에는 좋은 개발자보다 나쁜 개발자가 더 많습니다.
초년병 때는 대부분은 좋은 개발자이거나 좋은 개발자가 되려고 합니다.
하지만 시간이 흐를수록 주변의 환경 때문이던 본인 때문이던 나쁜 개발자가 더 많아집니다.
내가 생각하는 가장 나쁜 개발자는 다음과 같습니다.

  • 자신의 지식을 남에게 공유하지 않는 개발자
  • 다른 개발자를 도와주지 않는 개발자
  • 개발보다 정치에 관심이 많은 개발자
  • 자기 개발을 위해서 노력하지 않는 개발자
  • 경영자, 관리자, 동료와 자신을 속이는 개발자

안타깝게도 이러한 개발자는 쉽게 구분하기 어렵거나 회사가 이러한 개발자에 완전히 종속되어서 어쩔 수 없는 경우가 대부분입니다. 아무리 그렇다고 하여도 이러한 개발자가 회사를 이끌어가고 있다면 회사의 미래는 이미 정해진 것이나 다름이 없습니다.

소프트웨어 회사는 개발자들이 정보를 공유하지 않고는 정상적으로 동작하지 않습니다. 그리고 개발자들은 위로 올라갈수록 자신의 일보다는 동료의 일, 타 부서의 일에 관여를 하며 도와야 합니다. 하지만 공유 문화가 정착되지 않은 회사에서는 정보의 단절 악순환이 계속됩니다. 이러한 현상은 회사의 경쟁력을 약화시키고 개발자의 성장을 저해하며, 특정 개발자에 대한 의존도는 점점 커지게 됩니다. 따라서 실력은 부족하지만 회사에서 영향력만 커진 개발자들은 자신의 위치를 지키기 위해서 경영자와 동료를 속이며 정치에 매달리는 경우가 흔합니다. 그리고 자신이 모르는 것을 아는 척하며 심지어는 안다고 착각하기도 합니다.

이러한 문제는 착한 개발자를 뽑는다고 해결되는 것은 아닙니다.
소프트웨어 회사는 사람에 의해서만 돌아가게 되면 이러한 문제가 발생합니다. 최소한의 조직, 시스템, 프로세스를 갖추고 좋은 개발 문화를 장려하며 넓고, 장기적인 안목으로 개발팀을 가꿔나가야 합니다.  CTO가 이러한 것들을 리드하는 역할을 할 수 있습니다. 소프트웨어 회사에는 CTO가 꼭 필요한 이유입니다.

자신 스스로가 나쁜 개발자가 되어가고 있다면 한번 되돌아 봐야 합니다. 혼자서 이 굴레를 벗어날 수는 없습니다. 동료들이 같이 움직여야 하고, 회사가 도와줘야 가능한 일입니다. 필요하다면 제가 도움이 되어 드리겠습니다.

2008년 12월 20일 토요일

빌딩과 개집

시중에는 넘쳐나는 수많은 소프트웨어 개발 방법론이 있습니다. 지금까지 알려진 방법론만 100가지가 넘습니다. 인터넷에서 이에 대한 설명만 보고 Template만 복사해 와서 회사에 적용하기에는 무리가 있습니다. Template과 Sample만 보면 방법론을 적용하여 선진 개발 방식을 따라 할 수 있을 것 같지만, 이는 착각입니다. 
방법론 자체가 잘못되지 않았음에도 잘못된 방식으로 오해를 하여 적용을 하거나 특정 부분에 집착하여 전체를 놓치는 경우가 많습니다.

집을 짓는데 빌딩을 만드는 방법을 적용하면 안되고, 그렇다고 개집을 만들 때처럼 대충 지어서도 안 됩니다. 개집을 만들 때는 대충 만들어도 되고, 안되면 다시 만들면 됩니다. 빌딩을 만들 때는 한치의 오차도 없이 정확하고 복잡한 방법을 사용해야 합니다. 
빌딩을 만드는데 대충 만들고 마음에 안들면 다시 만들고, 요구사항을 중간에 마구 바꾸면 안된다는 누구나 알 수 있습니다. 
그 반대로 개집을 만드는데, 정교한 설계와 많은 시간과 비용을 들일 필요는 없겠지요.
하지만 소프트웨어를 개발하는 현실 세계에서는 이와 같은 일들이 흔히 벌어집니다. 
빌딩과 같은 시스템을 만들면서 형식적으로만 방법론을 따르지만, 아키텍쳐는 심각하게 고려하지 않고, 요구사항이 철저히 분석, 검토되지도 않고 나중에 요구사항을 마구 바꿀 수 있다고 생각합니다.

모든 개발 방법은 프로젝트의 특성에 따라서 적절히 정해져야 합니다. 많은 경우 작거나 중간 규모의 프로젝트를 진행하면서 거대 프로젝트에 적합한 방법론을 기계적으로 적용하려고 합니다. 또는 정반대로 완전 주먹구구식으로 진행하는 경우도 많습니다. 
작거나 중간 규모의 프로젝트에 개발 방법론을 적용하려면 뭔가 생략하고 간소화를 해서 적용해야 할 것입니다. 그런데 무엇을 생략할지는 그 원리를 모르면 알기가 어렵습니다. 따라서 인터넷이나 소프트웨어 공학책을 통해 쉽게 익힌 방법론을 회사에 적용하는 것은 무리가 있습니다. 각 회사에 맞는 개발 방법론을 적용하려면 전문가의 도움을 받는 것도 좋은 방법일 것입니다.


2008년 12월 19일 금요일

개발자 채용 시 코딩테스트를 하시나요?

연기자나 가수를 뽑을 때 오디션을 보듯이 개발자를 채용할 때는 코딩테스트가 꼭 필요합니다.
하지만 코딩테스트를 하지 않고 채용하는 경우가 매우 흔합니다.
이력서를 통해서 그 개발자가 과거에 참여했던 프로젝트가 무엇인지 보고 인터뷰에서 이거 저거 물어보는 것만 가지고는 개발자의 실력을 평가하기는 아주 부족합니다.
코딩 테스트는 다음과 같이 3가지 타입으로 진행할 수 있습니다.

첫째, 인터뷰를 하기 전에 E-mail을 통해서 코딩테스트 과제를 전달할 수 있습니다. 
이때는 시간이 반나절이나 하루 정도 걸리는 과제를 줄 수 있고 꽤 많은 내용을 점검할 수 있습니다.
단순히 로직 뿐만 아니라 코딩 습관, 최적화 시도, 소스트리, 빌드 스크립트 등 다양한 실력을 엿볼 수 있습니다.
1차에 끝나는 경우도 있고, 시험대상자가 너무 많으면 1,2차에 걸쳐서 1차에서는 기본적인 과제로 기본 이하의 개발자를 거르고 2차 과제에서 진짜 문제를 낼 수도 있습니다.
이 테스트의 단점은 다른 사람이 도와줄 수 있는 것입니다. 대부분의 경우 본인 스스로의 힘으로 과제를 해결하지만 실력이 좋은 사람이 도와 줄 경우 이를 확인하기 어려우므로 인터뷰 시 몇몇 내용을 확인하는 것이 좋습니다.
예) Caching 알고리즘 구현

둘째, 인터뷰를 하는 날 인터뷰를 하기 전에 코딩테스트를 하는 것입니다. 인터뷰 전에 약 한 시간 정도면 풀 수 있는 과제를 주고 코딩을 하게 하는 것입니다. 노트북을 준비해 오게 해서 인터뷰 전에 코딩을 시키고, 인터뷰 시 발표를 하게 하는 방법입니다. 실력을 적나라하게 볼 수 있는 좋은 방법 중에 하나입니다.
예) Quick sort 알고리즘 구현

셋째, 인터뷰 시 칠판에 간단한 코딩 과제를 풀게 하는 겁니다. 약 10분이면 풀 수 있는 간단한 문제여야 하고, 이 때는 개발자가 최소한 논리적인 사고를 하는지 점검할 수 있습니다. 사실 코딩 인터뷰를 시도해보면 이 10분에서도 각 개발자들이 엄청나게 많은 차이를 보입니다. 일반 인터뷰 질문으로는 확인할 수 없는 수많은 것들을 여기서 파악할 수 있습니다.
예) itoa함수 구현, strtok 함수 구현 

위 3가지 방법은 모두 효과가 있기 때문에 회사의 상황이나 규모 등에 따라서 적절히 선택을 하면 되겠습니다. 

코딩테스트는 추가 비용 거의 없이 개발자의 실력을 구분할 수 있는 좋은 방법입니다. 아주 뛰어난 개발자를 판단하기는 어려울 수 있어도 형편 없는 개발자는 잘 걸러 낼 수 있습니다.

과거의 경험에 대해서 얘기를 들어보면 경력만 보고 채용을 했다가 아주 쉬운 코딩도 믿고 맡기기 어려운 경우가 많더군요. 코딩테스트는 이러한 것을 막아줄 좋은 수단입니다.

2008년 12월 16일 화요일

하루 8시간 일하시나요?

하루에 8시간 일하시나요?
그렇다고 프로젝트 일정을 예측할 때 하루 8시간 일을 하는 것으로 계산하십니까?
그러면 프로젝트 일정을 지키기 어려울 것입니다.

보통 아무리 집중해서 일을 한다고 해도 하루에 80% 일하기 어렵습니다.
나머지 20%의 시간은 회의를 하고, 커피도 마시고, Email도 봐야 합니다.
또 2개의 프로젝트에 4시간씩 할당이 되어 있어도, 업무 전환 비용(Context switching cost)를 무시할 수 없습니다.

물론 프로젝트 일정은 프로젝트 관리자 혼자서 마음대로 정할 수가 없습니다.
실제 업무를 담당할 담당자들의 도움을 받아서 일정을 산정하게 됩니다.
이때 담당자들이 산정한 일정을 그대로 받아들이나요? 아니면 스스로의 버퍼를 따로 두시나요?
저는 하루의 업무시간을 보통 8시간*80%로 잡고 일정을 산정합니다. 
그 이유는 다음과 같습니다.

  • 개발자의 기술력은 믿지만, 일정 예측 능력은 믿을 수 없습니다.
  • 프로젝트를 진행하다 보면 항상 예상치 못한 일이 발생합니다.
  • 프로젝트가 막바지로 가면, 특히 통합과정에서의 혼란을 개발자들은 쉽게 생각하는 경향이 있습니다.
  • 과거의 경험으로 보면 예상된 일정보다 빨리 끝난 프로젝트는 거의 없었습니다.

낙관적인 일정도 나쁘지만, 일정을 너무 비관적으로 잡으면 프로젝트팀이 자칫 게을러 질 수도 있습니다. 80%의 시간만을 일하는 것으로 일정을 잡아도 프로젝트가 진행되면 부정확인 일정 예측으로 인해서 초과근무는 자주 일어납니다. 그래도 합리적인 일정으로 산정되었기에 프로젝트 일정을 지킬 가능성이 훨씬 높습니다.

이러한 일정산정을 너무 넉넉한 일정으로 비난하는 경영자나 관리자가 있을 수 있습니다.
하지만 무리하게 촉박하거나 낙관적인 일정으로 일정을 지키지 못하거나 개발자를 너무 혹사하는 것보다는 합리적인 일정이 더 낫습니다.
프로젝트팀에서는 믿을 수 있는 일정을 제시하고 지키는 것이 계획적인 비즈니스를 할 수 있게 하는 원동력입니다.
이렇게 프로젝트팀이 제시한 일정이 신뢰를 받기 위해서는 합리적인 근거 제시와 투명한 프로젝트 진행이 꼭 필요합니다. 


(아래 그림은 프로젝트 초기에 일정 산정이 얼마나 어려운지를 보여주는 그래프입니다. 
프로젝트 초기의 일정은 -50% ~ +200%까지의 오차를 보인다는 의미입니다.
그리고 정확한 일정은 끝나봐야 안다는 거죠.)


2008년 12월 15일 월요일

소프트웨어 회사가 기본적으로 갖춰야 할 것

소프트웨어 회사가 처음에 작은 규모에서 시작할 때는 제품도 빨리 만들어 내고, 품질도 좋으며 생산성이 높습니다. 눈빛만 봐도 서로 무슨 생각을 하고 있는지 알고 생산성이 대단히 높습니다.

이런 과정을 거쳐서 회사가 점점 커져나갈 때 그 규모에 알맞은 준비를 하지 않으면 심각한 문제를 겪게 됩니다. 그럼 소프트웨어 회사가 기본적으로 갖춰야 할 것은 무엇일까요?

바로 조직프로세스기반시스템 그리고 사람과 개발문화입니다.

회사가 작을 때는 달랑 사람만 가지고 시작을 하곤 합니다.
이 때는 사람이 모든 Risk를 다 감당해야 하지만 작은 조직에서는 큰 문제가 되지 않습니다.
커뮤니케이션이 원활하고 모든 이슈들이 핸들링하기에 충분히 작기 때문입니다.



하지만 회사가 커지기 시작하면 상황은 달라집니다.
커뮤니케이션이 어려워지고, 이슈는 점점 늘어나며 조직이 점점 생산성이 떨어지게 됩니다. 
그래서 회사는 조직, 프로세스, 기반시스템을 적절하게 갖춰나가야 하며 개발문화를 정착시키기 위한 노력을 해야 합니다. 그래서 개별 사람에 대한 의존도를 낮춰야 회사는 Risk가 줄어 들며 각 개발자나 직원들은 좀더 전문적이고 자신의 일에 집중하여 Performance를 더 낼 수 있게 됩니다. 
수십, 수백명의 개발자를 보유한 조직에서 특정 개발자에 의존도가 너무 높다면 큰 문제가 아닐 수 없습니다.

사실 이러한 것들은 아주 소수일 때부터 준비가 되는 것이 더 바람직합니다. 그리고 회사의 규모에 알맞게 적절한 시점에 변모를 해야 합니다.

모자라는 것도 문제지만 과도한 것도 문제가 됩니다. 무리하게 복잡한 프로세스를 강요한다던지, 필요없는 조직으로 세분화가 된다던지 하면 차라리 없는 것만 못할 경우도 있습니다.

균형을 맞춰가면서 적절히 회사의 성장과 같이 회사의 내부 모습을 바꿔가는 것이 좋습니다.

모든 것은 때가 있듯이 그 시기를 놓치면 어려워집니다. 항상 준비를 해뒀다가 적절한 시점을 놓치지 않는 것도 매우 중요합니다. 실기는 실패보다 못한 경우가 많습니다.

구체적인 내용들은 계속 포트팅을 해나가도록 하겠습니다.