[책] 사악한 디자인

사악한 디자인 - 크리스 노더 사악한 디자인 은 크리스 노더 가 쓴 Evil by Design: Interaction Design to Lead Us into Temptation 의 번역서다. 이 책은 사용자의 심리를 이용해 행동을 유도하는 여러 기법을 다룬다. 소재는 흥미롭지만, 결론부터 말하면 추천하지 않는다. 먼저 확실히 해두고 싶은 점은 있다. 내가 이 책을 추천하지 않는 이유는 소개하는 기법들이 틀렸다고 생각해서가 아니다. 사회적 검증, 손실 회피, 희소성, 보상처럼 사용자의 선택을 이해하는 데 도움이 되는 개념을 폭넓게 다루고, 이를 실제 서비스에서 어떻게 활용하는지도 보여준다. 다만 유용한 내용을 다룬다고 해서 읽기 좋은 책이 되는 것은 아니다. 첫 번째 문제는 책의 구성이다. 이 책의 핵심은 사람은 언제나 이성적으로 판단하지 않으며, 디자인은 그런 심리를 이용해 사용자의 행동을 유도할 수 있다 는 것이다. 저자는 이를 교만, 나태, 식탐, 분노, 시기, 색욕, 탐욕이라는 기독교의 7대 죄악으로 나누어 설명한다. 제목과 목차만 보면 꽤 매력적이다. 하지만 읽다 보면 이 분류가 내용을 이해하는 데 도움되지 않는다는 것을 깨닫는다. 사실 이건 설명을 위한 틀이 아니라 마케팅 훅이다. 예를 들어 탐욕은 누구나 알고 있는 대로 필요 이상으로 가지려는 욕구다. 하지만 식탐이나 색욕은 디자인에 적용하기 어렵다. 그래서 저자는 식탐을 자제력의 부족으로 설명하고, 색욕은 성적인 욕망을 넘어 대상이 무엇이든 강렬한 욕구를 품는 것으로 정의한다. 이렇게 각 범주의 의미가 겹치도록 정의했기 때문에 욕심에 의한 행동이 무언가를 강하게 원하기 때문인지, 자제력을 잃었기 때문인지, 필요 이상으로 소유하려는 마음 때문인지 어떻게 구분 할지 애매해진다. 저자도 색욕을 출발점으로, 시기와 탐욕을 그 결과로 설명한다. 그렇다면 원인과 결과로 이어지는 것들을 같은 수준의 범주로 나누는 방식이 적절한지부터 묻게 된다. 물론 대중서의 목차가 학문적으로 엄밀한 분류 체계일...

[책] 알고리즘 산책: 수학에서 제네릭 프로그래밍까지 - 추상화를 어떻게 해야 하는지에 대한 수학적 설명

이미지
수학을 왜 공부해야 하는가? 수학자들은 세상의 진리를 탐구하기 위해서라고 할 것이고, 변태들은 단순히 재밌어서라고 할 것이다. 하지만 나는 진리 탐구에는 관심이 없다. 그리고 수학이 흥미롭다고 생각하지, 재밌다고 생각하지도 않는다. 그럼에도 수학을 공부하는 이유는 수학이 사고 훈련에 도움되기 때문이다. LLM에게 코드 작성을 시키면 정말 못하는 것이 하나 있다. 바로 추상화다. 다른 부분은 몰라도 추상화만큼은 정말이지 신입 개발자 수준의 모습을 보여준다. LLM이나 신입 개발자들이 하는 추상화는 그저 비슷한 코드 몇 개를 하나의 함수로 합치는 수준에 불과하다. 추상화란 무엇일까? 추상화는 여러 개의 구체적인 대상에서 본질적으로 필요한 성질만 남기고, 나머지 차이를 버려 하나의 일반적인 개념으로 표현하는 것이다. 그렇다면 추상화를 잘하려면 어떻게 해야 할까? 추상화의 첫 번째 단계는 추상화할 대상과 범위를 정하는 것이다. 그리고 그 대상의 필수적인 성질이 무엇인지 깊이 생각해야 한다. 어떤 성질은 주어진 대상의 본질적인 것이고, 어떤 성질은 그 본질적인 성질을 만족하기만 하면 부수적으로 따라오는 것이다. 반대로 지금 눈앞에 있는 코드에 공통점이 있더라도 그것이 우연히 공유하고 있을 뿐이고, 실제로는 추상화 범위에 포함해서는 안 되는 경우도 있다. 좋은 추상화는 이 경계를 잘 찾는 일이다. 이런 구분이 없이 일단 코드가 같기 때문에 같은 클래스나 함수로 추상화하는 경우를 보면 나는 이렇게 묻는다. 이 구조가 정말로 필연적인가? 그리고 이것이 수학에서 사고하는 방식이다. 아니, 수학이라고 하면 범위가 너무 넓을 수도 있다. 최소한 대수학에서는 그렇다. 정수, 행렬, 다항식은 겉보기에는 전혀 다른 대상이다. 하지만 대수학에서는 그 대상 자체가 아니라 그 위에 어떤 연산이 정의되고, 그 연산이 어떤 법칙을 만족하는지를 본다. 그렇게 군, 반군, 모노이드, 환, 체 같은 대수 구조가 만들어진다. 이 책은 역사 속 대수학이 발전한 과정을 따라간다. 고대...

