프로젝트 선정 (프로젝트 성공률 1% 높이기)

프로젝트 기획!

기획? 계획? 비슷한 용어 같지만 전혀 다르다. 다시 한번 사전을 찾아보자. 기획(企劃)은 꾀어서 긋는, 즉 일을 꾸며서 계획하는 것이라 하고, 계획(計劃)은 세어 긋는다는 의미로 해야 할 일의 구체적인 사항들(내용, 방법, 차례, 일정 등)을 미리 생각해서 정하는 것이라 한다. 다시 말해 기획은 고민한 목적을 바탕으로 과제를 결정한 뒤 어떻게 할 것인지를 찾아가는 것이라면 계획은 이미 정해진 과제를 어떻게 할 것인지를 고민한다. 
 
앞선 글들에서는 프로젝트의 계획에 대해서 주로 이야기했다면 이제는 스스로 기획하여 프로젝트를 만든다고 할 때 어떠한 절차와 방법들이 있는지 자세하게 알아볼 필요가 있다. 이는 프로젝트 진행을 위한 갑과 을을 입장에서 서로를 이해하고 보다 명확한 프로젝트 분석 설계를 하기 위한 실마리로서 많은 배움을 얻을 수 있다.
 
 

프로젝트 타당성 분석

프로젝트는 니즈와 시점이 부합되는 지점에서 발생한다. 이는 크게 내부 프로젝트와 외부 프로젝트로 나뉘는데 내부 프로젝트는 조직 내부의 프로세스를 개선한다거나 제품, 솔루션 개발을 통한 생산성 향상 내지는 대외 경쟁력 확보 차원에서 진행된다. 반대로 외부 프로젝트는 수익성을 최우선으로 양질의 서비스를 받거나 비즈니스 목적에 연관된 아웃소싱을 염두에 둔다.
 
프로젝트는 발의에서 실제 승인까지 여러 단계와 시간이 소요되며 그 중간과정에서 꼭 필요한 것은 프로젝트 목적을 달성시킬 수 있는 프로젝트의 타당성 검토에 있다. 지난할 수도 있지만 이 부분은 반드시 통과해야 프로젝트는 계획이 아닌 실제 수행단계로 접어들 수 있다. 무엇보다도 기업은 시장에서의 기회에 대한 실행과 성공 여부를 분석하여 의사결정을 통해 프로젝트를 승인하고 진행한다. 그렇다면 타당성에 대한 분석은 어떻게 하는가? 그 기준을 몇 가지 찾아보자.
 
🚩시장
 : 과연 시장에서 이 프로젝트는 성공할 것인가를 타진한다. 여기서 시장은 내외부 모두를 포함하며 이 토대 위에 타깃 시장을 정조준한다. 더불어 시장에 대한 고려는 고객과도 맞닿아있다. 고객분석과 시장분석은 떼려야 뗄 수가 없으며 밀접한 관계와 긴장도를 유지한다. 다만 시장이 모두 고객은 아니며 고객이 모두 시장은 아니다.
 
🚩기업 내부
: 프로젝트를 수행할 역량을 조직이 갖추었는가? 인력, 조직구조, 지원자원 등 프로젝트에 필요한 기본적인 요건들은 준비되고 충족된 상태인가? 검토 결과를 모두 수긍하고 상황에 맞게 개선하고자 하는가? 혹시 몇몇 의견에 압도되어 무리한 진행을 하려고는 하지 않는가? 철저한 내부 분석을 통해 외부 영향도를 고려해야 한다. 안에서부터 시작이다. 
 
🚩재정
: 모든 계획이나 시점이 맞아떨어져도 일을 수행할 자원, 돈이 없다면 어떠한 일도 진행할 수 없다. 영리를 목적으로 하는 기업은 투자 여력을 항시 고려하여야 하며 냉정함을 끝까지 유지해야 한다. 미래의 대가를 먼저 끌어온 들 돼야 하는 것. 경영진을 포함하여 실무진까지 궤를 같이하지 않으면 옳은 것이 아니다. 
 
🚩설계
: 고객의 요구사항은 명확히 정의되고 확인되었는가? 이 요구사항을 충족할만한 기술력은 보유하고 있는가? 개발 이전에 분석설계 단계에서 감내해야 할 부분은 충분히 고려되었는가? 혹시 현실 감각이 둔화한 허황한 미래상을 그리고 있지는 않은가? 전문가를 포함하여 현업과의 밀접한 관계로 설계는 계속 확인하여야 한다.
 




 

프로젝트 선정기법

프로젝트 착수 이전, 프로젝트에 대한 타당성 분석과 실행 여부에 대한 판단은 포트폴리오 차원에서 기업 전략목표에 부합하는지, 다른 프로젝트들과 영향력은 어떠한 상태인지, 각각의 우선순위들은 문제가 없는지를 인지하고 이를 통해 프로젝트 선정을 위한 합리적 의사결정을 위해 여러 지표를 분석하고 경제성을 파악하는데 주안점을 둔다. 그렇다면 어떤 기법들을 통해 의사결정을 할 수 있을까? 간략히 살펴보면 다음과 같다.
 
🚩미래가치와 현재가치
:  현재의 일정 금액이 향후 몇 년 뒤 가지게 될 가치를 평가하거나 이에 반대로 평가한다. 미래가치는 보통 복리(FV = 원금 ⅹ (1 + 이자율) 년수의 거듭제곱) 계산과 유사하다. 
 
🚩투자 가치평가
: 프로젝트 수행 시 투입될 비용과 프로젝트 완료 후 발생하는 편익에 대한 현금흐름을 추정하여 정한다. 여기서 모든 비용과 편익은 현재가치로 환산하며 환산된 총비용과 총편익을 비교하여 투자가치를 평가하며 다음과 같은 방법들이 있는데 우선은 무엇이 있는지만 살펴보자. (※ 관련해선 좀 더 깊은 공부가 필요하다)
  • 화폐의 시간적 가치 미고려 시: 회계적 이익률법, 회수기간법 등
  • 화폐의 시간적 가치 고려 시: 순현재가치법(NPV), 내부수익률법, 편익/비용 비율, 경제적 부가가치, EVA 등 
이러한 일련의 방법을 통한 프로젝트에 대한 판단은 최종적으로 정보화 계획을 수립하게 된다. 조직의 장기적 목표와 전략에 따라 세부 마일스톤을 세우고 전술적 액션플랜을 마련한다. 이에 따라 각기 수행할 업무를 세분화 및 명확화하고 관련 이해당사자들 간의 협의를 거쳐 사업화할 부분을 선택, 확정하며 최종적으로 마련된 계획안을 배포, 공유한다. 이제 한 가지 목표를 바라볼 때가 온 것이다.
 
 
 
 
※ 뭣이 중한데?
기획하다 보면 자칫 모든 것이 중요하게 보이며 변별력이 사라질 때가 있다. 하지만 결국 길을 찾고 해결책을 제시해야 한다. 여기서 꼭 필요한 것은 흐려진 목표와 목적을 다시금 상기하고 항시 잊지 않는 것이다. 이는 길 잃은 망망대해에서 별자리이자 삶의 의지이다. 그래서 정말 중요한 일을 하게 되어 있다. 그러니 망설이지 말고 한 걸음 앞으로 나아가 보자. 꾹!

PM (프로젝트 성공률 1% 높이기)

PM. 그는 누구인가?
어느 고객이건 사이트이건 프로젝트가 시작될 때 우선순위가 가장 높은 일 중의 하나는 PM, 프로젝트관리자를 구하는 것이다. 우리가 하고자 하는 프로젝트를 맡아줄 최적의 적임자를 찾는 것이다. 다른 구성원이나 조직들이 완비되었어도 PM이 없다면 선장 없는 배나 다름이 없다.

그렇다면 PM은 무엇인가? 프로젝트관리자는 간단히 말해 프로젝트의 성공적 수행을 책임지는 사람이다. 프로젝트의 성공에는 PM이 필수이며 PM은 자신이 원하는 팀을 꾸리고 활동을 지원하며 여러 이해당사자의 업무를 조정하고 협업을 조정한다. 사람과 사람 사이의 갈등도 조율하고 각종 위험 요소를 미연에 방지하고 해결책도 찾아야 하며 이를 통해 궁극의 책임을 지는 사람.

그래서 PM의 어깨 또한 무겁다. 그래서 이를 감당할만한 권한과 책임 또한 같이 주어진다. 작은 프로젝트는 규모의 차이이지 하는 일은 똑같다지만 그래도 부담은 다소 적을 수 있고 최악의 경우 인력수급이 제대로 안 될 경우에는 여러 사람(?)이 합심해서 프로젝트를 꾸려나갈 수도 있다. 그러나 정답은 아니다. PM은 그 자리에 있어야 할 인물이다.

 

프로젝트관리자의 역할들
위에서 보면 과연 PM을 할 사람이 있을까 하는 생각이 절로 든다. 하지만 오랜 경험과 통찰, 이슈 해결에 흥미를 가지고 이력 관리를 하는 사람 또한 적지 않다. 다만 서로가 원하는 인연이 필요할 뿐. 환경 탓은 부차적이다. 그래서 PM은 준비해야 한다.

