2008년 12월 30일 화요일

소프트웨어는 소프트하지 않다.

소프트웨어는 손쉽게 수정할 수 있다고 생각하기 쉽습니다.
특히 고객이나 개발을 잘 이해하지 못하는 Sales part에서는 소프트웨어가 대단히 Soft해서 쉽게 주물떡 주물떡 해서 변경이 가능할 것으로 생각합니다.

하지만 무엇이 언제 수정되냐에 따라서 소프트웨어는 절대로 소프트하지 않습니다.
프로젝트 막바지에 요구사항이 변경되면 요구사항 분석 시 반영된 것에 비하여 수십배의 비용을 지불해야 합니다.

소프트웨어가 소프트하다고 생각하는 것은 비단 고객이나 Sales만이 아닙니다.
개발자들도 그런 생각을 하는 것을 종종 볼 수 있습니다.

개발자들은 자신이 뚝딱뚝딱 만들어 보고는 수정이 쉽다고 생각할 수 있습니다.
하지만 이는 간단한 프로토타입에 불과하고 실제 프로젝트나 제품을 만들 때는 사정이 달라집니다.
요구사항이 바뀌면 아키텍처가 바뀌어서 전체를 다 뜯어 고쳐야 할 수도 있습니다.

빌딩을 지을 때는 뼈대를 다 올리고 나서 이거 저거 뜯어 고쳐달라고 하지를 않습니다. 하지만 소프트웨어를 개발할 때는 다 개발해 놓고도, 부담없이 고쳐달라고 하는 경우가 비일비재합니다.

SW분리발주법이 이러한 부작용을 줄여 줄 수 있는 좋은 제도이나 아직 형식적인 가이드에만 그치고 있고 기업들은 얼마든지 이를 피해갈 준비가 되어 있습니다. 이렇게 후진적인 마인드가 결국 소프트웨어 업계를 공멸하게 만들어가고 있는데, 이 기형적인 소프트웨어 산업 구조는 쉽게 바뀌기가 어려운 상황입니다.

소프트웨어가 소프트하지 않다는 것을 우리 모두 인식할 때 조금씩 희망이 보이지 않을까요?

2008년 12월 26일 금요일

공든 탑을 쌓는 것은 수년, 무너지는 것은 한 순간



소프트웨어 개발 문화가 한 회사에서 제대로 정착하려면 수년이 걸립니다.
3년이 걸리기도 하고 5년이 걸리기도 합니다.

하지만 이것이 무너지는 데는 불과 몇 개월이 걸리지 않습니다.
손바닥에 올려 놓은 모래가 손가락 사이로 줄줄 빠져나가는 것처럼 허물어지는 것은 순식간입니다.

대부분의 이러한 개발 문화 와해는 경영층에서부터 시작됩니다.
 CTO를 잃거나, 회사의 경영방침이 완전히 단기적인 매출지향으로 바뀌면서 이러한 일들이 일어나곤 합니다.

수년간 키워온 남녀간의 사랑이 한 순간의 실수로 깨져버릴 수 있고, 이를 다시 회복하는 데는 오랜 시간이 걸리듯이 이렇게 와해된 개발 문화는 다시 일으키기가 쉽지 않습니다.

그만큼 소프트웨어 회사에서 경영층의 마인드가 미치는 영향은 큽니다. 
개발을 이해하지 못하거나, 이해하지 않으려고 하는 경영자는 단기적인 성과는 가능할지 몰라도 장기적 또는 Global한 성과는 기대하기 어려울 것입니다.

개발 문화는 쌓는 것만큼 지키는 것도 중요합니다.

이미지출처 : Microsoft Office Online

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

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

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