노트

본질적 복잡성과 우발적 복잡성

Essential Complexity and Accidental Complexity

설계#architecture · 연결된 개념 5개

쉽게 말하면

이사할 때 짐이 많아서 힘든 건 본질적 복잡성이고, 박스에 이름을 안 써서 다시 뒤지느라 힘든 건 우발적 복잡성이에요. 짐 자체는 못 줄여도, 뒤지는 수고는 정리 방식을 바꾸면 줄일 수 있죠.

비유의 한계 우발적이라고 다 쓸데없는 실수는 아니에요. 그 시절 도구로는 피할 수 없던 수고도 포함되고, 이미 많이 줄인 지금은 그것만 없애서는 생산성이 몇 배로 뛰지 않아요.

소프트웨어를 만드는 어려움을 문제 자체에 속한 본질(essence)과 지금의 만드는 방식에 따라붙었을 뿐 본래 속하지 않는 우발(accident)로 나누는 구분이다. 프레드 브룩스(Fred Brooks)가 1986년 논문 "No Silver Bullet — Essence and Accidents of Software Engineering"에서 아리스토텔레스의 용어를 빌려 제시했다.

브룩스의 구분

  • 본질적 작업: 데이터, 데이터 사이의 관계, 알고리즘, 함수 호출이 맞물린 개념 구조를 명세·설계·테스트하는 일. 브룩스는 소프트웨어의 어려운 부분이 여기 있다고 본다
  • 우발적 작업: 그 개념 구조를 프로그래밍 언어로 표현하고, 공간·속도 제약 안에서 기계어로 옮기는 일
  • 본질에 속하는 속성으로 복잡성(complexity), 순응성(conformity, 사람이 만든 외부 제도·인터페이스에 맞춰야 함), 변경 가능성(changeability), 비가시성(invisibility)을 든다
  • 과거의 큰 생산성 향상은 대부분 우발적 어려움을 줄인 데서 왔다. 논문은 고급 언어와 시분할(time-sharing)을 예로 든다

논문 제목의 주장은 이렇다. 남은 노력 중 우발적인 부분이 9/10을 넘지 않는 한, 우발적 작업을 0으로 줄여도 10배 향상은 나오지 않는다. 그래서 기술 하나나 관리 기법 하나로 생산성·신뢰성·단순성을 10년 안에 10배(한 자릿수 차수)만큼 높여 주는 "은 탄환"은 없다고 본다.

실무에서 쓰는 방식

오늘날 이 구분은 코드를 볼 때 던지는 질문으로 쓰인다. "이 복잡성은 문제가 요구하는가, 우리가 고른 구현이 만들었는가?"

  • 송금처럼 한도, 중복 방지, 실패 처리 규칙이 많은 도메인의 복잡성은 본질적이다. 없애려 하면 안전장치가 빠진다. 대신 도메인 개념으로 나누고 규칙을 테스트로 고정해 코드에 드러나게 한다
  • 반복되는 변환 코드, 과한 설정, 쓰지 않는 호환 코드는 우발적이다. 도구와 구조를 바꿔 줄인다(KISS 원칙, 구성요소 줄이기)
  • 반대로 우발적 복잡성을 "도메인이 원래 복잡하다"며 방치하는 것도 흔한 실수다

없앨 수 없는 복잡성을 누가 떠안을지 묻는 복잡성 보존의 법칙은 본질적 복잡성을 다루는 다른 관점이고, 추상화가 감춘 세부가 새어 나오는 누수 추상화의 법칙은 우발적 복잡성이 되돌아오는 한 모습이다.

출처: Frederick P. Brooks, Jr., "No Silver Bullet: Essence and Accidents of Software Engineering" (UNC TR86-020, 1986)

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 심플 디자인

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

  • 기술 부채

    지금 지름길을 택한 대가로 나중에 갚아야 할 비용을 빚에 빗댄 말. 워드 커닝햄(Ward Cunningham)이 1992년에 처음 썼다. 원금은 언젠가 제대로 고치는 비용이고, 이자는 지저분한 코드 때문에 매번 더 드는 개발 시간이다.

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

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

  • 소프트웨어 공학의 법칙들

    소프트웨어 시스템과 팀, 의사결정에 반복해서 나타나는 경험칙들을 모아 부르는 말. 법칙이라고 부르지만 대부분 증명된 정리가 아니라 관찰과 격언이다. 판단할 때 떠올릴 이름표로 쓴다. 따로 노트를 둔 것은 링크로, 나머지는 한 줄로 적었다.

  • 인지 부하

    작업 기억이 한 번에 처리해야 하는 양. 문제 자체의 복잡함과 표현 방식에서 오는 복잡함으로 나뉜다.

보기 옵션