검색어 프로젝트/품질관리에 대한 글을 관련성을 기준으로 정렬하여 표시합니다. 날짜순 정렬 모든 글 표시
검색어 프로젝트/품질관리에 대한 글을 관련성을 기준으로 정렬하여 표시합니다. 날짜순 정렬 모든 글 표시

2012년 8월 30일 목요일

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2008년 12월 12일 금요일

다 만들었어요. 이제 테스트만 하면 되요.

소프트웨어를 개발하는 회사에서는 자주 듣는 말입니다.
그런데, 이 테스트가 언제 끝날지 모르는 경우가 많습니다.

소프트웨어 개발 컨설팅을 하면서 정말 놀란 것 중의 하나가 대부분의 회사가 릴리즈 시 "알파", "베타", "RC", "GA", "FCS"와 같은 단계를 거치지 않는 다는 것이었습니다. 
대부분이 알파수준의 소프트웨어를 만들어서 만족스러울 때까지 테스트와 수정을 동시에 병행한다는 것이었습니다. 이는 큰 회사나 작은 회사나 별 차이가 없었습니다. 개발을 단계적으로 진행하지 않는 회사는 업무와 일정에 대한 정교한 구분 없이 일을 진행하다가 적당한 시점에서 한번의 테스트를 통해 제품을 완성하려고 합니다.
이를 빅뱅(Big bang) 테스트라 하는데 이 방법이 운 좋게 개발 기간을 단축시켜 줄지도 모른다는 기대감으로 일을 중구난방으로 진행하는 것입니다. 하지만 이는 전혀 근거가 없는 생각이며, 테스트를 한번에 끝낸다고 프로젝트가 더 빨리 끝나지는 않습니다. 이 방법은 테스트 기간 내내 혼란에 휩싸이게 만들고, 테스트가 언제 끝날지 도저히 예측할 수 없으며, 일정 기간 내에 품질이 얼마나 향상될 수 있을지 추측조차 하기 어렵습니다. 심지어 통합조차 잘 되지 않기 때문에 내포되어 있는 버그가 얼마나 되는지도 파악하기 어렵습니다. 결국 프로젝트 일정이 가시권에서 점점 멀어지게 됩니다. 운이 좋으면 밤을 새면서 일정대로 프로젝트를 마칠 것이고, 그렇지 않으면 프로젝트가 실패하게 됩니다. 


소프트웨어 프로젝트는 개발 단계 별로 관리하는 것이 좋습니다. 단계 별로 진행을 하면 각 단계가 명확해지기 때문에 프로젝트 진행 상황이 눈에 들어오고, 혼란으로 인한 재작업이 줄어 들며, 프로젝트 일정을 단축시키고, 비용을 절약해 줍니다.
특히, 높은 품질의 제품을 출시하기 위해서는 제품 및 프로젝트의 성격에 알맞게 단계 별 릴리즈를 하는 것이 좋습니다. 릴리즈는 알파, 베타, RC(Release Candidate)단계로 나뉘고 각각의 릴리즈 일정은 미리 계획하여 정해 둬야 합니다.



각 단계에는 다음과 같은 의미가 있습니다.

  • 프리알파(Pre-alpha): 알파 이전에 만들어내는 빌드들입니다. 개발 버전(Engineering version)이라고 하기도 합니다. 일일빌드(Daily Build)의 결과물도 프리알파에 해당합니다. 아직 기능이 모두 다 구현이 되어 있지 않습니다.
  • 알파(Alpha): 기능이 모두 구현되었으나, 버그는 꽤 많은 상태, 설치도 안되어서 기능을 확인해 볼 수도 없는 등의 버그는 없어서 모든 기능을 테스트 해 볼 수는 있습니다. 일부 작동이 안 되는 기능이 있습니다. 일반적으로 알파버전부터 테스트팀의 공식적인 테스트가 시작됩니다. 이를 알파테스트라고 부릅니다.
  • 베타(Beta): 중요한 버그는 거의 수정이 되어서 작은 버그들만 남아 있습니다. 베타 버전은 종종 사용자 평가(Evaluation) 및 외부 테스트(Field Test)를 위해서 외부에 배포되기도 합니다. 이런 목적으로 배포되는 버전을 베타 릴리즈라고 부르며 베타 버전을 사용해 보는 사용자를 베타 테스터라고 부릅니다. 베타버전 이전에 프리베타(Pre-beta)를 만드는 경우도 있습니다
  • RC(Release Candidate): 출시를 위해서 만들어진 버전입니다. FCS(First Customer Shipment), 감마(Gamma) 또는 델타(Delta)라고 부르기도 합니다.
  • GA(General availability)RTM(Release to Manufacturing)이라고 부르기도 합니다. RC 중에서 테스트를 통과하여 출시 할 수 있는 버전입니다. 일반적인 경우 마지막 RC와 동일합니다. 
