EP.1 - AI 시대의 소프트웨어 건축 철학

학습에 들어가며: 건축으로 비유한 코드의 세계

by Lee

학습에 들어가며: 코드와 건축, 생각의 구조체

프로그래밍 코드와 건축물은 얼핏 전혀 다른 분야처럼 보이지만, 둘 사이에는 놀라운 유사성이 존재한다. 건축가가 청사진을 그리고 자재를 조합하여 공간을 창조하듯, 개발자는 설계도를 머리에 그린 채 코드로 논리의 공간을 만들어낸다. 이러한 소프트웨어 건축(software architecture) 개념은 오랫동안 사용되어 왔고, 소프트웨어 시스템의 구조를 현실 세계의 건물 구조에 빗대어 이해하도록 도와준다. 코드를 건축에 비유하면, 정적 구조와 동적 흐름까지도 한눈에 그려볼 수 있다는 장점이 있다. 다시 말해 코드의 세계를 건축적 메타포(은유)로 바라보면, 디렉토리는 공간(공간의 구획)이고 파일은 그 안의 방이며 **경로(path)**는 복도처럼 느껴지게 된다. 프론트엔드는 건물의 외벽이나 창문, 도장과 마감처럼 눈에 보이는 아름다움을 담당하고, 백엔드는 보이지 않는 배선이나 배관처럼 속에서 기능을 떠받친다. 이런 식으로 UI의 버튼들은 마치 건물 내 보일러실의 온도 조절 장치나 중앙 제어판 같아서, 겉에서 누르는 단순한 동작이 내부 시스템의 거대한 흐름을 제어한다. 함수의 내부와 파이프라인들은 물이 흐르는 파이프 속 공간처럼 정보의 흐름 통로가 되고, 모듈식 아키텍처로 구성된 AI 모델(예: 트랜스포머)은 조립식 건축이나 레고 블록을 쌓아 올린 현대식 빌딩을 떠올리게 한다. 알고리즘과 자료구조의 발전은 건축 분야에서의 “신공법(新工法)”—새로운 건축 기법의 도입—과 같아서, 더 크고 복잡한 소프트웨어 도시를 건설할 수 있게 한다. 결국 코드란 개발자의 사고가 구조화되어 만들어진 건축물이며, 오늘날 거대한 AI 시스템은 수많은 구조와 흐름으로 이루어진 하나의 도시라고 할 수 있다. 이 글에서는 이러한 비유들을 차례로 살펴보며, 프로그래밍 세계를 건축의 언어로 철학적으로 조망해보자.


디렉토리 구조: 공간과 방, 그리고 복도의 메타포

우리가 컴퓨터 안에서 파일을 정리하는 디렉토리 구조는 현실의 건물 내부 구조와 많이 닮아있다. 디렉토리는 일종의 **공간(큰 구획)**이고 그 안에 담긴 파일들은 각기 독립적인 방(room) 역할을 한다. 실제로 UNIX 계열 운영체제에서 파일 경로를 가리킬 때 이러한 공간 메타포를 활용해 설명하기도 한다. 예를 들어 *“/foo/bar 파일을 연다”*는 표현을 **“/foo라는 복도(corridor)를 지나 bar라는 방에 들어간다”**고 풀어 설명할 수 있다. 한 파일은 하나의 방이고, 그 파일에 대한 디렉토리 엔트리(파일명으로 된 경로)는 그 방으로 통하는 **문(door)**에 비유된다. 그래서 파일을 연다는 것은 결국 그 방의 문을 열고 안으로 들어가는 동작과 같다. 심지어 하나의 방에 문이 여러 개 달릴 수도 있듯이, 하나의 파일을 가리키는 서로 다른 경로(하드 링크 등)가 여러 개 존재할 수도 있다. 이러한 비유를 통해 디렉토리와 파일 개념을 시각화하면, 복잡한 파일 시스템도 하나의 건물처럼 머릿속에 그려진다. 컴퓨터 속 우리의 작업 공간이 곧 하나의 디지털 건축물인 셈인 것이다.


