작지만 위대한 최적화

11

발행일: 2025년 06월 04일

다음 날 아침, 데이비드 첸은 팀 전체를 다시 ‘전쟁 상황실’로 소집했다. 회의실 중앙의 화이트보드에는 여전히 ‘1200ms’라는 치욕적인 숫자가 남아 있었다. 데이비드는 알렉스가 보낸 분석 결과를 대형 스크린에 띄웠다.

“모두 이걸 주목해주게.”

화면에는 XML과 프로토콜 버퍼의 성능 비교 데이터가 선명하게 보였다. 30배 이상의 성능 차이. 회의실에 미묘한 술렁임이 일었다.

한 시니어 엔지니어, 마크가 팔짱을 낀 채 입을 열었다. 그의 목소리에는 노련한 전문가의 회의감이 묻어 있었다.

“데이비드, 존중하는 마음으로 말씀드리지만, 이건 마이크로초 단위의 차이입니다. 우리가 잃고 있는 시간은 1초가 넘어요. 수백만 배나 큰 문제 앞에서 이건 너무 사소한 부분 아닙니까?”

그것은 합리적인 의심이었고, 회의실에 있던 대부분의 엔지니어들이 가진 생각이기도 했다. 하지만 알렉스는 주눅 들지 않았다. 그는 자리에서 일어나 스크린을 가리켰다.

“마크의 말씀이 맞습니다. 한 번의 연산으로는 미미한 차이입니다. 하지만 저희 시스템은 입찰 요청 한 건을 처리하기 위해 이 직렬화와 역직렬화 과정을 최소 네 번 이상 거칩니다. SSP 시뮬레이터에서 데이터를 생성하고, 저희 거래소에서 그 데이터를 해석하고, 다시 DSP 시뮬레이터로 보낼 데이터를 생성하고, DSP 측에서 또다시 해석하죠.”

그는 잠시 숨을 고르고 말을 이었다.

“그리고 이것이 초당 수백, 수천 건씩 반복됩니다. 이건 한 방의 강력한 펀치가 아니라, 수천 번의 잽이 누적되어 다운을 만드는 것과 같습니다. 저희는 가장 기본적인 데이터 전송 단계에서부터 엄청난 비효율을 안고 달리기 시작했던 겁니다.”

회의실의 공기가 바뀌었다. 알렉스의 논리에는 군더더기가 없었다. 거시적인 구조만 보던 시니어 엔지니어들은, 가장 미시적인 영역에서 벌어지는 누수를 간과했다는 사실을 깨닫기 시작했다.

데이비드는 결단을 내렸다.

“좋아. 논쟁은 여기까지. 데이터가 우리에게 길을 보여주고 있어. 지금 즉시 시스템의 데이터 교환 방식을 XML에서 프로토콜 버퍼로 전환하는 패치 작업을 시작한다. 사라, 알렉스와 함께 이 작업을 맡아줘. 두 시간이면 되겠나?”

“충분합니다.” 사라가 대답했다.

알렉스의 심장이 세차게 뛰었다. 자신의 발견이 실제 시스템에 반영되는 순간이었다.

사무실로 돌아온 알렉스와 사라는 즉시 작업에 착수했다. 알렉스는 그가 작성했던 API 규격서를 프로토콜 버퍼의 정의 파일(.proto) 형식으로 재작성했다. 사라는 그 정의를 기반으로 시스템의 핵심 통신 모듈을 교체했다. 두 사람의 손가락이 키보드 위에서 춤을 췄다.

약속했던 두 시간이 채 지나지 않아, 패치 작업이 완료되었다. 팀원들은 다시 스크린 앞에 모였다. 이전 테스트의 실패가 남긴 긴장감과, 이번에는 다를 것이라는 기대감이 뒤섞여 있었다.

데이비드가 다시 테스트 명령을 입력했다. 모두가 숨을 죽이고 ‘평균 응답 시간’ 숫자를 바라보았다.

숫자가 나타났다.

185ms.

“…됐다!”

누군가 외쳤다. 그 외침을 시작으로 회의실은 환호성으로 가득 찼다. 1200ms에서 185ms로, 지연 시간이 85% 가까이 줄어든 것이다. 아직 목표치인 100ms에는 미치지 못했지만, 이제는 해볼 만한 싸움이 되었다. 불가능의 영역에서 가능성의 영역으로 들어온 극적인 변화였다.

모두가 흥분해 있을 때, 데이비드는 조용히 알렉스의 어깨를 잡았다. 그리고 팀 전체가 들을 수 있도록 큰 소리로 말했다.

“모두들 기억하게. 가장 거대한 문제의 해답은 때로 가장 작고 기본적인 곳에 숨어 있다. 알렉스는 우리가 당연하게 여겼던 ‘가정’ 자체에 질문을 던졌고, 그 결과 막혀 있던 길을 뚫어냈다. 훌륭했어, 알렉스.”

그 순간, 알렉스는 비로소 자신이 이 팀의 일원으로, 이 혁명의 동료로 인정받았음을 느꼈다. 그의 첫 번째 위기 극복은, 프로그래머틱 광고의 역사에 기록될 작지만 위대한 최적화의 시작이었다.