2022. 6. 17. 01:37ㆍ학습일지
프로그래밍 언어의 추상화 수준은 점점 높아질 것이다. (스프링 부트, 장고와 같은 프레임워크를 보면 알 수 있다.)
코드는 결국 요구사항을 표현하는 언어라는 사실을 명심하자.
나쁜 코드
대중적으로 아무리 인기가 많은 애플리케이션을 만들었어도, 회사를 망하게 하는 원인 중 하나는 나쁜 코드이다.
나쁜 코드를 짜는 이유는 다양하다. 귀찮았거나, 바쁘거나... 그래서 우선 대충 짜 놓고 나중에 개선하기로 미루는 경우가 많지만, 르블랑의 법칙에 따라 그러한 나중은 결코 오지 않는다.
나쁜 코드는 아무리 인력을 투입해도 생산성은 0에 가까워진다. 새로운 인력은 기존 시스템에 적응할 시간이 필요한데, 코드가 복잡하니, 당연히 적응하는데 많은 시간이 걸릴 수밖에 없고, 이해했어도 해당 코드를 수정하는 데는 너무나 오랜 시간이 걸린다.
깨끗한 코드를 만드는 노력은 비용을 절감하는 방법일 뿐만 아니라, 전문가로서 살아남는 길이다.
태도
보통 나쁜 코드가 생기는 경우 중 하나는 코드의 품질에 비해, 상사 및 관리자의 촉박한 일정인 경우가 많다. 그러나 의외로 관리자는 좋은 코드를 원한다.(아마도....?) 그들이 강하게 일정과 요구사항을 밀어붙이는 이유는 그것이 그들의 책임이기 때문이다. 따라서, 좋은 코드를 유지하기 위해선, 관리자의 요구사항을 그대로 따르는 것은 비전문가적이며, 프로그래머는 어떠한 경우라도 좋은 코드를 사수할 의무가 있다.
원초적 난제
대부분 프로그래머는 기한을 맞추려면 어쩔 수 없이 나쁜 코드를 양산할 수밖에 없다고 느낀다. 즉, 그들은 빨리 집에 가려고 깨끗한 코드를 구현하기위해 시간과 노력을 들이지 않는다.
그러나, 진짜 전문가는 이러한 양상으로 개발을 하는 것이 틀렸다는 것을 잘 안다.
나쁜 코드야 말로 속도를 늦추는 최고의 방법이기에, 아무리 급해도, 언제나 코드를 최대한 깨끗하게 유지하는 습관을 갖는 것은 중요하다.
그렇다면 깨끗한 코드를 실천하려면?
이쯤되면, 아무리 급해도 깨끗한 코드를 유지해야 한다는 사실을 깨닫게 될 수 있다. 그렇다면, "어떻게 해야 할까?" 하는 의문이 들 수 있다. 깨끗한 코드를 구현하는 행위는 그림을 그리는 행위와 비슷하다.
누구나 잘그린 그림과 엉망인 그림을 구분할 수 있지만, 안타깝게도 그림을 잘 그리는 것은 정말 어렵다. 즉, 깨끗한 코드가 무엇인지를 알아도, 깨끗한 코드를 작성할 역량을 가진다는 뜻은 아니다.
깨끗한 코드를 갖기 위해선, 절제와 규율이 필요하다. 핵심 역량은 "코드 감각"이다.
코드 감각이 있는 프로그래머는 나쁜 모듈을 파악하고 개선할 방법을 파악한다.
깨끗한 코드란?
- C++ 창시자 비야네 스트롭스트룹은 깨끗한 코드를 간결하면서 성능을 낭비하지 않는 코드로 정의한다.
- 실용주의 프로그래머 데이브 토마스와 앤디 헌트는 깨진 유리 이론을 가져오며, 꼼꼼한 오류처리와, 경합 관리, 메모리 누수 방지하는 것을 깨끗한 코드라 정의한다.
- 그래디 부치는 명쾌한 추상화, 즉 필요한 내용만 담고, 명확한 내용을 표현하는 것을 깨끗한 코드라 정의한다.
- 빅 데이브 토마스는 가독성을 중요시하지만, 다른 사람이 고치기 쉬운, 즉 TDD 기반의 유지보수성이 좋은 코드를 깨끗한 코드라 정의한다.
- 마이클 페더스는 주의 깊게 작성한 코드를 깨끗한 코드라 정의한다.(레거시 코드 활용 전략 책 참고)
- 론 제프리스는 조금 구체적이다.
- 모든 테스트를 통과하는 코드
- 중복이 없는 코드
- 시스템 내 모든 설계 아이디어 표현
- 클래스, 메서드, 함수 등을 최대한 줄인 코드
- 워드 커닝햄은 깨끗한 코드를 '누군가 해석했을 때 짐작했던 기능을 그대로 수행'하는 코드 (비록, 작업을 멈춘 코드를 나중에 확인하게 되더라도)라고 정의한다.
그러면 '클린코드'에서 말하는 깨끗한 코드란?
매우 당연하게도. 깨끗한 변수 이름, 깨끗한 함수, 깨끗한 클래스를 만드는 방법을 익히고 감각적으로 활용하는 것.
프로그래머는 저자이며, 독자이다. 코드를 짤 때는 자신은 저자이며, 이 저자의 노력을 보고 판단을 내릴 독자가 있다는 사실을 강조하며, 읽기 쉬운 코드란, 짜기 쉬운 코드라고도 한다.
'학습일지' 카테고리의 다른 글
상속은 결합을 늘린다..? (0) | 2022.08.27 |
---|---|
RabbitMQ - @RabbitListener를 사용할 때 주의할 점 (0) | 2022.07.17 |
RabbitMQ -1- AMQP 0-9-1 프로토콜 (0) | 2022.05.19 |
암호 알고리즘 -1- 개요 (0) | 2022.05.10 |
CI/CD에 대해 알아보자 (0) | 2022.02.06 |