품질과 숙련을 향한 의지, 사람의 손길이 느껴지는 소프트웨어를 갈망하며, 생성형 코드의 범람 속에서도 ‘사자의 발톱’—장인정신의 표식—을 찾아 나서는 이야기.
2025년 10월 22일
나는 품질 좋은 소프트웨어와 그것을 만드는 사람들을 존중한다. 그리고 나 역시 그런 사람이 되기 위해 내 삶의 수년을 쏟아부었다(여정은 길고 험난했으며 YAML도 잔뜩 필요했지만). 나는 소프트웨어의 정확성을 중시하고, 올바른 인터페이스를 정의하는 일에서 기쁨을 느끼며, 앱을 두루 걸어다닌 끝에 숙련을 향해 수년을 투자해 온 사람들이 쓴 코드를 보고 사용해 왔다. 그리고 우리 나머지 대부분이 쓰는 코드도 보고, 나 역시 그런 코드를 써 왔다.
이기적으로 말하자면, 더 많은 사람이 숙련을 열망하길 바란다. 코드를 잘 쓰고자 하는 마음은 코드 자체를 아끼는 것이기도 하지만, 더 중요하게는 코드 반대편에 있는 사람들을 아끼는 마음이기 때문이다. 나는 개발자가 다른 개발자와 사용자들을 신경 쓰는 세상을 원한다. 시니어들로 이루어진 팀이 좋은 코드를 배포하고, 주니어를 멘토링하며, 프로덕트 매니저들과 오픈소스 커미터들과 함께 일하는 세상을 원한다. 이번 주에 더 잘나가는 어느 AI 연구소에서 온 트렌치코트를 걸친 에이전트 셋이 30분마다 조용히 CRUD 잡탕을 토해내고, 나는 뇌 한켠으로 대충 승인만 눌러주는 그런 세상은 원하지 않는다.
아마 내가 숙련과 배려의 가치를 처음 깨달았던 때는 대학교를 막 졸업하고 첫 직장을 다닐 때였다. 신입 애널리스트였던 나는 리포트를 시니어 애널리스트에게 검토받으러 가져갔다. “그 SQL이 맞는지 두 번 확인했어?” 그녀가 물었다. 나는 확인하지 않았고, 그녀가 내 데이터를 돌렸을 때는 다른 결과가 나왔다. 그 뒤로 나는 항상 내 일을 다시 확인하는 법을 배웠다.
그보다 조금 뒤, 스키마가 없는 스토어에서 관계형 데이터베이스로 데이터를 추출하려는 시니어 아키텍트와 함께 일했다. 그는 며칠에 걸쳐 준비했다. 먼저 스테이징 환경과 백업을 만들고, 파일에 타임스탬프를 꼼꼼히 붙여 이전 실행으로 롤백할 수 있게 한 뒤, 같은 작업을 여러 번 반복 실행했다. 종종 내가 볼 때면 그의 의자는 비어 있었다. 데이터베이스를 소유한 팀과 회의 중이었기 때문이다. 우리가 그들의 서비스에 데이터를 추출하러 트래픽을 보낼 때, 그 서비스가 넘어지거나 그들에게 영향이 가지 않도록 하기 위해서였다. 마침내 작업이 끝난 뒤에도 끝난 게 아니었다. 우리는 다운스트림 리포팅 결과와 대조해 숫자가 일치하는지 확인했다.
이런 종류의 배려, 탁월함과 숙련을 향한 노력은 단일한 요소로 이루어지지 않는다. 하지만, 브라키스토크론 문제에 대한 익명의 해답을 받고 그게 아이작 뉴턴의 것임을 알게 되었을 때 베르누이가 말했듯, “발톱만 봐도 사자인 줄 안다.”
최근의 훌륭한 글 하나는 업계 프로그래머 대부분이 ‘불순한 엔지니어’라고 말한다. 우리는 늘 비즈니스 제약과 현실에 맞닥뜨리며, 기술 해법의 핵심만을 신경 쓰는 ‘순수한 엔지니어’들이 누리는 시간과 여유를 갖지 못한다는 것이다.
하지만 커리어 내내, 내가 내 알파벳 라디오를 맞춰 가며 반복해서 깨달은 건 의도가 중요하다는 사실이었다. 우리가 거의 모두 불순한 엔지니어이자 그저 인간일 뿐이고, 스프린트는 이틀 뒤 끝나는데 티셔츠 사이즈 M짜리 태스크도 아직 못 끝냈더라도, 불순한 엔지니어가 순수함의 수준에 가깝게 일하려 애쓸수록(그리고 일하기 쉬운 사람이 되기라는 두 번째 일도 해낼수록) 나는 그들과 함께 일하고 그들의 소프트웨어를 쓰고 싶어졌다.
나는 Redis, cURL, uv, Ghostty, sqlite, llama.cpp 같은 소프트웨어에서 사자의 발톱을 알아본다. 우아하고, 잘 만들어졌으며, 숙고되고 사려 깊은 소프트웨어. 쓰는 일이 기쁜 소프트웨어. 나를 도와주는 소프트웨어. 나는 이런 소프트웨어를 쓰고 싶고, 만들고 싶고, 프로그래밍을 하는 우리 모두가 이런 소프트웨어를 낳는 과정을 가치 있게 여길 수 있도록 보상받는 세상을 원한다.
생성형 코드와 함께, 사자에게 다가가려는 노력이 점점 더 어려워졌다. 모델들이 생산하는 코드는 말 그대로 ‘미드(mid)’, 즉 뛰어난 스택 오버플로 답변들의 압축된 가중 평균이자, 동시에 “회귀 전에 설명 변수와 반응 변수를 서로 독립적으로 정렬하면 무슨 일이 일어나나요?” 같은 질문들까지 모두 섞은 평균이기 때문이다. 일정 주기로 갱신되는 공개 소프트웨어 전부의 평균을 훈련 데이터 수프에 뒤섞고, 어떤 자의적 지표에 따라 RLHF를 적용한 결과물인 만큼, 그것이 줄 수 있는 건 품질의 그림자뿐이다.
우리는 범람하는 평균과 엉성함에 휩쓸리고 있고, 이를 막아 보려 애쓰고 있다. 그럼에도, 모델과 그 생태계가 아무리 좋아진다 해도, 나는 점점 더 사람이 핸들을 잡고 썼다는 걸 아는 소프트웨어를 원하게 된다. 우리는 여전히 추론과 미적 판단, 아키텍처에서 더 낫다.
가장 좋은 코드는 없는 코드이고, 프로그래밍은 여전히 형편없고 앞으로도 그럴 것이다. 그럼에도 나는 여전히 발톱, 곧 숙련의 표식을 찾는다. 그 표식은 다른 사람에게 직접 닿고자 하는 사람에게서 나오기 때문이다. 나는 발톱을 보고 싶다. 발톱이 있다면, 화면 저편에는 살아 숨 쉬는 사자가 있고, 우리를 끌어올리고 소프트웨어 엔지니어 공동체로서 서로를 묶어 주는 소프트웨어를 만들고 있다는 뜻이니까.