• 소프트웨어 설계는 인간관계 속에서 벌어지는 활동
    • 팀원끼리 견해 차이가 있을 때는, 이론적인 틀을 공유하는 것이 유용하다.
    • 원칙에 동의하지 않더라도 서로의 원칙에 대해 논의할 수 있다면 더 빨리 합의할 수 있는 기회가 생긴다.

요소들을 유익하게 관계 맺는 일

  • 소프트웨어 설계의 의미: 요소들을 유익하게 관계 맺는 일
  • 요소: 경계가 있고 계층 구조를 선호한다.
  • 관계: 요소들은 서로 관계를 가진다.
    • 함수 호출
    • 발행(publish)
    • 대기(listen)
    • 참조
  • 유익하게: 기계를 위한 명령어가 아닌, 일종의 중간 요소들이 서로 도움이 되도록
    • 예) 함수 A는 함수 B가 계산의 복잡한 부분을 덜어간다.
  • 이러한 관점에서 소프트웨어 설계자는 오직 다음과 같은 일만 할 수 있다.
    • 요소를 만들고 삭제한다.
    • 관계를 만들고 삭제한다.
    • 관계의 이점을 높인다.

구조와 동작

  • 소프트웨어는 두 가지 방식으로 가치를 만든다.
    • 현재 소프트웨어가 하는 일(동작)
    • 미래에 새로운 일을 시킬 수 있는 가능성(구조)
  • 시스템을 더 가치 있게 만들기 위해서 굳이 시스템의 동작을 바꿀 필요가 없다.
    • 다음에 무엇을 할 수 있는지에 대해 선택할 수 있는 기회를 만들자마자, 나는 이미 돈을 번 것이다.
  • 소프트웨어의 구조는 동작처럼 또렷하게 드러나지 않는다.
    • 그래서 사람들은 동작 변경과는 다르게 구조 변경에 대해서는 혼란스러워한다.
  • 구조 변경과 동작 변경은 모두 가치를 만들어내지만, 근본적으로 다르다는 것을 이해해야한다.
    • 되돌릴 수 있는 능력 즉, 가역성의 차이가 있다.

경제 이론: 시간 가치와 선택 가능성

  • 프로그래머로서 우리가 하는 일이 돈의 본성과 상반될 수도 있다.
    • 그러나 프로그래머의 욕망과 돈의 명령이 충돌하면, 결국 돈이 승리한다.
  • 돈의 본성의 두 가지 속성
    • 오늘의 1달러가 내일의 1달러보다 더 가치가 있기 때문에 버는 것은 빨리하고, 쓰는 것은 가능한 뒤로 미룬다.
    • 혼란스러운 상황에서는 어떤 물건에 대한 옵션이 물건 자체보다 낫기 때문에 불확실성에 맞서는 옵션을 만든다.