🚩계획수립, 자원관리, 보고
: 현장을 돌아보고 자리에 앉아 현실적인 계획을 짜야 한다. 단순히 책상머리에 앉아만 있으면 안 된다. 모든 조건이 만족하지 않는다면 더더욱 현장을 뛰어다녀야 한다. 이를 토대로 내가 손에 쥔 것이 무엇인지, 무엇이 필요한지 판단하고 이를 구하고 배정해야 한다. 계획대로 일을 진행하기 위해선 인력과 자원을 필요할 때 지원받을 수 있게끔 상하 위 소통의 끈을 놓지 말고 정확히 보고한다. 단순 문제 제기는 아무런 도움이 되지 않는다. 항시 대안을 마련하여 신속 정확한 의사결정이 될 수 있도록 한다.

🚩책임, 조정, 의사소통
: 프로젝트 초기 고객의 요구사항을 명확히 파악하고 범위 확인을 통해 업무를 수행한다. 하지만 모든 일에는 반드시 예외가 발생하고 계획대로 되는 일은 거의 없다. 그래서 변경 사항에 대한 통찰력과 함께 그 파급효과 등을 사전에 고려하고 원활하게 운영될 수 있도록 조정이 필요하다. 여기서 품질은 기본적으로 챙기면서 모든 단계의 업무가 유기적으로 잘 흘러갈 수 있게 의사소통력 또한 필요하다.

🚩의사결정, 관리, 훈련
: 책임과 권한이 있기에 의사결정을 내릴 수 있다. 다만 올바른 의사결정을 위해선 거시적인 안목과 관리가 필요하다. 그 순간 최선의 의사결정을 내릴 수 있는 데이터가 필요하고 이는 모든 구성원으로부터 교육훈련 등을 통해서 상호 지원받아야 한다. 팀원에 대한 격려와 수행력을 향상하고 여러 자리를 통해 갈등을 해소하는 것. 일보다 사람이 힘들다는 것을 몸소 체험하게 될 자리에 PM이 서 있다.

🚩발주, 계약, 검수
: 관리의 영역은 넓다. 이러한 업무를 지원해 주는 조직이 있을 수도 있지만 우선은 PM의 손을 타게 되어있다. 그래서 단순히 현업업무에만 집중하면 안 된다. 발주자의 역할로서 인력이든 다른 자원이든 PM의 손을 거쳐 움직여야 한다. 특히나 행정적 위험이 곳곳에 도사리고 있는 업무인 만큼 검증과 피드백을 통해 확인에 확인이 필요하다.

🚩조직 지원과 협력
: 위와 같은 외부 조직 등과의 업무를 위한 일도 있지만 내부 조직 또한 하나의 고객으로서 매우 중요하다. 그 말은 이들의 지원 또한 무시할 수 없다는 것을 말한다. 그래서 유관부서와 긴밀한 의사소통과 공유가 필요하고 서로의 업무 영향력을 고려한 협력이 필요하다. 프로젝트를 원만히 진행하기 위한 든든한 버팀목이자 지지자들은 멀어 어딘가가 아닌 바로 내부에 있다.




PM. 그들에게 필요한 것들
그렇다면 PM은 무엇을 갖춰야 할까? 너무 많은 것들이 있지만 그래도 중요한 몇 가지를 꼽으라면 다음과 같다.

  – 관리역량
  – 기술력
  – 의사소통력
  – 리더십

관리역량은 하루아침에 만들어지지 않는다. 물론 성향이나 내재적인 역량을 갖춘 사람도 있으나 보통은 학습과 경험을 통해 얻을 수 있다. 이에 따르는 많은 공부 또한 필요하다. 이는 기술력 못지않은 전문성도 필요로 하기에 실제 업무를 통해 하나둘 만들어가는 노력이 따라야 한다.

기술력은 프로젝트의 세부 활동을 지시하고 검증할 수 있는 역량이다. 전문지식을 보유하고 있으면 이해당사자들에게 보다 넓고 깊은 영향력을 행사할 수 있다. 이런 부분이 미흡할 경우에는 당연히 신뢰를 얻기가 어렵다. 물론 PM을 세분화해서 관리 PM이나 기술 PM 등으로 나눌 수도 있지만 이건 그런 환경이 될만한 프로젝트가 아니고서야 꿈도 꿀 수 없다.

성공의 소통이다. 일이 어렵고 쉽고를 떠나 결국 일은 사람이 해내는 것이다. 무엇이 되었던 서로 얼굴을 마주하고 문제를 해결해 나갈 수 있는 서로 간의 영향력이 중요하다.

마지막으로 리더십이다. 관리자라 관리만 하면 되지 무슨 리더십이 뭐냐고 할 수도 있지만 PM은 관리를 기반한 리더이다. 그래서 리더의 역량 또한 가져야 한다. 수많은 가정하에 유연함을 무기로 How가 아닌 What에 집중하면서 책임지는 솔선수범의 자세를 경주한다면 약간은 모자라더라도 PM을 역할을 충분히 해낼 수 있다.

 

※ 어떻게 한번 해볼래?
연차가 쌓이고 직위가 올라가면 한 번쯤 받아보는 자리. 선택의 여지가 주어질 수도 있지만 대부분은 지명을 통해 앉게 되는 그 자리. 왕의 자리까지는 아니지만도 그 무게를 견뎌내야 하는 것은 익히 봐와서 안다. 그래서 도망가고 싶어진다. 난 못할 것 같다. 큰일이 나면 어떨까 싶다. 밥맛이 없어지고 머리가 하나둘 빠진다. 어서 이 프로젝트가 끝나길 기다리지만 달리 생각하면 이때가 아니면 언제 해볼 수 있을까 하는, 기회가 주어짐에 감사하게 된다. 그래서 버틸 힘이 되나 보다. 이 세상 모든 PM 들 파이팅!!!

프로젝트생명주기 (프로젝트 성공률 1% 높이기)

프로젝트 생명주기!

일을 진행하는 과정에 있어서 그 단계와 절차들이 있는데 프로젝트에선 이를 생명주기(life cycle)로 표현하며 여러 단계(phase)를 통합적으로 지칭한다. 프로젝트 수행조직은 하나의 프로젝트를 여러 개의 단계로 구분, 관리하는데 이 단계는 프로젝트의 구성단위로 볼 수 있고 각 단계는 단계별로 중요한 산출물이 완료되는 시점이다. 이러한 단계는 종료 검토를 통해 다음 단계로 진행할 것인지를 결정하고 이 단계들이 모여 최종적인 프로젝트가 완성된다.

모든 프로젝트는 단계로 나눠진다고 이야기했다. 크든 작든 프로젝트와 상관없이 이 단계들은 일정한 생명주기를 가지는데 큰 틀에서는 엇비슷하다고 볼 수는 있으나 크게는 업종에 따라서도 그 내용이 상이하다. 그래서 동종업계의, 유사 프로젝트 성격을 가진 자료들을 바탕으로 이러한 생명주기를 참고하고 갖춰볼 수도 있다. 그러면서 내 프로젝트에 맞게끔 적용하거나 변경할 수 있다.

프로젝트관리 생명주기?

그간 프로젝트, 프로젝트관리, 생명주기 등 각각의 용어에 대해서 알아보았다. 그렇다면 프로젝트관리 생명주기는 무엇인가? 헷갈릴 수도 있지만 앞선 용어들을 참고해서 의미를 생각해 보자. 프로젝트 생명주기가 아닌 프로젝트관리에 대한 생명주기는 관리 절차, 관리프로세스라고 볼 수 있고 이는 각각 착수, 계획, 실행, 감시/통제 및 종료로 구성된다. 아래를 봐보자.

🚩착수
: 프로젝트의 시작이다. 고객이 프로젝트의 발의를 결정하고 수행조직에 전달되어 준비되는 이벤트이다. 첫 시작이기 때문에 이것저것 챙길 것이 많다. 그중에 몇 가지만 추려보면, 프로젝트 요구사항분석, 예비 범위 확인, 일정/예산 산정, 제약조건 확인, 이해당사자 분석, 성과기준 마련, PM 결정과 권한 부여, 팀 꾸리기 등이 있다. 이 모든 예비작업이 정의되고 기술되어 Big Picture로서 프로젝트계획이 수립된다.

🚩계획
: 앞서 그린 큰 그림을 바탕으로 프로젝트를 세세하게 계획한다. 프로젝트 관리계획, 실질적인 범위 기술서, WBS(Work Breakdown Structure), 각각의 액티비티와 우선순위, 기간, 자원할당, 비용산정, 품질계획, 인력/의사소통 관리, 위험관리 등 관리의 추상화 레벨을 내려가며 할 일들을 정리해 나간다. 이 계획들이 빠짐없이 세세하게 구축이 되어야만 프로젝트의 성공률을 끌어올리는 실마리가 될 수 있다.

