Lobsters

In Context

맥락 속의 데이터 — Rich Hickey의 Clojure destructuring 개선

Rich Hickey가 Clojure의 유연한 정보 처리와 정확성 문제를 설명하고, 데이터 구조의 변화를 견디면서 필요한 값과 기대 조건을 드러내는 destructuring 기능을 소개합니다. 강연은 선택자와 누락 처리 같은 새 지시자도 다루며, 정적 타입의 역할을 둘러싼 논쟁을 불러왔습니다.

에디터 노트

새 destructuring 지시자는 데이터 형식이 바뀌는 상황에서 필요한 키를 명시하고 나머지 필드를 다루려는 Hickey의 설계 목표와 맞닿아 있습니다. 특히 :excess를 활용해 관심 없는 값을 보존하거나 다시 합칠 수 있다는 반응은 유연한 소비자와 하위 호환성이라는 실용적 목적을 구체적으로 짚습니다. 다만 강연의 정적 타입 비판은 댓글에서 개념의 범위를 놓고 이견이 나왔습니다. @shonfeder는 정적 분석이 동적 시스템의 속성도 분석한다고 반박하며 의존 타입 등의 사례를 들었습니다. 따라서 새 기능의 가치는 타입 시스템 전반에 대한 Hickey의 주장과 분리해, Clojure의 데이터 접근과 destructuring을 얼마나 읽기 쉽고 견고하게 만드는지로 보는 편이 타당합니다. :missing과 nil의 구분이 실제 코드에서 어떤 이점을 주는지는 댓글에서도 의문으로 남았고, spec 연동은 1.13에 계획되지 않았다는 추가 설명이 있습니다.

AI 요약

Rich Hickey는 Clojure/Conj 2026 강연에서 데이터가 여러 프로그램과 환경을 오가는 시스템은 정보의 형태가 계속 바뀐다는 점을 전제로 설계해야 한다고 말합니다. 이때 프로그램이 기대하는 형식을 엄격히 고정하면 데이터에 필드를 추가하거나 형식을 바꿀 때 여러 소비자가 함께 깨질 수 있습니다. Hickey는 정보 중심 프로그램에서 형식과 절차, 데이터가 오가는 경로를 이해하기 쉽게 표현하면서 변화에도 대응하는 방법을 논의합니다.

정보 중심 프로그램과 정적 시스템

강연은 정적 시스템과 정보 중심 프로그래밍의 차이에서 출발합니다. Hickey는 시스템의 일부 내부 메커니즘에는 정적 타입이 유용하지만, 사람과 조직의 활동이나 의사결정 규칙을 다루는 정보 프로그램에서는 데이터 형식이 변하는 일이 흔하다고 주장합니다. 이런 프로그램은 같은 데이터 형식을 여러 시스템이 각기 다른 방식으로 만들고 읽고 저장하고 처리하는 환경에서 작동합니다. 데이터가 추가되거나 바뀌어도 필요한 부분만 읽는 유연성이 중요하다는 설명입니다.

그는 Clojure가 해시맵 같은 일반적인 데이터 구조를 중심으로 정보를 다루며, 여러 형식과 시스템 사이의 간극을 줄이는 설계를 지향한다고 설명합니다. 강연 후반에는 그 설계를 구체화하는 destructuring 기능을 다룹니다. 새 지시자는 필요한 키를 명시하고, 특정 키를 선택하거나 누락된 값과 남는 값을 다루는 표현을 추가합니다. 영상의 장 제목에는 destructuring과 context, 향상된 destructuring, 선택과 전달, 실패 처리, 프로그래밍 가능한 선택자가 포함됩니다. Hickey는 형식 검증이 데이터의 부재를 일괄 오류로 처리하기보다, 각 소비자가 자기 작업에 필요한 값을 요구하는 방식으로 유연성을 유지해야 한다는 취지를 설명합니다.

설계에 대한 반응

  • @veqq — 요약하면 Clojure에 destructuring 기능이 추가됩니다. Hickey는 정보 프로그램이 데이터 형식과 올바른 절차, 데이터 경로를 다뤄야 한다고 설명합니다. 정적 타입은 내부 메커니즘에는 잘 맞지만 정보 처리에는 덜 맞는다고 봅니다. destructuring에서 키를 확인하는 :keys! 지시자는 문서화와 기대 조건 표현에 도움이 됩니다. 해시맵이나 테이블에 키와 열이 추가돼도 프로그램이 필요한 값만 찾으면 작동할 수 있다는 생각입니다. 다만 선택을 말한다면 왜 select 함수로 만들지 않았는지 궁금합니다.
    • @dutc — 영상에서 Hickey는 전체 프로그래머 중 다수가 이런 프로그램을 만든다고 주장한 게 아니라, Clojure 프로그래머 다수가 이런 종류의 프로그램을 만든다고 말한 것으로 이해했습니다. 이런 프로그램은 정책을 표현한다고 볼 수 있습니다. 정책은 일관성보다 사람의 판단에 좌우되므로 타입 시스템에 정확성을 맡기기보다 사람이 검토하기 쉽고 바꾸기 쉬운 형태로 표현하는 편이 낫습니다.
    • @veqq — 그럴 수도 있겠네요. 표현을 조금 바꿨습니다. 이런 관점을 설명해줘서 고맙습니다. 때로는 현대 소프트웨어가 정확성을 지나치게 중시한다고 생각합니다. 사용성이 좋아진다면 몇 가지 오답을 감수할 때도 있습니다. LLM의 확산을 보면 사람들이 차이를 알아차리지 못하는 경우도 많습니다.
  • @shonfeder — 정적 분석은 분석 대상 시스템이 정적이어야 한다는 뜻이 아닙니다. 시스템 정의만 보고 동적 시스템의 여러 속성을 분석하는 방법입니다. 의존 타입은 시간에 따른 변화, 맥락 변화, 동시성, 분산 시스템도 표현하고 추론할 수 있습니다. 다만 Clojure에 추가된 데이터 선택과 변환 기능은 좋아 보입니다.
  • @rgm — :all, :select, :excess 지시자를 언어 핵심에 두는 발상은 흥미롭습니다. 특히 :excess는 신경 쓰지 않는 값을 무시한 뒤 다시 합쳐 하위 호환성을 지키는 데 유용해 보입니다. 반면 :missing은 Clojure에서 키 누락과 명시적인 nil을 구분해야 하는 경우가 얼마나 있는지 잘 모르겠습니다. 익숙해지기 전까지 실수할 것 같습니다.
  • @decentstates — Slack에서 나온 추가 정보입니다. Hickey는 이 기능을 spec과 연결하는 작업이 더 있을 수 있다고 언급했지만 Clojure 1.13에는 계획되지 않았다고 합니다. 개발은 약 1년 동안 진행됐습니다.

원문: ClojureTV / 번역·요약: Trawling