소프트웨어 요소는 확장에는 열려 있으나, 변경에는 단혀 있어야 하다.
모듈 중 하나를 수정했는데, 그 모듈을 사용하는 모든 모듈의 코드를 수정하는 일이 있으면 안된다는 뜻이다.
조금만 떠올려봐도 얼마나 끔찍한 일인 지 알 수 있다.
이것은 모듈의 동작을 확장할 수 있다는 것을 의미한다.
애플리케이션의 요구 사항이 변경될 때, 이 변경에 맞게 새로운 동작을 추가해 모듈을 확장할 수 있다. 즉, 모듈이 하는 일을 변경할 수 있다.
모듈의 소스 코드나 바이너리 코드를 수정하지 않아도 모듈의 기능을 확장하거나 변경할 수 있다.
그 모듈의 실행 가능한 바이너리 형태나 링크 가능한 라이브러리 (예를 들어, Windows의 DLL, 자바의 jar ...)를 건드릴 필요가 없다.
객체 지향 프로그래밍 언어에서는 "추상화"를 통해서 가능할 수 있다.