🚩실행
: 이제 본격적인 활동의 시작이다. 프로젝트 구성원들에 대한 다양한 기초교육을 바탕으로 유관 조직, 기관, 업체들에 대한 선정 내지 작업지시, 본격적인 품질보증 활동을 토대로 도입된 방법론에 따라 지속적이고 점진적인 진행을 시작한다. 어떻게 보면 실행은 전체 프로젝트에서 약 20~30%에 해당하는 단계이다. 나머지 70~80%는 단순하게는 문서 형태로 귀결되는 모든 단계의 활동 산출물들이 담당한다. 근래에 들어 이런 부담을 줄이는 경량화되고 빠른 방법론들이 사용되고 있다. 다만 모든 경우를 포괄하는 것은 아니다.

🚩감시/통제
: 프로젝트의 빅브라더가 해야 할 일이다. 매 단계의 성과를 품질 기반으로 측정하고 진척을 관리한다. 문제가 발생하면 시정조치와 피드백을 받고 그 효과성을 평가하여 프로젝트에 재귀적 반영을 한다. 변경에 민감하며 비용을 통제한다. 위험 유발요인을 집요하게 추적하며 모든 활동을 감시한다. 감시라는 용어가 다소 거부감이 들 수도 있지만 감시가 몇몇 관리자가 하는 행위뿐만 아니라 프로젝트 모든 구성원이 해야 할 일이기에 그렇게 생각할 필요는 없다. 성공하고자 한다면, 성공의 책임은 모든 이해당사자 각각이다.

🚩종료
: 대망의 마무리 단계. 그간의 업무들을 총체적으로 정리, 마감한다. 산출된 결과물들을 고객에게 인도하고 승인을 득하며 프로젝트 전 과정을 통해 배울 것들, Lessons Learned를 문서화하고 공유한다. 점유된 자원들을 하나둘 해제하며 프로젝트는 서서히 끝날 기미를 보이며 종료된다. 완료 평가와 함께 최종 보고를 하고 고객관리 방안과 미결사항 등에 대한 복안을 논하고 오랜 시간의 마침표를 찍는다.

Project Management Lifecycle
< 프로젝트관리 생명주기 >

관리영역들

업무를 하면서 우리 알고 있는 PDS, 즉 Plan – Do – See와 다르게 프로젝트는 시작과 끝에 따라, 여러 특성과 환경 등에 따라 그 생명주기는 각기 다르다. 그래서 앞선 5가지는 세부적으로 여러 가지 프로세스들로 구성되어 있다. 이는 흔히 PMBOK(Project Management Body of Knowledge, 현재 7판)이나 SWEBOK(Software Engineering Body of Knowledge, 현재 4판)등에 자세히 나와 있다. 프로젝트에서 이것을 모두 활용하기엔 다소 무리가 있고 그중 가장 핵심적인 단계들만이라도 제대로 관리한다면 프로젝트 성공률은 높아질 수 있다. 세세한 내용은 차차 다루기로 하고 여기서 알아 둘 것은 크게 두 가지이다. 프로젝트 목표 달성을 위한 Core 프로세스는 원가, 일정, 범위 단계, 그리고 목표 달성을 위한 수단으로써의 Facilitating 프로세스는 품질, 인력, 의사소통, 위험, 아웃소싱단계가 그것이다.

 

※ 한곳을 향해.
PM은 프로젝트를 성공적으로 완수하고 싶다. 격하게 하고 싶다. 그래서 나름의 넘치는 욕심과 의욕으로 시작하지만 높고 낮은 벽들에 계속 부딪히고 싸우면서 점점 의기소침해지고 소극적으로 변하며 전의를 잃기도 한다. 이때 무엇이 필요할까? 멘털이다. 멘털을 잘 붙들어 매어야 나 자신을 지킬 수 있다. 그리고 이걸 옆에서 지켜보는 구성원들은 PM을 이해하고 지지해줘야 한다. 설사 내부 총질(!?)을 해대는 상황이 발생할지라도 그건 나중 일이다. 팀은 왜 존재하는가?

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

프로젝트관리란?
앞서서 프로젝트에 대한 정의를 살펴봤다. 그렇다면 이 프로젝트를 관리한다는 것은 무엇을 의미하는가? 이 지점에서 관리라는 용어도 살펴보고 가자. 관리란 흔히 사람을 통제하고 지휘 감독하는 것이나 여러 시설이나 물건의 유지·개량 따위를 꾀하는 것을 말한다. 이를 프로젝트에 대입해 보면 목표를 세우고 계획을 짜며 일들을 수행하고 목표를 달성해 가는 과정에서 필요한 수많은 자원과 시간 그리고 노력은 프로젝트의 관리 측면이다. 이는 매우 필수적이고 중요하며 프로젝트와 관리가 별개가 아닌 하나로서 인식해야 할 필요성을 느낀다.

그래서 프로젝트관리는 “프로젝트 요구를 만족시키기 위해 지식, 기술, 도구 및 기법들을 프로젝트 활동 중에 사용하는 것“이라 할 수 있다. 다시 말해 프로젝트 요구사항을 충족시키고 만족시키는 것, 이를 위한 모든 요소를 잘 이해하고 관리하여 목적한 바를 달성해 나아가고 더 나아가 프로젝트의 성공적 완료를 가능케 한 자원, 특히 조직의 역량을 확보하고 강화하는 것이 그 이면이라고 본다.

그러면 이러한 프로젝트의 성공률은 얼마나 될까? 다소 오래된 자료이긴 하나 지금까지도 유효한 Standish Group의 2010년 Chaos Summary를 보면 30% 정도의 프로젝트만 성공한다고 한다. 그렇다면 나머지 70%는 실패한다는 이야기인데 그 원인은 주로 1) 요구사항의 부정확성 2) 사용자 환경의 이해 부족 3) 불충분한 자원 4) 비현실적인 사용자 기대치 5) 관리지원의 부족 6) 변경 관리의 미흡 7) 프로젝트 계획의 미비 등이라고 한다. 이는 곧 관리 부재의 결과이고 특정 몇몇 사람이 아닌 조직 전체의 문제로 비친다. 특히 관리의 제약 측면에서 살펴보면 다음과 같다.

 

프로젝트 관리의 3대 제약
프로젝트는 아래 3가지에서 절대 벗어나지 않는다. 이는 프로젝트의 성공과 실패를 구분하는 기준이며 모든 단계의 품질을 좌지우지한다.

● 범위
: 프로젝트에 존재하는 필요와 기대 사이의 요구사항이다. 프로젝트 초반 고객의 요구사항을 제대로 파악하지 못하면 범위는 계속 흔들린다. 상세한 요구사항은 프로젝트의 첫 단추다. 이를 위해 요구사항관리라는 별도의 프로세스를 만들어 놓고 있으며 이를 통해 유기적인 범위관리에 신경을 쓴다.

● 일정
: 프로젝트의 시작과 끝, 그 기간이다. 프로젝트계획 시 범위에 기반한 일정을 수립하지만 철저한 관리가 되지 않는다면 일정은 자연스럽게 지연이 된다. 프로젝트관리자는 일정에 민감해야 한다. 전체 일정과 하루 일정. 진척도는 관리되어야 하며 이슈가 발생하면 전파하고 해결책을 찾아야 한다.

● 원가
: 프로젝트에 할당된 예산은 타당한가? 제대로 된 수요조사와 시장조사를 통해 원하는 사양에 충족한 것들을 선별, 구매했는가? 특히 인건비는 제대로 평가받고 있는가? 예산이 부족하다고 제일 먼저 인건비에 손을 대지는 않았는가? 그래서 실력 있는 개발자들을 외면하고 있지는 않은가? 아니면 한 사람에게 너무 의존하는 것은 아닌가?

프로젝트 관리 3대 제약

 

성공과 실패
모든 프로젝트는 성공하여야 한다. 그 끝을 위해서 모든 이해당사자는 서로 협력한다. 하지만 성공과 실패의 기준이 무엇인가에 대해서는 의견이 분분하다. 알고는 있지만 서로 상대적인 개념 사이에서 위의 3가지 제약은 훌륭한 기준을 마련해준다. 이를 바탕으로 프로젝트를 관리하고 관리의 성공과 실패 여부는 핵심 이해당사자들에게 달려있다.

이해당사자. 이들은 프로젝트와 밀접한 경영진, 개발자, 관리자, 고객 등이 있다. 이 중에서 고객의 요구사항에 얼마나 잘 부응했는가가 성공을 가늠한다. 3가지 기준에 충실한 관리, 그러면서 고객 요구사항의 충족. 성공은 멀리 있지 않다. 그만큼 실패도 성공의 반대편 가까운 곳에 서 있다. 부정확한 요구사항, 사용자의 몰이해, 충분하지 못한 자원들, 비현실적인 기대치와 무관심, 변화무쌍한 상황들의 관리 부재, 이들을 아우르는 계획의 미비. 그렇다고 유명하단 프로세스나 방법론이 모든 문제를 해결해 줄 수는 없다.