이런 공간 비유는 사용자 경험(UX) 분야에서도 오랫동안 사용되어 왔다. 파일과 폴더로 정보를 분류하는 방법은 서류철과 서랍으로 문서를 정리하던 오래된 사무실의 메타포에서 유래한 것이라고 할 수 있다. 그러나 디지털 세계의 정보는 물리 서류처럼 한 곳에만 존재하지 않고 하드 링크나 참조로 하나의 방에 여러 출입문을 만들 수 있다는 점에서 현실과 다르다. 그럼에도 이러한 공간적 은유를 통해, 우리는 보이지 않는 파일 시스템을 머릿속에 공간 지도로 그려내고 기억할 수 있게 된다. 결국 디렉토리 구조를 잘 설계하는 일은 건물의 평면도를 짜는 일과 같다고 할 수 있다. 사용자나 개발자가 기억하기 쉽고 이동하기 편한 구조를 만든다면, 복잡한 프로젝트도 잘 정돈된 건물처럼 길을 잃지 않고 탐색할 수 있을 것이다.


프론트엔드: 건물의 외벽과 인테리어

**프론트엔드(frontend)**란 소프트웨어 시스템에서 사용자가 직접 대면하는 부분으로, 비유하자면 건물의 외관과 인테리어에 해당한다. 건물의 벽, 창문, 문, 지붕, 바닥 등은 겉에서 보이고 사람이 접촉하는 요소들이죠. 웹 애플리케이션의 프론트엔드 역시 화면에 나타나는 UI 요소들(텍스트, 버튼, 레이아웃 등)로 사용자가 직접 마주하는 부분이다. 집을 지을 때도 우리는 구조 못지않게 미관을 신경 쓰듯, 소프트웨어에서도 프론트엔드는 사용자에게 첫인상을 주고 상호작용을 제공하기 때문에 매우 중요하다고 할 수 있다.


이 비유를 좀 더 자세히 들여다보면, 웹 개발에서 흔히 사용하는 기술들의 역할이 건축의 각 요소에 대응된다. 이를테면 HTML은 웹 페이지의 뼈대와 구조를 담당하는 언어인데, 이는 마치 건물의 토대와 벽에 해당한다. HTML 태그로 내용을 감싸서 구조를 만들고 나면, 그 위에 CSS로 꾸밈새를 입힐 수 있다. CSS는 글자 색을 정하고 배경을 꾸미며 레이아웃을 잡는 등 시각적인 표현을 책임지는데, 이는 페인트칠, 벽지, 카펫, 그림으로 집안을 아름답게 장식하는 일과 같다. 실제로 MDN 웹 문서에서도 “*CSS*는 집을 보기 좋게 꾸미는 페인트와 벽지 같은 것이다”*라고 비유하고 있다. 마지막으로 **자바스크립트(JavaScript)**는 웹에 동적 상호작용을 부여하는데, 이것은 집 안의 전자기기나 가전제품(오븐, TV, 전자레인지 등)에 비유된다. 집에 가전제품이 있어야 실제로 생활에 편리함을 주듯, 자바스크립트는 정적인 페이지에 생명을 불어넣어 사용자와 실시간으로 반응하는 시스템을 만들어준다.


프론트엔드 요소들을 건축 마감재에 빗댄 또 다른 예로, UI 프레임워크에서 버튼이나 아이콘, 메뉴 같은 것들은 사용자가 조작하는 스위치나 레버 같다고 볼 수 있다. 마치 보일러실의 온도 조절기나 건물 엘리베이터의 버튼처럼, 사용자들은 화면의 버튼을 누르지만 그 뒤에는 거대한 기계가 돌아간다. 사용자는 벽에 달린 조그만 스위치를 켜서 건물 전체의 냉난방을 조절할 수 있듯, 웹 앱의 조그만 버튼 하나로 서버의 복잡한 연산을 트리거하거나 데이터베이스의 정보를 불러오기도 한다. 이런 면에서 UI의 구성 요소들은 표면에 드러난 제어판이며, 실제 엔진이나 보일러는 보이지 않는 후면의 시스템 로직이다. 프론트엔드가 깔끔하고 세련되게 디자인되는 것은 잘 마감되고 꾸며진 건물의 인테리어와 외장 디자인이 좋을수록 사람들이 건물에 호감을 가지는 것과 비슷하다. 그러나 겉모습만 번지르르하고 속이 부실한 건물은 금세 문제를 드러내듯이, 프론트엔드가 화려해도 백엔드가 탄탄하지 못하면 사용자에게 쓸모 없는 껍데기에 지나지 않게 된다. 결국 아름다운 외관과 견고한 구조가 조화를 이뤄야 완성도 높은 건축물이 되듯, 프론트엔드와 백엔드의 조화가 좋은 소프트웨어를 만든다고 할 수 있다.


파이프와 흐름: 함수, 파이프라인의 배관 공학

