001. (Clean Code) 1. 클린 코드

1. 클린 코드

코드란 무엇일까?

코드란 요구사항을 상세히 표현하는 수단이며, 코드의 도움없이 요구사항을 명세하거나 추상화하는 것은 불가능하다.

기계가 실행할 수 있을 정도로 요구사항을 명세하는 이 작업이 바로 프로그래밍 이다.

앞으로 프로그래밍 언어의 추상화 수준은 더더욱 높아질 것이며, 특정 응용 분야에 적합한 언어의 수도 점점 늘어나게 될 것이다.

세상엔 좋은 코드와 나쁜 코드가 존재한다.

코드를 보고 이게 좋은지 나쁜지 판단해보고,

나쁜 코드라면 좋은 코드로 리팩토링할 수 있도록,

더 나아가 작성시점에 좋은 코드를 작성할 수 있는 방법에 대해서도 알아보도록 하자.

1.1. 나쁜 코드

프로그래머라면 누구나 나쁜 코드로 경험한 고생이 있을 것이다.

그럼 누군가 일부러 나쁜 코드를 작성한 것일까?

대부분은 일정에 치여서, 급하게 대응하느라 등의 그럴싸한 명분하에 작성되었을 것이다.

작성 시점에 “아 이건 나중에 꼭 개선해야겠다” 라고 생각하고 주석을 남겨두기도 했을 것이다.

문제는 여기서의 나중 은 절대 오지 않는다.

참고 이러한 상황을 르블랑의 법칙 이라고 한다.
원문은 다음과 같다. Leblanc’s Law : Later equals Never. - Dave LeBlanc

나쁜 코드는 존재 그 자체로 개발 속도를 크게 저하시키는 원인이 되며, 코드를 수정할 때마다 전혀 예상하지 못한 곳에서 문제를 발생시킨다.

이러한 나쁜 코드가 프로젝트 내에 적치될 수록 팀의 생산성은 0을 향해 수렴하게 된다.

결론적으로 생산성을 유지하려면 프로젝트 내 코드를 깨끗하게 유지해야 하고 이 깨끗함을 명확히 정의해서 프로젝트 내에 적용해야 한다.

1.2. 좋은 코드

깨끗한 코드의 정의는 무엇일까?

유명 프로그래머들이 말하는 깨끗한 코드를 정리해보자.

코드는 우아하고 효율적이어야 한다. 의존성을 최대한 줄이고, 오류는 명백한 전략에 의거해 처리하며 성능을 최적으로 유지해야 한다.
비야네 스트롭스트룹(Bjarne Stroustrup) - C++의 창시자

깨끗한 코드는 단순하고 직접적이며 잘 쓴 문장처럼 읽힌다. 또한 설계자의 의도를 숨기지않으며, 명쾌한 추상화와 단순한 제어문으로 가득하다.
그래디 부치(Grady Booch) - UML의 개발자

깨끗한 코드는 작성자가 아닌 사람도 읽기 쉽고 고치기 쉬우며, 의미있는 이름을 가지고 있다. 또한 특정 목적을 달성하기위해 한 가지 방법만을 제공한다.
데이브 토마스(David A. Thomas) - Object Technology International의 창립자

중복을 제거하고, 모든 테스트를 통과하며, 시스템 내 모든 설계 아이디어를 표현하면서 클래스 / 메서드 / 함수 등을 최대한 줄여야 한다.
론 제프리스(Ron Jeffries) - 익스트림 프로그래밍 소프트웨어 개발 방법론의 창립자 중 한 명

깨끗한 코드는 코드를 읽으면서 짐작했던 기능을 그대로 수행하는 코드이다.
워드 커닝햄(Ward Cunningham - Wiki 개념의 창시자

그래서 도대체 깨끗한 코드는 정확히 무엇일까?

결론적으로 깨끗한 코드를 정확히 정의할 수는 없다.

각 프로덕트 혹은 개발자에 따라 기준점이나 추구하는 방향이 다를 것이기 때문이며, 방향이 다르다고해서 깨끗한 코드가 아닌 것도 아니기 때문이다.

따라서 깨끗한 코드를 작성하기 위한 규칙을 나름대로 정하고, 이를 잘 지키는 것이 더 중요하다고 할 수 있겠다.

대략적으로 정리해보자면 아래와 같겠다.

  • 코드는 설계자의 의도를 단순하게 표현해야 한다.
  • 코드는 잘 쓴 문장처럼 잘 읽혀야 한다.
  • 코드는 잘 정의된 추상화와 단순한 제어문으로 작성되어야 한다.
  • 코드는 의미있는 이름을 가지고, 특정 목적을 달성하기 위해 단 한 가지의 방법을 제공한다.
  • 코드는 중복되어선 안된다.
  • 코드는 설계를 표현할때 클래스, 메서드, 함수를 최소하해야 한다.

위의 정리들을 잘 지켰을 때 우리는 이 코드를 깨끗하다고 판단할 수 있을 것이다.