照見JOGYEON
에세이

AI 코딩 시대, 소프트웨어 엔지니어링의 본질은 어디로 가는가

발행일
the-essence-of-engineering-without-code - hero

일상적인 언어로 몇 줄을 입력하면 수백 줄의 작동하는 코드가 화면에 쏟아지는 시대가 됐다. 함수 하나를 만들기 위해 문법을 뒤지고, 에러 메시지를 붙잡고 밤을 새우던 기억은 빠르게 과거의 풍경이 되고 있다. 사람들은 말한다. 이제 프로그래밍의 시대는 끝났으며, 앞으로 인간에게 필요한 언어는 자연어뿐이라고.

하지만 이 변화를 ‘코딩의 종말’로 받아들이는 것은 프로그래밍이라는 행위가 걸어온 역사를 오해한 데서 비롯된다.

컴퓨터의 역사에서 개발자는 단 한 번도 기계의 밑바닥을 있는 그대로 다루지 않았다. 0과 1의 전기 신호에서 기계어로, 다시 어셈블리어와 C, 자바와 파이썬으로 이어진 흐름은 인간이 기계의 물리적 동작을 일일이 신경 쓰지 않도록 돕는 끝없는 ‘추상화(Abstraction)’의 사다리였다. 생성형 인공지능은 그 사다리의 가장 높은 곳에 얹힌 또 하나의 통역 계층일 뿐이다.

중요한 질문은 코드를 작성하는 수고가 줄어들었다는 사실 그 자체가 아니다. 코드를 만드는 한계비용이 0에 수렴할 때, 우리가 소프트웨어 엔지니어링이라고 믿어온 활동의 진짜 본질이 어디로 이동하는가이다.

한 줄 결론: AI는 프로그래밍을 끝내는 것이 아니라, 인간의 의도를 기계어로 바꾸는 부수적인 타이핑 비용을 없앴을 뿐이다. 코드를 찍어내는 비용이 무료에 가까워질수록 역설적으로 ‘무엇을 만들고 무엇을 만들지 말아야 하는가’를 정의하는 사유의 명료함과, 시스템의 리스크를 온전히 떠안는 ‘최종 보증인’으로서의 책임이 엔지니어링의 대체 불가능한 본질로 남는다.

1. 자연어는 왜 프로그래밍 언어가 될 수 없는가

우리는 왜 수십 년 동안 굳이 번거롭고 엄격한 프로그래밍 언어를 배워야 했을까? 단지 과거의 컴퓨터가 둔해서 인간의 말을 알아듣지 못했기 때문일까?

그렇지 않다. 진짜 이유는 인간이 쓰는 일상어가 본질적으로 모호하기 때문이다.

“사용하기 편리하고 안전한 결제 시스템을 만들어 달라”는 일상어 문장 뒤에는 수천 가지의 숨은 결정과 모순이 도사리고 있다. 무엇을 편리하다고 정의할 것인가? 한 번의 클릭으로 결제되는 것이 편리함인가, 실수로 인한 오결제를 막기 위해 확인 절차를 거치는 것이 편리함인가? 네트워크가 0.1초 동안 끊겼을 때 결제 승인은 어떻게 처리할 것인가? 탈퇴한 회원의 거래 기록은 법적 의무와 프라이버시 원칙 사이에서 언제 지워야 하는가?

프로그래밍 언어가 가진 문법과 타입 시스템은 기계만을 위한 족쇄가 아니었다. 그것은 인간이 자기 머릿속에 품은 막연한 의도에서 모순을 발견하고, 예외적인 상황을 강제로 정의하도록 돕는 사유의 정밀한 도구였다.

자연어로 명령을 내리면 AI는 통계적으로 가장 그럴듯한 코드를 조합해 준다. 그러나 그 그럴듯함이 실제 현실의 엄밀함과 일치한다는 보장은 어디에도 없다. 자연어는 인간의 바람을 던지는 인터페이스가 될 수는 있어도, 복잡한 시스템의 작동을 빈틈없이 규정하고 통제하는 언어는 될 수 없다.

the-essence-of-engineering-without-code - abstraction-and-vagueness

2. 부수적 복잡성의 증발과 폭증하는 유지보수 부채

소프트웨어를 만들 때 겪는 어려움은 크게 두 가지로 나뉜다.

하나는 문법을 외우고, 반복되는 보일러플레이트 코드를 타이핑하고, 컴파일러의 규칙을 맞추는 데서 오는 ‘부수적 복잡성’이다. 다른 하나는 시스템이 해결해야 할 현실의 복잡한 규칙, 상충하는 요구사항 사이의 타협, 변화하는 환경에서도 무너지지 않는 구조를 설계하는 ‘본질적 복잡성’이다.

AI가 획기적으로 덜어낸 것은 바로 전자다. 코드를 직접 치는 손의 노동이 사라진 것이다. 하지만 손이 편해졌다고 해서 풀어야 할 문제 자체가 쉬워지지는 않는다. 오히려 부수적 복잡성이 증발하면서, 해결되지 않은 본질적 복잡성이 더 날카로운 모습으로 수면 위에 드러난다.

