소프트웨어를 릴리즈하는 것은 긴장감이 넘치는 일이다.

개발을 하고 테스트를 하고 QA를 거쳐도 모든 상황에 대해서 대비하고 만들 수는 없는 것이다. 가능한 버그를 적은 품질 높은 시스템을 만들어야 겠지만, 이게 사람 마음처럼 잘 되지 않는다.

각 단계를 종료할 때마다 소프트웨어를 릴리즈 가능한 상태로 만들어 두는 것이 통합 실패나 품질 저하 리스크를 관리하는 필수적인 방법이다.

릴리즈 체크리스트를 활용하면 여러 문제를 피할 수 있다.
소프트웨어 프로젝트 생존 전략

스티브 맥코넬 / 인사이트


sanity check list라는 것을 QA에서 만들어준다. 지난 번에는 미리 살펴보지 않고, 너무 늦은 단계에서 필요성을 느끼게 되었다. 이번에는 사전에 sanity에 대한 리스트를 체크를 정확히해서 좀더 품질이 좋은 상태로 유지를 하고, 단계를 QA를 통해서 최대한 릴리즈에 가까운 상태를 유지를 해야겠다.

개발이 끝나고, 최종QA단계에서의 부담이 적을 것이고, 좀더 다양한 시나리오로 테스트가 가능해지기때문에 버그를 하나라도 더 줄일수 있을 것이다.




좋은 아키텍쳐는 어떤 문제에도 대응할 수 있어야 한다.

아키텍쳐 설계를 가지고 며칠이나 몇 주를 씨름하고 나면, 아키텍트는 문제를 너무나 잘 다뤄서 다른 사람들이 그 아키텍쳐를 보고는 "명쾌합니다. 이것보다 더 좋은 방안은 없죠"라고 할 만한 아키텍처를 완성해야 한다.

Harlan Mills는 이러한 아키텍쳐 품질을 '심오한 간결성(deep simplicity)'이라고 표현을 했다. 복잡한 아키텍쳐는 더 나은 아키텍쳐가 아니라 훨씬 못한 아키텍쳐인 것이다.

P. 200


소프트웨어 프로젝트 생존 전략

스티브 맥코넬 / 인사이트

deep simplicity는 "심오한 간결성"으로 책에는 해석이 되었다.
minimalism을 좋아하는 나로서는 무척이나 반가운 말이다.

deep이라는 말은 extreme이라는 단어로 대치해도 의미적으로 맞아보인다.
"극단적인 단순함" 아키텍쳐를 만들때 어떠해야 하는지에 대한 이야기를 한 것이다. 너무 많은 내용을 담아서도 안되고, 중요한 부분을 심플하게 표현을 할 때 정말 필요한 아키텍처가 될 것이다.

그리고, 최소주의를 적용해서 아래와 같이 서브시스템 간에는 정말 필요한 의사소통만을 해야겠다. 소통이 많을 수록 유지보수나 운영도 어렵고, 버그의 가능성을 커질 것이다.

좋은 아키텍처는 서브시스템 간에 일어나는 의사소통을 최소화한다.


아키텍쳐의 목표가 복잡함을 감소시키는 데 있다는 것을 인식하고 나면, 아키텍트가 소프트웨어 내에 어떤 것을 포함할지에 집중하는 만큼 어떤 것을 제외시켜야 하는지에도 초점을 맞추어야 한다는 것이 명확해진다.

성공적인 아키텍쳐의 주요한 특징 중의 하나는 변경 가능성이 높은 프로그램부분을 식별하는 것이다.

제대로 아키텍쳐라면 아직 개발되지 않은 부분에 얽매지 않고도 상세설계를 할 수 있을 것이다.


http://blog.naver.com/jeong_jaehun/90022080910
코딩하지 않는 아키텍쳐는 아키텍쳐라고 말을 할수 없을 것입니다. 일단, 설계를 한번해보세요~ 아주 깔끔하게 잘 나옵니다. 자기 만족도가 엄청 높습니다. 그 설계로 코딩을 시작해보세요~ 설계가 수십번은 바뀌게 됩니다. 이게 바로 소프트웨어 개발입니다. 한번 수준 높은 설계를 할수 있을지는 몰라도 완벽한 설계를 할수가 없습니다. 설계단에서 코딩도 병행해서 해야 더 나은 설계가 가능합니다.





프로젝트를 시작 전이나 중간, 끝나고 난후 인력이동을 유심히 볼 필요가 있다.

