기획자 본인만큼 잡다한 블로그

greentec.egloos.com

포토로그


통계 위젯 (블랙)

126
124
89868

flag counter

Flag Counter


<코어 자바스크립트> - 정재남 지음 독서



얼마 전 자바스크립트에 대해서 유독 사람들이 오해를 많이 한다는 취지의 글을 본 적이 있다. 보통 프로그래밍 언어를 학습하는 데에는 시행착오를 포함한 일정 시간이 필요한데, 자바스크립트는 웹페이지 위에서 쉽게 동작하는 경험을 비교적 빠르게 얻을 수 있기 때문에 이 시행착오의 과정을 생략한 사람들이 나중에 자바스크립트의 어려움을 호소한다는 것이다.

자바스크립트는 쉬워보이지만 쉽지 않다. 다른 프로그래밍 언어 - 대표적으로 Java, C++ 같은 객체지향 언어 - 를 먼저 공부한 사람들은 자바스크립트에 대해서 '방언' 같다는 말을 하기도 한다. 자바스크립트는 언어가 따르고 있는 ECMAScript 표준이 발전하면서 현대적인 요소를 많이 도입했고 화살표 함수 같은 문법은 C#에서 수입하기도 했다. 하지만 자바스크립트의 기본 구성 요소 - object, prototype, this, 콜백 함수 등 - 는 변하지 않았고 이 개념에 익숙하지 않은 사람들에게는 학습 장벽이 된다. <자바스크립트 핵심 가이드>(원제는 Javascript: The Good Parts)를 쓴 더글라스 크락포드(Douglas Crockford)는 좋은 점만을 취하자고 했고, 카일 심슨(Kyle Simpson)은 시리즈에서 좋은 점만이 아닌 나쁜 점도 언어의 설계이며 잘 알고 쓰면 된다고 말한다.

이 책, <코어 자바스크립트>가 지향하는 방향은 더글라스 크락포드보다는 카일 심슨에 가깝다고 볼 수 있다. 자바스크립트를 구성하는 핵심 요소인 this, 콜백 함수, prototype, 클로저 등을 200 페이지의 짧은 분량으로 설명하고 있지만 그 내용이 만만치 않아서 예상보다 오랜 시간을 들여 읽어야 한다. 이 책을 읽기 위해 angular, react, vue 등의 라이브러리에 대한 학습은 필요하지 않다. 하지만 이 책의 저자가 그랬듯이 책에 나온 개념들을 깊게 탐구하며 현상의 원인을 파악하기 위해 예제 코드를 한 줄씩 차근차근 따라가봐야 한다. 책에서 그림을 적극적으로 사용해서 이해를 도운 것도 좋은 부분이었다.

애니팡4 - 4편까지 냈으면 인정해야 한다 게임기획

우리나라에서 하나의 게임 시리즈가 4편까지 나온 경우가 얼마나 될까? <창세기전4>(2016), <그날이오면4>(1994) 등 아주 옛날 게임까지 꼽아봐도 몇 편 없는 것을 보면 시리즈가 이만큼 길게 이어지는 것은 쉽지 않은 것 같다. 애니팡(2012)은 한국 모바일게임의 시초격인 게임으로 카카오톡 친구초대와 시너지를 내며 유례없는 흥행을 했으며, 애니팡2(2014), 애니팡3(2016)도 각각 괜찮은 성적을 거두었다(애니팡3에 대해서는 이 블로그의 다른 글에서 다룬 바 있다). 개발사인 선데이토즈는 애니팡 외에도 다른 IP로 3-match 퍼즐 게임을 여럿 냈지만 정식 넘버링을 갱신하는 4편은 3년 9개월만에 나오게 되었다.


그 시절 우리를 잠 못 들게 했던 애니팡