[책] 프로그래머의 뇌 - 좋은 코드가 무엇인지에 대한 인지과학적 설명

이미지
프로그래머의 뇌 는 프로그래머들이 흔히 말하는 '좋은 코드'란 무엇인지, 그리고 코드를 어떻게 하면 더 잘 읽을 수 있는지를 인지과학의 관점에서 설명하고, 이를 바탕으로 프로그래밍을 더 효과적으로 수행하는 방법을 제시하는 책이다. 이 책에서 소개하는 실천적인 조언의 상당수는 낯설지 않다. 클린 코드 , 리팩터링 , 실용주의 프로그래머 같은 서적에서 이미 제시된 조언들이다. 이 책의 차별점은 새로운 원칙을 제시하는 데 있다기보다, 기존의 원칙이 왜 효과적인지를 인지과학에 근거해 설명한다는 데 있다. 이 책은 좋은 코드를 독자의 기억과 사고에 불필요한 부담을 주지 않는 코드로 바라보고, 그 부담을 줄이는 방법을 설명한다. 이미 다른 책에서 접할 수 있는 내용을 굳이 다시 알아야 하느냐고 물을 수도 있다. 내가 생각하는 이 책의 가치는 우리가 경험적으로 알고 있던 현상에 이름을 붙여 준다는 데 있다. 나 역시 코드를 어떻게 작성해야 하는지는 알고 있었지만, 이를 다른 사람에게 설명할 때는 코드 리뷰를 통해 그때그때 개별적인 조언을 건네는 데 그치곤 했다. 이 책을 읽고 나서는 파편화되어 있던 경험에 적절한 이름과 설명을 붙이고, 그 조언이 필요한 이유까지 이야기할 수 있게 되었다. 이름을 붙이면 현상을 식별하고 동료와 논의하는 데 도움이 될 뿐 아니라 기억에도 더 오래 남는다. 이 책의 표현을 빌리자면, 관련 정보를 장기 기억에 저장하고 필요할 때 인출하기도 쉬워지는 것이다. 이 책을 읽어야 하는 또 다른 이유는 클린 코드 나 리팩터링 에서 제시하는 규칙을 교조적으로 받아들이는 데 그치지 않고, 그 배경에 있는 원리를 이해할 수 있다는 점이다. 원리를 알고 있으면 책에서 제시한 규칙이 그대로 적용되지 않는 상황에서도 다른 해결책을 찾을 수 있기 때문이다. 다만, 이 책은 인지과학을 사용해 프로그래밍을 설명하는 책이지, 인지과학 자체를 설명하는 책은 아니다. 따라서 같은 현상에 대한 여러 이론적 논쟁을 다루지 않고, 실용적 설명을 위...

[책] Effective Kotlin - 그다지 Effective 하지 않은