특히, 프로젝트가 끝난 후 다른 팀으로 이동은 별로 좋은 기대결과가 아니다. 그것이 자의에 의한 것이라면, 더더욱 그러하다.

팀원이 너무 개성이 있어서 적응을 못해서 떠날 수도 있겠지만, 팀에 이동이 많을 수록 좋지 않은 팀이다. 자신이 원하는 일을 하고, 만족스러운 과정과 결과를 얻었다면, 누가 팀을 떠나겠는가?

관리자들은 자신의 팀의 인력변화를 유심히 살펴봐야 한다.  

P. 146 인력관리 전략


People-ware management accountability.
인간을 중심으로 관리하고 책임지라.
- 스티브 맥코넬

이것은 팀원들이 프로젝트가 끝난 후 실력이 좋아졌든 나빠졌든 관리자들이 책임져야 한다는 것이다. 팀원이 팀(or회사)을 떠나거나, 회사에 손실을 끼치는 관리자이다. 이와 반대로 팀원들의 기술이 향상되고, 사기가 진작된 경우는 조직의 발전에 기여한 것이므로, 관리자도 당연히 그 만큼 인정을 받아야 한다.


인재개발

  • 프로젝트를 수행한 팀원을 얼마나 잘 존속키지는가를 토대로 관리자를 평가했다.
  • 프로젝트 기간동안 관련자에게 모두 전문가로 클 수 있는 기회를 제공했다.
  • 팀원 모두가 프로젝트 비젼을 신뢰하였으며, 프로젝트가 끝난 후 회사(or팀)를 더 괜찮다고 느끼게 되었다.

소프트웨어 프로젝트 생존 전략

스티브 맥코넬 / 인사이트

회사를 떠나는 사람은 회사에 불만이 많은 사람이다. 이것은 연봉, 복리후생, 프로세스 구조에 대한 반항일 것이다. 하지만, 팀을 떠나서 다른 팀으로 가는 것은 회사에 대한 불만이라기보다는 관리자에 대한 불만이라고 할수 있다.

하지만, 왜 떠나는가를 물어보면, 대부분 정확한 이야기를 피하고, 다른 이야기를 할 것이 분명하다. 그래서, 객관적으로 팀원들이 들어오고, 나가는 것을 주의깊게 살펴볼 필요가 있다. 인력의 이동이 잦은 팀은 나 조차도 오래머물기 싫을 것이다. 이미 대부분의 팀원들이 다른 곳을 쳐다보기 때문이다.



minimalism은 TDD의 철학과도 직결이 된다. 

일단  버그가 생기지 않을 정도로 아주 단순하게 구현을 한 다음 복잡한 기능들과 로직을 추가를 하면서, 계속 테스트를 하는 것이다.

단순한 구현은 버그도 없을 뿐더러 빠르게 테스트를  통과한다.

테스트 통과를 보면서 코드를 붙여나가는 것은 그만큼 안전한 방법이다.

기능 명세서, 설계 구현 등에 대하여 단순성을 강조해야 한다. 개발자들은 대부분 복잡한 것을 좋아한다. 그들은 문제를 간소화하기보다는 더 복잡하게 만드는 경향이 있다. 하지만, 프로젝트 성공의 열쇠는 프로젝트를 한층 단순화하는데 있다. 프로젝트의 목표를 달성하기 위한 지름길은 복잡성을 제거하는 것이다. P.84

더는 덧붙일 것이 없을 때 끝내는 것이 아니라, 더는 뺄것이 없을 때 끝낸다.
- 프랑스 작가 볼테르(Voltaire)

개발자들은 대부분 개발을 해서 돈을 버는 사람은 아니다.

MS는 제품을 출시를 했을때 ship-it이라는 상금을 받는다. MS가 소프트웨어를 개발해서 수익을 내는 것이 아니라 소프트웨어를 출시함으로써 돈을 번다는 사실을 개발자들에게 강조하는 것이다.

릴리즈는 하는 것이 중요하다는 이야기이다.

소프트웨어 프로젝트 생존 전략

스티브 맥코넬 / 인사이트

사람의 인생은 도전의 연속이다.

개발자들은 프로젝트를 하나씩 진행해 나갈때마다 새로운 도전이 시작된다.

아마 새로운 도전을 좋아해서 개발을 할지도 모르겠다.

도전을 할만한 일이라고 판단이 되면 열심히 할테고, 넘기 어려운 벽이라면, 좌절 속에서 의욕을 잃고 포기를 해버린다.


