책의 주된 목적은 고품질의 코드를 작성할 수 있도록 돕는 것
코드 설계를 배우는 이유
이 책은 디자인 패턴뿐만 아니라 객체지향 프로그래밍 패러다임, 설계 원리, 코딩 규칙, 리팩 터링, 기술 까지도 다루고 있음
데이터 구조와 알고리즘이 효율적인 코드를 작성할 때 필요한 것이라면, 코드 설계에 대한 지식은 확장성과 가독성이 높아 유지 보수가 용이한 고품질의 코드를 작성할 때 필요함
고품질의 코드 작성
누구든 나쁜 코드를 작성하고 싶은 엔지니어는 없다. 어떤 코드가 고품질의 코드인지 알지 못하기 때문이다.
그 결과 많은 엔지니어가 오랫동안 코드를 작성했음에도 코딩 스킬은 향상되지 않았고, 그들의 코드는 “사용과 실행이 가능하지만 더 이상 개선되지 않는” 코드가 되었다. 많은 소프트웨어 엔지니어가 수년간 반복 작업을 해왔지만, 대부분 그들의 스킬은 처음 코딩을 시작할 때와 별반 다르지 않다.
높은 품질의 코드를 작성할 수 있도록 스킬을 향상하려면 코드 설계에 대한 이론적인 지식을 갖춰야한다.
여기서 말하는 지식이란 선지자로부터 이어온 지혜의 결정체이며 문제를 해결하는 도구다. 기본적인 이론 지식이 없으면 강력한 “무기와 장비”를 갖추지 못하고 게임을 하는 꼴이다.
복잡한 코드 개발 다루기
소프트웨어를 개발할 때 만나는 어려움에는 두 가지가 있다.
- 매우 높은 수준의 기술이 필요한 경우
- 코드의 양이 반드시 많은 것은 아니지만, 자율 주행이나 비디오 인식, 높은 성능을 가지는 메시지 대기열과 같이 상대적으로 고도의 기술이 필요한 경우
- 개발자를 많이 투입하여 알고리즘을 완성할 수 있는 형편도 아님
- 높은 수준의 기술이나 최신 기술이 필요하지는 않지만 복잡한 비즈니스를 갖춘 대규모 프로젝트로, 단순하지만 코드의 양이 매우 많은 물류 시스템, 금융 시스템, 대규모 ERP 시스템 등의 개발에 많은 사람이 참여하는 경우
대부분 소프트웨어 엔지니어는 간단한 hello world 프로그램을 작성할 수 있으며 기본적으로 수천 줄의 코드를 유지 보수 할 수 있다. 하지만 코드가 수만에서 수십만 줄, 심지어 수백만 줄로 늘어나면 복잡성은 기하급수적으로 증가한다.
이 경우 프로그램이 올바르게 작동하고 실행될 뿐만 아니라 작성된 코드를 이해하고 유지 보수할 수 있어야 한다.
이때 코드 설계와 관련된 지식이 활용될 여지가 있으며, 이 기술이 결국 소프트웨어 엔지니어의 손에서 진정한 “드래곤 슬레이어”로서 빛을 발하게 된다.
대부분 엔지니어는 프로그래밍 언어, 개발 도구 그리고 프레임워크에 익숙하며 프레임워크를 사용하여 비즈니스 요구 사항에 따라 코드를 채우는 것이 일반적인 업무다.
단순히 기능을 구현하고 사용 가능한 코드를 만드는 것은 복잡하지 않을 수 있지만, 사용하기 쉬운 코드를 작성하는 것은 쉽지 않다.
우리는 개발하면서 다음과 같은 질문을 생각해본 적이 있는가?
- 계층화와 하위 모듈화 방법은 무엇인가?
- 클래스를 어떻게 나누는 것이 좋은가?
- 각 클래스에는 어떤 속성과 메서드가 있는가?
- 클래스 간의 상호 작용을 설계하는 방법은 무엇인가?
- 상속이나 연관을 사용하는 것이 옳은가?
- 인터페이스나 추상 클래스를 사용하는 것이 좋은가?
- 결합도가 높은 코드와 낮은 코드는 무엇인가?
- 디커플링을 달성하는 방법은 무엇인가?
- 싱글턴 패턴이나 정적 메서드를 사용하는 것이 옳은가?
- 객체를 생성할 때 팩터리 패턴을 사용하는 것이 옳은가?
- 가독성을 유지하면서 확장성을 향상하기 위해 디자인 패턴을 도입하는 방법은 무엇인가?
프로그래머의 기본 능력
프로그래머는 기술의 넓이와 깊이를 모두 가지고 있어야 함
프레임워크와 미들웨어를 배울 때 시간을 들여 관련 원리를 공부하고 소스 코드를 읽으면서, 단순하게 그것들의 기능을 사용하는 데 그치지 않고 심층적인 이해를 얻으려고 한다.
소스코드를 읽으면서 종종 그것이 어떤 의미인지 이해하지 못하는 경우가 있다. 사실 이런 문제의 원인은 간단하다.
코드를 완벽하게 이해하기 위해 필요한 기본적인 기술적 소양과 능력이 부족하기 때문이다.
코드 설계와 관련된 지식은 오픈소스 프로젝트를 쉽게 이해할 수 있을 뿐만 아니라 코드의 기술적 본질을 이해하는 데 도움이 되는 프로그램 개발의 기본 기술이라고 할 수 있다.