--- name: "systematic-debugging" description: "버그, 테스트 실패, 예기치 않은 동작을 체계적으로 진단합니다. 수정안을 제시하기 전에 반드시 근본 원인을 먼저 찾아야 할 때 호출합니다." --- # 체계적 디버깅 무작위 수정은 시간을 낭비하고 새 버그를 만듭니다. 빠른 땜질은 증상만 가릴 뿐입니다. 이 스킬의 핵심은 **수정 전에 반드시 근본 원인을 찾는 것**입니다. ## 철칙 근본 원인 조사 없이 수정하지 않습니다. 다시 말해, 1단계를 끝내지 않았다면 수정안 제시는 아직 허용되지 않습니다. ## 언제 사용할지 다음과 같은 모든 기술 문제에서 사용합니다. - 테스트 실패 - 운영 중 버그 - 예기치 않은 동작 - 성능 문제 - 빌드 실패 - 통합 문제 특히 아래 상황에서 반드시 사용합니다. - 시간이 촉박할 때 - "일단 이것만 빨리 고치면 될 것 같을 때" - 이미 여러 수정안을 시도했을 때 - 이전 수정이 실패했을 때 - 문제를 완전히 이해하지 못한 상태일 때 다음 상황에서도 생략하지 않습니다. - 문제가 너무 단순해 보일 때 - 급하게 고쳐 달라는 압박이 있을 때 - 지금 보이는 증상만 없애면 될 것처럼 느껴질 때 ## 4단계 프로세스 ### 1단계: 근본 원인 조사 수정 전에 반드시 아래를 수행합니다. - 오류 메시지, 경고, 스택 트레이스를 끝까지 읽습니다. - 재현 절차를 명확히 만들고, 반복 재현 가능한지 확인합니다. - 최근 변경 사항, 설정 차이, 의존성 변경, 환경 차이를 확인합니다. - 다중 컴포넌트 시스템이라면 경계마다 로그와 계측을 추가해 어디서 깨지는지 증거를 모읍니다. - 호출 스택이 깊다면 잘못된 값이 어디서 시작됐는지 거꾸로 추적합니다. - 재현이 안정적이지 않다면, 추측 대신 로그와 관찰 지점을 늘립니다. - 레이어가 여러 개인 시스템이라면 각 경계에서 입력, 출력, 상태 전파를 확인합니다. ### 2단계: 패턴 분석 - 같은 코드베이스에서 정상 동작하는 유사 사례를 찾습니다. - 참조 구현이 있다면 끝까지 읽고 패턴을 정확히 이해합니다. - 정상 사례와 문제 사례의 차이를 작은 것까지 모두 나열합니다. - 필요한 설정, 환경, 전제 조건을 파악합니다. - "이 정도 차이는 중요하지 않겠지"라고 넘기지 않습니다. ### 3단계: 가설과 검증 - "원인은 X이며 이유는 Y다"라는 단일 가설을 명확히 적습니다. - 가설을 검증할 수 있는 최소 변경만 적용합니다. - 한 번에 변수 하나만 바꿉니다. - 실패하면 수정안을 겹쳐 쌓지 말고 새 가설로 돌아갑니다. - 모르는 것은 모른다고 인정하고 추가 조사 또는 도움 요청을 합니다. 이 단계의 핵심은 과학적 방법입니다. - 한 번에 하나의 가설만 세웁니다. - 한 번에 하나의 변수만 바꿉니다. - 실패하면 더 많은 수정으로 덮지 않고, 얻은 새 증거를 바탕으로 다시 분석합니다. ### 4단계: 구현 - 먼저 실패하는 테스트나 최소 재현 케이스를 만듭니다. - 확인된 근본 원인만 겨냥해 한 번에 한 수정만 적용합니다. - 테스트가 통과하는지, 다른 것이 깨지지 않았는지 검증합니다. - 수정이 실패하면 즉시 멈추고 다시 1단계로 돌아갑니다. - 세 번 이상 실패했다면 개별 버그가 아니라 구조적 문제일 가능성을 의심합니다. 세 번 이상 수정이 연속 실패했다면 아래를 질문합니다. - 우리가 증상을 계속 쫓고 있지는 않은가 - 현재 구조 자체가 문제를 유발하고 있지는 않은가 - 고칠 문제가 아니라 패턴을 바꿔야 하는 상황은 아닌가 ## 중단 신호 다음 생각이 들면 멈추고 다시 1단계로 돌아갑니다. - 일단 빨리 고치고 나중에 조사하자 - X를 바꿔보면 될 것 같다 - 여러 개를 같이 바꾸면 빠를 것 같다 - 테스트는 나중에 쓰자 - 완전히 이해는 못 했지만 아마 맞을 것이다 - 한 번만 더 고쳐보자 - 여기 문제들은 대충 이런 것들이다 - 로그 없이 감으로 수정 방향을 정하자 - 여기저기 같이 바꾸면 하나쯤 맞을 것이다 이 신호들은 대부분 조사보다 추측이 앞서고 있다는 뜻입니다. ## 안티 패턴 - 증상만 감추는 빠른 땜질 - 여러 수정안을 한 번에 넣는 방식 - 재현 없이 감으로 고치는 방식 - 비교 대상 없이 현재 코드만 들여다보는 방식 - 세 번 이상 실패했는데도 구조를 의심하지 않는 방식 ## 핵심 원칙 - 증상이 아니라 원인을 수정합니다. - 계측과 증거 없이 추측하지 않습니다. - 한 번에 하나만 바꿉니다. - 재현, 비교, 검증이 없는 수정은 완료가 아닙니다. - 여러 번 실패하면 구조 자체를 의심합니다. ## 기대 결과 이 스킬을 적용한 결과는 다음을 만족해야 합니다. - 문제의 재현 절차가 설명 가능해야 합니다. - 근본 원인을 뒷받침하는 증거가 있어야 합니다. - 수정안은 하나의 원인에 대응해야 합니다. - 수정 후에는 재현 테스트 또는 검증 절차가 통과해야 합니다.