Rain Lag

한 문단 문제 정의: 짧은 글로 코딩 세션이 헤매지 않게 만드는 법

간단한 한 문단짜리 문제 정의만으로도 목적 없이 떠도는 코딩 세션을 명확하고 생산적인 시간으로 바꾸어, 구체적인 결과를 만들어내는 방법.

한 문단 문제 정의: 짧은 글로 코딩 세션이 헤매지 않게 만드는 법

"잠깐만 코드 좀 보자" 하고 자리에 앉았다가, 두 시간이 지나도록 딱히 내놓을 만한 결과가 없었던 적이 있다면 혼자가 아니다. 대부분의 개발자는 실력이나 노력 부족 때문에 실패하지 않는다. 무엇을 달성하려는지 명확히 모른 채 타이핑부터 시작해서 시간을 낭비할 뿐이다.

이걸 아주 간단히 고치는 방법이 있다. 시작하기 전에 짧은 문단 하나만 써라.

스펙 문서도 아니고, 티켓도 아니고, 10페이지짜리 설계 문서는 더더욱 아니다.

문제와 그 중요성, “완료”의 기준, 그리고 접근 방식을 한 문단 안에 분명하게 적는 것이다.

이 한 문단짜리 문제 정의는 가벼운 방법론처럼 동작한다. 과정은 최소화하면서도, 명료함은 극대화한다. 그리고 이 정도면 대부분의 코딩 세션이 이리저리 헤매는 걸 막기에 충분하다.


핵심 아이디어: 코드보다 글이 먼저다

대부분의 코딩 세션은 이렇게 시작된다.

“검색 성능을 좀 개선해야겠네… 일단 코드부터 좀 훑어보자.”

커밋이 스무 개쯤 쌓였을 때쯤이면, 쿼리를 건드리고, 변수 이름을 고치고, 모듈을 반쯤 리팩터링하고, 심지어 애초에 필요 없던 디버그 대시보드를 만들기 시작했을 수도 있다.

이제 이와 비교해 보자.

문제 정의:

1만 개가 넘는 레코드를 대상으로 하는 검색 쿼리는 결과가 반환되는 데 3–4초가 걸리고 있으며, 이로 인해 제품에서 눈에 띄는 지연이 발생하고 사용자 불만이 발생하고 있다. 앞으로 90분 안에 /search 엔드포인트에서 상위 3개 고트래픽(use case)에 대해 평균 응답 시간을 800ms 미만으로 줄이고 싶다. 이를 위해 (1) 가장 느린 쿼리를 식별하고, (2) 인덱스 누락 또는 비효율적인 필터가 근본 원인인지 확인하며, (3) 결과 정확도는 유지한 채 성능을 개선할 수 있는 최소한의 변경만 구현하고 테스트한다.

이 문단은 그럴듯하게 들리는 수준을 넘어서, 당신의 뇌를 방향 잡아준다. 이 문단만으로도 다음을 알려 준다.

  • 무엇을 고치는지
  • 왜 중요한지
  • 무엇이 “좋은 결과”인지
  • 어떻게 공격할 것인지

헤매는 대신, 실행하게 된다.


한 문단 문제 정의의 구조

문제 정의는 2–5분 안에 쓸 수 있을 만큼 짧으면서도, 작업을 이끌어 줄 만큼 풍부해야 한다. 예를 들면 이런 구조다.

이번 코딩 세션에서 나는 [이 구체적인 문제]를 해결하고 싶다. 이 문제는 [맥락 / 영향] 때문에 중요하다. 나는 근본 원인이 아마 [가설]일 것이라 생각하며, [구체적인 결과]를 달성했을 때 이 작업이 끝났다고 보겠다. 나의 계획은 [집중된 접근법/단계]를 따르되, [명백한 스코프 크리프(범위 확장) 유혹]은 피하는 것이다.

이제 이를 핵심 요소로 나눠 보자.

1. 구체적인 코딩 문제를 명확히 정의하기

피해야 할 표현:

  • “온보딩 플로우 개선하기”
  • “인증(auth) 작업하기”

이건 문제라기보다는 테마에 가깝다.

대신, 하나의 분명한 이슈로 좁혀라.

  • “사용자가 유효하지 않은 이메일로 회원가입 폼을 제출해도 대시보드로 진입할 수 있다.”
  • “장바구니에 아이템이 50개를 초과하면 createOrder 엔드포인트가 500 에러를 반환한다.”

문제가 충분히 구체적인지 확인하는 기준:

  • 하나의 액션이나 작은 테스트 시나리오로 재현·검증이 가능하다.
  • 다른 개발자가 읽었을 때, 어디서부터 살펴볼지 감이 온다.

2. 맥락 추가하기: 왜 이 문제가 중요한가

맥락 없이 문제만 보면, 기술적인 토끼굴(끝없이 파고드는 함정)에 빠지기 쉽다.

