제목만 본다면 이 책을 잘 읽고 잘 이해하고 잘 따라한다면 왠지 코딩의 기술이 늘 것 만 같은 책이다. 늘 그렇듯 제목은 현실과 살짝 다르기도 하다.
아무튼 이책의 원서의 제목은 "게임 프로그래머를 위한 코딩 기술"이다.
비교적 얇은 두께에 그동안 읽었던 리뷰 책들에 비하면 비교적 짧은 시간에 읽은 축에 속한다. 내용도 그렇고 어렵지는 않아서 조금은 더 쉽게 읽힐 수 있었던 책이라고 생각을 한다.
책의 구성 및 특징
확실히 저자는 다양한 실전 경험과 또한 강의 경험을 가지고 있다는 것을 느낄 수 있었단. 주제를 풀어내는 방식 자체가 일단 마음에 든다. 책의 전체적인 구성은 읽기 좋은 코드를 작성하는 간단한 기술 부터 시작한다.
당연히 복잡한 논리의 중첩을 피해야 한다는 간단한 것에서 부터 시작하여 함수 및 클래스의 활용까지 두르 두르 살펴주고 있단. C++로 만들어진 게임 프로그래밍의 요소들을 주제로 설명하고 있기에 특히나 STL이 많이 언급되고 있다는 것도
주목할 부분이라고 생각이 든다.
게임 코드로 알아보고 있다고 해서 게임 전체를 기대해서는 안된다. 게임의 일부분을 이루는 코드를 저자가 말하는 효과적인 작성 방법으로 대체하는 기법들을 다루고 있는 것이기 때문이다. 이렇게 앞쪽에서는 읽기 좋은 코드 즉 논리의 중첩등을 피하는 등의 방법을 써서 효과적인 코드를 만드는 방법을 설명하고 있고(그것이 물론 시간 복잡도 측면에서의 절대적인 개선 이것은 아니다.) 뒷쪽으로 갈 수 록 객체 지향적인 것에 대한 언급을 더 많이 해주고 있다.
또한 마지막으로 갈 수 록 이 책이 객체지향 설계를 언급하고 있는 책인지라는 생각이 들 정도로 객체지향 클래스 설계 및 패턴에 관한 이야기 들이 너무 많이 언급이 되고 있다. 물론 이것도 코딩의 기술이라면 할 말 없다.
책의 마지막 챕터는 소스 코드 품질 측정을 위한 기본적인 수치들과 프로그램을 이용한 방법들을 소개해주고 있다. 이 부분은 처음 접해본 것이라서 기존의 빅오 표기법을 통한 분석에만 익숙했었는데 매트릭스를 측정한 코드의 분석 은또 다른 느낌으로 다가왔다.
다음 그림은 책에서 언급한 sourcemonitor 을 이용해 분석해본 짧은 코드이다. 나름 멋있는 분석을 내놓았지만…
결론
코드의 간결화 혹은 읽기 쉬운 코드의 중요성은 말할 필요가 없다. 이 것은 수업 시간에도 학생들에게 제발 나를 배려한 코드를 작성하고 제출해달라고 언급 하기도 하니까 말이야. 물론 숏 코딩을 즐기는 사람들도 많다. 언제나 그렇듯 중요한 것은 문제 해결을 위한 알고리즘 자체의 개선에 있는 것이다. 결국 그 과정에서 이러한 간결화나 읽기 쉬운 코드 그리고 클래스의 설계 및 패턴의 인식 등을 통한 것들이 병행이 된다면 훨씬 좋은 결과물들이 나올 것이라고 생각한다.
다시 한번 말하지만 알고리즘의 개선을 통한 시간 복잡도의 개선이 더 중요하다고 생각한다. 이 책에서 언급하고 있는 나머지 코딩의 기술들은 그것을 이루는 과정에서 나오는 과정에 지나지 않는다. 중요한 것은 역시나 알고리즘이다.
그러나 이 책은 알고리즘에 관한 책이 아니다.
책을 읽는 내내 (물론 C++ 이 기반이여서 그렇지만) STL에 대한 공부를 더 해야 겠다는 생각과 람다에 대한 공부를 해야 겠다는 생각을 할 수 밖에 없었다. 책에서 언급되는 것들이 그 이유기도 하지만 요즘은 저지 사이트의 다양한 문제들도 STL을 많이 사용하고 있기에
자 진짜로 결론을 내어보면
이 책은 논리의 간소화 혹은 나머지 다양한 기법 혹은 기술들을 통해 읽기 쉬우면서도 명확하고 복잡하지 않은 형태로 코드를 변경하는 기법을 통해 코딩의 효율성을 안내하고 있다. 또한 그 과정에서 클래스를 사용하면서 프로그래머가 가져야 하는 설계 기법에 대한 이야기들 그리고
자신이 작성한 프로그램의 분석(시간 복잡도 까지는 아님)을 통해 조금은 수치화된 형태로 자신의 프로그램을 다시 한번 바라볼 수 있도록 해주고 있다.
이것도 중요하지만 알고리즘 공부를 찬찬히 그리고 보다 중요한 문제를 해결할 수 있는 논리를 키우는 것이 더 중요하다고 생각을 하며 마쳐본다.
P. S 이 책에서 말하고 있는 다양한 노하우들을 책을 읽으면서 정리해본 것을 다시 적어보며 진짜 마친다..
-
의미를 전달할 수 있는 변수 이름을 붙여 주세요
-
매직 넘버에는 이름을 붙여주세요
-
복잡한 조건식은 함수화해주세요
-
계산식을 함수화해서 의미를 전달하세요.
-
사전 조건과 사후 조건은 assert로 명시해주세요.
-
사소한 중복도 티끌모아 태산이 되므로 줄여주세요.
-
조기 리턴을 활용해 주세요.
-
if 조건문을 작고 단순하게 만들어주세요.
-
자료구조를 활용해서 if 조건문을 줄여보세요.
-
null을 체크하지 않아도 되는 방법을 생각해보세요.
-
STL 알고리즘 함수를 활용해 주세요.
-
검색 반복문을 분리해주세요.
-
반복문 내의 처리는 최소한으로 만들어 주세요.
-
반목분 내부에서는 1개의 처리만 수행하세요.
-
람다식을 사용해서 반복문을 일반화하세요.
-
case 내부는 함수화해주세요.
-
부정확한 상태를 assert로 확인해주세요.
-
상태에 따른 분기는 다형성을 사용해야 하는 신호에요.
-
1개의 함수에는 1개의 역할만 주세요
-
단순한 함수일수록 재사용하기 좋아요
-
복잡한 복합 조건은 피해주세요.
-
자연어처럼 읽을 수 있게 코드를 작성하세요.
-
조건 분기 블록 내부는 함수화해야 하는 후보랍니다.
-
1개의 반복문에는 1개의 함수만 사용해주세요.
-
반복문 블록 내부는 함수화 후보랍니다.
-
데이터 변환 부분은 함수화해주세요.
-
데이터 확인 부분은 함수화해주세요.
-
배열 랜덤 접근 부분을 함수화해주세요.
-
취약한 기본 자료형 배열을 사용하지 말아 주세요.
-
주석으로 말하지 말고 함수로 말하세요.
-
매개 변수가 너무 많다면 함수를 분할하라는 신호랍니다.
-
매개 변수가 너무 많다면 클래스화하라는 신호랍니다.
-
컴파일러의 최적화 기능을 활용하세요.
-
재사용만이 함수화의 장점이 아니랍니다.
-
기본 자료형을 최소한으로 만들어 주세요.
-
컨테이너 조작을 위한 전용 클래스를 만들어 사용하세요.
-
변수를 클래스화해서 의도를 명확하게 전달해주세요.
-
변수를 클래스화해서 제한을 해주세요.
-
부분을 작게 만들면 전체가 작아져요.
-
getter와 setter를 되도록 사용하지 마세요.
-
부모 자식 관계라도 private를 사용해주세요.
-
클래스의 멤버 변수는 최소한으로 만들어주세요.
-
소결합 클래스로 설계해주세요.
-
상속보다는 이양을 우선해주세요
-
상속과 추상 인터페이스 구현을 구별해주세요.
-
하나의 클래스에 하나의 책임만 맡겨주세요.
-
변하지 않는 부분과 변하는 부분을 구분해서 설계해주세요.
-
불필요하고 복잡한 것을 넣지 마세요.
-
구체적인 것이 아닌 추상적인 것에 의존하세요
-
직접적인 친구와만 놀고, 친구의 친구와는 놀지마세요.
-
Singletone 패턴을 남용하지 말아주세요.
-
무리하게 디자인 패턴을 적용하려 하지 말아주세요.
-
클래스의 역할과 책임에 관해서 생각해주세요.
-
1개의 클래스에 너무 많은 일을 주지 않게 설계하세요.
-
중재자를 사용해 의존 관계를 단순화하세요.
-
외부와의 인터페이스 부분을 클래스화하세요.
-
객체생성도 매우 중요한 역할이랍니다.
-
전용 클래스와 범용 클래스를 명확하게 구분해주세요.
-
책임을 제대로 이양해 주세요.
-
클래스의 추상도는 캡슐화에 영향을 줍니다.
-
항상 추상도 높은 인터페이스를 어떻게 생성할지 생각해보세요.
-
추상 인터페이스로 소결합을 유도하세요.
-
추상 인터페이스 대신에 std:function을 사용해 보세요.
-
객체가 처음부터 완전환 상태로 생성되게 해주세요.
-
실행 순서를 보장할 수 있게 설계해주세요.
-
생성자와 소멸자로 리소스를 관리해주세요.
-
구현 방법을 은폐하는 이름을 붙여 주세요.
-
문제 영역에는 What을 붙여주세요.
-
전문가가 될 수 있게 많은 것을 배우세요.
-