소프트웨어개발의 지혜 (로버트 C. 마틴 외 2인, 2004) 독후감

2 minute read

뭔가 약을 파는 느낌이 드는 제목. 뭔가 재미없는 이론서를 연상시키는 표지. 저거 안드로메다인가? 속지 말고 저자를 봐야 한다. 엉클 밥이 지은 책.

OOP 설계 원칙 SOLID, 패턴, 사례 연구, 그리고 애자일 방법론 얘기 약간. 이렇게 구성. 설명 다 좋다. 마음에 든다.

여기에서의 역전은 의존성에 대한 것만 말하는 것이 아니라, 인터페이스 소유권에 대한 것도 의미한다는 사실을 명심하자. 우리는 대개 유틸리티 라이브러리가 그것의 고유 인터페이스를 소유한 것으로 생각 하지만 DIP가 적용된 경우에는 클라이언트가 추상 인터페이스를 소유하는 경향이 있다. - p155

의존 관계 역전 원칙(Dependency inversion principle). 이거 잘 이해도 안 되고 볼 때마다 헷갈린다. 하지만 여기서 명쾌하게 정리를 해줘서 단박에 이해 완료. 키워드는 인터페이스 소유권이었어. 이 개념이 들어가니 왜 역전이라 붙였는지도 이해가 됐다.

그리고 패턴 설명도 좋다. 처음 패턴을 공부할 책으로 Head First Design Patterns를 추천하는데, 약간 난이도가 있지만 이 책도 추천하고 싶다. “팟~! 그래 여기는 bridge pattern 이다!” 이런 식으로 되도 않게 패턴을 적용하는 방법을 책에선 얘기를 안 해서 좋다. 차근차근 코드를 발전시키면서 패턴과 연관성이 나타나면 그제야 기존에 존재하는 패턴으로 정규화를 하라는 얘기를 새겨둬야 한다. 패턴 배우면 막 쓰고 싶지. 마음껏 남발하고 혼자 X될 개인 프로젝트가 있으면 다행인데, 그러긴 쉽지 않다. 그래서 경험이 부족한 팀원 책상 위에 패턴 책이 있으면 좀 겁나. 체크인 한 코드를 더 자주 살펴봐야겠단 다짐을 하게 된다.

  • 풍족한 세상에서, 점점 더 부족해지고 있는 유일한 것은 사람들의 주의력이다. - 와이어드(Wired)지에서, 캐빈 캘리(Kevin Kelly) - p41
  • 읽기 쉽고 변경하기 쉬운 모듈을 만들기 위해서는 단순한 원칙과 패턴 이상의 그 무엇이 필요한데, 바로 주의력과 훈련이다. 그리고 미를 창조하기 위한 열정이 필요하다. - p42
  • 소프트웨어 개발 생명주기를 검토한 후, 나는 공학 설계의 기준을 실제로 만족시킬 유일한 소프트웨어 문서는 소스 코드 목록뿐임을 알 수 있었다. - 잭 리브스(Jack Reeves) - p99
  • 애자일 설계란 무엇인가? 애자일 설계는 과정이지, 결과가 아니다. 이것은 원칙, 패턴, 그리고 소프트웨어의 구조와 가독성을 향상시키기 위한 방식의 연속적인 작용이다. 모든 시점에 시스템의 설계를 가능한 간단, 명료하고, 표현적으로 유지하려는 노력이다. - p110
  • SRP의 맥락에서, 우리는 책임(responsibility)을 ’변경을 위한 이유’로 정의한다. 만약 여러분이 한 클래스를 변경하기 위한 한 가지 이상의 이유를 생각할 수 있다면, 그 클래스는 한 가지 이상의 책임을 맡고 있는 것이다. - p113
  • 오히려, 이들을 분리하는 것은 불필요한 복잡성이란 악취를 풍기게 할 것이다. … 변경의 축은 변경이 실제로 일어날 때만 변경의 축이다. 아무 증상도 없을 때, 이 문제에 SRP를 적용하는 것이나 다른 원칙을 적용하는 것은 현명하지 못하다. - p114
  • 소프트웨어에서 불필요한 복잡성의 부하를 없애려면, 우리 자신이 한 번은 놀림 받을 각오를 해야 할지도 모른다. 이것은 처음에는 코드가 변경되지 않을 것이라 생각하고 작성한다는 것을 의미한다. 변경이 일어나면, 나중에 일어날 그런 종류의 변경에 대해 보호하는 추상화를 구현한다. 즉, 첫 번째 총알은 그냥 맞고, 그 총으로 쏘는 다른 총알에 대해서는 확실히 보호한다는 것이다. - p126
  • LSP 위반은 대게, OCP를 심각하게 위반하는 런타임 타입 정보 (RTTI, Run-Time Type Information) 사용으로 이어진다. - p132
  • LSP는 “고립적으로 본 모델은 의미 있게 검증하는 것이 불가능하다”라는 아주 중요한 결론으로 이끈다. 어떤 모델의 유효성(validity)은 오직 그 클라이언트의 관점에서만 표현될 수 있다. - p138
  • 의존성은 이행적(transitive)이다. - p154
  • 경험상의 규칙: 어떤 것이 영리하고 정교하다고 생각된다면, 조심해라. 이런 생각은 여러분의 방종일 가능성이 크다. - 도널드 A. 노먼(Donald A. Norman) - p341
  • 인터페이스는 그 인터페이스의 파생 클래스나 파생 인터페이스가 아니라 클라이언트에 속한다. 인터페이스와 그 파생형 사이의 논리적인 구속력보다 클라이언트와 인터페이스 사이의 논리적인 구속력이 더 강하다. - p397

Update <2018-01-14 Sun> 표지 사진 교체