심층 강화학습 인 액션 - 기본 개념부터 파이썬 기반의 최신 알고리즘 구현까지 제이펍의 인공지능 시리즈 (I♥A.I.) 29
알렉스 짜이. 브랜던 브라운 지음, 류광 옮김 / 제이펍 / 2020년 11월
평점 :
장바구니담기


강화 학습(Reinforcement Learning)은 환경 안에서 에이전트가 현재의 상태를 인식하여 선택 가능한 행동들 중 보상을 최대화하는 행동을 선택하는 방법이다. 알파고 그 중에서도 특히 알파고 제로의 경우가 좋은 예제라 할 수 있다.

강화학습은 배울 것이 너무 많고 하나하나 난이도 끝판왕급의 지식들로 이루어져 있기에 배우기 어렵다. 수학과 기본 지식을 어느정도 통달하지 않고서는 원서나 논문 중심으로 지식을 학습한다는 것은 불가능에 가깝다.

결국 한글로 쓰여진 책들의 도움이 간절한데 안타깝게도 한글로 강화학습을 다루는 책은 매우 드물다. 강화학습을 익혀 나만의 알파고를 구현하고자 시중의 서적을 모두 구매하여 보유하고 있었는데 일부 훌륭한 책도 있으나 조금씩 아쉬운 부분도 있었다. 그런데 최근에 들어 반갑게 본 도서를 만날 수 있었다.

이 책의 큰 장점 중 하나로 국내 서적 중 유일하게 강화학습의 최신 연구 성과를 다룬다는 점을 들 수 있다. 6장에서는 CartPole에 유전 알고리즘을 적용하는 코드를 구현하고, 8장은 ICM(Intrinsic Curiosity Module, 내재적 호기심 모듈)을 다룬다. 심지어 10장에서는 주의 및 관계 모형을 적용하여 XAI를 시도하기까지 한다.

강화학습의 기본에 충실하기도 급급한 처지이지만 개인적으로 한단계 뛰어넘는 최신 성과들을 접해보기라도 하고 싶었는데 이 책이 가려운 구석을 긁어주어 얼마나 시원했는지 모른다. 아직 모든 것을 정확히 이해한다고 자신할 수는 없지만 유전 알고리즘을 구현하는데 크게 어렵지 않았기에 절반의 성과는 거둔셈이라 스스로 위안을 삼고 있다. 보다 새로운 기법에의 접근을 가능하게 해준 이 책에 매우 고마움을 느낀다.

수학을 열심히 공부했고 좋아하지만 고수라고 감히 말할 수는 없는 입장에서 그나마 최신기술의 맛을 볼 수 있었던 이유는 이 책 덕분인데 책에 어떤 특징이 있어 가능했는지 설명하는 것이 이 책을 읽을 독자분들께 도움이 될 것이라 생각하여 간단히 정리해 본다.

우선 이 책은 제목에서 알 수 있듯 유명한 “in Action” 시리즈 중 하나이다. 인 액션 시리즈는 IT, AI 영역을 가리지 않고 대부분 양서들로써 일단 구현을 할 수 있는 역량을 키워주는데 매우 적합한 책이다.

이런 특징때문에 독자 각자의 처지에 따라 책의 호불호가 갈릴 수는 있겠지만 기본적으로 이 책을 읽어본 독자라면 양서에 가깝다는 판단에는 대부분 동의할 것으로 생각한다.

만약 새로운 것을 창조해야 하는 연구자라면 이 책은 조금 부족할 것이다. 연구자가 아니라 잘은 모르겠지만 이 책에는 수식이 많이 등장하지만 여타 전공 서적에 비하면 수식이 적은 편이다.

대신 연구보다는 구현을 목적으로 하는 엔지니어라면, 또 빠른 시간내에 구현을 필요로 한다면 이 책은 가뭄의 단비보다 소중한 책이다. 지금 내 처지가 그렇다. 언제까지 강화학습의 기본 지식만 학습하거나 처음부터 수식을 들여다보기에는 너무 많은 시간이 필요하다. 개인적인 목표는 스스로 알파고를 구현하는데 있기에 필요 이상의 기초 지식을 원하지는 않는다.

이 책은 인 액션 시리즈 답게 하나씩 따라하다보면 구현을 통해 내부 메커니즘을 이해할 수 있는 구조로 되어 있어 구현 실력을 끌어올리는데 큰 도움이 되었다.

그렇다고 수학없이 코드로만 구성된 책도 아니다. 코드는 수학과 메커니즘을 이해하기 위한 의사소통 수단으로 쓰였을 뿐 그 자체가 목적이 되지는 않는다. 책에서도 언급하기를 수학 없이 강화학습을 익히는 것은 마치 부실공사에 가까운 기초가 허약한 상태에서 예제 코드를 흉내내는 이상의 의미를 부여하기 어렵다는 식으로 무의미함을 밝힌다. 개인적으로도 수학을 배제한 책이 얼마나 훌륭할까라는 생각이 들어 언젠가 부터는 수식이 등장하지 않으면 즐겨보지 않게 되었다.

