코드는 평가하기 가장 쉬우면서도 가장 어려운 출력이야
쉬운 이유는 직접 실행할 수 있기 때문이야. 어려운 이유는 코드가 실행된다는 사실만으로는 충분하지 않기 때문이지. 테스트를 통과한다고 해서 좋은 코드라는 뜻은 아니야. 세 가지 품질 계층을 모두 살펴야 해.
계층 1: 실행 정확성
생성된 코드를 실행하고 단위 테스트 결과를 확인해. pass@k는 k개 표본 가운데 하나 이상이 모든 테스트를 통과할 확률을 측정해. HumanEval과 SWE-bench가 이 방식을 사용해.
계층 2: 코드 품질
- 정적 분석 — 린터, 유형 검사기, 보안 검사기를 사용해. Bandit과 Semgrep이 대표적이야.
- 스타일 — Ruff, Prettier, Black으로 확인해. 버그를 직접 찾지는 않지만 "사람이 이 PR을 받아들일까?"를 판단하는 신호가 돼.
- 복잡도 — 순환 복잡도와 중첩 깊이를 측정해.
- 문서화 — 문서 문자열, 주석, 유형 주석을 확인해.
계층 3: 테스트 너머의 동작 정확성
생성된 코드가 테스트를 통과하더라도 실제 의도와 일치하는지 확인해야 해. LLM 판정 모델로 구현과 자연어 명세를 비교할 수 있어. "올바르게 보이지만 실제로는 틀린" 버그 대부분이 이 계층에 숨어 있어.
원칙: 생성된 코드는 항상 격리 환경에서 실행해. 린터도 반드시 실행하고, 판정 모델로 구현과 의도가 일치하는지도 확인해. 계층 하나라도 건너뛰면 잡을 수 있었던 버그가 배포될 수 있어.
코드에 특화된 안전성 점검
생성된 코드에는 명령 주입, SQL 주입, 하드코딩된 비밀값, 안전하지 않은 역직렬화, 안전하지 않은 의존성 문제가 있을 수 있어. Semgrep, Bandit, npm audit 같은 보안 검사를 코드 평가에 포함해야 해. 나중에 덧붙일 일이 아니야.