Search
Duplicate
🎋

1. 설계와 아키텍쳐란?

: 설계와 아키텍쳐 사이엔 혼란이 존재했으나 사실상 둘은 다를게 없다.
: 일반적으로 설계는 저수준, 아키텍쳐는 고수준의 구조를 나타내는 단어지만, 아키텍쳐 내에 설계가 포함되므로 둘은 크게 다를바가 없다.
: 이 둘은 단절없이 이어진 직물과 같이 시스템의 구조를 정의한다.

목표는?

: 필요한 시스템을 만들고 유지보수하는 데, 투입되는 인력을 최소화하는 데 있다.
: 설계 품질을 결정하는 것은, 고객의 요구를 만족시키는 데 드는 비용을 재는 척도와 비슷하다.
: 즉 설계 품질을 좋게한다는 것은, 유지비용이 낮은 아키텍쳐를 구현한다는 것이다.

사례연구

: 사례
어떤 한 회사의 엔지니어링 직원 수가 늘어나는 추세를 보면 긍정적으로 보인다. 그러나 같은 기간 회사의 생산성은 빠르게 증가하다 그 폭이 줄어들었다.
해당 생산성은 단순히, 코드 라인 수로 계산하였다.
매번 새로운 기능을 추가할 때마다 개발자의 수는 증가했지만 코드 생산성은 마치 한 곳으로 수렴하는 것처럼 보인다.
이번엔 다른 그래프를 봐보자, 코드 라인당 비용 그래프다. 같은 기간동안 코드 라인당 비용 그래프는 기하급수적으로 증가했다.
이런 추세로는 오래 갈 수 없다. 당장의 수익성은 중요치 않다, 이러한 비용 곡선은 사업 모델의 수익을 엄청나게 고갈시키며 회사의 성장을 멈추거나 망하게 한다.
이처럼 생산성을 현저하게 저하시킨 요인은 뭘까?
: 엉망진창이 되어 가는 신호
지금 시스템을 급하게 만들거나 결과물의 총량을 순전히 프로그래머의 수만으로 결정하거나 코드와 설계의 구조를 깔끔하게 만들려는 생각을 하지 않으면 비용 곡선은 기하급수적으로 상승한다.
개발자의 생산성은 거의 초창기 100%로 시작하지만 출시할 때마다 하락한다. 결국에는 0에 수렴하게 된다.
개발자 입장에서 볼때, 이러한 현상은 지독한 절망감을 안겨주는데, 모두가 열심히 일하고 있기 때문이다.
이런 전력들이 모두 개발자가 새로운 기능을 개발하는데 사용되는 것이 아닌, 기존 코드들로 엉망이 된 상황들에 대처하는데 소모되기 시작하기 때문이다.
심지어 사소한 기능을 추가하는 간단한 작업도 엉망이 된 코드를 이곳에서 저곳으로 다시 다음곳으로 이동하는 반복 작업이 된다.
: 경영자의 시각
이러한 상황이 나쁘게 보인다면 이제 경영자 입장에선 어떻게 보일지 생각해보자
첫 번째 출시에선 매월 수십만 달러의 인건비만으로 제품을 출시했다. 두 번째 출시에선 수십만 달러가 더 들었다. 계속 증가하는 추세다.
가장 최근 출시에 이르러서는 매달 수천만 달러의 비용으로도 별 다른 소득이 없었다.
그렇다면 어떤 조치를 취해야할까? 무엇이 잘못되었을까? 생산성이 믿기 힘들 정도로 낮아진 원인은 뭘까?
: 무엇이 잘못되었나?
토끼와 거북이
느려도 꾸준하면 이긴다.
발 빠른자가 경주에 이기는 것도 아니며 힘센 자가 싸움에서 이기는 것도 아니다
급할수록 돌아가라
현대의 개발자도 이와 같은 경주를 한다. 현대의 대다수 개발자들은 뼈빠지게 일하는데, 그들의 뇌는 잠에 취해있다.
훌륭하고 깔끔하게 잘 설계된 코드가 중요하다는 사실을 알고 있는 그 뇌가 바로 잠자고 있다.
코드는 나중에 정리하면 돼, 당장은 시장에 출시하는 게 먼저야!라는 흔해빠진 거짓말에 속는다.
개발자가 속는 잘못된 거짓말은 지저분한 코드를 작성하면 단기간에 빠르게 갈 수 있고 장기적으로 볼 때만 생산성이 낮아진다는 견해다.
제이슨 고먼이 수행한 실험 중 주목할 만한 결과를 봐보자, 제이슨은 해당 실험을 6일동안 진행했는데, 3일은 TDD를 적용, 3일은 TDD를 적용하지 않았다.
두 결과 모두 기능을 개발하는데, 시간은 갈수록 짧아졌으나 TDD를 적용하지 않은 방법이 TDD를 적용한 방법보다 2배 이상 오래 걸렸다.
소프트웨어 개발의 단순한 진리, 빨리 가는 유일한 방법은 제대로 가는 것이다.

결론

: 어떤 경우라도 개발 조직이 할 수 있는 최고의 선택지는 조직에 스며든 과신을 인지하여 방지하고 소프트웨어 아키텍처의 품질을 심각하게 고민하기 시작하는 것이다.
: 소프트웨어 아키텍처를 심각하게 고려할 수 있으려면 좋은 소프트웨어 아키텍처란 무엇인지 이해해야 한다.
: 비용은 최소화하고 생산성은 최대화할 수 있는 설계와 아키텍처를 가진 시스템을 만들려면 이러한 결과로 이끌어줄 시스템 아키텍처가 지닌 속성을 알고 있어야 한다.