2009년 1월 28일 수요일

닭이 먼저일까? 달걀이 먼저일까?

소프트웨어 공학은 가르칠 수 없다고 합니다.
단지, 시행착오를 통해서 배우던지, 경험자에게 배우는 방법 밖에 없다고 합니다.

그래서 소프트웨어를 잘 개발하는 방법을 배우는 가장 좋은 방법은 잘 되어 있는 소프트웨어 회사에 들어가서 배우는 것입니다. 잘 되어 있는 회사에서 소프트웨어를 개발하다 보면 자연스럽게 몸에 익히게 되는 겁니다.
소프트웨어 개발이 전체적으로 어떻게 돌아가는지 자연스럽게 몸에 익히게 되며, 각 기능 조직은 어떻게 구분이 되며, 개발에 꼭 필요한 기반 시스템은 어떤 것들이 있으며 어떻게 사용하는지 배우게 됩니다. 따로 공부한다는 생각으로 배우는 것이 아니며 자연스럽게 몸에 익게 됩니다.

그런데 우리의 문제는 여기에 있습니다. 잘 되어 있는 소프트웨어 회사가 별로 없다는 겁니다.
제 컨설팅 경험에 의하면 확실합니다. 제 책에 제안하고 있는 소프트웨어 개발 역량 평가표로 평가를 해보면 20점 만점에서 10점이 안되는 소프트웨어 회사가 95%도 넘는 다는 것입니다.
즉, 학교 시험 기준으로 50점도 안되는 낙제점수를 받은 학생이 95%이상이라는 겁니다.

이러니, 잘 되어 있는 회사에 들어가서 제대로 배우기는 로또 당첨과 비슷하죠. 

잘 갖춰져 있는 소프트웨어 회사도 처음부터 잘 되어 있었던 것은 아닙니다. 뭐든지 처음은 있었겠지요.
뭐가 먼저 일까요? 회사가 먼저 바뀌었을까요? 개발자가 먼저 바뀌었을까요?

이는 닭이 먼저냐? 달걀이 먼저냐? 이슈와 비슷합니다. 이 논쟁은 답이 나와 있기는 합니다. 전문가들은 달걀이 먼저라고 합니다. 왜냐하면 달걀이 더 단순하기 때문이라고 합니다. 진화의 돌연변이가 달걀에서 일어 났고, 그 달걀에서 닭의 모습을 한 조류가 나오게 된 것이지요.

소프트웨어 회사도 수십년 동안 수많은 개발자와 소프트웨어 공학 전문가들이 소프트웨어 회사들을 조금씩 효율적으로 바꿔 나간 겁니다. 그래서 지금의 모습에 이르게 된 것입니다.

그럼, 우리 회사도 효율적인 소프트웨어로 변하고 싶을 때 달걀 전략을 사용해야 할까요? 즉 의식있는 개발자가 회사를 아주 조금씩 서서히 바꿔나가야 할까요?

생물의 진화에는 아주 오랜 시간이 걸렸고, 그 와중에 수많은 종이 멸종을 했듯이 달걀 전략은 많은 시간이 필요하며 그 사이에 회사가 망할지도 모릅니다. 멸종된 수많은 종들과 같이요.

이 때는 닭의 전략이 좀더 효과적입니다. 회사 자체를 먼저 바꿔야 합니다. 그리고 개발자들이 이를 따라오게 해야 합니다. 조직과 프로세스와 시스템을 회사에 알맞게 바꿔 놓고 개발자들을 교육시키고 훈련시켜야 합니다. 

밑바닥에서부터의 조용한 개혁을 꿈꾸고 있는 개발자가 계시다면 그 한계를 깨닫고 경영층을 먼저 설득하시기 바랍니다. 그래야 멀지 않은 미래에 효과적인 조직으로 탈바꿈한 개발조직에서 일을 하실 수 있을 겁니다.

2009년 1월 23일 금요일

프로젝트 시작부터 개발자가 바글바글

