좀 오래된 책이긴 하지만, 여전히 매우 유용한 스티브 맥코넬의 RAPID Development이란
책에 나오는 RAD 적용 사례입니다.
열심히 하는 코딩만으로는 부족함을 느낄 때 반드시 읽어봐야 하는 내용이죠.

예전에 한번 봤던 책인데 이번에 다시보게되는 기회가 있어서
적용사례 한페이지를 타이핑했습니다. 도움이 되시기 바랍니다.




제품2.0을 만드는 프로젝트의 기술수석 사라의 이야기

첫 회의에서 그녀는 팀원을 소개한 후 바로 본론으로 들어갔다.
"회사 프로젝트 전체의 사후 분석을 검토했습니다. 이제까지 다른 프로젝트에서 저지른 실수 목록이 1킬로미터는 족히 되더군요. 이 목록을 회의실에 붙여놓겠습니다. 우리가 이들 중 어떤 실수라도 저지르는 기미가 보이면 경고해줄것을 부탁합니다. 또한 여러분이 이미 알고 있거나 앞으로 부딪히게 될 가능성이 있는 실수를 추가해 주십시오. 이미 겪은 일을 이유없이 반복할 필요는 없다고 봅니다."

"저는 여러분 각자가 개발 기본에 충실하기 때문에 이 팀 구성원으로 뽑았습니다. 나중에 불필요한 수정따위에 시간을 낭비하지 않을 수 있도록 제대로 요구사항을 분석하고 설계하는 활동이 얼마나 중요한지 여러분은 잘 알 것입니다. 저는 여러분이 그저 열심히 일하기 보다는 현명하게 일했으면 합니다. 무작정 열심히 일하면 그만큼 많은 실수를 저지르게 됩니다. 우리에게는 그럴 시간이 없습니다."

"위험 관리 계획도 세웠습니다. 일정이 너무 꽉 짜여 있기 때문에 미리 막을 수 있는 위험에 발목을 잡힐 수는 없습니다. 이 목록에서 가장 큰 위험은 일정을 맞출 수 없을지도 모른다는 점입니다. 그래서 이번주는 일정을 재평가했으면 합니다. 만약 달성할 수 없다면, 좀더 현실적인 계획을 세우도록 합시다."

팀원 모두가 고개를 끄덕였다. '죽음의 행군'식 프로젝트를 해왔던 사람들은 사라의 이야기에 매우 동감했다.

그 주 후반, 사라는 상사 에디와 회의를 했다. "개발팀과 프로젝트 일정을 진지하게 검토한 결과, 현재 일정으로 현재 요구기능을 완료할 확률이 약 5% 정도라고 결론을 내렸습니다. 아무것도 변하지 않는다는 가정에서입니다. 물론, 항상 뭔가가 변하게 마련이지요."

"그건 안됩니다." 에디가 말했다. "정시 출시 가능성이 적어도 50/50은 되야 합니다. 게다가 출시 후 12개월 동안은 시장의 변화에 대응할 수 있어야 합니다. 어떻게 했으면 좋겠습니까?"

"아직 제품을 완전히 구체화하지 않은 상태라서, 융통성은 약간 있습니다." 사라는 대답했다. "그렇지만 현재 요구기능을 완성하려면, 10개월에서 30개월 정도 걸린다고 봅니다. 너무 범위가 큰 줄은 알지만 우리가 만드는 제품에 대해 더 알기 전에는 이것이 최선의 추측입니다. 제품을 12개월만에 출시해야 하지요? 그 점을 고려한다면 개발자를 더 추가해야 합니다. 그리고 8개월 째에 첫 출시를 한 후 두달마다 출시용 버전을 만드는, 점진적인 출시계획을 세워야 한다고 봅니다."

"괜찮군요" 에디가 말했다. "게다가 이번 프로젝트에서는 기능이 일정보다 더 중요하다고 생각됩니다. 회사와 좀 더 논의한 후에 다시 이야기합시다."

에디는 사라에게 돌아와, 회사가 필요한 기능 완료를 위해 일정을 14개월까지 늘일 용의가 있다고 전했다. 또한 안전을 위해, 점진적인 개발법을 그대로 사용하도록 지시했다. 사라는 안심하며, 그것이 좀더 현실적인 목표라고 생각한다고 대답했다.

첫 몇 주 동안에 팀은 구체적인 사용자 인터페이스 프로토타입을 작성했다. '실수 목록'에서 프로토타입에 들이는 지나친 노력을 경고하였으므로, 프로토타입 치장을 피하기 위해 기간확정 방법을 사용하기로 했다. 팀은 구현할 기능을 결정하기 위해 고객들을 면담하는 데 프로토타입을 이용하고 사용자 피드백에 따라 이를 여러 차례 수정했다.

