
AI로 코드를 짜는 시대가 되면서, 코드를 많이 만드는 일은 쉬워졌습니다.
그런데 좋은 코드를 만드는 일은 여전히 어렵습니다.
AI에게 “사이트가 만료되면 막아줘”라고 말하면, AI는 금방 코드를 만들어줍니다.
if (site.expired) {
throw new Error('Site expired');
}
틀린 코드는 아닙니다.
하지만 이런 코드가 여기저기 생기기 시작하면 문제가 됩니다.
처음에는 단순한 조건 하나였는데, 어느 순간 시스템 전체에 흩어진 규칙이 됩니다.
이럴 때 필요한 표현이 있습니다.
이 개념을 1급 시민으로 다뤄야 한다.
원래 프로그래밍에서 1급 시민이라는 말은, 어떤 대상을 다른 값들과 동등하게 다룰 수 있다는 뜻입니다.
예를 들어 TypeScript에서 함수는 1급 시민입니다.
const fn = () => console.log('Hello');
run(fn);
return fn;
함수를 변수에 담을 수 있고,
함수의 인자로 넘길 수 있고,
다시 반환할 수도 있습니다.
즉 함수가 특별한 문법이 아니라 하나의 값처럼 다뤄지는 것입니다.
그런데 실제 서비스를 만들다 보면, 이 말은 조금 더 넓은 의미로 쓰입니다.
제가 생각하는 1급 시민은,
시스템이 이해하고 관리해야 하는 하나의 개념이 되는 것입니다.
예를 들어 사이트가 만료되었다고 해보겠습니다.
처음에는 단순히 이렇게 처리할 수 있습니다.
if (site.expired) {
throw new Error('Site expired');
}
하지만 서비스가 커지면 “만료이면 오류” 정도로 끝나지 않습니다.
이쯤 되면 만료는 단순한 boolean 값이 아닙니다.
시스템이 알아야 하는 상태입니다.
그래서 이렇게 승격시킵니다.
enum SiteStatus {
ACTIVE = 'ACTIVE',
EXPIRED = 'EXPIRED',
SUSPENDED = 'SUSPENDED',
}
그리고 코드는 이렇게 바뀝니다.
if (site.status === SiteStatus.EXPIRED) {
// 만료 상태에 맞는 정책을 적용한다.
}
이 차이는 생각보다 큽니다.
이제 만료는 흩어진 조건문이 아니라, 이름을 가진 공식적인 상태가 됩니다.
알림도 이 상태를 기준으로 움직일 수 있습니다.
즉, 시스템 안에서 시민권을 얻은 것입니다.
AI에게 일을 맡길 때도 이 표현은 중요합니다.
그냥 이렇게 말하면 기능이 생깁니다.
사이트가 만료되면 접근을 막아줘.
하지만 이렇게 말하면 설계를 하게 됩니다.
사이트 만료 상태를 1급 시민으로 다뤄줘.
이 말은 단순히 if문을 하나 추가하라는 뜻이 아닙니다.
테스트에서도 하나의 시나리오로 다루라는 뜻입니다.
AI는 요구사항을 빠르게 코드로 바꾸는 데 강합니다.
하지만 그냥 기능만 요청하면, 가장 가까운 곳에 조건문을 추가할 가능성이 높습니다.
반대로 “1급 시민으로 다뤄달라”고 말하면,
AI는 그 기능을 임시 처리하지 않고 시스템이 관리하는 정식 개념으로 설계하려고 합니다.
저는 이 차이가 앞으로 더 중요해질 거라고 생각합니다.
AI 시대에는 코드를 쓰는 능력보다,
AI에게 어떤 개념을 시스템의 중심에 올려야 하는지 말해주는 능력이 더 중요해질 수 있습니다.
좋은 설계는 예외를 계속 추가하는 일이 아닙니다.
반복해서 등장하는 개념을 발견하고,
그 개념을 시스템의 1급 시민으로 승격시키는 과정에 가깝습니다.
처음에는 조건문이었던 것이 상태가 되고,
상태였던 것이 이벤트가 되고,
이벤트였던 것이 정책이 됩니다.
그 과정에서 코드는 조금씩 단순해집니다.
새로운 기능을 만들 때 저는 종종 이런 질문을 합니다.
이건 시스템이 이해하는 1급 시민 인가?
아직 if문으로만 존재한다면, 언젠가 여러 곳에 흩어질 가능성이 높습니다.
반대로 시스템이 이해하는 개념이 되면, 그때부터는 관리할 수 있습니다.
코드는 기능을 만드는 작업이기도 하지만,
그보다 더 중요한 것은 시스템이 관리해야 할 개념을 발견하는 작업인지도 모릅니다.
AI에게도 마찬가지입니다.
“이 기능을 만들어줘”라고 말하면 기능이 생깁니다.
“이 개념을 1급 시민으로 다뤄줘”라고 말하면 설계가 생깁니다.
다음에도 좋은 글로 찾아뵙겠습니다.
미디엄으로 잠시 이사했다가 벨로그로 돌아왔어요!
아임웹 CTO 매튜 드림.
AI한테 적은 문장을 주더라도 그 문장 안에 이 프로젝트에서 통하는 역할(1급 시민)이 포함되어있으면
알아서 현재 설계에서 이 역할이 하는 플로우에 녹여준다는 말씀이군요
확실히 개발할 때 단계 별로 구분하고 용어별로 역할과 범위를 정하는게 좋은거 같아요