Skip to main content

1부. 소개

1장. 설계와 아키텍처란?#

  • '아키텍처'는 저수준의 세부사항과는 분리된 고수준의 무언가를 가리킬 때 사용되고, '설계'는 저수준의 구조 또는 결정사항을 의미할 때가 많습니다. 그러나 이러한 구분은 무의미합니다.
  • 저수준의 세부사항과 고수준의 구조는 모두 소프트웨어 전체 설계의 구성요소입니다.
  • 개별로는 존재할 수 없고, 이 둘을 구분 짓는 경계는 뚜렷하지 않으며 고수준에서 저수준으로 향하는 의사결정의 연속성만 있을 뿐입니다.

목표는?#

소프트웨어 아키텍처의 목표는 필요한 시스템을 만들고 유지보수하는 데 투입되는 인력을 최소화하는 데 있씁니다.

  • 설계 품질을 재는 척도는 고객의 요구를 만족시키는 데 드는 비용을 재는 척도와 다름 없습니다.
  • 비용이 낮을 뿐만 아니라 시스템의 수명이 다할 때까지 낮게 유지할 수 있다면 좋은 설계, 새로운 기능을 출시할 때마다 비용이 증가한다면 나쁜 설계입니다. 즉 좋은 설계는 단순명료합니다.

사례 연구#

  • 코드 라인당 비용이 크면 클 수록 당장의 수익성은 중요하지 않으며, 사업 모델의 수익을 엄청나게 고갈시키며 회사의 성장을 멈추게 합니다.

엉마진창이 되어 가는 신호#

  • 시스템을 급하게 만들거나, 결과물의 총량을 순전히 프로그래머 수로 결정하거나, 코드와 설계의 구조를 깔끔하게 만들려는 생각을 전혀 하지 않으면 파국으로 치닫는 비용 곳선에 올라타게 됩니다.
  • 이러한 비용 곡선은 개발자 관점에서 100%로 시작하지만 출시마다 떨어져 결국 0으로 수렴합니다.
  • 엉망이 되면 이러한 상황에 대처하는 데 에너지를 소모되기 시작합니다.

경영자의 시각#

  • 출시에 비례해서 인건비가 엄청나게 늘어납니다.

무엇이 잘못되었나?#

  • 개발자가 코드 정리를 나중에 하고 시장에 출시하는 것을 우선으로 잡으면, 이는 결국 생산성이 0으로 수렴하게 됩니다.
  • 개발자가 속는 더 잘못된 거짓말은 지저분한 코드를 작성하면 단기간에 빠르게 갈 수 있고, 장기적으로 볼 때만 생산성이 낮아진다고 생각하게 됩니다.

빨리 가는 유일한 방법은 제대로 가는 것입니다.

  • 개발자는 처음부터 다시 시작하여 전체 시스템을 재설계하는 것이 해답이라고 생각할지도 모릅니다.

자신을 과신한다면 재설계하더라도 원래의 프로젝트와 똑같이 엉망으로 내몰립니다.

결론#

  • 어떤 경우라도 개발 조직이 할 수 있는 최고의 선택지는 조직에 스며든 과신을 인지하여 방지하고, 소프트웨어 아키텍처의 품질을 심각하게 고민하기 시작하는 것입니다.
  • 소프트웨어 아키텍처를 심각하게 고려할 수 있으려면 좋은 소프트웨어 아키텍처가 무엇인지 이해해야 합니다.

2장. 두 가지 가치에 대한 이야기#

  • 소프트웨어 시스템은 이해관계자에게 행위(beharvior)구조(structure) 을 제공합니다.

행위#

  • 소프트웨어 첫 번째 가치입니다.
  • 프로그래머는 이해관계자가 기능 명세서나 요구사항 문서를 구체화할 수 있도록 합니다.
  • 그러나, 이외에도 할 일이 있습니다.

아키텍처#

  • 소프트웨어 두 번째 가치입니다.
  • 소프트웨어는 '부드러움을 지니도록' 만들어졌으며 기계의 행위를 쉽게 변경하기 위해서입니다.
  • 소프트웨어 개발 비용의 증가를 결정짓는 주된 요인은 변경사항의 범위와 형태의 차이가 있습니다.
  • 아키텍처는 형태에 독립적이어야 하고, 그럴수록 더 실용적입니다.

더 높은 가치#

  • 완벽하게 동작하지만 수정이 불가능한 프로그램은 결국 요구사항이 변경되면 동작하지 않게 됩니다.
  • 동작 하지는 않지만 변경이 쉬운 프로그램은 이후에 돌아가게 할 수 있으며 변경사항이 발생해도 유지보수 할 수 있습니다.

현재 기능의 동작 여부와 미래의 유연성 둘 다 중요합니다.

아이젠하워 매트릭스#

  • 긴급한 문제가 아주 중요한 문제일 경우는 드물고, 중요한 문제가 몹시 긴급한 경우는 거의 없습니다.
  • 즉, 행위는 긴급하지만 매번 중요도가 높은 경우를 가진 것은 아니지만 아키텍처또한 중요하지만 즉각적인 긴급성을 필요로 하는 경우는 절대 없습니다.

이를 우선순위로 매기면 다음과 같습니다.

  1. 긴급하고 중요한
  2. 긴급하지 않지만 중요한
  3. 긴급하지만 중요하지 않은
  4. 긴급하지도 중요하지도 않은

여기서 실수하기 쉬운 부분은 3번 경우를 1번 경우로 올리는 방법입니다. 즉, 개발자는 이러한 딜레마를 해결해야합니다.

아키텍처를 위해 투쟁하라#

  • 개발자는 책임을 위해서는 투쟁해야 합니다.
  • 효율적인 소프트웨어 개발팀은 이러한 투쟁에서 정면으로 맞서 싸웁니다.
  • 소프트웨어 개발자도 이해관계자이며 소프트웨어를 안전하게 보호해야 할 책임이 있습니다.

소프트웨어 아키텍처는 시스템이 제공하는 특성이나 기능보다는 시스템의 구조에 더 중점을 봅니다. 아키텍트는 이러한 특성과 기능을 개발하기 쉽고, 간편하게 수정할 수 있으며, 확장하기 쉬운 아키텍처를 만들어야 합니다.

Last updated on