config.json


config.json 파일은 트랙의 설정을 설명해요. 트랙의 연습 문제와 개념 같은 중요한 정보를 담고 있어요.

메타데이터

다음 최상위 속성들은 트랙의 일반적인 메타데이터를 담고 있어요:

  • language: 트랙의 언어예요 (예: "C#"). 길이는 255 이하여야 해요. (필수)
  • slug: 소문자 kebab-case 문자열로 나타낸 트랙의 언어예요 (예: "csharp"). 길이는 255 이하여야 해요. (필수)
  • active: 트랙이 활성 상태인지, 즉 학습자가 웹사이트에서 트랙에 참여할 수 있는지를 나타내는 boolean 값이에요 (필수)
  • blurb: 언어에 대한 짧은 설명이에요. 길이는 400 이하여야 해요. (필수)
  • version: config.json 파일의 버전이에요 (현재 3으로 고정되어 있어요) (필수)
  • online_editor: 온라인 에디터에 사용되는 설정을 설명하는 객체예요: (필수)
    • indent_style: "space" 또는 "tab" 중 하나예요 (필수)
    • indent_size: 정수로 나타낸 들여쓰기 크기예요 (예: 4) (필수)
    • highlightjs_language: Highlight.js의 언어 식별자예요 (전체 식별자 목록을 참고해요) (선택)
  • status: 어떤 v3 기능을 활성화할지 설명하는 객체예요: (필수)
    • concept_exercises: 개념 연습 문제가 만들어졌는지를 나타내는 boolean 값이에요 (필수). true이면 해당 트랙에 개념 연습 문제가 있다는 것을 나타내도록 Exercism 웹사이트 인터페이스가 바뀌어요.
    • test_runner: 테스트 러너가 구현되었는지를 나타내는 boolean 값이에요 (필수). true이면 제출된 풀이를 테스트 인프라를 통해 실행하고 그 결과를 웹사이트에 보여줘요. 웹사이트에서는 학습자가 온라인 에디터 안에서 직접 테스트 실행을 시작할 수도 있어요.
    • representer: representer가 구현되었는지를 나타내는 boolean 값이에요 (필수)
    • analyzer: analyzer가 구현되었는지를 나타내는 boolean 값이에요 (필수)
  • files: 연습 문제에서 사용되는 파일 위치의 패턴이에요, 연습 문제의 디렉터리를 기준으로 한 상대 경로예요. (선택)
    • solution: 스텁 구현 파일 패턴이에요 (선택)
    • test: 테스트 파일 패턴이에요 (선택)
    • example: 예제 구현 파일 패턴이에요 (선택)
    • exemplar: 모범 구현 파일 패턴이에요 (선택)
    • editor: 추가 읽기 전용 에디터 파일 패턴이에요 (선택)
  • test_runner: 트랙의 테스트 러너(있는 경우)를 설명하는 객체예요: (status.test_runner가 true이면 필수)
    • average_run_time: 테스트 러너가 실행되는 데 평균적으로 걸리는 시간(초)을 나타내는 정수 number 값이에요 (예: 4) (status.test_runner가 true이면 필수)
  • approaches: 트랙의 접근법에 대한 메타데이터가 담긴 객체예요: (트랙에 접근법이 하나라도 있으면 필수)
    • snippet_extension: 스니펫 파일의 확장자에 사용되는 문자열 값이에요 (예: rb) (트랙에 접근법이 하나라도 있으면 필수)

파일

이 키는 트랙 전체의 파일 위치를 지정하는 데 사용돼요. 관리자가 각 _연습 문제_의 config.json 파일에서 files 키를 직접 설정하지 않아도, configlet이 이 트랙 전체 패턴을 사용해 자동으로 채워줄 수 있어요.

files 객체에 정의된 파일 패턴은 다음 자리 표시자를 지원해요:

  • %{kebab_slug}: kebab-case 연습 문제 slug예요 (예: bit-manipulation)
  • %{snake_slug}: snake_case 연습 문제 slug예요 (예: bit_manipulation)
  • %{camel_slug}: camelCase 연습 문제 slug예요 (예: bitManipulation)
  • %{pascal_slug}: PascalCase 연습 문제 slug예요 (예: BitManipulation)

