노트

섣부른 최적화

Premature Optimization

설계#performance · 연결된 개념 11개

쉽게 말하면

섣부른 최적화는 출근이 늦다고 신발 끈 묶는 시간부터 줄이는 것과 같아요. 실제로 시간을 잡아먹는 건 버스 환승 한 곳일 수 있으니, 먼저 재 보고 거기만 고쳐야 해요.

비유가 깨지는 곳 속도를 아예 무시하라는 뜻은 아니에요. 크누스도 중요한 3%는 놓치지 말라고 했고, 데이터 크기만 봐도 뻔한 복잡도 문제는 처음부터 피하는 게 맞아요.

"섣부른 최적화는 모든 악의 근원이다." 도널드 크누스(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)

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 보이스카우트 규칙

    코드를 처음 발견했을 때보다 조금이라도 나은 상태로 남겨 두라는 규칙. 캠핑장을 떠날 때 왔을 때보다 깨끗하게 하라는 보이스카우트 수칙을 로버트 C. 마틴(Robert C. Martin)이 소프트웨어에 옮겼다. 『리팩터링』도 같은 비유를 쓴다.

  • 심플 디자인

    켄트 벡이 XP(Extreme Programming)에서 제시한 단순한 설계의 네 가지 규칙. 우선순위 순으로 ① 모든 테스트를 통과하고 ② 의도를 드러내고 ③ 중복이 없고 ④ 요소가 가장 적다. 마틴 파울러가 이렇게 정리한 형태가 널리 쓰인다.

  • 구조와 동작, 옵션의 가치

    켄트 벡이 정리 시점을 판단하려고 꺼내는 경제학 틀. 소프트웨어는 두 가지 가치를 만든다. 오늘 하는 일(동작)과, 내일 새로 할 수 있게 되는 일(옵션)이다. 구조는 동작을 바꾸지 않지만 옵션을 만든다.

  • 동적 프로그래밍

    복잡한 문제를 더 작은 부분 문제로 나눠 풀되, 한 번 푼 부분 문제의 답을 저장해 다시 계산하지 않는 방법. 두 조건이 맞을 때 쓴다.

  • 언어적 안티패턴

    이름, 타입, 주석이 말하는 것과 코드가 실제로 하는 일이 어긋나는 것. 읽는 사람을 잘못된 추측으로 이끈다.

보기 옵션