코드를 건축에 비유할 때 동적 측면, 즉 시간이 흐르며 정보가 이동하는 부분을 생각해 보자. 건물에는 수도나 난방을 위한 **배관(파이프)**이 들어가고, 전기를 위한 배선이 깔린다. 보통 사람들에게 보이지 않지만, 물과 전기의 흐름을 건물 전체에 공급하여 생명력을 주는 중요한 요소들이다. 이와 마찬가지로 소프트웨어 내부에는 데이터와 제어 흐름을 전달하는 보이지 않는 연결부가 존재한다. 함수들의 호출 체인, 모듈 간의 데이터 파이프라인, 이벤트 버스나 API 통신 등은 모두 이러한 흐름의 통로에 해당한다.


특히 “파이프라인”이라는 용어는 소프트웨어 공학에서 직접적으로 배관 파이프에서 유래했다. 예를 들어 유닉스(Unix) 시스템의 파이프 | 기호나, 데이터 처리 파이프라인 등에서 이 개념을 찾아볼 수 있다. 파이프라인은 여러 처리 단계가 직렬로 연결되어 한 단계의 출력이 다음 단계의 입력이 되는 구조를 말하는데, **물리적 파이프(plumbing)**에서 물이 한 방향으로 흐르는 모습과 유사하기 때문에 그렇게 부르는 것이다. 실제로 “파이프라인”이라는 이름은 정보가 한쪽 방향으로만 흐른다는 점에서 물이 한 방향으로 흐르는 물리 파이프와의 유사성에서 유래했다고 한다. 코드를 작성하면서 함수들을 이어 붙이거나, 데이터 스트림을 여러 처리기로 흘려보낼 때, 우리는 일종의 소프트웨어 배관 공사를 하는 셈인 것이다.


이러한 “보이지 않는 배관”은 처음 시스템을 접하는 사람에게는 잘 인식되지 않을 수 있지만, 가장 경험 많은 개발자는 흔히 “플러머(plumber) 프로그래머”, 즉 배관공 프로그래머에 비유되곤 한다. 혹자는 “소프트웨어 배관작업은 다른 사람들이 보고 싶어하지도, 생각하고 싶어하지도 않는 것들을 연결해주는 중요한 작업”이라고 언급하기도 한다. 겉으로 보이는 UI나 주요 모듈(큰 상자들)은 그럴듯해 보여도, 실제로 그 상자들을 이어주는 **화살표(연결선)**들을 제대로 구현하는 일이 가장 어렵고도 중요하다는 지적인 것이다. 쉽게 말해, 건물의 크고 아름다운 홀이나 방보다 그 뒤를 흐르는 수많은 관들과 전선들을 설계하고 시공하는 일이 더 어렵다는 것이다. 하지만 잘 동작하는 건물이라면 사용자나 거주자는 그 배관의 존재조차 인식하지 못한 채 편리함을 누릴 뿐이다. 우리가 일상적으로 쓰는 앱이나 웹 서비스도 마찬가지로, 내부의 복잡한 데이터 흐름과 제어 로직이 원활하게 연결되어 있기 때문에 겉에서 버튼 몇 개만 눌러도 필요한 기능을 쓸 수 있는 것이다. 그러므로 훌륭한 소프트웨어 아키텍트는 배관공처럼 눈에 보이지 않는 부분까지 꼼꼼히 설계하여, 전체 시스템이라는 건축물에 혈관과 신경을 깔아 넣는 역할을 수행한다.


프로그래밍에서 파이프와 필터 패턴, 플로우(Flow) 패턴 등은 모두 이러한 흐름의 구축에 관련된 개념이다. 함수형 프로그래밍에서 **함수 합성(function composition)**으로 여러 함수를 파이프라인처럼 연결하거나, 리액티브 프로그래밍에서 스트림으로 데이터 흐름을 표현하는 것도 배관을 조립하는 일과 유사하다. 중요한 것은 각 관의 직경(버퍼 크기)과 연결 방식(동기/비동기, 블로킹/논블로킹 등)을 잘 맞춰줘야 물이 새거나 막히지 않는 시스템을 만들 수 있다는 점이다. 이는 병목 현상을 방지하고 데드락을 피하며, 데이터 손실 없이 흐름을 유지하도록 소프트웨어를 설계하는 일과 통한다. 결국, 함수의 내부는 물이 흐르는 파이프 안쪽 공간이고, 입력이 출력으로 변환되어 흘러나오는 함수의 실행 과정은 복도를 따라 물건을 옮기는 과정처럼 생각해 볼 수 있다. 이런 시각으로 보면 복잡한 알고리즘도 거대한 플랜트의 배관도처럼 그려지고, 우리는 마치 엔지니어가 밸브를 조이고 펌프를 설치하듯이 버그를 수정하고 최적화를 할 수 있게 된다.