소프트웨어 개발 프로젝트가 시작되면 바로 개발팀이 구성되어서 개발자들이 바글바글 한가요?
그렇다면 뭔가 개발 체계에 잘못된 것이 없는지 검토를 해봐야 합니다.

개발을 단계(Stage)구분 없이 마구잡이로 하고 있지 않은지?
개발 업무(분석, 설계, 구현)의 구분 없이 섞여서 하고 있지 않은지?
개발자가 별도의 전문성 없이 모든 업무(분석, 설계, 구현, 빌드, 테스트)를 다 하고 있지 않은지?

프로젝트의 각 단계에 따라서 투입되는 인력이 달라집니다. 
소프트웨어 개발 프로젝트에서 흔히 저지르는 실수 중 하나가 프로젝트가 시작되자마자 모든 프로젝트 인력을 한꺼번에 투입해 놓고 프로젝트 끝날 때까지 그 인원으로 계속 진행하는 경우입니다. 

각 단계 별로 필요한 인력과 인원 수가 달라지는데 프로젝트 초기부터 많은 인원이 투입되면, 개발자들이 별로 할 일이 없게 됩니다. 그렇게 되면 요구분석이 완료되지도 않은 시점에 특별한 계획도 없이 코딩도 해보고 설계도 해보고 이것저것을 개발하기 시작하기도 합니다.



위 그래프의 핵심은 초기부터 많은 개발자를 투입하지 않는다는 것입니다. 요구분석 단계에 투입되는 개발자는 SRS 작성에 필요한 정보를 제공하는 개발자들입니다. 요구사항의 타당성을 점검하고, 필요 시 프로토타입을 만들어 볼 수도 있습니다. 그런 다음, 설계 단계에서는 설계에 참여하는 인원만 추가로 투입하면 됩니다.
 
테스터가 프로젝트 초기부터 테스트에 참여하는 점을 눈 여겨 봅시다. 테스터 역시 SRS작성에 참여하고, 테스트 요구사항을 제시하고, 각 요구사항이 테스트 가능한지 검토합니다. 요구분석단계에 테스터는 실제로 테스트 계획서를 작성하기도 하고 이를 준비만 하기도 합니다. 

이렇듯 각 단계 별로 인원을 효과적으로 투입해야만 비용을 절감할 수 있으며, 성급하게 프로젝트 후반부에 해야 할 일들을 앞에서 미리 함으로써 발생하는 수많은 문제를 방지할 수 있다. 미리 작성해 놓은 코드가 아까워서 어떻게 하든 프로젝트에 사용해보려고 하지 않겠습니까?

그 외에도 고참 개발자나 신입 개발자나 특별한 구분 없이 모두 모여서 서로 비슷한 일들을 나눠서 일을 하고 있다면 개발 조직의 효율성 및 생산성이 떨어지는 경우라고 볼 수 있습니다. 아직 주먹구구 단계를 벗어나지 못한 상태입니다. 이런 경우에도 프로젝트를 시작하면 모두 모여서 그냥 개발을 시작하죠.

이렇게 개발자들이 프로젝트 초기부터 모두 투입되는 경우는 비용이나 개발 인력 활용 면에서 대단히 불리합니다. 프로젝트가 진행되는 단계에 따라서 인원을 적절하게 투입해야 합니다. 물론 그렇게 하기 위해서는 각 기능조직의 전문성이 갖춰져야 하고, 개발에 필요한 시스템과 프로세스가 필요하며, 개발자들이  문서 작성 능력을 필수적으로 갖추고 있어야 합니다.

2009년 1월 22일 목요일

인류멸망 그 후(Life after People)

얼마 전 TV에서 "인류멸망 그 후(Life after People)"를 방영했죠.
인간이 지구에서 당장 사라진다면 어떤 일이 일어날지 살펴보는 프로그램이었습니다.

여기서 인간이 만들어 놓은 건축물이 유지보수를 하지 않는 순간 얼마나 빨리 망가지는지를 확인할 수 있습니다.