프로젝트는 요리와도 같다. 여러 좋은 재료들을 모아 정해진 레시피대로 정성껏 요리하면 맛 좋은 음식 맛을 볼 수 있다. 이 요리에 있어 요리사는 전체적으로 볼 수 있어야 하고 집중하여 관리하며 문제가 발생했을 때 이를 개선하는 노력을 통한 최적화! 나에게 맛 좋은 음식도 중요하지만, 고객의 입맛에 맞게, 원하는 사항들을 충족시키고 더 나아가 미처 모르던 맛까지 제공한다면 프로젝트는 성공이라 말해도 부족하지 않다.

이해당사자
프로젝트에는 수많은 이해당사자가 존재하며 이들은 프로젝트의 성공 여부를 결정짓는 매우 중요한 개인 혹은 조직이다. 영어로는 stakeholder. ‘지주를 붙잡는 사람’이라는 뜻처럼 각각의 역할과 책임이 막중하다.

  º 프로젝트관리자: 프로젝트 수행 전반의 책임자
  º 고객: 프로젝트 결과물을 사용하게 될 개인 혹은 조직
  º 기능부서 관리자: 프로젝트팀원이 속한 부서의 관리자
  º 경영진: 프로젝트를 수행하는 조직의 최고 관리자
  º 프로젝트부서: 프로젝트를 수행하는 사람 혹은 조직

이들은 그 특성과 영향력 수준에 따라 분류할 수 있고 각자의 이해 분야가 다르기 때문에 여러 갈등의 양상을 보일 수 있다. 이에 프로젝트관리자는 갈등 당사자 간의 이해의 합의를 구하고 해결책을 제시해야 하고 고객의 입장에서 움직여야 한다. 그래서 조직적인 대응으로 PMO를 구성하기도 하고 프로젝트 조직을 프로젝트 상황, 기업조직구조, 방침 등에 따라 기능 조직, 매트릭스 조직, 프로젝트 조직 등으로 나누어 사전에 결정하고 깊게 운영하여야 한다.

 

 

※ 너는 너, 나는 나
얽히고 섥힌 사람들로 북적이는 프로젝트에서 프로젝트관리자는 너무나도 중요하다. 그런데 요즘은 이런 부담을 떠안기 싫어 도망가는 사람들로 PM을 할만한 사람 찾기가 하늘의 별 따기 수준이다. 저는 개발만 하고 싶어요! 라는 사람들도 업무를 알아야 개발이 될 텐데 하물며 PM은 어떠할까? 세상은 바뀌어도 PM은 가치는 영원하다.

프로젝트란? (프로젝트 성공률 1% 높이기)

프로젝트란?

프로젝트란 무엇인가? 많이 들어보고 흔히 쓰고 있는 말이지만 정확히 어떤 뜻인지 설명할 수 있을까? 이것이 안된다면 사실 모르는 말이라 해도 과언이 아니다. 어떤 일을 하기 전에 반드시 짚고 넘어가야 하는 것 중 하나가 바로 용어의 정의이다. 이것을 간과한 경우엔 많은 혼선과 잡음, 서로 간의 반목과 갈등이 생기기 마련이다.

용어로써의 프로젝트란 사전적 의미로 ‘학습자가 스스로 자기 활동을 선택·계획하고 방향을 설정해 가는, 문제 해결의 학습’을 뜻하기도 하고 ‘연구·사업 등의 계획’으로서 `일감’이나 `연구 과제’를 뜻하기도 한다. 여기선 후자의 뜻인데 다시 말해 프로젝트란 전체적인 목적을 향해서 수행하는 일련의 활동들이나 그 목적의 달성과 관련된 정보의 수집으로서 “유일한 제품, 용역 또는 결과를 창출하기 위해 투입되는 일시적 노력“을 말한다. 즉, 프로젝트는 목적을 가진 사람들의 행위이면서 유한하고 뚜렷한 목표가 있다. 그래서 하나의 프로젝트는 반복되지 않고 일상적이지 않다.

 

프로젝트의 주요 특징
프로젝트는 위에서 언급했듯이 몇 가지 주요한 특징들이 있다. 이를 좀 더 살펴보면 다음과 같다.

● 명확한 목표와 목적

: 흔히들 크게 신경 쓰지 않고 하는 말 중에 목표와 목적이 있는데 목표와 목적은 전혀 다르다. 목표는 흔히들 goal로 이야기하는 실체가 있는 대상이고 목적은 why, 이유이다. 즉, 목표가 있다는 건 프로젝트의 가장 큰 특징 중 하나다. 그래서 목표를 달성하면 프로젝트는 자연스레 소멸한다. 그렇기 때문에 프로젝트 조직이 별도로 구성되었을 때 그 프로젝트의 목표가 이뤄지면 그 조직은 해체된다. 이런 목표는 성과로 산출되고 평가가 된다. 지속해서 피드백되고 목표를 이루고자 하는 목적의식으로 모든 구성원은 함께 나아가게 된다.

● 한시성

: 시간이 정해지지 않았다면 이것은 프로젝트가 아니다. 우리가 잘 아는 140여 년 전부터 시작된 스페인 바르셀로나의 가우디 성당 프로젝트는 그 끝이 언제인가에 대해서 말이 많았지만 아마도 2026년이 되면 이 프로젝트의 마침표를 찍을 예정이다. 이를 이제 프로젝트라고 말할 수 있는 것은 그 목표 시점이 정해졌기 때문이다. 짧은 단위 프로젝트이던 긴 장기 프로젝트이던 프로젝트라고 불리기 위해선 반드시 시작과 끝이 있어야 한다는 것이다. 이것이 한시성이다.

● 유일성

: 그렇다면 목표와 목적, 명확히 정해진 기간만 있다면 프로젝트가 맞는가? 물론 틀리진 않지만 중요한 또 다른 특징 중의 하나는 세상 어디에도 없는 유일함이다. 이는 그 프로젝트 자체, 즉, 환경, 사람, 행위, 내용, 사건, 결과 모두를 고려한 유일성이라 볼 수 있다. 이 때문에 이 프로젝트가 다른 프로젝트와 다르다고 말할 수 있고 선언할 수 있으며 그래서 이 프로젝트에 참여했던 모든 구성원이 흥미와 보람을 여기서 찾을 수 있는 것이다. 어디 가서 경험할 수 없기 때문이다.

● 상세화

: 프로젝트는 매우 치밀하고 구체적이며 그 면면이 상세하다. 그 상세함은 내용을 중시하며 보다 지속해서 점진적으로 구체화한다. 큰 틀에서 큰 그림을 그리고 페이지를 점점 넘길수록 그 내용의 밀도를 더해가는 상세함이 프로젝트를 어렵게 만드는 이유이기도 하지만 이 상세함이 없이는 프로젝트가 제대로 완성될 수 없다. 그래서 이 부분은 많은 시간이 필요하고 풍부한 경험이 중요하게 된다. 즉, 고객 접점의 수많은 이야기가 하나도 빠지지 않고 제대로 써지는 것을 말한다.

사례들

우리 주변에 보면 정말 많은 프로젝트가 수행되고 있고 끝이 나고 새로 시작되며 혹은 여러 사정으로 마무리를 짓지 못하고 있다. 흔히들 보는 건축이 그렇다. 우리 동네에 어느 날 갑자기 아파트가 들어선다. 그 공사 현장 입구에 가면 조감도를 비롯하여 여러 사항을 확인해 볼 수 있다. 특히 위에서 이야기한 특징들의 면면을 볼 수 있다. 건축은 아마도 프로젝트가 가장 잘 적용되며 실질적으로 다양한 측면의 기법들이 가장 발달한 분야이기도 하다. (특히 IT는 건축에서 왔다고 해도 무방하다)

신제품 개발도 그렇다. 매년 출시되는 S사의 휴대폰을 한번 보자. 주기적으로 서로 다른 제품군을 선보이고 있으며 이는 향후 몇 년 뒤까지 이미 로드맵으로 설정되어 있다. 수많은 예산과 인력이 투입되며 첨단기술의 향연이 펼쳐진다. 엄청난 수의 부품을 짜인 틀에 최적화시키고 기능을 개선하며 멋진 디자인을 입혀 사용자를 만족시키기 위해선 보통의 프로젝트 기술이 아니다. 그런데도 성공하는 모델과 그렇지 않은 모델들로 흥망성쇠를 보며 기뻐하고 슬퍼할 이해당사자들의 노고를 우린 손에 쥔 자그마한 휴대폰으로 보고 있다.

프로젝트는 운영이 아니다. 굳이 비교한다면 가게를 운영한다고 하지 프로젝트라고 부르지 않지 않는가? 물론 제한된 자원으로 계획을 세우고 일하고 관리하는 일련의 과정은 같지만 이야기한 한시적이고 유일하며 목표한 바가 달성되고 종료되는 것이 바로 프로젝트다. 일을 지속하기 위해 끊임없이 반복하는 것은 운영의 영역이다. 이제 프로젝트가 무엇인지 알았으니 프로젝트 속으로 한 발자국을 내디뎌 다음 단계로 나아갈 차례다.

 

 

※ 용어의 정의!

