[작성자:] guygigas

  • [오라일리] 함수형 프로그래밍 with 자바

    “한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.”

    자바를 처음 접한 게 대학 2학년 때였던 것 같다. 아주 핫한 언어였고, C/C++ 언어의 단점을 극복한 언어라면서 홍보도 많이 했었다. 컴파일러 성능을 개선하기 위한 논문이 쏟아졌고, 한 번에 처리할 인자 수를 늘리면서 성능이 대폭 개선됐다는 얘기도 들려왔다.

    실제 취직을 해서 웹 프로그래밍을 하게 되었을 때도 핫했던 Servlet/JSP 기술을 도입해서 만들어내느라 바빴다. 그만큼 자바는 산업계에 큰 파장을 일으켰다.

    그런데 어느 순간부터 자바가 자바스럽지 않게 되면서, 수많은 산업계의 요구사항이 빗발치면서 자바가 변했다. 그 변화를 따라잡는 게 쉽지 않아졌다. 심지어 선에서 오라클로 주도권이 바뀌기도 했다.

    잠깐 한 눈을 팔고 돌아와보니 내가 알던 자바는 완전 구닥다리처럼 변해 있었다. JVM에서 돌아가는 다른 언어를 익히고 나니, 자바 코딩이 너무 힘들어졌다. 스칼라는 객지지향 언어와 함수형 언어의 장점을 혼합한 언어였고, 러닝 커브가 거셌지만, 한 번 익히고 나니 그 간결함과 대폭 줄어든 코드량에 열광했다. 다만, val과 var의 차이점과, 과거 자바스럽게 코딩하던 버릇 때문에 적응이 어려웠다. 하지만 그 지점을 통과하고 나니 val만 쓰는 방식이 너무 편하다. 문제가 발생해도 값을 인식하지 못한 지점에서 바꾸는 상황이 없어지니 디버깅 하기도 수월해졌다.

    그런데 회사에서 스칼라를 버리고 자바로 가게 됐다. 그나마 최신 트렌드로 무장한 코틀린으로 가고자 했지만, 자바를 익힌 개발자들의 저항이 거셌다. 결국 현실적인 이유 때문에 코틀린으로 가지 못하고 자바로 회귀했다.

    가만 생각해보면, 자바가 과연 문제일까? 자바가 문제가 아니라, 자바식으로 코드를 작성하는 게 부담스럽다. 무엇 때문에? 막대한 코드량 때문이다. 최신 트렌드가 반영된 언어들과 자바로 같은 로직을 작성해보면, 그 양이 현격히 차이가 난다. 그래서 코드를 읽는 게 부담스럽기도 하고 로직이 먼저 보이는 게 아니라, 로직을 짜기 위해 필요한 코드들이 방해했다.

    뭔가 해결책이 필요했다. 그것이 자바 8 이후로 전격 도입된 함수형 프로그래밍 지원이었다. 처음에는 그런 코드들도 너무 군더더기가 많다고 생각했는데, 이 책을 읽으면서 이유를 알게 됐다. 바로 하위 호환성 때문이었다는 것. 새로 도입하는 거라면 과감하게, 최신 트렌드처럼, 간결하게 만들어도 됐을 텐데, 하위 호환 가능하도록 만들다보니 어쩔 수 없이 취해야 했던 모양새다.

    도입은 했는데, 이걸 내가 제대로 알고 쓰는 게 맞을까? 놓치고 있는 건 얼마나 될까? 사실 이걸 반영하기 위해 상용 IDE가 제안하는 도구들을 활용해서 조금씩 반영하곤 있었다. 하지만 이게 맞는 걸까? 그런 고민으로 부담감이 날로 커지는 가운데, 이 책을 만나게 됐다.

    정말 내가 필요로 했던 책이다. 그런데 단순히 개념만 설명하는 책은 아니었다. PART 01 함수형 기초를 읽을 때까지는 매우 고통스러웠다. 익숙하지 않은 전문용어가 많이 나왔다. 기술 용어? 아니다, 수학적 개념을 이해해야 하는 용어들이다. 번역하는 사람 입장에서도 힘들었겠다 싶었다. 지지부진하게 읽다가, 슬슬 속도가 붙기 시작한 지점이 record 설명할 때였다. 그나마 최신 언어에서 실험 중인 기능을 조금 써 봤다. 그러다보니 설명을 이해하는 게 많은 도움이 됐다.

    자바 람다에 대해선 피상적으로만 쓰고 있었는데, 확실하게 알게 되었던 건 큰 수확이다. 물론 정말로 잘 이해했고, 잘 활용하려면 기존 코드를 변경하고 비교해가면서 확고히 하는 수밖에 없겠지만, 그냥 모르는 채로 대충 쓰는 것과는 확실히 다르다. 빨리 적용해보고 싶을 지경이다.

    함수형 인터페이스 Function, Consumer, Supplier, Predicate 이것들은 알게 모르게 쓰고는 있었는데, 이제야 뭔지 알 것 같다. 역시 연습을 통해 확실하게 익혀둬야겠다.

    스트림 역시 마찬가지다. 스칼라에서 쓰던 형태 비슷하게 쓰고 싶어서 쓰기 시작했던 건데, 코드를 정리하기 위해서라도 더 많이 쓰려고 한다. 내가 관리하는 시스템은 성능보다는 명확한 로직과 의도, 유연한 추가나 변경이 더 중요한 시스템이다. 성능이 중요하지 않다기보다는, 지장이 없을 정도면 되고, 오히려 다양한 요구사항을 빠른 시간 안에, 안정적으로 제공해주는 게 더 중요하다. 게다가 권한도 명확해야 하고, 변화에 대한 기록도 분명하게 해줘야 하는 거다보니 더욱 명확하게 파악해야 한다. 그런 면에서 함수형 도입은 분명히 필요하다.

    리팩토링을 하려고 하는 코드는 전형적인 과거 자바 스타일 코드들이다. 솔직히 로직이 안 보인다. 너무나 많은 예외 처리들이 존재한다. 좀더 객체지향적으로 구조 개선을 하든가, 한 눈에 보이도록 함수형으로 개선하던가 해야 한다. 그런 면에서는 개인적으로 함수형이 더 나은 것 같다. 객체지향은 좋긴 한데, 뭔가 명확하게 흐름을 파악하기에는 문제가 많은 것 같다. 물론 설계 미스였겠지만.

    인상깊은 부분은 스칼라의 try/success/failure를 함수형으로 구현한 부분이었다. 솔직히 왜 나는 이런 부분을 생각하지 않았을까 싶었고, 스칼라가 해당 기능을 JVM에서 돌리기 위해 비슷한 형태로 내부 구현한 게 아닐까 하는 생각마저 들었다. 물론 이게 진실이라고 생각진 않는다. 이 부분은 실제 구현된 부분을 확인해봐야 알 수 있는 내용이겠지만.

    제일 많이 쓰고자 하는 건 역시나 Optional이다. 너무 명확해서 뭐라 말하기가 어렵다. 이걸 쓰고 안 쓰고는 확실히 차이가 나는 게, 정신이 아찔할 정도로 if 절을 남발할 수밖에 없는 상황을 반전시킬 수 있는 키 피처 중 하나다. 스트림과 Optional, 이 둘만 적절히 정리해줘도 지금보다는 확실히 낫다.

    느긋한 계산법 (지연 평가), 이걸 제대로 몰랐던 건데, 설명을 아주 잘 해준다. 게다가 저자가 다년 간 일하면서 알게 된 주옥같은 가이드나 팁, 경험 공유는 무척이나 값지다. 기술 설명하는 것보다, 이런 내용들이 오히려 저자가 하고 싶었던 내용이 아닌가 싶다.

    재귀 부분은 일반적으로 아는 정도로만 알고 있었는데, 새로운 관점을 알게 해줬다. 눈이 번쩍했다.

    함수형 디자인 패턴과 자바를 위한 함수형 접근 방식은 한 번만 읽어서는 안 될 내용이다. 이 내용은 여러 번 읽어서 전달하고자 하는 내용을 체화해야 할 것들이다. 단순한 내용도 아니고 쉬운 내용도 아니다. 이것들을 내것으로 만들 수만 있어도 한 번의 빅 점프를 할 수 있다는 생각이 들었다.

    저자는 독학으로 개발자가 되었다고 했다. 본인은 전산학을 전공했지만, 솔직히 저자만큼의 지식을 쌓았다는 생각이 들지 않는다. 역시 배움에는 끝이 없고, 읽어야 할 책은 매년 쏟아져 나온다. 그래서 할 일은 전혀 줄지 않았다. 그래서 흥미로운 세계가 바로 프로그래밍이 아닐까?

  • 게임 AI를 위한 탐색 알고리즘 입문, 아오키 에이타 저

    “한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.”

    현재 50대 이하의 사람들 중에 비디오 게임을 모르고 자란 사람이 있을까? 한 번도 안 한 사람이 있을 순 있지만, 비디오 게임이라는 게 있는지도 모르고 자란 사람은 없을 거다. 나 역시 어릴 때부터 접해 왔다. 오락실에서부터 PC, 휴대용 게임기, 게임 콘솔, 그러다 지금은 휴대폰까지, 아니다, 스마트TV까지, 거의 모든 엔터테인먼트 기기에서 게임을 즐길 수 있게 됐다.

    이런 게임들을 접하면서 사실 항상 궁금했던 건, 저 캐릭터는 어떻게 움직이는 거지? 왜 저런 판단을 내리고 공격하는 걸까? NPC는 정해진 시나리오대로 움직이는 거라 이해하지만, 전투는 그렇지 못할 텐데… 그러다 어느 순간 랜덤한 선택을 해서 정해지지 않은(?) 시나리오로 진행해 다양한 결과를 보여주는 게임까지 나오곤 했다.

    그러다 지금은? 크고 나서는 오히려 학창 시절보다 더 게임을 못 즐기게 됐지만, 과거에 비하면 엄청나게 다양한 모습을 한 캐릭터가 나오고, 이제는 훨씬 복잡하면서도 단순 대전도 아니고 스타크래프트 정도에서 촉발돼나온 다양한 형태의 대전 게임도 많이 존재한다. 사실 PvP 형태가 아닌 AI와의 대전 게임도 사람 만큼이나 다양하게 대응하다보니 AI 상대로 게임을 이길 수나 있을지 걱정이 될 정도로 발전했다.

    그렇다고는 해도 가장 기초가 되는 방식이 있을 텐데, 게임 분야 일을 하지 않는 관계로 궁금은 하지만 사실 어떻게 하는지는 모르고 있었다. 간혹 궁금해서 찾아보면 이런 쪽을 설명해주는 자료를 찾긴 쉽지 않았고, 배경지식이 짧으니 자료를 판별하는 것도 쉽지 않은 상황이니 사실상 손놓고 있었다고 보면 된다. 이런 지경이면 이쪽 지식은 게임 회사의 핵심 자원이 아닌가 싶어서, 쉽게 찾을 수 없었던 게 아닌가 싶기도 하고…

    그런데 근래 AI 관련 산업이 폭발적인 성장을 하면서 오히려 옛날부터 실전 사례로 사용하던 게임AI쪽도 그 영향을 받아 좀더 공개적인 상황이 된 게 아닌가 싶어졌다. 예전보다 게임 산업이 굉장히 많이 커지다보니 참조 가능한 자료로 더 많아졌을 거라 추측할 순 있었지만, 그래도 어느 지점부터 접근해야 할지 난감한 상황이었다. 게임 아카데미 들어가면 좀 더 수월하게 알 수 있지 않을까 싶기도 하지만, 그렇게 도전하긴 어려운 상황이라.

    “게임 AI를 위한 탐색 알고리즘 입문”이라는 책을 알게 됐다. 요즘 AI쪽 얘기를 하도 많이 하다보니 피로감도 있지만, 제대로 공부해본 적은 없고, LLM을 파야 하나, 뭐 괜찮은 입문서는 없나, 싶으면서도 수학은 여전히 자신이 없어서 어려운 책은 보기도 싫고, 그러다 이 책을 덜컥 얻어 걸렸다.

    차근차근 읽어가면서 오, 읽을만 한데? 하는 자신감을 얻어갈 때쯤 C++와 관련 필드에서 일하지 않다보니 퇴색된 지식 때문에 좀 난감해졌다. 수학, 확률, 이쪽 관련 알고리즘… 흠, 쉬운 게 없지만, 다행스럽게도 저자가 어려운 말은 많이 안 쓴다. 그나마 다행이다. 학술적인 어조로 진행하지도 않는다. 너무 다행스럽다. 제일 좋은 건 그래프를 곁들인 적당한 설명 뒤에 따라나오는 예제 코드와 그 실행 결과다.

    지은이의 말에 자신이 대상으로 삼은 사람들을 나열한 내용 중 내가 속한다고 생각되는 부분은 “대결 게임을 개발하고 싶지만 CPU(컴퓨터가 조작하는 플레이어)를 만드는 방법을 모르시는 분”일 거라 생각한다. 당장 개발할 일은 없지만, 죽기 전에 하나쯤 만들어보고 싶은 생각은 있다.

    예제 코드를 제공해준다. 사실 이건 정말 중요하다. 물론 직접 타이핑 치는 게 제일 좋은 학습법임을 알고는 있지만, 항상 업무든 집안일이든 시간에 쫓기는 입장에서는 이렇게 타이핑 치는 시간조차도 아쉽기 마련이다. 샘플 코드를 제공해준다면, 아무래도 책으로 설명을 읽기만 하고 눈으로 쫓아가기만 하는 것보다는 실제로 돌려보고 손보기도 하면서 익히는 게 훨씬 도움이 되니까 매우 좋다.

    게임 AI의 핵심은 탐색임을 이해할 수 있게 됐다. 그리고 그런 탐색에서 쓸만한 것들을 많이 제안해준다. 그것도 코드와 그 결과와, 심지어 탐색 알고리즘의 비교 분석까지. 이러니 도움이 안 될 수가 없다. 다만 읽으면서 한 가지 아쉬웠던 것은, 실제 사례로 널리 알려진 게임에서 어떤 탐색 알고리즘을 사용했는지, 그 사례를 좀 더 보여줬으면 어땠을까 싶긴 했다. 하지만 그러기엔 책이 다루는 범위와 주제에 안 맞을 수도 있겠단 생각은 들었지만, 그래도 좀 아쉽다. 이 다음 책은 뭘로 해야 하나 고민스럽기도 하고.

    나름의 게임 분류법을 통해 그에 적합한 알고리즘 소개까지는 무난하게 간다. 아무래도 가장 기초적인 건 빔 탐색이라 생각되는데, 이를 바탕으로 진행하면서 추가적으로 설명해나가는 알고리즘들이 앞서 언급한 알고리즘의 어떤 면을 개선해줄 수 있는지, 장점과 단점을 적절히 언급해주는 것도 많은 도움이 된다. 머릿속에 정리하려면 시간이 더 필요할 것 같다. 읽으면서 정리하기엔 쏟아져 들어오는 양이 많다.

    쭉쭉 읽어가면서 너무 오래 전에 하고 안 한지라 C++ 코드에서 한 번 걸려 넘어지긴 했다. 다시 공부 좀 해야겠다 싶은 생각이 든다.

    그러다 몬테카를로 탐색과 라스베가스 탐색의 배경에 대해 알게 된 건 또 다른 수확이다. 이게 도박에서 나온 거고, 저 유명한 몬테카를로라는 이름이 발레단 때문에 알게 됐는데, 도박이 유명한 곳인 줄은 처음 알았다.

    백미라고 생각되는 부분이 두 군데 있는데, 그 중 하나는 Thunder 탐색이다. 본인이 이걸 개발하게 된 배경 설명도 좋았고, 내용도 좋았고, 이런 지식을 널리 공유하게 해준 것도 고맙다. 대단한 사람이다. 다른 하나는 7장 더 좋은 탐색을 하는 기법에서 특히 고속화 부분이다. 사실 어떻게 보면 이건 알고리즘보다는 최적화에 더 적합해보이는 부분인데, 다른 관점에서 보면 조금 과하단 생각이 들기도 하다. 하지만 아마 이 내용을 빼기엔 뭔가 허전했을 것 같긴 하다. 게임 AI의 미덕 중 하나는 비용 절감이다. 충분한 메모리와 시간, CPU 파워 등이 있다면 문제될 게 없겠지만, 뭐가 됐든 제한된 리소스 상에서 최적의 결과를 얻어내야 한다. 그러기 위해서는 비트 연산 이해는 필수다.

    입문서지만, 한 두 번 읽어서 다 이해할 거라 생각은 들지 않았다. 한 꼭지씩 따서 찬찬히 뜯어보고 충분히 곱씹어 봐야 한다. 확실히 이해해야 적용과 응용이 될 거란 생각이 읽는 내내 떠나지 않았다.

    이쪽 분야를 아주 조금은 들여다본 것 같다. 내 궁금증이 더 해소되려면 더 많은 게 필요하겠지만, 도입부로서는 딱 좋다. 게임 AI를 공부하기에 더할 나위 없이 훌륭하다.

  • [오라일리] 헤드 퍼스트 자바 3판

    “한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.”

    자바 책 검색을 하면 늘 나오던 그 책이다. 참 오랜 세월을 봐왔지만 읽어본 건 이번이 처음이다. 굳이 피하던 건 아니었고 학교 다닐 때 배운데다 회사에서는 사실 jsp 1.0 나오기 전부터 사용했기에 입문서를 읽을 이유가 사실상 없었다. 하지만 몇 개 기술서가 그렇듯 판올림으로 계속 나온다는 건 이유가 있는 거다. 그래서 궁금했다.

    결론부터 말하자면, 자바 기초를 배우고 싶은 이들에게 이 책은 교과서 느낌이다. 백과사전식 나열도 아니고 지식 검증을 위한 재미없는 퀴즈제시도 아니다. 무슨 느씸이라고 해야 할까, 생각을 제대로 해봐야 하는 대학교재다.

    설명은 구체적이고 좀 구어체식이라, 글로 이런 문체를 읽는 데 거부감이 있다면 난감할 수 있다. 나도 처음에 전달하는 내용에 비해 글이 많은 데 부담을 느꼈다. 언제부턴가 해야 할 게 많다보니 그론 경향이 강해졌으니. 그런데 어느 정도 적응을 하고 보니 비로소 그 가치가 느껴진다. 이 책 결코 입문서지만 잠깐 읽고 던질 책이 아니다. 교과서로 진득하게 공부하듯 읽고 생각하고 코딩하면서 결과를 확인해봐야 한다. 안 그러면 온라인 핸드북 읽느니만 못한 결과릉 얻게 될 거다.

    직업상 웹 관련 백엔드와 일부 프론트엔드 개발을 하다보니 GUI, Swing, 병렬 처리는 솔직히 직접 건드릴 일이 없어 책 내용이 크게 와닿지 않는다. 하지만 그외 부분들의 경우 잊고 있었던 기본에 관해 되뇌일 수 있는 계기가 된 것 같다. 늘상 생각하던 거고 다른 이들에게도 말했지만 뭔가 고급 기술을 써서 문제 해결하는 것보다는 기본적인 것들로 하는 게 훨씬 많다는 것. 그리고 항상 내가 평생 책임질 게 아니라면 다른 이들이 보고 이해하고 수정하고 개선할 수 있는 코드를 작성해야 한다는 것. 그 생각에 지지대를 세워주는 내용으로 가득 차 있다.

    7장 상속과 다형성, 8장 인터페이스와 추상 클래스, 11장 자료구조, 12장 람다와 스트림, 18장 동시성 이슈 처리 방법은 분명하게 개념을 세워두는 게 좋다. 물론 다른 장들을 소홀히 보라는 의미는 아니다. 그게 바탕이 되어줘야 언급한 장들을 이해할 수 있다.

    예를 들어, 7장에서 상속과 다형성을 설명할 때 Animal 클래스와 이를 상속받은 Dog 클래스를 여러 가지 예시를 들어가면서 설명한 부분과 같이, 신경 써서 전달하고자 하는 내용을 전개하는 방식은, 꽤 긴 호흡을 유지해야 하기에 어려울 수는 있지만, 그 과정을 잘 이해하기만 하면 해당 개념을 머릿속에 넣어두는 데 있어 매우 중요한 역할을 할 수 있다. 아무래도 실질적인 예제와 개념을 잘 일치시켜 얘기하면 입문자 입장에서는 매우 큰 도움이 된다. 단, 처음 읽다보면 헷갈려서 앞으로 갔다왔다를 반복하겠지만, 그건 어찌 보면 당연하다.

    게다가 사이사이 들어가 있는 코드들과 퀴즈들은 생각보다 난이도가 있다 보여진다. 쉬워보이는 게 사실 더 어려운 법이고, 뭔가 해결하는 데 코드량이 많다는 건 뭔가 잘못된 방향으로 나아가고 있다는 뜻일 거다.

    개인적으로 이 책에서 람다와 스트림, NIO.2를 다시 샐펴볼 수 있어 좋았다. 다른 관점에서 본다면 입문자에게 부담스러울 수도 있다 싶은데, 뭔가 책에서 해보라는 내용을 따라가는 데 거부감을 느낀다면 그럴 수도 있겠다 싶다. 하지만 그런 불편함을 조금 참아내기만 하면 좋은 출발지일 거라 확신한다. 책의 앞에 추천글이나 서평이 그렇게나 많은, 그래서 홍보하는 그 문구가 있는, 그 이유가 있는 법이다.

    자바를 제대로 사작하고 싶다면 이 책이 좋은 길라잡이가 될 거다. 조금의 불편함은 버리고 한 번 도전해보라. 거대한 자바의 세계에 들어온 걸 환영한다!

  • 소플의 처음 만난 리액트 2판, 이인제 저

    “한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.”

    이거다! 근래 회사에서 조직 개편이 일어나 원래 3명이서 하던 업무를 혼자 해야 하는 상황이 발생했다. 서버 프로그램과 클라이언트 프로그램을 다 해야 하는 상황인데, 서버 프로그램쪽이야 하던 거라서 큰 문제가 없었지만, 문제는 클라이언트 프로그램이었다.

    과거 클라이언트 코드는 리액트의 클래스 컴포넌트를 사용해서 완전히 익숙해져 있던 상황이었는데, 여러 가지 문제도 있고 너무 낡은 버전을 쓰고 있다보니 보안 이슈도 해결이 안 되고, 기술적으로도 낙후될 뿐만 아니라, 점점 비대해지는 코드량을 관리하는 것도 힘들었다.

    특히 SPA가 주는 장점(물론 단점도 있겠지만)을 활용하지 못해 발생하는 이슈도 있어서, 이참에 리액트 버전도 올리고, SPA로 만들어서 뭔가 전담 인원이 집중해서 작업할 수 있도록 해왔다.

    그런데 이걸 덜컥 혼자 하게 되었다. 최신 기술을 그래도 많이 도입해서 구현한지라, 여기에 익숙지 않은 나로서는 무척 난감한 상황이었다. 그래도 나름 이쪽 업계에서 구르다보니, 기존 클래스 컴포넌트로 된 것도, 수많은 시행착오와 문서를 뒤져서 익힌 상황인지라, 어떻게든 꾸역꾸역 손대고 있었다. 하지만 최신 기술을 많이 사용한 현 클라이언트 프로그램은 관리하기가 쉽지 않아 능률이 너무 떨어졌다.

    문제는 최신 기술에 대한 이해도가 떨어지는 것. 이걸 잘 풀어내기 위한 길라잡이가 필요했는데, 이 책을 우연히 접하게 된 것이다. 처음에는 또 기술 나열이랄까, 전형적인 설명투의 기술 서적이겠거니 해서 기대를 하지 않았던 게 사실이다. 게다가 입문서가 아닌가! 많은 부분을 건너뛰게 될 것만 같은 기대(?)가 있었다.

    그런데 열어보니 생각했던 그게 아니었다!

    무엇보다도 기초에 충실하면서도, 핵심을 찌르는 설명과 전개가 맘에 쏙 들었다. 특히 인상 깊은 몇 가지를 들여다보면, 저자가 저자의 말에서 한 바와 같이,

    “나중에 커서 훌륭한 프로그래머가 되어 내가 알고 있는 것을 다른 사람들에게 이해하기 쉽게 가르쳐 주고자 하는 목표가 생겼습니다.”

    이 말처럼 입문서지만 그래도 쉽고 필요한 부분만 언급하며 과하지 않은 반복을 사용해 설명해나간다.

    분명히 따라해보면 잘 될 코드들을 제안한다. 그러면서 목적에 맞는 적절한 예제를 제공해준다.

    특히, 클래스 컴포넌트를 설명하면서도 여러 문제점을 해결한 함수 컴포넌트를 주로 사용하게 하되 알고는 있으라는 식으로 비교해주어 레거시 코드를 보게 되더라도 당황하지 않도록 배려해준다.

    덕분에 내 입장에서는 클래스 컴포넌트 방식으로 개발해오다 함수 컴포넌트 방식으로 전환된 현재 클라이언트 프로그램을 분석하고 수정하거나 추가 개발해야 하는 상황에서 무척이나 많은 도움이 된다. 적어도 왜 이렇게 짜야 하는지를 이해할 수 있게 되어서지 싶다.

    훅, 이벤트 핸들링, 조건부 렌더링, 합성 vs. 상속, 컨텍스트… 이것들을 대략적으로는 코드를 통해, 그리고 전 직원의 도움으로 조금은 알고 있었지만, 명확하게 머릿속에 그림을 그릴 수 있도록 가이드해줘서 무척이나 도움이 된다.

    역설적이게도, 경력이 있을 때, 잘 만들어진 입문서는 어설프게 만들어져 있던 기초를 탄탄하게 만들어준다. 이해가 안 될지 모르겠지만, 잘 만들어진 입문서는 입문자에게 도움이 된다기보다는 오히려 경력자에게 더 도움이 되는 이 역설.

    마지막에 덧붙여진 리액트 18 소개는, 나에게 자동으로 현재 프로그램을 어떻게 개선해나가야 할지를 알려줬다.

    잘못 이해하거나 과도하게 작성된 부분을 재정립한 지식을 바탕으로 개선하고 이제 리액트 18로 한층 개선된 코드로 만드는 그림을 그려볼 수 있을 것 같다.

    입문서는 입문자에게 해당 내용에 흥미를 잃지 않으면서 약도를 제시해주며 궁극적으로 경험자에게 나침반 역할을 해주는 게 좋은 입문서임을 다시 한 번 되새길 수 있는 기회가 됐다.

    529 페이지, 양이 많아보여도 안 많아 보이게 만드는 매직.

  • 알고리즘 인사이드 with 파이썬

    알고리즘 책을 펼쳐본 게 얼마만인지 기억이 잘 나지 않는다.

    분명 작업하면서 참고할 목적으로 학교 다닐 때 대학교수가 만들어 출간한 알고리즘 책을 교제로 봤던 것 같은데, 그 뒤로 몇 권인가 언어를 달리 하면서 알고리즘 책을 사서 봤던 걸로 기억한다.

    문제는 처음부터 끝까지 다 읽어내진 못했다. 게을러서였는지 아니면 설명을 읽어보고 이해가 잘 되지 않게 매우 학술적으로 써서 거부감이 있었던 건지도 모르겠다.

    근래 공부를 조금씩 하기로 작정한, 그래서 인강으로 파이썬 초급 과정을 보고, 뭔가 확인해보고 싶은 마음에 이 책, 저 책 보다가 발견한 게 이 책이다.

    구성은 매우 간단하다. 문법, 기본 자료구조 및 알고리즘, 그리고 이를 응용해 풀 수 있는 문제들. 뭔가 독창적이라거나 학술적인 방식이 아니라, 기본에 충실하면서도 설명과 예제와, 이를 시각적으로 표현하는 그림들과 그 전개 설명, 그리고 이를 바탕으로 하는 알고리즘 풀이 문제들, 그것도 leetcode.com에서 추려낸 문제들. 다시 말해 어중이 떠중이 문제가 아니라 이미 검증이 된 문제들이라는 말이다.

    알고리즘 책들이 흔히 저지르는 실수는 정말 간단하다. 너무 학술적으로 접근하는 경향이 있다는 것. 이는 내가 그 알고리즘을 이해하는 데 사실 1도 도움이 되지 않았다.

    정말 필요로 하는 것은 명확한 설명과 이를 뒷받침해주는 그림들이다. 그래야 설명과 그림을 매치시켜가면서 단계를 이해할 수 있다. 아무리 알고리즘을 구현한 코드를 들이민다고 한들 머릿속에 그려내지 못하면 그건 이해했다고 할 수 없다. 매번 봐왔지만 아주아주아주 만족스러운 건 보지 못했다. 그런데 이 책은 어느 정도 내 요구사항을 만족시켜줬다. 비록 간간히 그림 속에 오타가 있어서 내가 잘못 이해한 건지, 그림이 잘못된 건지 확인하느라 끙끙댄 것만 뺀다면.

    파이썬의 기초를 설명하면서 초급 과정에 나오지 않았던 내용들을 이해하는 데 좀 힘들었다. 언제나처럼 코드만 바라봐선 이해하기 힘들다. 결국 타이핑을 하든지 예제 코드를 받아서 돌려보든지, 실제로 돌려봐야 감이 오게 마련이다. 약간 안타까운 건, 이건 뭐지? 하는 코드도 조금은 들어 있었다는 거. 내가 이해를 못한 건지, 코드에 버그가 있었던 건지는 모르겠다. 많은 시간을 투자해서 다 검토해보진 못했으니까.

    그래도 많은 부분은 파이썬에 대한 내 지식의 틀을 잡는 데 도움이 됐다.

    이제 핵심 자료구조. 오, 이건 이렇습니다, 로 끝나지 않았다. 최소한 이게 왜 필요한지 개연성을 가지고 꼬리에 꼬리를 물면서 전개한다. 왜 이런 걸 만들어냈는지 소소하게라도 언급해서 좋다.

    기본 알고리즘으로 알려주는 것들. 정렬, 그래프, 문자열 검색. 업무 특성 상 그래프는 제외하더라도 정렬과 문자열 검색은 정말 토 나올 정도로 자주 쓴다. 그러니 익히는 건 당연하다.

    자, 문제들. 이게 문제다. 너무 많다. 단기간에 하기에는 매우 벅차다. 그래서 목표를 세워야겠다. 일주일에 2, 3개 정도 시도해보기. 전적으로 시간을 할애할 순 없으니, 차근차근 접근해야겠다. 그래도 맛보기 정도는 접근해봐야하니, 제일 처음으로 만나는 재귀를 봤다.

    그렇다. 왜 재귀인가? 재귀하면 사람의 사고방식에 근접한 대신, 시스템 관점에서는 자원을 많이 써서, 잘못하면 스택 오버플로를 발생시킨다는 그 내용이 제일 먼저 떠오른다. 그래서 가급적 풀어서 구현하느라 애먹었던 게 한 두 번이 아니다. 요즘은 컴파일러들 성능이 좋아서 재귀적으로 작성해도 풀어서 성능을 최적화한다고 들었다. 그래서 뭐, 왠만하면 읽기 좋게 작성하는 게, 후임 개발자들한테도 도움이 될지 모르겠다.

    앞서 말했던 메모리 이슈를 여기서도 빼먹지 않고 설명한다. 역시 기본에 충실하다. 코드 예제도 보여주면서 동시에 그림도 있다. 친절히 전개 순서도 알려준다. 이런 건 너무 좋다. 눈으로 차분히 따라가보면 조금씩 머릿속에 자리를 잡아간다, 그 개념들이.

    이제 첫 번째 문제를 만났다. 홍수 채우기? 어떤 문제인지 설명하고 그 문제를 풀기 위한 의사코드를 제공한다. psuedo code를 의사코드로 변역했다. 뭐 원 발음대로 쓰기도 하고 유사코드라고도 하고, 아주 다양하게 불린다. 아무튼 이걸로 틀을 잡아줬다. 처음엔 이게 뭔가 싶지만, 나중에 계속 반복하다보면, 머릿속에 보통 이런 식으로 틀이 잡히더라. 그러니 익숙해지는 게 좋다.

    해결코드를 보여주고 그로 인해 전개되는 걸 역시나 그림으로 설명해준다. 이런 게 너무 좋다. 답으로 코드만 보여주고 돌려보라는 무책임한 말은 안 한다.

    좋다, 이런 식으로 반복해 문제들을 풀어가보면 잘 모르던 것들도 틀이 잡힐 것 같다.

    주변에 새로 구직을 하는 분들을 가끔 보는데, 요즘은 코딩 테스트 기본으로 알고리즘 풀이를 한다고 한다. 그렇다면 어떤 책이든 알고리즘 풀이 연습도 하고 개념도 익혀야 할 텐데, 이 정도의 친절함이라면, 그리고 대세 언어 중 하나인 파이썬이라면 많은 도움이 될 듯도 하다.

    간만에 맘에 드는 알고리즘 책을 찾았다. 아까 언급했다시피 오탈자 만날 때마다 검증 후 신고해야겠다. 살짝 봤는데 2건 신고됐더라. 내가 아직 제대로 파악 못한 부분들 같은데, 한 번 쭉 따라가봐야겠다.

    “한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공 받아 작성된 서평입니다.”

  • [이벤트] 가상자산 거래 수수료 전면 무료

    아래는 이벤트를 안내하는 링크입니다.

    https://lightning.korbit.co.kr/notice/?noticeId=2V28e9sGQKYYSyL7WuSRmX

    #코빗 #수수료무료이벤트 #메이커인센티브

  • 코빗 수수료 무료 이벤트 메이커 인센티브

    코빗에서 하던 득이 되는 메이커 인센티브 이벤트가 있는데 더 얹어서 꽤 강한 수수료 무료 이벤트를 열었습니다. 한 번 확인해보세요.

  • 개발자를 넘어 기술 리더로 가는 길, 타냐 라일리, O’REILLY

    “한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.”

    이런 책을 얼마만에 읽어본 것일까? 무엇보다도 이 책은 쉽게 읽어 나가기에는 난이도가 상당했다. 이유? 간단하다. 그동안 일하면서 쌓인 경험치들이 책 한 줄 읽을 때마다 되살아나서, 책에서 얘기하는 것과 나의 경험 사이의 관계를 재정리하느라 빠르게 읽어나갈 수가 없었다. 속도를 높일수록 그 저항감은 이루 말할 수 없었다. 그만큼 이 책은 경력이 많을수록 공감을 할 수밖에 없고, 생각을 많이 할 수밖에 없는 책이다. 그렇다고해서 그 내용이 전부 옳으냐? 그 답은 “2019년 10월에 이 책을 쓰기 시작했을 때, 나는 마침내 훌륭한(영향력 있는) 기술 리더가 되는 몇 가지 방법을 알아냈다고 생각했다. 그래서 지금까지 경험으로 배운 것을 공유하고자 결심한 것이다.”와 “3년 후에 이 책이 출간되자마자 충격적인 판매량을 기록했다.”로 정리할 수 있을 것 같다. 결국 경력이 쌓여가는데 어떻게 성장해야 하는지 그 이정표를 알고 싶은 사람은 IT의 역사에서 수없이 있고, 그 열망은 예나 지금이나 마찬가지인 것이다. 그러니 단순한 기술을 익혀 사용하고자 하는 사람은 이 책에서 얻을 건 없다. 요는 현재 나의 상사의 속마음을 짚어보거나 내 방향성을 설정하고자 하는 이들에게는 이 책은 더없이 알맞을 거라 생각한다.

    1부. 빅 픽처 관점의 사고력, 2부. 성공적인 프로젝트 실행력, 3부. 조직 차원의 레벨업. 이렇게 구성해서 본인의 경험과 업계 사람들의 의견들로 구성해 진행하는 얘기가 다소 반복적이거나, 장황한 얘기가 나오다보면, 자칫 그 흐름을 잃을 수도 있음을 주의하자. 어차피 키워드는 제목 형태로 제대로 제공하고 있으니 그 점을 항상 기억하면서 읽어나가면 진도가 안 나가는 불상사는 피할 수 있으리라. 사실 주요 내용이 마무리 될 때마다 “마치며”를 제공하고 있으니 미리 읽어서 키워드와 설명 사이의 간극을 좁혀보는 것도 좋겠다.

    다시 말씀드리지만, 이 책은 빨리 읽을 수 없는 책이다. 그리고 혼자 읽어서도 안 되는 책이다. 무조건 동료와 일독하고 내용을 서로 검토해보는 게 필요하다. 각자의 위치에서 이 내용을 이해하는 바가 다를 것이고, 이를 확인해보는 것도 매우 중요하다. 그러면 내 얘기가, 상사의 얘기가, 그 전과 어떻게 다르게 들리는지 알 수 있으리라. 그런 느낌을 한 번이라도 느낄 수 있다면, 이 책은 성공했다! 개인적으로는 머릿속이 더 복잡해졌지만.

    카미유 푸르니에가 적은 추천의 글 마지막 문장으로 마무리하는 게 옳겠다.
    “이 책은 스태프 엔지니어 역할에 필요한 기술을 알려주며, 모든 엔지니어의 책장에 놓여야 하는 책이다.” 이제 내 책장에도 한 권 있다!

  • Install Ruby using RVM

    Homebrew 통해 OpenSSL 설치시 아래와 같은 옵션을 추가해야 한다.
    
    rvm use 2.6.3 --with-openssl-dir=/usr/local/opt/openssl
  • Leaf Crashed…

    1. 한 번 크래시가 생기기 시작하면 계속 생긴다.
    2. 포기하고 안 쓰고 있다가 도저히 안 돼서 결국 Rocky Sand Studio에 문의했다.
    3. Reset 하라는 답변이 왔다.
    4. 설정을 백업하지 않아 곤란하다고 했다.
    5. 드디어 원하던(은 아니지만 그래도 설정을 날리진 않았으니) 답변이 왔다.

    Step 1. Uninstall Leaf.app.
    Step 2. Execute the command, “defaults delete com.rockysandstudio.Leaf” in Terminal.app.
    Step 3. Reinstall Leaf.app from App Store.

    잘 된다. 이렇게 간단한 방법이 있었다니… 진작 알았음 좋았잖아요!