애니팡3을 해보고 선데이토즈의 애니팡 개발팀(아마 있지 않을까)의 개발력에 신뢰를 갖게 된 나는 주저없이 애니팡4를 다운받았다. <배틀그라운드>(2017)가 유행시키고 같은 장르 중에서는 닌텐도 스위치로 출시된 <테트리스99>(2019)에서 시도되었던 배틀로얄 장르를 도입했다는 점은 기대가 되었는데, 기대가 된 점은 배틀로얄 장르 그 자체가 아니라 애니팡3에서 느꼈던 것처럼 이 팀은 어떤 것을 만들 때 그 이유를 알고 만드는 것 같다는 기대가 되었기 때문이다. 이것의 반대되는 예로는 몇 년 전 <클래시 오브 클랜>(2012)의 클론 게임들이 범람하던 시기가 있었는데 정작 클래시 오브 클랜의 본질을 이해하고 베낀 게임은 별로 없었기 때문에 다들 금방 시장에서 사라져갔던 것을 들 수 있다. 배틀로얄 장르를 도입할 때도 이들은 이 장르를 도입할 때 원래 3-match 장르의 규칙과 충돌할 수 있는 부분을 어떻게 풀었을까 하는 것이 궁금했다.


배틀로얄 장르의 시초가 된 메가 히트작, 배틀그라운드


3-match 장르의 시초는 팝캡의 비쥬얼드(2001)라고 할 수 있는데 지금의 모바일 게임에서 완성된 것은 King의 캔디 크러시 사가(2012)이다. 여기서 현재까지 널리 쓰이고 있는 모바일 3-match 장르의 기본 문법이 도입되었다. 스테이지가 일렬로 이어진 맵, 성과에 따라 스테이지 당 3개까지 얻을 수 있는 별점, 맵과 별점에서 보이는 친구의 프로필과 그로 인한 경쟁심리 자극 등이다. 이 장치들은 사실상 하나가 되어 작동하는 이 장르의 코어로, 페이스북 소셜 게임의 전통에 따라 플레이어가 주로 친구들과의 경쟁을 통해(때로는 하트라는 이름으로 불리는 생명력을 주고받는 등 서로 도우며) 게임에 계속 몰입하게 한다.


캔디 크러시 사가에는 경쟁의 대상인 친구들이 존재한다


캔디 크러시 사가의 뒤를 이은 3-match 장르 게임들이 이 문법 요소들을 그대로 수용한 것은 장르의 코어를 해치지 않으려는 당연한 시도였다. 모바일 게임에는 보통 가로나 세로로 계속 스크롤할 수 있는 맵이든 다른 형태든 친구들의 현재 진행 상황을 손쉽게 확인할 수 있는 UI가 빠지지 않았다. 모바일 3-match 게임에서 경쟁은 필수 요소였고 그것은 주로 내가 아는 사람, 적어도 전화번호를 가지고 있는 사람과의 경쟁이었다.

배틀로얄을 도입한 애니팡4에서는 메인 모드가 배틀로얄이라는 것이 느껴진다. 배틀로얄의 경쟁상대는 보통 불특정 다수이며 많은 수의 적과 싸우기 때문에 플레이어들의 실력 격차가 희석되어 의외의 결과가 나올 수 있는 것-잘하는 사람도 어떤 게임에서는 빨리 질 수 있고, 못하는 사람도 어떤 게임에서는 좋은 성적을 거둘 수 있음-이다. 따라서 플레이의 결과를 좀 더 가볍게 받아들이게 되어 다시 플레이하고 싶게 한다. 이것이 이 장르의 코어다. 애니팡4는 20명이 한 게임을 플레이하며 서로 공격을 주고받는다.


최대 20명까지 한 게임에 들어올 수 있다


애니팡4에서 칭찬하고 싶은 점은 배틀로얄의 구현이 아니라 배틀로얄을 구현하면서 다른 부분을 덜어낸 것이다. 애니팡4에도 기존 3-match 장르처럼 스테이지가 이어지는 싱글 플레이가 존재하지만 여기에는 친구의 진행 상황을 확인할 수 있는 맵이라고 할 만한 것이 없다. 지금까지 10개가 넘는 3-match 게임을 만든 선데이토즈이기 때문에 분명히 여기에도 그 기능을 구현할 수 있었겠지만 본질에 집중하기 위해 뺀 것이라고 생각한다. 본질은 싱글플레이의 경쟁이 아니라 멀티플레이 배틀로얄에서의 경쟁이다.