그렇다면 이 책은 수식이 존재하는데 어떻게 수식을 이해시키고 구현 능력을 향상시켜 주는 것일까? 저자의 전달력도 한 몫 했겠지만 무엇보다도 큰 도움이 되었던 몇가지 독특한 방식이 있었기에 구체적으로 소개해보려 한다.


  • 난이도와 타임라인의 방향 일치
    이게 무슨 말인가 하면 강화학습의 최초 기원으로 거슬러 올라가 최신 기술에 이르기 까지 시간 순으로 설명하는 방식을 취하고 있다는 의미이다. 먼저 간단한 개념을 소개하고, 문제를 마주치며, 해결책을 고민하고, 해법을 고안하며, 시험하고, 개선하다가 형식화하고, 수학 공식 등으로 정리하는 순서를 지킨다.

    대부분의 기술 서적은 거꾸로 현재의 기술을 정의, 소개하고 필요한 경우에만 과거의 히스토리를 잠깐 언급하기에 기억력외에 우리 두뇌 능력을 활용하기 어렵게 구성되어 있는데, 저자는 통찰력 있게 그 부분의 맹점을 해소하고자 노력하였다. 그 흐름 속에서 자연스럽게 구체화된 예시를 종종 만날 수 있기에 이해하기 너무 편하다는 느낌을 받을 수 있었다.


  • 수식과 의사코드
    먼저 예시를 통해 살펴보자. 아래 그림은 Q 학습 알고리즘의 갱신 규칙에 대한 수식인데 처음 이 수식을 만났을때의 황당함을 떠올리면 이런 친절한 책이 또 있나 싶을 정도다.Q학습

    먼저 해당 수식을 소개하기 전에 충분히 개념과 줄글로 설명을 한 후, 수식이 등장하면 위 사진이 보여주듯 각 애매모호한 기호를 하나씩 설명해준다. 그럼에도 이해 못할 경우를 대비하여 의사코드로 구현해보고, 이에 대한 설명으로 이해의 쐐기를 박는다.

    그래도 부족할 것 같은 부분에는 Python 코드로 설명을 한다. 아래 그림은 기대 보상에 근거하여 최선의 동작을 선택하는 방법을 수식, 의사코드, Python 코드로 표현한 예제이다.동작

    이러한 장점 때문에 구현에는 자신이 있는데 수식에 자신이 없는 사람이라면 이 책이 제 격이라 할 수 있다.


  • 끈 그림(String Diagram)
    이 역시 예시로 먼저 설명하는 것이 빠를 듯 하다.끈그림

    기존 강화학습 서적들을 보면 강화학습의 시작에는 늘 이와 같은 그림이 등장한다. 그런데 자세히 보면 약간 다르다는 것을 알 수 있다. 선(끈)에는 화살표가 있고 주로 동사에 해당하는 부분이 기술되어 있고, 네모 박스 안에는 명사에 해당하는 부분이 기술되어 있다.

    상태와 동작을 명확히 나눠줌으로써 명확한 이해를 돕는다. 강화학습의 기본 메커니즘이 복잡해질수록 비슷한 용어가 무수히 쏟아진다. 상태 공간, 동작 공간, 상태 가치, 동작 가치, 정책 함수, Q 함수, Q 학습, 심층 Q 신경망 등 이 용어들을 명확하게 이해하지 못하면 강화학습 메커니즘을 이해하는 것이 불가능한데 끈 그림의 적절한 역할 분리가 내게는 큰 도움이 되었다. 그동안 애매모호했던 개념들이 확실해지면서 구현하는데 애로사항이 크게 줄어들었다.


  • OpenAI의 Gym
    최근 GPT-3로 화제를 모았던 OpenAI에서는 강화학습을 위한 기막힌 환경을 제공하는데 이를 Gym이라 한다. 링크에 접속해보면 지원하는 환경들이 나오는데 기본적인 알고리즘부터, 아타리, 로봇제어 문제와 같은 다양한 유형의 환경들이 제공된다.

    강화학습을 연구하는 입장에서 이를 적용할 게임을 만들라고 한다면 그 자체로 비효율적인 또 하나의 과제가 주어지는 셈인데 이런 환경이 제공됨으로써 부수적인 것들은 걷어치우고 강화학습 구현에만 집중 할 수 있다.

    본 도서는 아래 사진과 같이 다양한 형태로 Gym을 효율적으로 사용한다. 첫번째 그림은 ICM을 적용한 슈퍼마리오 예제이고, 두번째 그림은 분포 DQN을 적용한 아타리 예제이다.슈퍼마리오
    아타리


위와 같이 본 도서에는 학습 능률을 높혀주는 다양한 장치들이 소개되어 있다. 더불어 관련 논문을 집대성 한 후 구현 우선 중심으로 취사선택하여 완급을 조절하고 있기에 참 잘 만들어진 책이라는 생각을 했다.

개인적으로 바둑을 즐겨했고 그 안에 숨은 미묘한 감이 정량적으로 계산될 수 있다는 희망을 갖고 있었기에 이를 확인하고자 나만의 알파고를 만들기 위해 꾸준히 노력해 왔다. 여담으로 알파고를 만드는 일에 관심이 있다면 아래 리뷰들을 참고하면 된다. 이 책들 또한 알파고 뿐만 아니라 강화학습을 실전적으로 배우는 데 많은 도움이 되는 양서들이다.

이 책 덕분에 나만의 알파고 구현에 한 걸음 더 가까이 다가갈 수 있게 되었다.

더불어 번역의 질도 우수하다. 역자가 번역의 매끄러움을 위해 곳곳에 노력한 티가 보인다. 다만 일반적으로 흔히 쓰이지 않는 단어로 번역된 경우도 보인다.

예를 들면 learning rate는 보통 학습율로 번역이 되곤 하는데 본 도서에는 학습 속도라는 명칭으로 번역을 했다. 이런 부분들 때문에 때로는 생소한 느낌이 들긴 하지만 어차피 원어가 아닌 이상 보다 명확한 해석이 가능하다면 잠시 다른 시각으로 바라봄으로써 되려 전달력이 향상될 수 있는 장점도 있다.

다중 슬롯 머신을 굳이 여러 팔 강도라는 표현으로 번역한 것도 재미있는데 이런 큰 차이가 있는 부분은 역주로 따로 번역의 주를 달아놓았기에 전체적으로 이해하는데 무리는 없었다. 일반적인 서술 문구는 번역의 품질이 훌륭했다고 본다.

정리하자면 본 도서는 논문의 이해 혹은 구현을 목표로 하는 이에게 가장 적합한 책이라는 생각이 든다. 물론 초보 연구자들 또한 연구에 앞서 구현을 해보는 것이 깊은 이해에 도움이 될 것이다. 마찬가지로 고급의 문을 열고 더 높은 곳으로 나아가려는 이들에게도 이 책이 최신 기술의 입문서 역할을 충분히 수행할 수 있을 것이라 생각한다. 특히, 강화학습에 어려움을 겪는 이에게 강력히 추천하고 싶다.