이런 식으로 테스트팀에 전달하는 버전이 어느 수준인지 알려주어야 합니다. 그렇지 않으면 알파수준의 버전을 가지고 곧 고객에게 전달할 수 있을 것 같은 착각에 빠지기도 합니다.

모든 소프트웨어를 개발할 때마다 이 같은 단계를 전부 다 거쳐야 하는 것은 아닙니다. 제품의 규모와 난이도, 성격에 따라서 단계를 서로 다르게 정해야 합니다. 대규모 제품이거나 복잡한 팩키지 제품은 이 단계들을 거치는 것이 일반적입니다. 이런 제품을 한번에 높은 품질로 만들어 내기는 어렵기 때문입니다.

하지만 소규모 제품이거나, 고객의 수가 아주 적거나, 업그레이드 프로젝트라서 복잡도가 낮을 경우라면 처음부터 원하는 품질 수준에 근접하게 제품을 만들어 낼 수 있습니다. 이런 경우라면 테스트 단계를 간략하게 해서 진행할 수 있습니다.

2016년 5월 23일 월요일

개발자 야근문화를 고쳐야 하는 이유

월화수목금금금 지금도 회자되는 유명한 이야기다. 그리고 회사 대표는 신제품 발표회에서 개발기간 동안 개발자가 집에 들어가서 이혼을 했다고 자랑 아닌 자랑을 한적도 있다. 개발자들을 연구소에 가둬놓고 밖에서 자물쇠로 잠궈 놓고 주말에도 집에 못가게 했으며 기혼자만 일주일에 하루씩 집에 보내 줬다고 자랑을 하는 경영자도 있다.

자신이 직원들을 얼마나 혹사시켰는지 그렇게 자랑을 하는 이유를 모르겠다. 그래서 한국에서 개발자라는 직업이 유난히 인기가 없고 3D 직종으로 폄하를 하는 모양이다.

많은 경영진이 야근의 효과를 맹신하고 자랑하는 이유는 몇몇 전설적인 성과들이 실제로 있었기 때문이다. 또한 자신들도 초기에 그런 경험을 하기도 했다.

스타트업 초기에 모험심과 열정으로 빠른 시제품 제작과 시장 진입을 위해서 잠도 안자고 일을 하기도 하고 명확한 목표를 가진 어려운 프로젝트를 전직원이 끊임없는 도전을 통해서 결국에 성공을 해내는 기적적인 멋진 성공 스토리가 종종 있다. 여기서 공통점은 명확한 목표와 열정, 자발적인 노력이 있었다는 것이다. 물론 이렇게 해서 성공한 회사도 계속 그렇게는 못한다. 전력질주를 계속하며 마라톤을 수는 없다.

그럼에도 많은 경영자들이 야근의 효과를 맹신하는 이유는 야근 말고는 뚜렷한 성과측정 방법이나 생산성 향상 방법을 모르기 때문이다. 세일즈는 숫자로 평가를 하기 때문에 쉽다. 하지만 개발조직은 개발자들이 노는지 열심히 하는지 알기가 어렵다. 개발자들의 프로젝트가 6개월 걸린다는 말도 믿기가 어렵다. 좀더 열심히 하면 4개월이면 끝낼 있을 같고 과거에도 그렇게 밀어 붙이니 개발 기간을 단축한 적이 있었기 때문에 무조건 압박을 하게 된다. 개발자들도 6개월 걸린다고 주장은 하는데 근거를 가지고 주장을 하지 못하기 때문에 경영자의 신뢰를 얻지는 못한다.

결국 경영자의 유일한 수단은 무조건 일정을 줄이고 직원들을 압박하는 것이다. 물론 압박이 단기적인 효과가 있는 것은 확실하다. 하지만 회사는 100m 달리기를 하고 있는 것이 아니고 마라톤을 하고 있는 것이다. 이를 아는 개발자는 일정을 미리 늘려서 말하곤 한다. 절대로 경영자가 이길 없는 싸움이다. 기업문화만 망가진다.

이런 야근 압박의 부작용은 매우 크다. 장기적으로 제품의 품질은 떨어지고 아키텍처는 엉망이 된다. 직원들의 창의력은 사라지고 사기는 저하되며 로열티는 없어진다. 직원들은 사생활을 포기해야 하며 자기계발을 못하고 소모품으로 전락하게 된다. 직원들이 현재 가지고 있는 것을 5 뽑아먹다 보면 그냥 부품이 되어서 직원도 발전이 없고 회사의 미래도 불투명해진다.

소프트웨어는 '창의적인 지식 산업'이며 개발 조직은 '지식공동체'이다. 생산성이 근무시간에 비례를 하는 것도 아니다. 적정 근무 시간이 넘어 가면 생산성은 떨어진다. 공유와 협업에 신경 겨를이 없어지고 '지식공동체' 무너져서 각자 따로 노는 조직이 되기 때문이다. 프로세스로 강제해서 '지식공동체' 만들기는 어렵다. 그렇게 할수록 효율은 떨어진다.