소프트웨어 개발도 비슷하다고 생각합니다. 소프트웨어 기본 원리야 항상 변함이 없지만, 회사의 규모와 환경에 따라서 개발 프로세스는 그에 알맞게 절절해야 하고, 회사의 성장과 전략의 변화에 따라서 지속적으로 그에 맞춰줘야 합니다. 

그런데, 어떤 이유에서건 갑자기 회사의 개발 프로세스를 관리하지 않기 시작하면, 서서히 망가져가는 것을 볼 수 있습니다. 개발자들에게 서서히 외면을 받고 피해가기도 하고, 개발을 방해하는 거추장스러운 것이 될 수도 있습니다.

이렇게 망가지는 가장 큰 원인은 아마도 Mind가 다른 경영자로의 교체일 것입니다. 이런 경우 소신있는 개발자라고 하더라도 별 힘을 써보지 못하게 되는 경우가 많은데 이런 경험이 있는 분들도 있을 것으로 생각합니다. 이런 경우에 합리적인 대처 방법은 고민을 해봐야 할 주제입니다.

각설하고, 회사가 꾸준히 성장을 하고 있다면 한번 정해놓은 개발 프로세스가 영원히 가는 것이 아니고 꾸준히 유지보수가 되어야 지속적인 생산성 향상이 가능합니다.

과거의 개발 프로세스가 현재의 상황과 맞지 않는 점이 발견되고 있다면 소프트웨어와 마찬가지로 개발 프로세스도 유지보수를 할 때가 된 것입니다.










2009년 1월 20일 화요일

샘플만 보여주세요.

소프트웨어 개발에서 가장 어려운 것이 "요구사항분석"이라고 여러 차례 언급한 바가 있습니다.

그런데 SRS는 샘플이나 Template을 보고 잘 적는 것은 거의 불가능합니다.

개발자들은 원래 샘플 소스코드를 보고 많은 것들을 배워왔기 때문에 스펙도 샘플을 보면 잘 적을 수 있을 것 같은 착각을 하는 경우가 흔합니다. 샘플 소스코드가 도움이 되는 이유는 개발자들인 소스코드에 대해서는 이미 상당한 지식과 경험이 있기 때문입니다.

샘플만 보고 잘하려고 하는 것은 피아노를 잘 치고 싶다고 유명 피아니스트가 친 것을 몇 번 보고 피아노를 잘 치려 하는 것과 비슷합니다. 심지어는 지금 듣고 있는 피아노 연주가 잘 하는 것인지 못하는 것인지 판단하기도 어렵죠.

그래서 인터넷에서 구한 샘플이 별 도움이 안되거나 심지어는 방해가 되는 이유가 그것입니다. 좋은 샘플을 보여주면 일부 도움이 될 수는 있어도 큰 도움은 되지 못합니다. 나쁜 샘플을 만날지 어떻게 알겠습까? 아마 인터넷에서는 좋은 샘플을 구한다는 것은 거의 불가능할 겁니다.

타이거우즈 골프 스윙을 100번 보는 것보다 자신이 실제로 연습을 많이 하고 배우는 것이 더 빨리 배우는 길 일겁니다. 그렇지 않고 배우는 방법은 이미 선배들이 다 겪었던 시행착오를 자신도 그대로 겪는 방법이 있습니다. 자신은 시행착오를 겪지 않고 한번에 제대로 적을 수 있다고 생각하는 것은 자신의 능력에 대해서 대단히 너그럽게 생각하는 심리학적인 오류에 빠지는 것입니다.

비단 스펙을 적는 일뿐만 아니라 스키를 배우던, 발레를 배우던 모든 인생사가 다 비슷하지만 누구에게도 시행착오를 겪지 않는 행운은 찾아오지 않습니다. 책을 보고 공부를 하는 것도 많은 도움이 되지만 주변에서 경험자를 찾아서 도움을 받으세요. 주변에 자신을 도와줄 전문가가 있다면 그것이 행운입니다.

