Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 50 additions & 7 deletions questions/2026.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,27 @@ sections:
help: 인턴은 넣고, 학생 때 혼자 공부한 기간은 빼 주세요.
options:
- { code: none, label: "아직 없어요" }
- { code: "0_2", label: "2년 이하" }
- { code: lt_1, label: "1년 미만" }
- { code: "1_2", label: "1~2년" }
- { code: "3_5", label: "3~5년" }
- { code: "6_9", label: "6~9년" }
- { code: "10_14", label: "10~14년" }
- { code: "15_plus", label: "15년 이상" }

- id: major
fixed: false

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Mark the major question as fixed

This change introduces major as a fixed demographic question, but fixed: false excludes it from the survey's fixed-question inventory—the updated test consequently counts only work_type as the additional fixed question. Future editions could then alter or omit major without recognizing that its wording and codes are intended to remain comparable across surveys; set this to true and update the expected fixed count to 34.

AGENTS.md reference: AGENTS.md:L9-L11

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

제가 제안을 통해 추가한 문항이기 때문에, fixed: false로 두어 고정 문항으로 설정하지 않았습니다. 추후 필요에 따라 고정 문항으로 변경할 수 있습니다.

type: single
order: nominal
label: 대학 전공은 무엇인가요?
help: 학생이라면 지금 전공을 골라 주세요. 복수전공이고 그중 컴퓨터 관련 전공이 있다면 그쪽을 골라 주세요.
options:
- { code: cs, label: "컴퓨터공학 등 컴퓨터 관련" }
- { code: stem, label: "그 밖의 이공계" }
- { code: humanities, label: "인문·사회·상경" }
- { code: arts, label: "예체능" }
- { code: none, label: "해당 없음" }
- { code: no_answer, label: "답하지 않을게요" }

- id: role
fixed: true
type: multi
Expand Down Expand Up @@ -123,7 +138,6 @@ sections:
- { code: midsize, label: "중견기업" }
- { code: small, label: "중소기업" }
- { code: startup, label: "스타트업" }
- { code: si_sm, label: "SI·SM 회사" }
- { code: public, label: "공공기관·공기업" }
- { code: foreign, label: "외국계 기업" }
- { code: none, label: "회사에 속해 있지 않아요" }
Expand All @@ -133,7 +147,7 @@ sections:
type: single
order: ordinal
label: 회사 직원은 모두 몇 명인가요?
show_if: { company_type: [large, midsize, small, startup, si_sm, public, foreign] }
show_if: { company_type: [large, midsize, small, startup, public, foreign] }
options:
- { code: lt_10, label: "10명 미만" }
- { code: "10_49", label: "10~49명" }
Expand All @@ -143,15 +157,27 @@ sections:
- { code: "5000_plus", label: "5,000명 이상" }
- { code: unknown, label: "잘 모르겠어요" }

- id: work_type
fixed: true
type: single
order: nominal
label: 지금 하는 일은 주로 어떤 형태인가요?
options:
- { code: own_service, label: "자사 서비스·제품 개발 (우리 회사의 앱, 플랫폼, 게임 등)" }
- { code: si, label: "SI (고객사 시스템을 새로 구축하는 프로젝트)" }
- { code: sm, label: "SM (고객사 시스템 운영·유지보수)" }
- { code: solution, label: "솔루션·패키지 (여러 고객사에 설치하고 맞춤 개발하는 제품)" }
- { code: agency, label: "외주 개발·에이전시 (웹·앱 제작 의뢰를 받아 개발)" }
- { code: inhouse_it, label: "사내 IT·전산 조직 (개발이 본업이 아닌 회사의 IT 부서. 예: 은행, 제조, 유통)" }
- { code: other, label: "기타" }

- id: contract_position
fixed: false
type: single
order: ordinal
label: 지금 하는 일은 발주 구조에서 어디쯤인가요?
help: 자사 서비스를 만든다면 첫 번째를 골라 주세요.
show_if: { company_type: [si_sm, none] }
show_if: { work_type: [si, sm, solution, agency] }
options:
- { code: owner, label: "발주처, 자사 서비스" }
- { code: prime, label: "원청" }
- { code: sub_1, label: "1차 하청" }
- { code: sub_2_plus, label: "2차 이하 하청" }
Expand Down Expand Up @@ -277,7 +303,7 @@ sections:
type: single
order: nominal
label: 첫 개발 일자리는 어떻게 구했나요?
show_if: { experience: ["0_2", "3_5", "6_9", "10_14", "15_plus"] }
show_if: { experience: [lt_1, "1_2", "3_5", "6_9", "10_14", "15_plus"] }
options:
- { code: open_recruit, label: "신입 공채" }
- { code: rolling, label: "수시 채용" }
Expand Down Expand Up @@ -583,6 +609,23 @@ sections:
- { code: stopped, label: "써 봤지만 지금은 안 써요" }
- { code: never, label: "써 본 적 없어요" }