맵이 없다. 우측 상단의 인스타그램에서는 내 진행 상황 정도만 확인 가능하다


낮아진 별점 기준도 마찬가지다. 캔디 크러시 사가에서는 어려운 스테이지에서 별 3개를 획득하는 것이 몹시 어렵다. 때문에 이미 클리어한 스테이지라도 나는 별이 1개인데 친구의 별이 3개라면 다시 돌아가서 플레이를 할 수 있는 계기가 되었다. 하지만 애니팡4에서는 스테이지를 깰 정도의 점수면 거의 별 3개를 얻을 수 있다. 별을 경쟁의 도구로 사용하지 않기 때문에 굳이 획득 기준을 어렵게 할 필요가 없는 것이다. 이것은 플레이어의 기분을 좋게 하기 위해 별을 퍼주는 것과는 다른 얘기다. 만약에 스테이지가 이어진 싱글 플레이 맵과 친구간의 경쟁을 주요 코어로 하는 3-match 게임에서 별점의 획득 기준을 낮게 해서 선심성으로 퍼준다면 이건 코어를 제대로 이해하지 못한 잘못된 디자인이 될 것이다.

싱글플레이는 경쟁의 도구로 쓰이지는 않지만 배틀로얄에서 적용되는 패시브 능력을 획득하는 데에 쓰인다. 이것은 다른 모바일 게임 히트작 <궁수의 전설>(2019)에서 레벨이 오를 때 올릴 수 있는 패시브 효과와 거의 동일한 UI로, 배틀로얄을 위해 싱글플레이를 지속할 이유를 만들어주게 된다. 그리고 싱글플레이는 결국 점점 어려워지기 때문에, 아무리 싱글플레이를 잘하는 유저라도 능력을 올리기는 점점 어려워지고 싱글플레이 10레벨을 깰 때마다 능력 1레벨을 올릴 수 있기 때문에 전체적인 성장이 비슷하게 수렴하게 되는 효과가 있다.


싱글플레이 10레벨 돌파마다 한번씩 능력을 올릴 수 있다


요약하면 애니팡4에서는 배틀로얄의 본질에 집중하기 위해 기존 3-match 장르의 전통에서 과감하게 덜어낸 부분이 인상적이었다. 그리고 싱글플레이를 배틀로얄의 이유로 활용하기 위해 싱글플레이에서 특정 구간을 통과할 때마다 패시브 능력치를 올릴 수 있게 한 부분도 좋았다. 나도 옛날에 카카오에 모바일 게임을 냈었는데 그때 조금만 더 성공했더라면 2편이 나오지 않았을까? 하는 생각이 들며, 애니팡 3편과 4편에서 우리나라에서 보기 힘든 "이게 무엇인지 알고 하는 디자인"을 하는 것을 보며, 역시 최고의 경험은 출시로 하는 것이라는 생각이 든다. 오늘 한 대화방에서 들은 말처럼, 실패를 다른 실패로 리셋하지 않고, 실패의 결과를 다음번에 성공으로 바꿀 수 있었다면 지금 한국 게임은 훨씬 많은 성공을 그려내지 않았을까.


로그라이크 게임 제작 - 스탯에 대하여 (2), 명중과 회피 게임기획

명중은 공격이 상대방을 맞출 확률에 관계하는 수치다. 이 수치가 높으면 안정적으로 적을 공격할 수 있지만 낮으면 손도 못 대고 사망하는 일이 발생하기도 한다. 스탯을 올린 결과가 시각적으로 즉시 드러나기 때문에 성장을 체감시켜주기에 좋은 수치이기도 하다.


명중률에 관한 가장 유명한 밈 중 하나. 이렇게 총을 가까이 대도 명중률이 65% (XCOM)


