"섣부른 최적화는 모든 악의 근원이다." 도널드 크누스(Donald Knuth)가 1974년 글 「Structured Programming with go to Statements」에서 쓴 말이다. 원문의 맥락은 작은 효율은 대부분(약 97%)의 경우 잊으라는 것이고, 정말 중요한 3%는 놓치지 말라는 말이 이어진다.
- 프로그램은 대부분의 시간을 코드의 아주 작은 부분에서 쓴다. 전체를 고르게 최적화하면 노력의 대부분이 낭비다(핫 패스)
- 시스템을 잘 안다고 해도 추측하지 말고 측정한다. 프로파일러를 돌려 보면 예상이 틀렸음을 알게 되는 경우가 많다(롭 파이크의 프로그래밍 5규칙)
- 순서: 먼저 동작하게, 다음에 올바르게, 필요하면 빠르게
- 최적화된 코드는 대개 복잡하다. 그래서 측정으로 병목을 확인한 뒤에만 그 복잡성을 받아들인다
리팩터링과의 관계
리팩터링하면 잠시 느려질 수 있지만, 잘 정리된 코드는 병목을 찾고 고치기도 쉽다. 그러니 평소에는 다루기 쉬운 코드에 집중하고, 최적화 단계에서 측정하며 튜닝한다(리팩터링, 반복문을 파이프라인으로 바꾸기). 최적화의 첫째 규칙은 "하지 마라", 둘째 규칙은 "아직 하지 마라"라는 농담도 있다.
React에서 모든 컴포넌트에 메모이제이션을 두르는 습관도 같은 함정에 빠지기 쉽다(memo·useMemo·useCallback, React Compiler). 다만 데이터 크기를 따져 보면 뻔히 보이는 복잡도 문제는 처음부터 피하는 게 맞다(빅오 표기법).
출처: Laws of Software Engineering: Premature Optimization (Knuth's Optimization Principle) · 『리팩터링 2판』 마틴 파울러 (원서 Refactoring, 2nd Edition)