brunch

You can make anything
by writing

C.S.Lewis

by 안영회 습작 Nov 20. 2023

소프트웨어 설계와 간접 연결성 그리고 모듈화

한국의 마틴 파울러가 되기

<후배 덕분에 한 번 더 생각하는 객체 지향>은 다음의 댓글 대화로 마무리했습니다.

댓글 대화가 추가적인 사유를 자극하다

후배가 다시 댓글을 남기면서 다시 끊었던 생각을 하게끔 유도했습니다.

그 생각 중에서 기록으로 남길 만한 가치가 있는 내용을 추려서 글로 씁니다. 크게 두 가지 주제에 대해 쓰려고 합니다. 하나는 박문호 박사님 표현을 빌면 '대칭화'에 대한 이야기이고, 다른 하나 역시 <월말 김어준> 10월호 박문호 박사님의 강의 <꿈은 기억의 진화과정이다>에서 들었던 '간접 연결성'이란 개념이 준 자극입니다.


소프트웨어 설계와 대칭화

대칭화는 박문호 박사님의 영상에서 학습법의 하나로 강조하신 내용입니다.

제가 영상을 듣고 메모한 내용에 따르면 대칭화의 효용성은 다음의 세 가지입니다.

대칭화하면(불필요한 내용을 제거하여 추상화하면) 작용이 일목요연하게 보인다

기억 용량 줄인다

입자 물리학에 근거해서 착안한 것이라서 보존과 관련이 있다

일단, 세 가지 중에서 제가 활용할 수 있는 대칭화 개념은 앞의 두 가지를 포용한 개념입니다.[1] 대칭화와 관련해서 소프트웨어 설계에 연결할 수 있는 부분에 대해 설명해 보겠습니다.


현실과 컴퓨터 프로그램, 거기에 설계를 더하기

마침 요즘IT에 기고하려고 쓰는 글에 다음 그림을 넣었는데, 후배가 질문한 내용을 담은 그림이었습니다. 공교롭게 비슷한 시기였기에 브런치 글에도 같은 생각이 담긴 것일 수도 있습니다. 아무튼 아래 그림은 애초에 Kent Beck이 그린 그림을 수정한 것인데, 원래 그림은 시차를 설명한 것이었지만 저는 다른 의미로 쓰려고 고친 것이죠.

바로 External world가 현실 세계라면 시스템은 하드웨어의 제한을 받는 또 다른 체계(혹은 세계)이고 프로그램은 이들 사이의 매핑에 대한 문제입니다. 여기서 설계라고 하면 각자 다른 현상 세계를 지닌 사람들의 협업 위에서 수행하는 아슬아슬한 협업이란 인식이 생긴 것입니다.


그런데 저 그림을 그릴 때에는 현실과 컴퓨터 세상 둘의 대칭이었는데, 후배의 질문에 의해 중간에 설계라는 협을 두니 훨씬 더 복잡한 일이란 인식을 하게 된 것이기도 합니다.


매핑(Mapping)과 대칭 그리고 간접 연결성

여기서 저는 스스로 생각의 함정(?)에 빠지게 됩니다. 이런 질문을 던진 것이죠.

매핑과 대칭화가 같은 것인가? 아니라면, 무슨 관계가 있나?


흔히 매핑(mapping)이라고 하면 함수(function)를 뜻하기도 하고, 지도의 상징물과 물리적 실제 장소를 연결하는 일 따위를 나타냅니다. 그런데 그런 함수 관계가 항상 대칭이라고 할 수는 없습니다. 대칭에 가깝게 하려는 노력들이 있다는 점은 떠오르지만 대칭화와 매핑은 같을 수가 없습니다. 앞서 메모한 대칭화 효과를 고려해서 예시를 찾아보면 Interface-Implementation 쌍을 만드는 정도가 대칭화라 할 수 있을 듯합니다.


그런데, 간접 연결성이라고 하면 매핑과 부합합니다. 범주화하고 다시 연결하는 과정에서 간접 연결성이 만들어집니다. 그러고 보니 제가 가장 유용한 설계 원칙이라고 주장했던 '느슨한 결합(loosely-coupled)'의 다른 이름이 다름 아닌 간접 연결성이었습니다.


간접 연결성 구현 과정에서 뒤따르는 모듈화

박문호 박사님 영상을 보면 대칭화는 모듈화와 매우 밀접하게 관련이 있습니다. 언젠가 오테라에서 테슬라의 모듈화 역량을 혁신으로 강조했던 장면이 떠올랐습니다. 소프트웨어 개발을 하다 보면 디펜던시 지옥이라는 것을 만나곤 합니다.

이를 해소하는 개념이 대칭화와 모듈화라고 할 수 있는데, 대칭화는 어쩌면 소프트웨어를 하드웨어로 변환하는 일이라고 보이기도 합니다. 아직 정리가 덜 된 생각이라 의식의 흐름을 그대로 기록하고 보관하고 공유합니다.


주석

[1] 보존과 연관성을 가진 대칭 역시 흥미롭지만 현재 제가 이해하고 활용할 수 있는 내용은 아닙니다.


지난 한국의 마틴 파울러가 되기 연재

1. 현실과 시스템의 불일치, 그리고 UX의 역할

2. 대상과 조건 그리고 자기 속도에 부합하는 조건 만들기

3. Code Smells 비유와 기술 부채

4. 기술 부채를 Code Smell로 관리할 수 있는가?

5. 형상 구성단위로 TestCase 유용할까?

6. 설계 요소의 사분면

7. 입자와 파동의 이중성을 소프트웨어 설계에 응용하기

8. 즉흥적으로 그린 그림에 입자와 파동 이중성 적용하기

9. 소프트웨어 설계에서 입자의 응용

10. 소프트웨어 설계에서 파동의 응용

11. 설계란 무엇인가 IV Part.1

12. 설계란 무엇인가 IV Part.2

13. 설계는 변화에 대한 준비인가?

14. 대상이 되는 사태의 주요 내용을 한 장에 담다

15. 스윔레인으로 경계와 상호작용 드러내기

16. 짝 프로그래밍처럼 함께 설계하기

17. 짝 모델링으로 탄생한 상태도 초안

18. 동료의 상태도를 검토하기

19. 분산 환경 무결성 문제와 상태도 연결하기

20. 후배 덕분에 한 번 더 생각하는 객체 지향

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari