[개발자를 위한 통계학 찍먹하기] 0편 - 동기
서론
나는 그동안 포트폴리오에서 발견되는 성능 테스트에 대한 회의론을 갖고 있었다.
정량적 데이터에 의한 동기만으로 성능 테스트가 수행된 경우, 어디서 본 듯한 이유와 어디서 본 듯한 개선, 짜맞춘 의도에 짜맞춘 개선밖에 볼 수 없었고, 정성적 데이터에 의한 동기만으로 성능 테스트를 수행한 경우, 트레이드오프를 고려하지 않은 단순한 오버엔지니어링으로밖에 보이지 않았다.
따라서, 해당 성능 테스트에서 작성자들의 문제 해결 능력을 이해하기가 어려웠다.
하지만, 아무것도 안하는 것보다는 낫다는 걸 나 스스로도 인정하고 있긴 했다.
그래서, “할거면, 논리적으로 하자.” 라는 결론에 도달하게 되었다.
정량적 VS 정성적 데이터 차이 파악하고 균형 있는 설문조사 실시하기
정량적 데이터와 정성적 데이터. 비슷하게 들리지만 완전히 다른 특성을 가지고 있는 두 데이터는, 각각의 성격과 차이점을 파악하고 알맞게 설문조사에 활용할 필요가 있습니다.
ko-blog.smore.im
성능 개선의 효과를 논리적으로 검증할 방법은 없나?
나에겐 정량적 + 정성적 분석을 모두 수행하기 위한, 가설 수립 & 검증 방법이 필요했다.
인터넷과 도서에서는, “실제 사용자 수치/적당한 수치를 사용하고, 오버엔지니어링을 피해라” 라는 이야기를 찾을 수 있었고, 이는 나에겐 너무 추상적이거나, 이전에 없던 서비스의 경우, 데이터 자체에 접근할 수 없다는 문제에 압박감을 느끼고 있었으며, 실제 사용자 수치를 직접 만들기엔 나 스스로도 “논리적으로 검증된 예상 데이터입니다.” 라고 이야기할 수 없었다.
그리하여 이 “논리적 접근”에 대한 기존에 다른 분야에서 사용하고 있는 방법은 없나? 라는 주제에 대해 탐구하다가, “통계학의 이론을 가져다 쓰면, 좀 더 엄밀한 성능 개선의 검증이 가능하지 않을까?” 라는 가설을 세우고, 실험 설계와 성능 테스트의 진행 과정을 비교해보기 시작했다.
실험 설계와 성능 테스트의 진행 과정
성능 테스트
성능 테스트는 다음과 같은 5단계를 거친다.
- 목표 설정
- 변수 정의 및 통제
- 계획 및 실행
- 데이터 수집 및 분석
- 결론 도출
목표 설정
이 과정에서는, 우리가 테스트로 얻고자 하는 정보/목표를 명확히 하여, 엉뚱한 방향으로 테스트가 길어지는 것을 방지하고 테스트의 목적을 명확히 해야 한다.
- 특정 변경 사항이 성능에 미치는 영향을 파악하기 위해
- 특정 수치까지의 성능 개선을 목표로 설정하기
- 특정 부하 시나리오에서 시스템의 한계를 파악하기 위해
변수 정의 및 통제
이 과정에서는, 성능에 영향을 주는 요인과 측정하려는 성능 지표를 정의해야 한다.
이때, 테스트 환경을 최대한 일정하게 유지해야 한다.
- 요인
- 동시 사용자 수
- 요청 유형
- 데이터 크기
- 성능 지표
- 평균 응답 시간
- 99% 사용자들의 응답 시간
- 에러율
- CPU/메모리 사용률
계획 및 실행
- 테스트 시나리오(워크로드 모델) 설정
- 테스트 환경 구성
- 측정 지표, 반복 횟수 등을 포함한 테스트 계획 수립
- 테스트 수행
데이터 수집 및 분석
실제로 수집된 데이터를 CS지식을 이용해 풀어내야 한다. 각 수치에 대한 논리적 근거를 분석하고, 어디서 문제가 발생했을지 “짐작”한다.
- 성능 지표 데이터 수집
- 수집된 데이터들이 의미있는 데이터인지 평가
- 성능 추세나 병목 지점 판단
결론 도출
- 분석 결과를 바탕으로 성능 개선 방안 도출
- 시스템의 현재 수용 가능한 부하 수준 판단
실험 설계
조사 결과, 실험 설계도 다음과 같은 5단계로 정의할 수 있음을 알 수 있었다.
- 목표 설정
- 변수 정의 및 통제
- 계획 및 실행
- 데이터 수집 및 분석
- 결론 도출
목표 설정
- 독립 변수가 종속 변수에 미치는 영향을 검증하기 위해
- 독립변수가 종속변수를 최적화하는 최적의 조건 탐색하기 위해
변수 정의 및 통제
- 독립변수/종속변수/통제변수 설정
- 통제변수 관리
- 고정값 설정
- 무작위화
계획 및 실행
- 실험 단위, 반복 횟수 등을 포함한 실험 계획 수립
- 실험 실행
데이터 수집 및 분석
내가 실제로 가장 알고 싶었던 부분이었다.
- Effect Size 측정
- 신뢰 구간 측정
- p-value 검증
- 난이도 높은/베이지안 확률론적 검증 방법 사용
결론 도출
- 연구 가설에 대한 결론 도출
- 추가적인 실험 설계 가능
이 과정에서, 몇가지 인사이트를 얻을 수 있었다.
통계학 학습 트레이드오프
1. 통계학을 학습하게 될 경우 얻게 될 이득
- 성능 테스트는 실험 설계를 위한 가설 데이터가 되어준다.
- 통계학은 성능 테스트로 얻은 가설을 입증할 도구가 되어준다.
2. 통계학을 학습하게 될 경우에 대한 리스크
- 가볍게 알아봤을 뿐인데, 작정하고 깊게 들어가면 개발 생산성에 손해가 될 듯 하다는 느낌을 받았다.
- 실제로 실무에서는 좀 더 사용자의 긴급한 요구사항을 즉각 반영해야 해서, 해당 절차를 일일히 밟고 있다간
따라서, 성능 테스팅/모니터링에 대한 인사이트를 얻을 수 있는 수준으로 학습하자는 결론에 도달했다.
- 논리적으로 올바른 테스트 분석을 수행하기 위하여
- 현재 시스템의 수용 가능한 부하 수준 테스트
- A/B 테스트
- 성능 튜닝 및 벤치마킹
- 장애 분석 및 이상 감지
- 사용자 행동 분석
의미 없는 시간이 될 수도 있지만, 일단 도움이 될거라는 믿음 하에 학습 시작. 추후에 회고로 어떠한 도움이 되는지 작성해보겠다. (회고 - 작성예정)