-
Notifications
You must be signed in to change notification settings - Fork 0
Best Practice
suhynnoh edited this page Dec 1, 2024
·
1 revision
- 판단 근거 애자일 프로세스 선택 이유 SETB는 다양한 고객사의 디지털 전환을 돕는 소프트웨어를 개발하는 회사로, 고객의 요구사항이 명확한 경우가 많습니다. 그렇다면 워터폴 방식이 적합지 않나 싶을 수 있습니다. 그러나 다음과 같은 이유로 워터폴 방식보다는 애자일 프로세스가 더 적합하다고 판단했습니다.
- 요구사항과 구현 간의 간극:
- 고객이 제안한 요구사항과 실제 구현 결과물 간에 차이가 있을 가능성이 큼
- SETB는 아날로그 제품을 디지털 소프트웨어로 전환하기 때문에 그 간극이 더 클 수밖에 없음
- 따라서 초기 요구사항이 명확하더라도 세부적인 개발 과정에서 고객의 기대와 실제 요구는 달라질 수 있음
- MVP 접근법의 필요성:
- 고객의 요구사항을 기반으로 MVP(Minimum Viable Product)를 제작하고, 이를 고객에게 시연하며 피드백을 받는 방식이 적합
- 피드백을 바탕으로 소프트웨어를 점진적으로 개선하는 애자일 프로세스가 이러한 상황에 유리
고객의 요구사항
- 고객은 Space-Invaders 게임을 ‘뱀서라이크’ 장르로 개발할 것을 요청
- 요구사항은 구체적이었지만, 개발 과정에서 다음과 같은 세부사항들이 추가적으로 결정되어야 했음
- 적들의 생성 방식
- 함선의 다양한 특성(공격 방법, 속성 등)
- 스테이지 종료 기준(레벨 단위, 시간제 등) 이러한 추가적인 세부사항은 프로젝트 초기 계획 단계에서 정확히 파악하기 어려웠으며, 애자일 프로세스를 통해 고객과 긴밀히 협력하며 해결해야 했음
- 실행 결과 애자일 프로세스 활용 사례
- 초기 스프린트에서 ‘뱀서라이크’의 핵심 요소를 구현한 후, 고객에게 시연하며 요구사항을 수집하고 빌드업하는 방식으로 진행했음
- 고객 피드백 예시:
- “아이템이 있었으면 좋겠어요.”
- 이동속도, 발사 속도, 총알 속도 올리는 아이템 제작 -> “사거리를 늘리는 아이템도 있었으면 좋겠어요.”
- “아이템이 있었으면 좋겠어요.”
- 이러한 피드백은 개발 과정에서 고객과 소통했기에 반영될 수 있었음
구체적인 애자일 프로세스 선택: Scrum과 Kanban 비교
Scrum의 한계
- Scrum Master와 Product Owner 역할 부담:
- 해당 역할의 경험자 부재로 이러한 역할을 맡는 것에 부담을 느꼈음
- 유휴 시간 문제:
- 스크럼은 스프린트가 시작될 때 Product Backlog에서 가져오고 스프린트 중간에 변경하지 않는 Push 시스템
- 계획한 작업이 모두 완료된 경우 남은 시간 동안 발생하는 비효율성이 있었음
Kanban의 한계
- 동기부여 부족:
- 구체적인 데드라인이 없어 작업 속도가 느려질 가능성이 있었음
- 목표 부족:
- 공동의 목표 설정이 어려워 프로젝트 관리가 어려워졌음
Scrumban 프로세스 도입
계획
- 수평적 팀 구조:
- 리더와 팀원으로만 구성되며, 역할 분배를 최소화했음
- 백로그 정제와 스프린트 계획에 모든 팀원이 참여
- 1주 단위 스프린트:
- 매주 월요일에 스프린트 시작 및 종료
- 스프린트 회고, 계획, 백로그 정제를 한꺼번에 진행하여 미팅의 흐름을 이어감
- Kanban 보드와 WIP 제한:
- Jira를 사용해 백로그 관리
- Kanban 보드는 ‘할 일 - 진행 중 - PR - 완료’로 구성
- 진행 중 열의 작업 수를 ‘팀원 수 + 1’로 제한하여 집중력을 높이고, hotfix 여유 공간을 확보
- Kanhan의 Pull System 사용
- Kanban과 같이 스프린트 중간에도 Product Backlog에서 Sprint Backlog로 항목 가져오기 가능
- 스프린트가 일찍 끝나 남는 유휴 시간을 줄이기 위함
실제 적용 결과
-
수평적 팀 구조
- 팀원 전체가 백로그 정제 과정에 참여하여, 사용자 요구사항을 구현하는 다양한 아이디어 도출
- 예시) 함선이 상하좌우로 움직이면 좋겠다, 게임 앤딩 화면이 있으면 좋겠다 등
- 팀원 전체가 백로그 정제 과정에 참여하여, 사용자 요구사항을 구현하는 다양한 아이디어 도출
-
밀도있는 미팅의 부담
- 여러 미팅이 하루에 이루어지다보니 집중이 분산되었음
- 스프린트 회고를 플래닝 하루 전으로 분리하여 각 미팅에 집중하게 됨
- 또한, 미팅에 Time Box가 없는 경우 내용이 꼬리를 물고 이어지기 쉬웠음
- 해당 미팅이 아닌 다른 미팅에서 다룰 내용에 대해 자세히 이야기 하는 경우도 있었음
-
Jira를 통한 Kanban 보드를 사용할 때 GitHub과 연결되어있지 않으면 Github PR을 관리하고, 추가로 Jira의 Issue까지 관리해야했음. 작업이 과중되고, 실제 Issue의 진행상황과 동기화되지 않는 경우가 있었음
-
Pull 시스템이 무의미 했음
- 각자 스프린트 플래닝 단계에서 맡은 이슈를 해결하면 이후 자율적으로 Product Backlog에서 항목을 가져와 작업하는 것을 기대했음
- 하지만, 각자 자신의 작업을 스프린트 기간에 맞춰 끝내는 현상이 발생함
-
PO(Product Owner)의 부재
- 사용자의 요구사항을 실제 구현하는 단계에서, 각자의 구현 아이디어가 다를 수 있음
- 백로그 정제 및 스프린트 플래닝 단계에서 사용자 요구사항을 명확하게 하고 구현 방안을 구체화하는 것으로 어느정도 해결이 가능하지만, 서로간의 의견이 대립되는 경우 이를 중제할 사람이 없었음
- 서로 다른 생각으로 개발을 시작하다 완성된 경우, 이의 타협점을 볼 때 소모되는 토의와 수정 비용이 있었음
- 따라서 고객과 밀접하게 소통하고, Product의 개발 방향을 잡는 역할을 하는 사람이 필요했다고 느껴졌음
-
소통의 중요성
- 서로의 작업 상황은 칸반 보드만으로 공유하기 어려웠음
- 해당 이슈를 얼마나 진행했는지, 어떤 어려움이 있는지는 말하지 않으면 알 수 없음
- 어려움을 겪고 있었는데, 이를 발화하며 도움이 될만한 사람들을 연결해 금방 해결한 적이 있음
- 대각선 이동시 속도가 빠른 문제 -> 소수점 픽셀 이동 해결방법 공유
-
최종 제안 SETB에 적합한 Scrumban 프로세스
-
애자일 프로세스 채택:
- 고객 요구사항이 명확하더라도, 소프트웨어 개발 과정에서 발생하는 세부 결정사항과 변경사항은 발생할 수밖에 없음
- MVP 접근법을 통해 고객과의 협력 및 피드백 기반 개발이 가능
-
Scrum 프로세스:
- 팀이 수평적인 구조이고, 비록 경험자가 없더라도 제품 개발 과정을 결정하고 책임지는 사람이 필요하다고 느꼈음
- 서로의 구현 아이디어가 달라 수정하는 비용, 여러가지 구현 방법중에 고민하고 선택하는 비용을 줄일 수 있음
- 데일리 스크럼
- 자신의 할 일을 발화하는 것만으로도 책임감이 생겨 작업 동기부여가 됨(벼락치기 예방)
- 겪고 있는 어려움을 공유함으로써 해결책을 모색할 수 있음
- 서로 기능이 의존적인 경우, 상대방의 진행 상황을 살펴보며 내 작업에 반영할 수 있음
- 팀이 수평적인 구조이고, 비록 경험자가 없더라도 제품 개발 과정을 결정하고 책임지는 사람이 필요하다고 느꼈음
-
프로세스 최적화:
- PO가 작업 분할 시 최소한의 변경 범위를 명시하고, 방향성을 설정
- 회고와 계획 미팅을 분리하여 집중도를 높이고 피로를 감소
- 브랜치에서의 작업은 최대한 자주 팀 저장소에 Push하여 서로의 작업 사항을 공유
- Jira와 GitHub 연동을 통해 Kanban보드 관리 최적화
- 이슈를 In progress로 옮기면 -> 브랜치 생성
- 브랜치 PR을 열면 -> PR로 이동
- Merge가 되면 -> 완료로 이동
코드 리뷰를 진행한 이유
높은 품질의 결과물의 내기 위해 코드 리뷰를 진행하기로 함 코드 리뷰를 진행한 이유
- 혼자서는 놓칠 수 있는 부분을 리뷰를 통해 고칠 수 있음
- 팀원들간의 코드 공유가 되어 프로덕트 이해도 향상
- 이는 다양한 아이디어, 작업 속도 향상으로 이어짐
초기 코드 리뷰 방식
GitHub PR을 활용
- 하나의 Jira Issue를 브랜치로 생성하여 작업한 뒤, PR을 통해 merge하는 GitHub Flow에 적합하다고 판단
GitHub PR을 열면, 최소 한 명의 팀원 승인이 있어야 main으로 merge 가능
실행 결과
- 리뷰 책임감 부재
- 코드 리뷰 승인이 늦어지는 상황(2일 이상 소요)으로 인해 작업 흐름에 지장이 발생
- 코드 리뷰 항목의 명확성 부족
- 단순히 코드 양식과 같은 사소한 부분만 지적되거나, 코드 리뷰 중 새로운 기능 추가 요청이 발생하는 등 코드 품질 향상에 집중하지 못했음
개선 사항
코드 리뷰 항목 구체화
- 중점 논의 항목 설정
- 코드 재사용성, 가독성, 효율성, 버그 여부에 대한 논의에 초점을 맞췄음
- 자동화 가능한 코드 양식 문제는 PR 생성 전에 처리하도록 규정
- 자동화 도구 활용
- GoogleStyle 기반으로 IntelliJ Reformat Code 기능을 사용해 팀의 코드 스타일을 통일
- Indent를 기존 2에서 4로 변경
- 한 줄 주석의 경우 길이를 제한하지 않도록 수정
- IntelliJ Commit Checks를 통해 코드 정렬이 자동으로 적용되도록 설정하여 작업 누락 가능성을 방지 담당 리뷰어 시스템 도입
- GoogleStyle 기반으로 IntelliJ Reformat Code 기능을 사용해 팀의 코드 스타일을 통일
- 각 스프린트마다 담당 리뷰어를 지정하여 리뷰 요청과 수행 과정을 명확히 했음
- 리뷰 요청 후 24시간 내 리뷰 완료 규칙을 도입 결과: 모든 코드 리뷰가 24시간 이내에 완료되었으며, 작업 흐름이 원활해졌음
전체 코드 공유 방식 개선
- 시행착오
- 모든 PR에 대해 팀원 전원이 코멘트를 남기는 방식: 리뷰 내용이 실질적인 이해를 바탕으로 작성된 것인지 확인하기 어려웠음
- 3명씩 그룹화하여 실시간으로 코드 리뷰를 진행: 코드 이해도는 높아졌으나, 반복적인 미팅으로 인해 높은 비용(시간 및 노력)이 발생
- 최적화된 방식
- 코드 리뷰는 담당 리뷰어와 1:1로 원격 동기식 방식으로 진행하도록 변경
- 매 스프린트마다 한 번씩 오프라인에서 전체 팀원이 모여 주요 PR에 대해 설명하는 시간을 가지며 코드 공유를 강화
최종 제안
- 자동화 도구 활용
- 코드 스타일 통일 및 PR 생성 전 자동화 가능한 작업을 도구로 처리해 코드 리뷰의 본질인 품질 향상에 집중
- 효율적인 담당 리뷰어 시스템 운영
- 리뷰어를 명확히 지정하고, 리뷰 요청 및 수행 기한을 지속적으로 준수하여 코드 리뷰 과정을 체계적으로 유지
- 효율적인 코드 공유 방법 도입
- 실시간 코드 리뷰는 담당 리뷰어와의 1:1 방식으로 진행하여 비용을 최소화
- 전체 코드 공유는 매 스프린트마다 오프라인에서 주요 PR에 대해 팀 단위로 논의하는 시간을 확보함으로써 팀원 간 이해도를 높임
GitHub Workflow 문제점
- 간단한 수정사항 반영의 어려움
- 볼륨 조절이나 수치 조정과 같은 코드의 기능 추가나 로직 변경이 아닌 변경사항은 반영이 어려웠음
- 이런 변경사항을 새로 이슈를 발행하고 브랜치를 생성하여 운영하는 것이 부담스러웠음 해결 방안
- 작업 분류 및 관리 체계 개선
- 새로운 기능 추가는 Jira Issue로 관리하고 리뷰 과정을 거침
- 간단한 수정사항이나 버그 수정은 GitHub Issue로 따로 관리
- GitHub Issue 템플릿을 활용하여 요구사항 명확화
- 여기서 생성한 브랜치는 리뷰 없이 PR을 통해 바로 merge 가능
- 코드 품질 보장 방안
- 간단한 수정사항도 최소한의 품질을 보장하기 위해 Build 및 Test 자동화 시스템 구축 결론
- 새로운 기능 추가는 Jira Issue를 통해 진행하고 반드시 리뷰를 거친 후 merge
- 개선사항 및 버그 수정은 GitHub Issue를 통해 진행하며 리뷰 없이 PR로 merge
- 단, 자동화된 Build 및 Test를 통과해야 merge 가능
Build 및 Test 자동화 문제점
- 모든 PR을 로컬 환경에서 Build하고 Test 코드를 실행하는 작업은 비효율적이고 반복적임 해결 방안
- Build Tool 선택
- Java의 Build Tool 중 Gradle을 선택
- Maven은 전통적이고 안정적이지만, Gradle은 최신 트렌드와 잘 맞음
- SETB가 새로운 기술을 빠르게 도입하는 조직 특성을 고려하여 Gradle을 선택
- Java의 Build Tool 중 Gradle을 선택
- 자동화 도구 활용
- GitHub Actions를 사용하여 Build 및 Testing 자동화
- PR 생성 시 Gradle Build 및 JUnit5 테스트를 실행하도록 설정
- 테스트와 Build를 통과해야만 merge 가능하도록 시스템 구축 실행 결과
- PR 생성 시 자동으로 Build 및 Test가 실행되며, 실패 시 merge 불가
- 코드 품질을 유지하면서도 반복 작업을 줄여 팀의 생산성이 향상됨 최종 제안
- Git Workflow
- 간단한 수정사항은 GitHub Issue로 관리하고 리뷰 없이 PR을 통해 빠르게 반영
- 새로운 기능 추가는 Jira Issue로 관리하고 리뷰를 통해 품질 검증
- Build 및 Test 자동화
- Gradle과 JUnit5를 기반으로 GitHub Actions에서 Build 및 Test 자동화
- PR 생성 시 자동화된 검증 단계를 통과해야 merge 가능