CS

CS 공부) 좋은 코드란 무엇인가?

김염인 2022. 9. 19. 12:36

과연 좋은 코드는 무엇일까?

 

좋은 코드란 중복이 없는 코드, 가독성이 좋은 코드라고 말 할 수 있다. 더 정확히 말하자면 좋지 않은 코드가 없는 코드가 좋은 코드라고 말 할 수 있다. 좋은 코드를 작성하려고 노력하는 대신 좋지 않은 코드를 줄여보자. 그리고 격리해보자. 작성된 모든 코드는 결국 유지 보수 비용이 필요하다. 궁극적으로 우리의 코드는 점진적으로 개선 가능해야 한다

 

여기서 말하는 좋지 않은 코드는 무엇일까 ?

 

첫 번째 거리이다. 함수를 구현한 위치와 함수를 실행하는 위치의 물리적 거리가 너무 멀면 좋지 않은 코드라고 할 수 있다. 이러한 부분이 많아지면 함수의 구현 내용이 무엇인지 빠르게 파악하기 힘들며 가독성이 점점 떨어지는 일이 일어나기 때문이다.

 

두 번째 순수하지 않은 함수이다. 함수 외부의 어떤 값을 기반으로 동작하는 함수는  side effect 제어하기 어렵다. 함수의 입출력만 확인하여 함수 내부를 수정할  없다면 수정하기 까다롭다.

 

그래서 순수한 함수랑 순수하지 않은 함수는 어떻게 생겼나?

순수한 함수와 순수하지 않은 함수를 가능한 간략한 모습으로 정의해보겠습니다. 

//순수한 함수
//같은 입력을 받았다면 이 함수는 항상 같은 값을 반환합니다. 
function checkAge(age) {
  let minimum = 18;
  return age >= minimum //FALSE
}
checkAge(16);
//순수하지 않은 함수
//같은 입력을 받아도 항상 같은 값을 반환할 거라고 보장할 수 없습니다. 
var minimum = 15;
function checkAge(age) {
  return age >= minimum //minimum의 값에 따라서 반환되는 값이 달라집니다. 
}

checkAge(16);
 

세 번째 응급처치를  코드 Side Effect를 처리하기 두려워 함수 내부에 억지로 옵션을 추가하거나 입력을 함수에 추가하는 등 응급처치를 한 코드가 되는 경우 누구도 알아 보기 힘든 어려운 함수가 된다.  당연히 이런 함수는 우리가 고민하는 좋은 코드라고   없다.

 

네 번째 기술부채가 많은 코드

응급처치가 무조건 나쁘다는 말이 아니다. 당장 문제 해결을 하는 데에 이만큼 빠른 대응이 없다. 현재 서비스에서 발생하는 버그를 잡아야 하는데, 전체적인 구조 리팩토링을 할 수 없기 때문이다. 다만 이런 응급처치한 코드들은 부채가 되고 상환의 의무를 져야 한다.

자금이 필요하여 은행에서 대출을 받았다면 대출받은 금액을 언젠가 상환해야 하는 것과 동일한 이치이다. 적절한 대출로 자금을 보다 융통성 있게 사용할  있다. 마찬가지로 잠시 기술 부채를 두고 문제를 해결하는 것도 중요하다. 과도한 대출은 이자의 부담이 심한 것처럼 기술 부채가 많아질수록  코드를 유지보수 하는데   비용이 들어가기 때문에 적정선을 찾는  또한 중요하다.

 

좋은 코드를 왜 작성해야 하는지부터 고민했던 과정을 글로 정리해보았다.

  • 코드 간의 의존성을 고민하자. (추상화) - 낮은 결합도(클래스 끼리) 
  • 합의된 규칙으로 일관성있게 작성하자. (네이밍, 디렉터링)
  • 적절하게 확장 가능하도록 설계하자. - 높은 응집도(클래스내 함수들)
  • 어쩔 수 없는 코드는 주석과 함께 격리하자. - 하드코딩이 불가피한 경우, 비즈니스 요구사항이 복잡하여 hacky한 코드를 작성해야 하는 경우 등 어쩔 수 없이 좋지 않게 작성되는 코드들은 주석과 함께 격리시켜 관리할 수 있다.

 

결국 투입되는 비용 대비 결과물이 있어야 하는 엔지니어링의 영역이기 때문에 상황에 따라 트레이드 오프를 고민하여 코드를 관리해나가는 것이 무엇보다 중요하다고 생각한다.

 

출처

https://medium.com/naver-cloud-platform/%EB%84%A4%EC%9D%B4%EB%B2%84%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EC%8A%A4%ED%86%A0%EB%A6%AC-%EC%A2%8B%EC%9D%80-%EC%BD%94%EB%93%9C%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C-%ED%81%B4%EB%A6%B0%EC%BD%94%EB%93%9C-%EC%9D%B4%EC%95%BC%EA%B8%B0-c7811f73a46b