실용주의 프로그래머 2장

2장 실용주의 접근법

 

소프트웨어 개발에 적용 가능한 프로세스나 아이디어, 접근법 등을 정리하기 위한 장

 

 

8. 좋은 설계의 핵심 

 

+) 데메테르 법칙(이라고 나와 있는데 디미터의 법칙이라고 많이 하는 듯 하다) Law of Demeter

: 각 객체는 현재 객체와 근접한 객체만 실행시킨다.

: 한 줄에 점을 하나만 찍는다! ex. getA().more().end()는 보다는 한 번에getA().more()까지만 해라

: 최소 지식 원칙이라고도 하며, 객체 간의 결합도를 낮추는 방법이다. 

 

ETC: Easy To Change 

- 결합도를 줄이면 분리되어 각각이 더 바꾸기 쉬워진다. 

- ETC는 규칙이 아니라 가치이다 (선택할 때 도움을 받자) 

- 교체 가능하기 위해서는 결합도를 낮추고 응집도를 높여라

 

 

9. DRY: 중복의 해악

 

Don't Repeat Yourself

- 명세와 프로세스, 개발하는 프로그램 안에 지식을 중복해서 넣지 말자

- 하나만 바꾸어도 되게 하자

- 물론 소스코드를 복사-붙여넣기 하지 않는 것도 포함이다

- 성능상의 이유로 중복해야 한다면, 중복의 영향을 국소화하자.

 

Y2K 문제: 연도를 두 자리로 표시해서 1900년대에 개발된 프로그램이 2000년대가 되자 제대로 동작하지 않은 문제 

 

 

10. 직교성

 

기하학에서 두 직선이 직각으로 만나면 직교한다고 한다.

두 개의 선은 서로 독립적이다 (하나가 바뀌어도 다른 것에 영향을 주지 않는다)

예를 들어, 데이터베이스와 사용자 인터페이스는 서로 직교적이어야 한다.

 

문제점이나 오류가 한정되기 때문에 리스크도 감소한다.

 

싱글턴 패턴: 특정 클래스의 객체가 단 하나의 인스턴스만을 갖게 보장한다.

- 일종의 전역 데이터로 남용하여 불필요한 결합을 만들지 않게 주의하자

 

 

11. 가역성 

 

되돌릴 수 없는 결정을 줄여야 한다

ex. 데이터베이스를 올바르게 추상화했다면 프로젝트 중간에 데이터베이스 시스템을 바꿀 수 있을 것이다.

ex. 웹에서 앱으로 바뀌더라도 서버 쪽은 큰 변화가 없을 것이다. (그래야 한다)

 

 

12. 예광탄

 

기관총의 일반 탄환들 사이에 끼어 조준을 재조정하는데 도움을 주는 역할

움직이는 목표물을 맞히려면 즉각적인 피드백을 받아야 한다.

 

목표를 이루기 위해 핵심적인 부분을 먼저 구성하고, 이후에 채워 나간다.

모든 기능이 들어있지는 않지만 시스템을 구성하는 요수를 연결해 두면 진도 확인과 조정이 모두 가능하다.

예광탄이 무조건 목표물을 맞힌다는 보장은 없지만, 조준을 계속 옮길 수는 있다.

 

프로토타입과의 차이점은 프로토타입은 나중에 버리고 새로 작성해야 한다는 점

예광탄은 기능은 별로 없지만 완결된 코드이다. 

 

 

13. 프로토타입과 포스트잇

 

프로토타이핑의 가치는 생산한 코드가 아니라 배우는 교훈에 있다.

정확성, 안전성, 완전성, 스타일은 중요하지 않다. 

 

 

14. 도메인 언어

 

사업 부서는 세부 사항에 크게 관심이 있지 않다. 프로그래머는 의도를 이해해서 코드로 바꾸고, 직접 사용해 볼 수 있게 해야 한다. 그러면 실제로 그들이 필요로 하는 것이 드러난다.

 

 

15. 추정

 

추정치를 물었을 때 중요한 것은 답변이 사용될 상황

추정하기 전에 의도와 조건에 대해 생각하자

모델을 만들고, 컴포넌트로 분해하여 추정한다

분해된 매개 변수 중 결과에 가장 큰 영향을 미치는 것을 찾아서 최대한 정확하게 산출한다.

 

누군가 추정해 달라고 하면 일단 "나중에 연락드릴게요" 라고 말하라!

 

 


 

2장 후기

이제 실용적인 얘기를 제대로 하기 시작한 것 같다

장 앞부분에서는 프로젝트 할 때의 상황들이, 뒷부분에서는 일 할 때의 상황들이 떠올랐다

앞으로 이런 상황을 마주했을 때 오늘 읽은 내용들이 잘 떠오르면 좋을텐데 😇

 

 

출처: 실용주의 프로그래머 (데이비드 토머스, 앤드류 헌트) 20주년 기념판

'TIL' 카테고리의 다른 글

실용주의 프로그래머 4장: 실용주의 편집증  (0) 2024.07.04
실용주의 프로그래머 3장  (0) 2024.06.23
[Docker] Docker 기본 개념  (0) 2024.01.09
Docker Container  (1) 2024.01.05
코드업 C언어 기초 100제  (1) 2023.10.30