nyximos.log

[Clean Code] 1장, 깨끗한 코드 본문

Books

[Clean Code] 1장, 깨끗한 코드

nyximos 2022. 2. 10. 22:49

 

클린 코드,  애자일 소프트웨어 장인정신

Robert C. Martin

 

 

들어가면서

장인정신을 익히는 과정

① 이론 : 장인에게 필요한 원칙, 패턴, 기법, 경험이라는 지식을 습득해야 한다.

② 실전 : 열심히 일하고 연습해 지식을 몸과 마음으로 체득해야 한다.

 

⛸ 클린 코드

  • → 열심히, 아주 열심히 독파해야 하는 책
  • 코드를 읽고 무엇이 옳고 그린지 생각하기
  • 모듈을 분해했다가 다시 조립하는 과정 이해하기
  • 시간을 들여 사례 연구 검토, 모든 결정과 단계 이해, 저자의 입장에서 생각한 방식을 이해하려 애쓰기
  • 사례 연구에서 코드를 정리하면서 내린 각 결정과 heu-ristic 사이의 관계가 중요하다.
  • 손으로 몸으로 마음으로 익혀 자신의 일부처럼 활용하자.

 

코드가 존재하리라

코드가 사라질 일은 없다.

코드는 요구사항을 상세히 표현하는 수단이기 때문.

고도로 추상화된 언어나 특정 응용 분야 언어로 기술하는 명세 또한 코드이다.

 

나쁜코드

80년대 후반 Killer App을 구현한 회사의 사례

회사가 망한 원인 → 나쁜 코드

르블랑의 법칙 leblanc's Law

우리 모두는 대충 짠 프로그램이 돌아간다는 사실에 안도감을 느낀다.

나중에 정리한다고 다짐하지만..  나중은 결코 오지 않는다.

 

나쁜 코드로 치르는 대가

나쁜 코드는 개발 속도를 크게 떨어뜨린다.

 

코드를 고친다.

→ 엉뚱한 곳에서 문제가 생긴다.

→ 얽히고설킨 코드를 매번 해독해서 얽히고설킨 코드를 더한다.

→ 나쁜 코드가 쌓일수록 팀 생산성이 떨어진다.

→ 프로젝트에 인력을 추가로 투입한다.

→ 새 인력과 팀은 설계에 대한 조예가 깊지 않다. + 극심한 압력에 시달린다.

→ 나쁜 코드를 더 많이 양산한다. → 생산성은 거의 0이 된다.

 

원대한 재설계의 꿈

한 팀은 현재 시스템을 유지보수하고

새로운 타이거 팀은 기존 시스템 기능을 모두 제공하는 새 시스템 + 기존 시스템의 변경을 따라잡아야 한다.

→ 새 시스템이 기존 시스템을 따라잡을 쯤 초창기 타이거 팀원들은 모두 팀을 떠났다.

→ 새로운 팀원들이 새 시스템을 설계 하자고 한다.

 

결론

시간을 들여 깨끗한 코드를 만드는 노력

= 비용 절감

= 전문가로서 살아남는 길

 

 

태도

나쁜 코드의 위험을 이해하지 못하는 관리자의 말을 그대로 따르는 프로그래머의 행동은 전문가답지 못하다.

 

원초적 난재

나쁜 코드는 업무 속도를 늦춘다.

기한을 맞추는 유일한 방법 = 언제나 코드를 최대한 깨끗하게 유지하는 습관

 

깨끗한 코드라는 예술

깨끗한 코드를 작성하려면?

 

  • '청결'이라는 힘겹게 습득한 감각을 활용해 자잘한 기법들을 적용하는 절제와 규율이 필요하다.
  • 열쇠는 '코드 감각'이다.
  • '코드 감각'이 있으면 좋은 코드와 나쁜 코드를 구분한다.
  • 게다가 절제와 규율을 적용해 나쁜 코드를 좋은 코드로 바꾸는 전략도 파악한다.
  • 깨끗한 코드를 작성하는 프로그래머는 빈 캔버스를 우아한 작품으로 바꿔나가는 화가와 같다.

 

깨끗한 코드란?

Bjarne Stroustrup

C++ 창시자, The C++ Programming Language 저자

 

  • 우아하고 효율적인 코드
  • 논리가 간단해야 버그가 숨어들지 못한다.
  • 의존성을 최대한 줄여야 유지보수가 쉬워진다.
  • 오류는 명백한 전략에 의거해 철저히 처리한다.  (메모리 누수, race condition, 일관성 없는 명명법)
  • 성능을 최적화로 유지해야 사람들이 원칙 없는 최적화로 코드를 망치려는 유혹에 빠지지 않는다.
  • 깨끗한 코드는 한 가지를 제대로 한다.

 

Grady Booch

Object Oriented Analysis and Design with Application 저자

 

  • 깨끗한 코드는 단순하고 직접적이다.
  • 깨끗한 코드는 잘 쓴 문장처럼 읽힌다. (가독성)
  • 깨끗한 코드는 결코 설계자의 의도를 숨기지 않는다.
  • 오히려 명쾌한 추상화와 단순한 제어문으로 가득하다.

→ 코드는 추측이 아니라 사실에 기반해야 한다. 반드시 필요한 내용만 담아야 한다.

 

Big Dave Thomas

