위험 관리 (프로젝트 성공률 1% 높이기)

프로젝트의 위험

위험! 위험은 장기적으로 미래의 어느 순간에 나쁜 영향이나 위험한 순간이 발생할 수 있다는, 즉 발생할 수도 안 할 수도 있는 사건을 의미한다. 다르게 이야기하면 위험은 프로젝트 목표에 불리하게 작용하여 손실을 초래하거나 유리하게 작용하여 이익을 초래할 수 있는 불확실한 사건 및 상황을 말한다. 이러한 위험은 본질적으로 불확실성을 내포하고 있으며 위험의 가장 핵심적인 개념이다. 만약 불확실하지 않고 확실하다면 이것은 위험이 아니라 문제라고 해야 한다.
 
그래서 위험은 예방하는 것이고 문제는 해결하는 것이다.
 
이런 위험은 보통 3가지 요소로 구성되는데 첫째는 발생할 수도 발생하지 않을 수도 있는 특정 어느 사건(Event), 둘째는 그 사건이 실제로 일어날 확률(Probability), 셋째는 그 사건이 실제로 일어났을 경우 프로젝트에 미칠 영향력(Impact)이다. 이 구성 요소들은 위험관리에서 관리되어야 할 중요한 핵심 요소이다.
 
 

프로젝트 위험 관리

앞선 위험과 더불어 위험관리란 프로젝트에 긍정적 혹은 부정적 영향을 미치는 위험 요인을 식별 및 분석하여 이에 대한 대응 방안을 수립하기 위한 체계적인 프로세스이다. 이는 긍정적 사건의 발생 가능성과 파급효과는 극대화하고 부정적인 사건의 영향력은 최소화하는 그 목적이 있다.
 
그렇다면 프로젝트를 수행하는 동안 언제 위험관리가 필요한가? 위험은 프로젝트 초반에 높고 후반으로 갈수록 낮아지게 마련이다. 이는 프로젝트 초기의 총체적 불확실성에 기인한 것으로 개념, 분석설계 및 구현단계를 거치는 시점에서 위험이 가장 높게 발생한다. 이와 더불어 영향도는 초반에는 적다가 후반으로 갈수록 높아지는 성향을 보이며 실행 및 종료 단계에서 그 영향도가 가장 높다. 이는 위험 사건이 발생하면서 영향이 계속 누적되기 때문이다.
 
 
그러므로 프로젝트 위험관리는 프로젝트가 진행되는 동안 지속해서 수행되어야 하며 PM은 위험평가와 지속적 업데이트를 보장하여야 한다. 프로젝트팀은 위험평가를 보고해야 하며 이 보고를 기초로 위험관리계획 또한 개발하여야 한다. 그러나 위험관리의 궁극적 책임은 프로젝트 주체가 지어야 하지만 각 부서에서의 위험은 해당 관리자에게 위임되며 프로젝트 위험은 PM에 위임된다.
 




 

위험관리 프로세스

위험관리 프로세스는 통상 위험관리계획, 위험식별, 위험분석, 위험 대응계획, 위험감시 및 통제의 단계를 갖는다.
 
✔️ 위험관리계획
: 위험관리 프로세스를 프로젝트에서 어떻게 수행할 것인가를 계획한다. 위험의 식별, 정성/정량분석, 대응계획, 모니터링 및 통제를 어떻게 수행할지 구체적으로 정의한다. 이를 위해 위험관리의 접근방법, 데이터 등을 세팅하며 위험의 평가와 통제는 프로젝트 성격, 진행 단계 및 활용 가능한 정보에 따라 상이하다.
 
✔️ 위험식별
: 프로젝트에 영향을 미칠 수 있는 요소를 결정하고 그 특징을 문서화한다. 여기에는 프로젝트와 관련한 이해당사자들이 같이 참여하여 식별한다. 소수에 의한 위험식별은 잘못될 가능성이 높기 때문에 프로젝트팀뿐만 아니라 고객이 함께 참여하는 것이 바람직하며 필요한 경우 해당 분야의 전문가를 참석시키는 것이 좋다.
 
✔️ 위험분석
: 프로젝트 목표에 영향을 미치는 위험 요인의 우선순위를 정하기 위해 각 위험 및 상황에 대하여 분석을 수행, 위험의 확률과 결과를 측정한다. 위험 평가에 있어서는 위험 대응계획을 위한 위험의 규모, 영향력 등을 평가하고 모니터링의 결과로 의사결정을 위해서는 위험의 불확실성을 측정한다. 이때 많이 사용하는 기법은 전문가를 참여시키거나 위험을 등급화하고 의사결정나무분석, 기대 화폐가치(Expected Monetary Value), 몬테카를로 시뮬레이션, 민감도 분석 등이 있다.
 