댓글(0) 먼댓글(0) 좋아요(2)
좋아요
공유하기 북마크하기찜하기 thankstoThanksTo
 
 
 
파이썬으로 배우는 게임 개발 실전편 - 장애물 피하기, 닷잇 액션, 맵 에티터, 탄막 슈팅, 3D 카 레이싱, 게임 런처 등을 만들며 배운다! 파이썬으로 배우는 게임 개발
히로세 츠요시 지음, 김연수 옮김 / 제이펍 / 2020년 11월
평점 :
절판


본 도서는 파이썬을 활용하여 게임을 개발하는 방법을 다루는 도서로, 입문편에 이어 2번째 도서인 실전편이다. 입문편과 유사한 개요 및 장점은 생략했으니 아래 입문편 리뷰를 참고하시기 바란다.

입문편과의 차이점은 다음과 같다.

  • Python을 어느정도 알고 있어야 한다.
  • 입문편을 익혔다면 1, 3 ~ 5장은 건너 뛰어도 된다.
  • 고난이도(?) 수학이 등장하기 시작한다. (특히 삼각함수)
  • 3차원이 세계에 발을 내딛는다.(유사 3D를 구현)
  • 작지만 효과 넘치는 디테일한 Tip들을 얻을 수 있다.
  • 상용 게임에 가까운 완성도를 추구한다.(런쳐 개발 등)

입문편 리뷰에서 다 언급하지 못한 장점도 몇가지 추가할까 한다.

  • Python을 선택한 것은 신의 한수다. 실전과 취미의 적절한 경계선이라 생각한다. 이 책 본문에도 등장하는 슈팅게임 만들기와 비교해 보면, 대학시절 슈팅게임을 만들어보면서 미사일이 느려서 인라인 어셈과 C++을 사용했던 기억을 떠올리면 난이도도, 코드량도 10배는 향상된 느낌이다.

  • 구성도 내용만큼이나 뛰어나다.

    • 덕후스럽지만 2분의 여성 교수님과 조교님이 진행을 잘 이끄신다.
    • 초반 책의 활용법이 맵핵같이 책을 체계적으로 이해할 수 있도록 도와준다.
    • 특히, 각 장마다 등장하는 컬럼 파트를 빼놓을 수 없는데 게임 개발에 큰 도움이 되는 실전 꿀팁들이 등장한다. 예를 들면 Pycharm과 같은 보다 뛰어난 IDE 활용법, 조이스틱 및 게임패드와의 연동법, 게임 개발 비하인드 스토리, 컴퓨터 게임 인공지능 등이 담겨있다.Pycharm_24p

책은 크게 2개의 파트로 나뉘는데, 타임라인 순으로 배웠던 흔적들을 기록해 보았다.

  • 프롤로그에서 PyGame까지(1 ~ 5장)
    • 입문편과 마찬가지로 초반부에는 Tkinter 모듈을 활용하여 거의 모든 게임에서 활용하는 기본 스킬을 학습한다. 정리해보면 아래와 같다.
      • after() 함수를 이용한 실시간 처리 구현
      • bind() 함수로 이벤트 처리
      • 배경 스크롤 : 움직이며 배경이 변하기 시작한다.
      • 애니메이션 효과 : 캐릭터 움직이기
      • 2차원 List 활용법 : 맵 데이터, 배경 처리
      • 인덱스와 타이머를 활용한 진행흐름 관리

      더불어 실전편답게 아래와 같은 몇가지 기본 기능이 추가되어 소개된다.

      • 바닥(들어갈 수 있는 장소)과 벽(들어갈 수 없는 장소)의 판정 방법
      • 히트체크 : 물체가 접촉했는지 판정하는 방법 (탄환에 맞았는지, 아이템을 주웠는지 등)히트체크_33p
      • 삼각함수 활용법 : 다양한 도형이나 선을 그리는데 활용
    • 기초지식을 배운 후 본격적으로 닷-잇(Dot-Eat) 게임을 만든다. 닷-잇이란 팩맨과 같은 몬스터를 피하며 닷을 먹는 게임이다. 여기서는 “아슬아슬 펭귄 미로”라는 게임을 만든다.닷잇_64p

    앞에서 배운 기본 기술을 활용한다.

    • 미로 맵 데이터
    • 실시간 처리
    • 캐릭터 애니메이션 처리 등의 기술

    추가로 위에서 배우진 않았지만 입문편에서 다룬 스킬도 활용한다.

    • 점수 계산법
    • 적 등장 및 처리

    메인 요소는 아니지만 아래와 같은 완성도를 높히기 위한 세세한 Tip들도 언급되어 있는데 일반 개발 서적에서는 보기 힘든 저자의 오랜 경험에서 묻어나온 일종의 편법(?)들이 흥미로웠다. 짧은 코드로도 다양한 효과를 대신할 수 있기 때문이다.

    • root 연산을 피해 속도를 높이거나 수학적 테크닉을 활용하는 방법
    • 캐릭터를 부드럽게 움직이는 법
    • 타이틀이나 엔딩화면 제작 등

    초반에 다루지 않았거나 입문편에서도 소개되지 않은 새로운 기법들은 다음과 같다.

    • 남은 수명 적용하기 : 기체 수, 체력, 시간 기준
    • 다양한 스테이지 만들기
    • 맵 에디터의 계층화

    • 본격적으로 PyGame을 소개한다. 앞서 배운 Tkinter와 달리 PyGame을 활용하면 몇가지 밑바닥 구현을 안해도 된다. 기본적으로 고속 처리가 가능해지고, 물체 간 겹치는 부분에 대한 처리가 필요없으며, 기본적으로 제공하는 API들이 간결하고 사용하기 편하다. 여기에선 Tkinter 기반에서 벗어나 이미지를 그리거나 상태를 변경시키거나 키-인을 다뤄보며 새롭게 익혀야 할 기능들을 살펴본다.

  • 실전시작! 슈팅게임과 카레이싱
    지금까지와는 차원이 다른 완성도 높은 게임들을 만들어본다. 슈팅 게임의 경우 삼각함수의 활용, 카레이싱 게임의 경우 유사 3D 구현이 대표적으로 배울 수 있는 핵심 기술이다.

    • 슈팅 게임
      미사일을 발사해 적 비행기를 격추시키는 게임을 만들어 본다.
      슈팅_197p

      새롭게 배울 수 있는 기법은 다음과 같다.

      • PyGame으로 고속 스크롤 구현
      • 플레이어 기체 움직이기
      • 탄환 처리 : 여러발 발사하기, 탄막 펼치기(2장에서 배웠던 삼각함수가 여기서 쓰인다.)
      • 적 기체 처리 : 격추 기능, 히트체크, 폭발 연출, 적 종류 늘리기, 보스 만들기
      • 사운드 등 멀티미디어 요소 고품질화
    • 카 레이싱 게임
      유사 3D 화면을 활용하여 자동차 경주하는 게임을 만든다.카레이싱_338p

      새롭게 배울 수 있는 기술들은 아래와 같다.

      • 3D CG의 개념과 유사 3D : 원근법과 도로 그리기, 오르막과 내리막(역시 2장의 삼각함수가 쓰인다.)
      • 도로를 보다 실감나게 : 커브처리, 차선, 주변건물, 다양한 차 뒷모습 표현 등
      • 컴퓨터 경쟁 차량 만들기 및 히트 체크
      • 흐름처리(타이머와 인덱스), 랩 타임(1바퀴 도는데 걸린 시간) 처리, 차종 선택 기능 등
    • Game Center 208X
      앞서 만든 3개의 게임을 골라 실행할 수 있는 기능인 런처(Launcher)를 만든다. 지금까지 만든 것들을 대통합하면서 상용 게임과 맞먹는 완성도를 추구하기 위해 고군분투하는 저자의 노력에 감탄했다.런쳐_498p