사라는 계속 위험 목록을 관리했다. 그녀는 프로젝트에서 가장 큰 위험은 '엄청난 수정을 요구하며 일정을 늘이는 낮은 품질', '무리한 일정', '경쟁력을 위해 도중에 추가하는 기능', 이 세 가지로 결정했다. 사라는 점진적인 출시 계획으로 '품질 위험'에 대응한다고 보았다. 팀은 8개월째에 첫 버전을 품질관리부에 넘길 예정이고, 품질관리부는 이에 맞춰 테스트 스크립트를 개발할 것이다.

팀은 기능 우선순위 목록을 만들어 일정 위험을 다루었다. 14개월안에 무조건 많은 기능을 개발하는 방법도 있겠지만, 제품을 두 달마다 출시가능한 상태로 만듦으로써 어느 시점이든 출시할 수 있는 제품을 확보할 것이다. 팀은 또한 몇가지 기능에 대해 구현시간을 줄이는 방식으로 설계를 했다. 시간을 덜 들여 구현할 기능은 별로 매끄럽지는 않겠지만 쓸만한 것이며, 이런 결정으로 일정 위험을 상당히 줄일 수 있었다.

팀은 '경쟁력 향상용 기능 위험'을 두 가지 방법으로 대응했다. 그들은 5개월정도 시간을 들여, 프로토타입한 모든 기능과 3.0에 포함할 기능을 지원할 수 있는 기반구조를 설계하였다. 이 기반구조로 변화를 큰 어려움 없이 수용하기 위함이다. 또한 팀은 12개월 째 시간을 할당하여, 경쟁사의 제품을 분석하고, 프로토타입을 재검토하기로 했다. 그 후 마지막 두달 동안, 경쟁력향상을 위해 필요한 기능을 구현하기로 했다.

6개월 시점에서 설계를 완성함과 동시에, 팀은 8개월째에 품질관리부에 넘길 첫 출시용 버전을 위해 중간목표를 상세하게 명시하는 세밀한 계획을 세웠다. 첫 버전은 별로 많은 기능을 포함하지는 않았다. 그러나 품질이 우수했고, 그 후 개발에 좋은 바탕이 되었다. 8개월째에 다시 10개월 지점을 위해 중간목표를 상세하게 명시하는 세밀한 계획을 세웠다. 12개월 지점을 위해서도 같은 방법을 사용했다.

12개월째 팀은 계획대로 경쟁회사제품을 분석했다. 경쟁사 하나가 10개월 무렵에 좋은 제품을 출시했고, 그 제품에는 우수한 기능이 들어 있었다. 제품2.0이 경쟁력을 가지려면 꼭 추가해야 하는 기능이었다. 팀은 새 기능들을 우선순위 목록에 추가하고 우선순위를 재조정하여 마지막 두달을 위한 상세계획을 세웠다.

그 즈음에 연구원들 중 호세가 좀더 나은 대화창 구성을 생각해내고, 팀회의에서 안건으로 제시했다. 선임 연구원 조지가 대답했다. "아이디어는 좋아. 바꾸는 편이 낫다고 생각하지만, 지금은 안되네. 호세 자네는 하루정도면 고칠수 있겠지만, 문서화 일정에 일주일 혹은 그이상 영향을 미치네. 버전 3.0 목록에 넣으면 어떨까?"

"문서화 일정에 미치는 영향을 미처 생각하지 못했습니다." 조는 말했다. "좋은 지적이군요. '나중에 할일' 목록에 추가하도록 요청하겠습니다.

14개월째 팀은 계획대로 최종 소프트웨어를 출시했다. 제품2.0의 품질은 8개월째부터 테스트를 해왔으므로 우수했다. 문서부는 소프트웨어가 완성되기를 기다리는 대신 상세한 인터페이스 프로토타입을 바탕으로 일할 수 있었기 때문에, 사용자 매뉴얼 역시 최종 소프트웨어와 같은 시기에 끝낼 수 있었다. 개발팀은 우선순위가 낮은 기능까지 구현할 시간은 없었지만 중요한 기능은 모두 구현했다. 제품2.0은 성공적이었다.

'개발도 하냐?' 카테고리의 다른 글

개인 주민등록번호 노출상태 확인  (0) 2010.08.02
QR코드  (0) 2010.07.26
소스코드만으로 부족함이 느껴질때-RAD  (0) 2010.07.14
Social Network, Social Media  (0) 2010.07.14
데이터에서 배우자  (0) 2010.07.14
RAD(Rapid Application Development)  (0) 2010.07.08

관련도서 : http://www.yes24.com/24/goods/380739

 

 

출처 : http://anyflow.net/397
참고 : http://neokido.tistory.com/576

RAD 도구 : http://en.wikipedia.org/wiki/Rapid_application_development#searchInput


