코드는 시(詩)다

클린 코드와 명문의 조건, 그 구조적 필연성에 대하여

by TAFO

나는 개발자다. 그중에서도 조금 특이한 개발자다. 보통은 남이 만들어둔 언어(Java, Python, C++ 등)를 가져와 서비스를 만들지만, 나는 그 도구 자체를 만드는 일을 한다.


지금 내가 CTO로서 팀원들과 함께 깎고 있는 프로그래밍 언어의 이름은 토파즈다. 보석의 이름을 빌려온 이 언어의 설계 철학은 단 한 줄로 요약된다.


"코드가 시가 되는 언어."


이것은 문학적 수사가 아니다. 유지보수 비용인지 부하를 최소화하겠다는 엔지니어링 목표의 다른 표현이다.


시가 불필요한 단어를 깎아내어 의미의 밀도를 높이듯, 좋은 코드는 불필요한 제어문을 걷어내어 로직의 본질만 남겨야 한다. 여기서 말하는 단순함이란, 상태와 분기의 수를 줄여 코드를 읽고 수정하는 경로를 짧게 만드는 것이다.


우리는 이 '압축'과 '정제'의 과정을 개발자의 선의에 맡기지 않고 언어 차원에서 유도하고 표준화하기로 했다. 포매터와 린터를 컴파일러에 내장하고, 표현식 중심 문법을 기본 경로로 설계하여 모든 코드가 자연스럽게 가장 단순한 형태로 수렴하도록 강제하는 것이다.


나는 매일 모니터 앞에서 이 구조적 아름다움을 고민한다. 좋은 코드를 짜는 원리와 좋은 글을 쓰는 원리는 뿌리부터 맞닿아 있기 때문이다.



이름이 존재를 규정한다


성경 창세기에 신이 빛이 있으라 하니 빛이 생겼다는 구절이 있다. 프로그래밍에서도 변수나 함수의 이름을 짓는 순간, 메모리라는 무의미한 공간에 비로소 의미가 생긴다.


하지만 현실의 코드는 모호함 투성이다. 영어로 억지로 번역된 greet(name)은 한국인 개발자에게 한 번의 뇌내 번역 과정을 요구한다. 이 읽기 비용오해 비용은 프로젝트가 커질수록 기하급수적으로 늘어난다.


우리는 토파즈에서 유니코드 식별자를 전면 허용하고, 한글과 영문 표준 API를 동시에 제공하기로 결정했다.

코드는 시 1.png


물론 리스크는 있다. 정규화 불일치나 혼동 문자, 그리고 일부 레거시 도구와의 호환성 문제가 뒤따른다. 이를 통제하기 위해 우리는 컴파일러 레벨에서 NFC 정규화를 강제하고, 시각적으로 혼동될 수 있는 문자가 섞이면 빌드 경고를 띄우도록 설계했다.


단어 하나가 문맥 전체를 지배한다. 정확한 이름을 찾는다는 것. 그것은 단순한 취향의 문제가 아니라, 시스템의 모호함을 제거하는 가장 확실한 설계 결정이다.



흐름을 방해하지 않는 연결


좋은 글은 물 흐르듯 읽힌다. 문장과 문장 사이에 턱이 없어 독자가 숨 쉴 틈 없이 빨려 들어간다. 코드도 마찬가지다. 데이터가 변환되는 과정이 뚝뚝 끊기지 않고 자연스럽게 이어져야 한다.


기존의 중첩 함수 호출 func(func2(data))는 결과를 '안쪽에서 바깥쪽으로' 읽게 만들어, 개발자가 실행 순서를 역으로 복원해야 하는 인지 부하를 준다.


우리가 토파즈에 파이프라인 연산자 |>를 도입한 이유다.

코드는 시 2.png


중간 결과를 저장하는 임시 변수나 복잡한 괄호의 중첩은 사라졌다. 오직 데이터가 강물처럼 흘러가며 정제되는 과정만이 남았다. 실행 순서를 표면 문법에 그대로 노출함으로써, 코드를 읽는 비용을 획기적으로 낮춘 것이다.