이미지
1992년 스콧 마이어스 의 Effective C++ 이 출간된 이후, More Effective C++ , Effective STL , Effective Modern C++ 로 이어지는 이 시리즈는 C++ 개발자의 필독서로 자리 잡았다. C++은 복잡하기로 악명 높은 언어다. 문법을 안다고 해서 좋은 C++ 코드를 작성할 수 있는 것은 아니다. 스콧 마이어스의 이 책들은 언어 명세만 읽어서는 얻기 어려운 실전 지식을 구체적으로 정리했다. 그 후 Effective 는 하나의 장르가 됐다. 같은 출판사에서 기획한 단일 시리즈는 아니기 때문에 책마다 깊이와 완성도에는 차이가 있지만, 이 장르에는 공통된 기대가 생겼다. 해당 언어의 문법을 익힌 개발자가 다음 단계로 나아갈 때 필요한 그 언어만의 이디엄과 자주 빠지는 함정, 라이브러리와 언어 기능을 올바르게 조합하는 방법을 알려주는 책이라는 기대다. 그런데 Effective Kotlin 은 그런 기대를 만족시키지 못한다. 지금까지 읽은 Effective 계열의 책 가운데 해당 언어에 관해 새롭게 배울 내용이 가장 적었다. 이는 작가의 문제라기보다 언어의 설계 차이에서 비롯된다. C++은 물론이고 그보다 가다듬어진 Java나 C#도 제대로 모르고 사용하면 예상하지 못한 결과를 낳기 쉽다. 높은 자유도에 따른 복잡성을 사용자가 감당하게 된 경우도 있고, 언어의 역사와 하위 호환성 때문에 남아 있는 동작도 있고, 간결한 문법 뒤에 숨어 있는 규칙이 있는 경우도 있다. 이런 언어에서는 문법적으로 올바른 코드와 그 언어답게 잘 작성된 코드 사이의 거리가 크다. 그래서 무엇을 해야 하는지뿐 아니라 무엇을 피해야 하는지도 알아야 한다. 하지만 Kotlin은 개발자들이 겪었던 문제를 고려해 설계된 언어다. 실수하기 쉬운 기능은 줄이고 안전한 방식을 선택하도록 유도한다. 이 덕분에 개발자가 별도로 공부해야만 알 수 있는 함정이 다른 언어보다 적다. 이는 Kotlin의 장점이지만, 동시에 Effective Kotl...

[책] 로지컬 씽킹 - LLM 시대에 다시 보는 맥킨지식 사고법

이미지
아는 사람은 표지를 보면 알겠지만 구판이다. 옛날 맥킨지식 사고법이 유행했던 시절에 샀기 때문이다. 아마 20년쯤 전이었을 것이다. 그런데 사놓고 읽지는 않았다. 왜 안 읽었는지는 잘 기억나지 않는다. 당시 맥킨지식 사고법이 워낙 유행하던 시절이라 논술 관련 교재나 다른 책에서 많이 차용하고 있었고, 그런 것들을 통해 이미 어떤 내용인지 대충 알고 있어서였을 것 같다. 그럴 거면 왜 샀는지 모르겠지만 원래 책통법 이전에는 책을 살 때 그렇게 생각하고 사지 않았다. 그리고 그 뒤로 일하는 방식에 대한 유행이 꽤 많이 바뀌었다. 맥킨지식 사고법은 현재 가지고 있는 정보를 기반으로 문제에 대한 최적해를 찾으려는 시도다. 하지만 스타트업은 가지고 있는 정보도 적고, 최적해를 찾을 시간도 돈도 없다. 그래서 이런 접근보다는 빠르게 만들어 빠르게 고치는 방식이 실용적으로 여겨졌다. 린 스타트업, 애자일, 디자인 씽킹 같은 방법론들이 이런 접근법이었다. 나도 대체로 이 방법을 좋아한다. 커리어 대부분을 스타트업에서 보냈기 때문에 실제로 많은 경우에는 그 방식이 맞았다. 머릿속에서 완벽한 답을 찾으려 하기보다, 작게 만들고 현실에서 부딪혀보는 편이 더 빠르게 배울 수 있다. 실행하지 않은 분석은 틀리기 쉽고, 사용자와 시장과 현장은 머릿속 논리대로 움직이지 않는다. 그래서 책장에 꽂아둔 로지컬 씽킹 은 딱히 다시 꺼낼 이유가 없었다. 그렇게 이 책은 책장 안 어딘가에서 썩고 있었다. 그런데 최근 LLM을 쓰면서 생각이 조금 바뀌었다. 이제 다시 그런 사고법이 필요해졌다고 느낀다. LLM에는 논리가 없다. 그럴싸한 문장을 만들 뿐이다. LLM은 확률적 생성기다. 앞뒤로 어떤 것을 붙여도 이 본질은 벗어날 수 없다. 그저 그럴듯한 문장을 만들고, 논리적인 글처럼 보이는 구조를 만들어낸다. "첫째", "둘째", "따라서" 같은 접속어와 bullet point, 숫자 리스트 같은 형식을 사용해 사고의 모...