같은 시각, 같은 장소에서 똑같은 사안으로 의견을 나누고 결정해도 서로 흩어져 각자의 자리로 돌아가 일하다 보면 그때 나뉘었던 이야기들이 모두 달라서 얼굴을 붉히던 적인 한두 번이 아니다. 결국 서로 다르게 이해한 용어에 관해서 확인하지 않은 죗값이었다. 죄를 묻기 싫다면 아는 용어라도 반드시 확인하자. 미팅이 끝날 때 다시 한번 리뷰하는 그 짧은 시간이 아무것도 아닌 것 같지만 돈과 시간을 아껴준다. 사람 사이를 넉넉하게 해준다.

경기도 청년들을 위한 2023년 경기도 청년기본소득. 만24세만! 지금 신청하세요!

경기도 내 청년들을 위한 청년기본소득 지원 사업!

청년들의 삶을 보다 윤택하고 안정적으로 지원해 주고자 추진된 지원 제도로 경기도와 시군이 협력하여 지급하는 소득지원금입니다. 만약 내가 경기도 내에 거주하고 있다! 그렇다면 놓치지 말고 자세하게 한 번 알아봐야겠습니다.

 

청년기본소득이란?

경기도 쳥년들의 행복추구나 삶의 질 향상 등 사회적 기본권(사회국가에서 국민이 인간다운 생활을 확보하기 위하여 일정한 국가적 급부와 배려를 요구할 수 있는 헌법상의 권리. 헌법 제31조부터 제36조까지 내용)을 유지하고 실현하기 위한 경기도형 기본소득제도입니다.

 

■ 신청 기간

    🚩 2023년 3분기: 2023. 9. 1 (금) 09시부터 ~ 10. 02 (월) 오후 6시까지

       ※ 분기별 신청 가능 (신청 기간은 별도 고지, 시군/년도/분기별 일자 상이 가능)
       ※ 일반적인 신청 및 지급일정

기준년일(2023년)/분기 대상자 생년월일 신청기간 지급일
2023.01.01 / 1분기 1998.01.02 ~ 1999.01.01 2023.03.02 ~ 2023.03.31 2023.04.20
2023.04.01 / 2분기 1998.04.02 ~ 1999.04.01 2023.06.02 ~ 2023.06.30 2023.07.20
2023.07.01 / 3분기 1998.07.02 ~ 1999.07.01 2023.09.01 ~ 2023.10.02 2023.10.20
2023.10.01 / 4분기 1998.19.02 ~ 1999.10.01 2023.11.01 ~ 2023.11.30 2023.12.20

 

■ 지원 대상

    🚩 신청일 기준 만 24세 청년 (2023년 3분기의 경우 98~99년생 대상)

      ※ 경기도 내 3년 이상 계속 거주 또는 합산하여 10년 이상 거주한 청년

 

■ 지원 내용

    🚩 분기별 25만원

       ※ 최대 4분기 지원

 

■ 지급 방법

    🚩 지역화폐 (모바일, 카드, 지류)

       ※ ①주민등록초본(2023년 9월 1일 이후 발급, 발생일/신고일 포함, 주민등록본호 뒷자리 포함, 변동사유 포함, 과거주소변동사항 전체(합산 10년이상), 최근5년(3년이상))
       ※ ②기초생활수급자증명서(기초생활수급자의 경우)

       ※ 사용처 (전통시장 및 소상공인 업체)
       ※ 지역화폐 (시흥/김포는 모바일, 그외 카드)
       ※ 사용지역 (초본 상 주소지 시군 내 원칙)
       ※ 사용처 (전통시장 및 소상공인 업체)

    🚩 더 자세히 알아보고 신청하려면 여기로!!

■ 참고 사항

    📌 기존 수령자 중 자동신청이 된 대상은 신청이 자동처리되어 별도 신청이 필요하지 않습니다. (자동신청 ‘미동의’ 시 별도 신청 필요)
    📌 부득이한 사유인 경우, 배우자, 부양의무자, 위임받은 사람이 대리신청할 수 있습니다. (대리인 관계서류 지참)
    📌 지난 분기 미신청분에 한하여 해당년도/분기 대상자는 미신처분에 대한 소급신청이 가능합니다. (별도 문의)
    📌 재원 확보 여부에 따라 지급한도 금액이 축소, 취소 또는 지급 일정이 지연될 수 있습니다. (각 주소지 시군에 사전확인 필요)

 


경기도 외에도 기본소득에 대한 지원이 있습니다만, 여기! 경기도에 거주하는 모든 청년 여러분들께서는 매년 분기별로 잊지 말고 꼭! 신청하시길 바랍니다.

2023년 경기도 청소년 교통비 지원 – 늦기 전에 신청하세요!

2016년부터 시행된 경기도 청소년 교통비 지원 사업!

대중교통을 이용하는 청소년들의 부담을 줄여주고자 추진된 이 지원 제도는 사업 초기 경기도에 거주하는 만 13~18세 청소년을 대상으로 연간 10만원씩 지원하였는데 2020년부터는 지원 대상을 만 13~23세, 연간 12만원으로 상향 조정하여 현재에 이르고 있습니다. 이는 경기도 내의 청소년들에게 교통비 지원으로 학교나 기타 활동 등을 함에 있어 경제적 도움을 주고자 하는 것이 주 목적으로 경기도에 거주 중인 모든 청소년이 그 대상입니다. 그럼 한 번 알아보겠습니다.

2023년 경기도 청소년 교통비 지원

 

경기도 청소년 교통비 지원 사업이란?

경기도 시내버스 및 마을버스 요금이 인상되어 대중교통 이용이 많지만 경제적으로 여유가 없는 청소년들에게 교통비 부담을 완화해 주기 위한 지원제도입니다.

 

■ 신청 기간

    🚩 2023. 9. 1 (금) 10시부터 ~ 10. 15 (일) 오후 6시까지

       ※ 교통비 사용액 인정 기간 : 2023. 01. 01 ~ 2023. 06. 30

 

■ 신청 대상

    🚩 신청일 기준, 경기도에 거주하는 만 13세 ∼ 만 23세 청소년

      ※ 신청대상자 생년월일: 1999. 01. 02 ~ 2010. 06. 30
      ※ 만12, 24세에 탑승한 실적은 지원 불가

 

■ 신청 준비

    🚩 ①교통카드지역화폐인증서(간편, 공동, 금융 등)

       ※ 청소년의 선불/후불(본인 명의) 교통카드 등록
       ※ 지역화폐 (대리인 지역화폐 등록 가능)
       ※ 거주지 인증 완료 후 지원금 신청 가능
       ※ 청소년 본인 인증서 또는 등본상 거주지 동일 대리인 인증서 필요

    🚩 더 자세히 알아보고 신청하려면 여기로!!

경기도 청소년 교통비 지원 포털

■ 참고 사항

    📌 사업연도 상반기 경기도 거주지 인증 및 교통카드/지역화폐 검증이 완료된 회원에 대한 하반기 자동신청 서비스는 2023년 7월부터 지원하지 않습니다.
    📌 반드시 회원 본인이 ‘신청버튼’ 까지 클릭해야 합니다. (메뉴: 마이페이지 > 지원금 신청 > “신청”)
    📌 신청 완료확인 방법 (메뉴: 마이페이지 > 마이홈 > “완료” 도장 4개 확인)
    📌 하반기 신청 시 연 12만원 한도 소급지원은 상하반기 각각 6만원 한도로 기존과 같이 소급 지원되지 않습니다. (상하반기 각각 지원 요망)
    📌 재원 확보 여부에 따라 지급한도 금액이 축소 또는 지급 일정이 지연될 수 있습니다.

 

“경기도 청소년 교통비 지원”처럼 좋은 대국민 지원 정책은 여러 상황에 따라 언제라도 변경이 될 수 있기 때문에 제도가 시행될 때 경기도에 거주하는 모든 청소년 여러분들께서는 잊지 말고 꼭! 신청하여 지원받으시길 바랍니다.

프로그래밍1 (소프트웨어 공학)

프로그래밍 – 구현

설계작업들이 끝나면 시작되는 소프트웨어 프로그래밍은 요구사항에 대한 실질적인 구현행위이다. 특히 분리하여 구현할 수 있는 작은 단위로 나눠 작업을 한다. 프로그래밍의 수행이 상세 설계나 사용자 지침에 기술된 내용과 일치되도록 작업하여야 한다. 이 작업에서 가장 중요한 것은 표준을 정하고 준수하고 이에 따라 정확하게 작성하는 것이다. 소프트웨어의 품질은 결국 이를 얼마나 잘 수행하여 원시 코드에 반영하느냐이다. 따라서 프로그래밍에서는 소프트웨어의 기능구현이 급급한 것이 아니라 요구되는 품질에 얼마나 부합하도록 작업하는가에 대한 관심과 끊임없는 노력이 매우 중요하다. 