더 나아가 우리는 실패 또한 이 흐름 위에서 다뤄지길 원했다. Result 타입과 ? 연산자가 파이프라인과 자연스럽게 결합되어, 예외 상황조차 으로 취급되어 흐름을 끊지 않고 하류로 전파된다.



뺄셈의 미학


글쓰기의 제1원칙은 "부사를 죽여라"다. 화려한 수식어는 자신 없는 문장의 방패막이다. 코드의 세계에서는 이것을 표현식 중심 설계로 구현한다.


기존 언어들이 상태를 변경하는 '문장' 위주라면, 토파즈는 모든 것이 값을 반환하는 '표현식'이다.

코드는 시 3.png


if-else 블록을 만들고, 변수를 선언하고, 값을 대입하는 번거로운 과정이 사라진다. 불필요한 임시 상태대입을 줄임으로써, 로직의 복잡도를 낮추는 것이다.


물론 표현식만으로 모든 부수 효과를 없앨 수는 없다. 하지만 최소한 부수 효과가 끼어들 틈을 줄이고, 상태 변경의 경계를 선명하게 드러낼 수는 있다.


"Write Less, Express More."


최소한으로 쓰되 최대한으로 표현하는 것. 이것은 문학적 구호가 아니라, 버그가 숨을 곳을 없애려는 엔지니어링 전략이다.



구조적 필연성


결국 시와 코드의 공통점은 필연성이다. 이 단어가 아니면 안 되는 이유, 이 위치에 이 명령어가 있어야만 하는 이유.


시인이 단어 하나를 바꿨을 때 시 전체의 운율이 깨지듯, 개발자가 코드 한 줄을 잘못 건드리면 시스템 전체가 무너질 수 있다. 이 불안정성을 막기 위해 우리는 강력한 타입 시스템과 코드 블록 매크로를 도입했다.

코드는 시 4.png


유니온 타입과 패턴 매칭의 결합은 개발자가 모든 경우의 수를 처리했는지를 컴파일러가 검증한다. 이는 논리적 구멍을 원천적으로 막는 타입 안전성이다.


또한, 우리는 단순한 문자열 치환이 아닌 구조를 이해하는 템플릿을 제공한다.

코드는 시 5.png


잘못된 쿼리는 컴파일 단계에서 거부되고, 팀마다 제각각인 관용구는 매크로를 통해 하나의 표준 구조로 고정된다. 이것은 개발자의 실수를 런타임이 아닌 설계 시점에 잡아내겠다는 의지다.



단순함은 엔지니어링이다


세상은 점점 복잡해진다. 소프트웨어의 엔트로피는 필연적으로 증가한다. 이 무질서 속에서 질서를 유지하는 유일한 방법은 단순함을 유지하는 것이다.


프로그래밍 언어는 단순히 기능의 목록이 아니다. 그 언어를 사용하는 팀의 사고방식을 고정하는 도구다. 토파즈는 그 사고의 흐름을 '단순함과 안전함' 쪽으로 유도하는 실험이다.


우리가 추구하는 아름다움은 단순히 보기에 좋은 코드가 아니다.


읽기 쉽고, 흐름이 명확하며, 실수가 필연적으로 걸러지는 코드. 그래서 내일의 내가 수정하기 두렵지 않은 코드다.


진실은 언제나 단순하다.


그리고 그 단순함은 치열한 복잡함을 정제해 낸 결과물일 때만 비로소 아름답다.


오늘도 나는 토파즈의 컴파일러를 다듬으며 생각한다. 이 언어로 쓰일 미래의 코드들이, 누군가에게는 읽는 즐거움을 주는 한 편의 시가 되기를. 논리의 차가움 속에 견고한 안전함이 담기기를.


그렇게 코드는 시가 된다.


Kiev 4AM / Helios-103 53mm f1.8 / Kentmere 100
이전 01화가장 느리고 위대한 부팅