3장. 애자일 소프트웨어 개발
신속한 소프트웨어 개발
신속한 개발과 인도 (Delivery)
•
대부분의 비즈니스 시스템에서 신속한 개발과 배포는 가장 중요한 요구사항이다.
•
변화하는 비즈니스 환경에 따라 안정적인 요구사항을 얻기가 힘들다.
•
시스템을 경험한 후에 요구사항을 명확히 알게되지만, 요구사항은 계속 변화한다.
기존 계획주도 프로세스의 한계
계획주도 프로세스는 신속한 소프트웨어 개발에 적합하지 않음
애자일 기법의 등장
•
익스트림 프로그래밍: 애자일 개발 방법
•
스크럼: 애자일 프로젝트 관리
애자일 개발
애자일 기법의 특징
1. 명세화, 설계 및 구현 프로세스가 중첩된다.
설계 문서화를 최소화하거나 시스템 구현을 위한 프로그래밍 환경에서 자동 생성한다.
2. 시스템을 증가분의 연속으로 구현한다.
최종 사용자와 다른 시스템 이해당사자가 각 증가분을 명세하고 평가하는데 참여한다.
3. 개발 프로세스를 지원하기 위해 방대한 도구를 사용하게 된다.
테스트 자동화 도구, 형상 관리와 시스템 통합을 지원하는 도구, UI를 자동으로 생성해주는 도구 등
고객과의 커뮤니케이션 활성화 + 문서 최소화
계획 주도 개발과 애자일 개발의 차이점
1. 계획 주도 개발 (Plan-driven)
•
프로세스 단계별로 해당하는 산출물을 생성하도록 각 단계를 분리
•
각 단계의 산출물이 다음 단계에서 사용된다.
•
활동 별로 반복이 이루어진다.
2. 애자일 개발 (Agile)
•
설계와 구현을 프로세스 중심활동으로 두고, 요구사항, 테스팅 등을 설계와 구현에 포함시킨다.
•
요구사항과 설계를 따로 두지 않고 함께 발전시킴
애자일 기법 원칙
고객 참여
고객이 개발 프로세스 전반에 밀접하게 관여해야 한다. 시스템 요구사항 제공, 우선순위 결정, 반복적으로 개발하는 시스템을 평가
변화 수용
시스템 요구사항이 변한다고 예상하여 변화를 수용할 수 있도록 시스템 설계
점증적 인도
소프트웨어는 점증적으로 개발한다. 고객이 다음 증가분에 포함해야 할 요구사항을 명세한다.
단순성 유지
소프트웨어와 개발 프로세스의 단순성에 집중한다. 가능하면 시스템의 복잡성을 제거한다.
프로세스가 아닌 사람
개발팀의 기술을 인지하고 잘 활용할 수 있어야 한다.
애자일 기법
계획 주도 접근법 특징
•
요구사항 및 설계 등의 문서화에 중점
•
대규모로 오래 지속되는 소프트웨어 시스템을 개발하는데 적합
•
요구사항이 바뀌면 명세, 설계, 프로그램을 함께 변경해야 한다.
•
중소 규모 비즈니스 시스템을 개발하기에는 오버헤드가 크다는 단점이 존재
애자일 기법 등장
•
개발팀이 설계와 문서 작업보다 소프트웨어 자체에 더 집중하게 한다.
•
요구사항이 자주 변경되는 애플리케이션을 개발할 때 적합하다.
•
반복적인 개발
•
고객이 작동하는 소프트웨어를 빨리 받아 이후 요구사항 도출에 기여
애자일 선언
1.
프로세스 도구 < 개인과 상호작용
2.
이해하기 좋은 문서 < 작동하는 소프트웨어
3.
계약 협상 < 고객과의 협업
4.
계획을 따르기 < 변화에 대응
애자일 기법이 유용하게 쓰이는 경우
1.
소프트웨어 회사가 중소규모의 제품을 개발
2.
고객이 개발 프로세스에 참여할 수 있어야 한다.
3.
외부 이해 당사자나 규제가 없는 조직 내에서 이루어지는 맞춤형 개발
4.
같은 장소에 있는 팀으로 구성
애자일 개발 기법
익스트림 프로그래밍 (Extreme Programming) (XP)
•
극단적으로 반복적인 접근법
•
하루에 여러개의 버전, 2주마다 증분을 시도
•
요구사항을 사용자 스토리(User Story)라고 하는 시나리오로 표현
•
사용자 스토리를 태스크(Task)로 나누어 구현
•
프로그래머는 짝으로 개발하고 코드를 작성하기 전에 테스트를 먼저 작성
•
새로운 코드를 시스템에 통합하려면 모든 테스트를 통과해야 한다.
•
시스템을 자주 배포해야 한다.
XP 실무
•
대부분의 조직에서 XP 실무의 실무 적용이 어렵다고 밝혀짐
•
실무 원칙을 골라서 사용
중요한 실무 원칙 4가지
1.
사용자 스토리
2.
리팩토링
3.
테스트 우선 개발
4.
짝 프로그래밍
사용자 스토리
XP의 요구사항 관리
•
XP와 같이 애자일 기법은 요구사항 변경을 지원하기 위해 별도의 요구 공학 활동을 두지 않는다.
•
시스템 사용자가 경험할 수 있는 일종의 사용 시나리오인 '사용자 스토리'를 만들어 관리한다.
•
고객을 개발팀과 스토리 카드를 작성, 스토리 카드를 태스크로 나누어 개발한다.
사용자 스토리의 장점 / 단점
장점 - 이해하기 쉽다.
요구 사항 문서나 유스케이스보다 쉽게 이해할 수 있다
단점 - 요구사항 완전성 문제
•
시스템의 중요한 요구사항 전체를 다룰 수 있을 정도로 제작했는가?
•
개별 스토리에서 누락된 내용은 없는가?
리팩토링
리팩토링 (Refactoring)
소프트웨어 구조와 신뢰성을 개선함으로써 소프트웨어를 변경할 때 자연스럽게 발생하는 구조적 약화 해결
XP가 생각하는 변경 처리
•
기존 전통적인 소프트웨어 공학 지침의 '변경을 고려한 설계' = 시간 낭비
•
변경이 없거나, 예상치 못한 변경요청이 이루어지기도 하므로 변경을 고려한 설계는 시간 낭비
•
변경은 필연적으로 발생 + 점증적 개발로 인해 소프트웨어 구조가 망가지는 경향 존재
지속적인 리팩토링으로 소프트웨어 구조와 가독성 개선 → 구조적 악화를 막고 변경 처리를 쉽게 한다.
리팩토링의 예
1.
중복 코드를 제거하기 위한 클래스 계층 구조 변경
2.
속성과 메소드 이름을 적절하게 변경
3.
비슷한 코드가 사용되는 것을 메소드 호출로 대체
테스트 우선 개발
점증적 개발과 계획 주도 개발의 중요한 차이점 → 시스템을 테스트 하는 방식
점증적 개발에서는 시스템 테스트를 위해 외부 테스팅팀이 사용할 수 있는 시스템 명세가 없다는 문제 존재
XP의 테스트
테스팅을 자동화하고 개발 프로세스의 중심에 둠으로써 모든 테스트를 성공적으로 테스트하기 전에는 개발을 진행할 수 없도록 하였다.
XP 테스팅 특징
1.
테스트 우선 개발
2.
시나리오를 이용하여 점증적 테스트 개발
3.
테스트 개발과 검증에서의 사용자 참여
4.
테스트 자동화 프레임워크 사용
5.
스토리 카드 → 태스크 → 태스크 별 테스트 작성
6.
고객의 역할은 다음 릴리스에서 구현할 스토리에 대한 인수 테스트를 개발하는 것을 돕는 것이다.
테스트 주도 개발 (Test-driven Development) (TDD)
코드를 작성하기 전에 테스트를 먼저 작성하는 것
테스트 주도 개발 특징
•
테스트를 작성하려면 기능과 인터페이스에 대해 알아야 하므로 요구사항을 명확히 할 수 있다.
•
테스트 지연 문제를 방지한다.
•
테스트 자동화는 테스트 주도 개발에 필수적이다.
•
테스트를 쉽게 작성할 수 있게 한다.
•
테스팅을 자동으로 실행할 수 있으며, 테스팅 결과가 명세에 맞는지 확인 가능하다.
짝 프로그래밍
짝 프로그래밍이란?
프로그래머가 소프트웨어를 짝으로 개발하는 것이다. (짝은 바뀔 수 있다.)
짝 프로그래밍의 장점
•
시스템에 대한 공동 소유권과 책임을 지원
•
다른 사람이 같이 코드를 보기 때문에 비공식적인 리뷰 프로세스가 진행된다.
•
리팩토링을 장려하고 지지한다.
짝 프로그램의 실무 적용
•
경험 많은 개발자 + 경험 부족한 개발자
•
지식의 공유가 중요
애자일 프로젝트 관리
개발 기법에 따른 프로젝트 관리
1. 계획 주도 접근법
•
무엇을 언제 인도할 것인지, 누가 프로젝트 산출물을 만들 것인지에 대한 계획을 가지고 있다.
•
관리가 쉽다는 장점이 존재
2. 애자일 기법
•
프로젝트 진척도가 비가시적이다.
•
비공식적 계획과 프로젝트 통제는 가시화에 대한 비즈니스 요구사항과 충돌했다.
•
큰 조직에는 적합하지 않았다.
스크럼 (Scrum)
애자일 프로젝트를 조직화하고 가시성을 제공하기 위한 프레임워크
스크럼 특징
1.
반복적인 개발을 관리하는데 중점을 둔 방법
2.
특정 애자일 실무 원칙을 요구하지 않는다.
스크럼 용어
1.
스크럼 마스터: 프로젝트 관리자
2.
제품 백로그: TO do List
3.
스크럼: 짧은 일일 개발 회의
4.
스프린트: 2~4주 길이의 개발 반복 주기
스크럼 스프린트 사이클 (Scrum Sprint Cycle)
1. 2~4주 범위의 고정 길이
완성하지 못한 작업은 제품 백로그로 돌려 놓는다. (기간 연장 X)
2. 제품 백로그 항목들의 우선 순위를 매겨서 해당 스프린트에 작업할 스프린트 백로그 선정
3. 매일 스크럼을 진행
진척도를 점검하고 우선순위를 조정하는 짧은 미팅으로, 진척 사항+문제점+계획등 정보 공유
4. 스크럼 보드를 두어 정보 공유
•
스프린트 백로그, 진행상황, 완료된 작업 등 표시
•
누구든지 변경 가능