이 글에서는 디아블로2, 디아블로3, 디아블로3 확장팩을 거치며 명중률에 영향을 주는 스탯이 변화해 온 과정과 개인적인 경험을 써보기로 한다.
먼저 디아블로2에는 명중률에 영향을 주는 스탯으로 공격 등급(Attack Rating)이 있었다. 이 수치는 민첩(Dexterity) 스탯으로 올릴 수 있었고, 매직 아이템에 붙은 옵션으로 직접 올릴 수도 있었다. 디아블로2의 공격 등급은 다음과 같은 공식으로 공격의 명중률을 결정했다.[1]

Chance To Hit = 200% * {AR / (AR + DR)} * {Alvl / (Alvl + Dlvl)}

Abbreviations:
AR = Attacker's Attack Rating
DR = Defender's Defense rating
Alvl = Attacker's level
Dlvl = Defender's level

공격 등급의 문제는 직관적이지 않다는 것이었다. 명중률에 영향을 주는 수치는 내 공격 등급, 상대의 방어 등급(Defense Rating), 내 레벨, 상대의 레벨의 4개였기 때문에 공격 등급을 1 올렸을 때 명중률이 얼마나 오를지 가늠하기가 힘들었다. 다른 스탯과 마찬가지로 많이 올리면 좋은 게 아닌가? 라고 생각할 수도 있지만 문제는 다른 스탯과 공격 등급을 비교해서 어느 것을 고를지 선택할 때 발생했다. 플레이어가 공격 등급 스탯의 상대적 가치를 판단하기 힘들고 명중률은 일정 확률 이상 올라가면 상승이 잘 체감되지 않기 때문에 공격 등급은 다른 스탯과 비교해서 우선순위가 낮았다.
디아블로3 오리지널에서는 공격 등급이 삭제되고 공격 명중률은 100%가 되었다. 대신에 민첩 스탯을 올리면 회피 확률 수치가 올라가는 것으로 명중 관련 수치를 일원화했다. 민첩 스탯이 올라감에 따라 회피율은 계단식으로 올라갔다. 당연히 민첩 스탯이 높아질수록 회피율이 올라가는 속도는 낮아졌다. 대략 아래와 같은 공식이었다.[2]

if (Dexterity <= 100)
 DodgeChance = Dexterity * 0.001;
else if (Dexterity <= 500)
 DodgeChance = (Dexterity - 100) * 0.00025 + 0.1;
else if (Dexterity <= 1000)
 DodgeChance = (Dexterity - 500) * 0.0002 + 0.2;
else if (Dexterity <= 8000)
 DodgeChance = (Dexterity - 1000) * 0.0001 + 0.3;
else
 DodgeChance = 1;

여기서 문제는 민첩 스탯이 8000을 넘어갈 때 회피율(DodgeChance)이 1, 즉 100%가 되는 것이었다. 그리고 민첩이 주는 회피 외에 다른 스킬이나 아이템이 주는 회피 보너스도 존재했기 때문에 실제로는 민첩이 8000이 되지 않아도 회피율이 매우 높아지는 결과를 낳았다. 하지만 이렇게 회피율이 높아도 몬스터의 대미지 자체가 매우 높았기 때문에 60레벨 캐릭터라도 몬스터의 공격 한두 방에 사망할 수도 있었다. 따라서 민첩을 높일 때 대미지도 같이 올라가는 직업인 수도사와 악마사냥꾼은 회피 세팅을 맞추기 위해 특정 아이템 세팅과 스킬 세팅만 유지해야 했고 게임이 단조로워졌다. 특히 수도사는 근접 공격 캐릭터였기 때문에 회피 세팅이 되어있지 않으면 살아남을 수 없었다.
이 문제를 수정하기 위해 디아블로3의 확장팩인 영혼의 수확자(Reaper of Soul)에서는 전반적인 밸런스 조정과 함께 민첩의 회피 보너스를 삭제하고 민첩 1 당 방어도(Armor)를 1 올려주는 것으로 바뀌었다.[3] 힘(Strength) 스탯 1도 방어도 1을 올리고 있었기 때문에 이제 힘과 민첩 둘 중 어떤 것을 올리건 방어도가 올라가게 된 것이다. 참고로 방어도는 대미지를 분수함수 공식으로 일정 수치만큼 깎아준다. (공격과 방어도에 대해서는 다음 글에서 다룰 예정이다) 회피 보너스는 스킬 등 다른 곳에서만 얻을 수 있게 되었다. 패치 결과 계속 회피하다가 한두 번의 공격에 사망하던 예전의 패턴에서 여러 번의 공격을 받으며 캐릭터가 언제쯤 죽을지 알 수 있도록 바뀌어서 좀 더 예측 가능한 게임이 되었다.
개인 경험에서 나온 다른 사례도 있다. 내가 신입 기획자이던 시절, 서비스하고 있던 게임에서 이벤트 보스를 추가하게 되었다. 당시 유저들의 최고 레벨은 40이었고 이벤트 보스의 레벨은 45로 들어갔다. 그런데 문제는 레벨 차이에 따라 명중률에 차등이 주어지는 것이었다. 정확히 기억은 나지 않지만 대략 아래와 같은 표였다.

