깨끗한 코드에 대해

배준형·2022년 4월 8일
0

1. 깨끗한 코드란?

깨끗한 코드가 무엇인지 다양하게 정의를 내릴 수 있을 것이다. 각각의 개발자가 정의하는 깨끗한 코드의 정의가 모두 다를 수도 있을 것이다.

의존성을 최대한 줄여야 유지보수가 쉬워진다. — Bjarne Stroustrup
깨끗한 코드는 잘 쓴 문장처럼 읽힌다. — Grady Booch
깨끗한 코드는 작성자가 아닌 사람도 읽기 쉽고 고치기 쉽다. — Dave Thomas
깨끗한 코드는 언제나 주의 깊게 짰다는 느낌을 준다. — Michael Feathers
모든 테스트를 통과하고, 중복이 없으며, 시스템 내 모든 설계 아이디어를 표현한다. — Ron Jeffries
코드를 읽으면서 짐작했던 기능을 그대로 수행한다. — Ward Cunningham

책, 클린 코드 애자일 소프트웨어 장인 정신(Robert C. Martin). 1장 깨끗한 코드


클린 코드 도서의 1장에서 유명한 프로그래머들은 깨끗한 코드를 어떻게 정의했는지에 대해 알게 되었다. 모든 내용들이 중요하게 느껴지고, 코드를 작성할 때 좀 더 집중할 수 있도록 만들어주는 말들인 것 같다.

위 의견들을 기억하고 언제나 깨끗한 코드를 작성하기 위해 노력하겠지만, 개인적으로 깨끗한 코드란 주석이 없어도 작성자 외의 사람이 쉽게 이해할 수 있는 코드라고 생각한다. 쉽게 이해한다는 의미가 다소 상대적일 수 있지만 다른 사람이 읽어도 쉽게 이해할 수 있다는 것은 그만큼 논리가 간단하다는 뜻이고, 논리가 간단할수록 유지 보수가 쉬워지기 때문이다.


2 . 깨끗한 코드를 짜는 것이 중요한 이유

깨끗한 코드를 짜는 것은 왜 중요할까?

어떤 어플리케이션이 깨끗한 코드 없이 막 짜여진, 코드들이 엉켜있는 더러운 코드로 작성되었다고 가정하자. 초기 버전 어플리케이션의 기능에는 아무런 문제가 없을 수도 있다. 그러나, 어플리케이션이 업데이트될수록 더러운 코드는 치명적이다. 기존의 코드를 읽고 이해하는 시간이 늘어날 것이고, 엉켜있는 코드 중 일부만 수정했는데 전체 어플리케이션의 동작에서 문제가 발생할 수도 있다.

초기 버전 어플리케이션을 구성할 때 처음부터 깨끗한 코드를 작성하기 위해 시간을 조금 더 투자했다면 업데이트할 때의 코드를 추가하거나, 버그를 잡기 위해 코드를 수정하고 유지 보수하는 데에 더 적은 시간이 필요했을 것이다. 결국 깨끗한 코드를 작성하는 것은 더러운 코드를 작성하여 빠르게 완성하는 것보다 전체 코딩 시간을 줄여주고 유지 보수 측면에서 유리하다.


3. 사소한 경험담

프로그래머스에서 제공하는 코딩테스트 연습 문제는 한번 정답으로 코드를 제출하면 그 뒤에 접속해도 풀이가 저장되어있다. 최근 예전에 풀었던 코딩테스트 문제를 다시 풀어보기 위해 들어갔는데 예전에 작성했던 코드가 불편하게 느껴졌다.


function solution(n) {
    let arr = [];
    for (let i = 1; i <= n; i++) {
        arr.push(i);
    }
    
    let cnt = 0;
    let answer = arr.map((e) => {
        let sum = 0;
        while (sum < n) {
            sum += e;
            e++;
        }
        if (sum == n) {
            cnt++;
        }
    })

    return cnt;
}
  1. arr로 선언한 배열은 어떤 역할을 하는 배열인지 모르겠다.
  2. answer라는 변수를 선언해놓고 solution에서 반환하는 값은 cnt이다. 그럼 answer는 무슨 역할을 하는 것인지 이해할 시간이 필요했다.
  3. map 내부에 return문이 없다. forEach를 쓰고싶었던 것 같은데 Javascript 이제 막 시작한 시기에 문제를 푼 것 같다.
  4. map의 callback 함수에서의 파라미터를 e 라고 쓰고있는데 왜 e인지 모르겠다. 아마 DOM 요소에 Event를 작성한 것을 보고 e라고 쓴 것 같다.
  5. const 키워드를 쓰지 않은 점
  6. sum과 n을 비교할 때 같은 숫자형인데도 ===를 쓰지 않고 ==를 쓴 점 등등

위 코드는 문제에서 요구하는 사항을 만족한 정답 코드이다. 그러나 내가 작성한 코드임에도 무슨 코드였는지 읽어보는데 시간이 필요했고, 요구 사항은 만족했을 수 있어도 물어보나 마나 깨끗한 코드는 절대 아니라고 생각한다.


수정한 코드

이를 다음과 같이 수정해봤다.

function solution(n) {
  const nums = Array.from({ length: n }, (_, i) => i + 1);
  let count = 0;

  nums.forEach((num) => {
    let sum = 0;

    while (sum < n) {
      sum += num;
      num += 1;
    }

    if (sum === n) {
      count += 1;
    }
  });

  return count;
}

문제 풀이를 더 효율적인 코드로 바꾼 것이 아니라 로직은 유지한 상태에서 조금이나마 깨끗한 코드로 만들어봤다. 물론 위 코드가 깨끗한 코드가 아닐 수도 있다. 다만, 이전 작성된 코드에서 arr, e, answer 같은 표현을 사용하지 않고, 대신 nums, num과 같이 유추할 수 있도록 변수 명을 작성했다.


4. 정리

앞으로 코드를 작성할 때 처음부터 깨끗한 코드가 무엇인지 고민하고 작성하는 습관을 들여야겠다는 생각이 들었다. 아주 간단한 알고리즘 풀이도 깨끗한 코드에 대한 고민 없이 작성되어 있다면 다시 읽었을 때 이해하는 데 시간이 필요함을 느꼈기 때문이다. 이 코드가 복잡한 프로젝트 내부의 코드였다면 이를 수정해야 할 때 읽는 데에만 훨씬 더 많은 시간이 필요했을 것이다.

글을 쓰는 것도 어려움을 많이 느끼고 있고, 쓴 글을 다시 읽어봤을 때 자연스럽게 잘 읽히지 않는 느낌이 든다. 글을 쓰는 것도 코드를 작성하는 것과 비슷하다고 생각한다. 어떤 흐름으로 작성할지 주의 깊게 작성한다면 더 쉽게 읽힐 것이고, 글을 작성하는 것부터 연습해야겠다는 생각이 든다.

profile
프론트엔드 개발자 배준형입니다.

0개의 댓글

관련 채용 정보