모듈식 구조와 조립식 건축: 트랜스포머 모델의 비유

현대 소프트웨어 아키텍처에서는 **모듈화(modularity)****재사용성(reusability)**이 핵심 원칙이다. 이는 건축에서 조립식 건축이나 모듈러 디자인이 각광받는 것과 맥락을 같이한다. 큰 건물을 하나 통째로 현장에서 만드는 대신에, 공장에서 미리 표준화된 모듈(예: 방이나 벽면 유닛)을 찍어내 현장에서 조립하면 속도와 효율이 올라가듯이, 소프트웨어도 모듈 단위로 개발하고 조합하면 유지보수가 쉬워지고 확장이 용이해진다. 다시 말해, 모듈식 아키텍처란 레고 블록처럼 독립적으로 동작 가능한 구성 요소들을 만들어 두었다가, 필요에 따라 조합하여 하나의 큰 시스템을 이루는 방식이다. 모듈 하나하나는 명확한 역할과 경계를 가지며, 잘 정의된 인터페이스를 통해 소통한다. 건축에서도 모듈러 빌딩은 각 블록을 트럭으로 운반해 현장에서 끼워 맞추듯, 소프트웨어에서도 모듈을 API나 이벤트 버스로 연결하여 시스템을 구축한다.


이러한 모듈식 사고의 극치가 바로 최근 AI 혁신을 이끈 트랜스포머(Transformer) 모델이다. 트랜스포머 신경망은 여러 개의 **레이어(layer)**가 반복적으로 쌓인 형태로 이루어져 있는데, 이는 마치 일정한 층고를 가진 건물의 층을 계속 올려 올리는 것과 비슷하다. 각 층(레이어)은 동일한 구조의 모듈을 가지고 있지만, 쌓여가는 과정에서 점점 더 풍부한 표현력을 갖게 된다. 한 비유로, 얕은 신경망이 한두 층짜리 작은 건물이라면, **깊은 신경망(deep network)**은 고층 빌딩에 비유할 수 있다. **“신경망의 각 층은 마치 마천루(skyscraper)의 한 층과 같아서, 한 층 한 층 올라갈 때마다 그 밑에 하나의 층만으로는 얻을 수 없었던 새로운 관점과 기능이 추가된다”**고 표현된 바 있다. 실제로 심층 학습에 대한 설명에서, 첫 번째 층이 단순한 패턴(예: 모서리나 선)을 배우고, 다음 층은 그걸 조합해 더 복잡한 특징(예: 모양이나 윤곽)을 익히며, 가장 높은 층에 가서는 전체 개념(예: 얼굴이나 사물)까지 인식하게 된다는 것이 일반적인 설명이다. 이는 건물을 지을 때 지하 기초를 놓고 1층, 2층 차곡차곡 올려 마침내 높은 빌딩을 완성하는 과정과 유사하다. 낮은 층만 가지고는 볼 수 없었던 탁 트인 전망을 꼭대기 층에서는 바라볼 수 있듯이, 신경망의 깊은 층으로 갈수록 보다 추상적이고 전체적인 이해가 가능해진다.


트랜스포머 모델의 모듈 구조는 현대식 빌딩 블록과도 같다. 트랜스포머를 구성하는 핵심 요소인 **어텐션 헤드(attention head)**나 피드포워드 층 등은 일종의 표준화된 부품으로, 여러 개가 병렬 및 직렬로 배열되어 있다. 이 부품들은 서로 자유롭게 결합 가능하며 모델의 크기에 따라 반복해서 쌓아 올릴 수 있다. 마치 동일한 규격의 창문 패널이나 철골 구조를 여러 번 배치하여 거대한 구조물을 올리는 느낌이다. 이런 모듈 반복 덕분에, 트랜스포머 아키텍처는 설계 개념을 이해하기도 비교적 쉬워졌고(한 층을 이해하면 열 개 층도 비슷한 원리니까요), 대규모 모델을 훈련시키는 것도 작은 모델을 키우는 형태로 확장 가능하다. 즉, 작은 집을 여러 채 모아 연결하여 아파트 단지를 만들 듯, 작은 트랜스포머 블록들을 여러 개 합쳐 거대한 언어 모델(GPT 등)을 구축하는 것이다. 실제로 “모듈러 아키텍처는 여러 개의 빌딩 블록으로 이루어진다”는 것은 클라우드 아키텍처부터 AI 모델까지 현대 기술 전반에 걸친 추세다. 이렇게 재사용과 조립이 가능한 구조를 갖추면, 부분적인 수정이나 업그레이드도 용이해져서 마치 건물의 일부를 리노베이션하거나 증축하듯 시스템을 유연하게 발전시킬 수 있다. aws.amazon.com (참고 웹사이트)