1. 신속 S/W 개발(Rapid S/W development)
- 비즈니스 환경의 빠른 변화, 비즈니스는 새로운 기회와 도전에 신속히 응답해야. Time-to-market
- 이 경우, 신속한 개발과 인도는 종종 S/W 시스템에 관한 가장 중요한 요구사항
- 위와 같은 배경 기반의 비즈니스 영역에서는 주요 기능이 정상적으로 동작하기만 하면 빠른 인도의 장점이 낮은 품질이란 단점을 상쇄
- 요구사항
  1) 환경의 변화로 인해 안정적이고 일관적인 시스템 요구사항에 도달하기가 매우 어려움
  2) 따라서 waterfall 모델은 비현실적, 오직 반복적(iterative) 명세와 인도에 기반을 둔 개발 방법론만이 S/W를 신속하게 인도하는 유일한 방법

2. RAD 프로세스의 특성
- 명세, 설계, 구현 프로세스가 동시에 이루어짐. 상세 명세는 없으며 설계 문서는 최소화됨
- 시스템은 일련은 점증적 단계(증분; increment)를 통해 개발됨. 최종 사용자는 개발에 참여하여 각 점증 단계를 평가하며, 이후 점증 단계를 위한 제안을 함
- 시스템 UI는 일반적으로 반복적 개발 시스템을 이용하여 개발됨


점증적 개발 프로세스

3. 점증적 개발(Incremental development)의 장점
- 고객 서비스의 신속한 인도(accelerated delivery of customer services) : 각 점증 단계(증분; increment)는 고객의 가장 높은 우선순위의 기능을 인도
- 시스템에 대한 사용자의 참여 : 사용자는 개발에 참여하여 시스템이 좀더 그들의 요구에 다가서고, 사용자는 시스템에 대해 더 나은 만족을 얻을 수 있음

4. 점증적 개발의 문제점
- 관리 문제(Management problem) : 문서가 없으므로 상황 파악이 어려움
- 계약 문제(Contractual problem) : 명세가 없으므로 명세 이외의 타 형식의 문서를 사용해야
- 검증 문제(Validation problem) : 명세가 없으면, 어떤 기준으로 시스템을 테스트할 것인가
- 유지보수 문제(Maintenance problem) : 계속적인 변경은 S/W 구조에 문제를 일으키고(corrupt), 이로써 S/W는 새로운 요구에 대한 변경과 진화가 어려워짐

5. 프로토타이핑(Prototyping)
- 일부 대규모 시스템에서는 점증적 반복 개발과 인도는 비현실적. 특히 다수의 팀이 각가 다른 위치에서 일할 경우
- 실험적 시스템을 개발하는 프로토타이핑을 통해 요구사항의 타당성(실제 사용할만한지 여부 판단) 체계화(formulate)를 위한 기반을 세울 수 있음. 시스템 명세가 만들어지면(agreed) 프로토타입은 폐기됨(throw away)

6. 점증적 개발과 프로토타이핑
- 점증적 개발의 목적은 최종 사용자에게 실제 동작하는(working) 시스템을 인도함에 있음. 개발은 가장 잘 이해된 요구사항을 바탕으로 시작됨.
- 프로토타이핑의 목적은 시스템 요구사항의 검증 또는 추출임. 프로토타이핑 프로세스는 잘 이해되지 않은 이해사항에서 시작.

 

점증적 개발과 프로토타이핑의 목적

7. 애자일 기법(Agile Methods)
- 기존의 개발 접근법에 대한 불만,즉 계획 수립, 설계, 문서화에 대한 부하(overhead)에 대한 반기로 시작
- 설계와 문서화보다는 S/W 자체(특히 코드)에 초점을 두도록
- 점증적 접근법에 기반
- 빠르게 변화, 진화해가는 요구사항에 대한 신속한 S/W의 배포
- 주로 소/중규모 비즈니스 시스템이나 PC 제품이 알맞음
- XP는 가장 잘 알려진 애자일 기법 중 하나

8. 애자일의 원칙
- 고객 참여(Customer involvement) : 고객은 요구사항 개발 및 운선순위 결정, 시스템의 반복(iteration)을 평가
- 점증적 인도(Incremental delivery) : 고객이 지정한 요구사항이 포함된 점증 단계를 기반으로 s/w가 개발되고 인도됨
- 사람은 프로세스가 아님(People not process) : 기정의된 프로세스를 강요하지 않음. 개발자 및 개발팀 만의 방식, 그들의 기술을 인정
- 변화를 포용(Embrace change) : 요구사항의 변화를 받아들이고 ,변화 수용 가능한 시스템을 설계
- 단순성 유지(Maintain simplicity) : S/W 및 개발 프로세스 모두에서 단순성에 초점을. 수시로 시스템에 남겨진 복잡성을 제거하도록