이 패턴을 사용해 연습 문제의 .meta/config.json 파일에 있는 files 키를 채우는 지원이 configlet에 추가될 예정이에요.

예시

{
  "language": "C#",
  "slug": "csharp",
  "active": true,
  "status": {
    "concept_exercises": true,
    "test_runner": true,
    "representer": false,
    "analyzer": false
  },
  "blurb": "C# is a modern, object-oriented language with lots of great features, such as type-inference and async/await. The tooling is excellent, and there is extensive, well-written documentation.",
  "version": 3,
  "online_editor": {
    "indent_style": "space",
    "indent_size": 4,
    "highlightjs_language": "csharp"
  },
  "test_runner": {
    "average_run_time": 2
  },
  "files": {
    "solution": [
      "%{pascal_slug}.cs"
    ],
    "test": [
      "%{pascal_slug}Tests.cs"
    ],
    "example": [
      ".meta/Example.cs"
    ],
    "exemplar": [
      ".meta/Exemplar.cs"
    ]
  }
}

연습 문제

최상위 exercises 키는 세 가지 키를 가질 수 있는 객체예요:

  • concept: 트랙의 개념 연습 문제를 나열한 배열이에요
  • practice: 트랙의 실습 연습 문제를 나열한 배열이에요
  • foregone: 트랙이 구현하지 않을 연습 문제의 slug를 나열한 배열이에요

개념 연습 문제

각 개념 연습 문제는 exercises.concept 배열의 항목이에요. 연습 문제는 이 파일에 나열된 순서와 같은 순서로 웹사이트에 표시되며, 일반적으로 풀어야 하는 순서와 일치해야 해요. 다음 필드로 개념 연습 문제가 구성돼요:

  • uuid: 연습 문제를 고유하게 식별하는 V4 UUID예요. UUID는 트랙 안에서뿐만 아니라 모든 트랙에 걸쳐 고유해야 하며, 절대 바뀌어서는 안 돼요
  • slug: 연습 문제의 slug로, 소문자 kebab-case 문자열이에요. slug는 트랙 안의 모든 개념 및 실습 연습 문제 slug에 걸쳐 고유해야 해요. 길이는 255 이하여야 해요.
  • name: 연습 문제의 이름이에요. 길이는 255 이하여야 해요.
  • concepts: 이 개념 연습 문제에서 가르치는 개념 slug의 배열이에요
  • prerequisites: 학습자가 이 연습 문제를 시작하기 전에 잠금 해제해야 하는 개념 slug의 배열이에요
  • status (선택): 연습 문제의 상태로, "wip", "beta", "active", "deprecated" 중 하나예요. 지정하지 않으면 기본값은 "active"예요
    • wip: 아직 공개적으로 사용할 준비가 되지 않은 진행 중인 연습 문제예요. 이 태그가 붙은 연습 문제는 UI에서 학습자에게 표시되지 않고 잠금 해제 로직에도 사용되지 않아요. 관리자에게는 보일 수 있어요.
    • beta: 새로 추가되어 피드백을 받고 싶은 활성 연습 문제를 나타내요. 이런 연습 문제에는 웹사이트에 beta 라벨을 표시하고, "의견을 보내주세요."라는 행동 유도 문구를 함께 보여줘요.
    • active: 활성 연습 문제의 일반적인 상태예요
    • deprecated: 아직 시작하지 않은 학습자에게 더 이상 표시되지 않는(이 단계에서는 사용할 수 없는) 연습 문제예요. 자세한 내용은 지원 중단된 연습 문제를 참고해요.

예시

{
  "exercises": {
    "concept": [
      {
        "slug": "cars-assemble",
        "name": "Cars, Assemble!",
        "uuid": "93fbc7cf-3a7e-4450-ad22-e30129c36bb9",
        "concepts": [
          "if-statements",
          "numbers"
        ],
        "prerequisites": [
          "basics"
        ]
      },
      ...
    ]
  }
}