알고리즘과 자료구조: 새로운 건축 공법의 도입

소프트웨어의 세계에서 알고리즘과 자료구조는 어떤 문제를 어떻게 풀고 데이터를 어떻게 조직할지에 대한 핵심 아이디어들이다. 이 개념들을 건축에 비유해본다면, 효율적인 알고리즘의 발명은 새로운 건축 공법의 개발과도 같다. 예를 들어, 건축 역사에서 아치 형태나 **돔(dome)**의 구조가 도입되면서 기존보다 넓은 공간을 기둥 없이 덮을 수 있게 되었고, 철근 콘크리트 공법의 등장으로 고층 건물이 가능해졌다. 이처럼 새로운 공법이나 재료의 등장은 건축물의 규모와 형태, 안정성에 혁신을 가져왔다. 마찬가지로, 컴퓨터 과학에서도 퀵소트(Quick sort) 알고리즘의 발명은 정렬 문제를 기존보다 훨씬 빠르게 해결하는 길을 열었고, 해시 테이블(hash table) 자료구조의 고안은 데이터 검색을 극도로 효율적으로 만드는 등 하나의 패러다임 전환을 가져왔다. 이는 마치 건축가들이 새로운 구조 설계 기법이나 최첨단 자재를 손에 넣은 것처럼, 프로그래머들에게는 더 크고 복잡한 문제를 다룰 수 있는 도구가 생긴 셈이다.

*신공법(新工法)**이란 말을 그대로 풀면 새로운 건설 방법인데, 소프트웨어 개발에서 알고리즘과 자료구조의 개선이 바로 이러한 역할을 한다. 예컨대, 어떤 문제를 정렬 알고리즘으로 풀 때 O(n^2) 시간 복잡도의 버블 정렬은 손으로 벽돌을 하나하나 쌓아 집을 짓는 구식 방법이라 할 수 있습니다. 그런데 O(n log n)의 퀵소트는 거푸집을 만들어 한꺼번에 콘크리트를 부어 올리는 현대식 방법처럼 훨씬 빠르고 효율적인 것이다. 또 연결 리스트(linked list)와 같은 자료구조는 전통적인 목재 가옥의 뼈대처럼 순차적으로 이어지는 구조지만, 트리(tree)나 그래프(graph) 구조는 복층 구조의 건물이나 복잡한 교차로 도로망처럼 분화와 연결이 풍부한 구조를 제공한다. **동시성(concurrency)**을 관리하는 알고리즘들은 마치 건물의 내진 공법이나 방화 설계 같아서, 여러 이벤트나 쓰레드가 동시에 움직여도 시스템이 무너지지 않도록 지탱해 준다. 한편, 메모리 관리 기법(예: 가비지 컬렉션)은 건물의 환기 시스템이나 폐기물 처리 시스템에 비유할 수 있다. 눈에 보이지 않지만 계속 돌아가며 내부를 청결히 유지해주기 때문이다.


종합해보면, 알고리즘과 자료구조는 소프트웨어 건축의 기술적 토대다. 뛰어난 알고리즘은 같은 기능을 보다 가볍고 빠르게 구현하도록 해주므로, 이는 건축에서 더 가벼운 재료로 더 단단한 구조를 만드는 혁신과 비견된다. 더 나아가, AI 시대에는 새로운 머신러닝 알고리즘이나 최적화 기법들이 쏟아져 나오고 있는데, 이를 통해 이전에는 지을 수 없었던 종류의 “지능형 소프트웨어 건축물”을 세울 수 있게 되었다. 딥러닝의 역전파(backpropagation) 알고리즘의 발견은 AI 건축에 철근을 도입한 것이고, 어텐션(attention) 메커니즘의 도입은 복잡한 구조물을 떠받치는 아치 기법을 만든 것에 가깝다. 이렇듯 코드 세계의 신공법들은 우리가 구축할 수 있는 시스템의 범위와 성능을 끌어올려, 더 크고 정교한 코드 도시를 만들어낼 수 있게 해준다.


코드, 사고의 건축물

