본문 바로가기

SW LAB/Algorithm

Clean Code : (1) 깨끗한 코드

 프롬스의 SWDEVLAB 

깨끗한 코드

이 책을 읽는 이유는 두 가지가 있습니다.

첫째, 프로그래머이기 때문에 ..

둘째, 더 나은 프로그래머가 되고 싶기 때문에 ..

 

코드를 최대한 다양한 각도에서 살펴보고 사방으로 돌리고 안팎으로 뒤집으며 꼼꼼히 따져봅니다.

 

코드가 존재하리라

자동으로 코드를 작성해주는 시대가 다가오고 있지만, 코드가 사라질 가망은 없습니다.

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

기계가 실행할 정도로 상세하게 요구사항을 명시하는 작업, 바로 이것이 프로그래밍입니다.

 

궁극적으로 코드는 요구사항을 표현하는 언어라는 사실을 명심해야 합니다. 요구사항에 더욱 가까운 언어를 만들 수도 있고, 요구사항에서 정형 구조를 뽑아내는 도구를 만들 수도 있습니다. 하지만 어느 순간에는 정밀한 표현이 필요합니다. 그 필요성을 없앨 방법은 없기 때문에 코드는 항상 존재할 것입니다.

 

코드가 사라지리라 생각하는 사람들은 언젠가 비정형적인 수학이 나오리라 기대하는 수학자와 같습니다.

 

나쁜코드

우리 모두는 좋은 코드가 중요하다는 사실을 압니다. 왜? 오랫동안 나쁜 코드에 시달려왔으니까 ..

 

한 회사가 킬러앱을 만들어 승승장구 했지만, 패치 주기가 길어지고 결국 서비스 운영을 지속하지 못해 망했습니다. 회사가 망한 원인은 나쁜 코드 탓이었던 것입니다. 기능을 추가할 수록 코드가 엉망이 되어갔고,  감당이 불가능한 수준이 되었기 때문입니다.

 

어째서 나쁜 코드를 짜는 것일까요 ?

