# AI 코딩: 자연어 대신 테스트로 대화하라

최근 AI에게 "이 기능 만들어줘"라고 명령하는 **바이브코딩(Vibe Coding)**이 주목받고 있다.

이 용어를 만든 안드레 카파시는 "가장 좋은 프로그래밍 언어는 영어가 될 것이다"라고 말하며, 자연어를 이용한 코딩 방식이 미래라고 설명했다.

그러나 나는 조금 다르게 생각한다.

자연어는 본래 **일상 대화를 위한 언어**이며, **정확한 명세를 표현하기엔 모호하다**.

같은 문장을 입력해도, AI 모델의 버전이나 문맥에 따라 결과가 달라지는 **비결정성(indeterminacy**)이 존재한다.

## 자연어 코딩의 한계

자연어로 AI에게 "로그인 기능 만들어줘"라고 하면, 어떤 결과가 나올까?

누구는 JWT 기반 로그인, 누구는 세션 로그인, 또 누구는 OAuth2를 구현할 수도 있다.

명령은 같지만, 결과는 다르다.

이처럼 자연어는 명세 언어로서 **불확실성**을 가지고 있다.

AI 코딩의 본질적인 문제는 바로 이 **불명확한 요구사항 표현**에 있다.

결국, 우리가 원하는 것은 "AI가 정확히 우리가 원하는 조건을 만족하는 코드"다.

**참조하면 좋은 글**

[LLMs bring new nature of abstraction](https://martinfowler.com/articles/2025-nature-abstraction.html)

## 테스트를 명령어로

그렇다면, **테스트를 명령어로** 사용하는 것은 어떨까?

테스트 주도 개발(TDD)은 "테스트가 명세이자 목표"라는 철학 위에 서 있다.

테스트를 먼저 작성하고, 그 테스트를 통과하는 구현을 만든다.

이 방식은 결과를 **검증 가능하고 재현 가능한 형태**로 정의한다.

AI 코딩에서도 이 철학을 적용할 수 있다.

자연어 대신 테스트를 작성하고, AI에게 그 테스트를 통과하는 코드를 생성하게 하면 된다.

## 예시: 테스트 명세

아래는 간단한 문자열 유틸리티 함수를 AI에게 구현시키는 예시다.

자연어 명령 대신, 테스트 코드가 "명령" 역할을 한다.

```javascript
import io.kotest.core.spec.style.BehaviorSpec
import io.kotest.matchers.shouldBe
import io.kotest.matchers.nulls.shouldBeNull

class 문자열유틸리티_테스트 : BehaviorSpec({

    Given("문자열의 첫 글자를 대문자로 바꾸는 함수가 있을 때") {

        When("정상적인 문자열이 주어지면") {
            val input = "hello world"
            val result = input.capitalizeFirstLetter(input)

            Then("첫 글자가 대문자로 변환되어야 한다") {
                result shouldBe "Hello world"
            }
        }

        When("빈 문자열이 주어지면") {
            val input = ""
            val result = input.capitalizeFirstLetter(input)

            Then("그대로 빈 문자열을 반환해야 한다") {
                result shouldBe ""
            }
        }

        When("null이 주어지면") {
            val input: String? = null
            val result = input.capitalizeFirstLetter(input)

            Then("null을 반환해야 한다") {
                result.shouldBeNull()
            }
        }
    }
})
```

AI에게 이 테스트를 주고 "이 테스트를 모두 통과하는 코드를 만들어줘"라고 요청하면,

AI는 다음과 같이 구현할 것이다:

```javascript
fun String?.capitalizeFirstLetter(): String? {
    if (this.isNullOrEmpty()) return this
    return this[0].uppercaseChar() + this.substring(1)
}
```

자연어보다 훨씬 **명확하고 검증 가능한 대화**다.

## 테스트 기반 AI 코딩의 장점

1. **명확성**: 테스트는 요구사항을 모호하지 않게 정의한다.  

2. **검증 가능성**: 결과가 테스트로 자동 검증된다.  

3. **재현성**: 같은 테스트를 주면 항상 같은 결과가 나온다.  

4. **자동화 용이성**: CI/CD와 결합하면 자동 품질 보증 가능.

AI 코딩의 핵심은 결국 "명세를 어떻게 표현하느냐"에 있다

자연어는 인간 친화적이지만 기계에게는 모호하다. 테스트는 기계 친화적이면서 인간이 이해할 수 있는 **공통 언어**다.

## **AI와 인간의 논리적 인터페이스: 테스트**

AI 코딩의 미래는 자연어가 아니라, **테스트 중심의 대화형 명세 언어**로 향하고 있다.

테스트는 가장 명확한 대화의 형태이며, AI와 인간이 공유할 수 있는 **논리적 인터페이스**다.

For the site tree, see the [root Markdown](https://slashpage.com/dv-note.md).
