1. 내가 무엇을 원하는지만 설명하고 실제 개발은 모두 AI에게 맡기는 방식인 바이브 코딩이 요즘 핫하다. 나도 개발할 때 AI를 많이 활용하는 입장으로서 AI로 인한 개발 생산성 증가는 누구도 부정할 수 없는 사실이라 생각하지만, 요즘은 과장된 의견이 좀 많은 것 같다.
2. MVP나 사이드 프로젝트 레벨에서는 AI로 인한 생산성 향상이 정말 크고, 90% 이상의 코드를 AI로 작성하는 것도 가능하다. 근데 코드 규모가 좀만 커지면 그 한계가 극명하게 드러난다. 잘못 수정하면서 사이드 이펙트가 마구 발생하고, 추상화도 제대로 안되어있고, 확장성도 재사용성도 떨어지는, 깊은 고민 없이 작성했을법한 코드가 여기저기 산재하기 시작한다.
3. 그렇게 쌓여가는 기술 부채는 결국 나중에는 봉합할 수 없는 수준에 이르게 되고, 여기 수정하면 저기서 뻑나고 저기 수정하면 또 다른데서 터지는 식의 끔찍한 상황이 만들어진다. 그때가 되면 기능 하나 추가하기도 힘들고, 하려 해도 정말 많은 시간이 걸린다. 근데 이제 개발은 AI가 다 할거니까 사람은 개발을 배울 필요가 없다고…? 적어도 근시일 내에 그럴 일은 없을듯 하다.
4. 조금만 큰 규모의 코드베이스에서 작업해보면, 사실 개발 업무에서 코드를 “작성”하는 시간의 비중은 그리 크지 않다. 대부분의 시간은 새로 작성하는 코드가 기존 기능에 미치는 영향은 없는지 영향 범위를 파악하고, 어떻게 하면 더 직관적이고 예측 가능한, 버그가 적고 견고한 코드를 작성할 수 있을지 구조적인 고민을 하는데 들어간다. 그런 고민 없이 개발하는 곳도 많겠지만, 그럼 결국 나중에 엄청난 비용을 치른다.
5. 지금의 LLM은 그러한 구조적인 고민에서는 큰 도움을 주지 못한다. 이유는 크게 두 가지다. 첫째로, LLM은 우리 서비스 도메인에 대한 깊은 이해가 결여되어 있다. 어떠한 서비스를 오랫동안 운영해온 사람들은 그 도메인의 갖가지 세부 사항들을 속속들이 이해하고 있다. 그 중에는 명문화하기 힘든 경험과 지식도 있고, 그러한 지식이 사실 가치가 제일 높은 종류의 지식이다.
6. 둘째로는, LLM은 좋은 코드란 무엇인가에 대한 지식이 부족하다. 무엇이 더 가독성이 좋고, 확장성이 좋고, 견고한 코드인지 판단을 맡겨보면 그리 좋은 판단을 하지 못한다. 이는 학습 과정에서 A가 B보다 더 좋은 코드라는 정보를 학습할만한 데이터의 양이 많지 않았기 때문일 것이다. 세상에 존재하는 대부분의 코드는 그리 좋은 코드가 아니니까. 이미지 생성 모델이 실사 사진은 매우 잘 만들지만, 정말 세련된 벡터 로고를 뽑기는 힘든 것처럼. 그리고 학부생 보고서 수준의 글은 잘 쓰지만, 정말 재미있는 소설을 쓰기는 힘든 것처럼. 또한, “구조적으로 더 좋다”를 판단하기 위해서는 필연적으로 방대한 컨텍스트가 들어가야 하는데, 컨텍스트 윈도우의 한계도 있을 것이다.
7. 이러한 문제를 해결하기 위해 문서화를 잘해두고, RAG를 통해 필요한 컨텍스트를 잘 가져오게 하는 식으로 접근하는 경우도 많은데, 분명 큰 개선이 되긴 하지만 근본적으로 이 방식으로 인간 개발자를 대체할 수 있다고 생각하진 않는다. 그렇게 생각하는 가장 큰 이유는, 언어라는 것 자체가 정보를 표현하는데 있어 효율적이지도 완전하지도 않은 형식이기 때문이다.
8. 숙련된 개발자는 코드를 보고서 냄새를 맡을 수 있다. 이건 뭔가 잘못되었다, 나중에 분명 문제가 생길 것 같다는 냄새. 그것을 설명하기 위해 구성한 언어는 냄새를 맡은 이후에 만들어진 것이다. 경험이 부족한 개발자는 그 설명을 아무리 들어도 냄새를 맡지는 못한다. 그것을 직관이라고 부를 수도 있겠다. 읽고 외울 수 있는 종류의 지식은 가치가 가장 낮은 지식이다. 그런 지식으로 먹고 사는건 앞으로는 불가능한게 맞다.
9. 누군가는 직관을 비과학적인 무언가로 치부해버리기도 하는데, 직관은 명문화될 수 없는 복잡하고 미묘한 정보들을 처리하는데 있어 매우 강력한 도구다. 나는 직관을 무의식 속의 베이지안 머신이라고 표현하는걸 좋아하는데, 이러한 종류의 지식은 누군가에게 언어를 매개로 가르쳐줄 수 있는 것이 아니다. 조금 도와줄 수 있을 뿐이지, 결국은 스스로 체득해야 하고, 꽤나 많은 시간 투자를 필요로 한다. LLM에게 아무리 언어를 통해 설명을 한다고 한들 그러한 지식은 완전하게 전달될 수 없다.
10. 또한, 인간의 장기 기억은 놀라울 정도로 강력하다. 그때 그때 필요한 정보들을 O(1)으로 처리해 가져오는데, 컨텍스트가 미묘한 상황에서도 적재적소에 딱 맞는 정보를 잘 가져온다. 코드베이스를 오래 관리해온 사람은 새로운 기능을 추가할 때 그것이 다른 기능에 어떤 영향을 가져올지, 어떤 파일들을 유심히 봐야하는지 순식간에 떠올릴 수 있다. 지금과 같은 Agent나 RAG 방식을 발전시킨다고 해도 인간의 장기 기억을 완전히 대체하기는 쉽지 않아 보인다. 장기 기억에서 정보를 추출해오는 과정이 언어를 매개로 하는 것이 아니기도 하고.
11. 그래서 난 “왜 아직 AI가 인간의 일자리를 모두 대체하지 못했는가”에 대한 답은 장기 기억의 결여라고 생각한다. RAG는 결국 언어로 기억을 표현하고 검색해오는 방식이라는 점에서 장기 기억을 모사하기에는 근본적인 한계가 있다고 본다. 언젠가는 장기 기억이 파라미터 내에 내장된 AI 모델이 나와서 해결해주지 않을까 기대해본다. 그전까지는 지금의 패러다임으로 아무리 발전한다 하더라도 개발자가 필요 없어질 정도까지는 안 갈 것 같다.