소프트웨어 개발에서 '단순함(simple)'과 '쉬움(easy)'은 종종 같은 의미로 사용되지만, 실제로는 매우 다른 개념입니다. 단순함은 시스템 구성 요소들이 서로 얽히지 않은 상태를 의미하며, 이는 객관적으로 평가할 수 있는 구조적 특성입니다. 반면 쉬움은 도구에 대한 접근성, 개인의 익숙함, 그리고 이해 능력에 따라 달라지는 주관적인 경험을 뜻합니다. 좋은 소프트웨어를 만들려면 단기적인 작성의 쉬움보다는 장기적인 유지보수와 신뢰성을 위한 단순한 구조를 우선해야 합니다.
인간의 인지 능력은 제한적이므로, 요소들이 얽혀 있는 복잡한 시스템은 이해하고 변경하며 디버깅하기 어렵습니다. 테스트와 타입 검사 같은 안전망은 중요하지만, 프로그램의 근본적인 이해를 대체할 수는 없습니다. 상태(state), 객체(object), 상속(inheritance), 조건 분기(conditional branching)와 같이 익숙한 도구들도 독립적일 수 있는 개념들을 결합하여 복잡성을 증가시킬 수 있습니다. 대신 값(value), 함수(function), 데이터(data), 독립적으로 연결 가능한 다형성(polymorphism à la carte) 등을 활용하면 같은 수준의 시스템을 더 단순하게 만들 수 있습니다. 모듈화나 캡슐화만으로는 단순함을 보장하지 않으며, '무엇을', '누가', '어떻게', '언제', '어디서', '왜' 수행하는지를 명확히 분리하는 것이 중요합니다.
초기에 단순함을 고려하고 구조를 분리하는 작업은 시간과 노력이 필요하지만, 장기적으로는 변경의 독립성과 유연성을 확보하여 개발 속도를 높입니다. 쉬움에만 집중하고 복잡성을 무시하면 처음에는 빠르게 진행되는 것처럼 보여도, 누적된 복잡성으로 인해 결국 개발 속도가 느려지고 유지보수 비용이 증가합니다. 따라서 기술을 선택할 때는 단순히 작성하기 쉬운지보다, 그 기술이 만들어낼 소프트웨어의 구조적 단순성과 장기적인 특성을 평가해야 합니다. 단순함은 시스템의 이해, 변경, 디버깅을 용이하게 하며, 정책 변경이나 구성 요소 이동에 대한 유연성을 높여 궁극적으로 더 신뢰할 수 있는 소프트웨어를 만듭니다.