점진적인 개선

Home

Clean Code

목차

이번 포스팅은 Clean Code를 읽으며 중요하다고 생각되는 개념과 느낀 점들을 요약하여 발췌한 게시글입니다.


점진적인 개선

  • 한번에 우아한 프로그램을 만들 수 없다. 프로그래밍은 과학보다 공예에 가깝다. 깨끗한 코드를 짜려면 먼저 지저분한 코드를 짠 뒤에 정리해야 한다는 의미이다.
  • 대다수의 신참 프로그래머는 이 충고를 따르지 않는다. 일단 프로그램이 돌아가면 다음 업무로 넘어간다. 돌아가는 프로그램은 그 상태가 어떻든 그대로 버려둔다. 경험이 풍부한 전문 프로그래머라면 이런 행동이 전문가로서 자살 행위라는 사실을 잘 안다.

점진적으로 개선하다.

유지와 보수가 수월했던 코드가 버그와 결함이 숨어있을지도 모른다는 상당히 의심스러운 코드로 뒤바뀌어버렸다..!, 양보하지 않아야 한다. 새로 들어오는 요구사항을 추가하기 위해, 계속해서 코드를 덧붙였다. 보다시피 코드는 통제를 벗어나기 시작했다. 아직 끔찍한 수준은 아니지만 확실히 분위기가 수상쩍다. 여기저기 눈에 거슬리지만 아직은 엉망이라 부르기 어렵다. 여기다가 더 하나만 추가하니 코드는 완전히 엉망이 되어버렸다.

그래서 멈췄다.

추가할 요구사항이 적어도 두 개는 더 있었는데 그러면 코드가 훨씬 더 나빠지리라는 사실이 자명했다. 계속 밀어붙이면 프로그램은 어떻게든 완성하겠지만 그랬다가는 너무 커서 손대기 어려운 골칫거리가 생겨날 참이었다. 코드 구조를 유지보수하기 좋은 상태로 만들려면 지금이 적기라 판단했다.

그래서 나는 기능을 더 이상 추가하지 않기로 결정하고 리팩터링을 시작했다.

프로그램을 망치는 가장 좋은 방법 중 하나는 개선이라는 이름 아래 구조를 크게 뒤집는 행위이다. 어떤 프로그램은 그저 그런 ‘개선’전과 똑같이 프로그램을 돌리기가 아주 어렵기 때문이다. 그래서 나는 테스트를 기반으로 프로그램을 리팩토링하기 시작했다. 한 번에 하나씩 고치면서 테스트를 계속 돌렸다. 테스트 케이스가 하나라도 실패하면 다음 변경으로 넘어가기 전에 오류를 수정했다. 다시 리팩토링을 진행한다. 물론 코드는 모든 테스트를 계속 통과한다. 휴먼 에러가 발생한다. 예외 처리를 넣은지 얼마나 되었다고 바로 앞에서 동일한 실수를 반복한다. 이러한 사례는 매우 흔하다. 단계적으로 진행하며 테스트 코드를 계속 수정한다. 매번 테스트를 돌려야 하니, 여기 저기 코드를 옮길일이 많아졌다. 리팩토링은 큐브 맞추기와 비슷하다. 큰 목표 하나를 이루기 위해 자잘한 단계를 수없이 거쳐야한다.

그저 돌아가는 코드만으로는 부족하다.

돌아가는 코드가 심하게 망가지는 사례는 흔하다. 단순히 돌아가는 코드에 만족하는 프로그래머는 전문가 정신이 부족하다. 설계와 구조를 개선할 시간이 없다고 변명할지도 모르겠다. 나는 동의하지 않는다. 나쁜 코드보다 더 오랫동안 더 심각하게 개발 프로젝트에 악영향을 미치는 요인도 없다. 나쁜 일정은 다시 짜면 된다. 나쁜 요구사항은 다시 정의하면 된다. 하지만 나쁜 코드는 썩어 문드러진다. 점점 무게가 늘어나 팀의 발목을 잡는다. 속도가 점점 느려지다 못해 기어가는 팀도 생긴다. 너무 서두르다가 이후로 영원히 자신들의 운명을 지배할 악성 코드라는 굴레를 짊어진다. 물론 나쁜 코드도 깨끗한 코드로 개선할 수 있다. 하지만 비용이 엄청나게 많이 든다. 코드가 썩어가며 모듈은 서로서로 얽히고설켜 뒤엉키고 숨겨진 의존성이 수도 없이 생긴다. 오래된 의존성을 찾아내 깨려면 상당한 시간과 인내심이 필요하다. 반면 처음부터 코드를 깨끗하게 유지하기란 상대적으로 쉽다. 더욱이 5분 전에 엉망으로 만든 코드는 지금 당장 정리하기 쉽다.

그러므로 코드는 언제나 최대한 깔끔하고 단순하게 정리하자. 절대로 썩어가게 방치하면 안된다.

나쁜 코드를 욕하는 것이 아닌, 점진적으로 개선 해야할 때 당연히 그것을 할 수 있는 환경이 갖춰지는 것이 중요하다고 생각한다. 그러한 개선 기간은 텀이 짧을 수록 좋고, 사실은 개발 완료라는 사실 이전에 그 일이 행해져야만 한다.

다른 사람이 내 코드를 항상 보고, 그들을 이해시켜야만 한다고 가정하자. 다른 사람이 내 코드를 봤을 때 깨끗하다고 감탄했으면 좋겠다. 문학적인 코드를 작성해라. 마치 소설처럼 위에서 아래로 읽혀야 한다.