자기소개와 지원 동기 - 1분 안에 기억에 남기
이 장에서 배우는 것
앞 장에서 면접은 지원자의 지식뿐 아니라 판단의 근거와 협업 가능성을 확인하는 자리라는 점을 살펴보았다. 자기소개는 그 판단에 필요한 첫 번째 단서를 건네는 답변이다. 살아온 일을 모두 요약하는 시간이 아니라, 어떤 개발자로 일하려고 하는지와 그 말을 뒷받침할 경험을 고르는 시간이다.
가상의 중고 거래 서비스 팀에 지원한 신입 개발자 지우를 따라 자기소개와 지원 동기를 다듬는다. 지우는 수업 프로젝트로 거래 게시판을 만들었지만 실무 경험은 없다. 경험을 크게 포장하는 대신 자신이 맡은 행동과 확인한 결과를 구분해 말하는 연습을 한다.
- 직무에 연결되는 결론, 경험의 근거, 입사 후 기여를 묶어 1분 자기소개를 구성한다.
- 지원 동기를 회사에 대한 칭찬에서 직무와 해결하고 싶은 문제로 옮긴다.
- 상황·과제·행동·결과(STAR)로 경험을 정리하고 자신의 행동을 구분한다.
- 강점·약점과 비전공·전직 경험을 확인 가능한 행동으로 설명한다.
- Python 점검기로 빠진 경험 항목과 압축이 필요한 답변을 찾는다.
문제 상황
지우가 1차 기술 면접에 들어간다. 면접관은 지원서를 덮지 않은 채 “간단히 자기소개해 주세요”라고 말한다. 지우는 교육 과정, 사용한 언어, 팀원 수, 프로젝트 기능을 차례로 나열한다. 답변이 길어지자 면접관은 “그중 본인이 가장 잘했다고 생각하는 일은 무엇인가요”라고 묻는다. 지우는 준비한 순서를 잃고 같은 기능 목록을 다시 말한다.
문제는 경험의 양이 적다는 데 있지 않다. 듣는 사람이 기억할 중심 문장이 없고, 팀의 결과와 지우의 행동이 섞여 있다는 데 있다. 중고 거래 서비스 팀이 알고 싶은 것은 언어 이름 몇 개를 외웠는지가 아니다. 거래 과정에서 사용자가 겪는 불편을 어떻게 이해하고, 맡은 일을 어떤 근거로 진행했는지다.
이 장에서는 지우가 팀 과제에서 맡았던 ‘상품 등록 안내 개선’을 중심 경험으로 삼는다. 팀 내부 시연에서 필수 항목을 빠뜨린 뒤 작성 내용이 사라지는 문제가 있었다. 지우는 안내 문구와 입력값 유지 처리를 맡았다. 여기서 제시하는 확인 결과는 모두 가상 경험 안의 기록이며, 실제 서비스 전체의 성과로 확대하지 않는다.
| 질문 | 의도 | 답변 핵심 | 꼬리 질문 |
|---|---|---|---|
| 1분 동안 자기소개해 주세요. | 경험을 직무 중심으로 요약하는가 | 개발자로서의 방향과 대표 근거 하나 | 왜 그 경험을 골랐나요? |
| 이 직무에 지원한 이유는 무엇인가요? | 업무를 이해하고 선택했는가 | 관심 문제, 직무의 역할, 경험의 연결 | 다른 직무에서도 할 수 있지 않나요? |
| 우리 서비스에서 관심 있는 문제는 무엇인가요? | 관찰과 추측을 구분하는가 | 관찰한 흐름과 검증할 가설 | 사용자도 그렇게 느낄까요? |
| 본인의 강점은 무엇인가요? | 강점에 반복 가능한 근거가 있는가 | 행동 습관과 그것이 드러난 경험 | 그 강점이 방해된 적도 있나요? |
| 보완해야 할 약점은 무엇인가요? | 문제를 인식하고 조정하는가 | 업무 영향, 개선 행동, 남은 한계 | 지금도 같은 문제가 생기나요? |
| 기억에 남는 경험을 말해 주세요. | 맥락과 기여를 구분하는가 | 상황, 과제, 행동, 결과 | 직접 한 행동은 어디까지인가요? |
| 왜 개발자로 방향을 바꿨나요? | 전환의 이유와 준비를 확인한다 | 전환 계기, 해 본 일, 남은 학습 | 이전 경험은 어떻게 도움이 되나요? |
| 전공 지식의 부족함은 어떻게 채우나요? | 학습 방법이 구체적인가 | 부족한 주제와 확인 방법 | 최근 이해를 수정한 사례가 있나요? |
| 눈에 띄는 성과가 없으면 무엇을 말하겠어요? | 성과를 과장하지 않고 설명하는가 | 완료한 행동과 관찰 가능한 변화 | 결과가 없었다면 무엇을 배웠나요? |
| 입사 후 어떤 개발자가 되고 싶나요? | 방향이 실제 업무와 연결되는가 | 가까운 업무 목표와 학습 계획 | 먼저 익혀야 할 것은 무엇인가요? |
기억할 문장 하나를 중심으로 자기소개를 구성한다
1분 자기소개에는 ‘어떤 개발자인가 → 무엇으로 설명할 수 있는가 → 어떤 일에 기여하고 싶은가’라는 흐름이 유용하다. 첫 문장은 성격을 선언하기보다 일하는 방식을 드러내야 한다. “열정적인 개발자다”보다 “사용자가 막히는 지점을 재현하고 수정 결과를 확인하는 개발자를 지향한다”가 다음 질문으로 이어지기 쉽다.
시간은 도입 약 10초, 경험 약 35초, 연결 약 15초로 나눠 연습할 수 있다. 이는 채점 기준이 아니라 분량을 조절하는 출발점이다. 실제로 소리 내 읽고 자연스러운 속도로 맞춰야 한다. 제한 시간에 문장을 욱여넣기 위해 빨리 말하면 경험의 의미가 전달되기 어렵다.
같은 질문에 답하더라도 구체성에 따라 면접관이 확인할 수 있는 정보가 달라진다. 다음 비교에서 좋은 답은 화려한 성과를 추가한 답이 아니다. 주장과 근거가 연결되고, 경험의 범위를 밝힌 답이다.
| 수준 | 답변 예시 | 면접관이 얻는 정보 | 보완 방향 |
|---|---|---|---|
| 나쁜 답 | 어떤 일이든 잘하고 빨리 배우는 개발자다. 여러 기술을 공부했으니 맡겨 주면 모두 해낼 수 있다. | 주장은 크지만 확인할 경험이 없다. | 범위를 줄이고 직접 한 일을 붙인다. |
| 보통 답 | Python으로 중고 거래 게시판을 만들었다. 상품 등록 기능을 담당했고 팀원과 협업했다. | 사용 기술과 담당 기능을 알 수 있다. | 어떤 문제에서 어떤 행동을 했는지 설명한다. |
| 좋은 답 | 사용자가 입력 중 막히는 지점을 확인하는 개발자를 지향한다. 상품 등록 안내를 수정하고 같은 시연 절차로 다시 확인했다. 팀 내부 확인이라는 한계가 있어 실제 이용 기록도 배우고 싶다. | 관심 문제, 행동, 검증 범위를 알 수 있다. | 지원 직무의 업무와 자연스럽게 연결한다. |
깊게 보기: “1분 동안 자기소개해 주세요”
모범 답안은 결론을 먼저 말하고, 그 결론을 지지하는 근거와 경험을 제시한 뒤 한계와 다음 행동으로 닫는다. 자기소개에서 한계를 길게 설명할 필요는 없다. 경험을 실제보다 크게 받아들이지 않도록 범위를 짧게 밝히면 된다.
사용자가 막히는 지점을 재현하고 수정 결과를 확인하는 개발자를 지향하는 지우다. 기능을 만드는 데서 끝내지 않고 사용 흐름을 다시 확인하는 습관이 있기 때문이다. 중고 거래 게시판 과제에서는 상품 등록 실패 뒤 입력 내용이 사라지는 문제를 발견했다. 나는 필수 항목 안내와 입력값 유지 처리를 맡고, 팀원과 같은 절차로 다시 시연했다. 준비한 누락 사례에서 안내와 입력 유지가 동작하는 것을 확인했다. 다만 팀 내부 확인에 그쳤으므로 실제 사용자에게도 도움이 되는지는 추가 검증이 필요하다. 입사 후에는 거래 과정의 불편을 팀의 기준에 따라 확인하고 개선하는 데 기여하고 싶다.
이 답변은 그대로 외울 원고가 아니라 구성의 예다. 실제 경험이 다르면 문제, 행동, 확인 범위를 바꿔야 한다. “같은 절차”와 “누락 사례”가 무엇이었는지도 본인의 기록으로 설명할 수 있어야 한다.
면접관: “왜 그 경험을 자기소개에 넣었나요?”
지원자: “내가 맡은 행동과 수정 뒤 확인한 내용을 가장 분명하게 설명할 수 있기 때문이다. 큰 성과를 낸 경험은 아니지만, 문제를 발견한 뒤 확인까지 이어 간 방식을 보여 준다고 생각했다.”
면접관이 다른 경험을 요청하면 준비한 문장을 반복하지 않는다. 자기소개의 중심은 유지하되 다른 근거를 제시하거나, 아직 반복해서 입증할 만큼 경험이 많지 않다고 범위를 밝힌다.
지원 동기는 직무와 문제에 연결한다
회사에 대한 관심과 직무 선택의 이유는 연결되지만 같은 답은 아니다. “서비스를 자주 사용한다”는 말은 관심의 출발점이다. 그 뒤에 어떤 문제를 보았고, 왜 개발 업무로 그 문제를 다루고 싶으며, 어떤 준비를 했는지가 이어져야 지원 동기가 된다.
중고 거래 서비스에서는 등록 중 이탈, 거래 상태의 혼동, 신고 처리의 불편 등 여러 문제를 떠올릴 수 있다. 그러나 외부에서 본 화면만으로 원인과 우선순위를 단정할 수는 없다. “이 기능이 잘못됐다”보다 “이 흐름에서 혼동이 생길 수 있다고 보았고, 실제 문의와 사용 기록으로 확인하고 싶다”가 관찰의 범위를 더 정확히 표현한다.
깊게 보기: “이 직무에 지원한 이유는 무엇인가요?”
나쁜 답은 “성장하는 회사라서 지원했다”에서 끝난다. 보통 답은 “서비스가 편리하고 Python을 사용해 봐서 지원했다”처럼 관심과 기술 경험을 나열한다. 좋은 답은 해결하고 싶은 문제와 지원 직무에서 맡을 일을 연결한다. 공개된 직무 설명을 읽었다면 확인한 업무만 근거로 삼고, 알지 못하는 내부 환경을 추측해 말하지 않는다.
거래를 시작하는 과정에서 사용자가 실패 이유를 이해할 수 있도록 만드는 개발 업무에 관심이 있어 지원했다. 입력을 받는 기능도 실패 상황을 어떻게 처리하느냐에 따라 사용 경험이 달라지기 때문이다. 과제에서 상품 등록 안내와 입력값 유지를 맡으며 그 차이를 확인했다. 이 경험을 바탕으로 등록과 거래 상태를 다루는 업무를 더 배우고 싶다. 다만 실제 서비스의 우선 과제는 아직 모르므로, 입사 후에는 팀이 수집한 문의와 사용 기록을 먼저 이해하고 맡은 범위에서 기여하겠다.
면접관: “다른 직무에서도 사용자 불편을 개선할 수 있지 않나요?”
지원자: “그렇다. 안내 문구나 화면 구성도 함께 개선해야 한다고 생각한다. 나는 그중 입력 처리와 실패 이후의 동작을 직접 구현하고 확인하는 일에 흥미가 있어 개발 직무를 선택했다. 어떤 개선이 필요한지는 다른 직무의 관찰도 함께 듣겠다.”
이 대응은 개발 업무의 가치를 높이려고 다른 직무를 낮추지 않는다. 관심 문제는 여러 직무가 공유할 수 있고, 지원자는 그중 자신이 맡고 싶은 행동을 설명하면 된다. 특정 회사에만 관심이 있다는 문장을 억지로 만드는 것보다, 확인한 서비스 특성과 실제 준비를 연결하는 편이 설득력 있다.
경험과 자기평가는 행동으로 설명한다
상황은 일이 벌어진 배경이고, 과제는 그때 자신이 책임져야 했던 목표다. 행동은 목표를 위해 직접 한 일이며, 결과는 그 뒤 확인한 변화다. 네 항목을 나누면 배경 설명만 길어지거나 팀의 성과를 자신의 행동처럼 말하는 문제를 발견하기 쉽다.
상황과 과제를 구분하는 질문은 간단하다. “무슨 일이 있었는가”에는 상황으로 답하고, “그 안에서 내가 맡은 것은 무엇인가”에는 과제로 답한다. 행동에는 선택과 실행을 적는다. 결과에는 관찰한 내용을 적되, 확인하지 못했다면 그 사실과 이후 계획을 구분해 쓴다. 계획만 있는 문장을 이미 얻은 결과처럼 말해서는 안 된다.
깊게 보기: “기억에 남는 경험을 말해 주세요”
나쁜 답은 “팀원들과 열심히 해서 잘 마무리했다”다. 보통 답은 배경과 결과는 있지만 자신이 한 일이 흐릿하다. 좋은 답은 맡은 범위와 행동을 밝히고, 결과를 확인한 방법까지 붙인다. 네 항목은 답변을 준비하는 틀이지, 면접에서 항목 이름을 차례로 읽어야 한다는 뜻은 아니다.
상품 등록 실패 뒤 사용자가 다시 입력해야 하는 부담을 줄인 경험이 기억에 남는다. 기능 완료 여부만 보던 관점을 사용 흐름까지 넓힌 계기였기 때문이다. 팀 내부 시연에서 필수 항목을 누락하면 입력 내용이 사라졌고, 나는 안내와 입력값 유지 처리를 맡았다. 먼저 누락 조건을 정리한 뒤 항목별 안내를 수정하고, 실패 후에도 작성 내용이 남도록 처리했다. 수정 전과 같은 누락 사례로 다시 확인해 준비한 사례에서 기대한 동작을 확인했다. 다만 외부 사용자의 재입력 부담이 실제로 얼마나 줄었는지는 측정하지 못했으므로, 그 성과까지 주장하지는 않겠다.
면접관: “팀이 한 일과 본인이 한 일을 구분해 주세요.”
지원자: “등록 기능의 기본 흐름은 팀이 함께 만들었다. 그중 누락 조건 정리, 안내 수정, 입력값 유지 처리는 내가 맡았다. 재시연은 팀원과 함께 진행했으므로 확인 결과는 공동 작업의 결과다.”
결과에 숫자가 없다고 약한 경험이 되는 것은 아니다. 재현 조건을 정리한 기록, 누락 사례의 통과 여부, 팀이 합의한 완료 기준도 근거가 된다. 수치를 쓰려면 무엇을 어떻게 셌는지 설명할 수 있어야 한다. 기억이 불확실한 수치를 만들어 넣는 것보다 확인한 범위를 정확히 말하는 편이 낫다.
깊게 보기: “강점과 약점은 무엇인가요?”
강점은 성격의 별명이 아니라 업무에서 반복되는 행동으로 설명한다. 약점은 듣기 좋은 장점으로 바꾸기보다 실제 영향을 인정하고 조정 방법을 붙인다. 예를 들어 “꼼꼼해서 시간이 걸린다”만 말하면 어떤 문제가 얼마나 개선됐는지 알기 어렵다.
내 강점은 재현 조건을 기록하는 습관이다. 조건이 있어야 다른 사람도 같은 문제를 확인할 수 있기 때문이다. 등록 실패를 공유할 때 입력 순서와 누락 항목을 함께 남겼고, 팀원이 같은 상황을 확인하는 데 활용했다. 다만 모든 기록을 길게 남기면 확인 부담이 생기므로 현재는 재현에 필요한 조건부터 적는다.
약점은 막힌 문제를 혼자 오래 붙드는 경향이다. 과제 중 해결 방향을 공유하지 않아 팀원이 진행 상태를 알기 어려웠던 적이 있다. 이후 정한 확인 시간이 지나도 진전이 없으면 시도한 방법과 막힌 지점을 정리해 공유했다. 아직 낯선 문제에서는 공유가 늦어질 때가 있어, 작업을 시작할 때 중간 공유 시점을 함께 정한다.
면접관: “그 약점은 이제 해결됐나요?”
지원자: “완전히 없어졌다고 보지는 않는다. 최근 과제에서는 정한 시점에 진행 상태를 공유했지만, 익숙하지 않은 문제에서 지킬 수 있는지는 더 확인해야 한다. 그래서 개인 의지에만 맡기지 않고 공유 시점을 작업 계획에 넣고 있다.”
강점과 약점이 같은 경험에서 나와도 모순은 아니다. 기록을 잘하면서도 도움 요청은 늦을 수 있다. 다만 약점을 말한 뒤 실제로 바꾼 행동이 없다면, 앞으로 할 계획과 이미 시도한 행동을 분리해 답한다.
비전공자와 전직자는 전환 전후의 행동을 잇는다
전공이나 이전 직업을 방어하는 데 답변 대부분을 쓰지 않는다. 전환 계기, 직접 해 본 개발 활동, 이전 경험이 도움이 되는 지점, 보완할 지식을 차례로 정리한다. “비전공자라 더 노력했다”보다 무엇을 만들고 어떤 이해를 확인했는지가 중요하다.
이전에 고객 문의를 정리한 경험이 있다면 사용자의 설명에서 재현 조건을 묻는 태도에 연결할 수 있다. 그렇다고 고객 응대 경험이 곧 개발 역량을 입증하지는 않는다. 개발 역량은 실제 구현과 검증 경험으로 별도 설명해야 한다. 이전 경력의 가치를 인정하면서 새 직무에서 아직 배우는 부분도 구분한다.
예를 들어 “반복 문의를 정리하다 입력 오류가 생기는 조건에 관심을 가졌고, 이후 거래 게시판을 만들며 안내 처리를 직접 구현했다. 문의를 구조화하는 경험은 도움이 됐지만 자료구조와 데이터 처리 지식은 과제와 학습으로 계속 보완하고 있다”라고 연결할 수 있다. 전환 이유는 과거를 부정하는 서사보다 앞으로 할 일을 선택한 근거가 되어야 한다.
완성 코드
다음 프로그램을 main.py로 저장한다. 경험 기록을 네 칸으로 나누고, 공백뿐인 칸과 전체 답변의 길이를 점검한다. 길이는 공백 문자를 제외한 글자 수로 세며, 이 실험에서는 180자를 넘으면 압축 대상으로 표시한다. 이는 1분을 판정하는 기준이 아니다. 작성한 경험 메모 중 먼저 줄여 볼 대상을 찾는 임시 기준이다.
세 기록은 정상 기록, 결과가 빠진 기록, 행동 설명이 반복되는 기록이다. 같은 경험도 기록 방식에 따라 점검 결과가 달라지는지 비교한다. 입력, 외부 파일, 현재 시각, 난수를 사용하지 않으므로 실행할 때마다 같은 결과가 나온다.
from dataclasses import dataclass
FIELDS = (
("S", "상황"),
("T", "과제"),
("A", "행동"),
("R", "결과"),
)
MAX_CHARS = 180
@dataclass(frozen=True)
class Experience:
title: str
situation: str
task: str
action: str
result: str
def parts(self) -> tuple[str, ...]:
return (
self.situation,
self.task,
self.action,
self.result,
)
def compact_length(text: str) -> int:
return sum(1 for char in text if not char.isspace())
def inspect(item: Experience) -> tuple[list[str], bool]:
parts = item.parts()
missing = [
label
for (_, label), value in zip(FIELDS, parts, strict=True)
if not value.strip()
]
total = compact_length("".join(parts))
return missing, total > MAX_CHARS
def main() -> None:
long_action = "누락 조건을 정리하고 안내 문구를 수정했다. " * 12
records = (
Experience(
"등록 안내 개선",
"내부 시연에서 등록 실패 뒤 입력이 사라졌다.",
"나는 안내와 입력값 유지 처리를 맡았다.",
"누락 조건을 정리하고 안내와 유지 처리를 수정했다.",
"같은 누락 사례에서 안내와 입력 유지를 확인했다.",
),
Experience(
"확인 기록 누락",
"내부 시연에서 등록 실패 뒤 입력이 사라졌다.",
"나는 안내와 입력값 유지 처리를 맡았다.",
"누락 조건을 정리하고 안내와 유지 처리를 수정했다.",
" ",
),
Experience(
"행동 설명 반복",
"내부 시연에서 등록 실패 뒤 입력이 사라졌다.",
"나는 안내와 입력값 유지 처리를 맡았다.",
long_action,
"같은 누락 사례에서 안내와 입력 유지를 확인했다.",
),
)
print("경험 기록 점검")
print(f"길이 기준: 공백 제외 {MAX_CHARS}자 초과")
for index, item in enumerate(records, start=1):
print()
print(f"[{index}] {item.title}")
for (symbol, label), value in zip(
FIELDS, item.parts(), strict=True
):
status = "있음" if value.strip() else "비어 있음"
print(f"{symbol} {label}: {status}")
missing, too_long = inspect(item)
print("빠진 칸: " + (", ".join(missing) if missing else "없음"))
print("길이 점검: " + ("압축 필요" if too_long else "기준 이내"))
if missing:
print("다음 행동: 빠진 칸을 사실로 채운다.")
elif too_long:
print("다음 행동: 반복을 줄이고 핵심 행동을 남긴다.")
else:
print("다음 행동: 소리 내 읽고 근거를 확인한다.")
if __name__ == "__main__":
main()
줄별 해설
from dataclasses import dataclass는 표준 라이브러리의 데이터 클래스 기능을 가져온다. 경험 한 건에 들어갈 항목을 한곳에 선언하기 위해 사용한다. 네 칸을 위치만 다른 문자열로 흩어 놓는 것보다 각 값의 의미를 읽기 쉽다.
FIELDS는 항목 기호와 한국어 이름을 출력 순서대로 보관한다. MAX_CHARS는 압축 후보를 고르는 기준이다. 숫자를 이름 있는 상수로 두면 기준을 바꿀 위치와 적용 범위가 분명해진다.
@dataclass(frozen=True) 아래의 다섯 필드는 제목과 네 가지 경험 내용을 나타낸다. 실행 중 필드에 다른 값을 다시 대입하지 않도록 설정했다. parts()의 반환문은 상황, 과제, 행동, 결과를 정해진 순서로 묶는다. 이 순서는 FIELDS의 순서와 같아야 한다.
compact_length()는 문자열을 한 글자씩 살핀다. isspace()가 거짓인 글자만 하나씩 센다. 따라서 일반 공백뿐 아니라 줄바꿈과 탭도 길이에서 제외한다. 문장부호는 센다. 이 값은 발화 시간이나 의미 단위의 개수가 아니다.
inspect()는 먼저 네 칸을 꺼낸다. 목록 내포는 항목 이름과 값을 짝지은 뒤, strip()으로 앞뒤 공백을 제거했을 때 빈 문자열이 되는 칸의 이름을 모은다. strict=True는 두 묶음의 길이가 다를 때 조용히 일부만 처리하는 대신 오류를 드러낸다.
"".join(parts)는 네 칸을 합쳐 전체 길이를 구하기 위한 문자열을 만든다. 공백을 제외해 세므로 칸 사이에 구분 공백을 추가할 필요가 없다. 반환값의 첫 항목은 빠진 칸 목록이고, 두 번째 항목은 기준 초과 여부다. 정확히 180자라면 초과가 아니며 181자부터 압축 대상으로 분류한다.
main()의 long_action은 같은 문장을 열두 번 반복한다. 긴 기록을 만들기 위한 실험 자료다. 프로그램이 반복을 분석해서 찾아내는 것은 아니다. 반복된 기록이 전체 길이 기준에 걸리는지 확인한다.
records에는 세 경험을 고정해 넣는다. 두 번째 기록의 결과는 공백 세 칸이다. 값이 존재하는지만 검사하면 놓칠 수 있는 누락을 의도적으로 만든다. 세 번째 기록은 행동 설명만 길게 바꾸어 비교 조건을 단순하게 유지한다.
첫 두 print()는 제목과 기준을 출력한다. enumerate(..., start=1)는 사람이 읽기 편하게 기록 번호를 1부터 붙인다. 안쪽 반복문은 각 칸을 출력하고, 내용이 있는지 여부를 표시한다. 실제 원고를 화면에 모두 출력하지 않아 긴 기록도 결과를 비교하기 쉽다.
inspect(item) 뒤의 두 출력문은 누락과 길이를 각각 보여 준다. 마지막 조건문은 누락 보완을 먼저 안내하고, 누락이 없을 때 압축을 안내한다. 두 문제가 동시에 있어도 길이 결과는 이미 출력되며, 다음 행동의 우선순위만 정하는 구조다.
마지막 조건문은 이 파일을 직접 실행할 때 main()을 호출한다. 모든 입력이 파일 안에 고정되어 있고 외부 상태를 읽지 않으므로 결과를 재현하기 쉽다.
실행 결과
macOS 또는 Linux에서 Python 3.12 이상으로 다음 명령을 실행한다.
python3 main.py
예상 출력은 다음과 같다.
경험 기록 점검
길이 기준: 공백 제외 180자 초과
[1] 등록 안내 개선
S 상황: 있음
T 과제: 있음
A 행동: 있음
R 결과: 있음
빠진 칸: 없음
길이 점검: 기준 이내
다음 행동: 소리 내 읽고 근거를 확인한다.
[2] 확인 기록 누락
S 상황: 있음
T 과제: 있음
A 행동: 있음
R 결과: 비어 있음
빠진 칸: 결과
길이 점검: 기준 이내
다음 행동: 빠진 칸을 사실로 채운다.
[3] 행동 설명 반복
S 상황: 있음
T 과제: 있음
A 행동: 있음
R 결과: 있음
빠진 칸: 없음
길이 점검: 압축 필요
다음 행동: 반복을 줄이고 핵심 행동을 남긴다.
첫 기록은 네 칸이 있고 길이도 기준 이내다. 그렇다고 면접 답변으로 충분하다는 뜻은 아니다. 두 번째 기록은 짧지만 결과가 없다. 세 번째 기록은 네 칸을 모두 채웠지만 압축할 필요가 있다. 완전성과 길이는 서로 다른 축이라는 점이 드러난다.
이 점검기는 문장의 진실성, 본인 기여의 정확성, 질문과의 관련성을 판정하지 않는다. “좋은 결과가 있었다”라는 모호한 문장도 비어 있지 않다고 처리한다. 따라서 기계 점검 뒤에는 각 칸에 구체적인 사실이 있는지 사람이 읽고 확인해야 한다.
실무에서 자주 틀리는 것
공백으로 채운 결과를 작성 완료로 본다
문자열 자체의 참·거짓만 검사하면 공백도 내용으로 취급한다. 경험 기록을 복사하거나 칸을 지울 때 이런 값이 남을 수 있다.
# 틀린 코드
result = " "
has_result = bool(result)
# 고친 코드
result = " "
has_result = bool(result.strip())
고친 코드는 빈칸을 찾을 뿐이다. 실제 확인을 하지 못했다면 “아직 재확인하지 못했다”처럼 현재 상태를 적고, 이후 계획을 결과와 구분한다. 점검을 통과하려고 결과를 만들어 넣지 않는다.
글자 수를 발화 시간으로 단정한다
숫자, 기호, 낯선 기술 용어는 읽는 속도에 영향을 준다. 같은 글자 수라도 쉬는 위치와 말투에 따라 시간이 달라진다. 임의의 비율로 1분 통과 여부를 확정하면 원고를 잘못 조정할 수 있다.
# 틀린 코드
estimated_seconds = compact_length(answer) / 5
fits_one_minute = estimated_seconds <= 60
# 고친 코드
needs_compression = compact_length(answer) > MAX_CHARS
next_step = "소리 내 읽으며 실제 발화 시간을 따로 확인한다."
코드는 압축 후보를 찾고, 사람은 실제 발화를 확인한다. 연습할 때 시간을 재더라도 듣는 사람이 내용을 따라갈 수 있는 속도를 유지해야 한다.
키워드가 있으면 좋은 경험으로 판정한다
“개선했다”와 “협업했다”라는 단어가 있어도 구체적인 행동과 근거가 없을 수 있다. 키워드 탐색은 표현의 존재를 확인할 뿐 경험의 질을 증명하지 않는다.
# 틀린 코드
good_answer = "개선" in answer and "협업" in answer
# 고친 코드
review_questions = (
"내가 직접 한 행동은 무엇인가?",
"결과를 어떤 조건에서 확인했는가?",
"팀의 기여와 내 기여를 구분했는가?",
)
고친 코드는 자동 합격 판정을 없애고 사람이 검토할 질문을 남긴다. 실제 기록을 읽으며 각 질문에 답할 수 있는지 확인해야 한다. 짧은 기준 몇 개로 지원자의 역량 전체를 평가하려 하지 않는다.
긴 답변을 문자열 앞부분만 남겨 줄인다
앞부분에는 상황 설명이 있고 뒷부분에는 결과가 있는 경우가 많다. 길이에 맞춰 자르면 답변을 지지하는 핵심 근거가 사라질 수 있다.
# 틀린 코드
short_answer = answer[:180]
# 고친 코드
revised = Experience(
title="압축한 등록 안내 경험",
situation="내부 시연에서 등록 실패 뒤 입력이 사라졌다.",
task="나는 안내와 입력값 유지 처리를 맡았다.",
action="누락 조건을 정리하고 안내와 유지 처리를 수정했다.",
result="같은 누락 사례에서 기대한 동작을 확인했다.",
)
압축은 중요한 사실을 고르는 편집이다. 같은 행동을 되풀이한 문장과 없어도 이해되는 배경부터 줄인다. 과제, 본인 행동, 확인한 결과는 가능한 한 유지한다. 그래도 길다면 서로 다른 경험을 한 답변에 넣었는지 살펴본다.
한눈에 보기
| 대상 | 먼저 말할 것 | 붙일 근거 | 마지막 점검 |
|---|---|---|---|
| 1분 자기소개 | 직무와 연결되는 방향 하나 | 대표 경험의 행동과 확인 결과 | 소리 내 읽어 시간과 이해도를 확인한다. |
| 지원 동기 | 다루고 싶은 문제와 직무 선택 | 관찰과 준비 경험 | 외부 관찰을 내부 사실로 단정하지 않는다. |
| 경험 답변 | 무엇을 한 경험인지 | 상황, 과제, 행동, 결과 | 개인 기여와 공동 결과를 나눈다. |
| 강점 | 반복되는 업무 행동 | 행동이 도움이 된 사례 | 적용 범위와 조정 방법을 설명한다. |
| 약점 | 실제 업무에 생긴 영향 | 이미 시도한 개선 행동 | 남은 문제와 앞으로의 계획을 구분한다. |
| 전공·직무 전환 | 전환 이유와 직접 해 본 일 | 이전 경험의 연결점과 개발 경험 | 이전 경력으로 새 직무 역량을 대신하지 않는다. |
| 코드 점검 | 빠진 칸과 압축 후보 | 공백 제거 검사와 전체 길이 | 내용의 정확성과 발화 시간은 별도 확인한다. |
다음 장에서는 자기소개에서 짧게 언급한 프로젝트를 더 깊게 설명한다. 여기서는 대표 경험을 고르고 자신의 행동과 결과를 분리해 두면 충분하다. 기술 선택의 이유와 구현 중 어려움은 경험 기록에 별도 메모해 두되 자기소개에 모두 넣지는 않는다.
연습 문제
- 자신의 경험 하나를 네 칸으로 나눈다. 결과를 확인하지 못했다면 현재 상태와 다음 확인 계획을 구분해 적는다. 각 칸에서 사실을 뒷받침할 기록도 하나씩 찾아본다.
- “유명한 서비스이고 많이 성장할 수 있을 것 같아 지원했다”라는 답을 직무와 문제에 연결해 고친다. 관찰한 사실 하나, 맡고 싶은 행동 하나, 아직 모르는 점 하나를 포함한다.
- 완성 코드에 상황과 결과가 모두 공백이고 행동은
long_action인 기록을 추가한다. 출력될 빠진 칸, 길이 점검, 다음 행동을 실행 전에 예상한다. - “협업을 잘한다”를 중심 문장으로 자기소개를 준비했다고 가정한다. 이를 확인할 꼬리 질문 두 개를 만들고, 근거가 부족할 때 중심 문장을 어떻게 좁힐지 쓴다.
정답과 해설
개인 경험에 따라 내용은 달라진다. 상황에는 문제가 생긴 배경, 과제에는 맡은 목표, 행동에는 직접 한 일, 결과에는 확인한 상태가 들어가야 한다. 예를 들어 결과를 확인하지 못했다면 “수정은 완료했으나 같은 조건의 재시연은 하지 못했다”가 현재 상태다. “다음 모임에서 같은 조건으로 확인하겠다”는 계획이다. 기록은 작업 메모, 변경 내역, 시연 체크 항목 등이 될 수 있으며 실제 보유한 자료만 근거로 삼는다.
가능한 답은 “상품 등록에서 실패 이유를 이해하기 쉽게 만드는 개발 업무에 관심이 있다. 직접 사용한 흐름에서는 필수 항목 안내가 등록 완료에 영향을 줄 수 있다고 보았다. 과제에서 안내와 입력값 유지를 구현한 경험을 바탕으로 관련 업무를 배우고 싶다. 다만 실제로 사용자가 어디서 어려움을 겪는지는 모르므로 팀의 문의 기록과 확인 결과를 먼저 이해하겠다”다. 관찰한 화면과 실제 사용자 문제를 구분했다는 점이 핵심이다.
빠진 칸은 출력 순서에 따라 “상황, 결과”가 된다. 반복된 행동만으로도 길이 기준을 넘으므로 길이 점검은 “압축 필요”다. 다음 행동은 누락을 먼저 처리하므로 “빠진 칸을 사실로 채운다.”가 출력된다. 두 문제는 함께 표시되지만 행동 안내에는 우선순위가 적용된다. 누락을 채운 뒤에도 길이는 다시 점검해야 한다.
꼬리 질문은 “의견이 달랐을 때 본인이 한 행동은 무엇인가요”와 “그 행동이 상대에게 도움이 됐다는 근거가 있나요”로 만들 수 있다. 실제 근거가 진행 기록을 공유한 한 번의 경험뿐이라면 “협업을 잘한다”보다 “진행 상황을 기록해 공유하려고 노력한다”로 범위를 좁힌다. 넓은 평가를 유지하려고 경험을 늘려 말하는 대신, 확인 가능한 행동을 중심으로 답변을 다시 구성한다.