[책] 틀리지 않는 법 - 우리가 수학을 공부해야 하는 이유

이미지
틀리지 않는 법 - 조던 엘렌버그 제목과 다르게 틀리지 않기 위해 어떤 방식으로 사고해야 하는지 알려주는 책은 아니다. 오히려 이건 저자가 받는 질문인 "우리는 왜 수학을 배워야 하는가?"에 대한 답변에 가깝다. 수학은 세상을 더 정확하게 이해하기 위해 배워야 한다. 500페이지가 넘는 분량 동안 저자는 수학이 단순히 계산이 아니라 현실을 설명하고 이해하는 언어라는 점을 다양한 사례를 통해 보여준다. 책의 가장 큰 장점은 무엇보다 저자의 글쓰기 실력이다. 수학을 소재로 삼고 있지만 딱딱하거나 교과서적인 설명에 그치지 않고, 흥미를 끌 수 있는 적절한 예시를 이용하여 부담 없이 읽을 수 있게 만든다. 반면 단점도 분명하다. 이 책은 어디까지나 교양서적이다. 책의 분량에 비해 내용의 깊이는 다소 얕은 편이다. 이미 수학에 관심이 있거나 관련 교양서를 여러 권 읽어본 사람이라면 대부분 한 번쯤 들어봤을 법한 이야기들이 반복된다. 반대로 수학에 별 관심이 없는 사람에게는 500페이지가 넘는 이 책을 읽지 않을 것 같다. 그럼에도 불구하고 이 책의 가치는 분명하다. 만약 누군가 "수학을 왜 공부해야 하나요?"라고 묻는다면, 나는 망설임 없이 이 책을 추천할 것이다. " 틀리지 않는 법 "은 수학의 세부 내용을 가르치는 책이 아니라, 수학이 왜 중요한지 설득하는 책이다. 그리고 그 목적만큼은 매우 효과적으로 달성하고 있다.

[책] Real MySQL 8.0

이미지
Real MySQL 8.0 1권 Real MySQL 8.0 2권 내가 처음 MySQL을 만진 건 5.1인가 5.2였다. 사실 정확한 버전은 기억이 나지 않는다. 당시에는 서버로 쓸만한 오픈소스 RDBMS는 선택지가 MySQL밖에 없었다. PostgreSQL을 비롯한 대체제가 없는 것은 아니었지만, 성능과 안정성을 고려하면 MySQL을 선택할 수 밖에 없었다. 그리고 많은 일이 있었다. 차세대 스토리지 엔진으로 주목을 끓었던 Falcon 엔진은 어느 순간 폐기되었고, 2010년 출시된 MySQL 5.5에서는 기본 엔진으로 InnoDB를 채택하였다. 2018년 출시한 MySQL 8.0에서는 MyISAM 지원을 버리고 InnoDB만 남겼다. 그 후 8년이 지났지만 부끄럽게도 나의 MySQL 이해도는 여전히 그 15년 전 시절에서 크게 달라지지 않았다. 그래서 이번에 InnoDB에 대한 지식을 제대로 정리해보자는 마음으로 책을 찾아봤다. 솔직히 말하면, 특정 구현체를 다루는 책을 안 좋아한다. 그런 책은 내부 구현보다 단순히 어떤 옵션들을 줘서 실행할 수 있는지 알려주는 피상적인 겉핥기를 하는 경우가 많기 때문이다. 그래서 이번에도 기대보다는 우려가 앞섰다. 그래도 Real MySQL 8.0을 고른 것은 위키북스의 " 데이터베이스 & 빅데이터 " 시리즈 중 하나라는 점 하나 때문이었다. 참고로 이 시리즈의 첫 번째 책인 스캇 엠블러 의 리팩토링 데이터베이스 는 RDBMS를 다루는 사람이라면 꼭 읽어야 할 명저다. 판권 종료로 번역서를 구할 수 없어 추천하기 힘들다는 사실이 안타까울 따름이다. 이번에 읽은 Real MySQL 8.0은 결과적으로, 안 읽었으면 후회할 뻔했다. 이 책이 좋았던 이유는 단순히 "이런 옵션이 있다" 수준의 나열에 그치지 않는다는 점이다. MySQL 8.0의 핵심인 InnoDB의 동작 방식을 깊이 있게 설명해준다. 인덱스가 내부적으로...