✔️ 위험 대응계획
: 기회를 증진하고 프로젝트의 목표에 대한 위협을 감소시키기 위한 절차 및 기법을 개발한다. 즉, 위험을 줄이는 계획을 수립하는 것으로 세부적으로는 위험 발생의 가능성을 줄이는 방안과 위험이 발생하였을 때 영향력을 줄이는 방안이 있다. 위험은 부정적인 위험인 위협과 긍정적인 위험인 기회로 나뉘며 위험의 대응도 회피, 전달, 축소, 기회에 대응하는 활용, 공유, 증대, 수용이 있다.
 
이러한 위험 대응 계획 시 참고할 것은 위험은 제거하는 것이 아니며 모든 위험에 대응하는 것이 아니라는 것이다. 또한 위험은 상호 연계되어 있기 때문에 항시 유동적이고 변경이 된다. 위험은 살아있는 유기체라고 보는 것이 맞다.
 
✔️ 위험감시 및 통제
: 프로젝트 생명주기에 걸쳐 잔존 위험 사항을 감시하고 새로운 위험을 식별하며 위험감소계획을 실행하고 이에 대한 각각의 조치 효과를 평가한다. 이는 계획단계에서의 관리계획에 의해 생명주기 전체에 걸쳐 위험을 감시하고 각각의 대응 방안을 실행하고 추적한다. 프로젝트팀은 위험을 감시하고 식별된 위험에 대하여 비상계획을 수행할 수 있게 훈련되어야 하고 PM은 위험관리자를 별도 지정하여 권한을 위임하거나 직접 감리 감독을 해야 한다.
 
 
 
 
※ 항상 깨어 있으라
아무리 주의를 해도 위험은 항시 우리 주변에 도사리고 있다. 위험은 살아있고 그 모습을 쉽게 바꿀 수 있다. 하지만 위험 또한 그 존재의 이유가 있다. 다시 말해 명확한 원인에서 기인한 다형성을 갖는다고나 할까? 그래서 문제의 문제점처럼 위험의 이유를 꼭 찾아야 한다. 그러면 위험이 암세포처럼 퍼져나가는 것을 추적하고 잡을 수 있다. 굳이 쫒아다니지 않더라도 한눈에 위험을 볼 수 있는 것이다. 개안! 그러기 위해선 눈을 크게 뜨고 그 원인을 끝까지 찾아야 한다. 우리 모두 수사관이다.

프로젝트 계획 (소프트웨어 공학)

프로젝트 문제와 범위 정의

소프트웨어 개발 시 일정이 지연되거나 비용이 초과고 기대했던 품질에는 못 미치는 산출물, 그에 따라는 여러 유지비용의 증가 등과 같은 문제들은 기본적으로 계획의 부재에서 오는 경우가 많다. 개발 일정을 준수하면서 질 좋은 소프트웨어를 개발 생산하기 위해서는 정밀하고 세심한 계획수립이 필요하다. 소프트웨어 개발 프로젝트 초기 단계에서 프로젝트의 목표를 기반으로 여러 불분명한 사안들을 확인해 가면서 계획을 수립하는 것은 매우 어렵다. 하지만 계획작업을 통해 불분명한 목표, 사용자 요구사항 및 제약사항 등을 명확히 하는 것이 필요하다. 이러한 계획은 보통 문제의 범위를 확인, 정의하고 필요한 활동들을 정하며 세부적인 일정계획과 비용을 추정하고 최종적으로 계획서를 작성하는 절차로 이뤄진다. 

다시 말해 프로젝트 계획은 대상업무와 문제들을 고객이 이해하는 용어로 정확하기 정의하고 기술하는 것으로 시작한다. 문제는 철저하게 고객의 입장에서 정의되어야 하며 기술관련 전문용어 등을 사용해서는 안된다. 문제를 정의하는 것은 범위를 정하는 것이다. 이는 개발대상의 기능, 성능, 제약조건, 인터페이스 등의 프로젝트에 대한 타당성과 신뢰성 및 초기 계획을 작성가능한가에 대한 판단 근거로 쓰인다. 문제 정의는 제일 먼저 그 배경을 이해하여야 한다. 이를 위해선 고객과의 면담, 현장답사 및 실제 업무를 수행하는 실무자의 실제 업무를 관찰하거나 직접 수행을 해보기도 한다. 그러면서 객관적 시각에 문제를 파악한다. 이 모든 것이 끝나면 문제 해결을 위한 준비를 한다.

 




일정 계획