9. 애자일의 문제점
- 고객은 전적으로, 계속하여 프로세스에 참여하기 어려움
- 개발팀 구성원이 집중적인 참여를 요구하는 애자일의 특성에 맞지 않을 수도
- 다수의 이해관계자(stackholder)가 있을 경우 우선순위 변경이 어려워짐
- 단순성 유지는 추가적 작업을 요구
- 내재화된 점증적 명세화 작업으로 인해, 명사가 포함된 계약서 작성이 난해. 따라서 타 외부 개발 조직과의 co-work이 어려워질 수도

10. Extreme Programming(XP)
- 가장 잘 알려지고, 가장 많이 사용되는 애자일 기법
- 반복적 개발과 같은 좋은 실무 관행과 고객 참여을 극한(extreme)까지 밀고 나감
  1) 새로운 버전이 하루에도 몇 번씩 빌드될 수 있음
  2) 매 2주마다 각 점증적 단계가 고객에게 인도
  3) 매 빌드마다 모든 테스트가 수행되고 테스트에 성공했을 때만 해당 빌드를 인정

 

XP 릴리즈(release) 사이클

11. Extreme programming Practices
- 점증적 계획(Incremental planning) : 시토리 카드를 이용, 작업으로 분할. 이들 작업은 스케줄링과 비용 산정의 근간. 시간을 고려하여 우선순위 결정
- 소규모 릴리즈(Small releases) : 비즈니스 가치를 제공하는 최소한의 유용한 기능을 먼저 개발. 릴리즈를 자주, 점증적으로 수행
- 단순한 설계(Simple design) : 현재의 요구사항을 충족하는 충분한 설계를
- 테스트 주도 개발(Test driven development): 구현 이전에 자동화된 단위 테스트 프레임워크를 통해 테스트 킷을 먼저 작성
- 리팩토링(Refactoring) : 계속적으로, 최대한 많이 코드를 리팩토링. 단순성, 유지보수성 증가
- 짝 프로그래밍(Pair programming) : 짝으로 팀을 이뤄 함께 개발. 서로가 상대의 작업을 검사(checking)하도록. 비공식적 검토(Informal review)가 자연스럽게 이루어짐
- 집단적 소유(Collective ownership) : 짝이 시스템의 모든 영역을 맡음으로 고립된 비 개발 영역이 없도록. 누구든지 변경 코드 변경 가능
- 계속적 통합(Continuous integration) : 작업이 완료되자마자 전체 시스템에 통합되도록. 이후 모든 단위 테스트를 통과해야
- 유지 가능한 속도(Sustainable pace) : 초과 근무는 낮은 품질, 보통의 생산성 만을 양성할 뿐
- 현장의 고객(On-site customer) : 고객은 개발팀의 일원. 전적으로 개발에 시간을 할당하여 시스템 요구사항을 전달할 책임이 고객에게 존재

12. Rapid application development(RAD)
- 데이터에 집중된 비즈니스 응용(application), 즉 DB로부터의 정보를 표현하는 응용에 주로 사용
- RAD 환경 도구 : DB 프로그래밍 언어, Interface 생성기, 오피스 응용 프로그램과의 연결, 리포트 생성기, 대화식 개발에 알맞는 Visual programming 도구

13. Visual development
- 단위가 작은 재사용 가능 S/W 컴포넌트의 통합에 의존하는 RAD 기법
- Visual Basic같은 스크립트 언어를 사용
- 대규모 컴포넌트가 기정의, 기구현되어 있음
- 특정 응용 요구사항에 맞도록 재구성될(tailored) 수도
- COTS(Commercial Off-the-Shelf; 상용 기성품) 기반 개발이라 부르기도. 기성품을 재구성(configure)하고 연결
- 복합 문서(Compound documents)
  1) 사용자 조작(computation)이 가능한 능동 요소(active element)가 내장된 문서. 복합 문서 자체는 각기 다른 응용을 통합하는 역할
  2) 각각의 능동 요소는 특정 응용과 연결되어 해당 요소 선택시 활성화됨
- 문제점
  1) 팀 기반 개발에 알맞지 않음
  2) 명시적 시스템 아키텍처가 없음
  3) 프로그램 부위간 복잡한 의존성이 유지보수 문제를 일으킬 수도

14. S/W 프로토타이핑(Prototyping)
- 개념을 보여주고(demonstrate), 설계 선택사항(option)을 시험해보기 위한 개발할 시스템의 초기 버전
- 용도는,
  1) 요구공학 프로세스 : 요구사항 추출 및 검증을 위해
  2) 설계 프로세스 : 선택사항 시험 및 UI 설계 개발을 위해
  3) 테스트 프로세스 : back-to-back 테스트 수행을 위해
- 장점
  1) 시스템 사용성 향상
  2) 사용자의 실제 필요에 더욱 근접
  3) 설계 품질 향상
  4) 유지보수성 향상
  5) 개발 노력(effort)의 절감
  6) back-to-back 테스트가 가능해짐

 

back-to-back 테스트(동일 결과면 OK, 다르면 결함 존재)