2009년 1월 19일 월요일

프로젝트는 연습이 아니다.

필자는 수많은 소프트웨어를 개발해왔고, 주위에서 여러 프로젝트를 봐왔습니다.
그러면서 성공한 프로젝트와 실패한 프로젝트도 많이 봐 오면서 그 차이에 대해서도 많이 생각해 왔습니다.

물론, 성공한 프로젝트는 모두들 알고 있는 요소들이 있습니다. 
상세하고 꼼꼼한 일정관리, 꾸준한 리스크관리, 인력관리, 품질관리 등등 이미 알려진 것들입니다. 비단 S/W 프로젝트가 아니더라도, 빌딩을 만들 때도 당연히 필요한 프로젝트 관리의 요소들입니다.

그런데, 유독 소프트웨어 개발 프로젝트에서 종종 벌어지는 현상이 있습니다. 이것이 프로젝트에 큰 리스크가 되고 프로젝트를 실패하게 만드는 원인이 되기도 합니다.

이것은 바로 "프로젝트를 연습처럼 생각한다"는 겁니다. 연구, 공부처럼 생각합니다.

"요즘 Python이 인기인데, A모듈에서는 Python을 써야겠다."
"이번 프로젝트는 UML로 설계를 하겠다."
"Flex로 UI를 만들면 쉽다고 하는데, Flex를 쓰자"
"A라는 DB가 빠르고 가볍다고 하는데, 그걸 써보자"
"요즘 B기술이 대세인데, 어차피 공부해야 할 거 프로젝트 하면서 배우자"

실제로 개발자들은 실제 프로젝트에서 많이 배우는 것이 사실이지만, 거의 경험이 없는 기술을 단지 "배우기 위한 목적"이나 "좋아 보여서" 사용한다면 이는 프로젝트에 큰 리스크가 될 수 있습니다.

필자는 개발자들에게 늘 강조하는 것이 "프로젝트는 연습이 아니다.", "프로젝트는 검증된 기술을 가지고 하는 것이다."입니다. 물론 검증된 기술과 아닌 것의 경계는 모호하지만 이는 경험으로 판단해야죠. 충분히 성공할 수 있는 기술의 조합으로 프로젝트를 해야죠. 그렇다고 하더라도, 프로젝트 중간에는 수많은 변수들이 있어서 성공이 보장된 것이 아닙니다. 아직 검증이 안되었지만, 프로젝트에 꼭 필요한 기술이라면, 미리 또는 요구분석 시에 Prototype을 만들어보면서 검증을 하는 것이 좋습니다. 모든 기술을 다 검증할 필요는 없지만, 검증이 필요한 기술을 프로젝트에 직접 사용할 경우 실패할 수도 있습니다.

또 개발자들이 충분히 연습이 되어 있지 않아서 능숙하게 사용하지 못한다면, 일정을 지연시키는 큰 원인이 됩니다. 이런 경우는 이미 익숙한 옛날 기술을 사용하는 것이 나은 경우가 많습니다. 

Research Project라면 얘기가 다르죠. Research Project의 목적은 연구이기 때문에 검증 안된 기술을 얼마든지 사용해도 되죠. 이 경우 요구사항의 상세도도 일반 프로젝트와 다르고 일정의 중압감도 다르기 때문에 기술에 집중할 수 있습니다. 평상 시에 크고 작은 Research Project를 자주 수행해야 실제 프로젝트에 적용할 수 있는 기술을 풍부하게 보유할 수 있습니다.

프로젝트를 연습이라고 생각한다면, 프로젝트 실패로 가는 지름길로 가고 있는 것입니다. 자신이 지금 어떤 프로젝트를 하고 있는지 잘 구분해야 합니다.

그냥 쓸 수 있겠네요.

