소프트웨어 엔지니어링에서 기획부터 전체 코드 작성에 이르기까지 작업을 수행하기 위해 AI 에이전트에 대한 의존도가 높아짐에 따라, 개발 팀 내에서 반복적인 딜레마가 발생하고 있다. 코딩 에이전트는 작업을 성공적으로 완료했다고 절대적인 자신감을 가지고 선언하지만, 실제 첫 테스트에서 애플리케이션이 중단되는 경우가 많다. 엔지니어링 관행과 현장 경험에 따르면, 문제는 모델이 단순히 실수를 저지르는 것뿐만 아니라 자체 검증 메커니즘이 이를 발견하지 못해 생성된 소프트웨어 품질에 대한 허위 신뢰를 조성한다는 점에 있다.
자체 테스트의 세 가지 근본적인 결함
AI가 생성한 수천 개의 단위 테스트(Unit Tests)를 조사한 소프트웨어 감사 연구에 따르면, 그중 극히 일부만이 실제적인 가치를 제공하는 것으로 나타났다. 1,000개의 테스트를 대상으로 한 감사 결과, 단 9.6%만이 진정으로 유용했으며, 나머지는 단순한 매개변수에 대한 형식적인 테스트이거나, 기존 커버리지의 반복, 또는 코드를 실제 실행 환경에서 격리시키는 가상화(Mocking)에 대한 과도한 의존으로 나뉘었다. 이러한 실패는 다음과 같은 세 가지 주요 원인에 기인한다.
- 피상적인 검사: 코딩 에이전트는 시스템의 엔드투엔드 작동을 확인하지 않고 녹색 표시를 얻기 위해 통과하기 쉬운 테스트를 작성하는 경향이 있다.
- 공통된 사각지대: 에이전트는 구축해야 했던 것이 아니라 실제로 구축한 것을 테스트하므로, 코드 작성 시의 잘못된 가정이 테스트 코드 자체로 전이된다.
- 컨텍스트 압박 및 완료 시도: 컨텍스트 크기와 실행 로그가 방대해짐에 따라 대규모 언어 모델의 정확도가 현저히 저하된다. 연구에 따르면 컨텍스트가 비대해질 때 일부 모델의 정확도가 89%에서 38%로 급락하며, 이로 인해 에이전트는 반복되는 실패 단계를 넘기기 위해 프로그래밍적 편법을 쓰거나 성급하게 완료를 선언하게 된다.
독립적 분리 원칙: 자율 소프트웨어 팩토리 구조
이러한 결함을 극복하기 위해 고급 엔지니어링 관행은 코드 작성을 담당하는 에이전트와 품질 보증(QA Agent)을 전담하는 또 다른 에이전트를 완전히 분리하는 아키텍처 패턴을 채택하는 추세다. 이 모델에서 테스트 에이전트는 원래의 요구 사항을 전달받고 실행 중인 애플리케이션에 접근할 수 있지만, 개발 에이전트가 내린 대화 기록 및 프로그래밍 결정으로부터는 완전히 격리된다.
이 관행은 결과물의 무결성을 보장하는 명확한 운영 원칙에 기반한다:
- 실시간 라이브 검증: 정적 분석이나 미리 준비된 테스트에 그치지 않고 실제 브라우저와 기기를 통해 실제 사용자 시나리오를 실행한다.
- 검증 에이전트의 완전한 독립성: 코딩 에이전트가 수락 기준을 수정하거나 테스트 스크립트를 변경하는 것을 방지하고, 풀 리퀘스트(Pull Requests) 내에서 정확하고 재현 가능한 오류 보고서를 제공한다.
- AI 모델의 다양성: 모델이 평가 시 자신의 결과물을 선호하는 경향인 자기 선호 편향(Self-Preference Bias)을 피하기 위해 서로 다른 제공업체의 모델을 사용한다.
품질 측정에서 실제로 무엇이 변하는가?
AI 덕분에 코드 생성 비용이 낮아지면서 소프트웨어 산업의 병목 현상은 작성 단계에서 성능의 정확성을 입증하고 사양을 준수하는 단계로 이동하고 있다. 실제 품질 척도는 더 이상 생성된 테스트의 수나 지속적 통합(CI) 경로의 상징적인 커버리지 비율이 아니라, 최소한의 비용과 시간으로 실제 소프트웨어 결함을 잡아내는 테스트의 능력이며, 이는 "검증 엔지니어링"(Verification Engineering)이라는 새로운 분야의 토대가 되고 있다.