입문편과 실전편을 모두 읽고 구현하는데 1달이 넘는 시간이 걸렸다. 직장을 다니기에 퇴근 후 저녁 시간만을 활용했다. Python을 데이터 분석 목적으로 몇년 간 자주 활용했으며, 15년 가까이 다른 프로그래밍 언어를 만들어왔고, 대학때는 작은 게임을 만들어 본 경험이 있는 상태임을 감안할 때 결코 적지 않은 시간이 소요된 셈이다.

만약 이 책의 뛰어난 구성상의 도움이 없었다면, Python이 아닌 다른 언어였다면(C++이나 어셈 같은) 예제 하나를 만드는데만 1달의 시간이 걸렸을 것 같다. 그만큼 이 책은 방대한 내용을 아주 쉽고 생산성 높게 만드는 방법을 전수해 준다.

게임 관련 서적을 많이 통달하진 못했지만 이렇게 읽기 편하고 만들기 쉽고 짧은 시간내에 거의 모든 것을 만들 수 있게 해주는 책이 또 있을까?

개인적으로 정말 재미있는 단계는 지금, 즉, 책을 다 익히고 난 시점 이후이다. 기본기를 익혔으니 게임을 만들고 즐기며 떠올랐던 스스로의 아이디어를 녹이는 일을 시작할 수 있게 되었으니 말이다.

입문편 리뷰에서 소개했듯이 게임 업계의 꿈을 가지고 있거나, 게임 개발을 취미로 익히고 싶거나, Python으로 알고리즘 구현에 익숙해지고 싶은 분들에게 여러번 추천하고 싶다.



댓글(0) 먼댓글(0) 좋아요(2)
좋아요
공유하기 북마크하기찜하기 thankstoThanksTo
 
 
 
파이썬으로 배우는 게임 개발 입문편 - 퀴즈, 주사위, 제비 뽑기, 미로, 진단 애플리케이션, 블록 낙하 퍼즐, RPG 등을 만들며 배운다! 파이썬으로 배우는 게임 개발
히로세 츠요시 지음, 김연수 옮김 / 제이펍 / 2020년 10월
평점 :
장바구니담기


본 도서는 파이썬을 활용하여 게임을 개발하는 방법을 다룬다. 내용이 방대하기에 굵직한 장점을 먼저 소개하고 타임라인 순으로 읽으며 느꼈던 점들을 소개하는 방식으로 리뷰하려 한다.

  • 살을 버리고 뼈를 취하는 구성
    게임 서적을 읽다 지치는 가장 큰 이유는 방대한 소스코드의 무덤 속에서 길을 잃고 숲을 헤매는 구성 때문일 것이다. 이 책은 핵심 완급조절을 분명히 하는 장점이 있다.

    언리얼이나 유니티 라이브러리는 구현에 상당한 편리함을 가져다 주지만 가려진 밑바닥을 보기 힘들기에 배우고 나면 뭔가 붕 뜬 느낌이 있다. 잘 모르고 가져다 쓰기만 한 라이브러리에 때문에 자신감도 떨어지고 흥미도 떨어진다.

    Tkinter 모듈을 활용하여 밑바닥도 건드려 보고, PyGame 모듈로 군더더기를 날려버리고 핵심에 집중해 보는 등의 완급조절이 일품이었다. 자세한 내용은 아래 세부 설명에서 소개하겠다.

  • 저자의 경력과 실력
    저자는 남코, 닌텐도, 코나미에서 25년 간 게임을 개발, 기획한 실력자이다. 교육기관에서 강의도 담당하고 있어 전달력도 상당하다.

  • 게임을 만들고 싶게 하는 구성
    30 ~ 40 대 아재들은 일본이 주도했던 PC 게임의 추억을 잊지 못할 것이다. PC, 프로그래밍, 게임에 관심이 많았던 아재들이라면 한 번쯤 스스로 게임을 만들어 보겠다는 야망(?)도 있었을 것이다. 이 책은 밑바닥까지 게임을 구현해보기에 자신감을 키워주며 스스로 게임을 만들고 싶다는 욕구를 한 껏 불러 일으킨다.

  • 디테일한 구성과 가독성
    내용 자체로도 훌륭한 책인데 독자들의 가독성을 높혀주는 구성상의 완성도가 일품이라는 장점도 무시할 수 없다. 약간 덕후스럽지만 애니메이션의 두 여자 캐릭터가 학습을 도와주며, 부록편엔 게임 동아리도 등장하여 게임하듯 배울 수 있다.

    각 장마다 등장하는 컬럼에 대한 재미도 쏠쏠하다. 게임 업계에 대한 정보도 가득하고, 저자가 현업에서 부딪혔던 유용한 Tip들도 종종 소개되고 있다.컬럼_59p

