읽은 책 정리.

누워서 읽는 퍼즐북 - 초콜릿 문제

가로 3칸, 세로 8칸, 모두 24개의 조각으로 이루어진 초콜릿이 있다. 당신은 24명의 아이로 이루어진 학급을 맡은 선생님이다. 초콜릿이 먹고 싶은아이들은 당신에게 빨리 그것을 24개의 조각으로 나누어서 하나씩 달라고성화를 부리고 있다. 이 초콜릿을 잘라서 24개의 조각으로 나누는 방법은여러 가지가 있다. 길게 세로로 한 번씩 쪼갠 다음 각 조각을 가로로 쪼갤수 있고, 먼저 가로로 쪼갠 다음 세로로 쪼개는 방법을 취할 수도 있다. 혹은 가로와 세로로 쪼개는 방향을 혼합해서 다소 복잡하게 나누어갈 수도 있다. 성화를 부리는 아이들 앞에서 당신은 잠시 생각에 잠겼다.이 초콜릿을 가장 빠르게 24개의 조각으로 나누는 길은 무엇일까? 그 방법을 찾아보기 바란다. 잘라낸 초콜릿을 겹쳐서 한꺼번에 쪼개거나 하는 방법은 허용되지 않는다.

-- 누워서 읽는 퍼즐북 중에서

정답

초콜릿을 어떤 방법으로 쪼개도 전체적으로 쪼개야 하는 횟수는 항상 일정하다. 그 횟수는 반드시 전체 조각의 수에서 1을 뺀 값이다. 즉, 23.

감상

처음 이 문제를 접했을 때 매우 당황했다. 분량을 채우기 위한 꼼수가 아닐까 생각했다.

하지만 이 문제의 의도를 알면서 생각이 달라졌다. 의도는 '문제의 원리를 얼마나 빨리 깨닫고 수긍하느냐'다.

...

프레임워크에서 작업하는데 문제가 발생했다. 내가 생각하기에 가장 깔끔할 거 같은 방법을 찾고 있었다. 몇 시간씩 검색하고 시도해도 해결되지 않았다. 방법이 없는건 아니었다. 그런데 더 좋은 방법이 있다고 생각했다. 한참 지나서야 다른 방법으로 해결했다.

초콜릿 문제가 떠올랐다.

너무 늘어지는 문제가 생기면 이 것은 '초콜릿 문제'가 아닌가 생각해본다.

내가 문제를 정확히 이해하고 있는지 다시 한 번 고민해봐야 할 때다.

Implementation patterns (a.k.a smalltalk best practice patterns, kent beck)

직접 읽은 것은 아니고, 보고 싶은 책. 내용은 패턴에 대해서 이야기한다.

JUnit의 구현을 설명하는 글에서 언급된 책이다:

The Smalltalk Best Practice Patterns (see Beck, K. Smalltalk Best Practice Patterns, Prentice Hall, 1996) has a pattern that is applicable. It is called Collecting Parameter.

Collecting Parameter 라는 단순한 개념에 관심이 생겼다가, 어떤 이야기를 하는 책인가 후기를 찾아보게 되었다.

http://m.egloos.zum.com/gyumee/v/2263191

Code for others as well as myself and my buddy the CPU. (원서) 자기 자신과 CPU뿐 아니라, 자신의 코드를 보고 사용할 다른 사람들을 배려해서 코딩해야 한다. (번역서)

단순히 패턴만 설명하는 책은 아닌가 보다.

만들면서 배우는 클린 아키텍처

데이터베이스 중심적인 아키텍처가 만들어지는 가장 큰 원인은 ORM을 쓰기 때문이다.

불변 커맨드 객체의 필드에 대해서 null을 유효한 상태로 받아들이는 것은 그 자체로 코드 냄새(code smell)다. code smell: 코드에 더 깊은 문제가 있을 수도 있음을 암시하는 특성들

44p.

"계좌 등록" 기능과 "계좌 변경" 기능에 같은 입력 모델을 사용하는 경우 문제에 대해서 설명한다. 등록 기능은 소유자ID 필요하고 계좌ID는 null 이지만, 변경 기능은 소유자ID가 null이고 계좌ID를 필요로 한다. 각 기능에서 입력 모델은 소유자ID와 계좌ID가 각각 한 쪽이 null이어야 한다. 만약 null이 아닌 값이 들어왔을 때 이를 에러로 볼 것인지 무시할 것인지 결정해야 하는데 어떤 방법이든 명확한 것은 아니다. 모호성을 없애기 위해서 각각 입력 모델을 관리하는게 좋다. 다만 매핑하는데 비용이 든다. 이 비용을 줄이는 방법에 대해서 다른 장에서 설명한다.

테니스 이너 게임

https://www.yes24.com/Product/Goods/113742481

테니스 기술서가 아니다. 저자가 테니스 코칭하면서 발견한 학습 방법에 대한 이야기. 테니스를 비유하여 효율적인 학습 방법에 대해서 이야기한다.

제목대로 학습에는 내부 게임과 외부 게임으로 나눈다. 학습자가 어떤 게임에 집중해야 하는지 이야기하며, 당연하게도 책에서는 내부 게임에 집중하라고 한다.

외부 게임은 언제 팔을 뻗고, 호흡 방법, 시선 방향 등 코치의 말에 신경쓰는 것이다. 주변에서 일반적으로 배우는 방법이다. 하지만 이 방법은 학습을 방해한다. 어색한 동작을 만들어 학습자의 자연스러운 동작을 하기 어렵게 만든다.