우리가 코드를 작성한다는 것은 단순히 컴퓨터에게 일련의 명령을 나열하는 것이 아니라, 우리의 사고 과정을 구조화하여 외부에 구현하는 행위라고 볼 수 있다. 철학적인 관점에서 보면, 코드 베이스 전체가 곧 프로그램을 만든 사람(들)의 **사고의 구조(architecture of thought)**를 반영한다. 어떤 문제를 어떻게 접근하고 쪼개었는지, 데이터는 어떻게 흘러가게 했는지, 예외 상황은 어떻게 대비했는지를 코드 구조를 통해 엿볼 수 있기 때문이다. 복잡한 소프트웨어 시스템을 이해하려 할 때, 그것은 결국 그 시스템을 설계한 사람의 생각의 지도를 따라가 보는 과정과 유사하다.


이러한 맥락에서 AI 코드를 다루는 최전선에서는 흥미로운 대화도 오간다. 한 연구 대화에서 어떤 이는 **“이건 코드로 구현된 사고의 아키텍처와 같다(It’s an architecture of thought in code)”**라고 표현하기도 한다. 다시 말해, 코드라는 매개체를 통해 사고의 구성요소들(논리, 추론, 조건, 반복 등)이 건축물처럼 조직화되어 존재한다는 뜻이다. 특히 현대의 AI 에이전트 시스템에서는 여러 모듈이나 에이전트가 서로 메시지를 주고받으며 협력하는데, 이는 각자 하나의 생각의 객체(생각하는 존재)들이 유기적으로 얽혀서 더 큰 사고 과정을 이뤄가는 모습이다. 인간의 두뇌가 뉴런들의 네트워크로 구성되어 사고를 전개하듯, 거대한 소프트웨어 또한 수많은 함수와 객체, 프로세스들의 네트워크로 사고를 전개한다. 그래서 소프트웨어 아키텍처를 설계한다는 것은 일종의 사고 방식을 설계하는 행위라고도 볼 수 있다. 어떤 모듈이 무엇을 알고 무엇을 모르게 할지(정보 은닉), 어떤 부분이 의사결정을 하게 할지(제어 흐름 구조), 언제 병렬로 사고를 전개하고 언제 직렬로 할지(동시성 제어) 등을 결정하는 일인 것이다. 이는 두뇌의 인지 구조를 설계하는 것과 상당히 닮아 있다.


더 흥미로운 점은, AI 시대에는 기계가 인간의 사고 일부를 모방하거나 대신하게 되면서 프로그래밍 자체가 사고의 위임이 되고 있다는 사실이다. 예전에는 사람이 일일이 절차를 코딩했다면, 이제는 머신러닝을 통해 컴퓨터가 스스로 방대한 데이터에서 패턴을 학습하여 내재된 논리 구조를 형성한다. 이는 마치 사람이 아닌 AI 건축가가 스스로 건축물을 설계하는 격이다. 결국 그 내부를 들여다보면 인간이 직접 쓴 코드보다 훨씬 복잡하고 인간의 직관과는 다른 사고의 건축물이 들어서 있을지도 모른다. 이런 상황일수록 우리는 “코드란 무엇인가, 누가 설계도를 그리는가”라는 본질적인 질문을 다시 곱씹게 된다. 코드가 사고의 외부화라면, AI는 우리의 사고 건축물을 스스로 확장하고 재구성하는 존재가 될 것이기 때문이다.


거대한 코드의 도시: AI 시스템을 도시로 바라보다

이제 개별 프로그램을 넘어, 수많은 서비스와 모듈이 얽혀 있는 AI 시스템 전체를 하나의 거대한 도시에 비유해 보자. 앞서 말한 공간 메타포, 건물 메타포, 배관 메타포 등이 모두 포함된 종합적인 그림이다. 도시는 여러 건물과 도로, 다리, 공원, 인프라 설비로 이루어진 복잡한 유기체이다. 마찬가지로, 현대의 AI 시스템은 수많은 컴포넌트(마이크로서비스, 데이터베이스, 캐시, 사용자 인터페이스, 배치 처리 등)가 서로 연결되어 하나의 생태계를 이룬다. 소프트웨어 공학 연구자들은 오래전부터 소프트웨어 시각화 기법으로 이러한 복잡계를 이해하려 했는데, 그중 유명한 것이 **시티 메타포(city metaphor)**이다. *“CodeCity”*라는 도구는 클래스를 건물로 표현하고 패키지(또는 디렉토리)를 도시의 **구역(district)**으로 나타내어 대규모 객체 지향 시스템을 도시처럼 시각화했다. 실제로 대규모 프로젝트의 코드를 들여다보면, 건물 숲 사이를 거니는 도시 여행자처럼 수많은 클래스(건물)와 모듈(구역) 사이를 탐험하는 느낌이 들 때가 있다. CodeCity 메타포에서는 각 클래스의 크기나 복잡도를 건물의 높이나 면적으로 나타내고, 클래스들 간의 의존 관계를 길이나 다리로 표현하기도 한다. 이러한 시각화는 복잡한 시스템의 구조를 한눈에 보여줘서 소프트웨어 도시의 전경을 조망하게 해준다. (참고 웹사이트) wettel.github.io.