OTL 창립자, 이클립스 전략의 대부

 

  • 깨끗한 코드는 작성자가 아닌 사람도 읽기 쉽고 고치기 쉽다.
  • 단위 테스트 케이스인수 테스트 케이스가 존재한다.
  • 깨끗한 코드에는 의미 있는 이름이 붙는다.
  • 특정 목적을 달성하는 방법은 (여러가지가 아니라) 하나만 제공한다.
  • 의존성은 최소이며 각 의존성을 명확히 정의한다.
  • API는 명확하며 최소로 줄였다.
  • 언어에 따라 필요한 모든 정보를 코드만으로 명확히 표현할 수 없기에 코드는 문학적으로 표현해야 마땅하다.

→ 아무리 코드가 우아하고 가독성이 높아도 테스트 케이스가 없으면 깨끗하지 않다.

→ 큰 코드보다 작은 코드에 가치를 둔다. 작을수록 좋다.

→ 문학적 : 인간이 읽기 좋은 코드를 작성하라.

 

Michael Feathers

Working Effectively with Legacy Code 저자

 

  • 깨끗한 코드의 특징은 많지만 그중에서도 모두를 아우르는 특징이 하나 있다.
  • 깨끗한 코드는 언제나 누군가 주의 깊게 짰다는 느낌을 준다.
  • 고치려고 살펴봐도 딱히 손 댈 곳이 없다.
  • 작성자가 이미 모든 사항을 고려했으므로.
  • 고칠 궁리를 하다보면 언제나 제자리로 돌아온다.
  • 그리고는 누군가 남겨준 코드, 누군가 주의 깊게 짜놓은 작품에 감사를 느낀다.

→ 깨끗한 코드

= 시간을 들여 깔끔하고 단정하게 정리한 코드

= 세세한 사항까지 꼼꼼하게 신경쓴 코드

 

Ron Jeffries

Extreme Programming Installed 저자, Extreme Programming Adventure in C# 저자

 

  • 최근들어 나는 Kent Back이 제안한 단순한 코드 규칙으로 구현을 시작한다. (그리고 같은 규칙으로 구현을 거의 끝낸다.)
  • 모든 테스트를 통과한다.
  • 중복이 없다. 
  • 시스템 내 모든 설계 아이디어를 표현한다.
  • 클래스, 메서드, 함수 등을 최대한 줄인다.
  • 메서드 추출 Extract Method 리팩터링 기법을 적용해 명확히 기술하는 메서드 하나와 기능을 실제로 수행하는 메서드 여러개로 나눈다.
  • 어떤 집합에서 특정 항목을 찾아낼 필요가 생기는 상황에는, 추상 메서드추상 클래스를 만들어 실제 구현을 감싼다.

→ 중복 줄이기

→ 표현력 높이기

→ 초반부터 간단한 추상화 고려하기

 

Ward Cunningham

Wiki 창시자, Fit 창시자, eXtreme Programming 공동 창시자, 디자인 패턴을 뒤에서 움직이는 전문가,

Smalltalk와 객체지향의 정신적 지도자, 코드를 사랑하는 프로그래머들의 대부

 

  • 코드를 읽으면서 짐작했던 기능을 각 루틴이 그대로 수행한다면 깨끗한 코드라 불러도 되겠다.
  • 코드가 그 문제를 풀기 위한 언어처럼 보인다면 아름다운 코드라 불러도 되겠다.

→ 언어를 단순하게 보이도록 만드는 책임은 프로그래머에게 있다.

 

우리들 생각

  • 깨끗한 변수 이름, 깨끗한 함수, 깨끗한 클래스를 만드는 방법을 소개한다.
  • 이 책은 오브젝트 멘토 진영이 생각하는 깨끗한 코드를 설명한다.
  • 이 책에서 주장하는 기법 다수는 논쟁의 여지가 있으나
  • 수십 년에 걸친 경험, 반복적인 시행착어로 습득한 교훈과 기법이다.

 

우리는 저자다

  • Javadoc 에서 @author 필드는 저자를 소개한다.
  • 저자에게는 독자와 잘 소통할 책임도 있다.
  • 다음에 코드를 작성할 때는 자신이 저자라는 사실을, 여러분의 노력을 보고 판단을 내릴 독자가 있다는 사실을 기억하기 바란다.
  • 새 코드를 짜면서 우리는 끊임없이 기존 코드를 읽는다. → 읽기 쉬운 코드가 매우 중요하다.

 

보이스카우트 규칙

"캠프장은 처음 왔을 때보다 더 깨끗하게 해놓고 떠나라."

 

  • 한꺼 번에 많은 시간과 노력을 투자하려 하지말고
  • 변수 이름 하나를 개선하고,
  • 조금 긴 함수 하나를 분할하고,
  • 약간의 중복을 제거하고,
  • 복잡한 if문 하나를 정리하자. 

 

프리퀄과 원칙

이 책은 저자가 2002년에 출판한 Agile Software Development: Prin-ciples, Patterns, and Practices의 프리퀄이다.

 

이 책에서는 다양한 설계 원칙을 산발적으로 거론한다. (SRP, OCP, DIP 등)

 

결론

책은 단지 다른 뛰어난 프로그래머가 생각하는 방식과 그들이 사용하는 기술, 기교, 도구를 소개할 뿐이다.

 

"연습하자 연습!"

'Books' 카테고리의 다른 글

[Clean Code] 6장, 객체와 자료 구조  (0) 2022.02.22
[Clean Code] 5장, 형식 맞추기  (0) 2022.02.18
[Clean Code] 4장, 주석  (0) 2022.02.16
[Clean Code] 3장, 함수  (0) 2022.02.12
[Clean Code] 2장, 의미 있는 이름  (0) 2022.02.11