# Chapter1. 클린코드

### 르블랑의 법칙

> 나중은 결코 오지 않는다.

* 프로그래머는 시간이 없다는 변명하에 나쁜 코드를 짠다. 그리고는 일단은 실행이 된다는 안도감에 스스로를 위로한다. 물론 나중에 다시 정리하겠다 라고 결심은 하지만 그런 일은 오지 않는다.
* 프로그래머는 지금 짜고 있는 나쁜 코드가 미래에 업무 속도를 늦춘다는 사실을 익히 알고 있다. 그럼에도 기한을 맞추기 위해서는 나쁜 코드를 짜야만 한다고 스스로를 위안한다.

이 책에서 저자가 말하는 기한을 맞추는 유일한 방법(빨리 가는 유일한 방법)은 _**언제나 코드를 최대한 깨끗하게 유지하는 것**_ 이라고 말한다.

클린 코드의 필요성을 간절히 느꼈던 나의 경험을 생각해보면 저자가 말하는 위의 두 가지 상황과 모두 일치한다. 최근 작업했던 `Webserv` 프로젝트의 초반 나는 `ServerGenerator`라는 클래스의 설계 및 구현을 맡았었다. 하지만 조급했던 나는 시간이 없다라는 변명하에 설계도 대강하고 구현은 설계보다도 더 엉망으로 했었다. 그리고 이 결정으로 이후에 수정 해야할 부분이 많다는 것 또한 분명히 알고 있었다. 생각했던 대로 과제를 진행하면서 `ServerGenerator`를 수정해야 하는 상황이 많이 왔고 그 때 마다 과거의 나를 욕하면서 수정했던 기억이 있다.

### 클린 코드 어떻게 작성하는가?

> 결국은 노력이다!

(내가 만든)나쁜 코드가 나의 장애물이 된다라는 사실에 이제 납득했다. 그렇다면 _**클린코드를 어떻게 작성할까?**_ 저자는 클린코드를 구현하는 행위는 그림을 그리는 행위와 비슷하다고 한다. 좋은 그림, 나쁜 그림을 구분할 줄 안다고 해서 좋은 화가가 되는게 아니듯이, 클린코드와 나쁜 코드를 구분 할 줄 안다고 해서 클린 코드를 작성할 줄 아는게 아니라는 뜻.

(저자가 말하는)클린 코드를 작성하기 위해서는 `청결` 이라는 힘겹게 습득한 감각으로 자잘한 기법들을 적용하는 절제와 규율이 필요하다. 그리고 얻은 `코드 감각`으로 좋은 코드와 나쁜 코드를 구분하고, 나쁜 코드를 좋은 코드로 바꾸는 전략도 파악해야한다.

### 그럼 클린 코드가 정확히 뭐야?

> 클린 코드의 정확한 의미는 없다. 하지만 클린 코드를 작성하면 모두가 알아봐 줄 것임.

클린 코드의 정의는 프로그래머의 수만큼이나 많을 것이다. 그리고 이 책에서는 유명 개발자들 각각의 클린 코드에 대한 정의를 소개한다. 그 중에서도 나에게 가장 와닿는 정의는 아래와 같다.

> 클린 코드는 단순하고 직접적이다. 클린 코드는 잘 쓴 문장처럼 읽힌다. 클린 코드는 결코 설계자의 의도를 숨기지 않는다. 오히려 명쾌한 추상화와 단순한 제어문으로 가득하다. - 그래디 부치

명쾌한 추상화! 이번 팀 프로젝트를 하면서 팀원분이 자주 하셨던 이야기다. 가령 예를 들면 아래와 같은 조건문이 있다고 해보자

```cpp
if ((this->ExtensionExists(this->_uri_extension)
          && this->isExtensionInMimeTypeTable(this->_uri_extension)
          && this->getMimeTypeTable().at(this->_uri_extension).compare("text/html") == 0)
```

이 코드를 보고 한번에 이 조건문이 무엇을 뜻하는지 알 수 있을까? 분석해보자면...

* 요청 URI에 extension 이 있는지를 검사하고
* 만약 extension 이 있을 때 이 ext 가 우리가 정의한 `MimeTypeTable` 에 있는지 찾아본 다음에
* 그리고나서 그 table의 value 값이 `test/html` 인지를 검사한다

이 조건문은 결국에 URI가 요청하는 `Content`의 `type`이 `text/html` 인지를 검사하는 것이다. 따라서 이 3개의 문자을 하나의 함수로 `추상화`를 하면 더욱 좋아질 것이다.

```cpp
if ((this->isContentTypeTextHtml))
  ...
```

짜짠! 명쾌한 추상화를 통해 코드의 가독성은 더욱 좋아졌고 제어문은 단순해졌다. 내가 원하는 클린코드는 위의 예시처럼 명쾌한 추상화를 통한 가독성의 향상인 것 같다. 이 점을 마음 깊이 새기고 앞으로 코딩하자!!

### 1장의 결론

예술에 대한 책을 읽는다고 해서 예술가가 되지는 않는다. 클린 코드 또한 마찬가지다. 클린 코드 책을 읽는다고 해서 클린 코더가 되지는 못할것이다. 끝없는 노력과 연습을 통해 클린 코드라는 감을 익히도록 하자.