레벨 차이명중률 디버프
1-20%
2-40%
3-60%
4-80%
5+-100%


이 공식은 내가 신입으로 오기 전 작업하던 다른 기획자가 만들고 나간 것이었는데, 이 공식대로라면 유저들은 이벤트 보스를 열심히 때리기만 하고 화면 가득한 MISS 메시지를 보며 실제로 보스를 잡을 수는 없었다.


"이상해씨 등 긁는 데 천 원"이라던 어떤 뽑기방의 대형 이상해씨처럼 보스는 눈에 보이지만 잡을 수 없는 존재가 되었다.



당연히 이 공식을 고치자고 했지만 앞 사람이 남기고 간 것이어서 안된다는 답변만이 돌아올 뿐이었다. 결국 이 보스와 이 공식은 그대로 서비스에 들어갔고 며칠 만에 유저들의 원성에 긴급하게 다시 패치되어 5레벨 차이날 때의 명중률 디버프는 -100%에서 -30%로 바뀌었다.
무적인 느낌을 주는 것과 실제로 무적인 것은 다르다. D&D의 d20(20면체) 주사위로 명중 굴림을 판정할 때 1이 나오면 무조건 실패, 20이 나오면 무조건 성공하는 규칙이 있다. 아주 강한 캐릭터라도 5% 확률로 실패할 수 있고, 아주 약한 캐릭터라도 5% 확률로 무조건 공격을 성공시킬 수 있는 것이다. 그리스 신화의 아킬레스도 발목에 약점이 있었고 북유럽 신화에서 빛의 신 발두르는 연약한 겨우살이 가지에 죽었다. 무적보다는 무적이 아닌 것이 좀 더 현실같고, 게임적으로도 더 재미있다고 생각한다.


참고자료
[1] Diablo II Attack Rating: https://diablo.gamepedia.com/Attack_Rating_(Diablo_II)
[2] Diablo III 확장팩에서 회피율은 어떻게 계산되는가: https://gaming.stackexchange.com/questions/164575/how-is-dodge-chance-calculated-in-diablo-3-reaper-of-souls?noredirect=1
[3] Diablo III 2.1.0 PTR 패치 프리뷰: https://us.diablo3.com/en/blog/14244559/

<게임으로 익히는 코딩 알고리즘> - 김영기 지음 독서




탑코더, 리트코드, 해커랭크 등 수많은 알고리즘 공부&경쟁 사이트들이 있지만 알고리즘 문제 자체에 게임의 형식을 차용한 곳은 많지 않다. 메이저한 곳 중에서는 본서에서 다루고 있는 코딩 게임 사이트가 있다. 여기에 올라오는 퍼즐 중 사이트에서 직접 제공하는 것들은 모두 그래픽을 씌운 게임의 형태이다. 쉬운 퍼즐도 화려한 그래픽으로 무장하고 있기 때문에 처음 알고리즘을 공부하는 사람이라면 큰 노력없이 자신이 짠 코드에 그래픽이 덧붙여져서 작동하는 것을 감상할 수 있기 때문에 좀 더 흥미를 가질 수 있다.