SI 용역을 주로 하는 회사나 재정이 악화되어서 억지로 버티는 회사는 지식 산업에서 점점 멀어지고 있고 단기 수익이 너무 중요하기 때문에 이런 얘기는 모두 공염불일 뿐이다.

야근을 줄이는 가장 좋은 방법은 업무를 계획적으로 하는 것이다. 필자가 CEO 있는 이우소프트에서는 개발 계획을 세울 개발자는 하루에 6시간을 기준으로 계획을 세우며 매우 정확하게 일정을 수립하려고 노력한다. 고참 개발자는 하루 4시간을 기준으로 한다. 나머지 시간은 동료를 위한 시간이다. 스펙, 코드 리뷰도 하고 물어보면 답변도 해준다. 하루에 두뇌를 6시간 풀가동하는 것도 쉬운 일은 아니다. 설렁설렁 일하면 12시간도 가능하다. 물론 너무 재미있는 일이라면 18시간도 몰입할 있다. 필자도 어렸을 때는 프로그래밍 재미에 빠져서 하루 18시간씩 개발을 적도 있다. 하지만 보통의 경우는 하루 6시간 몰입도 쉽지 않다.

그리고 프로젝트 관리도 제대로 해야 한다. 프로젝트는 리스크(Risk) 가득 가시밭길이다. 수시로 터지는 리스크는 일정을 꼬이게 만들고 아키텍처를 엉망으로 만들기도 한다. 프로젝트 관리를 제대로 해서 프로젝트가 항상 통제 범위 안에 있어야 한다. 그래야 돌발적인 야근이 줄어 들며 프로젝트 성공 확률도 높아진다. 그리고 방법이 프로젝트를 가장 빨리 끝내는 방법이다. 그럼 직원들은 거의 매일 저녁 6시에 퇴근할 있다. 그럼 6 이후에는 무엇을 해야 하나? 물론 6 이후 시간은 직원의 자유지만 이우소프트에서는 6 이후에 해야 것에 대해서 가이드를 하고 있다.

첫째는 자기계발이다. 영어공부, 운동 등을 규칙적으로 자기 발전을 위해 노력하기를 권장하며 미래의 업무에 필요한 지식 기술을 익혀야 한다. 학원을 등록했다가 수시로 발생하는 야근 때문에 포기하는 경우가 많다. 야근이 많은 회사에서는 무엇 하나 계획적으로 수가 없다. 무엇을 공부할지는 자율에 맡기기는 하지만 회사에서는 내용을 파악하고 상담, 관리, 지원하고 있다. 이것이 직원이 부품이 안되고 5 , 10 발전된 모습이 되는 방법이다. 그래야 회사도 직원과 같이 발전할 있다. 건강을 유지하기 위한 운동은 회사에 피트니스 시설을 만들고 뛰어난 코치를 정직원으로 채용하여 골프, 요가/필라테스, 웨이트 트레이닝을 지원하고 있다.

둘째는 가능하면 가족과 시간을 보내기를 권장한다. 야근을 안했다고 친구들과 마시는데 시간을 보내는 것은 가급적 줄이고 가족과 시간을 많이 보내야 한다. 열심히 일하는 목적이 여기에 있기 때문에 굳이 이유가 무엇인지 설명할 필요가 없을 것이다. 회사에서 '이우아이'라는 어린이집을 운영하고 있어서 초등학교 이전까지는 회사에서 보육을 최대한 도와준다.

회사에서 철저히 관리를 하는 것은 프로젝트다. 정해진 시간 안에 프로젝트 목표는 달성을 해야 한다. 개발자들의 활동은 회사에서 거의 통제하지 않는다. 스스로 일을 찾고, 만들고, 준비도 한다. 시키는 일만 하는 소수의 직원도 있지만 대부분은 시간과 장소를 가리지 않고 스스로 뭔가를 찾아서 한다. 물론 내용은 대부분 공유가 된다. 야근의 유무는 무의미하고 직원의 자율성과 로열티를 높이는데 집중해야 한다.

야근을 100% 없애는 것은 불가능하며 그런 노력을 필요도 없다. 강요 없이 자율에 맡겨 놓으면 된다. 업무 절대 시간이 평가에 어떠한 영향도 주지 않는다는 확신을 직원들에게 심어 줘야 한다. 야근 자체가 나쁘다, 좋다 말할 없다. 경영진의 야근에 대한 잘못된 맹신이 문제일 뿐이다. 야근을 없애야 하는 이유는 "우리 회사는 야근이 없는 멋진 회사에요"라는 우스운 얘기를 하기 위해서가 아니다. 습관적이고 강압적인 야근 문화의 부작용은 상상 외로 크며 회사의 경쟁력을 서서히 좀먹기 때문이다. 야근 자체가 화제도 문제도 안되는 자율적인 문화가 필요하다.

글은 ZDNet Korea 바텍블로그 게재되었습니다.