워드 커닝햄은 Wiki를 만든 유명한 프로그래머이다. 특히, 기술 부채(Technical Debt)라는 용어를 도입하기도 했다. 여기서는 이 기술 부채라는 용어를 다루고 있는 글을 이야기 해보자.
 
기술 부채라는 것은 [1]에서도 언급하듯이 소프트웨어 개발에서 발생하는 문제를 금융 부채에 비유한 것이다. 이글에서는, 초기 개발에서 빠르게 기능을 구현하기 위해 '부채'를 지는 것은 괜찮을 수 있지만, 이는 나중에 이는 갚아야 하는 '이자'와 함께 돌아오며 결국 원금까지 상환해야 한다는 점을 강조하는 것이라 볼 수 있다. 코드의 품질이 떨어지면 생산성이 낮아지는 것이 이자의 형태로 나타나는 것이고 이를 문제를 해결하는 것이 원금 상환하는 것까지 포함하는 것이다. 워드 커닝햄은 이 부채는 리팩토링을 통해 상환해야 한다고 한다. 상환하지 않으면 시간이 지남에 따라 문제들이 누적되어 전체 개발 조직이 만들 수 있는 진행 사항 자체가 멈출 수 있다고 보고 있다.
 
글에서도 이야기 하지만, 나는 기술 부채가 투자와 같은 것에 레버리지(Leverage)로서의 측면도 있다고 본다. 즉, 빠른 시장 출시를 위해 이 기술 부채를 활용하기도 한다. 기술 부채를 지는 것은 초기 제품을 더 빨리 시장에 출시하여 비즈니스 가치를 제공할 수 있게 한다는 것다. 이는 시장에 적기에 출시해서 이득도 얻을 수 있고, 또한 빠른 피드백을 얻고, 이를 바탕으로 제품을 개선하는 데 유리하기도 하다. 그러므로, 기술 부채를 전략적으로 사용하는 것은 스타트업이나 신제품 개발에서 중요한 전략이 될 수 있다. 즉, 단기적으로는 부채를 통해 빠르게 성과를 내고, 이후에 이 부채를 상환하는 방식으로 진행할 수 있는 것이다. 하지만, 우리가 자주 놓치는 것은 이 부채의 상환 계획이다. 다시 말해, 부채가 누적되지 않도록 지속적으로 관리해야 하는 것이다. 리팩토링 활동을 통해 생산성을 회복하고, 부채의 이자를 줄이는 것이 중요하다.
 
조금 더 구체적이지만 단순하게 생각해보자. 비유에 따라서 우리 접근 방법도 생각해 보자. 우리가 금전적으로 부채가 있다고 생각해보자. 무엇부터 해야 할까? 우선은 이자가 높은 부채 부터 갚아야 할 것이다. 그러므로, 기술 부채도 우선 순위를 정해서 이자와 원금을 먼저 갚는 것이 맞다. 우선 순위를 정했다면 실재로 내 금전적 상황에 따라서 아낄 것은 아끼고 이자와 원금을 갚아야 한다. 개발에서는 리팩터링과 개선 작업을 하는 것이다. 이는 코드의 구조, 중복, 복잡성 등 여러 측면에서 이루어질 수 있다. 부채를 갚아 본 이는 알지만, 정리가 되면 갚아야 하는 돈을 추가로 버는 듯한 느낌이어서 활력을 더 느끼기도 한다. 즉, 기술 부채 개념을 적절히 활용하면 초기 개발 속도를 높이고 장기적으로는 품질 유지와 개선을 할 수 있다. 하지만, 금융에 대한 비유에서 알 수 있듯이 시간을 어떻게 활용하고 밸런스 있게 운용하는지 고민하는 것이 더 중요하다.
 
 

참고 자료

[1] Jean-Louis Letouzey and Declan Whelan, " Introduction to the Technical Debt Concept ", https://www.agilealliance.org/wp-content/uploads/2016/05/IntroductiontotheTechnicalDebtConcept-V-02.pdf

Object-oriented Reengineering Pattern[1]의 저자인 세르게이 디마이어의 허락을 받아 번역을 시작한다. 전에 김창준님이 내가 관심이 있겠다고 소개해서 알게된 책이기도 하다. 이 책은 출판이 된적이 있지만, 크리에이티브 커먼즈로 공개되었다. 그렇다 하더라도, 번역하는데 허락을 받을 필요가 있다고 생각해서 저자에게 연락을 하여 확인하였다. 1장의 리엔지니어링 패턴을 번역하면서 [2]에 공유하고 내용을 요약해서 적어 본다.

 

1장의 내용은 소프트웨어 리엔지니어링(Software Reengineering)에 대해 다루고 있다. 특히, 레거시 시스템의 문제를 식별하고 개선하는 다양한 방법을 포함하며, 이를 통해 시스템을 더 유지보수가 가능하고 최신 요구 사항에 대응 가능하도록  조정하는 과정으로서 리엔지니어링을 설명한다. 주요 내용은 다음과 같다.

 

  • 리엔지니어링의 필요성: 레거시 소프트웨어 시스템이 비즈니스에 중요함에도 불구하고 많은 비용이 들어 업그레이드나 교체가 어렵기 때문에 리엔지니어링이 필요하다.
  • 리엔지니어링의 목적: 레거시 시스템의 복잡성을 줄이고, 적절한 비용으로 시스템을 계속 사용하고 적응할 수 있게 하는 것이다.
  • 리엔지니어링의 이유: 성능 개선, 시스템을 새 플랫폼으로 이전하기 위함, 유지보수 비용 절감, 시스템에 대한 지식 문서화 등 여러 가지 구체적인 이유가 있다.
  • 리엔지니어링 과정: 문제가 있는 레거시 시스템을 식별하고, 개선 방법을 모색하여 구현하는 과정을 포함한다. 이 과정에서 리버스 엔지니어링과 리엔지니어링의 차이점을 설명한다.
  • 리엔지니어링 패턴: 리엔지니어링 과정에서 사용되는 패턴의 양식을 소개한다.

 