나는 이 사이트에 예전부터 가입해 있었지만, 이 책을 받고 나서 다시 들어가보니 예전 기록은 13레벨에서 멈춰 있었다. 책에서 제공하는 예제를 풀고, 사이트가 아닌 유저들이 직접 만든 커뮤니티 퍼즐을 몇 개 더 풀고 나니 15레벨이 되었다. 사이트에서 제공하는 퍼즐은 Easy, Medium, Hard, Very Hard의 난이도로 구분되어 있다. 책에서는 이 중 Easy 3문제, Medium 8문제, Hard 2문제를 다룬다. 언어로는 python을 사용하고, 독자가 노력 없이 답만 베껴서 문제를 푸는 것을 막기 위해 답의 전문을 제공하지는 않는다. Easy와 Medium 문제들을 다룰 때 저자는 문제와 함께 이 문제를 풀기 위한 프로그래밍 기본 개념을 자세히 설명한다. 마치 프로그래밍 입문서라고 해도 손색이 없을 정도이고 책도 컬러이기 때문에 초심자에게 추천할만하다. 예전의 나처럼 기초가 부족한데 의지도 부족한 사람이라면 이 책을 집어들고 Easy 장의 코드를 하나하나 따라하면서 문제도 풀고 사이트의 레벨도 올릴 수 있겠다. 게이미피케이션(Gamification)은 언제나 보통 이상을 해내는 훌륭한 도구이다.

책의 내용에 비해 제목이 좀 아쉬운데 처럼 책에서 다루는 사이트를 직접 제목에 명시해도 좋았을 것 같지만, 독자를 한정하는 효과도 있었을 것 같다. codingame이 top coder만큼 유명한 사이트는 아니기 때문에 홍보에 큰 도움이 되지 않을 것이라고 생각했을지도 모르겠다.

<케라스 창시자에게 배우는 딥러닝> - 프랑소와 숄레 지음, 박해선 옮김 독서





현재 세계에서 가장 많이 쓰이는 딥러닝 프레임워크는 무엇일까? Jeff Hale 이라는 사람이 구글 검색 통계, 아마존 출간 부수, 논문, github repository 수 등 다양한 팩터를 종합해서 정리한 <Deep Learning Framework Power Scores 2018>에 따르면 1위는 텐서플로우, 2위는 케라스이다. 그런데 1위인 텐서플로우는 구글이라는 거대한 기업에서 만들었지만 2위인 케라스를 처음에 시작한 사람은 단 한 명, 프랑소와 숄레라는 사람이었다. 프랑소와 숄레는 케라스를 만든 뒤에 구글 브레인에 들어갔지만 케라스는 그와 상관없이 텐서플로우 팀에서 먼저 텐서플로우 1.x 버전의 차세대 상위 API로 사용하기로 결정되었고, 텐서플로우 2.0이 된 지금은 케라스의 문법을 텐서플로우 안에서 사용하는 tf.keras가 상위 API를 호출하는 표준으로 정리되었다. 사실상 1위와 2위는 하나로, 딥러닝 프레임워크는 어느 정도 통일이 된 셈이고 그 중심에는 케라스의 창시자인 프랑소와 숄레가 있는 것이다.

이 책은 그런 프랑소와 숄레가 쓴 책, <Deep Learning with Python>의 한글 번역본이다. 번역본 제목도 눈길을 끄는데 케라스는 텐서플로우만큼이나 유명하기 때문에 이 라이브러리의 창시자가 쓴 책이라고 하면 관심이 갈 수 밖에 없을 것이다. 나도 이 책을 봐야겠다고 생각만 하던 중에 길벗출판사의 독자 이벤트에 당첨이 되어서 책을 받아볼 수가 있었다. 476페이지의 두꺼운 책이었지만 받자마자 5일 만에 독파할만큼 집중해서 읽었다.