※ 코딩과 프로그래밍?
이 용어는 모두 컴퓨터와 상호 작용하고 컴퓨터 시스템을 생성하고 유지 관리하는 데 중요한 기술로 종종 같은 의미로 사용되지만, 프로그래밍 과정 중 코드를 작성하는 구체적인 단계를 가리키며, 프로그래밍은 문제 해결을 위한 전체적인 과정을 의미하기에 사실은 서로 다르다.

  • 코딩(coding): 프로그래밍의 하위 세트 중 하나로 구체적으로 언어의 문법을 따라 컴퓨터가 이해할 수 있는 명령어를 작성(원시 코드)하는 작업으로, 프로그램 로직을 작성하고 알고리즘을 구현하며 문제를 해결하기 위한 코드를 작성하는 활동
  • 프로그래밍(programming): 문제 해결을 위해 컴퓨터에 명령을 전달하는 전체적인 과정으로 문제를 이해, 정의하고 요구사항을 분석하며 그에 따라 적절한 알고리즘과 데이터 구조를 선택한 후 코드를 작성하는 단계와 함께 디버깅, 테스트, 최적화 등의 소프트웨어 개발 과정을 포괄하는 개념으로 컴퓨터 시스템을 생성하고 유지관리하는 프로세스



프로그래밍 원리

앞서 용어 정의와 같이 코딩은 프로그래밍 작업이다. 이러한 구현단계의 목표는 설계 명세에 나타난 대로 사용자 요구를 만족할 수 있도록 프로그래밍을 하는 것이다. 이렇게 하기 위해서는 코딩 단계에서는 전 단계의 문서들을 잘 참조하여야 한다. 특히 무엇보다도 오류가 적은 품질 좋은 프로그램을 작성하는데 그 목표가 있다. 신속성도 중요하지만 견고한 코드를 만들어내는 것에는 많은 연습과 경험이 필요하다. 이를 위하여 수많은 원리와 가이드를 만들고 잘 참고해야 한다.

일반적인 객체지향 코딩에는 다음과 같은 단계가 있다.

  • 원시 코드 스타일의 코딩표준 작성
  • 아키텍처 설계 결과 프레임워크 패키지와 응용 패키지 결정
  • 패키지 내 각 클래스에 대해 요구사항과 상세설계를 반영한 메소드 코딩
  • 클래스 구현 후 인스펙션 실시
  • 클래스 단위 테스트 진행
  • 클래스/패키지를 배포, 통합

이러한 작업을 진행하면서 오류는 프로그래머가 가장 신경 써야 할 부분 중 하나다. 개발과정에서는 특히 많은 시간이 오류를 찾고 해결하는 데 쓰이는데 일정 부분 이상은 흔히 발견되는 오류로 이를 알고 접근한다면 많은 부분의 비용을 절감할 수 있다. 아래는 여러 오류 중 중요한 몇 가지의 예이다.

  • 메모리 누수: 이는 메모리가 풀리지 않고 계속 할당하는 현상으로 보통 가비지 컬렉션이 자동으로 되지 않은 언어에서 이러한 오류가 자주 발생한다. 메모리 누수는 규모가 작은 프로그램에서는 영향이 적지만 대규모 환경에서는 시스템에 매우 치명적인 영향을 줄 수 있으므로 반드시 잡아야 한다.
  • 중복된 해제 선언: 프로그램 내에서는 자원할당 후 사용 후 해제해야 한다. 그런데 해제된 자원을 또다시 해제하는 경우도 매우 심각할 수 있다. 만약 두 개의 해제문장 사이에 메모리 할당 호출이 있다면 이런 오류의 영향은 예측할 수 없다.
  • NULL: null을 포인트하고 있는 곳의 내용에 접근하려고 하면 오류가 난다. 이는 시스템을 다운시키기에 충분하다. 그런데 찾기도 어려운 것이 이것이다.
  • 배열 인덱스 오류: 배열 인덱스의 한도를 벗어나면 예외 오류가 발생한다. 그러므로 인덱스가 음수 또는 한도를 벗어나지 않는지 항시 확인하여야 한다.
  • 수식 예외: 0으로 나눈다거나 변동 소수점 예외 오류 등이다. 
  • 사용자 정의 자료형: 오버플로우나 언더플로우가 특히 많다. 
  • 버퍼 오류: 보안결함에서 많이 발견되는 유형으로 해커들의 잠입 루트가 되기도 한다. 
  • 동기화: 공통된 자원에 접근하는 다수의 스레드가 있는 병렬 프로그램에서 흔하게 발견된다. 이 또한 쉽게 발견되기가 어려운데 시스템에는 막대한 지장을 줄 수 있다. 흔히 deadlock이 여기에 속한다.

구조적 프로그래밍, 이를 위해서 많이 사용하는 제어구조가 있는데 순차, 선택, 반복이다. 이 또한 제대로 된 흐름제어 기준을 정해놔야 한다. 무조건적인 제어의 흐름을 막고 알고리즘을 명확하게 구현할 수 있는 가이드를 제시하고 공유한다. 물론 근래의 프로그래밍 언어들은 이를 고려하여 여러 명령어나 제약을 두고 있으며 필요하다면 비구조적 문형으로 개발을 할 수도 있다.

또한 모든 프로그램에는 항상 도메인에 관한 정보를 다루기 때문에 자료구조가 항시 존재한다. 그래서 특정 정보에 대해서는 정해진 오퍼레이션만 적용된다. 즉 문제 도메인에 있는 아주 작은 정보가 제한된 방법으로만 사용된다는 것이다. 이를 앞서 다뤄본 정보은닉의 원리 적용이다. 정보은닉이란 모듈 사이의 결합을 줄이고 시스템의 유지보수를 쉽게 만드는 장점을 가지고 있고 데이터를 관리하려는 관점과 데이터를 사용하는 관점을 분리할 수 있는 것이다.



코딩 스타일

프로그래밍 스타일이다. 같은 작업을 위하여 여러 사람이 작성한 프로그램들은 문장의 패턴이나 그 구성 등 여러 면에서 다른 스타일을 보인다. 각자의 개성이다. 하지만 이를 방치할 경우 프로젝트는 원하는 목표를 달성하기 어렵다. 그래서 가르치고 학습할 수 있는 공통된 스타일을 만들어야 한다. 물론 여기에서도 기준을 구하기 어려울 수도 있지만 가장 근본은 간결하고 읽기 쉬워야 한다는 것이다. 이를 기준 삼아 코딩 스타일을 만든다.

  • 명명 규칙 예
    • 패키지: 타 사용자들을 위해 패키지 이름 앞에 도메인명을 붙인다. 이를 통해 패키지의 용도와 목적을 잘 나타낼 수 있다.
    • 타입: 클래스(명사)와 인터페이스(명사, 형용사) 등의 명칭 첫 글자를 대문자로 한다. 이는 일반 변수와 구별할 수 있다.
    • 메소드: 타입과 달리 첫 글자를 소문자(동사)로 하고 연속되는 단어의 첫 글자는 대문자로 한다. 이는 메소드 호출과 생성자 호출과 구별할 수 있게 해준다.
    • 변수: 메소드와 같은 형식이다.
    • 상수: 보통 대문자로 구성하며 단어 사이는 밑줄로 연결한다.
  • 포인터와 레퍼런스: 포인터를 매개변수로 사용하지 않고 레퍼런스 타입으로 한다.
  • 자료형: 오브젝트 타임을 돌려보내는 클래스는 특정 타입의 객체를 배출하도록 캐스트 한다.
  • 문장과 수식: 반복 문장이나 수식은 메소드나 클래스로 패키지화하여 사용한다.
  • 오류처리: 오류 데이터 타입 제한, 입력 처리 전 데이터 소스와 인터페이스 하여 사전 확인 등의 방법이 필요하다.
  • 들여쓰기: 코드 블록의 계층 구조를 명확하게 표현할 수 있게 공백 문자나 탭을 사용한다.
  • 주석: 코드 설명을 부가적으로 추가한다. 양의 문제보다는 내용을 정확히 전달하는 것이 중요하다.
  • 코드 문서화: 다른 사람들이 정확하게 사용할 수 있도록 주석을 명확히 하고 문서화도 병행한다.
  • 포맷 도구 사용: 개발 환경 편집기에 있는 기능으로 스타일가이드를 바탕으로 세팅하여 사용할 수 있다. 이를 통해 일관된 스타일 유지가 가능하다.

객체지향 분석설계2 (소프트웨어 공학)



UML

무엇이든지 복잡한 생각이나 아이디어를 간결하고 정확하게 표현하려면 여러 방법이 있지만 이를 통해서 의사소통의 오류를 줄이는 것은 소프트웨어 개발 프로젝트에선 필수사항이다. 정확한 의사소통은 먼저 표현하는 의미를 잘 정의해야 하고 대상을 표현하는 데 적합하고 모든 이해당사자가 이해하기 쉬워야 한다. 그래서 표준이나 규격이 필요한 것이고 이것이 객체지향에서는 UML(Unified Modeling Language)을 사용하는 것이다.