일정은 프로젝트 개발에 있어 모든 프로세스를 구성하는 작업들을 파악하여 그 우선순위와 기간을 산정하며 진행한다. 이에 모든 작업들을 수준별로 나열을 하며 산출물이 있다면 각각 기술해 준다. 프로젝트의 규모가 작다면 큰 일이 아닐 수도 있으나 대규모의 프로젝트에서는 작업도출과 더불어 각 작업들 간의 상관관계를 면밀히 검토하여야 한다. 이때 보통은 PERT/CPM을 활용하며 최종적으로 간트차트 등을 사용하여 거시적 관점에서의 일정을 관리할 수 있도록 한다. 이렇듯 소프트웨어 공학은 엔지니어링 작업으로서 정확하고 현실적인 계획을 수립하고 작업 수행에 소요되는 여러 자원들을 최적화하여야 한다. 이에 따라 프로젝트의 진척도를 실시간으로 점검할 수 있고 계획과 비교하여 문제가 있을 시에 다방면의 조치로 문제해결이 가능하다.

간트차트로 보여지는 프로젝트 작업들, 일정표는 그 수준에 맞춰 분해가 이뤄지고 계층적으로 구성하여야 하는데 이를 위해 WBS(Work Breakdown Structure)를 사용한다. 이는 작업들이 모여 소요 일정이 예측되며 이를 통해 프로젝트 전체 일정을 예측할 수 있다. WBS는 큰 단위의 업무를 관리하기 쉬운 작은 단위의 작업으로 나누기 위한 도구이다. 여기서 관리 가능한 작은 작업들은 업무 지시를 하는 단위가 되며 작업시작일, 종료일, 소요기간, 담당자, 필요 자원 등을 병기하여 관리한다. WBS는 일정계획 작업의 입력값이며 작업 분해는 프로젝트가 어떤 작업으로 구성되었는지를 알아내는 것이고 일정 계획은 이들 작업을 어떤 순서로 할 것인가를 정하는 일이다.

  • 소프트웨어 개발모형 선정, 단계별 작업을 분해 후 작업결과 정의
  • 각 작업간 상호의존관계 정리
  • 각 작업소요기간 정의 및 프로젝트 완료에 필요한 최소기간 산출
  • 프로젝트 규모추정을 통한 M/M 산출
  • 확정 결과 정리 및 공유

 




비용 추정

소프트웨어 개발에 있어 비용을 정확히 예측하기는 매우 어려운 일이다. 특히 계획단계에서는 불분명한 사항들이 많고 여러 환경적인 요소로 비용에 대한 입장차도 존재한다. 그럼에도 불구하고 기준을 바탕으로 수립되는 소프트웨어 개발 비용예측은 특히 투입되는 개발자와 기간에 매우 큰 변수로 작용한다. 이에 과거 프로젝트의 경험이 중요하며 특히 유사 프로젝트가 있다면 규모와 비용, 인력들을 감안하여 예측을 어느 정도 가능하게 한다. 그러므로 정확한 예측은 프로젝트 성공율을 높이는 필수 조건이다. 이에 비용 예측방법도 매우 다양하며 인건비의 경우 소요기간을 기준으로 하거나 프로그램 규모를 기준하는 방법으로 크게 나뉜다.

첫번째 방법은 소요기간 기준이다. 이는 프로젝트 내 작업들에 소요되는 기간을 구하고 여기에 투입인력과 참여도를 반영하여 최종 인건비를 산출한다. 이 방법은 상향식이라 불리우며 단순히 헤드카운팅이라고도 하는데 시스템 개발에 필요한 모든 작업에 대한 노력들을 하나하나 계획할 수 있는 장점이 있으나 객곽적이 못한 추정 가능성이 있을 수 있다. 두번째 방법은 하향식으로 프로그램 규모를 추정하고 과거 경험을 바탕으로 예측 규모에 대한 소요인력과 기간을 추정한다. 프로그램 규모는 원시코드의 라인수(LOC)나 시스템의 기능을 정량화한, 좀더 복잡한 기능점수(Function Point) 등올 산출할 수 있다. 

 




조직 구성

경영관리에서 조직이란 개개인의 역할을 잘 정의하고 할당하여 프로젝트 목표 성취를 하기 위한 것이다. 이는 기업이나 단체 등 다수의 사람이 모여서 하나의 목표를 이루기 위한 방안으로 조직이 생겨난 것이다. 이러한 조직 구성의 목적은 공통된 목표를 위하여 상호 협력을 하는 것으로 프로젝트에서도 동일하게 적용된다. 이런 조직구성은 조직의 생산성과 효율에 얼마나 많은 영향을 미치고 그 결과가 어떻게 나타나냐에 대한 근본 원리를 따진다. 소프트웨어 개발 프로젝트에서 소프트웨어는 타 제품과는 다른 특징들로 인해 어떠한 조직을 구성하여 진행했느냐에 따라 소프트웨어 개발에 많은 영향을 미친다. 즉 소프트웨어의 품질을 향상시킬 수 있는 소프트웨어의 특성을 잘 살린 조직 구성이 필요한 것이다.

