해결책
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% 미만)만 줄였고, 팀은 이를 멈춤의 신호로 삼아 계속 조정하는 대신 남은 아이디어를 장기 백로그로 옮겼다.
근거 확인하기
출처
- Picking Low Hanging Fruit Ramp Engineering · builders.ramp.com ·