- Kagi Search 백엔드 채용 과정에서 한 개발자가 터미널 느낌의 이메일 클라이언트를 일주일가량 풀타임으로 구현했지만, 제출 후 후속 인터뷰 없이 탈락함
- 과제는 TUI 또는 웹앱, 기본 이메일 조회·발송, 가짜 백엔드 또는 IMAP/POP/JMAP 선택 등으로 열려 있어 구현 범위와 평가 기준을 지원자가 직접 판단해야 했음
- 지원자는 Go 웹앱, AWS ECS Fargate, SSL, Postmark, 로그인, Pulumi, Pocketbase, TEMPL 등을 포함한 상세 계획을 미리 보냈지만, Kagi 측은 구체적인 합격 기준을 알려주지 않음
- 탈락 후 요청한 피드백에는 “더 단순하고 강한 제출물”이 있었다는 답만 돌아왔고, 이 단계에서는 보통 개별 피드백을 제공하지 않는다고 안내됨
- 이 경험은 무급 과제형 면접과 시간 제한 코딩 퍼즐이 실제 엔지니어링 역량보다 지원자의 시간과 생활 여건을 더 크게 시험할 수 있음을 보여줌
지원과 과제 수령
- 지원자는 Kagi Search의 백엔드 역할에 이력서를 보냈고, 역할 요약에는 다음 역량이 포함돼 있었음
- 백엔드 시스템 구축 경험
- Go 숙련도
- 백엔드 시스템 확장·유지보수 이해
- SRE 및 팀원과의 협업 능력
- Docker 같은 컨테이너화 기술 이해
- 이후 Kagi로부터 다음 단계로 Kagi Developer Assessment를 완료해 달라는 이메일을 받음
- 과제 URL은 HackMD로 전달됨
- 완료 후 연락하면 검토하고, 통과 시 후속 인터뷰에서 접근 방식과 솔루션을 논의하겠다는 내용이 포함됨
과제 요구사항과 열린 평가 기준
- 과제 목표는 “최소한의 터미널 느낌 이메일 클라이언트”를 만드는 것이었음
- 구현 조건은 비교적 넓게 열려 있었음
- 이메일 클라이언트는 터미널 TUI 또는 웹앱으로 구현 가능
- 기본 이메일 조회와 발송 기능 필요
- 가짜 백엔드(DB, 인메모리 등) 또는 실제 IMAP/POP/JMAP 백엔드 사용 가능
- 리치 텍스트 메시지는 제외하고 일반 텍스트만 처리하면 됨
- 평가 대상은 코딩 능력뿐 아니라 Kagi Labs 같은 R&D 프로젝트에 필요한 모호함과 열린 문제 처리 능력까지 포함한다고 안내됨
- 산출물 조건은 다음과 같았음
- 개발자로서의 역량을 보여주는 방식으로 구현
- 완료된 프로젝트를 GitHub 저장소에 올리고, 쉽게 테스트할 수 있도록 어딘가에 배포
- README에 설정 방법 작성
채용 담당자와의 커뮤니케이션
- 지원자는 요구사항이 너무 넓다고 보고 채용 담당자에게 질문을 보냄
- 담당자는 후보자가 많으며, 어떤 후보자는 기본만 구현하고 어떤 후보자는 추가 기능, 훌륭한 문서화, 의사결정 설명, 데모 배포, 향후 계획까지 제공한다고 답함
- 어떤 추가 기능이 높게 평가되는지 묻자, 담당자는 “그 자체가 평가의 일부”라며 후보자가 떠올리는 추가 기능을 보겠다고 답함
- 지원자는 실제 코딩 전에 전체 산출물의 구현 계획을 자세히 작성해 보내기로 함
- 제안이 받아들여지면 전화 인터뷰나 채용 제안에 가까워질 수 있다고 기대함
- 이후 결과를 보며, 사전에 조건을 맞추려 한 노력이 채용 담당자에게 큰 의미가 없었다고 판단함
지원자가 제안한 구현
- 제안의 중심은 Go 웹앱 기반 이메일 클라이언트였음
- AWS에 배포
- ECS Fargate 사용
- SSL/HTTPS 적용
- 이메일 발송 제공자와 통합
- 로그인 화면을 통한 인증
- 폼 기반 이메일 발송
- UI에서 수신 이메일 표시
- 제안서에는 산출일을 3월 30일 일요일 EOD로 잡았고, 최초 이메일 이후 2주 시점보다 영업일 기준 이틀 늦은 일정이라고 적음
- 기술 선택은 다음과 같았음
- Go 백엔드: Pocketbase와 TEMPL 사용
- 인프라 코드: Pulumi 사용, TypeScript SDK 선택
- 이메일 서비스 제공자: Postmark 사용
- UI: 발신·수신 이메일 페이지네이션, 로그인 화면, 데모용 계정 2개 제공
- 선택 이유는 역할과 평가 범위를 넓게 보여주려는 쪽에 가까웠음
- 백엔드 역할이지만 웹 프런트엔드 추가가 웹 기술 폭을 보여줄 수 있음
- 데이터베이스는 백엔드 역할과 관련 있음
- AWS와 인프라 코드 배포는 IaC, Docker, 네트워킹, 복원력 논의와 연결됨
- Postmark 같은 이메일 서비스는 IMAP/POP 통합 복잡도를 줄이면서 기능을 유지함
- 지원자는 “완성하면 Kagi에서 어떤 반응을 기대할 수 있는지”를 물었지만, 답장은 “매우 흥미롭고 제출을 기대한다”는 수준에 머묾
제출물과 탈락
- 지원자는 제안한 내용을 모두 구현했고, 전체 작업에 일주일 풀타임이 걸렸다고 밝힘
- 웹 애플리케이션 데모는 YouTube에 올렸고, 코드는 문서와 함께 GitHub에 공개함
- 자동 탈락 메일을 받은 뒤 피드백을 요청하자, Kagi 측은 다음과 같이 답함
- 이 단계에서는 보통 피드백을 제공하지 않음
- 더 단순하고 강한 제출물이 있어 해당 후보들과 계속 진행하기로 함
- 각 포지션에 많은 관심과 지원이 있어 선택 과정이 매우 경쟁적임
- 향후 포지션을 계속 확인하고 다시 지원해 달라고 함
탈락 이후 남은 의문
- 지원자는 “더 단순한 솔루션”을 원했다면 3월 18일 제안서를 보냈을 때 말할 수 있었다고 봄
- 솔루션이 역할에 맞지 않았다면, 마찬가지로 3월 18일 제안서 단계에서 판단할 수 있었다고 여김
- 5월 13일 기준 탈락 후 한 달 반이 지났는데도 채용 공고가 여전히 올라와 있었다고 적음
- 회사가 같은 공고로 여러 역할을 채울 수 있다는 점은 인정함
- 다만 “승자 자리가 이미 찬 경쟁”처럼 보기는 어렵다고 판단함
- 원래 과제 지침에서는 데모 배포가 있으면 좋지만 필수는 아니었는데, 제출 이후 지침이 배포를 엄격한 요구사항으로 바뀌었다고 적음
더 나은 선발 방식에 대한 제안
- 지원자는 무급 과제가 구직자, 특히 실직 상태에서 저축이 줄어드는 사람들에게 큰 부담이라고 비판함
- LeetCode식 인터뷰에도 부정적임
- 최근 Clojure 기반 역할에서 “coin change” 문제를 풀었고, 50분 안에 테스트 절반 정도는 통과했지만 backtracking 부분을 구현할 시간이 부족했다고 적음
- 대안으로 라이브 코드 리뷰를 제안함
- 비동기 또는 동기 방식 모두 가능하다고 봄
- 실제 소프트웨어 프로젝트의 문제와 주제를 말로 풀어갈 수 있음
- 경험 많은 소프트웨어 엔지니어의 지식을 더 잘 드러낼 수 있음
- 라이브 코딩 자체를 완전히 반대하지는 않지만, 50분 안에 knapsack을 푸는 능력은 일상적인 엔지니어 업무와 거리가 멀다고 봄
- 절박한 상황이 아니라면 이런 종류의 무급 작업을 요구하는 역할을 거절하라고 권함