조직의 선택에 영향을 주는 요소는 비용 예측에 사용되는 요소와 유사하다. 알맞은 조직 구성은 프로젝트 기간과 매우 밀접하다. 장기 프로젝트의 경우 구성원들의 사기를 높이고 이직과 이탈을 막기 위하여 개개인의 만족도가 중요 시 된다. 경험이 많은 인력과 적은 인력이 적절하게 섞여야 하며 상호 간 배우고 배울 수 있는 관계 설정도 필요하다. 대규모 프로젝트의 경우 요구의 변경과 명세가 어려운 특성으로 인하여 프로젝트 후반에 신규 인력을 투입하면 일정은 그만큼 지연된다. 이는 인력 상호 간 의사소통의 통로 이슈와 기존 업무의 인수인계 등에 따른 시간을 고려한다고 해도 해소되지 않는 난제이다. 다시 말해 작업의 특성과 조직 구성원 사이의 의사소통의 횟수는 조직의 규모에 맞춰야 하며 필요 이상의 결과에 집중하지 않게 적정 선을 지키는 것이 중요하다.

프로젝트 팀 구성에 영향을 주는 다른 요소는 작업의 특성 및 팀 구성원 사이에 의사교류의 횟수이다. 의사소통이 원활할 수 있는 조직규모와 인력수는 매우 밀접하며 프로젝트의 복잡도와도 긴밀하다. 이에 공식적인 모형과 인원수도 산출할 수 있는데 중요한 것은 생산성에 촛점을 맞춘 균일한 규모의 조직을 구성하는 것이다. 이 규모는 소프트웨어의 특성과도 연계가 되며 팀은 원칙적으로 작업 수행에 제일 타당하게끔 조직되어야 한다. 그러기 위해선 관리자의 권한과 더불어 일정, 예산, 품질 등 여러 요소를 고려하여 조직 구성방법을 결정하여야 한다. 특히 소프트웨어 개발 팀구성은 의사결정권이 누구에게 있느냐에 따라 구별되며 리더의 역할, 권한, 의무에 따라 크게 3가지 형태의 구성방식을 갖는다.

  • 중앙집중형: 하나의 관리자의 지휘에 따라 움직인다. 기업 조직 내 일반적인 계층형 조직으로 상하관계가 명확하여 대규모 조직보다는 소규모 조직에 적합하고 이의 모듈화로 규모를 키울 수 있다.
  • 분산형: 의사결정을 민주주의식으로 하며 모든 작업은 공동의 작업이다. 팀 구성원 각자가 서로의 작업을 검토하고 타 구성원의 작업결과에 대하여 책임을 진다. 다만 의사소통 비용이 많이들며 이에 따른 생산성 문제가 있다.
  • 혼합형: 중앙집중형과 분산형의 단점을 보완하기 위해 구성된다.

 




위험분석

위험 분석은 프로젝트에 내재한 위험 요소를 인식하고 그 영향력을 분석하여 관리하는 활동이며 프로젝트를 성공시키기 위하여 위험 요소를 사전에 예측, 대비하는 모든 기술과 활동이 포함된다. 위험 요소에 대해 적절히 관리하지 못하면 프로젝트는 실패할 수 있다. 초기 단계에 위험 요소를 인식하고 그 영향을 분석하였어도 이를 다루는 일관성 있는 계획이 없으면 실패하기 쉽다. 이러한 위험을 줄이는 효과적인 방법은 프로토타이핑이나 점증적 개발 방법 있으며 중간 변경 위험을 대비하기 위한 모듈화도 생각해 볼 수 있다. 

< Boehm(Barry William Boehm, 미국 소프트웨어 엔지니어 및 교수, 나선형 모델 제)이 제시한 10가지 위험 요소와 관리 기법 >

  • 인력부족: 유능한 인력 수급, 팀구성, 교육
  • 비현실적 일정/예산: 구체적 비용/일정 예측, 원가분석, 재사용
  • 잘못된 기능의 SW개발: 프로토타이핑, 조직/직능분석
  • 잘못된 I/F개발: 프로토타이핑, 타스크분석, 시나리오기법
  • 과포장: 프로토타이핑, 원가분석, 비용수익분석
  • 계속적인 요구변경: 최대변경상한선, 점증적 개발
  • 외부 모양 빈약: 벤치마킹, 성숙도분석
  • 외부 기능 빈약: 사전검증, 대조확인
  • 실시간 성능 빈약: 벤치마킹, 튜닝, 시뮬레이션
  • 기술적 취약: 기술분석, 비용수익분석