참고 문헌

[1] Serge Demeyer et al., "Object-oriented Reengineering Patterns"

[2] https://github.com/blcktgr73/OORP 

마틴 파울러는 [1]에서도 소개했지만, "Refactoring"으로 유명하고, 여러 저서의 저자이기도 하다. 그는 애자일리스트로 엔지니어링 실천법(engineering practices)에 집중하는 익스트림 프로그래밍(Extreme Programming, XP)의 추종자이다.
 
마틴 파울러의 웹사이트에서 여러가지 소개하고 있는데, 소프트웨어 아키텍처에 대해 설명하는 글[2]도 포함되어 있다. 여기서 그는 소프트웨어 아키텍처는 소프트웨어 "시스템의 중요한 내부 설계"를 의미한다고 정의 하며, 좋은 아키텍처는 시스템이 "진화"할 수 있도록 지원해야 한다고 강조한다. 이것이 마틴이 이야기하는 애자일 소프트웨어 아키텍처의 핵심이라고도 할 수 있겠다.마틴은 이 글에서 팀이 좋은 아키텍처를 만드는 방법과 아키텍처 사고를 어떻게 개발 조직에서 장려해야 하는지에 대해서도 이야기하는데 그내용도 살펴 보자.

아키텍처의 진화

마틴 파울러의 웹사이트에서 진화적 아키텍처는 요구사항의 변화를 수용하고 지속적인 피드백을 통해 시스템이 개선될 수 있도록 지원한다고이야기 한다. 그리고,  소프트웨어 아키텍처가 일회성 계획이 아닌 지속적인 과정으로 설명한다. 그리고, 이를 위해서 다음 사항에 대해서 강조한다.
 

  • 반복적 개발과 피드백 루프: 소프트웨어 개발 과정에서 짧은 반복주기를 통해 지속적으로 통합하고 테스트하는 방식을 사용함으로써, 아키텍처를 점진적으로 발전시키는 방법을 강조한다. 이는 고도의 협업과 지속적인 개선을 가능하게 한다.
  • 피트니스 펑션의 활용: 아키텍처의 상태를 모니터링하고 진화의 방향을 가이드하는 데 사용되는 '피트니스 펑션' 개념을 사용하여 아키텍처의 건강을 측정하고 관리한다.
  • 데이터 관리의 중요성: 진화적 아키텍처에서는 오래 지속되는 데이터의 처리가 종종 간과되기 쉬운 문제로, 이에 대한 강조를 통해 데이터 관리와 관련된 전략을 체계적으로 다루어야 함을 강조한다.
  • 마이크로서비스와 도메인 주도 설계: 큰 단일 시스템을 더 작고, 독립적으로 관리 가능한 마이크로서비스로 분해하는 과정에서, 중요한 비즈니스 기능을 식별하고 이를 기반으로 서비스를 분리하는 전략을 사용한다. 이는 시스템의 유연성을 높이고, 변경 관리를 용이하게 한다.


마틴이 늘 강조하듯이 이러한 점들은 소프트웨어 아키텍처가 단순히 기술적인 문제가 아니라, 지속적인 비즈니스 가치를 창출하고 유지하는 중요한 역할을 한다는 것을 강조한다. 진화적 아키텍처 접근 방식은 변화하는 비즈니스 요구와 기술 환경에 효과적으로 대응할 수 있도록 돕는다고 설명한다.
 

팀이 만드는 좋은 아키텍처

마틴은 아키텍처가 팀에서 나온다고 믿는데, 팀이 좋은 아키텍처를 만드는 방법에 대해 다음과 같이 설명한다.

  • 지속적인 학습과 피드백: 팀은 반복적인 피드백 루프를 통해 아키텍처를 지속적으로 개선해야 한다.
  • 협업과 소통: 개발자 그리고 여러 이해관계자 간의 긴밀한 협업이 필요하다.
  • 작은 변경의 관리: 아키텍처를 점진적으로 변화시켜야 하며, 이는 작은 단위의 변경을 통해 이루어져야 한다.
  • 자동화와 테스트: 지속적인 통합과 테스트 자동화를 통해 아키텍처의 품질을 유지해야 한다

 

개발조직이 아키텍처적 사고를 가지는 방법

팀이 아키텍처 사고를 가지기 위해서 마틴은 다음 사항들을 강조하고 있다:

  • 교육과 훈련: 팀원들에게 아키텍처 원칙과 패턴을 교육한다.
  • 협업 문화: 개발자 간의 적극적인 협업을 촉진하여 아키텍처 관련 논의를 장려한다.
  • 피드백 루프: 정기적인 코드 리뷰와 피드백을 통해 아키텍처 품질을 유지하고 개선한다.
  • 실험과 혁신: 새로운 아이디어와 접근 방식을 실험할 수 있는 환경을 조성한다.

 

참고 문서

[1] 로버트 마틴 vs. 마틴 파울러, https://technical-leader.tistory.com/94
[2] Martin Fowler, "Software Architecture Guide", https://martinfowler.com/architecture/

+ Recent posts