책이 어떻게 구성되어있는지 보다 세부적으로 설명하기 위해 실습 예제를 따라해보며 시간의 흐름대로 느꼈던 점들을 아래와 같이 정리해 보았다. 책을 크게 3개의 파트로 나누어 설명해 보겠다.


  • 게임 개발 개요와 파이썬의 기본(1 ~ 4장)
    • 먼저 게임 업계는 어떻게 수익을 얻는지, 크리에이터에는 어떤 직군이 있는지, 게임의 종류와 어떻게 하면 게임 프로그래머로서의 커리어를 쌓을 수 있는지 설명한다. 게임 개발 능력을 키우기 위한 좋은 자극제가 되며 저자의 경험을 녹였기에 이해하기 쉬웠다.

    • 파이썬, 통합 개발 환경(IDLE)을 설치하고 가장 중요한 변수, 리스트, 반복문, 조건문, 함수, import에 대해 간단히 실습해본다. 고작 이 정도 학습하고 뒤에 게임들을 개발할 수 있을까 의구심이 들었는데 오히려 난잡하지 않게 게임 개발에 필요한 사항만 잘 추렸다는 생각을 했다. 게임 개발에 장점이 있다면 시각적 피드백일텐데 Tkinter, PyGame 모듈로 눈으로 보면서 구현하기에 기본에만 충실하면 나머지는 경험과 시간의 몫이 될 수도 있겠다는 생각이 들었다.


  • CUI / GUI / Tkinter(5 ~ 9장)
    • 먼저 CUI(문자열 기반 인터페이스) 게임을 만들어 본다. 복잡한 그래픽 요소를 일단 제쳐두고 게임 기획의 본질을 먼저 익히면서 Python에 친숙해지게 만들어준다. 주사위를 던져 나오는 랜덤한 숫자로 컴퓨터와 대결하여 누가 먼저 결승점에 도착하는지 내기하는 예제도 있는데 게임을 만들 때 필요한 기본 감각을 가장 잘 설명하는 예제라 할 수 있다. 부수적인 것보다는 본질에 대한 감을 익히는데 중요한 과정이라 생각한다.

    • 이어 Tkinter를 활용한 GUI(그래픽 기반 인터페이스) 개발에 돌입한다. Python에서 GUI 기반 프로그래밍에 가장 흔히 사용하는 Tkinter 모듈을 주로 사용한다. PyGame은 게임에 특화된 라이브러리인지라 처음부터 PyGame을 활용하면 라이브러리를 가져다 쓰기만 할 뿐 밑바닥을 구현하기 어렵기에 Tkinter를 활용하여 기본기를 다지는 구성이 기본에 충실하는데 좋은 구성이라는 생각했다.

    • Tkinter의 기본 활용법을 익힌다. 제비뽑기 프로그램을 만들어보며 라벨, 버튼, 캔버스, 텍스트, 멀티 텍스트 필드, 체크박스, 메시지 박스 등을 그리는 방법을 배운다. Visual Studio에서는 주로 버튼을 끌어와 윈도우에 배치하는데 이와 달리 Java 진영과 유사하게 SDK 방식의 직접 코딩으로 컴포넌트를 배치하는 차이점이 있다. 물론 결과는 동일하다. 모든 실습을 마치면 아래와 같은 진단 게임을 완성할 수 있다.진단게임_136p

    • 여기까지의 실습으로는 사실 GUI를 활용한 일반 프로그래밍이지 게임 프로그래밍이라고 하긴 어렵다. 8장에서 게임다운 게임을 처음으로 만들게 되는데 기술적으로 아래와 같은 기법을 실습한다.

      • after() 함수를 이용한 실시간 처리 구현
      • bind() 함수로 이벤트 처리
      • 2차원 리스트를 활용한 미로 배경 정의 실습을 마치면 아래와 같은 미로 게임을 완성할 수 있다.미로게임_168p

  • PyGame / RPG 만들기 / OOP / 부록
    • 밑바닥 구현은 학습에는 도움되지만 노가다가 심하기에 보다 본격적인 게임 구현의 요소에 집중하고자 PyGame을 활용하기 시작한다.

    • 마우스 이벤트 처리, 위치 데이터와 같은 상태 정보 관리, 낙하 알고리즘 구현, 점수 산출을 위한 평가 알고리즘을 구현해보며 블록 낙하 게임을 완성한다.

    • 우습게 보일지 몰라도 처음으로 게임다운 게임이 등장했다. 실제로 즐겨보면 꽤 재밌기까지 하다. 대학 때 동아리에서 슈팅 게임을 만들어 본 적이 있는데 그때 머리 싸매고 간신히 구현했던 요소들이 하나씩 다 등장하고 있다. 핵심 알고리즘에서 평가에 이르기 까지 게임 구현에 가장 중요한 요소들을 구현하고 있어 이 예제가 가장 뼈대 예제라는 생각을 했다. 요즘엔 AI에 푹빠져 강화학습을 학습 중인데 상태, 에이전트, 환경 등의 정보로 활용할만한 기능이 모두 구현되어 있기에 더욱 기본이 탄탄한 예제라는 생각을 할 수 있었다.블록낙하_213p

    • Tkinter에서 PyGame 기반의 구현에 익숙해지도록 PyGame을 살펴본다. Tkinter 실습때와 마찬가지로 이미지도 그려보고 키, 마우스 이벤트 처리도 실습해본다. 더불어 Tkinter에서 취약했던 사운드 출력 같은 멀티미디어 요소를 처리하는 기능도 다룬다.

    • 드디어 이 책의 하이라이트이자 게임의 꽃이라 할 수 있는 RPG를 구현한다. 개인적으로 기본적인 게임은 학창시절에 구현해 본적이 있었기에 그 단계를 뛰어넘는 첫 도전이었으며 가장 흥미로운 장이었다. 블록 낙하게임 기본 기능에서 추가된 RPG 고유의 기능은 아래와 같다.
      • 미로를 던전으로 바꾸기
      • 배경 스크롤 : 움직이며 배경이 변하기 시작한다.
      • 이동신/전투신 제작 및 상호 전환
      • 턴방식 프로그래밍RPG
        11 ~ 12장은 그간 배운 지식을 바탕으로 최대한 스스로 구현해보려고 노력하면 더 좋을 것이다. 그 후 본문의 소스코드와 비교하는 과정을 거친다면 더욱 빠르고 확실한 이해가 가능해진다. 개인적으로 이 방식을 통해 스스로 복잡하게 생각했던 기능들을 게임 모듈에서 일종의 편법(?)으로 얼마나 간단히 처리하는지 아이디어를 얻을 수 있어 놀랐고, 더불어 Python으로 알고리즘을 구현하는데 친숙해지는 소득을 얻을 수 있었다.
    • 마무리로 OOP의 개념을 다룬다. GameCharacter라는 클래스를 상속받은 검사, 닌자 등의 예제를 예로 들며 객체지향의 개념을 다루고 있다. 부록에서는 3가지 업그레이드 예제가 더 등장한다. 복습용으로 좋은 예제들이다.

