왜 나는 ‘스마트’ 코드보다 단순 코드를 선호하는가
Source: Dev.to
왜 단순한 코드가 중요한가
코딩을 배우기 시작했을 때, 좋은 코드는 똑똑한 코드라고 생각했습니다—짧은 변수명, 한 줄에 여러 작업을 수행하는 원‑라이너, 가능한 한 적은 줄에 압축된 로직. 보기에도 인상적이고 뿌듯했죠.
하지만 시간이 지나면서 분명해진 것이 하나 있습니다: 제가 가장 빨리 이해한 코드는 절대 “똑똑한” 코드가 아니었습니다. 언제나 단순한 코드였습니다. 이 경험은 제가 코드를 작성하는 방식을 바꾸게 만들었습니다.
“똑똑한” 코드가 보통 의미하는 것
사람들이 “똑똑한” 코드를 말할 때 보통 다음과 같은 것을 떠올립니다:
- 매우 압축된 로직
- 영리한 트릭과 단축키
- 더 적은 줄로 더 많은 일을 수행
- “잠깐, 이게 어떻게 작동하는 거지?” 라는 느낌을 주는 코드
영리한 코드가 항상 나쁜 것은 아닙니다—때때로 타당할 때도 있죠. 하지만 그 “똑똑한” 코드는 특히 다른 사람이 읽을 때 읽기 어려운 경우가 많습니다.
코드는 한 번만 읽는 것이 아니다
코드를 쓰고 잊어버리는 것이 아닙니다. 다시 찾아보게 됩니다: 버그를 고치거나, 기능을 추가하거나, 함수가 어떻게 동작하는지 완전히 잊어버렸을 때 말이죠. 코드가 단순하면 이런 작업이 훨씬 쉬워집니다. 단순한 코드는 하나의 이야기를 들려줍니다; 몇 줄마다 멈춰서 무슨 일이 일어나고 있는지 해독할 필요가 없습니다. 솔직히 말해서, 한 달 전에 썼던 코드를 열면 짜증 없이 이해하고 싶습니다.
내 코드에서 실제 예시
실제 이야기를 해볼게요. 쇼핑 카트 총액을 계산하면서 이렇게 썼습니다:
# My "clever" version
total = sum([item['price'] * item['qty'] for item in cart if item['available']])
한 줄. 완벽히 동작했습니다. 효율적이라고 느꼈죠. 잠시 바라보며 “이건 작동하지만, 뭔가를 바꾸려면 어떻게 해야 할까?” 라는 생각이 들었습니다.
그래서 다시 작성했습니다:
# Simple version
total = 0
for item in cart:
if item['available']:
total += item['price'] * item['qty']
줄이 더 많지만 최소한 이해할 수 있었습니다. 숨겨진 것이 없었기 때문에 바꿀 때 전체가 깨질까 걱정하지 않아도 됐습니다.
단순한 코드를 디버깅하면 포기하고 싶지 않다
뭔가가 깨지면 영리한 중첩 로직을 풀어내고 싶지는 않습니다. 어디서 값이 바뀌었는지, 어떤 조건이 실패했는지 바로 보고 싶죠. 단순한 코드에서는 문제가 보통 눈에 띕니다. “똑똑한” 코드에서는 모든 것이 너무 빽빽하게 들어가 있어 작은 버그를 찾는 데도 시간이 오래 걸립니다. 아직 배우는 입장이라면, 디버깅 자체가 충분히 힘든데 코드가 방해가 되면 안 되니까요.
단순함이 지저분함을 의미하는 것은 아니다
단순한 코드가 다음을 의미하는 것은 아닙니다:
- 나쁜 코드
- 더 나은 방법이 있을 수 있는 반복적인 코드
- 전혀 구조가 없는 코드
단순한 코드는 단지 명확하고, 읽기 쉽고, 이해하기 쉽다는 뜻입니다. 제가 온라인에서 본 최고의 코드 중 상당수는 단순합니다—작성자가 더 화려하게 만들 수 있었음에도 불구하고, 명료함을 더 중시했기 때문이죠.
명료함이 영리함보다 우선
저는 영리한 코드를 반대하는 것이 아니라, 아무도 읽을 수 없는 영리한 코드는 제게 도움이 되지 않는다고 말하고 싶습니다. 지금 제가 원하는 코드는:
- 눈을 가늘게 뜨지 않아도 읽을 수 있는
- 울지 않고 디버깅할 수 있는
- 누군가 물어볼 때 실제로 설명할 수 있는
언젠가 더 고급스러운 코드를 쓸 수도 있겠지만, 그때도 명료함을 희생하고 싶지는 않습니다. 코드는 단순히 동작하게 만드는 것이 아니라, 이해하기 쉽게 만드는 것이 중요합니다. 저에게는 단순한 코드가 그 점에서 훨씬 더 뛰어납니다.
코딩할 때 여러분은 어떻게 접근하시나요? 여러분에게 효과적인 방법이 궁금합니다.