어떤 사람들은 불가능한 목표를 좋아한다. 그러나 개발자는 현실주의자다. 그렇기때문에 대부분은 불가능한 목표를 접하면 의욕을 잃고 만다. p.79


 

소프트웨어 프로젝트 생존 전략

스티브 맥코넬 / 인사이트


minimalism

2007/02/11 16:23
단순화(minimalism)는 중요하다.

복잡한 것을 단순하게 만든후 문제를 해결 하는 것은 매우 중요한 키포인트이다.

기능 명세서, 설계, 구현 등에 대하여 단순성을 강조해야 한다.
프로젝트의 목표를 달성하기 위한 지름길은 복잡성을 제거하는 것이다.

프랑스 작가 볼테르는 수필을 쓸 때 "더는 덧붙일 것이 없을 때 끝내는 것이 아니라, 더는 뺄 것이 없을 때 끝낸다."고 하였다. 소프트웨어 프로젝트도 마찬가지다. 기능을 자꾸 추가하여 복잡해지게 할 것이 아니라 불필요한 것들을 제거해서 간단해지도록 해야 한다.


- SPSG, p84-85

NASA SEL의 소프트웨어 성공을 위해 할일

  • 소프트 웨어 개발 계획을 만들고 따른다.
  • 프로젝트 인력에게 권한을 부여한다.
    인력의 잠재성을 충분히 활용한다
  • 권위주의를 최소화한다.
    프로세스의 부담을 최소화한다.
  • 요구사항의 베이스라인을 정의하고, 변경사항을 관리한다.
    요구사항이나 정의되지 않은 요구사항은 상세하게 목록으로 만들고 비용과 일정에 미치는 영향에 따라 우선순위를 매긴다.
  • 프로젝트의 건강 상태와 진행상황을 주기적으로 점검하고 필요하다면 재계획한다.
  • 시스템 규모, 공수, 일정을 주기적으로 다시 추정한다.
    주요 마일드 스톤이 끝날 때마다 추정을 정제하라
  • 단계 전이를 정의하고 관리한다.
    다음 단계에 대한 준비작업을 시작해야 한다.
  • 팀정신을 키운다.
    개인의 책임을 명확하게 정의하면서 전체 프로젝트에 대한 책임도 있음을 강조해야 한다.

NASA SEL의 성공을 위해서 하지 말아야 할 일

  • 팀구성원이 체계적이지 않은 방법으로 일하게 놔두지 말라
  • 터무니 없는 목표를 설정하지 말라
  • 미치게 될 영향을 평가해보지 않거나 변경위원회의 승인 없이 수정을 가하지 말라
  • 겉치례 작업을 하지 말라
    필요한 것만 구현을 한다
  • 특히 프로젝트 초기에 인원을 과다하게 배정하지 말라
  • 현 단계에서 지연된 일정을 나중에 복구할 수 있다고 가정하지 말라
    특정 단계에서 시간을 회복할 만큼 충분치 않다.
  • 비용절감이나 일정 단축을 위해 기준을 느슨하게 하지 말라
  • 많은 양의 문서가 성공을 보장한다고 믿지 말라


소프트웨어 프로젝트 생존 전략

스티브 맥코넬 / 인사이트



SPSG에 요약글들

2007/02/10 15:16

프로젝트 초기에 프로세스에 투자하면 후반에 많은 혜택을 가져온다

훌륭한 프로젝트 팀은 요구사항과 아키텍처를 주의 깊게 검토하여 상류쪽 문제를 정정할 수 있는 기회를 스스로 만들어낸다.

프로젝트 초반에는 '비용 및 일정 목표가 확실'하던가 아니면 '요구사항이 확실'하던가 둘 중의 하나다. 이 두 가지 모두 확실한 경우는 없다.

어떤 사람들은 불가능한 목표를 좋아한다. 그러나 개발자들이란 현실주의자자. 그렇기때문에 대부분은 불가능한 목표를 접하면 의욕을 잃고 만다.

관리자 업무 대부부은 한 가지 일에 오랜 시간을 집중해서는 곤란하다. 그러나 개발자 업무는 한 가지 일에 몇 시간씩 집중이 필요하다.

사용자를 프로젝트에 끝까지 참여시키는 것이 소프트웨어 프로젝트의 핵심 생존 기술이다.

소프트웨어가 실행되는 것보다 더 확실한 현황 보고서는 없다.


