2013/07/22

동료들과 대화를 하다 보면 오버엔지니어링이라는 단어가 종종 나온다. 주로 안 좋은 문맥에서 이 단어를 사용하게 된다. 전임자가 어떤 코드 부분을 오버엔지니어링해 놓아서 이해하기가 어렵다고도 하고, 더 나아가서는 시스템 자체가 오버엔지니어링되어 있어 유지보수에 큰 어려움을 겪는다고 얘기하기도 한다. 오버엔지니어링이 미치는 부정적인 영향이 많아 보인다.

그런데 여러 관점에서 생각해 보니 오버엔지니어링은 단순히 부정적으로 보기에는 아깝고, 여러모로 생각할 만한 거리가 있다고 생각한다. 그래서 이번 글에서 오버엔지니어링에 대한 생각을 정리해 보려고 한다.

오버엔지니어링? 엔지니어링?

오버엔지니어링에 대한 여러 얘기를 나누기 전에 오버엔지니어링에 대한 간단한 정리가 필요할 것 같다. 위키피디아 등의 정의와 더불어 개발자들이 보통 인식하는 오버엔지니어링은 다음과 같다.

현재 필요한 것보다 더 과하게 제품을 디자인하는 것이다. 즉, 제품을 더 견고하게 만들거나, 더 복잡하게 만드는 것이다. 핵심 개념만을 담아 최대한 단순하게 만들자는 최소주의와는 대비되는 개념이다.

예를 들어 실제로는 만 명의 사용자가 쓰는 시스템이 내부적으로는 1억의 사용자에 맞춰 설계·개발되어 있고, 이로 인해 100만 사용자 규모에는 필요 없는 구성 요소들이 들어가 있을 때 오버엔지니어링되어 있다고 얘기한다. 보통 오버엔지니어링되어 있으면 이후 제품을 운영할 때 어려움을 줄 때도 많다. 단순한 구조에서는 간단히 할 수 있는 일을 더 복잡하게 해야 하는 등의 일이 발생하기 때문이다.

추가로 앞으로의 글에서 자주 사용할 ‘엔지니어링’이라는 표현에 대해서도 정리를 해 보고 싶다. 나는 기능 구현을 위해 꼭 필요한 것은 아니지만 안정성이나 확장성을 위해 부가적으로 하는 일을 ‘엔지니어링한다’고 표현한다. 예를 들어 안정성을 위해 입력값을 검사하는 코드를 넣는 것이나, 향후 확장성을 위해 디자인 패턴을 적용하는 것 등이 있다.

이러한 활동이 과다해지는 것을 사람들이 대개 ‘오버엔지니어링한다’라고 표현하는 것을 볼 때 뜻이 적절하다고 본다. 하지만 다른 사람이 동일하게 표현하는 것을 한 번도 못 보아서 확신은 없다.

오버엔지니어링이 시작되는 이유

오버엔지니어링의 정의만 보면 이상할 수도 있다. 왜 필요보다 과하게 만드는 걸까? 내 생각에 개발자가 오버엔지니어링을 하게 되는 계기는 이렇다.

보통 초보 개발자 시절에는 오버엔지니어링을 하지 않는다. 아니, 못한다. 아무래도 개발 실력이 부족할 때는 다른 것에 신경 쓸 여력이 없기 때문이다. 따라서 일단은 단순히 잘 동작하는 제품을 만드는 데 집중한다.

얼마 후 본인이 만든 잘 동작하는 제품을 릴리즈한다. 릴리즈 후 정신없이 고객 문의가 들어온다. 다양한 고객 문의를 보며 안정성, 예외 처리 등 고려하지 못한 부분이 많다는 것을 깨닫는다. 이런 문제를 해결해 가며 잘 동작하는 기능 말고도 중요한 게 있다는 것을 알게 된다.

다음 제품부터는 적절히 엔지니어링을 하기 시작한다. 예전과는 달리 입력값이 잘못 들어왔을 때를 대비한 처리를 해 놓기도 하고, 소스 구조도 단순히 동작하는 것을 넘어 나중에 고치기 쉽게 만들기도 한다. 이런 과정에서 초보 시절 단순히 기능 구현만을 신경 썼을 때보다 소스량이 다소 늘어나게 된다.

보통 이 정도 수준까지는 오버엔지니어링이라고 부르지 않는다. 오히려 코드 리뷰 등을 할 때 이런 부분에 신경 쓴 것에 긍정적인 평가를 받을 때가 잦다. 이렇게 긍정적인 평가를 받다 보면 아무래도 이런 부분을 지속적으로 신경 쓰게 된다.

더 고려해야 할 것이 없는지 비판적인 시각으로 제품을 살펴본다. 경험이 많아짐에 따라 단순히 입력값이 잘못 들어왔을 때를 대비해 몇 줄의 소스를 넣던 수준에서, 시스템 구조 수준에 대비를 하기에 이른다.

예로, 왠지 미래에 생길 것 같은 다양한 보안 요구사항을 고려하여 복잡하지만 유연한 보안 관련 프레임워크를 미리 도입하기도 하고, 당장은 불편하지만 차후 확장성이 좋은 방향으로 저장소 구조를 설계하기도 한다.

이렇게 하는 이유는 잘못된 입력값을 처리하던 이유와 같다. 미래에 있을 법한 일에 미리 대비하여 제품의 안정성 등을 확보하자는 것이다. 이 정도 수준에 이르면 종종 주변 동료에게 “오버엔지니어링 아니냐?”는 도전을 받기도 한다.

엔지니어링은 성공해야 하는 투자

그렇다면 오버엔지니어링은 나쁜 것인가? 예로 저장소 구조에 대한 가상 사례를 가지고 생각해 본다.