프로그래밍과 복잡도
Nov 25, 14
프로그래밍을 "잘" 하는 것이 어떤 것인지에 대해 다양한 의견이 있을 것이다. 개인적으로는 복잡도를 다루는 것이 프로그래밍의 핵심 중 하나라고 생각한다. 우리는 복잡한 것을 애초에 잘 다루지 못하고 이는 프로그래밍에도 똑같게 적용된다. 다양한 프로그래밍 관련 조언은 복잡도의 개념에서 바라볼 수 있다.
추상화abstraction는 복잡한 요소를 생략하고 꼭 필요한 부분만 노출하여 복잡도를 낮추는 기법이다. 이렇게 추상화된 여러 조각들이 서로 느슨하게 연결loosly coupled되면 각각 조각의 의존성이 적어져서 조각 하나하나를 독립적으로 받아들일 수 있고 이를 복잡한 조각의 분해decomposition라는 측면에서 받아들일 수 있다. 간접화indirection는 자체적으로는 복잡도를 증가시키는 행위이지만 간접적으로 참조되는 조각을 교체할 수 있도록 해주면서 궁극적으로는 복잡도를 다루는데 도움을 주는 필요악이라 하겠다.1
훌륭한 프로그래머가 복잡도를 잘 다룬다는 점에서 훌륭한 프로그래머가 복잡한 프로그램을 잘 만들지 않는다는 점도 추론할 수 있다.2 프로그래밍을 할 때마다 복잡도를 다루는 능력의 중요성을 느끼는데, 어떤 과정을 통해서 복잡도를 다루는 능력이 키워지는지는 아직 잘 모르겠다.
Zed Shaw가 indirection과 abstraction 사이의 관계에 대해 잘 쓴 글이 있다.↩
켄트 벡의 Competence = 1 / Complexity 참조↩