본문으로 건너뛰기

On the Importance of Software Design

Alex Kondovalexkondov.com ↗

소프트웨어 설계의 중요성

개념을 깊이 이해하려면 한발 물러서야 한다. 처음엔 보이지 않던 연결고리를 통해 소프트웨어에 대해 많은 것을 배울 수 있다.


건축과 소프트웨어의 유추

집 짓기에서 얻은 통찰

  • 집을 구입하며 작고 사소해 보이는 디테일들이 얼마나 중요한지 체감
    • 콘센트 위치, 조명, 타일, TV 배치(설거지 중 스트리밍 가능한 위치) 등 모든 것이 중요
  • 건설 현장에서 인치 단위까지 따지는 정밀함을 보며 자신의 작업에 충분한 주의를 기울이고 있는지 반문

계획 없는 시공 = 무모함

  • 리팩토링과 재작성은 불가피하다는 통념 → 디테일에 신경 쓸 필요가 없다는 안일함으로 이어짐
  • “설계도 없이 벽돌을 쌓기 시작하는 건 애자일이 아니라 무모함이다”
  • 너무 자주, 너무 서둘러, 제약이나 설계 없이 개발을 시작 → 아키텍처가 개발 진행 중에 즉흥적으로 형성됨

소프트웨어 설계란 무엇인가

논리를 넘어선 창의성과 아름다움

  • 집의 본질은 큰 사각형 구조물이지만, 내부 배치는 무수히 창의적인 방식으로 구성 가능
  • 서비스의 본질은 JSON을 반환하는 엔드포인트지만, 아키텍처는 얼마든지 다양하게 설계 가능
  • 집에서 침실의 전망, 잘 갖춰진 주방, 넓은 거실을 원하듯 → 소프트웨어에도 미적·기능적 설계 가치가 존재

소프트웨어 설계의 핵심 목표

목표 설명
명확한 경계와 책임 모듈 간 역할 분리로 응집도 높은 구조
확장성 변경 영향 최소화, 기능 추가 용이
테스트 가능성 & 예측 가능성 안정적인 동작 보장
생산적인 개발 경험 기술 부채 관리가 아닌 창의적 작업 가능
  • 모든 컴포넌트를 단일 파일에 넣을 수도 있지만 → 그렇게 하지 않는 이유는 명확한 규칙으로 통신하는 모듈 기반 구조를 원하기 때문

설계는 복잡성과의 싸움

  • 명확한 변수명 → 모호함 감소
  • 범용 함수와 추상화 → 재사용성 향상
  • 모듈/클래스 내부에 복잡성 숨기기 → 외부 단순성 확보

누구나 소프트웨어 제품을 만들고 떠날 수 있다. 하지만 지속적으로 확장되고 수정될 무언가를 만들려면 신중함과 배려가 필요하다.

  • 소프트웨어 설계에 집중하면 아키텍처 문제를 사전에 파악하여 준비 없이 맞닥뜨리는 상황을 방지
  • 좋은 아키텍처는 우연히 만들어지지 않는다 — 의도적인 사고와 행동이 필요

설계는 개발자만의 문제가 아니다

제품과 비즈니스에도 직결

  • 성공적인 소프트웨어 프로젝트는 긴 수명을 가지며 지속적으로 변화하고 진화
  • 아키텍처가 이를 뒷받침하지 못하면:
    • 제품 개발 전체가 고통받음
    • 개발자들이 우회책을 찾아 헤맴
    • 새 기능마다 대규모 기술 부채 누적

핵심 명제

“무엇을 만드는가” 만큼 “어떻게 만드는가”가 중요하다.