본문 바로가기

개발방법론 고전

소프트웨어 공학의 사실과 오해

제목 : 소프트웨어 공학의 사실과 오해
부제 : 우리가 미처 알지 못한
원제 : Facts and Fallacies of Software Engineering
지은이 : 로버트 글래스
옮긴이 : 윤성준, 조홍진
펴낸곳 : 인사이트
ISBN : 8991268021
펴낸날 : 2004년 10월 9일 
설명
사실 1. 사람 소프트웨어 작업에서 가장 중요한 요소는 프로그래머가 사용하는 도구나 기술이 아니라, 프로그래머의 자질이다
사실 2. 사람 개인차에 대한 연구에 따르면, 최상의 프로그래머는 최악의 프로그래머보다 28배 더 뛰어나다. 여기에 비례해서 이들에게 임금을 28배 주는 것이 아니라면, 이들은 소프트웨어 분야에서 가장 값싸고 훌륭한 자원이다.
사실 3. 사람 지체된 프로젝트에 사람을 추가 투입하면 프로젝트가 더 늦어진다.
사실 4. 사람 작업 환경은 생산성과 품질에 지대한 영향을 미친다.
사실 5. 도구와 기술 소프트웨어 업계에는 과대선전이 만연해 있다. 소프트웨어 도구와 기술의 진보로 인해 생산성과 품질이 5~35% 향상된다고 한다. 그러나 예전에도 이 정도의 향상은 10배 이상 뛰어난 사람이 있으면 가능한 일이었다.
사실 6. 도구와 기술 새로운 도구나 기술을 배우는 것은 초기에는 프로그래머의 생산성과 제품의 품질을 저하시킨다. 궁극적인 이득은 학습곡선을 극복한 이후에야 얻을 수 있다. 따라서 새로운 도구와 기술을 채택하는 것은 (1)그 가치가 현실적으로 보일 때와, (2)이득을 얻을 때까지 기다릴 수 있는 인내가 있을 때만 가치가 있다
사실 7. 도구와 기술 소프트웨어 개발자들은 도구에 대해 많은 말을 하지만, 그 중 일부만을 평가해보고, 구입하는 것은 얼마되지 않으며, 실제로 사용하는 것은 거의 없다
사실 8. 추정 프로젝트가 폭주하는 가장 흔한 원인 두 가지 중 하나는 형편없는 추정이다.
사실 9. 추정 대부분의 소프트웨어 추정은 생명주기의 초기에 수행된다. 요구사항을 정의하기 전에, 즉 문제를 이해하기 전에 추정을 한다는 사실을 깨닫기 전까지는 아무 문제가 없어 보인다. 따라서 추정은 보통 부적절한 시기에 수행된다.
사실 10. 추정 대부분의 소프트웨어 추정은 소프트웨어를 구축할 사람 또는 그들의 관리자에 으해 수행되는 것이 아니라 경영진이나 마케팅에 의해 결정된다. 따라서 추정은 부적절한 사람들에 의해 수행된다.
사실 11. 추정 소프트웨어 추정은 프로젝트가 진행되면서 거의 조정되지 않는다. 따라서 부적절한 시점에 부적절한 사람들이 산정한 잘못된 추정은 대개 교정되지 않는다.
사실 12. 추정 추정은 매우 부적절하기 때문에 소프트웨어 프로젝트가 추정 목표를 충족시키지 못했다고 해서 문제될 이유는 거의 없다. 그러나 모든 사람들이 어떻게든 영향을 받는다.
사실 13. 추정 경영진과 프로그래머 사이에는 단절이 있다. 한 연구 조사에 따르면, 추정에 맞추지 못해 경영진은 실패라고 생각하는 프로젝트에 대해, 거기 참여했던 기술자들은 그들이 작업한 것 중 가장 성공적인 프로젝트라 평가했다고 한다.
사실 14. 추정 타당성 조사에 대한 대답은 항상 '타당하다'이다.
사실 15. 재사용 소규모 재사용(서브루틴 라이브러리)은 거의 50년 전부터 시작되어 잘 해결된 문제다.
사실 16. 재사용 모든 사람들이 대규모 재사용(컴포넌트)을 중요하고 바람직한 것이라 생각하지만, 거의 대부분의 문제가 해결되지 않은 채 남아 있다.
사실 17. 재사용 대규모 재사용은 서로 관련되어 있는 시스템 사이에서 가장 잘 적용되고 따라서 도메인 종속적이다. 이는 대규모 재사용의 잠재적 적용성을 축소시킨다.
사실 18. 재사용 재사용에 대한 두 가지 '3의 법칙'이 있다. (1) 재사용 가능 컴포넌트를 만드는 것은 단일 목적의 컴포넌트를 만드는 것보다 세배는 어렵다. (2)컴포넌트는 재사용 라이브러리로 인정할 만큼 일반적이라 생각하기 전에 서로 다른 세 가지 애플리케이션에 적용해봐야 한다.
사실 19. 재사용 재사용된 코드를 수정할 경우에는 특히 오류를 범하기 쉽다. 만약 컴포넌트의 20-25% 이상을 수정하고자 한다면 차라리 처음부터 다시 작성하늑 서이 더 효율적/효과적이다.
사실 20. 재사용 디자인 패턴 재사용은 코드 재사용의 본질적인 문제에 대한 해결책 중 하나다.
사실 21. 복잡성 문제의 복잡성(complexity)이 25% 증가하면 소프트웨어 솔루션의 복잡성은 100% 증가한다. (복잡성을 줄이는 것이 바람직한 일이긴 하지만) 소프트웨어 솔루션의 본질이 원래 그렇기 때문에, 바꾸려 한다고 바꿀 수 있는 것이 아니다.
사실 22. 복잡성 소프트웨어 작업의 80%가 지적인 작업이다. 그 중 상당부분이 창조적인 작업이다. 사무적인 일은 거의 없다.
사실 23. 요구사항 폭주하는 프로젝트에서 가장 흔한 원인 두 가지 중 하나는 불안정한 요구사항이다.
사실 24. 요구사항 쇼프트웨어 출시 후 발견된 요구사항 오류는 그 수정 비용이 매우 높지만, 초기에 발겨된다면 그 비용이 매우 낮아진다.
사실 25. 요구사항 누락된 요구사항은 가장 수정하기 힘든 오류이다.
사실 26. 설계 요구사항을 설계로 옮겨갈 때 솔루션 프로세스의 복잡성 때문에 '파생 요구사항'(특정 설계 솔루션에 대한 요구사항)이 급증한다. 이런 설계상의 요구사항은 종종 원래의 요구사항보다 50배 넘게 늘기도한다.
사실 27. 설계 소프트웨어 문제에 있어서 최적의 솔루션이 하나 존재하는 경우는 거의 없다.
사실 28. 설계 설계는 복잡하고 반복적인 프로세스다. 초기 설계 솔루션은 잘못됐을 가능성이 크고, 최적의 상태도 아니다.
사실 29. 코딩 설계자가 숙지한 기본단위(primitive) 수준으로 문제가 분해됐을 때 설계에서 코딩으로 전환된다. 설계자와 코더(coder)가 동일한 사람이 아니라면, 설계자와 코더의 기본단위가 같지 않을 수 있고, 이는 문제를 초래할 수 있다.
사실 30. 코딩 COBOL은 별로 훌륭한 언어가 아니지만, (비즈니스 데이터 처리에 대해서는) 다른 언어도 마찬가지다.
사실 31. 오류제거 오류 제거는 생명주기 중 가장 시간이 많이 소모되는 단계이다
사실 32. 테스트 프로그래머가 완전히 테스트했다고 믿는 소프트웨어도 보통은 로직 경로의 55-60%만 테스트된 경우가 많다. 커버리지 분석기와 같은 자동화 도구를 사용하면 이 비율을 대략 85~90%까지 높일 수 있다. 소프트웨어의 로직 경로를 100% 테스트하는 것은 거의 불가능하다.
사실 33. 테스트 100%의 테스트 커버리지가 가능하다 하더라도, 이는 충분한 테스트 기준이 아니다. 대략 소프트웨어 결함의 35%는 누락된 로직 경로에서, 40%는 로직 경로의 특정 조합을 실행할 때 나타난다. 이런 것들은 100% 커버리지로도 잡히지 않을 것이다.
사실 34. 테스트 도구를 사용하지 않고 오류 제거 작업을 제대로 하는 것은 거의 불가능하다. 디버거는 널리 사용되지만, 커버리지 분석기 같은 다른 도구는 많이 사용되지 않는다.
사실 35. 테스트 특정 테스트 프로세스는 자동화할 수 있고, 또 자동화해야 한다. 그러나 자동화할 수 없는 테스트 작업도 많다.
사실 36. 테스트 프로그래머가 작성한 디버그 코드는 컴파일러 파라미터에 의해 선택적으로 목적 코드에 포함될 수 있는데, 이는 테스트 도구에 대한 중요 보완 수단이다.
사실 37. 검토와 검사 엄격한 검사는 첫 번째 테스트 케이스를 실행시키기도 전에 소프트웨어 제품에 포함된 오류의 90%까지 제거할 수 있다.
사실 38. 검토와 검사 엄격한 검사(inspection)가 좋기는 하지만, 테스트를 대체할 수도 없고 대체해서도 안 된다.
사실 39. 검토와 검사 고객 만족도 측정과 프로세스 개선 측면에서 봤을 때 출시 후 검토(회고라 부르는 사람도 있다)의 중요성은 인정되지만, 이를 시행하는 조직은 거의 없다.
사실 40. 검토와 검사 동료 검토(peer review)는 기술적인 측면과 사회적인 측면을 모두 가진다. 한쪽을 무시하고 다른 한쪽에만 치우치면 큰 실패를 초래한다.
사실 41. 유지보수 유지보수는 보통 소프트웨어비용의 40~80%(평균 60%)를 차지한다. 따라서 유지보수는 소프트웨어 생명주기 중 가장 중요한 단계일 것이다.
사실 42. 유지보수 소프트웨어 유지보수 비용에서 약 60%는 개선 작업에 쓰이는 비용이다. 오류 정정은 약 17% 정도다. 따라서, 소프트웨어 유지보수는 기존 소프트웨어를 보수만 하는 것이 아니라 새로운 기능을 추가할 때도 많다.
사실 43. 유지보수 유지보수는 문제가 아니라 해결책이다
사실 44. 유지보수 소프트웨어 개발과 유지보수 작업을 자세히 살펴보면, 유지보수에서는 기존 시스템을 이해해야 한다는 것을 제외한 대부분의 작업이 같다는 것을 알 수 있다. 기존 시스템을 이해하는 작업에 걸리는 시간은 전체 유지보수 시간의 대략 30% 정도고, 이는 유지보수에서 가장 중요한 활동이다. 따라서 유지보수가 개발보다 어려운 작업이라 주장하는 것도 가능하다.
사실 45. 유지보수 더 좋은 소프트웨어 공학 기술로 개발하면 더 많은(더 적은 게 아니라) 유지보수가 필요하다
사실 46. 품질 품질은 속성의 집합이다.
사실 47. 품질 품질은 사용자 만족, 요구사항 충족, 비용과 일정 목표 달성, 또는 신뢰성이 아니다
사실 48. 신뢰성 대부분의 프로그래머가 흔히 범하는 오류가 있다.
사실 49. 신뢰성 오류는 뭉치는 경향이 있다.
사실 50. 신뢰성 소프트웨어 오류 제거에 있어 단 하나의 최상의 방법은 없다
사실 51. 신뢰성 오류는 항상 남아있다. 심각한 오류를 제거하거나 최소화하는 것이 목표가 돼야 한다
사실 52. 효율 효율은 훌륭한 코딩보다는 훌륭한 설계에 더 많은 영향을 받는다.
사실 53. 효율 컴파일러가 제대로(적절하게) 최적화 작업을 하면 고급언어 코드도 어셈블리어 코드의 90%에 가까운 효율을 낼 수 있다. 그리고 복잡한 현대적 아키텍처에서는 효율이 더 높을 수도 있다.
사실 54. 효율 크기와 속도 사이에는 트레이드오프가 있다. 한쪽을 개선하면 대개 다른 쪽이 나빠진다.
사실 55. 연구 많은 소프트웨어 연구자들이 연구보다 옹호에 치중한다. 그 결과 (1)몇몇 옹호되는 개념은 그 옹호자가 생각하는 것보다 훨씬 가치가 낮고, (2)이런 개념이 실제로 어떤 효용성을 가지는지 결정하는데 도움을 줄만한 평가적 연구도 부족하다.
오해 1. 관리 측정할 수 없는 것은 관리할 수 없다
오해 2. 관리 소프트웨어 품질은 관리로 해결할 수 있다.
오해 3. 사람 프로그래밍은 비자아적(egoless)이 될 수 있고, 또 되어야 한다.
오해 4. 도구와 기술 도구와 기술: 한 가지로 모든 문제를 해결할 수 있다.
오해 5. 도구와 기술 소프트웨어 분야에 더 많은 방법론이 필요하다
오해 6. 추정 비용과 일정을 추정하기 위해서는 먼저 LOC를 추정해야 한다.
오해 7. 테스트 랜덤 테스트 입력은 테스트를 최적화하는 좋은 방법이다.
오해 8. 검토 "보는 눈이 많으면, 모든 버그는 그 깊이가 얕다."
오해 9. 유지보수 과거의 비용 데이터를 살펴봄으로써 미래의 유지보수 비용을 예측할 수 있고 시스템교체 결정을 내릴 수 있다.
오해 10. 교육 프로그래밍을 가르칠 때 프로그램을 어떻게 작성하는지를 보여주며 가르친다