도시 메타포가 특히 유용한 이유는, 앞서 언급했듯이 정적 구조와 동적 흐름을 동시에 떠올리게 해준다는 점이다. 실제 도시를 생각해보면, 건물 배치나 도로망 같은 정적인 인프라 구조가 있는 한편, 그 안에서 끊임없이 차량이 움직이고 사람들이 활동하는 동적인 흐름이 있다. 좋은 도시 계획은 두 측면을 모두 고려한다. 마찬가지로, 소프트웨어 도시에서도 구조적 측면(어떤 모듈이 어디에 배치되고 어떻게 계층을 이루는가)과 동적 측면(실행 시 어떤 데이터가 어디로 흐르고 얼마나 많은 트래픽이 생기는가)이 모두 중요하다. 예를 들어 AI 시스템의 한 부분이 대용량의 데이터를 다른 부분으로 전송한다면, 이는 도시의 고속도로에 해당하고 그 구간에 트래픽이 몰릴 것이다. 어떤 모듈은 병목이 되어 혼잡을 빚고, 어떤 서비스는 여유 용량이 남아 한산할 수도 있다. 이런 모습을 도시의 교통 흐름이나 인구 이동에 빗대면 이해가 쉬워진다. 또 보안을 생각해보면, 도시에는 외부 침입을 막는 성벽이나 관문(게이트)이 필요하듯 시스템에도 방화벽(파이어월)이나 인증 게이트웨이가 필요하다. 장애가 발생했을 때를 생각해보면, 한 건물에 화재가 나면 소방차가 출동하고 주변으로 불이 번지지 않도록 방화대책이 있듯, 소프트웨어 도시에서도 한 컴포넌트에 문제가 생겼을 때 트래픽을 우회시키거나 회로 차단기(서킷 브레이커)를 넣어 전체로 번지는 것을 막는 구조가 중요한 것이다.


더 나아가서, 엔터프라이즈 아키텍처 수준에서 보면 대기업의 IT 시스템은 여러 도시로 이루어진 국가나 대륙에 비유할 수도 있다. 클라우드로의 전환은 마치 도시 전체의 리모델링이나 신도시 건설에 해당하여, 기존 도시의 지형과 건물을 크게 바꾸게 된다. 19세기 오스만 남작의 프랑스 파리의 도시개조가 파리의 얼굴을 바꾼 것처럼, 기업이 클라우드 아키텍처로 이행하면 그 IT 도시의 지형이 완전히 새롭게 바뀌게 된다. 이러한 거시적 관점에서 소프트웨어를 바라보면, 개발자는 단순한 코더가 아니라 도시 계획자나 건축가에 가깝다고 할 수 있다. 코드를 짜는 일은 한 빌딩을 세우는 일일 수도 있고, 전체 시스템을 설계하는 일은 스카이라인을 설계하고 도시의 지도를 그리는 일과 같은 것이다.


마지막으로, AI 시스템을 도시로 보는 관점을 통해 우리는 미래의 그림도 그려볼 수 있다. 스마트시티가 IoT와 AI로 도시 자체를 지능화하듯, AI 시스템 도시도 스스로 모니터링하고 최적화하는 자율 도시로 진화할 수 있다. 예를 들어 APM(애플리케이션 성능 관리) 도구나 AI 옵스(AIOps)는 마치 도시의 교통 관제 시스템이나 환경 센서 네트워크처럼 실시간으로 시스템 도시의 상태를 파악하고 문제를 조율한다. 장기적으로는 AI가 도시의 시장(市長) 역할을 해서, 시스템 자원 배분과 최적화, 보안 대응 등을 자동으로 해줄 수도 있을 것이다. 그렇게 되면 인간 개발자는 더욱 창의적인 설계와 개선에 집중할 수 있겠다. 그러나 아무리 자동화되어도 기본 원리는 변하지 않는다: 안정적이고 확장 가능한 시스템을 만들기 위해서는 건축과 도시계획의 마인드로 구조와 흐름을 균형있게 설계해야 한다는 것이다. 코드의 세계를 도시로 보는 은유는 그러한 거시적 시야를 제공하며, 우리가 만드는 AI 시스템이 하나의 살아 숨쉬는 도시임을 일깨워준다.