진행 중인 작업 예시

{
  "exercises": {
    "concept": [
      {
        "slug": "cars-assemble",
        "name": "Cars, Assemble!",
        "uuid": "93fbc7cf-3a7e-4450-ad22-e30129c36bb9",
        "concepts": [
          "if-statements",
          "numbers"
        ],
        "prerequisites": [
          "basics"
        ],
        "status": "wip"
      },
      ...
    ]
  }
}

실습 연습 문제

각 실습 연습 문제는 exercises.practice 배열의 항목이에요. 다음 필드로 실습 연습 문제가 구성돼요:

  • uuid: 연습 문제를 고유하게 식별하는 V4 UUID예요. UUID는 트랙 안에서뿐만 아니라 모든 트랙에 걸쳐 고유해야 하며, 절대 바뀌어서는 안 돼요
  • slug: 연습 문제의 slug로, 소문자 kebab-case 문자열이에요. slug는 트랙 안의 모든 개념 및 실습 연습 문제 slug에 걸쳐 고유해야 해요. 길이는 255 이하여야 해요.
  • name: 연습 문제의 이름이에요. 길이는 255 이하여야 해요.
  • practices: 연습 문제가 학습자의 연습을 돕는 개념 slug의 배열이에요
  • prerequisites: 학습자가 연습 문제를 시작하기 전에 잠금 해제해야 하는 개념 slug의 배열이에요
  • difficulty: 연습 문제의 난이도를 나타내는 숫자예요. 숫자는 1(가장 쉬움)부터 10(가장 어려움)까지의 범위여야 해요. 웹사이트는 난이도를 다음과 같이 해석해요:
    • 1,2,3: 쉬움
    • 4,5,6,7: 보통
    • 8,9,10: 어려움
  • status (선택): 연습 문제의 상태로, "wip", "beta", "active", "deprecated" 중 하나예요. 지정하지 않으면 기본값은 "active"예요
    • wip: 아직 공개적으로 사용할 준비가 되지 않은 진행 중인 연습 문제예요. 이 태그가 붙은 연습 문제는 UI에서 학습자에게 표시되지 않고 잠금 해제 로직에도 사용되지 않아요. 관리자에게는 보일 수 있어요.
    • beta: 새로 추가되어 피드백을 받고 싶은 활성 연습 문제를 나타내요. 이런 연습 문제에는 웹사이트에 beta 라벨을 표시하고, "의견을 보내주세요."라는 행동 유도 문구를 함께 보여줘요.
    • active: 활성 연습 문제의 일반적인 상태예요
    • deprecated: 아직 시작하지 않은 학습자에게 더 이상 표시되지 않는(이 단계에서는 사용할 수 없는) 연습 문제예요.

웹사이트에서 실습 연습 문제의 "권장 순서"는 practice 배열에서 연습 문제의 순서와 일치해요.

예시

{
  "exercises": {
    "practice": [
      {
        "slug": "leap",
        "name": "Leap",
        "uuid": "8ba15933-29a2-49b1-a9ce-70474bad3007",
        "practices": [
          "if-statements",
          "numbers",
          "operator-precedence"
        ],
        "prerequisites": [
          "if-statements",
          "numbers"
        ],
        "difficulty": 1
      },
      ...
    ]
  }
}

beta 예시

{
  "exercises": {
    "practice": [
      {
        "slug": "leap",
        "name": "Leap",
        "uuid": "8ba15933-29a2-49b1-a9ce-70474bad3007",
        "practices": [
          "if-statements",
          "numbers",
          "operator-precedence"
        ],
        "prerequisites": [
          "if-statements",
          "numbers"
        ],
        "difficulty": 1,
        "status": "beta"
      },
      ...
    ]
  }
}

제외한 연습 문제

트랙이 Problem Specifications 저장소에 정의된 연습 문제를 구현하고 싶지 않다고 판단하면, 그 연습 문제의 slug를 exercises.foregone 키에 추가할 수 있어요. configlet은 트랙의 미구현 연습 문제를 출력할 때 제외한 연습 문제를 무시해요.

