소프트웨어의 Coupling & Cohesion
지난 글에서 다룬 커플링에 이어 이번에도 역시 Kent Beck의 글을 바탕으로 응집력(혹은 결속)에 대해서 알아보기로 하겠습니다.
여기서도 Kent Beck은 안전의 관점으로 설명합니다.
How much of each thing, with more of each thing making change safer.
앞에서도 설명했듯이 여기서 안전이란 소프트웨어를 개발하고 서비스하는 공동체의 심리적 안정감까지를 포함한 경제적 개념입니다. 편안하고 쉽게 고칠 수 있냐는 것이죠. 필요할 때 고칠 수 있어야 소프트웨어 시스템은 생명력을 얻습니다. 생명력은 물론 은유입니다만, 돈이 돌고 공동체를 구성하는 사람들이 모이고 경제활동을 누리죠. 안전과 경제란 개념이 묶여 있다는 점이, 쓰고 보니 흥미롭습니다.
안전한 정도를 어떻게 비교할 수 있을까요? Kent Beck은 매우 쉬운 예로 설명합니다. 하나는 5줄 함수를 고친다고 가정합니다.
Let’s say you have a 5 line function. In order to change the behavior of the system you have to change all 5 lines at once.
큰 어려움이 없습니다. 대체로 안전하다고 말할 수 있겠죠. 반면에 100줄 함수의 가운데 있는 5줄의 코드를 고친다고 해보죠.
Put those 5 lines in the middle (or worse, scattered around) a 100-line function. Now you have a problem. Which of the preceding lines matter for the change you want to make? Which of the following lines are affected by the change you want to make?
수정해야 할 코드의 앞뒤에서 변화에 영향을 줘야 하는 부분이나 영향을 받는 부분을 파악해야 합니다. Kent Beck의 비교를 현실로 가져오면 100줄 함수 하나가 아니라 호출 관계로 엮인 여러 파일에 흩어진 여러 개의 코드일 수 있습니다. 파악해야 할 요소가 많고 누락하면 실수할 가능성이 높아집니다. 나아가 한 사람이 수정하는 것이 아니라면 실수할 확율은 매우 높아집니다. 이쯤되면 안전하지 않다고 할 수 있겠네요.
이제 Kent Beck이 역설적이라고 표현하는 부분이 등장합니다.
This leads to the seeming paradox that the more coupled an element is, the better. But only inside the element.
앞서 결합하는 정도가 높아지면 안전에 위해를 가한다고 설명했는데, 응집력을 설명하면서 결합이 강해질수록 안전해진다고 설명하니 그렇겠죠. 개인적으로 저는 매우 흥미롭게 느꼈습니다. (마치 과학에서 다루는 핵의 원리를 연상하게 하는 듯해서)
주의할 점은 결합의 위치가 요소 내부에서 강화할 때만 그렇다는 점을 이해해야 합니다.
함수 안에서는 수정할 부분이 딱 붙어있을수록 좋다는 말이죠. 응집의 본래 의미를 떠올려보면 이해에 도움이 됩니다. 물질의 바깥의 요소와 물질 내부의 요소가 붙으려고 할 때는 다른 말을 사용하지 응집력 있다고 말하지는 않잖아요?
If changing 1 line of a function requires changing all 4 other lines, excellent! The lines of the function are completely coupled, so change is quicker, safer, easier.
Kent Beck이 들려주는 예시는 요즘 IDE를 이용하면 자동으로 변경(refactor)해주는 기능으로 더욱 안전하고 편하게 해결할 수도 있다는 생각이 듭니다. (코딩 안한지 오래되서)
이제부터 다소 어려운 내용입니다.
I was pairing with a long-time student once. We needed to change 2 out of 10 lines of a function. Out of habit? Reflex? Experience? they extracted those 2 lines as a helper function, changed the 2 lines, then inlined the helper back into the original function. That’s leveraging cohesion.
papago 번역을 보죠.
레버리지(leveraging)는 요즘 부동산이나 주식 투자가 늘면서 금융 분야에서도 자주 쓰입니다. 기술적으로는 스태틱 혹은 람다 함수를 채용하는 일을 예로 들었는데, 어떤 면에서는 빚을 져서 더 나은 단계로 나아가자는 면에서는 투자랑 유사하다는 생각을 할 수 있습니다.
경제성에 따른 세밀한 의사결정이 결합도와 응집력에 대한 미묘한 문제입니다. 그 다음 문구는 놀랍게도 중용을 떠올리게 합니다.
The resolution of the paradox is that if you increase coupling inside of an element you tend to decrease coupling outside of it.
둘 중에 하나를 선택하는 OX 문제가 아니라 어느 방향으로 갈지를 결정하는 미묘한 문제입니다.
마무리는 정원관리하는 저의 습관에 빗대어 설명하겠습니다.
It can be difficult to see how to de-couple elements. Increasing cohesion, on the other hand, is easier to imagine. That’s what the tidyings are, ways of increasing cohesion at the smallest scale.
확신에 차서 결단할 수 없다면 섬세하게 쓸모(usecase)나 맥락(context)을 이해하면 바라봐야 점차 개선할 수 있는 방법을 조금씩 깨달을 수 있습니다.