소프트웨어를 개발하면서 가장 어려운 일은 고객의 요구사항을 파악하는 일이라고 알려져입니다.
고전적인 Waterfall 방식부터 Agile까지 요구사항에 대해서 다양한 방법으로 상당히 신경을 쓰고 있습니다.

특히나 우리나라에서는 고객이 요구사항을 잘 가르쳐 주지 않습니다. 물론 자신의 요구사항을 완벽하게 자세히 알고 말해주는 고객은 전세계 어디서도 찾아보기 어려운 것이 사실입니다. 정도의 차이가 있을 뿐이죠. 그만큼 요구사항 파악은 어려운 일입니다.

우리나라에서 요구사항 파악 시 고객이 이렇게 얘기하는 경우가 흔합니다.

"자세한 요구사항은 나중에 알려줄 테니 일단 구현을 시작해주세요."

그래서 일단 제품을 다 만들어 놓고 고객에게 시연을 하면 그 때서야 고객이 "여기는 이렇게 고쳐달라", "이 기능을 넣어달라", "저 기능은 빼달라" 주문을 하기 시작하죠. 그렇게 제품을 고치고, 시연하고 하면서 고객의 요구사항을 만족시켜 가는 방법이 우리나라에서는 그리 드문 일이 아닙니다. 심지어는 요구사항 분석에 경험이 적은 개발자들은 그냥 그렇게 하는 방법에 익숙해져 있기도 합니다.

이 방법은 대단히 비효율적이고 비용이 많이 드는 방법입니다.
고객의 말 한마디에 몇 주간 노력해서 만든 기능이 빠질 수도 있습니다. 그리고 황당한 요구사항이 갑자기 추가될 수도 있고, 도저히 초기에 일정을 예측할 수도 없죠. 
개발자들이 고객의 요구사항을 너무 잘 알고 있고, 오히려 개발자가 고객을 리드하는 경우라면 일부 효과가 있을 수 있어도, 대부분의 경우 비싼 방법입니다.

이와 같이 자세한 스펙을 쓰기 전에 미리 만들어서 보여주는 방법을 "Prototyping"이라고 합니다. 그 중에서 고객의 요구사항을 파악하고 요구사항을 명확하게 하기 위한 방법은 "1회용 Prototyping"이라고 합니다. 왜 "1회용"이냐 하면 이는 요구사항을 파악하기 위한 것이기 때문에 Fix된 요구사항이 아닙니다. 제품에 기능으로 추가될지 빠질지 알 수 없고, 기능이 어떤 형태로 변하게 될 수 예측할 수 없으므로 제대로 만들면 비용과 시간이 많이 들기 때문에 아주 간단하게 만들어 보는 겁니다. UI에 대한 요구사항을 명확하게 하고 싶으면 UI만 동작하도록 해서 고객과 의논할 수 있고, 특정 기능에 대해서 자세히 알고 싶으면 그 기능이 어떻게 동작하는 지만 간단히 만들어 보는 겁니다.

이때는 제대로 제품을 만들듯이 에러처리를 꼼꼼히 하지도 않고, 회사의 코딩 규칙을 지키기 위해서 주석을 제대로 달지 않아도 되며 속도를 위해서 코드를 개선하지 않고, 메모리 최적화도 필요 없습니다. "1회용 Prototyping"은 요구사항을 얻고 명확하게 하기 위한 것이 목적이므로 최단시간에 최소한의 비용으로 만들면 됩니다. 

이렇게 만들어진 "1회용 Prototype"을 고객이나 영업부에 보여주면 "다 됐네?", "그냥 쓸 수 있겠군요."라고 하는 경우가 많습니다. 이는 마치 모델하우스를 보고 거기에 들어가서 살겠다고 하는 거와 비슷합니다. 

