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