내부 게임은 외부 게임을 차단하고, 편안한 동작에 집중하는 것이다. 학습자는 코치의 동작을 관찰하고, 자신에게 가장 익숙한 동작을 찾아내야 한다. 올바르지 않은 동작이라도 괜찮다. 테니스에서 올바른 동작은 변화해 왔다.

"자세가 흐트러졌어", "좀 더 팔을 뻗어야 해". 반성과 피드백은 오히려 학습을 방해한다. 책에서는 긍정과 부정을 평가하지 말고 현재 그대로를 받아들이라고 한다. 자신에 대해서 평가하고 어떻게 행동할 지 생각하는 것은 근육의 긴장감으로 이어진다. 그러면 막상 반응해야 할 때 불안정한 자세가 된다. 동물적인 감각을 찾아야 한다.

따라서 평가하지 말고 자신의 반응을 관찰한다. 자연스럽게 서브하는 모습을 상상하고 행동해 본다. 공을 던졌을 때 라켓은 어디에 있는지, 공을 쳤을 때 손목 스냅은 어땠는지를 기억한다. 반복을 통해서 점점 안정적인 자세를 만들어 간다. 책에서는 이 과정을 "홈"을 만드는 것이라고 비유한다.

평가하는 생각에서 자유로워지는 것에 집중한다. 좋고 나쁨을 떠나서 순전히 현재를 받아들이고 근육을 익숙해지게 만든다. 어린 아이가 배우는 것이 빠른 것은 자신을 평가하지 않기 때문이라고 한다. 그대로를 받아들이고 자신에게 맞는 방법을 찾는 것이다. 맞는 자세를 찾는 것이 중요하지, 좋은 자세를 공부하는 것은 좋지 않은 이유가 있는데, 테니스의 역사가 오래동안 진행되면서 좋은 서브 자세가 점차 변화해 왔다는 것이다.

책의 후반부에는 경쟁을 받아들이는 마음가짐에 대해서 다룬다. 경쟁에서 한쪽이 승리하면 반대는 패배자가 되기 마련이다. 지은이는 어릴 적에 자신보다 나이 많은 선수를 이겼더니 부모님이 상대 선수에 대한 애잔함을 가졌다고 한다. 이겼음에도 기분이 좋지 않았고 이후로는 경쟁을 부정적으로, 협력하는 것을 긍정적으로 생각하게 되었다. 경쟁하는 것을 의도적으로 피하게 되었다. 그러나 이 관점을 다르게 생각할 수 있다고 한다. 내가 성장하기 위해선 상대방이 더 어려운 공을 보내야 한다. 상대방이 내 공을 못받기 보다는, 받아쳐서 나에게 더 어려운 공을 보내야 한다. 내가 더 어려운 공을 받아낼수록 나는 성장한다. 이런 관점에서 봤을 때 상대는 경쟁 상대가 아닌 내 성장에 대한 협력자로 볼 수 있다. 그러면 승리와 패배의 게임에서 떠난, 더 자유로운 마음으로 임할 수 있다.

이너 게임에 집중하고, 상황을 판단하지 말라지만, 코끼리를 생각하지 말라고 하면 코끼리가 떠오르는 법. 이너 게임에 집중하도록 시선을 돌리는 방법이 있다. 테니스를 기준으로, 공이 바운스될 때 "바운스"라고 말하고 라켓에 닿을 때 "힛"이라고 말하라 한다. 그러면 공에만 집중하게 되고, 외부 게임에 집중될 틈이 없게된다.

내가 알지 못하게 이너 게임에 집중하고, 익숙해진 영역이 있을지도 모른다. 취미같은 것들 말이다. 잘 하려고 노력하지는 않았지만, 다른 사람들보다 잘하는 잘하는 것이 하나는 있을 것이다. 거기서 이너 게임에 대한 힌트를 찾을 수 있지 않을까.


유튜브에 저자의 테니스 이너 게임에 대해 설명하는 영상이 있다: https://youtu.be/HzR8x5MgvDw

영상에서 테니스 아마추어가 저자의 코칭을 받는 모습이 나온다. "바운스" "힛" 외치면서 이너 게임에 집중하고, 편안해 보이는 모습이 인상적이다.

논리적 사고를 기르는 알고리즘 수업

2024-02. 페이스북 팔로잉 중인 분의 추천으로 관심을 갖고 회사에 구매 요청했다.
덧글에서도 추천하는 이유에 공감한다는 반응이 있어서 관심이 더 생긴다.

대부분의 알고리즘 서적은 몇가지 정해진 알고리즘을 이해하는 걸 돕고, 그걸 코드로 옮기는 걸 알려준다. 거기에 문제를 분석하고 새로운 알고리즘을 설계하는 요소는 잘 드러나지 않는다. 그러다보니 알고리즘 책을 많이 봐도 난생 처음 보는 문제를 접하면 잔뜩 긴장하고 실력이 원래로 돌아간 느낌을 받는 거다.

알고리즘 문제를 풀다보면 특정 유형을 공부하게 되는 느낌을 많이 받았다. 그래서 레벨이 올라가면 풀기 버겁고, 풀이를 봐야지만 그제서야 이해되는 경험을 많이 했다.

알고리즘 공부하며 뭔가 내가 소질이 없나 느꼈던 분들이 이 책을 보면 광명 봤다 이런 느낌 받을 거라고 생각한다. 과장해 말하자면, 그 실체없는, 수학적 사고의 에센스가 살짝 배어들어가 있다고까지 말하겠다.

이 책을 통해 문제에 대한 접근 방식을 개선해보고 싶다. 하나의 유형이 아닌 전체적인 사고를 기르는데 도움을 받고 싶다.

23일, 이제 책을 받았고 조금씩 읽어보려고 한다.