1장: 설계와 아키텍처란
- 설계: 저수준의 구조, 결정사항을 의미
- 아키텍처: 저수준의 세부사항과는 분리된 고수준의 무언가를 가리킴
- 이를 구분하는 것은 경계가 불분명하고 의미가 없다.
- 소프트웨어 아키텍처의 목표는 필요한 시스템을 만들고 유지보수하는데 투입되는 인력을 최소화 하는 것
- 비용은 최소화하고 생산성은 최대화 할 수 있는 설계와 아키텍처를 만들자!
- 빨리 가는 유일한 방법은 제대로 가는 것이다.
- 잘못된 설계와 아키텍처가 얼마나 많은 비용손실을 가져오는지 사례를 보여줬다.
- 한 회사의 엔지니어들은 늘어나는데 생산성은 낮아지고, 끝내 코드 당 비용도 늘어난다.
- 결국 이러한 비용 곡선은 사업 모델의 수익을 엄청나게 고갈 시키며, 회사의 성장을 멈추게 한다.
2장: 두 가지 가치에 대한 이야기
- 행위와 아키텍처 : 모든 소프트웨어 시스템은 이해관계자에게 행위/구조 두 가지 가치를 제공
- 변경사항을 적용하는데 드는 어려움은 변경되는 범위에 비례해야 하며, 변경사항의 형태와는 관련이 없어야 한다.
- 더 높은 가치
- 동작하지만 수정이 아예 불가능한 소프트웨어 VS 동작하지 않지만 쉽게 변경 가능한 소프트웨어
- 동작 여부가 미래의 유연성보다 더 중요하다. 하지만, 변경이 불가능한 상태에 처할 때 까지 방치해서도 안된다
- 아이젠하워 매트릭스 4가지 분류
- 진짜로 긴급하지만 중요하지 않은 기능과 긴급하지 않지만 중요한 기능을 구분하지 못한다.
- 우리는 가끔 중요한 일을 방치하고 긴급한 일 먼저 하려고 한다.
- 중요한 일을 먼저 하자고 설득하는 것도 개발팀의 책임이다.
- 기능을 개발하기 쉽고, 간편하게 수정가능하며, 확장하기 쉬운 아키텍처를 만들어야 한다.
- 회사에서 각 팀팀은 팀이 가장 중요하다고 스스로 믿는 가치를 위해 투쟁한다.
- 개발팀도 좋은 소프트웨어/아키텍처를 위해 싸우고 투쟁해야 한다. ㅎㅎㅎ
3장: 패러다임 개요
- 구조적 프로그래밍
- 1968년 에츠허르 비버 데이크스트라(Edsger Wybe Dijkstra)가 발견한 패러다임
- 데이크스트라는 무분별한 점프(goto 문장)는 프로글매 구조에 해롭다는 사실을 제시
- 이러한 점프들을 if/then/else와 do/while/until 과 같이 더 익숙한 구조로 대체함
- 결론: 구조적 프로그래밍은 제어흐름의 직접적인 전환에 대해 규칙을 부과한다.
- 객체지향 프로그래밍
- 1966년 요한 달(Ole Johan Dahl)과 크리스텐 니가드(Kristen Nygaard)에 의해 등장한 패러다임
- 두 프로그래머는 알골(ALGOL) 언어의 함수 호출 스택 프레임(stack frame)을 힙(heap)으로 옮기면, 함수 호출이 반환된 이후에도 함수에서 선언된 지역 변수가 오랫동안 유지됨을 발견
- 바로 이러한 함수가 클래스의 생성자가 되고
- 지역 변수는 인스턴스 변수
- 중첩 함수는 메서드가 됨.
- 그리고 함수 포인터를 특정 규칙에 따라 사용하는 과정을 통해 필연적으로 다형성이 등장함
- 결론: 객체지향 프로그래밍은 제어흐름의 간접적인 전환에 대해 규칙을 부과한다.
- 함수형 프로그래밍
- 람다 계산법에 직접적인 영향을 받아 만들어진 패러다임
- LISP 언어의 근간이 되는 개념이 바로 이 람다 계산법.
- 람다 계산법의 기초가 되는 개념은 불변성
- 심볼(symbol)의 값이 변경되지 않는 개념으로
- 이는 함수형에 할당문이 전혀 없다는 뜻이기도 함
- 대부분의 함수형 언어가 변수 값을 변경할 수 있는 방법을 제공하기는 하지만, 굉장히 까다로운 조건 아래에서만 가능
- 결론: 함수형 프로그래밍은 할당문에 대해 규칙을 부과한다.
- 패러다임은 기본적으로 추가가 아니라 제한하는 것
- 구조적 => goto문
- 객체 지향 => 함수 포인터
- 함수형 => 할당문
- 패러다임은 위 3개가 전부이며 기본적으로 1950 ~ 1960연대와 지금과 전혀 다를게 없다.
4장: 구조적 프로그래밍
- 네덜란드 출신 데이크스트라
- 순차, 분기, 반복 세가지 구조 만으로 프로그램을 표현할 수 있다 라는 사실을 증명함 → 구조적 프로그래밍 탄생
- 기능적분해
- goto문이 아닌 순차, 분기, 반복의 제한적 흐름제어자로의 한정을 통해 저수준 모듈로의 분리가 가능해짐.
- 때문에 divide and conquire로 모듈, 컴포넌트 세분화 가능해지니까 programming language도 유클리드 계층구조를 구축함으로서 수학과 같이 논리적 엄밀성을 가질 수 있을 것으로 기대했다.
- 구조적 프로그래밍은 프로그램을 증명가능한 세부 기능 집합으로 재귀적으로 분해할 것을 강조한다.
- 구조적 프로그래밍이 가치 있는 이유는 프로그램에서 반증 가능한 단위를 만들어 내는 능력에 있다.
- 아키텍트는 모듈, 컴포넌트, 서비스가 반증 가능하도록 테스트하기 쉽도록 만들기 위해 노력해야한다.
- 이를 위해 구조적 프로그래밍과 유사한 제한적인 규칙들을 받아들여 활용해야 한다.
- 다음장에서 제한적인 규칙들이 나온다.