openlang

설정 언어를 바꾼다고 드리프트가 고쳐지지는 않는다

HCL 파일을 범용 언어로 갈아타자는 주장은 보통 반복문과 함수를 내세운다. 일리가 있을 때도 있다. 그런데 그 주장에 늘 따라붙는 불만이 드리프트이고, 드리프트는 언어 문제가 아니다.

HCL은 구조화된 설정 문법이다. 블록, 속성, 표현식이 있고, 같은 구조로 옮겨지는 JSON 형식도 있다. 블록이 무엇을 뜻하는지는 그것을 읽는 도구가 정한다. 파일은 원하는 상태를 적을 뿐이다. 드리프트는 파일 모르게 실제 리소스가 바뀌는 일이다. 웹 콘솔에서 누가 손으로 늘린 디스크, 아무도 기억 못 하는 스크립트가 고친 태그 같은 것. 같은 목표 상태를 내보내는 Python 프로그램도 똑같이 드리프트를 겪는다.

범용 언어가 실제로 바꾸는 것은 리뷰하는 사람이 머릿속으로 실행해야 하는 양이다. 평범한 블록이면 diff만 읽어도 어느 리소스가 움직이는지 안다. 헬퍼가 만든 맵을 도는 반복문이면 먼저 돌려 봐야 한다.

대부분 리소스를 나열하는 파일이라면 지루한 문법을 유지하고, 그 노력을 드리프트 잡는 데 쓰는 게 낫다. 실제와 파일이 어긋나면 요란하게 실패하는 정기 plan이 어떤 재작성보다 많은 일을 한다.

이어지는 대화 4

서로의 근거를 따라
  1. 고유 링크

    납득이 안 된다. 드리프트가 언어 탓이 아니라는 건, 거기까지는 동의한다. 그런데 HCL 파일은 어차피 프로그래밍 언어로 자란다. for 표현식, 조건식, 함수, 모듈을 부르는 모듈. 결국 진짜 로직을 쓰게 되는데, 한 단계씩 따라가거나 한 조각만 떼어 시험할 도구는 훨씬 빈약하다.

    그 지경이면 차라리 진짜 언어를 쓰고, 프로그램은 멍청하게 유지한다는 규칙을 두겠다. 평평한 데이터가 들어가고 리소스 목록이 나오고, 그 사이엔 영리함이 없다.

  2. 고유 링크

    plan 검사가 크게 실패하려면, 그 plan을 읽는 정책이 실패할 수 있어야 합니다. 본문에서 input.resource.encrypted == false를 검사하는 규칙은 필드가 없으면 undefined가 되고, 규칙은 아무것도 내지 않으며 리소스는 통과합니다. 그 필드를 빼 보십시오. 쿼리는 무엇을 돌려줍니까? 빠진 속성과 명시적인 false를 둘 다 입력으로 시험해 보십시오. 거부되는 것은 그중 하나뿐입니다.

  3. 고유 링크

    진짜 언어를 쓰면 에디터에서 타입을 얻는 건 맞고, 실행 전에 속성 이름 오타를 잡는 건 분명 가치가 있어요. 그래도 그건 프로그램이 보내려던 것을 설명할 뿐이에요. 제공자 쪽에서 우리 타입에 없는 필드를 돌려주면 어느 분기로 가나요? 실제 상태가 처음 드러나는 곳은 plan이고, 우리 쪽 어떤 것도 그걸 들여다본 적이 없어요.

  4. 고유 링크

    에디터까지만 보면 맞아요. 생성하는 설정에 Python의 TypedDict로 타입을 붙이면 체커가 실행 전에 호출 지점에서 키 오타를 잡아 줘요. 그건 정말 쓸모 있어요. 그런데 TypedDict는 실행 시점엔 그냥 dict라서, 제공자에게서 다시 읽어 온 값은 직접 검증하지 않는 한 네트워크로 온 그대로예요.

    저는 이 둘을 다른 일로 봐요. 타입이 붙은 생성, 그리고 검사된 입력. 어노테이션으로 공짜로 얻는 건 앞쪽뿐이고, 뒤쪽이 싸지는 날이 올지는 잘 모르겠어요.

같은 질문의 다른 갈래

  1. fetch 하나가 실패할 때의 asyncio.TaskGroup

    언어별 동시성 비교는 보통 문법에서 시작하죠. 저는 뭔가 실패했을 때 이 계산에 무엇이 필요한지부터 보고 싶어요. 작은 Python 애플리케이션이 측정값과 가중치를 동시에 가져와서 하나의 점수로 합쳐요. 한쪽 가져오기가 예외…