UML은 OMT(Object Modeling Technique)와 Booch, OOSE(Obect Oriented Software Engineering)의 통합으로 만들어진 표현 방법으로 객체지향 분석설계기법으로 매우 유용하고 시스템 개발에선 크게 기능적 모형, 객체 모형 및 동적 모형으로 구성된다. 이 중 중요한 다이어그램이 5가지 있는데 Use Case, Class, Sequence, State, Activity가 그것이다.

  • Use Case Diagram
    : 시스템의 기능적인 측면을 모델링하는 데 사용되고 주로 사용자와 시스템 간의 상호작용을 보여준다. 액터(Actor)는 시스템과 상호작용하는 주체(사용자 또는 외부 시스템)를 나타내며 유스케이스(Use Case)는 시스템이 수행하는 기능을 나타낸다.
  • Class Diagram
    : 시스템의 정적인 구조를 모델링하는 데 사용되며 클래스, 인터페이스, 연관 관계, 상속 관계 등을 시각적으로 표현한다. 클래스 다이어그램은 소프트웨어의 구조를 이해하고 객체 간의 관계를 잘 파악할 수 있다.
  • Sequence Diagram
    : 시스템의 동적인 동작을 시간의 흐름에 따라 나타내며 객체 간의 메시지 교환을 보여주고 객체 간의 상호작용과 시간 순서를 시각화하여 효과적으로 커뮤니케이션 흐름을 이해할 수 있게 한다.
  • State Diagram
    : 객체의 생명주기와 상태 변화를 모델링하는 데 사용되며 주로 객체의 상태가 어떻게 변화하고 이벤트에 응답하는지를 시각적으로 보여준다. 상태 다이어그램은 복잡한 객체의 동작을 이해하는 데 필요하다.
  • Activity Diagram
    : 비즈니스 프로세스나 시스템의 작업 흐름을 시각화하는 데 사용된다. 활동은 작업 단계를 나타내며 화살표로 연결된 동작의 흐름을 보여주고 제어 흐름, 의사 결정, 병렬 처리 등을 표현하여 프로세스를 이해하고 분석하는 데 활용된다.

 

설계/구현 매핑

객체지향 모델링에는 크게 네 가지 관계, 연관, 전체/부분, 상속, 사용 관계가 그것인데 이들의 각각의 관계는 클래스 또는 객체가 관계를 맺고 있는 특별한 유형을 의미한다. 이에 각각 살펴보면 다음과 같다.

  • 연관관계 (Association)
    : 클래스 간의 관계이며 어떤 클래스의 객체가 다른 클래스의 객체와 상호작용하는 것을 나타낸다. 연관은 일반적으로 양방향 또는 단방향으로 설정될 수 있고 연관에는 다중성(multiplicity)과 역할(role)이 포함될 수 있다. 다중성은 연관에 참여하는 객체의 수를 나타내며, 역할은 해당 연관에서 객체가 가지는 역할을 의미한다.
  • 전체/부분관계 (Composition/Aggregation)
    : 한 객체가 다른 객체의 부분이 되는 관계로 Composition은 전체와 부분 사이에 강한 소유관계가 있는 경우를 의미하며 전체 객체가 파괴되면 부분 객체도 함께 파괴된다. Aggregation은 더 느슨한 관계로 전체 객체와 부분 객체는 독립적으로 존재할 수 있다. 전체/부분 관계는 다이어그램 상에서 다이아몬드 형태의 다이어그램 요소로 표현한다.
  • 상속 관계 (Inheritance)
    : 상속은 클래스 간의 계층적인 관계를 나타내며 한 클래스가 다른 클래스로부터 속성과 동작을 물려받는 것을 의미한다. 부모 클래스(상위 클래스 또는 기본 클래스)의 특성과 동작을 자식 클래스(하위 클래스 또는 파생 클래스)가 재사용할 수 있도록 하고 이를 통해 코드 재사용성과 확장성을 증가시킬 수 있다.
  • 사용 관계 (Dependency)
    : 한 클래스가 다른 클래스의 기능을 사용하는 관계로서 이 관계에서는 클래스 간에 직접적인 연결이 없으며 주로 메소드의 매개변수나 반환 값 등을 통해 나타난다. 클래스가 다른 클래스의 인터페이스를 사용하여 기능을 구현하는 경우 사용 관계가 형성된다.



시스템/객체 설계

객체지향 설계는 소프트웨어 시스템을 개발하기 위한 계획과 구조를 만드는 과정으로 시스템 설계와 객체 설계는 객체지향 개발의 두 단계로서 각각 전체적인 아키텍처와 개별 객체의 세부 사항을 다룬다. 이 둘은 서로 밀접하게 연관되어 있으며 시스템 설계 단계에서 결정된 아키텍처와 모듈화는 객체 설계 단계에서 각 객체의 역할과 협력을 결정하는 데 사용된다. 따라서 객체지향 설계는 시스템의 기능, 구조, 동작을 종합적으로 고려하여 효율적이고 확장 가능한 소프트웨어 시스템을 개발하는 데 필요하다.

  • 시스템 설계
    : 소프트웨어 시스템 전체의 아키텍처와 구조를 정의하는 단계로 다양한 컴포넌트 간의 관계, 모듈화, 시스템의 구조적인 레이어 등을 결정한다.

    • 시스템 아키텍처 설계: 전체 시스템 아키텍처, 레이어 구조, 서브 시스템 등을 정의하며 시스템의 큰 틀을 잡아내고 시스템의 기능적 요구사항을 충족시키기 위한 아키텍처를 선택한다.
    • 모듈 설계: 시스템을 여러 개별 모듈로 분리하고 각 모듈의 역할과 책임을 정의한다. 이 모듈 간의 인터페이스와 상호작용 방법을 결정하여 시스템 전체의 유기적인 통합을 보장한다.
    • 데이터베이스 설계: 시스템에서 사용되는 데이터의 구조와 관계를 정의하며 데이터의 저장, 검색, 관리 등을 위한 데이터베이스 구조와 스키마를 설계한다.
  • 객체 설계
    : 객체 설계는 시스템 설계의 결과물을 기반으로 각각의 객체와 클래스의 구조, 속성, 메소드 등을 정의하는 단계로서 시스템 설계에서 정의한 모듈을 실제로 구현 가능한 형태로 변환한다.

    • 클래스 정의: 클래스의 속성과 메소드를 정의하고 클래스의 책임과 역할을 명확히 한다. 클래스의 인터페이스와 구현을 결정하여 다른 클래스와의 협력 관계를 구성한다.
    • 객체 간의 관계: 연관, 전체 부분, 상속, 사용 관계 등을 통해 객체 간의 관계를 설정하며 이를 통해 객체들의 협력과 상호작용을 정의한다.
    • 동적 동작 정의: 시퀀스 다이어그램과 같은 다이어그램을 사용하여 객체 간의 상호작용을 시각화하고 메소드 호출 순서와 결과를 정의한다.

 

디자인 패턴

객체지향 설계작업은 방법론이 있지만 쉬운 작업은 아니다. 이를 위해선 많은 경험과 인사이트가 필요하다. 이에 객체 설계의 경험을 토대로 한 디자인패턴 개념이 등장한다. 디자인패턴은 프로그램 개발에 자주 등장하는 문제를 기술하고 같은 작업을 반복하여 설계하지 않고 여러 번 반복하여 사용할 수 있는 문제에 대한 솔루션을 기술한 것이다. 다만 패턴에서 기술된 솔루션이 특정한 구현을 나타낸 것은 아니며 여러 상황에서 적용될 수 있는 템플릿 성격이라고 보는 것이 맞다. 그래서 문제에 대한 설계를 추상적으로 표현하여 문제를 해결하려는 요소들을 일반화하고 잘 정리한 것이다.

이러한 디자인패턴은 다음과 같은 요소로 구성된다.

  • 패턴 이름/구분: 패턴을 부를 때 사용하는 이름과 패턴 유형
  • 문제/배경: 패턴이 사용되는 분야, 배경 및 해결하려는 문제
  • 솔루션: 패턴을 이루는 요소들, 관계, 협동 과정
  • 사례: 적용 사례
  • 결과: 패턴사용 시 얻게 되는 이점이나 영향
  • 샘플 코드: 패턴이 적용된 원시 코드