"1회용 Prototype"은 요구사항을 명확하게 하기 위한 활동이고, 이를 통해서 요구사항이 정해졌으면, "1회용 Prototype"은 버리고 다시 만드는 겁니다. 하지만 개발자들은 이를 다시 써먹으려고 하는 경우가 많습니다. "Prototype"에 너무 많은 노력을 들였거나, 시간이 촉발할 때 그냥 쓰고 싶을 수도 있는데, 이는 나중에 제품의 품질에 영향을 주기 때문에 "1회용 Prototype"은 참조는 할 수 있지만, Copy & Paste해서 쓰면 안 됩니다.

"1회용은 1회용일 뿐"

Prototype을 만드는 도중에 Project는 중단이 되는 것이 아니고, 요구사항 분석을 계속해 나가면서 1명의 개발자나 소수의 인원이 Prototype을 만들어 보는 겁니다. 물론 Prototype을 만드는 일도 계획되어야 하며, 적절한 Prototype 작성은 프로젝트의 시간과 비용을 절약해줍니다. 또한 나중에 생길 가능성이 있는 요구사항의 변화를 줄여줘서 Risk도 감소시켜주는 효과도 있습니다. 모든 기능을 다 Prototype을 만들어야 하는 것은 아니고 꼭 필요한 부분만 Prototype을 만들어서 확인할 수 있도록 적절히 판단하는 것도 경험이 필요합니다.

2009년 1월 15일 목요일

소프트웨어 공학이 뭔가?

필자가 소프트웨어 공학(소프트웨어 엔지니어링)이란 용어를 안 것은 얼마 되지 않았습니다. 소프트웨어 공학이라는 용어를 접하고 그 내용을 보니 오랫동안 소프트웨어를 개발하면서 해왔던 그 방법 그대로를 적어 놓은 것에 불과했습니다. 물론 소프트웨어 공학에 포함된 전체 내용은 상당히 방대하지만 그 근본 원리와 핵심적인 내용들은 아주 익숙한 내용들이었습니다.

지금 글을 읽고 계신 분께서 소프트웨어를 아주 잘 개발하고 있다면 이들은 이미 소프트웨어 공학의 대가입니다. 단순히 머리가 좋아서 혼자서 잘 개발을 잘하는 것을 제외하고 여러 명의 팀을 이끌고 복잡한 시스템을 짧은 시간에 가장 적은 비용으로 품질 높은 제품을 이미 만들어 내고 있다면 소프트웨어 공학이란 말을 한번도 들어본 적이 없어도 이미 전문가입니다.

대부분의 뛰어는 개발자들은 소프트웨어 공학에 익숙합니다. 비록 소프트웨어 공학의 수많은 용어를 사용하지 않는 다고 하더라도 이미 잘하고 있습니다. 뛰어난 개발자란 뛰어난 프로그래머, 코더가 아닙니다. 

대학에서 소프트웨어 공학을 전공 과목으로 배웠다고 하더라도 실무에서 제대로 된 개발 방법을 경험한 개발자에 비해서는 그 이해도가 택도 없이 모자랍니다. 심지어는 대부분의 대학생들은 소프트웨어 공학에서 가르치는 대부분의 내용을 진정으로 이해하지도 못합니다.
소프트웨어 공학을 실무 경험은 없이 대학에서 가르치기만 하는 사람은 오히려 그 형식에 치중에서 전문가라고 보기 어려운 경우가 많습니다. 

그렇습니다. 현실에 적용해서 진짜로 시간과 비용을 줄일 수 없다면 진짜 소프트웨어 공학이 아닙니다. 좋은 방법론을 적용했더니, 개발시간이 더 오래 걸리고, 맨날 밤을 세야 하고, 개발자들의 사기도 떨어진다면 제대로 적절하게 적용한 것이 아닙니다.

소프트웨어 공학의 본질을 알아야 겠습니다. 근본은 바뀌지 않지만 그 방법은 소프트웨어 기술의 변화와 발전에 따라서 계속 바뀌어 나갈 것이라는 것을 쉽게 예측할 수 있습니다. 꾸준히 좋은 개발팀과 회사를 유지하려면 끊임 없는 개선이 필요합니다.