AI 프로그래밍의 숨은 비용 (그리고 이를 신중하게 활용하는 방법)
Source: Dev.to
“AI가 코드를 깨뜨린 것이 아니라, 당신이 AI를 너무 신뢰했을 뿐이다.”
GitHub Copilot이나 ChatGPT 같은 AI 도구는 우리가 소프트웨어를 작성하는 방식을 바꾸고 있다. 주석을 입력하면… 갑자기 전체 함수가 나타난다. 마법처럼 느껴진다.
하지만 불편한 진실이 있다: 조심하지 않으면 AI가 당신을 더 나쁜 엔지니어로 만들 수 있다. 이것은 AI에 반대하는 이야기가 아니다—나는 매일 사용한다.
AI 프로그래밍의 어두운 면
1. 깊이 생각하지 않게 된다
AI는 답을 제공하지만 이해를 제공하지는 않는다.
def calculate_discount(price, discount):
# Looks correct…
return price * (1 - discount)
discount = 20 대신 0.20이라면 어떻게 될까? AI는 비즈니스 로직을 검증하지 않는다—그냥 코드를 생성할 뿐이다.
2. 컨텍스트 맹목성
AI는 깔끔해 보이는 코드를 만들지만 운영상의 고려사항을 무시할 수 있다:
- 페이지네이션 없음
- 속도 제한 없음
- 인증 없음
- 캐싱 없음
결과적으로 당신은 운영 위험을 만들었다.
3. 자신감 있게 틀린 코드
AI는 틀렸음에도 마치 맞는 것처럼 들릴 수 있다.
List list = Arrays.asList("a", "b", "c");
Arrays.asList()는 고정 크기 리스트를 반환하므로 요소를 추가하거나 제거하려 하면 UnsupportedOperationException이 발생한다. AI는 이 미묘한 언어 규칙을 놓쳤다.
4. 기술 부채 폭발
AI는 “동작하게 만들라”에 최적화하고, “확장 가능하고 유지 보수하기 쉬워라”에는 최적화하지 않는다.
function processOrder(order) {
// No design pattern
// No extensibility
// Hard to maintain
}
그 결과 코드는 확장과 유지 보수가 어려워져 기술 부채가 누적된다.
디버깅 능력 약화
AI가 모든 코드를 작성한다면, 문제가 발생했을 때 어떻게 될까? 완전히 이해하지 못한 코드를 디버깅해야 한다.
AI를 신중하게 활용하기
1. AI를 초안 작성에만 사용하고, 결정에는 사용하지 않기
잘못된 예: “AI가 만들었으니 바로 배포한다.”
올바른 예: “AI가 만들었으니 이제 내가 검증한다.”
2. 항상 제약 조건을 추가하기
일반적인 “user API”를 요청하는 대신 구체적으로 작성한다:
“페이지네이션, 속도 제한, 인증이 포함되고 오류 처리가 된 API를 작성해 주세요.”
예시 (개선된 API):
if (limit > 100) {
res.status(400).json({ error: "Limit exceeds maximum of 100" });
return;
}
const users = await db.getUsersPaginated(page, limit);
res.json({ users });
3. AI를 주니어 개발자처럼 대하기
- 코드를 철저히 검토한다.
- 가정에 의문을 제기한다.
- 엣지 케이스를 테스트한다.
4. “무엇”만 묻지 말고 “왜”도 물어보기
“코드를 주세요” 대신에:
“트레이드‑오프, 엣지 케이스, 위험 요소를 설명해 주세요.”
5. 반복 작업에 AI 활용하기
가장 적합한 사용 사례:
- 보일러플레이트 코드
- 테스트 케이스
- 문서화
- 리팩토링 제안
핵심 아키텍처 결정에 AI에 의존하는 것은 피한다.
문제는 AI가 아니라 맹목적인 신뢰다. 최고의 엔지니어는 생각을 AI로 대체하지 않는다—AI로 생각을 증폭시킨다.