RPG 게임까지 구현하고 나면 상당한 자신감이 생긴다. 구현하는 과정에서 스스로의 아이디어가 떠오르기도 하고 이를 녹여보는 과정에서 자연스럽게 구현 능력이 향상된다. 아들과 재미있게 게임해보고 싶어 읽은 책인데 소기의 목적을 달성하고 있어 즐겁다.

자신감이 충만해져서일까? 보다 풍부한 예제가 소개되었으면 하는 아쉬움이 있었는데 다행히도 이 책은 시리즈로 구성되어 있다. 이 책은 입문편으로 보다 심화 과정인 실전편의 책이 한 권 더 있어 안도감이 들었다. 리뷰를 쓰는 시점에 실전편의 책을 익히고 있는 중이기에 조만간 실전편 리뷰도 올릴 생각이다.

게임 업계의 꿈을 가지고 있는 이라면 반드시 읽어야 할 필독서이다. 이 책을 통해 게임 전반의 핵심에 해당하는 뼈대 감각을 익히고 업계에 발을 딛는 것과 숲을 보지 못하는 안목으로 이정표 없이 구현에만 급급한 것은 분명 하늘과 땅 차이다.

더불어 게임을 취미로 익히고 싶거나 Python으로 알고리즘 구현에 익숙해지고 싶은 사람에게도 강력히 추천하고 싶다. 스스로의 창의성을 구현하는 방법을 배운다는 것은 배움 이상으로 인생에 쏠쏠한 행복을 가져다 준다.


댓글(0) 먼댓글(0) 좋아요(1)
좋아요
공유하기 북마크하기찜하기 thankstoThanksTo
 
 
 
