3장: 준비는 철저하게: 선행 조건
3장: 준비는 철저하게: 선행 조건
3.1 선행 조건의 중요성
품질은 프로젝트 초반부터 결정됨
- 프로젝트가 성공할 것이냐 아니냐의 상당 부분은 구현을 시작하기 전에 이미 결정된다.
- 고품질 소프트웨어를 만드는 공통점 중 하나는 시작, 중간, 끝 전 과정에서 품질을 신경 쓴다는 점임
- 끝에서 품질을 강조하면 시스템 테스트 중심이 됨
- 테스트만으로는 잘못된 제품을 만들었는지, 올바른 제품을 잘못된 방식으로 만들었는지 잡아내지 못함
- 중간에서 품질을 강조하면 구현 실천법 중심이 됨
- 시작에서 품질을 강조하면 문제 정의, 요구사항, 설계 자체를 제대로 하는 방향이 됨
- 끝에서 품질을 강조하면 시스템 테스트 중심이 됨
- 구현은 프로젝트 한가운데 있음, 구현에 들어갈 때는 이미 앞 단계가 성공과 실패의 토대를 상당 부분 결정한 상태임
최신 소프트웨어 프로젝트에도 선행 조건은 필요함
- 선행 조건의 가장 큰 목적은 위험 감소
- 특히 요구사항 부족과 프로젝트 계획 부족이 가장 흔한 위험
- 선행 조건은 요구사항, 프로젝트 계획을 향상시키는데 중점을 둠.
- 준비 방식은 프로젝트마다 달라지며, 정확한 접근은 3.2에서 다룸
준비가 부족해지는 이유
- 준비가 부족한 이유도 반복됨
- 선행 작업을 수행할 역량이 부족함
- 코딩을 빨리 시작하고 싶은 충동이 강함
- 관리자들이 구현 전 활동의 가치를 이해하지 못함
- 관리자가 코딩만 진짜 작업으로 보면 준비 활동이 압박받기 쉬움
관리자 압박에 대응하는 방법
- 효과적이지 않은 순서로 일하라는 지시를 단호하게 거절할 수 있음
- 실제로는 요구사항과 아키텍처를 다루면서 코딩하는 것처럼 보이는 선택지도 있음
- 개발 프로세스와 선행 조건의 가치를 관리자에게 설명하는 방식이 더 바람직함
- 계속 준비 활동을 인정하지 않는 환경이라면 다른 일을 찾는 것도 선택지임
구현 전 선행 조건을 수행하기 위한 논리적 설득
- 구현 전에 시스템이 무엇을 해야 하고, 어떻게 해야 하는지 이해해야 함
- 큰 프로젝트일수록 더 많은 계획이 필요하고, 작은 프로젝트일수록 계획 수준은 줄어듦
- 관리 관점의 계획은 시간, 인원, 장비를 추정하는 일임
- 기술 관점의 계획은 잘못된 것을 만들지 않도록 무엇을 만들지 이해하는 일임
- 사용자가 처음부터 원하는 것을 정확히 알지 못하더라도, 잘못 만들고 버리는 것보다 요구를 파악하는 비용이 낮음
- 시스템을 어떻게 만들지도 미리 생각해야 불필요한 시행착오와 비용 증가를 줄일 수 있음
구현 전 준비를 설득하는 비유
- 소프트웨어도 집을 짓듯이 도면과 계획을 확인한 뒤 만들어야 함
- 요구사항은 아키텍처에, 아키텍처는 설계에, 설계는 구현에 영향을 줌
- 앞 단계가 오염되면 뒤 단계도 함께 오염됨
- 반복적 프로젝트도 각 반복에서 만들 부분의 핵심 요구사항과 아키텍처 요소는 먼저 확인해야 함
- 주택 단지를 지을 때 모든 집의 세부사항을 몰라도 부지, 하수관, 전기선 같은 기반은 먼저 확인해야 하는 것과 같음
구현 전 준비를 설득하는 데이터
- 결함은 가능한 한 삽입 시점 가까이에서 잡을수록 비용이 낮음
- 요구사항이나 아키텍처 결함은 뒤로 갈수록 비용이 급격히 커짐
표 3-1. 결함 삽입 시점과 발견 시점에 따른 평균 수정 비용
| 결함 삽입 시점 | 요구사항에서 발견 | 아키텍처에서 발견 | 구현에서 발견 | 시스템 테스트에서 발견 | 릴리스 후 발견 |
|---|---|---|---|---|---|
| 요구사항 | 1 | 3 | 5-10 | 10 | 10-100 |
| 아키텍처 | - | 1 | 10 | 15 | 25-100 |
| 구현 | - | - | 1 | 10 | 10-25 |
- 요구사항 결함은 시스템에 가장 오래 남을 수 있고, 영향 범위도 넓어 비용이 커지기 쉬움
- 평균적인 프로젝트는 여전히 결함 수정 노력을 후반부에 많이 쓰며, 디버깅과 재작업이 개발 주기의 큰 비중을 차지함
- 결함을 늦게 고치는 대신 일찍 고치도록 집중하면 비용과 일정을 크게 줄일 수 있음
관리자 이해도 점검
- “디버깅할 것이 많으니 바로 코딩해야 한다”는 말은 자기실현적 예언에 가까움
- “테스트에서 결함이 적을 테니 테스트 시간을 줄인다”는 말도 자기실현적 예언에 가까움
- 더 바람직한 목표는 요구사항과 설계를 충분히 검토해서, 코딩과 디버깅 중 큰 문제가 떠오르지 않는 상태임
3.2 작업 중인 소프트웨어의 종류 결정
프로젝트 유형에 맞는 준비 수준
- 프로젝트마다 선행 조건과 구현의 균형이 다름
- 모든 프로젝트가 같은 방식으로 요구사항, 설계, 테스트를 다루면 안 됨
- 대표적으로는 비즈니스 시스템, 미션 크리티컬 시스템, 임베디드 생명-중요 시스템처럼 다른 성격의 프로젝트가 있음
표 3-2. 세 가지 일반적인 소프트웨어 프로젝트 유형에 적합한 대표 실천법
| 구분 | 비즈니스 시스템 | 미션 크리티컬 시스템 | 임베디드 생명-중요 시스템 |
|---|---|---|---|
| 대표 애플리케이션 | 인터넷 사이트 인트라넷 사이트 재고 관리 게임 경영 정보 시스템 급여 시스템 |
임베디드 소프트웨어 게임 인터넷 사이트 패키지 소프트웨어 소프트웨어 도구 웹 서비스 |
항공 전자 소프트웨어 임베디드 소프트웨어 의료 기기 운영체제 패키지 소프트웨어 |
| 생명주기 모델 | 애자일 개발 진화적 프로토타이핑 |
단계적 전달 진화적 전달 나선형 개발 |
단계적 전달 나선형 개발 진화적 전달 |
| 계획과 관리 | 점진적 프로젝트 계획 필요 시 테스트와 QA 계획 비공식 변경 통제 |
기본 선행 계획 기본 테스트 계획 필요 시 QA 계획 공식 변경 통제 |
광범위한 선행 계획 광범위한 테스트 계획 광범위한 QA 계획 엄격한 변경 통제 |
| 요구사항 | 비공식 요구사항 명세 | 준공식 요구사항 명세 필요 시 요구사항 리뷰 |
공식 요구사항 명세 공식 요구사항 검사 |
| 설계 | 설계와 코딩 결합 | 아키텍처 설계 비공식 상세 설계 필요 시 설계 리뷰 |
아키텍처 설계 공식 아키텍처 검사 공식 상세 설계 공식 상세 설계 검사 |
| 구현 | 페어 프로그래밍 또는 개인 코딩 비공식 체크인 절차 또는 체크인 절차 없음 |
페어 프로그래밍 또는 개인 코딩 비공식 체크인 절차 필요 시 코드 리뷰 |
페어 프로그래밍 또는 개인 코딩 공식 체크인 절차 공식 코드 검사 |
| 테스트와 QA | 개발자가 자기 코드 테스트 테스트 우선 개발 별도 테스트 그룹이 거의 없거나 없음 |
개발자가 자기 코드 테스트 테스트 우선 개발 별도 테스트 그룹 |
개발자가 자기 코드 테스트 테스트 우선 개발 별도 테스트 그룹 별도 QA 그룹 |
| 배포 | 비공식 배포 절차 | 공식 배포 절차 | 공식 배포 절차 |
- 비즈니스 시스템은 대체로 반복적 접근과 잘 맞음
- 생명-중요 시스템은 대체로 더 순차적이고 더 형식적인 접근이 필요함
반복적 접근이 선행 조건에 미치는 영향
- 반복적 접근이 선행 조건의 중요성을 없애는 것은 아님
- 반복적 접근은 선행 작업 부족의 비용을 줄일 수는 있어도 없애지는 못함
표 3-3. 선행 조건을 생략했을 때 순차적 프로젝트와 반복적 프로젝트의 영향
| 프로젝트 완료 상태 | 순차적 접근 작업 비용 | 순차적 접근 재작업 비용 | 반복적 접근 작업 비용 | 반복적 접근 재작업 비용 |
|---|---|---|---|---|
| 20% | $100,000 | $0 | $100,000 | $75,000 |
| 40% | $100,000 | $0 | $100,000 | $75,000 |
| 60% | $100,000 | $0 | $100,000 | $75,000 |
| 80% | $100,000 | $0 | $100,000 | $75,000 |
| 100% | $100,000 | $0 | $100,000 | $75,000 |
| 프로젝트 종료 후 재작업 | $0 | $500,000 | $0 | $0 |
| 합계 | $500,000 | $500,000 | $500,000 | $375,000 |
| 총합 | $1,000,000 | $875,000 |
- 선행 조건을 무시한 반복적 프로젝트는 비용을 끝에 몰아내지 않을 뿐, 프로젝트 전반에 나눠서 지불하게 됨
- 선행 조건에 집중하면 순차적 접근이든 반복적 접근이든 총비용을 줄일 수 있음
표 3-4. 선행 조건에 집중했을 때 순차적 프로젝트와 반복적 프로젝트의 영향
| 프로젝트 완료 상태 | 순차적 접근 작업 비용 | 순차적 접근 재작업 비용 | 반복적 접근 작업 비용 | 반복적 접근 재작업 비용 |
|---|---|---|---|---|
| 20% | $100,000 | $20,000 | $100,000 | $10,000 |
| 40% | $100,000 | $20,000 | $100,000 | $10,000 |
| 60% | $100,000 | $20,000 | $100,000 | $10,000 |
| 80% | $100,000 | $20,000 | $100,000 | $10,000 |
| 100% | $100,000 | $20,000 | $100,000 | $10,000 |
| 프로젝트 종료 후 재작업 | $0 | $0 | $0 | $0 |
| 합계 | $500,000 | $100,000 | $500,000 | $50,000 |
| 총합 | $600,000 | $550,000 |
- 대부분 프로젝트는 완전히 순차적이지도, 완전히 반복적이지도 않음
- 흔한 경험 법칙은 핵심 요구사항 상당수를 먼저 정하고, 나머지는 후속 반복에서 다루는 방식임
순차적 접근과 반복적 접근 선택
- 더 순차적인 접근이 맞는 경우
- 요구사항이 비교적 안정적임
- 설계가 단순하고 잘 이해됨
- 팀이 해당 도메인에 익숙함
- 프로젝트 위험이 낮음
- 장기 예측 가능성이 중요함
- 후반 변경 비용이 큼
- 더 반복적인 접근이 맞는 경우
- 요구사항이 불안정하거나 잘 모름
- 설계가 복잡하거나 도전적임
- 팀이 해당 도메인에 익숙하지 않음
- 프로젝트 위험이 큼
- 장기 예측 가능성이 덜 중요함
- 후반 변경 비용이 낮음
- 핵심은 프로젝트 성격에 맞는 선행 조건 수준을 먼저 결정하는 것임
3.3 문제-정의 선행 조건
- 구현 전에 가장 먼저 완료해야하는 첫번째 선행 조건은 해결할 문제를 분명히 정의하는 일임
- 문제 정의는 해결책이 아니라 문제 자체를 설명해야 함
- 좋은 문제 정의는 보통 1~2페이지 수준의 짧은 문서임
사용자 언어로 작성
- 사용자 언어로 작성되는 편이 좋음
- 기술 용어보다 사용자의 관점에서 문제가 어떻게 보이는지가 중요함
- 예외적으로 컴파일 시간, 개발 도구 결함처럼 컴퓨터 자체가 문제인 경우에는 기술 용어로 표현해도 됨
문제 정의 실패의 대가
- 문제 정의는 요구사항보다 앞에 있음
- 요구사항이 문제를 더 자세히 파고드는 단계라면, 문제 정의는 그 바탕을 만드는 단계임
- 문제를 잘못 정의하면 애초에 잘못된 목표를 향해 구현하게 됨
- 그 대가는 잘못된 문제를 푸는 데 시간과 비용을 쓰고, 정작 올바른 문제는 풀지 못하는 데 있음
3.4 요구사항 선행 조건
공식 요구사항이 필요한 이유
- 요구사항은 소프트웨어가 무엇을 해야 하는지 자세히 기술하는 내용임
- 기능 결정을 프로그래머가 아니라 사용자 주도로 만들 수 있음
- 범위와 기대치를 미리 맞출 수 있음
- 팀 내부 논쟁을 문서로 정리할 수 있음
- 개발 시작 후의 변경을 줄일 수 있음
- 요구사항 오류는 구현 이후에 발견될수록 매우 비싸짐
안정적 요구사항이라는 환상
- 요구사항이 안정적이기만 하면 이상적이지만, 실제 프로젝트에서는 변동이 흔함
- 요구사항 변경을 없애려 하기보다, 영향을 줄이는 방식이 중요
구현 중 요구사항 변경 다루기
대응 방식 정리
- 요구사항 품질을 먼저 점검
- 변경 비용을 모두가 알게 함
- 변경 절차 마련
- 변화를 수용하는 개발 방식 사용
- 프로젝트 취소
- 프로젝트의 사업성을 주시
체크리스트: 요구사항
구체적인 기능 요구사항
- 모든 입력이 출처, 정확도, 값 범위, 빈도와 함께 명시되어 있는가?
- 모든 출력이 목적지, 정확도, 값 범위, 빈도, 형식과 함께 명시되어 있는가?
- 웹 페이지, 보고서 등 모든 출력 형식이 명시되어 있는가?
- 모든 외부 하드웨어와 소프트웨어 인터페이스가 명시되어 있는가?
- 핸드셰이킹, 오류 검사, 통신 프로토콜을 포함해 모든 외부 통신 인터페이스가 명시되어 있는가?
- 사용자가 수행하려는 모든 작업이 명시되어 있는가?
- 각 작업에 사용되는 데이터와 각 작업의 결과 데이터가 명시되어 있는가?
구체적인 비기능 요구사항
- 필요한 모든 작업에 대해 사용자 관점의 예상 응답 시간이 명시되어 있는가?
- 처리 시간, 데이터 전송률, 시스템 처리량 같은 다른 시간 관련 조건이 명시되어 있는가?
- 보안 수준이 명시되어 있는가?
- 소프트웨어 실패의 결과, 실패로부터 보호해야 할 중요 정보, 오류 감지와 복구 전략을 포함해 신뢰성이 명시되어 있는가?
- 최소 메모리와 여유 디스크 공간이 명시되어 있는가?
- 특정 기능 변경, 운영 환경 변경, 다른 소프트웨어와의 인터페이스 변경에 적응하는 능력을 포함해 유지보수성이 명시되어 » 있는가?
- 성공과 실패의 정의가 포함되어 있는가?
요구사항 품질
- 요구사항이 사용자 언어로 작성되어 있는가? 사용자도 그렇게 생각하는가?
- 각 요구사항이 다른 요구사항과 충돌하지 않는가?
- 견고성과 정확성처럼 경쟁하는 속성 사이의 허용 가능한 절충이 명시되어 있는가?
- 요구사항이 설계를 명시하지 않는가?
- 요구사항의 상세 수준이 비교적 일관적인가? 더 자세히 또는 덜 자세히 써야 할 항목은 없는가?
- 독립된 구현 그룹에 넘겨도 이해할 수 있을 만큼 요구사항이 명확한가? 개발자도 그렇게 생각하는가?
- 각 항목이 문제와 해결책에 관련되어 있는가? 각 항목의 출처를 문제 환경까지 추적할 수 있는가?
- 각 요구사항은 테스트 가능한가? 독립된 테스트로 충족 여부를 판단할 수 있는가?
- 변경 가능성과 각 변경의 가능성을 포함해 요구사항 변경 가능성이 명시되어 있는가?
요구사항 완전성
- 개발 전에 정보를 얻을 수 없는 영역이 있다면, 불완전한 부분이 명시되어 있는가?
- 제품이 모든 요구사항을 만족하면 받아들일 수 있을 만큼 요구사항이 완전한가?
- 모든 요구사항을 편안하게 받아들일 수 있는가? 구현 불가능하지만 고객이나 상사를 달래기 위해 들어간 요구사항을 » 제거했는가?
3.5 아키텍처 선행 조건
아키텍처의 역할
- 소프트웨어 아키텍처는 고수준 설계임
- 세부 설계를 붙들어 주는 큰 틀이고, 시스템의 개념적 일관성을 좌우함
- 좋은 아키텍처는 구현을 쉽게 만들고, 나쁜 아키텍처는 구현을 거의 불가능하게 만들 수 있음
- 아키텍처 결함도 요구사항 결함만큼 후반으로 갈수록 수정 비용이 커짐
일반적인 아키텍처 구성요소
- 프로그램 구조
- 시스템의 큰 그림, 주요 서브시스템, 책임 배분, 설계 이유가 드러나야 함
- 주요 클래스
- 데이터 설계
- 주요 데이터 구조, 데이터베이스 조직, 데이터 흐름, 데이터 소유권이 설명되어야 함
- 비즈니스 규칙
- 사용자 인터페이스 설계
- 자원 관리
- 보안
- 성능
- 속도와 공간 예산이 클래스, 서브시스템, 기능 영역별로 제시되어야 함
- 확장성
- 시스템이 미래 수요 증가를 어떻게 감당할지 설명해야 함
- 사용자 수, 데이터 크기, 트랜잭션 규모 증가를 고려해야 함
- 상호운용성
- 외부 시스템과의 계약, 데이터 형식, 통신 방식이 명확해야 함
- 국제화와 현지화
- 여러 지역, 언어, 형식 지원이 필요하면 국제화 전략이 포함되어야 함
- 문자열, 날짜, 숫자, 통화, 정렬 방식 같은 지역별 차이를 고려해야 함
- 입출력
- 오류 처리
- 오류 처리가 교정 중심인지, 탐지 중심인지 정해야 함
- 오류 감지가 능동적인지 수동적인지, 오류를 어떻게 전파하고 메시지를 어떻게 처리할지도 정해야 함
- 예외 처리 사용 방식, 로깅 방식, 예외 포착 위치도 아키텍처에서 다뤄야 함
- 내결함성
- 시스템이 오류를 감지한 뒤 다시 시도할지, 대체 코드를 사용할지, 투표 알고리즘을 사용할지 같은 전략이 필요할 수 있음
- 내결함성이 필요한 시스템에서는 이 결정을 구현 후반으로 미루면 위험함
- 기술적 실현 가능성
- 위험한 기술 요소는 프로토타입이나 실험으로 확인하는 편이 좋음
- 과설계
- 아키텍처가 필요 이상으로 복잡하지 않은지 확인해야 함
- 구매 대 개발 결정
- 직접 만들 것과 구매하거나 가져다 쓸 것을 구분해야 함
- 재사용 결정
- 변경 전략
- 예상 가능한 변경을 아키텍처가 수용할 수 있어야 함
- 변경 영향이 소수의 클래스나 모듈에 제한되도록 설계해야 함
일반적인 아키텍처 품질
- 좋은 아키텍처는 개념적으로 한 덩어리로 맞물려야 함
- 목표가 분명해야 하고, 중요한 결정의 이유도 설명 가능해야 함
- 구현자 입장에서 이해 가능하고 납득 가능한 구조여야 함
- 아키텍처가 부실하면 올바른 문제를 잘못된 방식으로 풀게 될 수 있음
체크리스트: 아키텍처
구체적인 아키텍처 주제
- 좋은 아키텍처 개요와 정당화를 포함해 프로그램의 전체 조직이 명확한가?
- 주요 빌딩 블록의 책임 영역과 다른 빌딩 블록과의 인터페이스가 잘 정의되어 있는가?
- 요구사항에 나열된 모든 기능이 너무 많지도 적지도 않은 빌딩 블록으로 합리적으로 다뤄지는가?
- 가장 중요한 클래스가 설명되고 정당화되어 있는가?
- 데이터 설계가 설명되고 정당화되어 있는가?
- 데이터베이스 조직과 내용이 명시되어 있는가?
- 핵심 비즈니스 규칙이 모두 식별되고, 시스템에 미치는 영향이 설명되어 있는가?
- 사용자 인터페이스 설계 전략이 설명되어 있는가?
- 사용자 인터페이스가 변경되어도 나머지 프로그램에 영향을 주지 않도록 모듈화되어 있는가?
- I/O 처리 전략이 설명되고 정당화되어 있는가?
- 스레드, 데이터베이스 연결, 핸들, 네트워크 대역폭 같은 부족한 자원에 대한 사용 추정과 관리 전략이 설명되고 정당화되어 » 있는가?
- 아키텍처의 보안 요구사항이 설명되어 있는가?
- 각 클래스, 서브시스템, 기능 영역에 대한 공간과 속도 예산이 정해져 있는가?
- 확장성을 어떻게 달성할지 아키텍처가 설명하는가?
- 상호운용성을 다루는가?
- 국제화/현지화 전략이 설명되어 있는가?
- 일관된 오류 처리 전략이 제공되어 있는가?
- 필요한 경우 내결함성 접근이 정의되어 있는가?
- 시스템의 모든 부분에 대한 기술적 실현 가능성이 확인되어 있는가?
- 과설계에 대한 접근이 명시되어 있는가?
- 필요한 구매 대 개발 결정이 포함되어 있는가?
- 재사용 코드가 다른 아키텍처 목표에 어떻게 맞춰질지 설명되어 있는가?
- 예상 가능한 변경을 수용하도록 설계되어 있는가?
일반적인 아키텍처 품질
- 아키텍처가 모든 요구사항을 반영하는가?
- 과설계되거나 과소설계된 부분은 없는가? 그런 기대치가 명시되어 있는가?
- 전체 아키텍처가 개념적으로 잘 맞물리는가?
- 최상위 설계가 구현에 사용할 기계와 언어에 독립적인가?
- 모든 주요 결정의 동기가 제공되어 있는가?
- 시스템을 구현할 프로그래머로서 이 아키텍처에 납득하고 편안함을 느끼는가?
3.6 선행 조건에 소요되는 시간
선행 조건에 배정할 시간
- 문제 정의, 요구사항, 아키텍처, 초기 계획에는 프로젝트 노력의 대략 10~20%, 일정의 20~30% 정도를 쓰는 것이 일반적임
- 상세 설계는 포함되지 않음, 상세 설계는 구현의 일부
- 요구사항이 불안정한 프로젝트라면, 요구사항 정리 자체를 별도 프로젝트처럼 다루는 편이 합리적일 수 있음
- 무엇을 만들지도 모르는데 전체 일정을 정확히 추정하는 것은 무리임
- 아키텍처에도 비슷한 원칙이 적용됨
- 낯선 도메인이거나 기술 불확실성이 크면, 아키텍처에 더 많은 시간을 배정해야 함
- 선행 조건에 시간을 쓰는 일은 구현 시간을 빼앗는 낭비가 아니라, 구현 재작업을 줄이는 투자에 가까움
체크리스트: 상위 선행 조건
- 작업 중인 소프트웨어 프로젝트의 종류를 식별하고, 그에 맞게 접근 방식을 조정했는가?
- 구현을 시작하기에 요구사항이 충분히 잘 정의되고 안정적인가?
- 구현을 시작하기에 아키텍처가 충분히 잘 정의되어 있는가?
- 프로젝트 고유의 다른 위험을 다뤄서 구현이 불필요하게 큰 위험에 노출되지 않게 했는가?
참고 자료
요구사항
-
Karl Wiegers, Software Requirements, 2nd ed.
요구사항 수집, 분석, 명세, 검증, 관리까지 요구사항 작업 전반을 실무적으로 다루는 책.
-
Suzanne Robertson, James Robertson, Mastering the Requirements Process
더 고급 요구사항 실무자를 위한 대안 자료.
-
Tom Gilb, Competitive Engineering
Planguage 요구사항 언어와 요구사항 공학, 설계 평가, 진화적 프로젝트 관리를 다룸.
-
IEEE Std 830-1998, IEEE Recommended Practice for Software Requirements Specifications
소프트웨어 요구사항 명세서에 무엇을 포함할지와 여러 명세서 개요를 제시하는 IEEE-ANSI 가이드.
-
Alain Abran et al., Swebok: Guide to the Software Engineering Body of Knowledge
소프트웨어 요구사항 지식 영역을 자세히 설명하는 자료.
-
Soren Lauesen, Software Requirements: Styles and Techniques
요구사항 작성 스타일과 기법을 다루는 대안 자료.
-
Benjamin L. Kovitz, Practical Software Requirements: A Manual of Content and Style
요구사항 문서의 내용과 표현 방식을 실무적으로 다루는 자료.
-
Alistair Cockburn, Writing Effective Use Cases
유스케이스를 효과적으로 작성하는 방법을 다루는 자료.
소프트웨어 아키텍처
-
Len Bass, Paul Clements, Rick Kazman, Software Architecture in Practice, 2nd ed.
소프트웨어 아키텍처를 실제 프로젝트 관점에서 다루는 대표 자료.
-
Frank Buschmann et al., Pattern-Oriented Software Architecture, Volume 1: A System of Patterns
패턴 기반으로 소프트웨어 아키텍처를 설명하는 자료.
-
Paul Clements, ed., Documenting Software Architectures: Views and Beyond
여러 관점에서 소프트웨어 아키텍처를 문서화하는 방법을 다룸.
-
Paul Clements, Rick Kazman, Mark Klein, Evaluating Software Architectures: Methods and Case Studies
아키텍처 평가 방법과 사례를 다루는 자료.
-
Martin Fowler, Patterns of Enterprise Application Architecture
엔터프라이즈 애플리케이션 아키텍처 패턴을 다루는 자료.
-
Ivar Jacobson, Grady Booch, James Rumbaugh, The Unified Software Development Process
통합 소프트웨어 개발 프로세스를 깊게 다루는 자료.
-
IEEE Std 1471-2000, Recommended Practice for Architectural Description of Software-Intensive Systems
소프트웨어 중심 시스템의 아키텍처 명세 작성에 관한 IEEE-ANSI 가이드.
일반적인 소프트웨어 개발 접근
-
Steve McConnell, Software Project Survival Guide
선행 계획, 요구사항 개발, 아키텍처 작업 뒤에 신중한 프로젝트 실행을 이어 가는 접근을 제시.
-
Philippe Kruchten, The Rational Unified Process: An Introduction, 2nd ed.
아키텍처 중심, 유스케이스 중심의 프로젝트 접근을 설명.
-
Ivar Jacobson, Grady Booch, James Rumbaugh, The Unified Software Development Process
Rational Unified Process 관련 주제를 더 깊게 다루는 자료.
-
Kent Beck, Extreme Programming Explained: Embrace Change
요구사항과 설계를 구현과 함께 반복적으로 발전시키는 고유연성 접근을 설명.
-
Tom Gilb, Principles of Software Engineering Management
핵심 계획, 요구사항, 아키텍처 이슈를 초기에 탐색하고 프로젝트 진행 중 계속 조정하는 접근을 다룸.
-
Steve McConnell, Rapid Development
프로젝트 특성에 맞게 계획 도구를 조합하는 도구 상자식 접근을 제시.
-
Barry Boehm, Richard Turner, Balancing Agility and Discipline: A Guide for the Perplexed
애자일 접근과 계획 중심 접근의 균형을 위험 관점에서 비교하는 자료.
-
Craig Larman, Agile and Iterative Development: A Manager’s Guide
Scrum, Extreme Programming, Unified Process, Evo를 포함한 반복적 개발 스타일을 개관하는 자료.
요점 정리
- 구현 준비의 최상위 목표는 위험 감소이다.
- 고품질 소프트웨어를 만들려면 품질은 처음부터 끝까지 전 과정에 포함되어야 하며, 특히 초반 품질 활동의 영향이 크다.
- 프로그래머의 역할에는 구현 전 준비의 중요성을 주변 사람들에게 설명하는 일도 포함된다.
- 프로젝트 종류에 따라 필요한 선행 조건 수준이 달라지며, 어떤 프로젝트는 반복적 접근이, 어떤 프로젝트는 더 순차적인 접근이 맞는다.
- 좋은 문제 정의가 없으면 구현 단계에서 잘못된 문제를 풀 수 있다.
- 좋은 요구사항 작업이 없으면 중요한 세부사항을 놓칠 수 있으며, 요구사항 변경은 구현 이후로 갈수록 비용이 크게 늘어난다.
- 좋은 아키텍처가 없으면 올바른 문제를 잘못된 방식으로 풀 수 있으며, 코드가 쌓일수록 아키텍처 변경 비용도 커진다.
- 자기 프로젝트에서 선행 조건이 어떤 방식으로 다뤄졌는지 이해하고, 그에 맞는 구현 접근을 선택해야 한다.