초기의 딥러닝 라이브러리들 - theano, Tensorflow 등은 일반 연구자가 접근하기 어려운 점들이 있었다. theano와 Tensorflow는 둘 다 그래프 구조를 사용했다. 그래프 구조가 문제가 되는 것은 선(先) 정의 후(後) 평가 구조이기 때문이다. 처음에 딥러닝 연산을 수행하는 기본 단위인 텐서가 어떻게 계산되는지에 대한 그래프 구조를 정의하고, 나중에 계산할 때 한번에 각 그래프의 노드에 있는 값들을 확인할 수 있는 구조이다. 즉 정의만 했을 때는 텐서에 어떤 값이 들어갈지 알 수가 없는 구조이다. 이 밖에도 라이브러리가 일반 연구자들이 보기에는 불편한 점이 많았고, 그래서 theano에는 lasagne, Tensorflow에도 여러 개의 추상화 라이브러리가 생겨서 사용자가 좀 더 쉽게 접근할 수 있도록 하는 시도들이 있었다. 그 중에서도 케라스가 독특했던 점은 theano의 추상화 라이브러리에서 멈추지 않고 tensorflow, CNTK 등 여러 개의 딥러닝 라이브러리에서 하나의 코드로 같은 동작을 하도록 하는 범용 추상화 라이브러리를 만들려고 했다는 점이었다.

이 대담한 도전은 멋지게 성공했다. theano는 개발이 중단되었지만 Tensorflow는 세계에서 가장 널리 쓰이는 딥러닝 라이브러리가 되었고 케라스는 Tensorflow의 추상화 표준이 되었다. Microsoft의 CNTK도 2.0에서 케라스를 지원하는 기능을 추가했다.

케라스의 장점은 짧고 간결하면서 이해하기 쉬운 코드이다. 이에 대해서는 내가 예전에 발표했던 <텐서플로우 첫걸음>의 6페이지를 보면 코드 길이의 차이를 직관적으로 확인할 수 있다.


왼쪽과 오른쪽은 같은 일을 하는 코드이다. Tensorflow 1.x 기준



저자인 프랑소와 숄레는 책에서 코드를 중심으로 설명하려고 노력했고, 필요한 경우가 아니면 수학을 쓰지 않으려 했다고 말한다. 프로그래머에게는 몇 줄의 코드가 복잡한 수식보다 이해하기 쉽기 때문이라고 그 이유를 설명하는데, 공감이 가는 말이었다. 프레임워크를 만들어본 사람답게 다양한 데이터와 논문, 연구자들과의 교류 내용을 곁들이지만, 방대한 내용에 대해서 깔끔하고 분명하게 설명하려고 노력한다. 마치 저자가 만든 케라스처럼 말이다.

이 책에서 또 한가지 주목할 점은 페이지의 하단을 빼곡하게 채우고 있는 역자의 역주이다. 역주에는 독자들이 생소하게 느낄 수 있고 저자는 그냥 지나친 코드에 대한 설명부터, 저자가 언급한 내용에 대한 실제 논문, 독자가 알아둬야 할 사항들 등이 꼼꼼하게 적혀 있다. 역주를 읽는 것만으로도 내용 이해가 훨씬 잘 되는 것을 느꼈고 반대로 역주가 없었다면 내용 이해가 쉽지 않았을 것 같다는 생각이 들었다. 또 번역도 억지로 한글 표기를 고집하지 않고 영어를 써야 할 곳에는 영어를 적절하게 사용하고 뜻이 중복될 수 있는 단어에 대해서도 분명하게 설명하고 넘어가는 등 최근 본 번역서 중 제일 좋은 책이었다. 역자는 개인 블로그를 운영하면서 오탈자와 코드도 계속 업데이트하기 때문에 책을 읽은 사람은 방문해보면 좋을 것 같다.

여러 가지로 최근 읽은 딥러닝 책 중 가장 만족도가 높은 책이었다. 3, 4년 전과는 다르게 딥러닝 책이 시장에 정말 많이 나오고 있는데, 이 분야를 처음 공부하는 사람이라면 기초적인 내용을 공부한 다음에는 이 책으로 중급 정도의 실력을 쌓아보는 것이 좋을 것 같다.


1 2 3 4 5 6 7 8 9 10 다음

애드센스