소프트웨어 영역에서의 모듈러 디자인 활용
가장 많이 듣는 질문 중 하나가 "소프트웨어에서 모듈러 디자인은 어떻게 적용해야 하나요?"입니다.
사실 대답하기 참 어려운 질문인 것이 소프트웨어는 모듈러 디자인 사상을 포함하고 있다고 해도 무방하거든요.
그렇지 않았으면, 지금까지 소프트웨어 규모가 이 정도 규모로 커지면서 사실상 소프트웨어가 갖는 복잡성은 감당하지 못할 정도로 커지고 지금 우리가 보는 소프트웨어의 시대를 경험하지 못했겠죠.
그런데, 질문의 의도는 사실 그것을 몰라서 묻는 것이 아닐 겁니다. 다른 문제의 해결책을 원하는 거예요.
스스로 소프트웨어 주도권을 가진 회사는 이런 질문을 하질 않아요. 실제로 소프트웨어 플랫폼의 리더십을 가지고 있는 회사, 소프트웨어 중심의 제품 개발 역량을 갖춘 회사는 굳이 이런 질문을 하질 않아도 어떻게 해결해야 하는지 알 수 있죠.
다른 곳에 소프트웨어 주도권을 맡긴 회사, 자체적으로 소프트웨어 개발 역량이 부족하거나 외주에 의존하고 있는 회사, 스스로 소프트웨어 생태계를 꾸려갈 역량이나 경험이 없는 회사일수록 이러한 질문을 합니다.
당연히 제가 답할 영역을 벗어난 것이고요.
그럼에도 소프트웨어 영역에서의 모듈러 디자인이라고 하면 무언가 새로운 것을 기대할 수밖에 없습니다. 모듈러 디자인은 "기구, 하드웨어, 소프트웨어 동일합니다"라고 대답해도 만족스러운 반응이 오지 않는 것은 그런 이유 때문이겠죠.
게다가 소프트웨어 단독이 아닌 기구, 하드웨어 등이 복합적으로 이루어진 시스템에서는 소프트웨어 자체가 모듈러 디자인 사상을 포함한다는 것으로는 부족합니다.
소프트웨어 영역에서의 모듈러 디자인, 정확히 표현하면 복합 시스템에서의 소프트웨어 모듈러 디자인은 달라야 합니다.
첫 번째, “Software as a Module”, 모듈로서의 소프트웨어입니다.
이 부분은 소프트웨어로만 이루어진 제품에는 고려하지 않은 개념인데, 다른 말로는 이식성이 높아야 함을 의미합니다. 예를 들어서, 전투기에 탑재되는 소프트웨어가 전투기의 종류가 바뀜에 따라서 달라져야 한다면 그만큼 개발 비용이나 시간이 소요되겠죠. 반면에, 이식성이 좋으면 전투기 하드웨어가 바뀌더라도 소프트웨어는 바뀌지 않아도 되니까 비용, 시간을 절감할 수 있겠죠.
복합 시스템에서는 이것이 핵심 개념입니다. 보통은 간과하기 쉬운데, 많은 시스템에서 소프트웨어 비중이 커지는 상황에서는 소프트웨어라는 모듈을 타 시스템에 독립적으로 만드는 것만큼 중요한 것이 없습니다.
이런 역량이 떨어질 때 제품을 새롭게 만들 때마다, 모델을 새롭게 만들 때마다 소프트웨어 종류가 그때마다 달라지는 겁니다. 신규로 만들어지는 기구와 하드웨어에 맞춰야 하거든요. 다른 것들은 눈에 보이는 데 소프트웨어는 보이지도 않고, 사람만 때려 넣으면 되니까 해결도 쉬워 보이죠.
그렇지만, 이렇게 시간을 보내면 소프트웨어의 복잡성이 차곡차곡 쌓여서 빚을 청산하는 그 시점까지 기다리게 됩니다.
두 번째, “Software Modularity”, 소프트웨어 모듈화입니다.
이 부분은 앞서 설명한 것처럼 소프트웨어의 복잡성이 증가함에 따라서 자연스럽게 갖게 된 모듈러 디자인 사상에 따른 것인데, 여기에 더해서 첫 번째 개념인 “Software as a Module”을 달성하기 위해서 갖춰야 하는 소프트웨어 개선의 방법인 소프트웨어 모듈화입니다.
소프트웨어 아키텍처를 어떻게 하면 원하는 목적에 맞게 효율적으로 만들 것인가 고민한 결과가 소프트웨어 모듈화가 됩니다.
정리하면, 복합 시스템에서 소프트웨어 모듈러 디자인은 두 가지로 나눌 수 있습니다. “Software as a Module”과 “Software Modularity”입니다.
“Software as a Module”을 달성하기 위한 툴이 바로 “Software Modularity”가 됩니다.
소프트웨어의 중요도가 커지고 규모, 복잡성 증가에 따른 문제를 해결해야 하는 상황이 커지는 과정에서는 위 두 가지 개념의 차이를 명확히 알고 있어야 합니다.
실제로 이것에 대한 이해가 생각보다 높지 않고, 소프트웨어 모듈러 디자인은 별거 없다는 생각을 갖게 되는 경우가 있습니다. 맞습니다. 기구나 하드웨어에 대한 모듈러 디자인과 크게 다르지 않습니다.
다만, 소프트웨어에서의 모듈러 디자인이 “Software as a Module”, “Software Modularity”를 구분해야 한다는 것을 잊게 되면, 이상한 방향으로 개선 방안을 잡게 됩니다.
Image by Gerd Altmann from Pixabay