맺으며: 비유(메타포)로 확장하는 시야

지금까지 코드를 건축에 빗댄 다양한 은유를 통해 소프트웨어 세계를 조망해 보았다. 디렉토리 구조에서 프론트엔드와 백엔드, 파이프라인과 모듈러 아키텍처, 알고리즘의 혁신, 거대한 AI 시스템의 도시 메타포까지, 이러한 비교는 단순히 재미로 끝나지 않는다. 메타포는 우리의 사고를 돕는 강력한 도구이다. 익숙한 개념을 통해 낯선 대상을 이해하면, 복잡한 시스템도 직관적으로 파악할 수 있게 된다. 물론 메타포에는 한계가 있어서, 소프트웨어는 건축과 달리 변경이 쉽고(Agile하게 리팩토링될 수 있고), 실행 중에도 변화하며(동적 재구성, self-modifying code 등) 물리적 제약에서는 자유롭다는 차이가 있다. 그럼에도 불구하고 건축 메타포는 여전히 소프트웨어 공학 교육과 소통에서 유용하게 쓰이고 있고, 우리가 만든 코드에 대한 공간적·구조적 이해를 풍부하게 해준다.


프로그래머이자 디지털 건축가로서, 우리는 매일 무형의 재료를 가지고 새로운 건축물을 세워나간다. 때로는 작은 스크립트 한 줄이 한 장짜리 임시 가건물처럼 쓰이다 사라지기도 하고, 대형 플랫폼의 코드는 마치 수십 년간 계속 증축과 개조를 거듭한 복잡한 건축물처럼 얽히기도 한다. 이 여정에서 건축의 비유를 마음에 품는 것은, 미학과 구조, 사용자 경험과 기능성 사이의 균형을 늘 고민하게 한다는 점에서 의미가 있다. 아름다운 건축물이 기능적이기도 하듯이, 아름답게 구조화된 코드는 유지보수성과 효율, 확장성 면에서도 뛰어나기 마련이다. 또한 대규모 시스템을 바라볼 때 도시 계획자의 시선을 가져봄으로써, 부분 최적화에 매몰되지 않고 전체 시스템의 건강함을 추구할 수 있다.


AI 시대의 코드는 더욱 복잡해지고 방대해지고 있지만, 그 본질은 사고를 조직화한 결과물이라는 점은 바뀌지 않는다. 그러니 오늘도 편집기 앞에 앉은 우리는 작은 방 하나를 짓는 마음으로 함수를 만들고, 그 방들을 연결해 복도를 만들며, 모듈들을 조합해 건물을 올리고, 나아가 디지털 도시의 지평선을 그려나가는 셈이다. 이 거대한 창조 활동을 이해하는 데 있어 건축 메타포만큼 직관적이고 풍부한 안내자도 없을 것이다. 부디 이러한 비유들이 프로그래밍을 배우는 호기심 많은 학생, 입문자, 그리고 모든 성인 학습자 여러분께 새로운 통찰과 즐거움을 주었길 바란다. 코드의 세계는 곧 우리의 사고로 지은 건축물의 세계이며, 그 안에서 우리는 오늘도 멋진 도시를 건설하고 있으니까 말이다.



참고한 자료들: 소프트웨어 아키텍처와 메타포에 관한 다양한 논의medium.comdeveloper.mozilla.org, 파일 시스템의 방/복도 비유unix.stackexchange.com, 파이프라인과 배관의 아날로지encyclopedia.pubjohndcook.com, 모듈러 아키텍처 개념aws.amazon.com, 신경망 층에 대한 비유medium.com, “코드 도시” 시각화와 도시 메타포의 장점wettel.github.ioewernli.com, 그리고 *“코드는 사고의 건축”*이라는 시사적인 견해researchgate.net 등을 참고했습니다. 이런 자료들을 통해서도 알 수 있듯, 메타포는 소프트웨어를 이해하는 데 강력한 다리가 되어줍니다. 우리가 상상하는 코드의 건축물이 앞으로도 더 높이, 더 아름답게 솟아오르길 기대합니다.

월, 목, 토 연재
이전 01화Prologue, 코드는 건축이다: 화면 속으로