급해서? 서둘러서? 아마도 그랬을 것입니다. 그리고 나중에 수정하겠다고 다짐을 했었겠지요. 물론 이 때 우리는 르블랑의 법칙(Leblanc's Law)을 몰랐을 것입니다. 나중은 결코 오지 않습니다.

 

나쁜코드로 치르는 대가

나쁜코드가 생길수록 생산성은 0에 가까워 집니다. 그리고 결국 재설계를 진행하게 되지요. 그리고 능력있는 사람들이 모여 재설계를 진행하고 기존 시스템에 100%에 가까워지도록 개발을 진행합니다. 하지만 100%가 거의 되었을 때, 기존 개발자는 모두 떠나고 새로운 개발자가 투입됩니다. 왜 그럴까요 ? 현재 시스템이 너무 엉망이기 때문입니다.

좋은 코드를 작성하는 것은 그 만큼 중요한 일입니다.

 

시간에 쫒겨서 코드를 작성하게 되는 것은 원초적 난제라고 느낍니다.

하지만 진짜 전문가는 나쁜 코드를 양산하면 기한을 맞추지 못한다는 것을 압니다. 기한을 맞추는 유일한 방법은, 언제나 코드를 최대한 깨끗하게 유지하는 습관입니다.

 

그렇다면 깨끗한 코드는 어떻게 작성해야 할까요? 깨끗한 코드와 나쁜 코드를 구분할 줄 안다고 깨끗한 코드를 작성할 줄 아는 것은 아닙니다. 열쇠는 '코드 감각' 입니다. 어떤 사람은 코드 감각을 타고났고, 어떤 사람은 투쟁해서 얻어내야 합니다. 그리고 절제와 규율을 적용해 나쁜 코드를 좋은 코드로 바꾸는 전략이 필요합니다.

 

깨끗한 코드란?

우리 분야에서 아주 유명하고 노련한 프로그래머들에게 의견을 물어보았습니다.

 

우아하고 효율적은 코드를 좋아한다. 논리가 간단해야 버그가 숨어들지 못한다. 의존성을 최대한 줄여야 유지보수가 쉽다. 오류는 명백한 전략에 의거해 철저히 처리한다. 성능을 최적으로 유지해야 사람들이 원칙 없는 최적화로 코드를 망치려는 유혹에 빠지지 않는다. 깨끗한 코드는 한 가지를 제대로 한다.

- 비야네 스트롭스트룹(Bjarne Stroustrup), C++ 창시자

 

비야네에 따르면 깨끗한 코드는 `보기에 즐거운` 코드입니다. 비야네가 언급한 유혹의 심오한 진실은, 나쁜 코드는 나쁜 코드를 '유혹' 한다는 것입니다. 그리고 대충 넘어가게 되는 오류도 꼼꼼히 신경쓰길 언급하고 있습니다. 메모리 누수, 경쟁 상태(race condition), 일관성 없는 명명법이 또 다른 예일 것입니다. 그리고 마지막으로 언급한 '한 가지를 제대로 한다'는 너무 많은 일을 애쓰다가 의도가 뒤섞이고 목적이 흐려지는 일이 없이, 각 함수와 클래스와 모듈이 한길만 걷는 것을 말하는 것입니다.

 

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

- 그래디 부치(Grady Booch), Object Oriented Analysis and Design with  Application 저자

 

그래디는 비야네와 흡사한 의견을 표명하지만, 가독성을 강조하고 있습니다. 그리고 명쾌한 추상화, 즉 코드는 추측이 아니라 사실에 기반해야 한다는 것입니다.

 

최근 들어 나는 켄드 벡이 제안한 단순한 코드 규칙으로 구현을 시작한다. 그리고 같은 규칙으로 구현을 거의 끝낸다. 중요한 순으로 나열하자면 간단한 코드는

> 모든 테스트를 통과한다.

> 중복이 없다.

> 시스템 내 모든 설계 아이디어를 표현한다.

> 클래스, 메서드, 함수 등을 최대한 줄인다.

- 론 제프리스(Ron Jeffries)

 

론은 스트레티직 에어 커맨드 사에서 포트란으로 프로그래밍을 시작한 이래 거의 모든 플랫폼에서 거의 모든 언어로 코드를 구현해 왔습니다. 중복을 피해라. 한 기능만 수행하라. 제대로 표현하라. 작게 추상화하라. 론은 이 책의 내용을 요약하였습니다.

 

우리들 생각

이 책에서는 깨끗한 변수 이름, 깨끗한 함수, 깨끗한 클래스를 만드는 방법을 소개합니다. 적어도 이 책의 저자는 이것들이 개발하는데 있어서 진리라고 말합니다.

무술쪽에서 각 문파가 가르치는 문파가 있듯이, 이 책은 오브젝트 멘토 진영이 생각하는 깨끗한 코드를 설명합니다. 이 책에서 가르치는 기법을 따른다면 깨끗하고 수준 높은 코드를 작성할 수 있다고 장담합니다. 이 책에서 주장하는 기법 다수는 논쟁의 여지도 있지만, 이 시각을 이해하고 존중하려 애써주면 좋겠다고 합니다.

 

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

- 보이스카우트 규칙

 

이 말은 한꺼번에 많은 시간과 노력을 투자해 코드를 정리할 필요가 없다는 것입니다. 변수 이름 하나를 개선하고, 조금 긴 함수 하나를 분할하고, 약간의 중복을 제거하고, 복잡한 if 문 하나를 정리하면 충분합니다.

시간이 지날수록 코드가 좋아지는 프로젝트에서 작업한다고 상상해보세요! 지속적인 개선이야말로 전문가 정신의 본질이 아닐까요?

 

결론

이 책을 읽는다고 뛰어난 프로그래머가 된다는 보장은 없습니다. '코드 감각'을 확실히 얻는다는 보장도 없습니다. 단지 뛰어난 프로그래머가 생각하는 방식과 그들이 사용하는 기술과 기교와 도구를 소개할 뿐입니다.

 

관련글

내용이 도움이 되셨으면 공감 버튼 꼬옥 눌러주세요
본문을 퍼가실 경우 댓글을 달아주세요