트랙이 연습 문제를 구현하지 않기로 할 수 있는 이유는 다음과 같아요:

  • 언어가 그 연습 문제를 합리적으로 구현할 수 없는 경우예요. 예를 들어 lens-person 연습 문제는 언어가 _lens_를 지원해야 해요.
  • 연습 문제의 주제가 그 언어에 맞지 않는 경우예요. 예를 들어 일부 고수준 언어에서는 저수준 비트 조작 연습 문제가 의미가 없을 수 있어요.

예시

{
  "exercises": {
    "foregone": [
      "lens-person"
    ]
  }
}

개념

각 개념은 최상위 concepts 배열의 항목이에요. 다음 필드로 개념이 구성돼요:

  • uuid: 개념을 고유하게 식별하는 V4 UUID예요. UUID는 트랙 안에서뿐만 아니라 모든 트랙에 걸쳐 고유해야 하며, 절대 바뀌어서는 안 돼요
  • slug: 개념의 slug로, 소문자 kebab-case 문자열이에요. slug는 트랙 안의 모든 개념에 걸쳐 고유해야 해요. 길이는 255 이하여야 해요.
  • name: 개념의 이름이에요. 길이는 255 이하여야 해요.
  • tags: 제출물이 어떤 접근법에 연결되는지에 대한 조건을 지정해요. (선택)
    • all: 제출물에 모두 있어야 하는 태그의 배열이에요 (선택이지만, any에 요소가 없으면 필수예요)
    • any: 제출물에 최소 하나는 있어야 하는 태그의 배열이에요 (선택이지만, all에 요소가 없으면 필수예요)
    • not: 제출물에 어떤 태그도 있어서는 안 돼요 (선택)

예시

{
  "concepts": [
    {
      "uuid": "b9a421b2-c5ff-4213-bd6d-b886da31ea0d",
      "slug": "numbers",
      "name": "Numbers",
      "tags": {
        "all": [
          "concept:number"
        ]
      }
    }
  ]
}

주요 특징

언어의 주요 특징은 그 언어의 가장 중요한 특징이 무엇인지 간결하게 설명해요. 잠재적인 학습자에게 언어의 더 흥미로운 특징을 알리기 위한 것이에요. 제목은 가능한 한 전문 용어를 적게 쓰도록 노력해야 하며, 학습자가 그 언어를 배우기 전에는 언어별 전문 용어가 무엇을 뜻하는지 익숙하지 않을 수 있다는 점을 염두에 둬요.

주요 특징은 최상위 key_features 필드에 지정되며, 다음 필드를 가진 객체의 배열로 정의돼요:

  • title: 주요 특징을 나타내는 간결한 제목이에요. 길이는 25 이하여야 해요. Markdown은 지원되지 않아요.
  • content: 주요 특징에 대한 설명이에요. 길이는 100 이하여야 해요. Markdown은 지원되지 않아요.
  • icon: 특징에 표시할 아이콘이에요. 이름과 상관없이 어울린다고 생각하는 아이콘을 고를 수 있어요. 다음 아이콘을 사용할 수 있어요:
    • community
    • concurrency
    • cross-platform
    • documentation
    • dynamically-typed
    • easy
    • embeddable
    • evolving
    • expressive
    • extensible
    • fast
    • fun
    • functional
    • garbage-collected
    • general-purpose
    • homoiconic
    • immutable
    • interactive
    • interop
    • multi-paradigm
    • portable
    • powerful
    • productive
    • safe
    • scientific
    • small
    • stable
    • statically-typed
    • tooling
    • web
    • widely-used

이 아이콘들의 실제 모양은 주요 특징 아이콘 섹션에서 확인할 수 있어요.

정확히 6개의 주요 특징을 지정해야 해요.

예시

{
  "key_features": [
    {
      "title": "Fault-tolerant",
      "content": "Elixir runs on the Erlang VM, known for running low-latency, distributed and fault-tolerant systems.",
      "icon": "safe"
    },
    ...
  ],
}

