LLM이 새로운 추상화를 가지고온다. LLMs bring new nature of abstraction- 마틴 파울러
원문 링크 https://martinfowler.com/articles/2025-nature-abstraction.html
LLMs bring new nature of abstraction
A long-form article entitled: "LLMs bring new nature of abstraction"
martinfowler.com
이 바닥의 많은 떠벌이들과 마찬가지로, 나는 최근 생성형 AI 시스템이 소프트웨어 개발에 어떤 역할을 할 수 있을지에 대해 주목하고 있다. 내 생각엔 LLM의 등장이 가져올 변화는 어셈블리시절 고차원 프로그래밍언어(high-level programming languages)의 등장이 가저온 변화와 비슷할 것이라고 본다. 고차원 프로그래밍 언어와 프레임워크들은 우리의 추상화 레벨과 생산성을 향상시켰지만 프로그래밍의 본질에 대한 영향은 별로 없었다. LLM은 프로그래밍의 본질에 영향을 주고 있지만 단순히 추상화 수준을 끌어올리는 것에 그치지 않고 비결정론적(non-determinisitic)인 도구로 프로그래밍한다는 것이 무엇을 의미하는지에 대해서도 다시 한번 생각하게 만든다.
고차원 프로그래밍 언어들은 새로운 레벨의 추상화를 아주 빠르게 전달했다. 어셈블리 언어를 사용할 때는 특정 머신의 명령어 집합 만을 염두해두고 작업하게 되고 간단한 작업조차도 어떻게 하면 데이터를 올바른 레지스터에 등록해서 특정 행위를 할 수 있게 만들지에 대해 스스로 고민하고 파악해야 했지만. 고차원 언어에서는 명령문, 조건문을 통한분기, 데이터 컬렉션에 반복문을 돌리면서 작업을 수행하는 방법을 생각할 수 있게 되었다. 내의 코드에 이름(식별자)을 붙일 수 있게 되어서 각 값들이 무엇을 의미하는지 명확하게 표현할 수 있게 되었다. 초기의 언어들에는 명백한 한계가 있었다. 나의 첫 번째 프로그래밍 언어는 포트란4였다. 포트란4에는 'if'문에 'else'가 없었고, 정수형 변수를 선언할때는 변수명을 "I"부터 "N"사이의 문자로 시작해야 한다는 규칙이 있었다.
그러한 제약을 제거하고 블록 구조를 더했을 때(IF 문 이후에 한 줄 이상의 코드를 쓸 수 있게 되었다.) 프로그래밍은 쉬워지긴(그리고 더 재미있어졌다) 했으나 이러한 변화는 모두 같은 부류의 진보였다. 요즘 나는 반복문을 거의 사용하지 않는다. 나는 함수도 자연스럽게 data처럼 전달하지만 기계에게 명령을 내리는 방법은 포트란을 사용하던 시기와 크게 변하지 않았다. Ruby는 포트란과 비교하면 훨씬 정교하고 세련된 언어지만 포트란과 동일한 분위기를 가진다. 마치 포트란과 PDP-11 기계어 명령사이에서는 느낄 수 없는 분위기의 차이다.
비록 지금까지 나는 최고의 생성형 AI 도구 들을 가볍게 만져보는 정도밖에 해보지 못했지만 친구들과 동료들의 AI 툴 경험을 듣는 것에 매료되어 있다. 나는 기계와 대화하는 방식이 루비에서 프롬프트로 변화된 것은 포트란과 어셈블리 언어 사이의 변화만큼 큰 변화라는 것을 확신한다. 추상화의 관점에서 보면 이는 더 큰 변화다. 내가 포트란 함수를 작성할 때, 나는 코드를 수백 번 컴파일을 할 수 있고 수백 번 컴파일해도 내가 작성한 코드의 결과는 변하지 않는다(버그가 있었다면 매번 같은 버그가 발 생한다). LLM은 확정적이지 않은 추상화를 가지고 왔다. 그 결과 내가 git에 동일한 프롬프트를 올려둔다고 해서 그 프롬프트를 실행한 결과가 매번 같지 않다. 나의 동료 브리기테가 말한 것처럼 우리는 추상 레벨을 위로 올리는 동시에 '비결정성'이라는 방향으로 옆으로 이동하고 있다.
우리가 LLM을 업무에서 적용하는 방법을 배우는 것과 동시에 우리는 이 '비결정성'과 함께 살아가는 방법을 알아내야 한다. 이런 변화는 매우 극적이고 나를 흥분시키고 있다. 나는 어느 순간 우리가 잃게 될 것에 대한 아쉬움을 느낄 수도 있겠지만 대부분 이해하지 못한 새로운 것을 얻게 될 거란 사실도 알고 있다. 이런 '비결정성'의 진화는 아직까지 우리 업계 역사 속에서는 유래없는 진화이다.