소프트웨어 개발 현장에서 '완벽함'이라는 단어는 종종 과잉 설계(over-engineering)와 동일시되며 경계의 대상이 됩니다. 하지만 이는 큰 오해에서 비롯된 것입니다. 이 글은 과잉 설계가 '너무 잘 만드는 것'이 아니라 '잘못된 문제를 해결하는 것'이라고 명확히 지적하며, 진정한 완벽함은 명확한 요구사항 정의에서 나온다고 강조합니다.
저자는 완벽한 솔루션이 존재한다고 주장합니다. 단, 이는 모든 제약 조건과 요구사항이 명확하게 정의되었을 때만 가능합니다. 예를 들어, 새로운 프로젝트에서 서버리스(serverless) 환경과 파이썬(Python)을 선택하는 것이 어떤 팀에게는 완벽한 선택일 수 있지만, 다른 팀에게는 성능 요구사항이나 언어 숙련도에 따라 부적절할 수 있습니다. 즉, '완벽함'은 절대적인 기준이 아니라 주어진 제약 조건과 요구사항에 가장 잘 부합하는 유일한 해답을 의미합니다. 시스템을 마치 제품처럼 다루고, 사용자의 니즈를 깊이 이해하며 솔루션의 형태를 결정해야 합니다.
과잉 설계의 가장 명확한 징후는 '왜 이렇게 만들었지?'라는 질문에 대한 답이 명확하지 않을 때 나타납니다. 예를 들어, 세 명의 팀원이 다섯 개의 마이크로서비스(microservices)를 유지보수하며 데이터 무결성을 희생하는 경우를 들 수 있습니다. 이는 독립적인 배포와 같은 특정 문제를 해결하려 했지만, 실제로는 팀 규모나 도메인 복잡성 측면에서 불필요한 분산 시스템의 복잡성과 운영 오버헤드를 초래한 것입니다. 결국, 과잉 설계는 요구사항 수집의 실패, 즉 '잘못된 요구사항'을 바탕으로 열심히 개발한 결과이며, 모호한 요구사항이 진정한 적이었음을 시사합니다. 명확한 요구사항을 정의할 때 비로소 완벽한 솔루션이 현실이 됩니다.