단계별 납품방식이 만병통치약은 아니다. 하지만 모든 것을 고려해 볼 때 추가 비용은 프로젝트 상태와 품질에 대한 가시성을 높이고 추정치의 정확도를 향상시키며,
리스크를 감소시키는 대가에 비하면 결코 비싸지 않다.
프로젝트가 잘 굴러가지 않는 이유는 많은 업무들 간 조율도 빈약하고 비효율적으로 수행하기 때문에, 많은 노력을 들이고도 결국 별 볼일 없는 결과를 내놓기 때문이다.
변경통제를 하면 모든 필수적인 변경이 가능하며 프로젝트 전반에 걸쳐 이런한 변경이 미치는 영향을 이해하게 된다.
성공적인 프로젝트에서는 팀원들이 자신의 과업에 대한 책임감도 크지만, 그들에게 영향을 주는 과업에 대한 책임 소재도 확실히 한다.
나름대로 독특한 방식으로 일을 하는 경우라도 체계적으로 변경을 통제할 수 있다. 그러나 이때에도 투명한 의사결정과 책임을 강조하는 절차에 따라 시행해야 한다.
비젼을 수립하는데 가장 중요한 것은 지나친 것은 부족함만 못하다는 메시지를 전달하는 것이다. 비전은 간단명료한 것이 좋다.
프로젝트에서 성공하려면 모든 계획 자료를 언제든지 검토할 수 있도록 공개해야 한다. 생산성 예측치, 일정, 일정 조정, 리스크, 업무분장, 기타 계획 등을 모두 공개해야 한다.
소프트웨어에서는 비밀이 없어야 한다. 좋은 일이건 나쁜 일이건 어떤한 것이라도 프로젝트 관계자 모두에게 알리는 것이 좋다.
우수한 조직은 적은 비용으로 큰 리스크를 줄이는 방안을 적극적으로 모색한다.
생산성이 뛰어난 프로그래머가 나타날 때까지 기다리는 것이 능력과 생산성이 떨어지는 프로그래머가 생산성을 갖출 때까지 기다리는 것보다 좋은 방법이다.
요구사하을 수집하는 데 가장 어려운 일은 사용자가 원하는 것을 '기록'하는 활동이 아니다. 그들 자신이 원하는 것이 무엇인지 알 수 있게 도와주는 하나의 탐험적이며 '개발' 차원의
활동이 필요하다.
사용자에게 '프로토타입은 그저 프로토타입일 뿐'이라는 것을 반드시 이해시켜야 한다.
사용자 인터페이스 프로토타입을 만들 때 직면할 수 있는 위험 요소중의 하나는 사용자들의 향후 프로젝트에 대한 기대치가 믿을 수 없을 정도로 높아질 수 있다는 것이다.
사용자 프로토타입을 실제 소프트웨어를 위한 기초로 사용해서는 안된다. 영화 세트장 무대를 진짜 집의 기초로 사용해서는 안 되는 것과 같은 이치이다.
신속하지만 얼룩이 남는 문제는 누군가 말했듯이 신속에서 오는 장점이 잊혀진 후에도 얼룩은 오랫동안 남는다는 것이다.
베타테스트를 효율적으로 수행하려면 많은 조정과 인력이 필요하다. 이런 자원을 조직 내부로 집중하면 더 효울적인 품질 관리를 수행할 수 있다.
아키텍처의 목표가 복잡함을 감소시키는 데 있다는 것을 인식하고 나면, 아키텍트가 소프트웨어 내에 어떤 것을 포함할지에 집중하는 만큼 어던 것을 제외시켜야 하는지에도
초점을 맞추어야 한다는 것이 명확해진다.
소프트웨어 프로젝트에 관해 나쁜 소식을 들어야 한다면, 프로젝트 비용에 미치는 상류/하류 효과때문에모드라도 되도록 조기에 듣는 것이 좋다.
최고는 우수의 적이다.
모든 프로젝트 이해 관계자들이 추정 절차에 동의하면, 불합리하게 결정된 예산이나 일정 등에 논쟁을 벌이지 않고 프로젝트에 투입될 자원이나 포함될 기능에 대해 합리적인 협상을 벌일 수 있다.
일정이 지연되는 위험을 최소화하려면 초과 근무에 의존하는 계획을 세우지 말고 프로젝트 초기에 더 많은 자원을 투입해야 한다.
모든 훌륭한 소프트웨어 프로젝트 계획 방식과 마찬가지로, 이 책의 방식도 프로젝트 전반에 걸쳐 실수가 발생할 수 있다는 사실에 바탕을 둔 것이다. 프로젝트의 성공 여부는 프로젝트 팀이 이런 실수를 빠르고 쉽게 찾아내어 수정하는지에 달려 있다.
품질 보증 작업을 프로젝트에 말기로 연기하면 개발자의 디버깅은 불량한 컴포넌트 서너 개의 상호작용을 점검하는 수준이 아니다.
그것은 불량한 컴포넌트 수백 혹은 수천개의 상호작용을 디버깅하는 것이다.
설계 형식성을 너무 많이 갖추는 것이 너무 적게 갖추는 것보다 돈을 버는 영리한 방법이다.
테크니컬 리뷰를 통해 비용을 높이면서도 신뢰성을 떨어뜨리는 기능을 찾아내어 제거할 수 있으므로 이득이 몇 배나 높아진다.
소프트웨어 구축 작업은 아주 세말한 수준에서 이루어져야 하며, 이런 수많은 결정들을 갱신하는 것은 전체 시스템을 다시 구현하는 것과 같다. 실제로 한번 잘못된 결정을 내리면 기회는 두 번 다시 오지 않는다.
소프트웨어 변경에 대한 압력이 높아질수록 이 변경 내용을 신중히 검토해야 하며 그렇지 않으면 프로젝트가 통제를 벗어나 버린다.
전형적인 프로젝트에선는 약 80퍼센트의 시간을 예기치 못한 재작업에 쓴다. 전략적이고 계획된 재작업을 수행해야 소프트웨어 품질을 획기적으로 높이고 프로젝트 전체의 생산성을 향상시킬 수 있다.
전체 프로젝트 팀은 각 단계를 종료할 때마다 소프트웨어를 릴리즈 가능한 상태로 만들어야 하며, 이것을 최우선으로 처리해야 한다.
프로젝트 초기에 프로젝트의 규모를 과소평가하거나 프로젝트 팀의 생산성을 과대평가하는 것은 잘못이 아니다. 문제는 프로젝트 후반기에도 이런 실수를 찾아내지도 수정하지도
못하는 것이다.
프로젝트 300개를 대상으로 수행되었던 1991년 연구 보고서에 의하면 초과된 시간을 만회한 프로젝트는 거의 없었다. 오히려 시간이 더 늘어나는 경향을 보였다.
프로젝트 관계자가 프로젝트를 시작할 때부터 재추정 계획을 이해하지 못한다면, 개발 팀의 재추정 작업을 실수로 간주할 것이다.
소프트웨어 프로젝트 관리의 가장 일반적인 문제점은 그렇게 해야만 하는 실제 이유도 없으면서 프로젝트 계획을 단념하는 것이다.