1–2문장으로 다음 질문에 답해 보라.

  • 이 문제가 사용자, 동료, 비즈니스에 어떤 영향을 주는가?
  • 이 문제가 더 큰 프로젝트, 스프린트, 제품 방향 속에서 어떤 위치를 차지하는가?

예를 들어:

  • “이 버그는 모바일에서 결제를 완료하지 못하게 만들어, 매출에 직접적인 타격을 준다.”
  • “이번 리팩터링을 통해서만 다음 분기에 여러 결제 제공업체를 지원할 수 있다.”

맥락을 적어 두면 오버 엔지니어링을 막아 준다. 문제의 진짜 중요도에 맞춰서 자연스럽게 해결책의 수준과 범위를 조정하게 된다.

3. 증상이 아닌 근본 원인을 보려 하기

문단에는, 확신이 없어도 좋으니 근본 원인에 대한 가설을 적어라.

  • 증상: “대용량 프로젝트를 열면 UI가 멈춘 것처럼 보인다.”
  • 가설: “프로젝트 데이터를 한 번에 모두 가져오고 있고, pagination이나 lazy-loading을 하지 않고 있을 수 있다.”

근본 원인을 이름 붙이는 순간:

  • 코드베이스를 아무 데나 눌러 보는 대신, 생각을 정리한 후 시도하게 된다.
  • 가설이 틀렸다는 걸 빨리 확인하고, 여기저기 반쯤 고쳐 놓는 대신 다음 아이디어로 자연스럽게 넘어갈 수 있다.

정답을 맞히는 것이 목적이 아니다. 의도적으로 움직이는 것이 목적이다.

4. 이상적인 결과를 구체적으로 묘사하기

“좀 더 나아지게 만들기”는 결과가 아니다.

좋은 결과는, 측정 가능하거나 적어도 간단한 확인으로 검증 가능해야 한다.

  • “상위 3개 엔드포인트의 평균 응답 시간을 약 2초에서 700ms 미만으로 줄인다.”
  • “사용자가 ‘결제’ 버튼을 더블 클릭해도 중복 청구서가 생성되지 않도록 한다.”
  • “사용자가 50MB 이미지를 업로드해도 요청이 타임아웃 나지 않도록 보장한다.”

“완료”가 어떤 상태인지 설명할 수 없다면, 아직 코드를 짤 준비가 되지 않은 것이다. 아직은 문제 정의 단계에 있는 셈이다.

5. 집중된 해결 방향 또는 접근법 제안하기

여기서 말하는 건 상세 설계서가 아니다. 가벼운 계획 정도로 생각하자.

  • “먼저 로컬에서 버그를 재현하고, 실패하는 테스트를 추가한 뒤, OrderService의 로직을 수정하겠다.”
  • “가장 느린 쿼리 3개를 프로파일링하고, 인덱스를 추가해 본 뒤, 애플리케이션 로직을 건드리기 전에 다시 측정해 보겠다.”

대충이라도 계획을 적어 두면:

  • 세션 중간중간 내릴 결정이 줄어든다.
  • 서로 관련 없는 접근법 사이를 이리저리 왔다 갔다 하지 않게 된다.
  • 자연스럽게 멈출 수 있는 지점을 만들기 쉽다.

그리고 처음 세운 경로가 안 통하면, 문단을 업데이트하면 된다. 이 문단은 계약서가 아니라 살아 있는 가이드다.

6. 하나의 작은 방법론으로 취급하기

한 문단 문제 정의의 좋은 점은, 과정 지옥 없는 과정이라는 것이다.

  • 폼도 없고,
  • 삼중으로 채워야 하는 템플릿도 없고,
  • 타이핑 한 번 할 때마다 30분짜리 그루밍 미팅이 필요한 것도 아니다.

그냥 아래 다섯 가지를 적을 뿐이다.

  1. 문제
  2. 맥락
  3. 근본 원인에 대한 가설
  4. 원하는 결과
  5. 제안하는 접근법

…이걸 5–10줄 정도의 텍스트로 적으면 끝이다.

이 정도 구조만으로도 작업을 충분히 이끌 수 있고, 코드 작업을 시작할 때마다 매번 써도 부담이 되지 않을 만큼 가볍다.

어디에 적어 둘까?

  • 스크래치 파일이나 노트 상단
  • 수정할 주요 파일의 최상단 주석
  • 커밋 메시지 초안에
  • 티켓이나 PR 설명란에

작업하는 동안 자연스럽게 눈에 띄는 곳이면 어디든 좋다.

7. 스코프 크리프에 맞서는 방패로 쓰기

스코프 크리프(scope creep, 작업 범위가 슬쩍슬쩍 넓어지는 현상)는 겉보기에는 생산성처럼 느껴진다.

  • “여기까지 온 김에 이 함수도 좀 정리하지 뭐.”
  • “이 버그도 관련 있어 보이네, 그냥 이것도 같이 고치자.”
  • “이 컴포넌트, 이번에 아예 범용적으로 다시 설계해 두면 좋을 것 같은데?”

그러다 보면, 세션의 목표가 세 번은 바뀌어 있다.

