'성급한 일반화의 오류'에 해당하는 글 1건

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
개발에서의 일반화는 특정 부분을 일반적으로 사용할 수 있게 만드는 것이라 볼 수 있습니다. 예를 들어 진행하는 프로젝트에서 사용되는 특정 부분이 여러 곳에서 쓸 수 있다고 보여지면 해당 프로젝트에 의존적인 부분을 없애고 좀 더 다양한 상황에 대한 고려를 통해 일반화를 시킬 수 있습니다.

저는 얼마 전 흥미로운 사실을 알게 되었습니다. 그것은 일반화를 시키는 대부분의 경우 처음 일반화를 시킨 사람이 기대하는 것과는 달리 사용이 잘 안 될 때가 많다는 것입니다.
예를 들어 저는 특정 구간의 처리 시간을 측정하기 위한 StopWatch라는 간단한 라이브러리를 만들었던 적이 있습니다. 저는 일반화를 위해 인터페이스 기반의 설계를 했고 확장성을 고려한 디자인을 적용하였습니다. 그리고 나선 공통 라이브러리 저장소에 해당 라이브러리를 등록 해놓았습니다. 물론 리뷰를 통해서 사람들에게 알렸었습니다.
시간이 흐르고 1년이 지났습니다. StopWatch는 어떻게 되었을까요? 1년 동안 저 외에는 아무도 사용을 하지 않았습니다. 또한 StopWatch에 대해서 관심을 보인 사람도 제가 아는 범위에는 없었습니다.

이 경험을 통해 여러 가지 생각이 들었습니다. 저는 당시 해당 부분을 일반화 시키기 위해 적지 않은 시간을 투자했었습니다. 만약 누군가가 이 라이브러리를 이용해서 시간을 아낄 수 있었다면 저의 노력은 헛되지 않았을 것입니다. 그렇지만 결론적으로 아무도 사용하지 않았기에 제가 투자했던 시간은 큰 가치를 가지지 못하게 되었습니다. 또한 제 라이브러리로 인해 공통 라이브러리의 공간 복잡도가 증가했습니다. 이러한 복잡도는 공통 라이브러리를 보는 사람의 이해 속도와 컴파일 속도 등에 영향을 미치게 됩니다. 부정적인 영향이지요.

왜 이런 일이 일어났는지 곰곰히 생각해보았습니다. 제 결론은 '성급한 일반화' 때문이였다는 것입니다. 보통 일반화는 본인이 판단해서 하는 경우가 많습니다. 개발하다보니 이건 일반적으로 쓰이면 좋겠다라고 생각해서 일반화를 하는 것이죠. 하지만 이렇게 일반화 된 것을 놓고 "정말 일반화 되어야 하는 것이였나?"라고 스스로에게 정직하게 질문해볼 때 항상 "예"라는 대답이 나오지는 않을 것입니다. 따라서 일반화를 하기 전에는 정말 일반화가 되었을 때 가치를 가지는지에 대해 신중한 검토가 필요할 것으로 보입니다. 즉 '성급한 일반화'의 오류를 경계해야 한다는 것입니다.

그 다음으로 생각해보고 싶은 점은 일반화의 단계입니다. 일반화의 단계란 일반화가 어떠한 단계로 진행되느냐를 뜻하는데요, 제가 생각하는 잘못된 일반화의 단계는 위 경우와 같이 아무도 필요로 하지 않았는데 하늘에서 떨어지 듯 갑작스레 개인에 의해 일반화의 결과물이 생길 때 입니다. StopWatch는 아무도 필요하다고 한 적이 없었습니다. 단지 제가 누군가에게 필요할 것이라 생각해서 공통 라이브러리에 올렸던 것이죠. 이것은 단지 저만의 생각이였습니다.

그렇다면 어떤 것이 좋은 일반화의 단계일까요? 저는 자바 Annotation 기반의 유효성 검사 라이브러리를 만든적이 있습니다. 처음에는 제 프로젝트에서만 사용했습니다. 제 프로젝트에 코드에 의존적인 부분도 다소 가지고 있었습니다. 그런데 어느날 누군가가 관련 코드를 보더니 괜찮다고 생각했는지 다른 프로젝트에서도 쓰고 싶다고 얘기했습니다. 저는 프로젝트에 의존적인 부분들을 제거하여 공통 라이브러리로 승격시켰고 현재는 팀 표준으로 사용 되고 있습니다. 이 경우엔 처음 얘기했던 StopWatch와는 달리 요구사항을 바탕으로 자연스레 일반화가 된 경우라 할 수 있을 것 같습니다. 저는 방금과 같은 경우가 가장 이상적인 일반화의 단계라 생각합니다.

2008/04/02 ~ 2008/05/02

WRITTEN BY
차민창
르세상스 엔지니어가 사회를 이끌어나가는 상상을 하며!

,