개발자의 길을 택했다면 클린 코드에 대한 고민은 필수라고 생각한다. 한 분야로의 진출을 결정했다면 그 분야에서 최고가 되기 위해 노력해야한다. 개발 분야에서 최고가 되려면 최고의 코드에 대한 끊임 없는 고민이 필요하다.우리는 자신의 생각을 코드로 표현하는 사람들이다. 직업에 대한 장인 정신을 갖고 있다면 당연히 최고의 코드를 신경쓸 수 밖에 없다.
아직 현업 근무 경험이 없기 때문에 내가 추구하는 클린 코드가 현업에서 인정하는 클린 코드와 일치할 지는 모른다. 하지만 이미 현업에서 근무 경력이 있는 사람들의 글을 보고 이해하려 노력할 수는 있다. 내 글이 누군가의 도움이 될 수 있고 나 또한 기록하고 정리하며 내 생각을 정리할 수 있기 때문에 오늘은 클린 코드에 대한 고민과 내가 준수하려 노력하는 준칙들을 기록해보고자 한다.
다만, 참고만 하되 맹신하지는 않았으면 좋겠다. 각자 추구하는 방향이 있고 가치관이 있다. 이 글은 그냥 여러 글의 내용과 본인의 경험에 따라 본인이 생각하는 클린 코드에 관한 내용이다.
내가 생각하는 클린 코드
‘간결해 읽기 쉽고 작성자의 설계, 의도가 보이는 코드’
코드를 이해하는 데 최소의 시간이 소비되며 코드 그 자체로 작성자의 큰 그림(설계), 의도가 여실히 보이는 코드가 클린 코드라 생각한다.
코드 그 자체로 설계를 머릿 속에 그릴 수 있게 된다면 코드에 대한 이해도가 높아질 것이며 변경에도 유연하게 대응할 수 있다.
개발한 소프트웨어를 운영하고 사용자의 의견을 수용하다보면 소프트웨어의 기능 변화는 필수적으로 발생한다. 사용자의 요구를 수용하지 못한다면 다른 소프트웨어에 대체될 뿐이다. 그렇기에 우리는 용이한 수정을 위해 쉬운 수정을 염두에 두고 코드를 작성해야 하는데, 그러기 위해서는 읽기 쉬운 코드를 작성해야 한다.
그러면 무엇을 신경써야 할까?
클린 코드를 위해 신경써야 되는 부분은 아주 많다. 변수, 함수의 명명부터 잘 모듈화된 설계까지.. 그래도 가장 중요한 것을 한 가지 꼽아보라 하면 ‘간단함’에 제일 우선순위를 두고 싶다. 수 많은 방법이 결국에는 다 코드를 간단하게 유지하기 위한 방법이라고 생각된다.
‘코드를 간단하게 유지하기 위한 방법’
의미가 확실한 명명
해당 변수가 무슨 역할을 하는 변수인지 드러나도록 이름을 명명한다.
의도를 확실히 드러낼 수 있다면 변수명이 길더라도 상관 없다. 짧아서 의미를 확인하는 데 오래걸리는 변수명보다야 좀 길더라도 쉽게 이해할 수 있는 변수명이 좋다.
간단한 논리
복잡한 논리를 최대한 간단한 논리로 만든다. 당연한 말이다. 프로그램은 논리의 집합이다. 논리가 간단하면 간단할수록 프로그램의 동작이 읽기 쉬워질 것이다.
의존성 최소화
모듈 간 의존도가 높고 결합이 많이 되어 있을수록 프로그램 구조가 복잡해질 수 밖에 없다. ‘스파게티 코드’를 알 것이다. 복잡하게 얽히고 얽힌 코드를 말한다. 여러 모듈이 엉켜있기 때문에 한 눈에 프로그램 구조를 파악하기가 쉽지 않다.
잘게 분리된 기능
모듈의 응집도, 함수의 재사용성과 관련이 있다. 기능을 잘게 분리한다는 것은 더 이상 분리할 수 없을 만큼의 최소 기능을 갖추고 있다는 것이고, 해당 함수의 재사용성이 늘어날 수 밖에 없다. 또한 함수나 모듈 등의 명명이 쉬워진다. 함수가 두 가지 이상 일을 하는 경우 함수의 명명이 힘들지만 한 가지 일만 수행하는 경우 함수의 명명이 쉽다.
function getPosts; // 데이터 페칭 기능만 담당한다.
function savePost; // 데이터 저장 기능만 담당한다.function saveAndGetPosts; // 저장 후 페칭한다.
당연히 가져오는 함수와 저장하는 함수를 분리하는 것이 각 함수를 재사용할 가능성이 높아지며 프로그램의 논리를 작성하는 데 편할 것이다. 각각의 기능을 호출하기만 하면 되니까.
saveAndGetPosts의 경우 함수의 이름에서 이미 두 가지 기능을 한다는 것을 알 수 있다. 한 번에 두 가지 일을 하기에 두 가지 함수로 분리한 경우에 비해 재사용이 어려우며 생각해야되는 경우의 수가 많아지기에 생각이 복잡해진다. 또한 예측하지 못한 부수 효과 (Side Effect)가 발생할 확률이 높으며 이는 곧 버그의 가능성이 높아진다는 것이다.
추상화
모듈(함수도 포함한다)의 내부 구조를 알 필요 없이 모듈(함수)의 동작을 알 수 있도록 추상화시키는 것을 말한다. 추상화를 통해 복잡한 생각 없이 쉽게 코드의 흐름과 설계를 머릿 속에 그릴 수 있다. 이는 곧 내가 수정할 부분에만 집중할 수 있다는 소리다.
추상화를 위해서는 기능의 분리가 필요하며 상세한 명명이 필요하다.
사이드 이펙트 제거
사이드 이펙트 제거는 생각을 단순화할 수 있고 버그의 발생을 줄일 수 있다. 사이드 이펙트를 제거하는 방향으로 코드를 작성해야 한다.
일관성 유지, 불일치 제거
코드에 일관성을 유지하는 것을 말한다. 어느 한 방법으로 문제를 해결했다면 다른 방법도 동일한 방법으로 해결해야 한다. 코드의 일관성을 유지함으로써 코드 작성자의 철칙을 이해할 수 있고 이는 곧 수정이 용이함을 의미한다.
SW 개발 3원칙
품질 좋은 코드 작성을 위해 준수하면 좋은 3가지 원칙이다. 아래의 3가지만 지켜도 코드가 훨씬 간단해질 것이다.
KISS (Keep It Simple Stupid)
소프트웨어 설계나 코드를 최대한 간단하고 단순하게 만드는 것이 좋다는 의미이다. 코드나 설계가 불필요하게 장황해지는 것을 방지하라는 뜻이다.
YAGNI (You Ain’t Gonna Need It)
필요한 작업에만 집중하고 미래의 확장을 위한 불필요한 작업을 하지 말라는 것이다.
소프트웨어의 설계가 변경되었을 때 확장을 생각해 미리 작성한 코드 또한 수정하게 되며 오히려 버그를 유발할 수도 있다. 그렇기에 지금 필요한 작업에만 집중하고 지금 불필요한 작업이라면 미리 작성하지 말라는 뜻이다.
DRY (Do not Repeat Yourself)
작업을 반복하지 말라는 것이다. 작업의 반복은 버그 발생 가능성을 높인다. 반복되는 코드에 수정이 필요한 경우 일일이 찾아가서 수정해야 하며 그 과정에서 실수가 있다면 버그가 발생한다. 비효율적이고 위험하기 때문에 중복을 배제하라는 것이다.
내가 생각하는 클린코드와 코드를 클린하게 작성하기 위해 고려하는 준칙들에 대해 정리했다. 이것이 많은 사람들이 인정하는 클린 코드 일지는 모르겠으나, 자신의 코드에 애정을 갖고 나름대로의 코드에 철칙을 부여하려 노력했다는 것에 의미를 두고 있다.
더 나은 코드를 위한 조언이라던가 수정해주었으면 하는 부분이 있다면 얼마든지 댓글로 남겨주셔도 좋다. 오히려 감사하다. 내가 나를 객관적으로 바라보기란 힘든 일이다. 다른 사람의 조언과 충고를 들음으로써 객관적인 평가와 성장이 가능하다.
그럼 이만 총총,,