한 문단 문제 정의는 자기 자신과 맺는 범위 계약이다.

  • 새로운 일을 떠맡으려 할 때, 이렇게 묻자: “이게 내가 앞에서 쓴 문단 범위 안에 들어가나?”
  • 아니라면, 다음 둘 중 하나를 택한다.
    • 나중 작업으로 따로 적어 두거나,
    • 문단을 명시적으로 다시 쓰고, 방향 전환의 비용을 스스로 인정하거나.

문단을 다시 쓰는 행위 자체가, 어영부영 새 방향으로 떠밀려가는 대신, 방향 전환의 대가를 의식하게 만들어 준다.


전체 예시 하나

60–90분짜리 코딩 세션을 시작하기 전에 한 문단 문제 정의를 쓴다면, 대략 이런 모습일 수 있다.

문제 정의(오늘 3–4pm):

/invoices 페이지는 인보이스가 200개를 넘는 고객의 경우 로딩에 4–6초가 걸리고 있으며, 이로 인해 지원팀의 업무 플로우에서 타임아웃이 발생하고, 우리에게 가장 중요한 고가치 고객들에게 좋지 않은 경험을 주고 있다. 나는 근본 원인이 전체 인보이스 상세(라인 아이템 포함)를 한 번에 로딩하고 있기 때문이며, 인보이스마다 N+1 형태의 DB 호출이 여러 번 일어나고 있을 가능성이 높다고 생각한다. 이번 세션은 (1) 지연의 정확한 원인을 찾고, (2) 인보이스가 최대 500개인 계정에 대해 로딩 시간을 1.5초 미만으로 안정적으로 줄이되, 페이지의 눈에 보이는 동작은 바뀌지 않도록 하는 변경을 적용하면 성공한 것으로 보겠다. 나의 접근법: 스테이징 환경에서 해당 엔드포인트를 프로파일링하고, 쿼리 패턴을 확인한 뒤, 필요하다면 요약된 인보이스 쿼리와/또는 pagination을 도입하고, 간단한 성능 회귀 테스트를 추가한다. 이번 세션에서는 인보이스 UI를 재설계하거나, 관련 없는 빌링 로직은 건드리지 않는다.

이 문단만 읽어도 이미 다음을 알고 있다.

  • 무엇을 할지
  • 왜 중요한지
  • 언제 끝난 것으로 볼지
  • 무엇을 의도적으로 하지 않을지

이 정도의 명료함이 있으면, 앞으로 한 시간을 쓰는 방식이 달라진다.


오늘 바로 써먹는 방법

한 문단 문제 정의를 실제로 써 보기 위해, 다음 코딩 블록에서 이 간단한 루틴을 따라 해 보자.

  1. 에디터를 열기 전에, 먼저 스크래치패드를 연다.
  2. 3분 동안 다음을 채운다.
    • 문제
    • 맥락
    • 근본 원인 가설
    • 원하는 결과
    • 접근법 + 이번 세션에서 하지 않을 것
  3. 작업하는 동안 그 문단이 보이도록 유지한다.
  4. 일이 다른 데로 새기 시작하면, 둘 중 하나를 선택한다.
    • 원래 문단에 맞춰 다시 정렬하거나,
    • 아예 문단을 다시 쓰고, 방향 전환을 스스로 수용하거나.
  5. 끝나고 나서 짧게 리뷰한다. “내가 써 둔 결과를 실제로 달성했나?” 아니라면, 배운 내용을 반영해 문단을 업데이트한다.

일주일만 이렇게 해 보면 자연스럽게 느끼게 될 것이다.

  • 용도가 애매한, 반쯤 하다 만 브랜치가 줄어든다.
  • 커밋 메시지와 PR 설명이 훨씬 명확해진다. (사실상 문단에서 거의 가져다 쓰면 된다.)
  • 다음 날 작업을 재개할 때, 머릿속이 덜 혼란스럽다.

결론: 작은 글이 큰 지렛대가 된다

코딩 세션을 효과적으로 만들기 위해 거창한 프로세스가 필요한 건 아니다. 필요한 건 아주 작은 양의 글로 된 명료함이다.

한 문단짜리 문제 정의는 다음을 해낸다.

  • 구체적인 문제를 정의하고
  • 그 문제를 실제 맥락과 영향에 anchoring(고정)시키며
  • 근본 원인을 생각하게 만들고
  • “완료” 상태를 구체적으로 묘사하게 하고
  • 가벼운 수준의 계획을 제공하며
  • 스코프 크리프로부터 당신을 지켜 준다.

작지만 레버리지가 큰 습관이다. 다음 코딩 세션에서 “일단 시작해 보자”는 유혹을 잠깐 누르고, 먼저 한 문단을 써 보라. 그러면 코드는 당신의 말 뒤를 따라가게 될 것이다. 그 반대가 아니라.

한 문단 문제 정의: 짧은 글로 코딩 세션이 헤매지 않게 만드는 법 | Rain Lag