패턴을 분류하는 기준은 여러 가지나 보통 23개의 세 가지 유형을 가진 Gamma 분류체계가 일반적인데 아래 간략히 소개한다.

  • 생성 패턴: 객체의 생성 과정을 추상화하고 객체 생성과 조합을 통해 시스템을 유연하고 확장 가능하게 만드는 패턴들이다.
    • Singleton 패턴: 클래스의 인스턴스가 하나만 생성되도록 보장
    • Factory Method 패턴: 객체 생성을 서브 클래스로 분리하여 확장성을 갖춤
    • Abstract Factory 패턴: 관련된 객체들의 팩토리들을 추상화하여 함께 사용
    • Builder 패턴: 복잡한 객체의 생성 과정을 분리하여 객체 생성을 간단하게 구성
    • Prototype 패턴: 객체를 복사하여 새로운 객체를 생성하는 사용
  • 구조 패턴: 클래스나 객체를 조합하여 더 큰 구조를 만들거나, 인터페이스를 결합하여 새로운 기능을 제공하는 패턴들이다. 
    • Adapter 패턴: 서로 호환되지 않는 인터페이스를 함께 동작하도록 변환
    • Bridge 패턴: 추상화와 구현을 분리하여 두 개의 독립적인 클래스 계층 구성
    • Composite 패턴: 개별 객체와 복합 객체를 동일한 방식으로 다루도록 정리
    • Decorator 패턴: 객체에 추가적인 기능을 동적으로 추가
    • Facade 패턴: 복잡한 하위 시스템을 단순화된 인터페이스로 노출
  • 행동 패턴: 객체 간의 상호작용과 책임 분배를 중심으로 다루는 패턴들이다. 
    • Strategy 패턴: 알고리즘을 정의하고 각각을 캡슐화하여 교환 가능 제공
    • Observer 패턴: 한 객체의 상태 변경이 다른 객체에 통지
    • Command 패턴: 요청을 객체의 형태로 캡슐화하여 나중에 실행하거나 취소 가능
    • Chain of Responsibility 패턴: 요청을 처리하는 객체들의 연결을 만들어 책임 위임
    • State 패턴: 객체의 상태에 따라 행동을 변경 가능



객체지향 분석설계1 (소프트웨어 공학)

소프트웨어 개발에서 객체지향 프로그램은 독립 객체들의 묶음이다. 따라 분석과 설계 단계에도 프로그램 모듈 단위인 객체의 정적인 구조와 동적인 변화를 미리 고려해야 한다. 분석 단계에서는 사용자 관점에서 여러 사용 사례를 찾아보고 클래스들의 정적인 관계와 객체들의 인터랙션을 찾아낸다. 설계 단계에선 클래스들의 묶음으로 시스템 구조를 정의하고 클래스 내부를 설계한다. 이러한 분석과 설계과정은 순차적 과정이 아니다. 이는 반복과 점증적 개발 프로세스를 사용하고 있으며 이를 통해 반복적 사이클을 거치면서 점차 확장되고 완성되어 가는 것이다. 

객체지향 분석과 설계과정은 누구나 공통으로 사용하는 프로세스는 없다. 물론 여러 가지 제안 프로세스들이 있으나 모두 상이하다. 이에 모델링은 매우 중요하게 대두된다. 모델은 프로젝트에 참여하는 모든 사람이 목표로 하는 소프트웨어를 잘 이해할 수 있게 하며 이를 사용함으로써 시간과 비용을 절약할 수 있다. 객체지향 분석과 설계에서는 보통 3가지 모델을 사용한다. 이는 기능 모델(Use case Diagram), 객체모델(Class Diagram), 동적모델(State Diagram/Sequence Diagram)이 그것이다.

 





 

Use Case

객체지향을 통해 시스템 개발 시 가장 먼저 할 일은 요구사항을 추출하는 것으로 여기에 Use Case가 사용된다. Use Case는 시스템이 수행할 것으로 기대되는 기능을 말하는데 이는 사용자 또는 외부 시스템이나 기타 요소들이 시스템과 상호작용하는 다이얼로그를 모델링한 것이다. 모든 Use Case는 외부 엔티티들이 시스템과 어떻게 상호작용하는지 가능한 시나리오를 나타내는 것으로 이를 모으면 전체 시스템의 완전한 모습을 보여주는 것이다. 그래서 Use Case는 사용자나 시스템 설계자, 테스터 및 개발자 간 의사소통에 매우 유용하다.

이러한 Use Case는 문제 정의에서 사용사례로 구성된 시스템 명세로 매핑하는 작업이다. Use Case를 작성하고 관계를 찾는 것은 시스템의 요구사항을 명확하게 정의하고 팀 간 의사소통을 원활하게 하며 개발 과정을 체계화하는 것으로 이를 통해 시스템의 기능을 완전하게 이해하고 효과적으로 구현할 수 있다. 이에 대한 작업 과정은 다음과 같다.

  • 액터(Actor) 식별
    • 액터는 시스템과 상호작용하는 외부 역할이나 개체로서 이해관계자, 사용자, 시스템 등이 액터가 될 수 있음
    • 액터를 식별하는 것은 해당 시스템이 상호작용할 주체와 대상을 이해하는 것
  • 시나리오(Scenario) 식별
    • 시나리오는 특정 액터와 시스템 간의 상호작용 과정을 설명하며 시스템의 특정 기능 또는 작업에 대한 흐름 표현
    • 액터마다 여러 시나리오가 있을 수 있음
  • Use Case 작성
    • Use Case는 특정한 기능 또는 작업에 대한 상세한 설명을 담은 문서로 각 Use Case에는 제목, 목적, 참여자(액터), 사전 조건, 후속 조건, 흐름(시나리오), 대안 흐름 등의 정보 포함
    • Use Case를 작성할 때는 해당 기능을 어떻게 사용자가 사용할지를 중심으로 작성
  • Use Case 간 관계 찾기
    • Use Case 간의 관계를 찾는 것은 시스템의 기능적인 흐름을 이해하고 조직화 도움
    • 주요한 두 가지 관계: 일반화 관계(Generalization)와 포함 관계(Inclusion)
      • 일반화 관계: 보다 일반적인 Use Case와 그에 따르는 구체적인 Use Case 간의 상속 관계
      • 포함 관계: 한 Use Case가 다른 Use Case의 일부 기능을 포함하는 관계

 






 

객체 모델링/동적 모델링

Use case를 작성하고 도메인 분석이 어느 정도 마무리되고 나면 객체를 찾고 관계를 정의하는 작업을 시작하게 된다. 이를 객체 모델링이라 부르며, 클래스를 발견하고 난 후 클래스들의 상호작용이나 클래스의 상태 변화 등 시스템 내부의 동작을 구축하는 것을 동적 모델링이라 부르며 UML에서는 Sequence diagram, State diagram, Activity diagram으로 작업한다. 이들은 시스템의 구조와 행동을 모두 고려하여 전체적인 시스템 설계를 돕는 역할을 한다.

  • 객체 모델링 (Object modeling)
    • 객체 모델링은 시스템의 정적인 측면, 즉 시스템 내 객체들의 구조와 관계에 중점
    • 주로 클래스 다이어그램(Class Diagram)과 객체 다이어그램(Object Diagram) 사용
    • 클래스 다이어그램은 시스템 내 클래스(객체의 템플릿)들과 그들 간의 관계를 보여주며 클래스의 속성과 메소드 포함
    • 객체 다이어그램은 특정 시점에서 객체들의 인스턴스와 그들 간의 관계 표현
    • 작업절차
      • 엔티티 클래스 찾기: 시스템의 주요 데이터를 나타내는 클래스로 데이터베이스의 테이블과 유사하며 시스템 내의 중요한 개념이나 사물을 표현
      • 경계 클래스 찾기: 시스템과 외부 환경 간의 상호작용을 처리하는 클래스로 사용자 인터페이스나 외부 시스템과의 통신 담당
      • 제어 클래스 찾기: 시스템의 비즈니스 로직을 처리하고 조정하는 클래스로 엔티티 클래스와 경계 클래스 간의 상호작용 관리
      • 연관관계 찾기: 클래스 간의 상호작용과 관계를 나타내며 엔티티 클래스 사이에 형성되고 방향, 다중성, 역할 등 포함
      • 속성찾기: 클래스나 객체가 가지는 특징이나 데이터를 나타내며 엔티티 클래스의 상태를 설명하는 정보로 사용
  • 동적 모델링 (Dynamic modeling)
    • 동적 모델링은 시스템의 행위나 상호작용을 중심으로 설계
    • 주로 시퀀스 다이어그램(Sequence Diagram)과 상태 다이어그램(State Diagram) 사용
    • 시퀀스 다이어그램은 객체 간의 상호작용 순서를 보여주며 메시지의 흐름을 시각적으로 표현
    • 상태 다이어그램은 객체의 생명주기와 상태 변화를 표현하여 객체의 동적인 행위를 이해하게 지원
    • 작업절차
      • Sequence diagram
        • 객체 간의 상호작용을 시간 순서에 따라 시각적으로 표현
        • 객체 간에 주고받는 메시지와 메시지의 순서를 보여주어 시스템 내부의 상호작용을 이해
        • 시스템의 시간적 흐름을 잘 보여주기 때문에 사용자 스토리나 시나리오를 분석하거나 설계 시 유용
      • State diagram
        • 객체의 생명주기와 상태 변화를 표현
        • 객체가 어떤 상태에서 다른 상태로 전이되는지와 전이가 어떤 조건에서 일어나는지 표현
        • 객체의 행위와 상태 변화를 시각적으로 이해하는 데 도움을 주고 특히 복잡한 객체의 동작을 추적하고 이해하는 데 유용
      • Activity diagram
        • 시스템 내에서 흐름 제어, 동작 및 상호작용을 시각적으로 표현
        • 프로세스나 작업의 흐름을 단계별로 표현하여 시스템의 동작을 더욱 자세히 설명
        • 주로 비즈니스 프로세스, 사용자 시나리오, 시스템 동작 등을 나타내는 데 사용