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