- id: ai_not_using_reason
fixed: false
type: multi
order: nominal
limit: 2
label: AI 코딩 도구를 쓰지 않는 가장 큰 이유는 무엇인가요?
help: 두 개까지 고를 수 있어요.
show_if: { ai_frequency: [stopped, never] }
options:
- { code: banned, label: "회사에서 쓸 수 없어요 (망분리, 보안)" }
- { code: no_need, label: "필요성을 못 느껴요" }
- { code: distrust, label: "결과를 신뢰하기 어려워요" }
- { code: cost, label: "비용이 부담돼요" }
- { code: disappointing, label: "써 봤는데 별로였어요" }
- { code: no_time, label: "배울 시간이 없어요" }
- { code: other, label: "기타" }

- id: ai_model
fixed: false
type: single
Expand Down
2 changes: 1 addition & 1 deletion src/lib/lib.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ describe('CSV', () => {
expect(columns.slice(0, 3)).toEqual(['created_at', 'status', 'experience'])
expect(columns[columns.indexOf('role') + 1]).toBe('role_other')
expect(columns.length).toBe(1 + QUESTIONS.length + QUESTIONS.filter((q) => q.options.some((o) => o.code === 'other')).length)
expect(row).toContain('Z,student,,backend;other,게임 서버')
expect(row).toContain('Z,student,,,backend;other,게임 서버')
expect(row.endsWith('"좋아요, ""또"" 해요"')).toBe(true)
})
})
Expand Down
19 changes: 15 additions & 4 deletions src/questions/logic.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@ const ids = (answers: Record<string, string | string[]>) => visibleQuestions(QUE
const employed = {
status: 'employed',
experience: '3_5',
major: 'cs',
role: ['backend'],
region: 'seoul',
employment_type: 'permanent',
company_type: 'startup',
company_size: '10_49',
work_type: 'own_service',
work_mode: 'hybrid',
weekly_hours: '41_45',
job_satisfaction: '4',
Expand Down Expand Up @@ -43,9 +45,9 @@ const employed = {
}

describe('문항 원본', () => {
test('45문항, 고정 32개', () => {
expect(QUESTIONS.length).toBe(45)
expect(QUESTIONS.filter((q) => q.fixed).length).toBe(32)
test('48문항, 고정 33개', () => {
expect(QUESTIONS.length).toBe(48)
expect(QUESTIONS.filter((q) => q.fixed).length).toBe(33)
})

test('선택형 문항은 모두 선택지가 있고, options_from 도 풀린다', () => {
Expand Down Expand Up @@ -110,9 +112,18 @@ describe('응답 검증', () => {
})

test('숨겨진 문항의 답은 버린다', () => {
const result = cleanAnswers(QUESTIONS, { ...employed, company_type: 'none', company_size: '10_49', contract_position: 'prime' })
const result = cleanAnswers(QUESTIONS, {
...employed,
company_type: 'none',
company_size: '10_49',
work_type: 'agency',
contract_position: 'prime',
})
expect(result.ok && result.answers.company_size).toBeUndefined()
expect(result.ok && result.answers.contract_position).toBe('prime')
// 자사 서비스를 만들면 하청 위치를 묻지 않는다
const own = cleanAnswers(QUESTIONS, { ...employed, contract_position: 'prime' })
expect(own.ok && own.answers.contract_position).toBeUndefined()
})

test('필수 문항이 빠지면 거절한다', () => {
Expand Down
2 changes: 1 addition & 1 deletion src/questions/progress.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ const QUESTIONS = questionsFor('2026')!

describe('restoreProgress', () => {
test('저장한 답과 머물던 문항을 그대로 되살린다', () => {
const saved = { answers: { status: 'employed', experience: '3_5' }, qid: 'role' }
const saved = { answers: { status: 'employed', experience: '3_5', major: 'cs' }, qid: 'role' }
expect(restoreProgress(QUESTIONS, saved)).toEqual(saved)
})

Expand Down
Loading
Loading