그림으로 공부하는 IT 인프라 구조 - 개정판 그림으로 공부하는 시리즈
야마자키 야스시 외 지음, 김완섭 옮김, 오다 케이지 감수 / 제이펍 / 2020년 12월
평점 :
장바구니담기


  • PC는 뜯어봐서 알겠는데, 서버 내부는 어떻게 생겼지?
    서버내부

    이 책은 일단 우리가 평소했던 궁금증을 해소시켜 주는 것에서 시작한다. 인프라 구조를 다루는 책들이 대체로 딱딱하고 어려울 수 밖에 없는 이유는 무엇일까?

    • 우리가 아는 지식에서 출발하지 않는다는 것
    • 극히 편협적인 해당 주제만 다뤄 전체 그림이 그려지지 않는다는 것
      크게 두가지 이유에서 비롯된다고 생각한다.

    그런데 이 책은 달랐다.

    독자가 어떻게 하면 복잡하고 거대한 인프라 구조를 쉽게 이해할 수 있게 도울 수 있을지 저자의 진정성 있는 고민이 느껴지는 대목이 많다. 위 질문과 그림은 누구나 한 번쯤 호기심을 가져봤을 법한 질문인데 우리가 아는 PC의 상식을 통해 서버를 설명하려는 접근법을 잘 활용하고 있다.

    우리가 알고 있던 지식에서 출발하여 미지의 영역을 안내하고자 하는 시도가 기본 바탕이 된다. 더불어 모듈별로 친숙하고 만화같은 그림(캡쳐한 그림들을 아래에 차례차례 소개할 예정이다), 가장 쉬운 예시(편의점 고객과 직원수 간 병목 현상)등의 장치는 더욱 이해력을 높혀준다.

    2장을 살펴보면 우리가 궁금했던 서버실 내부의 전경이나 서버랙 구성도 및 실제 부품들의 사진이 등장하기에 PC와의 기능을 대조해보며 서버나 장비에 친숙해질 수 있다.


  • 가장 많이 쓰는 시스템 구조는?
    이 책의 메인 주제는 3계층형 시스템이다. 우리가 오늘날 가장 많이 사용하는 IT 인프라는 대부분 웹 서비스를 위해 구성되어있고, 이를 지탱하는 가장 흔하고 널리 쓰이는 인프라 구조가 바로 3계층형 시스템으로 웹서버 - AP서버 - DB서버로 구성되어 있다.

    3계층1
    3계층2

    위 2장의 그림이 이 책에서 말하고자 하는 핵심주제이다. 처음에는 약간 까다로울 수 있으나 천천히 살펴보면 이 책을 읽지 않아도 대부분 이해할 수 있을 만큼 도식화가 잘 되어 있다.

    만약 이 책의 핵심인 3 ~ 5장을 읽은 후 그림을 다시 보게되면 매우 쉽게 이해될 것이다. 3장은 3계층형 시스템의 개요를 중심으로 인프라의 전체적인 특성과 3계층 시스템의 현위치, 그리고 가상화 등의 기술 트렌드를 조망한다.

    4장은 직렬/병렬, 동기/비동기, 큐, 베타적제어, 상태, 데이터 구조, 탐색 알고리즘 등의 인프라에서 활용하는 IT 기본지식을 다룬다.

    5장에서는 이들을 응용한 이론을 살펴보는데 캐시, 인터럽트, 폴링, IO, 저널링, 복제, 마스터-워커, 압축, 패러티 검출 등의 기술을 다룬다.


  • 서버, 인프라 담당자를 위한 책인가?
    아니다. 개인적으로 이 책은 프로그래머에게 더 적합한 책이라는 생각이 든다. 클라우드, 도커, 쿠버네티스 기반의 데브옵스 환경에서도 프로그래머는 여전히 인프라에서 자유롭지 못하다는 생각이 든다.

    특히 성능 이슈로 들어가면 더욱 그렇다. 현재 구성된 인프라의 기본을 이해하고 있어야 더욱 고성능의 애플리케이션을 개발할 수 있음은 물론 DB서버와 구조를 알아야 데이터 처리를 어떻게 효율적으로 다룰지 어떤 프로그램과 API를 활용해야 할지 정확한 판단이 가능하다.

    프로젝트를 총괄하는 아키텍트나 관리자에게는 필수 지식이다. 더불어 1장에는 인프라 아키텍처를 집약, 분할, 수직, 수평, 지리 등의 유형별로 살펴보고 있어 관리자에게 도움이 된다.

    전체 환경이나 인프라를 직접적으로 알 필요가 없는 말단 개발자라 할지라도 적어도 왜 이 언어를 사용하게 되었고 어떤 특성의 프로토콜이나 API를 활용하는지 이해하고 숙련도를 높이는데 학습적인 측면에서 능률을 높힐 수 있을 것이라 생각한다.

    3계층3

    위 그림은 3계층 시스템의 축소판인데 웹 개발자 특히 백엔드 개발자가 Httpd 프로세스에서 자유로울 수 있을까? 마찬가지로 AP서버에 해당하는 각종 WAS에서 스레드 지식을 모르고는 비즈니스 로직 등의 개발이 어렵다. 마찬가지로 DB서버의 SGA를 이해하지 못하면 쿼리 튜닝에서 자유롭지 못하다.

    그저 국소적으로 이해하고 끝날 것인지 내부 인프라의 전체 그림을 이해하고 이에 종속적인 부분이 정상적으로 수행되도록 고려하며 개발할 것인지의 차이는 아마도 연봉과 커리어 앞날에 큰 영향을 끼칠 것이라 생각한다.

    한 단계 더 깊이 들어가면 탐색 알고리즘이 등장한다. 이 책이 인프라 서적임에도 불구하고 오히려 인프라 담당자가 더 어려울 수도 있는 부분도 상당 부분 존재한다.

    DB에서 SQL을 수행하며 인덱스를 찾아가는 과정이 인프라 내부까지 연결하여 설명한다.B트리

    이 예시와 같이 이 책의 최고 장점은 조각난 분야별 지식들을 하나의 전체 그림으로 그려가는 과정이라 할 수 있겠다.

    인프라 담당자는 인프라를 지탱하는 IT 지식을 익히며 서비스 성능의 향상을 위한 최적의 인프라를 구성하는 노하우를 쌓을 수 있을 것이고, 마찬가지로 프로그래머도 내부 인프라에 대한 종속적인 지식의 이해를 바탕으로 고성능의 서비스를 제공하는 애플리케이션을 개발할 수 있을 것이다.

    개인적으로 15년 정도 여러 직장을 다니며 풀스택 개발자라고 할 수 있을만큼 여러 기술을 섭렵했는데 이 책을 통해 몰랐던 지식들을 보완하고 나니 인프라 구조 및 IT 서비스에 대한 전체적인 시야를 가질 수 있어 매우 만족스러웠다.


  • 네트워크, 무중단, 성능
    6장은 네트워크를 다룬다. 그저 네트워크의 이론 지식만 열거되었다면 또 무슨 소리인지 충분히 이해하지 못한 채 넘어갈 수 있겠으나 OSI 7계층을 중심으로 각 계층을 하나하나씩 뜯어본다. 뜯다보면 왜 프로그램 언어별로 소켓 통신을 위한 API들이 그런 형식으로 호출되고 설계되는지 쉽게 이해가 된다.네트워크

    7장은 무중단 및 이중화 구성에 대해 다룬다. 가용성을 최대한 확보하여 안정성을 유지하기 위한 구성을 꾀하는데 어느 요소 하나 빠짐없이 모두 한 눈에 정리할 수 있도록 연결되어 있어 매우 유익했다. 하나 하나의 가용성을 다루는 책은 많지만 전체를 조망하는 책은 찾기 힘들다.무중단

    마지막 8장은 성능을 다룬다. 응답, 처리량(Throughput), 병목현상의 개념을 정리한 후 병목 현상을 찾는 방법과 저자들의 실전 사례들이 공유된다.병목현상


다루는 내용이 너무도 방대하여 리뷰를 작성하기까지 많은 고민을 했다. 서두에 어떤 책인지 짧게 소개하고 싶었지만 책의 제목이 내용을 너무도 잘 대변하는데다가, 그림을 기반으로 한 전개로 구성되어 있어 글보다는 그림과 사례로 리뷰를 쓰는 것이 책의 특징을 가장 잘 살리는 방법이라 생각했다.

