AI 코딩 도구의 확산으로 코드 작성 비용은 낮아졌으나

ChatGPT나 Copilot에 요청 한 번만 하면 수십 줄의 코드가 순식간에 화면을 채운다. 개발자가 머리를 싸매고 한 줄씩 적어 내려가던 시간이 사라진 자리에는 LLM(거대언어모델, 방대한 데이터를 학습해 인간처럼 글을 쓰는 AI)이 쏟아내는 고품질의 코드가 들어섰다. 이로 인해 코드 작성 비용은 급격히 낮아졌지만, 정작 생성된 코드가 어떻게 작동하는지 파악하는 비용은 오히려 증가했다. 예전에는 코드를 직접 짜는 고통스러운 과정이 곧 논리를 이해하는 과정이었다. 하지만 지금은 작성 단계에서의 깊은 고민이 생략된 채 결과물만 빠르게 생성되기에, 개발자는 사후에 코드를 다시 읽어내며 이해도를 확보해야 하는 새로운 부담을 안게 되었다.

AI의 생산 속도는 사람이 내용을 읽고 소화하는 속도를 이미 추월했다. LLM은 누구도 따라잡지 못할 속도로 코드를 생산하며, 이는 개발자가 한 번에 감당할 수 있는 인지 범위를 쉽게 넘어선다. 만약 한 번의 명령으로 거대한 변경 목록을 한꺼번에 생성해 적용한다면, 전체 시스템의 흐름을 놓치고 통제 불능 상태에 빠질 위험이 크다. 따라서 한꺼번에 많은 양을 바꾸기보다 조금씩 나누어 반영하는 점진적(incremental) 사용법이 권장된다. AI가 주는 속도에 매몰되어 무작정 코드를 수용하기보다, 인간의 이해 속도에 맞춰 도입 단계를 조절하는 실무적 판단이 중요해졌다.

기존 방식과 달라진 지점

코드가 많을수록 기능이 풍부하고 완성도가 높다고 믿는 상식이 있다. 하지만 LLM(거대언어모델)은 복잡함에 대한 두려움이 없는 다작 코더다. 시스템 규모가 커질수록 복잡성은 최소 기하급수적으로 늘어나는데, AI는 이런 위험을 고려하지 않고 코드를 계속 쌓아 올린다. 기존의 결함 위에 새로운 코드를 덧씌우는 방식이 반복되면 시스템은 수정 불가능한 정체 상태에 빠진다. 어느 한 곳을 고치면 그만큼 다른 곳에서 버그가 터져 나오는 악순환이 이어지며 결국 전체 시스템이 붕괴하는 결과를 초래한다.

이런 상황에서 대안으로 제시되는 역할이 코드를 더하기보다 제거하고 단순화하는 빼는 엔지니어(subtractive engineer)다. 이들은 AI가 순식간에 쏟아낸 출력물을 그대로 수용하지 않고 면밀하게 검토해 단순화를 제안한다. 시스템의 통제권을 유지하기 위해 불필요한 코드 뭉치에는 단호하게 아니오라고 말하며 진입을 차단한다. 단순히 기능을 구현하는 것을 넘어 전체 구조를 가볍게 유지하는 데 집중한다. 무언가를 계속 쌓아 올리는 건축가보다 불필요한 부분을 깎아내어 본질만 남기는 조각가에 가까운 태도를 취한다.

빼는 엔지니어는 자신이 직접 작성한 코드의 양에서 성취감을 느끼지 않는다. 오히려 시스템의 복잡도를 낮추기 위해 과감히 제거한 코드나, 시스템 내부로 들어오지 못하게 막아낸 레이어(계층)에 더 큰 자부심을 둔다. AI가 만드는 코드의 저렴한 비용에 매몰되지 않고 프로그래밍의 기예를 유지하려는 전략적 선택이다. 불필요한 요소를 덜어내어 단순함을 유지하는 것이 곧 시스템의 생존력을 높이는 가장 확실한 방법이기 때문이다.

비결정적 특성과 넓은 출력 범위로 인해 컴파일러 출력

똑같은 입력값을 넣었을 때 항상 같은 결과가 나오는 도구와 매번 다른 답을 내놓는 도구는 신뢰의 층위가 다르다. 컴파일러(프로그래밍 언어를 기계어로 바꾸는 프로그램)는 결정적이다. 원본 소스 코드를 그대로 보존하며 기계어라는 좁은 영역의 결과물만 만들어낸다. 반면 LLM(거대언어모델)은 설계부터 비결정적이다. 같은 질문을 해도 매번 다른 코드를 내놓을 수 있으며 원본 소스를 보존하지 않는다. 특정 언어를 기계어로 바꾸는 좁은 통로가 아니라 일반화된 소프트웨어 전체를 다루는 넓은 통로를 쓰기에, LLM의 결과물을 컴파일러의 출력물처럼 동일하게 취급할 수 없다.

빗자루에 마법을 걸어 청소의 고역을 덜려던 제자가 통제 불능의 상황에 빠진 이야기가 있다. 제자가 건 마법 때문에 빗자루가 점점 격렬하게 움직이며 집안을 엉망으로 만들었지만, 결국 상황을 해결한 건 원리를 아는 마법사였다. 마법사가 다시 나타나 상황을 장악하고 제자의 어리석음을 질책하며 혼란을 수습한 것처럼, AI 코딩에서도 도구의 작동 원리를 아는 주체가 반드시 필요하다. 단순히 도구를 사용하는 법만 익힌 제자는 상황이 꼬였을 때 대처할 방법이 없기 때문이다.

코드를 이해하지 못한 채 AI가 짜준 결과물에만 의존하는 개발자는 이 제자와 같다. AI가 생성한 코드의 양이 늘어날수록 개발자가 파악해야 할 복잡도는 증가하고 통제권을 잃을 위험은 커진다. AI가 쏟아내는 방대한 코드를 무비판적으로 수용하면 시스템 전체가 통제 불능의 상태로 치닫게 된다. 결국 코드를 완전히 이해하고 장악하는 마법사가 되어야만 AI가 만든 혼란을 수습하고 시스템을 안정화할 수 있다. 이것이 AI 시대에 개발자가 갖춰야 할 실무적 판단 기준이다.

코파일럿이 단 몇 초 만에 수십 줄의 코드를 쏟아내는 풍경은 이제 일상이다. AI는 복잡함에 대한 거부감이 없어 대량의 코드를 생성하지만, 이를 검토하고 이해해야 하는 인간의 비용은 오히려 치솟았다. 매번 다른 결과물을 내놓는 확률적 특성의 AI 코드와 정해진 규칙대로만 작동하는 컴파일러의 결과물은 신뢰의 무게가 다르다.

이제는 AI가 제안한 코드를 그대로 수용하기보다, 필요 없는 부분을 쳐내고 단순하게 만드는 실무적 판단이 우선이다. 생성의 시대에 개발자의 진짜 실력은 얼마나 많이 쓰느냐가 아니라 얼마나 정교하게 덜어내느냐에서 결정된다.