개발 요구사항을 분석하는 방법

들어가며

사실 기술에 대한 글은 많지만, 개발자가 어떻게 업무를 분석하고 작게 나눠야 하는지에 대한 글은 상대적으로 적다.
이 글은 업무 분석에 어려움을 겪는 주니어 개발자분들을 위해 작성됐다.

신입 땐 업무를 어떻게 분석하고 파악하고 구현해야 하는지를 잘 알지 못했다.
무작정 만들어본 뒤 빠진 케이스를 뒤늦게 추가하거나 요구사항 분석을 잘못해 구현 방향이 잘못되어 구현 자체를 다시 한 적도 있었다.
재작업을 하게 됨에 따라 시간도 오래 걸렸고, 급하게 구현하면서 품질을 어느 정도 포기하기도 했다.
이러한 일련의 과정에서 어떻게 하면 이러한 비효율을 줄이고 올바른 기능을 제대로 만들 수 있는지 고민해왔었는데, 답을 내기가 쉽지 않았다.
그도 그럴게, 구현하기전에 모든 문제를 정의하고 설계하는건 굉장히 어렵다. 불투명한 요구사항을 구체화하며 모든 케이스를 정의하는건 어려운 일이다.
그렇다고 해서, 대략적으로 파악하고 구현을 시작하면 종종 예상치 못한 문제에 맞닥뜨리게 된다.
그러한 고민 과정에서 동료의 피드백이 있었고 이를 바탕으로 업무 분석하는 방법을 정의하게 됐다.
지금은 주어진 요구사항이 복잡한 경우 이 포스팅에서 설명할 방법을 사용하여 해결하고 있으며, 이러한 노력으로 시간의 손실은 줄이며 어느 정도 내가 원하는 ‘올바른 기능을 제대로’ 만들 수 있게 됐다.

요구사항을 분석하고 설계하는 방법

처음에 기능 구현 요구사항을 받으면 문제가 하나의 큰 덩어리처럼 느껴지고 어느 부분부터 어떻게 접근해야 할지 감이 잘 오지 않는다.
숙련도가 높은 시니어라면, 보자마자 어떤 지뢰가 있고 어떻게 해결해야 목적을 달성할 수 있는지 알 것이다.
하지만 나는 어디에 어떤 지뢰가 있고, 어떻게 해결해야 하는지 하나하나 고민하고 확인해봐야 했다.
다음은 내가 사전 분석과 설계 구현 정의를 위해 나에게 던지는 질문이다.
(사용자는 포괄적인 의미로 API 혹은 모듈에서 공개한 기능을 사용하는 클라이언트를 의미한다)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
- 요구사항 분석
- 요구사항 정의는 어떤가?
- 요구사항에 누락된 부분은 없는가?
- 현재 시스템이 요구사항을 수용할 수 있는가?
- 요구사항의 전제조건은 어떻게 되는가?
- 시간 비용은 어떤가?
- 설계 할 때
- 사용자 예상 시나리오는 어떻게 되는가?
- 동시성 문제가 있는가?
- 사용자는 어떤 데이터를 기대하고, 어떻게 사용할까?
- 이 정보가 정말 사용자에게 필요한 정보인가?
- 이 정보에 커플링이 생기면 미래에 어떤 일이 생길까?
- 시스템 내부 리펙토링시 발목을 잡지는 않을까?
- 인터페이스
- 사용자를 생각해서 최대한 알기쉽게, 간결하고 깔끔하게 만들어졌는가?
- 작업하기 전에 인터페이스는 설계해야한다
- 만약 인터페이스가 어그러지면 다시 고민하고 리팩토링 해야된다
- 구현할 때
- 이 데이터의 속성은 어떤가? 어떤 특성을 갖고 있는가?
- 어떻게 해야 이 데이터를 적절히 제공할 수 있는가?
- 이 데이터를 사용하는 클라이언트는 누구인가? 클라이언트에게 어떤 데이터를 제공해야 하는가
- 이 API를 사용하는 사용자는 이 API를 보고 어떤 역할과 행동을 하는지 예측하기가 쉬운가?
- 불필요한 정보를 외부에 공개하지 않았나?
- 너무 많은 책임을 갖고 있진 않은가?
- 적절한 예외를 주는가?
- 이 기능은 어떤 행동을 하고 어떤 책임이 있는가?
- 어떤 데이터가 주어지고 어떻게 처리하며 어떤 결과를 줘야 하는가?
- 참조 기능은 어떤 스펙을 갖고 있는가, 만약 예외를 던진다면 이 기능내에선 그 에러를 어떻게 처리해야하는가?
- 이 기능 요구사항과 전제 조건(accaptance criteria) 는 뭔가?
- 요구사항을 명확하게 이해했는가?
- 이 기능의 시나리오가 어떤가?
- 클라이언트에 의존성을 갖고있는가?
- 이 기능의 요구사항과 예외가 인터페이스에 잘 표현이 되었는가?
- 다른 프로그래머도 유지보수 할 수 있도록 이해하기 쉬운 코드를 작성했는가?
- 작업 계획은 어떤가?
- 기존 구조를 파악했는가?
- 작업 개요를 식별하고 작성했는가
- 작업은 충분히 적절하게 쪼개졌는가?

위 질문에 맞춰 요구사항에 대한 분석과 설계가 끝났다면 설계에 맞춰 작업계획을 아주 작게 나눈다.
보통 작업 계획 항목대로 PR을 나누게 된다.

  • 참고 (PR이 너무 클 경우 리뷰어에게 피로감을 줄 수 있으므로 PR 사이즈는 4~500줄이 넘지 않는 선으로 유지하는 게 좋다)

작업 계획까지 다 정의했다면 동료와 이러한 컨텍스트를 공유한다. 이 크로스 체킹 과정에서 잘못된 방향 혹은 누락된 부분, 더 좋은 방법등에 관해 얘기를 나눌 수 있고 올바른 구현을 할 수 있게 된다.

하지만 이 모든 원칙이 늘 지켜져야만 하는 건 아니다.
원칙이 지금 상황과 맞지 않는다 판단되면 원칙을 무시할 수도 있다. 가장 중요한건 현재 상황에 가장 적합한 해결책이다.