[좋은 코드, 나쁜 코드] ch1.코드 품질
1부 코드 품질
고품질의 소프트웨어를 만들기 위해서는 고품질의 코드를 작성해야 합니다.
- 코드 품질이 중요한 이유
- 고품질의 코드가 이루고자 하는 네 가지 목표
- 고품질 코드 작성을 위한 높은 수준에서의 여섯 가지 전략
- 고품질의 코드 작성이 어떻게 중장기적으로 시간과 노력을 절약할 수 있는지
코드 품질의 목표 ( 고품질의 코드가 이루고자 하는 네 가지 목표 )
코드를 고품질 혹은 저품질로 정의하는 것은 본질적으로 주관적이고 다소 성급합니다. 좀 더 객관적으로 코드의 품질을 평가하기 위해 코드의 목표가 무엇인지 생각해볼 필요가 있습니다. 목표 달성에 도움이 되면 높은 품질의 코드, 방해가 된다면 낮은 품질의 코드로 정의합니다. 아래와 같은 목표도 달성해야 합니다.
- 작동해야 한다.
- 작동이 멈춰선 안 된다.
- 변화하는 요구사항에 적응해야 한다.
- 중복된 구현은 하지 않는게 좋다.
1. 작동해야 한다.
2. 작동이 멈춰선 안 된다.
오늘은 작동하는 코드가 미래엔 작동할 수 있을까? 를 걱정해야 한다. 왜냐하면 코드는 고립된 환경에서 홀로 실행되는 것이 아니기 때문에 주변 상황이 바뀌면서 동작이 멈출 수도 있다.
- 의존하고 있는 코드가 수정될 수 있다.
- 새로운 기능이 추가되어 코드가 수정되어야 한다.
- 요구사항은 시간이 지남에 따라 변경된다. ( 소비자 선호, 비즈니스 요구, 기술의 발전 등..)
3. 변화하는 요구사항에 적응해야 한다.
한 번 작성하고 다시는 수정되지 않는 코드는 없다. 하지만 모든 변화를 예측해서 소프트웨어를 설계하는 것은 불가능에 가깝다. (시간이 모자르기 때문에..) 그렇다고 변화에 대비하지 않고 코드를 작성하면 요구사항을 반영할 수 없다. 그러므로 적당한 타협점에서 개발하고 유지보수 해야만 한다.
4. 중복된 구현은 하지 않는게 좋다.
이미 있는 코드는 다시 작성하지 않는다는 개념입니다.
코드 품질의 핵심 요소
- 코드는 읽기 쉬워야 합니다.
- 코드는 예측 가능해야 합니다.
- 코드를 오용하기 어렵게 만들어야 합니다.
- 코드를 모듈화해야 합니다.
- 코드를 재사용 가능하고 일반화할 수 있게 만들어야 합니다.
- 코드는 테스트 가능해야 합니다.
1. 코드는 읽기 쉬워야 합니다.
2. 코드는 예측 가능해야 합니다.
코드가 예상에서 벗어나는 일을 한다면 그 코드를 사용하는 개발자는 그 상황을 알지 못하거나 그 상황에 대처하지 못합니다. 이러한 코드는 사소한 오류를 일으킬 수도 있지만, 큰 문제를 일으킬 수도 있습니다. 코드가 예상을 벗어나지 않는지 주의 깊게 살펴야 하고, 예상을 벗어나는 코드를 작성하지 않도록 주의해야 합니다.
3. 코드를 오용하기 어렵게 만들어야 합니다.
TV 뒷면의 소켓이 전부 같은 모양이라고 생각해보세요. 전원을 모르고 HDMI에 꽂았고 TV가 폭발해버렸습니다. 그렇기 때문에 오용하기 어렵게 만들어야 합니다.
4. 코드를 모듈화해야 합니다.
모듈화가 된다면 코드를 손쉽게 교체할 수 있습니다. 모듈화된 시스템의 주요 특징 중 하나는 인터페이스가 잘 정의되어 서로 다른 구성 요소 간 상호작용하는 지점이 최소화된다는 점입니다.
5. 코드를 재사용 가능하고 일반화할 수 있게 만들어야 합니다.
- 재사용
- 어떤 문제를 해결하기 위한 도구가 다른 곳에서도 유용하게 사용됩니다.
- 아래 예시에서는 구멍을 뚫어야 한다는 문제도 하나고 도구도 하나입니다. 하지만 사용되는 곳이 다릅니다.
- 드릴은 구멍을 뚫습니다. 이를 이용해 여러군데 구멍을 뚫을 수 있습니다.
- 드릴로 벽을 뚫습니다, 드릴로 천장을 뚫습니다.
- 일반화
- 비슷한 여러가지 문제를 해결하기 위한 도구입니다.
- 아래 예시에서는 문제가 여러개지만 도구는 하나입니다.
- 드릴은 돌아갑니다. 이를 이용해 여러가지 문제를 해결할 수 있습니다.
- 드릴로 나사를 박습니다, 드릴로 구멍을 뚫습니다.
6. 코드는 테스트 가능해야 합니다.
버그와 제대로 동작하지 않는 기능의 코드는 실제 서비스가 되지 않도록 해야 하는데 테스트는 아래와 같은 중요한 일을 합니다. 따라서 테스트는 코드가 동작하고 멈추지 않게 잘 실행되도록 보장하기 위한 필수적인 부분입니다.
- 버그 혹은 동작하지 않는 코드가 코드베이스에 병합되지 않도록 방지합니다.
- 버그 혹은 동작하지 않는 코드가 실제로 서비스되지 않게 방지합니다.
- 애플리케이션과 코드베이스는 너무 크고 복잡해 한 사람이 모든 세부사항을 알 수 없으므로 테스트를 해야합니다.
- 사람은 실수하기 때문에 꼭 테스트를 해야합니다.
- 테스트의 용이성을 확인하기 위해서 코드를 작성하면서 “어떻게 테스트하지?”를 계속 자문해야 합니다. 코드를 다 작성하고 나서 테스트에 대해 생각하면 안됩니다.
댓글남기기