태그

트랙에는 태그를 달 수 있고, 이를 통해 특정 태그 조합을 가진 트랙을 검색할 수 있어요.

트랙은 언어의 일반적인 사용 방식을 기준으로 태그를 골라야 해요. 예를 들어 학습자가 "머신러닝을 하고 싶은데 어떤 언어를 골라야 할까?", "함수형 프로그래밍을 배우고 싶은데 어떤 언어를 골라야 할까?"라고 생각한다고 해봐요. 해당 언어가 좋은 후보라면 그 태그를 붙여요. 언어가 몇 가지 함수형 아이디어를 지원하지만 거의 쓰이지 않거나, 소수만 그 언어로 머신러닝을 하지만 드문 경우라면 그 태그는 붙이지 않아요.

태그는 최상위 tags 필드에 지정되며, 문자열의 배열로 정의돼요. 다음 태그를 사용할 수 있어요 (범주별로 묶었어요):

패러다임

  • paradigm/array: 언어가 배열 프로그래밍 언어예요
  • paradigm/declarative: 언어가 선언형 프로그래밍 스타일을 지원해요
  • paradigm/functional: 언어가 함수형 프로그래밍 스타일을 지원해요
  • paradigm/imperative: 언어가 명령형 프로그래밍 스타일을 지원해요
  • paradigm/logic: 언어가 논리 기반 프로그래밍 스타일을 지원해요
  • paradigm/object_oriented: 언어가 객체 지향 프로그래밍 스타일을 지원해요
  • paradigm/procedural: 언어가 절차형 프로그래밍 스타일을 지원해요
  • paradigm/stack-oriented: 언어가 스택 지향 프로그래밍 스타일을 지원해요

타입

  • typing/static: 언어가 정적 타입을 사용해요
  • typing/gradual: 언어가 점진적 타입을 사용해요
  • typing/dynamic: 언어가 동적 타입을 사용해요
  • typing/strong: 언어가 강한 타입을 사용해요
  • typing/weak: 언어가 약한 타입을 사용해요

실행 모드

  • execution_mode/compiled: 코드가 실행되기 전에 먼저 컴파일돼요
  • execution_mode/interpreted: 코드가 직접 해석돼요

플랫폼

  • platform/windows: Windows에서 실행돼요
  • platform/mac: Mac에서 실행돼요
  • platform/linux: Linux에서 실행돼요
  • platform/ios: iOS에서 실행돼요
  • platform/android: Android에서 실행돼요
  • platform/web: 브라우저에서 실행돼요

런타임

  • runtime/standalone_executable: 독립 실행 파일로 실행돼요
  • runtime/language_specific: 언어별 런타임에서 실행돼요
  • runtime/clr: 공용 언어 런타임(.NET)에서 실행돼요
  • runtime/jvm: JVM(Java)에서 실행돼요
  • runtime/beam: BEAM(Erlang)에서 실행돼요
  • runtime/wasmtime: Wasmtime(WebAssembly)에서 실행돼요

용도

  • used_for/artificial_intelligence: 인공지능
  • used_for/backends: 백엔드
  • used_for/cross_platform_development: 크로스 플랫폼 개발
  • used_for/embedded_systems: 임베디드 시스템
  • used_for/financial_systems: 금융 시스템
  • used_for/frontends: 프런트엔드
  • used_for/games: 게임
  • used_for/guis: GUI
  • used_for/mobile: 모바일
  • used_for/robotics: 로봇공학
  • used_for/scientific_calculations: 과학 계산
  • used_for/scripts: 스크립트
  • used_for/web_development: 웹 개발

한 범주에서 여러 태그를 포함하는 것은 전혀 문제가 없어요.

예시

{
  "tags": [
    "paradigm/declarative",
    "paradigm/functional",
    "paradigm/object_oriented",
    "platform/linux",
    "platform/windows",
    "runtime/jvm"
  ]
}

예시

다음은 올바른 config.json 파일이 어떤 모습인지 보여주는 예시예요:

{
  "language": "C#",
  "slug": "csharp",
  "active": true,
  "status": {
    "concept_exercises": true,
    "test_runner": true,
    "representer": false,
    "analyzer": false
  },
  "blurb": "C# is a modern, object-oriented language with lots of great features, such as type-inference and async/await. The tooling is excellent, and there is extensive, well-written documentation.",
  "version": 3,
  "online_editor": {
    "indent_style": "space",
    "indent_size": 4,
    "highlightjs_language": "csharp"
  },
  "test_runner": {
    "average_run_time": 2
  },
  "files": {
    "solution": [
      "%{pascal_slug}.cs"
    ],
    "test": [
      "%{pascal_slug}Tests.cs"
    ],
    "example": [
      ".meta/Example.cs"
    ],
    "exemplar": [
      ".meta/Exemplar.cs"
    ]
  },
  "exercises": {
    "concept": [
      {
        "slug": "lucians-luscious-lasagna",
        "name": "Lucian's Luscious Lasagna",
        "uuid": "7d358894-4fbd-4c91-b49f-d68f1c5aa6bc",
        "concepts": [
          "basics"
        ],
        "prerequisites": []
      },
      {
        "slug": "cars-assemble",
        "name": "Cars, Assemble!",
        "uuid": "93fbc7cf-3a7e-4450-ad22-e30129c36bb9",
        "concepts": [
          "if-statements",
          "numbers"
        ],
        "prerequisites": [
          "basics"
        ],
        "status": "wip"
      }
    ],
    "practice": [
      {
        "slug": "hello-world",
        "name": "Hello, World!",
        "uuid": "6c88f46b-5acb-4fae-a6ec-b48ae3f8168f",
        "practices": [
          "strings"
        ],
        "prerequisites": [
          "basics"
        ],
        "difficulty": 1
      },
      {
        "slug": "leap",
        "name": "Leap",
        "uuid": "8ba15933-29a2-49b1-a9ce-70474bad3007",
        "practices": [
          "if-statements",
          "numbers",
          "operator-precedence"
        ],
        "prerequisites": [
          "if-statements",
          "numbers"
        ],
        "difficulty": 2,
        "status": "beta"
      }
    ]
  },
  "concepts": [
    {
      "uuid": "2eb4a463-355f-46ef-ac55-a75ec5afdf86",
      "slug": "basics",
      "name": "Basics"
    },
    {
      "uuid": "4466e33e-dcd2-4b1f-9d9d-2c4315bf5188",
      "slug": "if-statements",
      "name": "If Statements"
    },
    {
      "uuid": "b9a421b2-c5ff-4213-bd6d-b886da31ea0d",
      "slug": "numbers",
      "name": "Numbers"
    },
    {
      "uuid": "7a86561d-173b-45c0-a53c-1ffd7b9ff259",
      "slug": "strings",
      "name": "Strings"
    }
  ],
  "key_features": [
    {
      "title": "Modern",
      "content": "C# is a modern, fast-evolving language.",
      "icon": "expressive"
    },
    {
      "title": "Cross-platform",
      "content": "C# runs on almost any platform and chipset.",
      "icon": "cross-platform"
    },
    {
      "title": "Multi-paradigm",
      "content": "C# is primarily an object-oriented language, but also has lots of functional features.",
      "icon": "multi-paradigm"
    },
    {
      "title": "General purpose",
      "content": "C# can be used for a wide variety of workloads, like websites, console applications, and even games.",
      "icon": "general-purpose"
    },
    {
      "title": "Tooling",
      "content": "C# has excellent tooling, with linting and advanced refactoring options built-in.",
      "icon": "tooling"
    },
    {
      "title": "Documentation",
      "content": "Documentation is excellent and exhaustive, making it easy to get started with C#.",
      "icon": "documentation"
    }
  ],
  "tags": [
    "paradigm/declarative",
    "paradigm/functional",
    "paradigm/object_oriented",
    "platform/linux",
    "platform/windows",
    "runtime/jvm"
  ]
}