프로젝트 이력에 대한 결론을 사용하기 쉬운 형태로 변환하면, 소프트웨어 프로젝트 이력을 만들기 위해 개발팀이 쏟아넣은 시간과 노력의 가치가 극대화되고, 향후 프로젝트가 성공할 수 있는 든든한 초석이 된다.
팀에 해를 끼친 사람은 누구라도 성공한 것이 아니며, 팀을 도운 사람은 그 누구라도 실패한 것이 아니다.


소프트웨어 프로젝트 생존 전략

스티브 맥코넬 / 인사이트
개발자들이 코드를 생성을 하고, integration하는 절차에 대해서 소개를 한다.

권장 통합 절차

1. 코드를 개발한다.

2. 이를 단위 테스트 한다.

3. 개발자는 디버거로 모든 예외(Exception)이나 오류를 포함하여 각 코드 라인을 꼼꼼히 살핀다.

4. 이 원시 코드를 개인적으로 복사해둔 메일 빌드에 통합시킨다.

5. 이 코드를 테크니컬 리뷰 한다.

6. 개발자는 테스트 사례 준비를 위해 비공식적으로 코드를 테스트하도록 넘겨 준다.

7. 코드 리뷰가 끝나기를 기다린다.

8. 리뷰 도중 확인된 문제를 수정한다.

9. 수정 내용을 리뷰한다.

10. 최종 코드를 메인 빌드에 통합한다.

11. 해당 코드에 대해 '완료'를 선언하고, 프로젝트 활동 목록에 체크해 놓는다.


SPSG에 나온 글이다.

코드리뷰도 중요하지만, 리뷰 도중에 확인 된 문제를 수정하고, 수정된 내용을 다시 리뷰할수 있는 시간을 확보하는 것이 중요하다.

소프트웨어 프로젝트 생존 전략

스티브 맥코넬 / 인사이트

BLOG main image
OOP and Java by ologist

공지사항

카테고리

All (649)
private!! (106)
WEB & IT (140)
Developer (400)