프로토타이핑 프로세스

15. 폐기용 프로토타입(Throw-away prototypes)
- 프로토타입은 개발 후 폐기되어야 : 제조 시스템(production system)을 위한 적절한 기반이 되지 못하기 때문에
  1) (보안성, 신뢰성 등의) 비기능적 요구사항을 만족시키기 위해 프로토타입을 손질할(tune) 수 없음
  2) 일반적으로 프로토타입에 대한 문서는 없음
  3) 프로토타입의 구조는 보통 많은 변경으로 인해 낙후됨(degraded)
  4) 프로토타입은 조직의 품질 기준(표준)에 미치지 못하는 경우가 다반사

'개발도 하냐?' 카테고리의 다른 글

Social Network, Social Media  (0) 2010.07.14
데이터에서 배우자  (0) 2010.07.14
RAD(Rapid Application Development)  (0) 2010.07.08
디자이너에게 배우다.  (1) 2010.07.07
PHP 코딩 규약 - PEAR  (0) 2010.06.25
mod_security AND fckeditor  (0) 2010.06.21
방법론에 대한 견해가 있어서 펌

  1. 출처 : http://erwins.springnote.com/pages/2880322
  2. 처음 책 보고 썼을땐 멋있어 보였는데 나중에 보니까 이게 웬 헛소리.. ㅠㅠ

  3. 개요

    1. 소프트웨어 공학에 무수한 개발 방법론이 있고 다양한 산출물이 있지만 이미 실제 개발자에게는 무시된 지 오래이다. 개발자에게 방법론을 거론해봐야 무시당하기 쉽다.
    2. 비단 한국에 국한된 일뿐만이 아니다.  소프트웨어로 가장 유명한 기업인 MS에서조차 예외는 아니다. 거대한 산출물을 쌓아서 창고에 처박아버리고 다시는 보지 않는 사태는 전 세계 에서 일어나고 있다.
    3. 혹시 당신의 회사가 "비주얼 어쩌구 아키텍트" 라고 불리는 거창한 소프트웨어 방법론 환경을 구상 한다 던지 UML과 XP사이에서 갈팡질팡 하고 있다면 이미 문제에 봉착해 있을 확률이 높다.
    4. 유명한 스타 개발자 조엘은 자신의 책에서 화성인 아키텍트를 이야기 한다. 화성인 아키텍트가 화성에서나 가능한 플랜을 지구로 가져오지 않는 것이 개발자를 돕는 것이다.
    5. 이 바닥에서 4년이면 자신이 알고 있는 지식의 50%를 갱신해야 한다고 한다. 이로 인해 소프트웨어 엔지니어링과 현실간의 갭은 점점 더 멀어져 다른 나라 이야기 인 듯 들린다.
    6. 왜 이런 현상이 일어나는 것일까?
  4. 기초를 알자 : 2가지 개발 방법론의 종류

    1. 개발 방법론

      1. 방법론 자체가 이미 너무나 오래된 생각이다. 개발자들 사이에서 방법론은 조롱거리가 된지 오래이며 심지어 방법론 무용론을 주장하는 사람들도 있다.

      2. 특히나 SI시장의 대부분을 차지하는 웹 개발은 그 특수성 때문에 설계 자체가 필요 없다는 주장도 많다.

      3. 대부분의 개발 방법론은 박사 학위, 또는 논문을 위해 경험 없는 대학원생이나 교수에 의해서 만들어 진다.

      4. 방법론 공학 연구 커뮤니티에서 조사한 결과 방밥론을 그대로 실무에 적용하는 실무자는 거의 없음이 밝혀졌다. (By 소프트웨어 공학의 사실과 오해:인사이트).  그리고 지금도 방법론은 만들어지고  있다.

    2. 개발 방법론을 분류하는 것은 개인의 판단마다 다르다. 공신력을 위해서 가장 권위 있는 ant(By apache재단) committer의 말을 인용한다.

      ant자체가 XP와 밀접한 관계가 있는지라 약간의 편향된 의견일수도 있다.  XP와 RUP는 가장 널리 알려진 방법론으로 그 외의 방법론들은 이것의 변형이라 할 수 있다.

      또한 이 둘은 구체적인 방법과 도구를 제시한다. 따라서 이들 두 가지 방법론을 알아본다.

      1. Rational Unified Process(RUP)

        1. Rational Software Corporation에서 만들었다. Rational Rose의 제작사이다. (현재는 IBM에 합병)
        2. UP가 방법론이며 RUP는 그것을 상품화한 Rational사의 상품이다. 이것으로 1998년도에 난립해있던 컨설팅 회사들를 평정할 수 있었다.
        3. 핵심 키워드는 “설계”이다. 반복적이며 관점적(Perspective)이고 아키텍쳐 중심적인 프로세스 모델로서,
          이 모델에서 소스코드란 프로젝트의 이터레이션(iteration)을 통해 생성되는 산툴물의 하나에 불과하다.
        4. 아이러니 하게도 원 설계자는 그래디 부치는 패턴 도입에도 공한을 한 객체지향 공학의 권위자 이다. 그는 GOF의 디자인 패턴의 서문을 썼으며 애자일 연합체의 설립 멤버이기도 하다.
          (이는 RUP와는 대조적인 성격의 것으로 RUP의 근본적인 문제점을 공격했다.)
        5. 설계 기간을 길게 잡은 후 개발에 들어간다. 모토는 뼈대를 잡은 후 살을 붙이자는 것이다. 개념화->구체화->구축->전이 등의 이터레이션 반복으로 설계가 완료되면 신속한 개발이 가능하나 추후 수정 사항 발생시 대처가 곤란하다. 개발 완료시까지 배치기 지연된다.
        6. 핵심은 UML 등의 문서이다. 쉽 고, 표준화되고 언어에 상관없이 모든 개발 프로세스를 정형화할 수 있는 UML은 각 개발자와 사용자, 고객과의 통신 수단이 되며 중요한 산출물 중의 하나이다. UML을 이용해 개발을 모르는 관리자도 검수가 가능하며 개발자들 간의 의견 소통을 돕고 오해를 미연에 방지한다.
        7. 테일러링을 통해 프로젝트에 적합한 방법론을 구현할 수 있다. XP방법론도 이 입장에서 보면 RUP를 소규모 프로젝트에 적합하게 리테일러링 한 것에 불과하다.
        8. 소스코드는 이러한 UML을 특정 형태(자바, C#등)에 맞추어 서술한 것에 불과하다. UML은 객체 지향을 표현하는 표준 언어이기 때문에 이을 이용해 어느 언어로든지 단기간에 전이가 가능하다. 이상적이지 않은가? 더 이상 말 안듣는 프로그래머는 필요 없다. 코더와 설계자만 있으면 된다!
        9. XP는 산출믈을 만들기 싫어하는 개발자들의 핑계에 불과하다. 작인 Iteration으로 나누어 개발하는 애자일 기법은 나무만 보고 숲을 보지 못하는 우를 범할 가능성이 크다.
      2. eXtream Programing(XP) (1999 XP explained)

        1. XP란 eXtream Programing의 약자로 “가장 단순한 것이 가장 좋은 것이다.“를 모토로 한다.
        2. 창시자인 켄트벡은 짝프로그래밍, TDD(테스트주도개발), 디자인패턴, 리랙토링 등을 대중화 시킨 가장 유명한 프로그래머들 중 하나이다. (이미 열렬한 신봉자들의 교주가 되어버렸다.)
        3. 핵심 키워드는 “코드진화”이다. XP는 최초의 요구사항이 후반에 반드시 바뀔 것을 당연시한다. 이를 위해 변화에 따른 비용 그래프의 증가 곡선을 평평하게 프로그램을 유지한다. 즉 개발 후반부에 기능을 추가하는 것이 초반에 추가하는 것과 크게 다르지 않다.
        4. 전통적인 폭포수 개발형태를 접한 사람이라면 이런 것이 가능할지 의문이 들것이다. XP는 자체문서화, 리팩토링, 자동화 도구(Ant등), 단위테스트(JUnit) 등으로 이것을 가능하게 한다. 이는 모두 IDE와 프로그래밍 기술의 발달로 가능해진 것이다.
        5. 자체 문서화(따로 문서를 만들지 않고 소스 자체를 문서화한다), 프로그래밍 패턴을 통해 빠른 설계가 가능하다. 설계는 필요이상 하지 않는다. 이후 지속적인 리팩토링을 거치기 때문에  개발후반 수정사항이 생기더라도 개발 초반과 동일한 수정 기간만이 필요하다.
        6. 소스코드 차제가 문서이자 산출물이며 개발자의 개발 의도를 표현해준다.
        7. 개발자와 설계자가 달라서 생기는 엄청난 비극을 미연에 방지해준다. 즉 책임의 소재가 명백하다.
        8. 초기에 10인 이하의 프로젝트용으로 평가받았으나 기술의 발달로 RUP를 빠르게 대체해가고 있다.
  5. 문서화 / UML의 문제점

    1. IDE 의 발달로 개발은 점차 자동화 되어가도 있지만 문서는 그렇지 않다. 즉 성과에 비해 시간이 너무 많이 걸린다. 이를 극복하기 위해 리버스 엔지니어링 이라는 편법이 동원된다. 물론 이 짓은 산출물을 위해 보여주기 위한 종이문서를 생산하기 위한 것으로 본래의 취지와는 안드로메다로 떨어지게 된다 무엇을 위한 산출물일까? 가능하다면 더 이상 책상위에 문서가 있어서는 안 된다. Trac, JIRA 등의 걸출한 이슈트래커가가 있음에도 엑셀을 사용하는 것은 왜일까? 답은 당신이 사용할 줄 몰라서 이다.
    2. 개발자가 보기에 문서보다는 IDE의 지원을 받는 소스가 이해하기 편하다.  개발자를 위한 문서란 대부분의 경우 있을 수 없다. 전달 매체가 책이라면 클래스 다이어그램의 압승이다. 하지만 PC를 사용 가능하다면 실제 코드를 이클립스로 보는 게 훨씬 쉽고 정확하다.

      MSDN을 생각하자. MS는 소스를 오픈하지 않았기 때문에 MSDN이라는 거대하고 복잡한 매뉴얼을 만들 수 밖에 없었다. 이렇게 거대한 매뉴얼을 만들었지만 아직도 개발자들의 불만은 끊이지 않고 있다. 소스 10장을 문서화하고 모든 예외상황을 기술하려면 100장도 모자란다.

    3. 실제 정상적인 작업에서는 refactoring작업이 빈번히 일어난다. 밥을 먹다가도 더 좋은 메소드 이름이 생각나면 하루에도 '몇 번씩 수정을 하는 일이 비일비재 하다. 사용자가 보기에 거창한 수정이라도 IDE 또는 프레임워크의 도움으로 간단히 끝나는 경우가 많다. 이들은 IDE가 자동으로 하지만 문서는 손으로 고쳐야 한다. 일이 일을 만든다. 소스 1시간 고치고 이를 위해 4개의 문서를 수정해야 한다면 당신은 하겠는가? 원시시대로 돌아갈 생각인가?
    4. 한번 에 좋은 설계를 하는 것은 불가능하다. UML 모델링으로 설계를 수정 하는 것 보다 refactoring으로 소스를 직접 수정 하는 것이 더 빠르고 쉽고 안전하다. IDE는 오타를 내지 않는다.
    5. 소스로 UML을 만들어 내는 것은 쉽지만 UML로 소스를 만드는 것은 매우 어렵다. (자동화 도구의 부재이다.) UML작성 후 소스코드 작성이라는 이중 작업을 수행해야 한다.
  6. RUP의 문제점

    1. 최근의 대세는 XP이며 특히나 문서에 취약한 반면 툴 사용에 능숙한 개발자는 대부분 XP를 선호한다. (개발자가 아닌 사람은 대부분 RUP를 선호하는듯..) 나역시 XP를 선호하니 RUP의 약점을 공격해 보겠다.
    2. RUP의 중요 원리중 “문서 작업을 최소화 하라”, “유연하라” 등이 있다. 하지만 공룡과도 같은 이 기법은 이를 무색하게 만든다.
    3. 앞의 RUP태생을 말했던가? 이는 다분히 상업적인 전략이며 이 방법론의 주 임무는 다음과 같았다. 첫째 관련된 CASE툴의 판매, 둘째 컨설팅 시장을 장악하는것.
    4. 완벽한 요구사항 도출로 후반 수정사항을 없애겠다는 RUP의 시도는 실패로 끝났다. 이는 한국만의 문제점이 아니다. 갑에게는 완벽했던 요구사항을 한방에 뒤집기란 손바닥 뒤집듯 쉬운 일이다. 무수한 수정으로 문서의 존재 이유가 떨어진다. 문서의 업데이트에 너무 많은 시간이 소요된다. 문서의 정확도 역시 떨어진다. 이로 인해 만들어놓은 문서를 보지 않게 된다.
    5. refactoring의 발달로 설계의 중요성이 예전만큼 중요하지는 않다. 시간이야 좀 걸리겠지만 테스트만 잘 작성되어 있다면 개발 후반에도 얼마든지 수정이 가능하다. 썩은 기둥을 안고 가는 것 보다는 현명한 판단이 될 것이다.
    6. 산출물을 작성해도 그것을 읽을 줄 아는 고객은 전무하다. UML은 생각보다는 쉽지 않다. 간단하게 표현하는 데는 여전히 효율적이지만 조금만 세부적으로 들어간다면 다이어그램이 복잡해지고 알아보기 힘들게 된다.
    7. RUP에 의하면 소스는 단순히 개발 과정의 산출물일 뿐이다.  RUP를 기반으로 한 산출물(보통 UML)만 있다면 어떠한 개발언어로든지 변경이 가능하다. 즉 설계자가 설계만 잘하면 단순 코더들이 이 설계(산출물)를 토대로 소스를 뽑아낸다는 말이다. 여기서 박사급 설계자는 고급 인력이고 실제 개발자들은 단순 코더화 된다. 개발자들이 이러한 프로세스를 좋아할리 없다. ORM을 모르는 DBA와 개발을 많이 접해보지 못한, 2~3년 전의 옛날 책으로 공부한 고급 설계자들은 시대에 뒤떨어진 엉뚱한 설계를 내어놓는다. 팀내의 불화가 생기고 프로젝트는 위기로 향한다. 이 UML을 가지고 소스를 코딩하라고요? 농담이시겠죠?
    8. 설계자와 코더가 동일한 사람이 아니라면 이는 문제 발생의 소지가 커진다. 무책임한 셜계가 나오고 설계가 아무런 쓸모 없어질 가능성이 매우 크다.
    9. ORM 등의 각종 프레임워크와 미들웨어, JUnit, SVN, ANT등의 자동화된 도구를 사용할 줄 모르는 사람도 설계를 한다. 이들은 설계에 지대한 영항을 미치는 것들로 설계자가 이를 모른다면 엄청난 비극을 불러올 것이다. 물론 이 비극은 전세계에서 매일 일어나고 있다.
    10. 웹 중심 개발로 인한 설계의 모순  ?? 잘 모르겠음.

      1. 현재 대부분의 SI는 엔터프라이즈(클라이언트-서버-DB를 all-in-one으로 개발하는것) 개발이다. 그리고 엔터프라이즈의 대부분은 웹개발이다. 웹개발은 서버프로그램 , 클라이언트 프로그램으로 나뉜다. 리치 클라이언트와 Ajax등의 기술이 유행하면서 클라이언트 프로그램의 중요성이 점점 더 커지고 있다.

      2. 하지만 위에서 말한 개발방법론은 모두 객체지향 프로그래밍에 해당하는 것으로 클라이언트 프로그래밍에 사용되는 스크립트 언어에는 해당되지 않는다.

      3. 산출물에서 클라이언트 스크립트 언어에 관한 자료를 찾아 불 수 있는가? 즉 당신이 보는 문서는 반쪽짜리이다.

      4. 텍스트 기반인 스크립트 언어는 특성상 구조적으로 배치가 가능하면서도 설계가 자유롭고 변형이 쉽기 때문에 문서를 남기는 것이 매우 힘들다. 이 다이나믹한 언어들은 심지어 런타임으로 평션(자바로 따지자면 class)의 수정마저 가능하다. 이는 RUP에서는 받아들이기 힘든 체제이다. 소스 그 자체를 문서로 보고 지서속적인 리팩토링을 하는 것만이 대안일 것이다.

  7. 한국에 특화된 문제점

    1. 완벽한 인원과 충분한 기간, 그리고 환상적인 고객과 개발 금액이 조화를 이룰 때 RUP방법론이 성공할 수 있다.

      1. 하지만 하도급이 보편화된 한국에서 그럴 일은 없다. 한국에서 실제 프로젝트 금액의 몇%가 실제 개발비로 사용될까? 한번 생각해 보라.

      2. 흔히 빅3로 불리는 대기업과 발주기업의 유착관계는 실제 투입비용을 절반 이하로 떨어트려서 SI산업의 하향평준화에 큰 공을 세웠다.

    2. RUP가 적용 가능한 대형 프로젝트의 경우 단일 업체에서 체계적인 프로젝트 진행이 가능한 경우는 없다. 대부분 끊임없는 하도로 이어져 을 업체마저 어디까지 하도가 되었는지 관리가 거의 불가능하다.

    3. 명확한 정의가 없다. 화려한 미사어구로 표현했지만 정작 읽어보면 애매모호하거나 다의성을 지닌다. 이는 공학에서 금기시해야 하는 원칙이지만 소프트웨어 공학에서 만큼은 당연하리만큼 통용된다. 공학이지만 코드도, 수학도, 과학도 없다. 단지 말뿐이다.  끔찍하다.

    4. 제안서 기술평가 항목에 방법론은 들어가지만 실제 소프트웨어의 질을 결정하는 사항들은 빠져있다. 방법론에 거창한 것이 들어가 있지 않으면 점수를 받기 힘들다. 한국에서 XP방법론은 요원한 것이다. 이것은 제도의 문제일 것이다.

  8. 결론

    1. 이미 컴포넌트의 재사용, RUP, CBD식의 방법론 같은 것들은 실패한 것으로 대부분 판명되었으다. 시대에 뒤떨어진 이러한 문제를 생각하느라 시간을 허비하지 말자.

    2. 재사용에 관한 훌륭한 대안으로 “디자인 패턴”을 공부하라. 이는 유일하게 실무에서 나온 이론으로 개발자들의 열렬한 환호를 받고 있다.

    3. 당장 아무것도 도움이 안되는, 개 풀뜯어 먹는 소리만 해대는 소프트웨어 공학을 잊어라. 그리고 수십년 간의 프로그래밍 노하우와 연구들, 이론들이 집대성된 ANT, SVN, OSGi, Maven, Trac같은 도구들을 공부하고 사용하라. 앞서 고생한 선배들의 가르침이 담겨 있을 것이다.

+ Recent posts