📖 구조 노트 목차 Chapter 19 읽는 중

19. 추상화와 일반화

구조 노트 Chapter 19 2026. 07. 17.

사내 테스트 환경에서 재전송 타임아웃 값을 200밀리초로 맞췄다. 사무실 안 네트워크는 지연이 거의 없었고, 이 값으로 며칠간 돌려도 아무 문제가 없었다. 그런데 실제 서비스 환경에 배포하자마자 사용자들의 접속이 끊기기 시작했다. 지방이나 해외에서 접속하는 클라이언트는 왕복 지연이 200밀리초를 가볍게 넘겼고, 서버는 정상적으로 오고 있는 응답을 이미 끊긴 연결로 오판하고 있었다. 테스트 환경에서는 완벽하게 작동하던 값이, 조건이 조금만 달라져도 통째로 무너졌다.

이 실패의 원인을 뜯어보면 흥미로운 지점이 있다. 200밀리초라는 값 자체는 틀리지 않았다. 사내 네트워크라는 특정 조건 안에서는 정확했다. 문제는 그 값이 딱 그 조건에만 맞춰져 있었다는 사실이다. 조건이 조금이라도 벗어나는 순간, 정확했던 값은 더 이상 정확하지 않은 값이 된다.

9장에서 살펴본 추상화는 이미 알고 있는 것에서 무엇을 버릴지 결정하는 일이었다. 핸들을 돌리면 차가 돈다는 사실만 남기고 랙과 피니언 기어를 시야 밖으로 밀어내는 작업이다. 지금 마주한 재전송 타임아웃 문제는 방향이 조금 다르다. 아직 보지 못한 조건, 즉 지방과 해외에서 접속할 사용자의 네트워크 환경까지 감당할 수 있는 규칙을 찾는 일이다. 하나는 이미 손에 쥔 것에서 무엇을 버릴지 정하는 문제고, 다른 하나는 아직 오지 않은 사례에도 통할 규칙을 남기는 문제다. 방향은 반대처럼 보이지만 실은 같은 동작의 양면이다. 무엇을 버릴지 제대로 판단해야만, 새로운 사례 앞에서도 여전히 통하는 무언가가 남는다. 사내 네트워크의 구체적인 지연 수치에 매달린 채 버리지 못했기 때문에, 그 값은 다른 조건 앞에서 무너졌다.

18장에서 살펴본 언어 모델의 학습도 같은 실패를 겪는다. 학습에 사용한 문장들을 지나치게 충실히 기억해 버리면, 그 문장과 거의 똑같은 입력에는 완벽하게 반응하면서도 조금만 다른 문장 앞에서는 엉뚱한 답을 내놓는다. 학습 데이터를 통째로 외운 것과, 그 데이터를 관통하는 규칙만 추려낸 것은 겉보기에 둘 다 학습이 잘된 것처럼 보인다. 차이는 처음 보는 사례 앞에 놓였을 때 드러난다. 사례를 그대로 붙잡고 있던 쪽은 무너지고, 규칙만 남긴 쪽은 여전히 작동한다. 재전송 타임아웃 값이 사내 네트워크라는 사례 하나에 지나치게 밀착해 있었던 것과 같은 실패다.

그렇다면 무엇을 버려야 하고 무엇을 남겨야 하는지는 어떻게 판단할 수 있을까. 여기에는 정해진 공식이 없다. 너무 많이 버리면 조건이 다른 상황에서도 뭉뚱그려 같은 답을 내놓는 무용한 규칙만 남고, 너무 적게 버리면 눈앞의 사례 하나에만 완벽하게 들어맞는 쓸모없는 규칙이 남는다. 재전송 타임아웃이라면 사내 네트워크의 지연 수치 그 자체가 아니라, 그 수치가 왜 그 정도였는지를 설명하는 조금 더 상위의 규칙, 이를테면 예상되는 왕복 지연에 여유분을 더한 값이라는 규칙을 남겨야 새로운 환경에서도 통한다. 무엇을 지우고 무엇을 남길지 판단하는 이 감각이야말로, 지능적으로 보이는 판단과 그렇지 않은 판단을 가르는 경계에 가깝다.

이렇게 보면 지능적으로 보이는 판단이란 사실 대부분 기억과 망각의 균형 문제로 환원된다. 그렇다면 이 균형을 잘 잡는 능력, 사례들 속에서 버릴 것과 남길 것을 가려내는 이 반복된 동작 자체를 하나의 이름으로 불러도 괜찮을까.