> For the complete documentation index, see [llms.txt](https://kimtaesu.gitbook.io/workspace/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kimtaesu.gitbook.io/workspace/undefined/12.-solid-foundation.md).

# 클린 코더스 강의 12. SOLID Foundation

## **소프트웨어 공학에서 말하는 설계란 무엇인가?**

### **코드가 곧 설계다**

1992 Jack W Reeves "What is Software Design?"

> <https://www.developerdotstar.com/mag/articles/reeves_design.html>

건설에서는 설계는 문서지만 소프트웨어에서는 설계는 **소스코드**이다.

### **설계가 잘못되었을때 나타나는 징후**

#### **Rigidity**

시스템의 의존성으로 인해 변경하기 어려워진다.\
많은 시간이 소요되는 테스트 빌드 \
작은 변화로 인해 전체 리빌드를 유발함

**Fragility**

한 모듈의 수정이 다른 모듈에 영향을 미칠때 발생한다.\
모듈간의 의존성을 제거하기 위해 노력해야 한다.

**Immobility**

재사용을 할 수 없는 모듈이다.\
DB, UI, Framewrok 결합도를 없애기 위해 노력해야 한다.<br>

### **Needless Complexity**&#x20;

우리는 미래를 알 수 없기 때문에 미래를 예측해서 구현한다면 불필요한 복잡성이 생긴다.\
현재 요구사항에 집중해서 개발해야 한다.

> <https://brunch.co.kr/@cleancode/18>

로버트 C 마틴은 우리는 미래를 예측할 수 있는 크리스탈 볼이 없다고 한다.\
우리는 마법의 구술이 없기 때문에 요구사항을 확정하고 이후에 **변경을 불허하는 전략**을 취할 수 없다.

**즉, 변화를 예측하는 것이 아니라 대응하는 것이다.**
