2023년 7월, Ramp의 Python 모놀리스 테스트 스위트는 실행에 45분이 걸렸고, 느린 테스트 때문에 회사 전체의 머지 큐가 밀리고 있었다. 엔지니어들은 대기 중인 변경 사항을 지켜보기 위해 반나절을 비워두어야 했다. 2년 전 사내 게시물에서 이미 느린 테스트가 엔지니어링 생산성을 해친다고 지적했지만, 그 후로 아무 조치도 없었다.

큰 재작성에 착수하는 대신, 팀은 먼저 측정했다. 45분 중 약 38분은 pytest 호출 자체에서 발생했다. 프로파일링 결과 테스트 실행은 CPU에 묶여 있었고, 그래서 첫 번째 수정인 더 빠른 CPU만으로 실행 시간이 약 50% 줄었다. 이는 전체 프로젝트에서 가장 큰 단일 개선이자 찾는 데 가장 적은 노력이 든 개선이었다.

그 후 엔지니어들은 각자 이미 맥락을 갖고 있던 범위로 나뉘어 저렴한 병렬 실험을 진행했다. 자체 호스팅 러너의 도커 레이어 캐싱으로 1분 이상을 절약했고, pytest-xdist 작업 분할 알고리즘을 재작성해 2~3분을 절약했으며, 테스트 데이터베이스를 늘리고 Postgres 연결 설정을 조정해 20개 이상의 워커가 같은 데이터베이스에 몰릴 때 생기던 잠금 경합을 해결했다. 모든 실험이 성과를 낸 것은 아니었다. 테스트 데이터를 RAM에 마운트하는 방식은 이득이 없어 폐기했지만, 각 실험은 시도해 볼 가치가 있을 만큼 저렴했다.

상승 여력이 큰 저렴한 실험을 추구하고, 이득이 줄어드는 순간 멈춰라

먼저 측정한 것(45분 중 38분이 pytest 호출 자체였고 CPU에 묶여 있었음) 덕분에 팀은 추측 대신 실제 병목을 고쳤다.

가장 효과가 크고 노력이 적은 수정을 먼저 한 것(더 빠른 CPU, 약 50% 개선)이 추진력을 만들고 더 위험한 아이디어를 탐색할 시간을 확보했다.

병렬의 저비용 실험으로 나눈 덕분에 팀은 하나의 큰 변경에 모든 것을 걸지 않고 많은 가설을 빠르게 검증할 수 있었다.

변경별로 절약된 시간을 그래프로 그리자 수익 체감 곡선이 눈에 보였고, 팀은 한계 이득을 위해 계속 다듬는 대신 멈출 수 있는 구체적인 신호를 얻었다.

조정하기 전에 측정하고, 가장 효과가 큰 항목을 먼저 고친 뒤, 저렴한 실험 포트폴리오를 병렬로 실행하라. 그리고 각 이득이 줄어드는 크기를 멈춤의 신호로 삼아라.

일주일 후, 스위트는 5분 이내에 실행되었고, 이는 원래 45분에서 대략 70% 이상 줄어든 것이었다. 그 주가 끝날 무렵의 새로운 개선은 실행 시간에서 겨우 몇 초(5% 미만)만 줄였고, 팀은 이를 멈춤의 신호로 삼아 계속 조정하는 대신 남은 아이디어를 장기 백로그로 옮겼다.

근거 확인하기

출처

  1. Picking Low Hanging Fruit Ramp Engineering · builders.ramp.com ·