소프트웨어를 만드는 어려움을 문제 자체에 속한 본질(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 원칙, 구성요소 줄이기)
- 반대로 우발적 복잡성을 "도메인이 원래 복잡하다"며 방치하는 것도 흔한 실수다
없앨 수 없는 복잡성을 누가 떠안을지 묻는 복잡성 보존의 법칙은 본질적 복잡성을 다루는 다른 관점이고, 추상화가 감춘 세부가 새어 나오는 누수 추상화의 법칙은 우발적 복잡성이 되돌아오는 한 모습이다.