소프트웨어 아키텍트는 소프트웨어 개발 팀의 고급 역할을 맡는 사람들입니다. 그 사람이 되기까지는 시간과 경험이 필요합니다. 필요한 기술과 지식은 다양하며, 기술적인 부분에서의 도전뿐만 아니라 소통 능력 역시 요구됩니다. 소프트웨어 아키텍트가 되기 위한 마스터 플랜을 살펴보기 전에, 일반적인 소프트웨어 아키텍트 유형을 살펴보겠습니다:
- 솔루션 아키텍트/소프트웨어 아키텍트 — 일반적으로 이전이나 활동적인 시니어 소프트웨어 엔지니어인 낮은 수준의 아키텍트입니다. 제품의 기술적 디자인과 아키텍처를 비즈니스와 연결하여 담당합니다. 종종 개발자들을 이끌기도 합니다.
- 엔터프라이즈 아키텍트 — 제품의 전체적인 "큰 그림"을 가지면서 세부 정보는 상대적으로 적은 고수준 아키텍트입니다. 이 포지션은 매우 복잡한 대형 소프트웨어 제품에 나타날 수 있으며 때때로 CTO 직후에 바로 나타날 수도 있습니다.
- 도메인 아키텍트 — 이는 여러 회사에서 볼 수 있는 인기있는 소프트웨어 아키텍트 유형입니다. 이 포지션의 목적은 특정 사용 사례, 기술 스택의 아키텍트가 되는 것입니다. 예를 들어 클라우드 아키텍트는 주어진 클라우드 공급업체를 책임지며, 데이터 아키텍트는 데이터베이스 작업, 디자인, 조율을 책임지고, 모바일 아키텍트는 소프트웨어 제품의 모바일 버전을 담당합니다. 이 목록은 매우 길어질 수 있습니다...
- 기능 아키텍트 — 이 유형의 아키텍트는 주로 비즈니스 측면을 담당하며, 기술적 세계에 대해 상대적으로 적은 정보를 가지고 있습니다. 대부분 이들은 소프트웨어 제품의 비즈니스 로직을 디자인하고 이끄는 경험이 있는 비즈니스 분석가들입니다.
우리는 특정 포지션에 대해 각 회사마다 다른 이름을 갖고 있을 수 있기 때문에 이 목록을 계속 확장할 수 있습니다. 상기된 소프트웨어 아키텍처 포지션들의 역할과 책임은 회사마다 다르지만 본질은 같습니다. 다음 그래프를 참고하여 다양한 아키텍트 역할이 기술/비즈니스 스킬 및 지식과 관련하여 어떤 관계에 있는지에 대한 더 나은 이해를 갖도록 합시다.
마스터 플랜:
지금까지 확실한 것은 한 가지입니다. 소프트웨어 아키텍트는 (대개...) 수퍼 시니어 개발자들이라는 것입니다. 비즈니스 배경을 가진 사람들은 제외합니다. 소프트웨어 아키텍트가 편안해해야 하는 다양한 주제 영역을 나열해 보았습니다:
- 자료 구조와 알고리즘 - 프로그래밍의 매우 기본적인 기초는 소프트웨어 아키텍트에게는 문제가 되서 안됩니다. 배열, 큐, 스택, 연결 리스트, 다양한 종류의 트리, 그래프와 같은 자료 구조는 소프트웨어 아키텍트에게 익숙할 뿐만 아니라 어떤 자료 구조를 어디에 사용해야 하는지 올바른 순간을 인식할 수 있어야 합니다. 잘 정립된 소프트웨어 아키텍트는 검색, 정렬, 재귀, 동적 프로그래밍 등 다양한 알고리즘 기법을 알고 있어야 합니다. 일상에서 아키텍트들은 예를 들어 "합병 정렬" 알고리즘을 처음부터 쓰거나 새로운 자료 구조를 발견하지는 않습니다. 그러나 기초를 알면 코드 리뷰에서 올바른 기술적 결정을 내릴 수 있도록 도와줍니다.
Bonus tip: "Introduction To Algorithms" is the ultimate book to excel in Data Structures and Algorithms.
- Tech Stack - Regardless of backend or frontend, a Software Architect should have a deep understanding of the current tech stack. Learning the syntax of a programming language is the easy part, but accumulating practical experience takes time. Knowing different libraries and frameworks that software products are built upon is also crucial.
-
클린 코딩 - 소프트웨어 시스템을 작동시키는 것이 소프트웨어 아키텍트가 추구하는 궁극적인 목표는 아닙니다. 소프트웨어 아키텍트가 코드 검토를 할 때마다 먼저 떠오르는 질문은 다음과 같습니다: 1. 이 코드를 더 효율적으로 만들 수 있을까요? 이 코드를 메모리 사용량을 줄이도록 만들 수 있을까요? 클린 코드 표준이 올바르게 적용되었는지 확인할 수 있을까요? 다양한 객체지향 프로그래밍(OOP) 기술을 활용할 수 있을까요? 보너스: 클린 코드는 분명히 리팩터링 기술을 향상시키는 데 도움이 될 것입니다.
-
객체지향 프로그래밍(OOP) - 객체지향 프로그래밍은 소프트웨어 시스템을 더 유연하고 효과적이며 가독성 있게 만드는 많은 가능성을 제공합니다. 경험 많은 소프트웨어 아키텍트들은 이러한 기술을 정기적으로 사용합니다. (기술 스택에 적합한 경우...)
- 소프트웨어 디자인 패턴 - 객체지향 프로그래밍을 얘기할 때 우리는 GoF에 의해 처음으로 수집되고 소개된 다양한 디자인 패턴의 중요성을 잊어서는 안 됩니다. 이러한 디자인 패턴을 알면 분명히 소프트웨어 시스템을 객체지향 디자인을 더 잘 활용할 수 있게 도와줍니다. 보너스: 더 많은 정보를 원하신다면 이 책을 살펴보세요.
보너스: R.C. 마틴의 유명한 책 'Clean Architecture'에서 얻을 수있는 원칙들입니다.
-
S.O.L.I.D. Principles — 이 구성 요소 원칙들은 소프트웨어 구성 요소 설계에 고려해야하는 필수적인 기술입니다. 숙련된 소프트웨어 아키텍트는 이러한 원칙들을 숙달했다면 코드 상의 위반 사항을 빠르게 인지할 수 있습니다.
-
응집(Cohesion)/결합(Coupling) 원칙 — REP, CRP, ADP와 같은 원칙들은 특히 플러그인을 함께/분리하여 번들링하는 소프트웨어 아키텍트에게 필수적입니다. 이러한 기술은 보다 고수준의 디자인에 대응합니다.
-
시스템 디자인 - 소프트웨어 아키텍처 패턴에는 Master-Slave, Client-Server, Microservices, Model-View-Controller, 백엔드 또는 프론트엔드 프로젝트에 따라 Unidirectional Architecture와 같이 다양한 패턴이 있습니다. 물론 모든 패턴을 알 수는 없지만 프로젝트에 따라 소프트웨어 아키텍트는 백그라운드 디자인의 전문가여야 합니다. 매우 기초적인 시작점은 도메인 주도 디자인입니다. 추가 정보로 이 책을 살펴보세요.
-
문서화 - 이는 소프트웨어 아키텍트가 일상적으로 다뤄야 하는 중요한 부분입니다. 다양한 UML 다이어그램 그리기, ARC42 문서 작성은 이 직무의 필수 요소입니다. 다음과 같은 많은 도구가 있습니다:
- draw.io - 무료이며 사용하기 쉬운 도구
- plantUml - Eclipse, Intellij와 같은 IDE용 플러그인입니다. 매우 유용하고 제가 좋아하는 도구로, 스크립팅을 통해 그림을 그립니다.
- yEd - 데스크톱 응용 프로그램으로 제공되는 편리한 도구입니다.
- MS Visio - 다양한 기능을 갖추고 있지만 무료가 아닙니다!
`10. 인증 - 세계적으로 유명한 소프트웨어 아키텍트를 위한 인증 옵션이 많지는 않지만, International Software Architecture Qualification Board (iSAQB®)가 소프트웨어 아키텍처 전문가를 위한 Certified Professional for Software Architecture (CPSA®) 자격증 프로그램을 제공합니다. CPSA® 자격증은 전 세계적으로 인정받고 있습니다.
소프트웨어 아키텍트가 되는 데는 위 목록에서 보듯이 시간과 노력이 필요하지만, 그럴만한 가치가 있는 일이죠 :).
소프트웨어 아키텍처 관련 주제에 관심이 있다면 아래 목록을 살펴보세요.
관련 기사:`
- 프론트엔드 개발을 위한 소프트웨어 아키텍처 패턴
- 일상적인 사용을 위한 소프트웨어 아키텍처 치트 시트
- Spring Boot 애플리케이션에 구성 응집 원칙 적용하는 방법
- Spring Boot 애플리케이션에 SOLID 소프트웨어 디자인 원칙 적용하는 방법
P.S. 트위터나 링크드인에서 저와 연락할 수 있어요.