이 책은 이미 5년 전에 베스트셀러 반열에 올랐던 책이다. 난 그때로 꽤 감명깊게 읽었고 당시 IT의 전반적인 실용적인 눈을 키우는데 이 책으로부터 많은 도움을 받았다.

개정판에서 달라진 점은 이제 대세가 된 클라우드 기반의 지식이 대거 포함되었다는 점과 당시에 유행했으나 지금은 필요하지 않은 구닥다리 일부 설명이 삭제되었다는 점 정도이다. 디자인 측면의 변화도 반가웠는데 완전 풀컬러는 아니지만 구판과는 달리 가독성을 위한 색상 구분이 되고 있어 훨씬 읽기 편했다.

이 책은 인프라 담당자나 개발자는 물론 CEO, 마케팅 혹은 비즈니스를 담당하는 실무자까지 IT 직군에 종사하는 사람이라면 반드시 읽어봐야 할 책이다. 실전에서 IT 지식과 제품들이 어떻게 활용되고 엮이는지 거의 모두 다루고 있기 때문이다.




댓글(0) 먼댓글(0) 좋아요(1)
좋아요
공유하기 북마크하기찜하기 thankstoThanksTo
 
 
 
프로그래머를 위한 파이썬 - 실전 프로젝트로 배우는 소프트웨어 개발의 원리와 정석
데인 힐라드 지음, 황반석 옮김 / 제이펍 / 2020년 11월
평점 :
장바구니담기


Python의 아래와 같은 개념을 어느정도 알고 계시는지?

  • 설계
  • 관심사 분리, 추상화, 캡슐화
  • 성능
  • 테스트
  • 확장성, 상속, 느슨한 결합
  • 개념은 알고 있지만 믹신, 목업 등 Python에 특화된 용어 혹은 스타일
    제너레이터
    메시지

만약 위 개념들이 생소하거나, 들어는 봤지만 익숙치 않다면 이 책이 많은 도움이 될 것이다. 더불어 키워드를 통해 본 도서의 난이도에 대한 감도 어느정도 잡을 수 있을 것이다.

키워드에 해당하는 내용들을 아주 상세하게 깊숙히 다루는 것은 아니다. 약 250p 정도 되는 다소 가벼운 분량에 키워드별 핵심이 되는 중요한 개념 혹은 코드 몇가지를 개괄적으로 소개한다.

분량이 짧다고 해서 깊이가 결코 가벼운 것은 아니다. 저자의 오랜 실전 경험을 바탕으로 학습 시간 투자 대비 가장 효과적으로 지식을 얻을 수 있도록 구성되어 있다는 인상을 받았다. 즉, 실전에 활용할 수 있는 가성비 좋은 내용들을 한 눈에 조망할 수 있게 구성된 점이 큰 장점이다.

실전에 많은 시간이 투입되었으나 전체적인 프로젝트 숲이 보이지 않는 개발자에게는 이 책이 단시간 내 막혔던 부분을 뚫을 수 있게 도와줄 것이다. 또, 반대로 프로젝트 경험이 많고 이미 위 키워드를 능숙할 정도로 알고 있는 이에게는 깊이 측면에서 약간 부족할 수도 있다.

개인적으로 생각하는 이 책의 최고의 백미는 파트3에 해당하는 실전 프로젝트이다. 위에서 열거한 개념들을 어떻게 실전에 적용할지 한가지 일관된 좋은 예제를 개발한다. 바로 브라우저 즐겨찾기 내용을 등록, 관리할 수 있는 커맨드라인용 북마킹 애플리케이션 Bark이다.Bark깃허브

Bark 설계, 구현 단계를 오롯이 따라하는 것만으로도 프로젝트 한 사이클을 경험할 수 있으므로 충분히 가치가 있는 과정인데, 그보다 더 큰 장점은 이 프로젝트를 구현, 개선해 나가며 위에서 배운 관심사 분리, 추상화, 캡슐화, 인터페이스, 커맨드 패턴, 느슨한 결합 등을 적용하도록 구성되어 있다는 점이다.순환복잡도

일반적으로 설계에 대한 책은 각 관점별로 동떨어진 예제들이 열거되어 있어 실전에 돌입하면 메타지식 간 연결고리가 부실하여 바로 적용하기 어렵기 마련인데 저자는 그런 다른 책들의 비효율적인 부분들을 잘 이해하고 있다는 생각이 들었다. 독자들에게 자신과 같은 시행착오를 거치지 않도록 노력하고 있어 인상적이었다.

그 외 다른 파트의 내용은 다음과 같다.

  • 파트1 : 설계와 소프트웨어의 개요를 다루고 있어 가볍게 읽을 수 있다.
  • 파트2 : 맨 앞에서 소개한 주요 키워드들에 대한 개념의 핵심이 사례별로 잘 소개되고 있다.
  • 파트3 : 바로 위에서 언급했던 파트2 개념의 실전 적용 과정이다.
  • 파트4 : 개발자의 경력을 키우기 위한 조언 및 이후 학습 방향에 대한 조언이 담겨있다.

Python의 입문 과정을 마치고 중급 과정 혹은 실전에 돌입하는 이에게는 이 책이 매우 적합하다고 생각한다. 위에서 소개한 바와 같이 설계의 큰 그림을 정말 빠른 시간내에 익힐 수 있기 때문이다.

정리하자면 관심사 분리, 추상화, 캡슐화, 확장성, 상속, 느슨한 결합 등 뛰어난 설계를 위한 기본 개념부터 성능, 테스트, MVC패턴 등의 실전에 필요한 지식까지 즐겨찾기 관리 프로그램을 만들며 각각의 개념을 상호간에 유기적으로 연결해가며 익힐 수 있기에 효용성 측면에서 매우 높은 점수를 주고 싶은 책이다.




댓글(0) 먼댓글(0) 좋아요(0)
좋아요
공유하기 북마크하기찜하기 thankstoThanksTo