AI Slop에 맞서기: AI 생성 코드 스멜을 위한 CLI, aislop 소개
Claude Code, Cursor 등 AI 코딩 에이전트의 부상은 소프트웨어 작성 방식을 근본적으로 변화시켰습니다. 이러한 도구들은 테스트와 린팅을 통과하는 기능적인 코드를 생성할 수 있지만, 종종 "AI slop"라고 알려진 특정 유형의 기술 부채를 유발합니다. 이는 작동은 하지만, 숙련된 엔지니어가 결코 선택하지 않을 패턴으로 작성된 코드입니다. 예를 들어, 당연한 내용을 다시 설명하는 서술형 주석, 예외를 삼켜버리는 행위, 그리고 실제 로직을 가리는 불필요한 방어 기제 등이 있습니다.
이를 해결하기 위해, aislop은 코드베이스가 부패하기 전에 이러한 특정 "코드 스멜"을 포착하도록 설계된 결정론적(deterministic) CLI 도구로 등장했습니다. 많은 AI 기반 도구와 달리, aislop은 런타임 경로에서 LLM을 사용하지 않으므로 동일한 코드는 항상 동일한 점수를 생성합니다.
"AI Slop"이란 정확히 무엇인가?
AI slop은 버그에 관한 것이 아니라 품질과 유지보수성에 관한 것입니다. 이는 다음과 같은 몇 가지 뚜렷한 패턴으로 나타납니다:
- 서술형 과잉 주석 (Narrative Over-commenting): 코드가 왜 그렇게 동작하는지가 아니라, 코드가 무엇을 하고 있는지 설명하는 주석입니다 (이는 코드 자체에서 명확히 드러나야 합니다).
- 부적응형 결함 허용 (Maladaptive Fault Tolerance): 시스템이 실패해야 할 때 명확하게 실패하도록 두는 대신, 오류를 포착하고 경고를 로그로 남김으로써 "예외를 덮어버리는" 경향입니다.
- 불필요한 방어 기제 (Redundant Safeguards): 모든 값을 옵셔널로 취급하여 null coalescing operator와 방어적 fallback을 과도하게 사용하는 것으로, 종종 정상 경로(happy path)와 비정상 경로(unhappy path) 사이의 경계를 모호하게 만듭니다.
- 기계적 낭비 (Mechanical Waste): 환각(hallucinated)된 import, 중복된 helper function, 그리고 타입 시스템을 우회하는 TypeScript의
as any캐스트 등이 있습니다.
aislop의 작동 방식
코드를 리뷰하기 위해 토큰 비용이 많이 들고 비결정론적인 또 다른 LLM에 의존하는 대신, aislop은 Regex, Abstract Syntax Trees (AST), 그리고 기존의 산업 표준 도구들을 조합하여 사용합니다. 다음과 같은 6개의 결정론적 엔진을 병렬로 실행합니다:
| 엔진 | 초점 | 사용 도구 |
|---|---|---|
| Formatting | 스타일 일관성 | Biome, ruff, gofmt, cargo fmt, etc. |
| Linting | 언어별 이슈 | oxlint, ruff, golangci-lint, clippy, etc. |
| Sloppiness | AI 특유의 패턴 | 서술형 주석, TODO stub 등을 위한 커스텀 규칙 |
| Code Quality | 복잡도 및 데드 코드 | Knip, function/file size limits, deep nesting. |
| Security | 취약점 | Dependency audits, eval/innerHTML checks. |
| Architecture | 구조적 규칙 | 커스텀 import bans 및 layering rules. |
개발자 워크플로우로의 통합
aislop의 가장 강력한 기능 중 하나는 개발자와 AI 에이전트 사이의 피드백 루프에 직접 통합될 수 있다는 점입니다.
1. 품질 게이트 (The Quality Gate)
.aislop/config.yml 파일에 failBelow 임계값을 구현함으로써, 팀은 AI slop을 CI 실패로 처리할 수 있습니다. 만약 에이전트의 PR이 코드베이스 점수를 특정 임계값(예: 80/100) 미만으로 떨어뜨린다면, 빌드는 실패하며, 에이전트(또는 사람)가 slop을 정리하도록 강제합니다.
2. 에이전트 핸드오프 (Agent Handoff)
aislop이 기계적으로 수정할 수 없는 문제(예: 잘못 설계된 retry mechanism)를 식별하면 직접적인 핸드오프를 제공합니다. npx aislop fix --claude 또는 npx aislop fix --cursor와 같은 명령어를 통해 진단 정보를 에이전트에게 다시 전달하여, AI에게 "이곳에 slop이 남아있습니다. 이제 이를 수정하십시오."라고 효과적으로 말합니다.
3. 실시간 훅 (Real-time Hooks)
Claude Code와 같은 에이전트를 사용하는 경우, aislop can install hooks가 매 편집 후 실행되도록 설치할 수 있습니다. 이는 에이전트가 자신의 sloppiness를 실시간으로 통지받는 즉각적인 피드백 루프를를 생성하여 기술 부채의 축적을 것을 방지합니다.
커뮤니티의 관점과 과제
이 도구는 속도와 결정론적 특성으로 찬사를 받고 있지만, 커뮤니티에서는 AI slop을 탐지지하는 데 있어 몇 가지 과제를 제시하고 있습니다:
- 오탐 (False Positives): 일부 사용자는 특정 라이브러리 메서드(예: SQLModel의
exec)가 위험한 내장 함수(예: Python의exec())로 오해받을 수 있다고 보고했습니다. - "인간의 slop" 역설 (The "Human Slop" Paradox): 일부 개발자들은 이 도구가 가끔씩 인간이 작성한 코드를 AI slop으로 표시하는 경우가 있는 반면, some truly lazy AI code가 slip through 하는 경우가 있다고 언급했습니다. 이는 인간과 AI의 "sloppiness"가 종종 겹친다는 것을 시사합니다.
- 로직의 미묘함 (The Nuance of Logic): 한 사용자가 언급했듯이, AI는 종종 "happy path"와 "unhappy path" 사이의 구분을 어려워하며, 너무 안전해서 오히려 쓸모없는 코드를 생성합니다. 이는 서술형 주석보다 결정론적 linter가 포착하기 더 어려운 패턴입니다.
최종 생각
에이전트 기반 소프트웨어 엔지니어링의 시대로 나아가면서, 병목 현상은 더 이상 코드 생성 속도가 아니라 코드 리뷰 속도입니다. aislop과 같은 도구는 리뷰의 부담을 인간에서 결정론적 게이트로 옮겨, AI 생성의 효율성이 장기적인 유지보수성을 희생시키지 않도록 보장합니다.