코드를 작성하는 비용이 바닥을 치자, 세상에는 전례 없이 거대한 양의 코드가 무분별하게 쏟아져 들어오고 있다. 하지만 소프트웨어는 존재하는 것만으로도 주변 환경(OS, 브라우저, 보안 규격)의 변화에 따라 끊임없이 유지보수 비용을 요구한다. 빠르게 만들어진 수천 줄의 코드는 내일 아침 수천 가지의 잠재적 장애 요인으로 돌변한다.

실제로 최근의 현장 연구들이 보여주듯, 독립된 작은 기능을 구현할 때는 AI가 작업 시간을 절반 가까이 줄여주지만, 거대한 기존 시스템과 얽힌 작업에서는 숙련된 엔지니어들이 AI가 작성한 코드를 읽고, 오류를 찾아내고, 아키텍처에 맞게 고치느라 오히려 더 많은 시간을 쓴다. 코드를 만드는 비용은 0이 되었지만, 잘못 만들어진 코드가 일으킨 장애를 수습하는 비용은 과거보다 줄어들지 않았기 때문이다.

3. 프로그래밍은 코드를 쓰는 일이 아니라, 모형을 세우는 일이다

그렇다면 코드를 직접 타이핑하지 않는 시대에 개발자의 전문성은 어디에서 증명되는가?

소프트웨어 개발의 본령은 본래 텍스트로서의 코드를 생산하는 데 있지 않았다. 그것은 해결하려는 현실의 문제와, 그 문제를 컴퓨터가 다루는 방식 사이의 인과관계를 인간의 뇌 속에 하나의 ‘살아있는 모형’으로 구축하는 작업이었다.

코드는 그 모형이 겉으로 드러난 하나의 껍질에 불과하다. 왜 다른 대안을 버리고 이 구조를 선택했는지, 어떤 조건이 깨지면 시스템이 오작동하는지, 훗날 요구사항이 바뀌었을 때 어디를 손대야 하는지는 소스 코드 몇 줄만으로 결코 온전히 담기지 않는다.

AI가 수천 줄의 코드를 눈 깜짝할 사이에 만들어내더라도, 그 시스템이 발을 딛고 있는 현실의 맥락을 꿰뚫고 있는 인간의 모형이 없다면 그 시스템은 통제 불능의 블랙박스가 된다. 설계의 맥락을 이해하지 못한 채 생성 버튼만 누르는 사람은 소프트웨어의 주인이 아니라, AI가 쏟아낸 기술 부채를 치우는 관리인에 머물 뿐이다.

the-essence-of-engineering-without-code - producer-to-underwriter

4. 생산자에서 리스크를 인수하는 최종 보증인으로

앞으로 소프트웨어 환경은 두 갈래로 나뉠 것이다.

한쪽에서는 프로그래밍을 배운 적 없는 사람도 일상어로 자신만의 도구를 즉석에서 만들어 쓰는 일이 자연스러워진다. 과거에는 비용 때문에 만들 엄두조차 내지 못했던 수많은 작은 애플리케이션과 개인화 도구가 생겨날 것이다.

그러나 다른 한쪽, 즉 금융과 의료, 수많은 사람의 자산과 데이터가 오가는 핵심 인프라 영역에서는 소프트웨어 엔지니어링의 기준이 이전보다 훨씬 더 엄격해질 것이다. 누구나 코드를 찍어낼 수 있는 세상에서는 단순히 ‘작동하는 것처럼 보이는 코드’의 가치는 바닥으로 떨어진다.

금융 시스템에서 1원의 오차가 발생하거나 의료 AI가 오작동했을 때, AI 모델에 책임을 물을 수는 없다. AI는 법적인 인격도, 손해를 배상할 자산도 없기 때문이다.

결국 마지막 순간에 시스템의 안전성을 검증하고, 배포 버튼을 누르며, 자신의 이름을 걸고 결과를 감당하는 인간 엔지니어의 전문성만이 가장 값비싼 자산으로 남는다. 미래의 엔지니어는 코드를 타이핑하는 생산자가 아니라, 시스템의 리스크를 인수하는 ‘최종 보증인’이다.

현장에서 남는 실전 판단 기준:

1. 코딩 속도가 아닌 사유의 정밀함을 훈련하라: 요구사항의 결함과 모순을 짚어내는 능력이 핵심이다. 타이핑은 기계의 일이지만, 시스템의 전제와 경계 조건을 정의하는 것은 인간의 몫이다.

2. 온전히 검증할 수 없는 코드는 들이지 마라: 결과물을 스스로 증명할 수 없을 때, AI가 제공한 생산성은 고스란히 재앙 같은 기술 부채로 되돌아온다.

3. 코드를 늘리기보다 요구사항의 모순을 지워내라: 코드를 무작정 찍어내는 대신 불필요한 복잡성을 쳐내는 ‘제거의 예술’을 실천하라. 시스템에서 가장 안전한 코드는 애초에 작성되지 않은 코드다.

이어지는 질문

글 목록