처음 해본 과제 테스트 후기

·2022년 8월 2일
1

주저리

목록 보기
36/46

7월 30일부터 7월 31일까지는 취업준비를 하면서 처음 과제테스트라는 것을 보게 되었다.
(그래서 이틀간의 블로그 공백, 어제는 그냥 체력적으로 부담이 너무 심해서 아무것도 못하고 잠만 잤다..)

나에게는 상당히 특별한 경험이었고, 많은 고민을 했기에 공유하고자 적어보는 포스팅이다.

처음부터 특별했던 채용 프로세스

7월 24일, 트위터 DM으로 이런 연락이 왔다.

(과제테스트에 대한 이야기도 언급할 예정이라 회사에 대한 정보가 노출될 수 없기에 자르고 가려놨습니다.)

이름을 말하면 어지간한 사람은 다 알법한 회사의 개발 리더분께서 저런 연락을 주셨다.
커피챗을 거절을 할 이유도 없기도 했지만, 내 마음을 더 크게 흔들었던 것은
구직이 아니더라도 보고싶다. 제가 찾아가는 쪽도 괜찮다. 라는 것이였다.

내가 어디에 사는지도 모르고, 서울이 아닌 타지에 살지도 모르는데 저렇게 말을 하는 것이 절대로 쉽지 않기에
그리고 구직이 아니라면 전적으로 회사의 입장에서는 도움이 되는 것이 없기에 더더욱 그랬다.
그저 나라는 사람이 궁금했기에 저런 연락을 주셨으리라 생각하여 조금 감동을 받았던 것 같기도 하고

나 제법 괜찮은 취준생인가

커피챗에서 있었던 이야기들

여러가지 이야기를 나눴는데, 그 중 채용 프로세스에 관한 이야기들이 많이 오갔다.

그리고 나왔던 것은, 그 회사는 내가 사용하는 언어아닌 다른 언어를 사용하고 있다는 점.
과제 테스트가 존재한다는 점이였다. 여기서 나는 고장났다(ㅋㅋ)

내가 사용해본 적이 없는 언어에 과제테스트까지 있다면 회사에 관심있다면 지원해볼 생각이 있느냐 라거나
같이 오셨던 팀원분도 회사 문화라던가 다양한게 좋다고 지원할 생각 없냐고 여쭤보셨기에 의문이 커졌다.

그래서 제가 지금 사용하는 언어는 다른데, 제가 사용하는 언어로 응시할 수 있냐 라고 여쭤봤다.

솔직한 마음으로 제가 회사에 합격 여부를 확신할 수 없는데
그 언어와 프레임워크를 배워서 테스트에 임하다는 것은 취준생 입장에서 리스크가 매우 크다고 이야기를 드렸다.

그랬더니 이야기를 한번 해보겠다고 하셨고, 결국 허락이 떨어졌다.

그렇게 커피챗이 끝나고 돌아가면서 짧은 이야기를 나눴는데

커피챗이 끝나고 돌아가면서 하셨던 말씀이 내 마음에 큰 짐을 안겨줬다.
커피챗을 채용의 목적으로 사용하면 안된다. 라는 이 한마디가 그 날 멘탈을 부셔버리는데 한 몫 했다.

내 머리속에서는 취업에 조바심을 느꼈는지 주제가 그런 쪽으로 이어졌고 그러면서 다양한 이야기를 하지 못했다.
하지만 나에게 있어서 커피챗은 선배 개발자분과 여러가지 이야기를 하는 것을 중점으로 두고 있었기에
나 자신에게 큰 실망을 하면서 돌아와서 멘탈깨져가지고 술마시면서 내가 좀 힘들긴 힘들구나 라고
새벽에 스페이스 열어서 다니엘님한테 이런저런 상담도 하면서 여러 사람들이랑 이야기를 하면서 좀 풀어냈던 것 같다.

다음날, 이력서를 전달해드리면서 자기도 요즘 관심사가 채용이라 주제가 그쪽으로 갔던 것 같다고 이야기를 해주시면서 내 마음의 짐도 많이 내려갔던 것 같다.

언어는 그저 도구라는 것을 잊지 말자.

나는 지금까지 NodeJS진영의 회사만 지원하는 편이였다.

그런데 이게...신입에 있어서는 상당히 별종같은 존재라는 이야기를 현직에 계신 많은 개발자 분들께서 이야기해주셨다.
왜냐하면 내가 노드진영에 회사들은 대부분 지원을 완료한 상태라 이력서를 넣어볼 회사가 없어서 고민을 하고 있었기 때문인데(...)

어짜피 신입은 아무것도 모르는 존재라서(ㅋㅋㅋㅋ) 다 가르쳐야 하기 때문에, 오히려 백지인게 좋다는 의견이였다.
모르면 가르치고, 그것을 배울 수 있는 의지와 열정만 있는 사람이라면 괜찮다 라는 것이 시니어 개발자분들의 의견이였다.

프로그래밍 언어는 그저 도구라는 것을 잊지말고, 한 개만 사용하려고 고집하는 것은 좋지 않다. 라는 것을 적어보려고 짧은 챕터를 할애했다.

그렇게 시작된 과제 테스트

48시간동안 과제테스트요?

나는 시간에 놀랐다.

왜냐하면 일주일 간격으로 주는 과제테스트라고 하면 일반적으로 잠도 자고 밥도 먹으면서 해야만 페이스 조절을 할 수 있기 때문에
오히려 길수록 괜찮다는 생각이 있었는데

시간이 짧아서 오히려 이걸...어떻게 해야하는거지? 라는 생각이 들었다.

뭐 어째, 이틀간 그냥 죽어라 하면 되지 않을까? 라는 생각으로 커피를 사러 갔다왔다.

그리고 나는 과제 테스트를 종료한 다음날, 월요일(어제) 잠만 잤다(...)
순수 작업시간만 대충 30시간...?

언어가 서로 다르다면 코드컨벤션은 어떻게 해야할까?

시작부터 생각을 많이 하게 만들었던 고민이였다.

왜냐하면, 언어가 다르다는 것은 코드컨벤션이 다르다는 이야기였기에 시작부터 난관이였다.

근데 결국 언어마다 코드컨벤션이 정해져있는 것인데, 그 회사가 다른 언어를 쓰기에 내가 JS로 시험을 임하면서
다른 언어의 코드컨벤션을 쓴다는 것은 조금 미스가 있는 것 같아서 그냥 JS의 코드컨벤션으로 작성을 했다.

주석은 얼마나 달아야할까?

과제 테스트 최상단에 이러한 내용이 적혀있었다.

코드의 가독성을 신경써달라.

난 여기서 또 머리를 한대 맞았다.

코드의 가독성을 챙기려면, 도대체 어떤 방식이 좋은 것일까?
지금까지 남의 코드를 본 적도 별로 없었고 프로덕트 코드를 본 적도 없었기에 더더욱 고민이였다.

라이브러리의 내부 구성 파일을 찾아보면, 저런식으로 주석이 달려있는데
저정도만 달아놓으면 충분한걸까?

나는 조금 더 세부적으로 달아놓는 것이 좋다고 생각했다.

이유는 몇가지가 있었다.

  • 사용하는 언어가 다르기 때문에 조금 더 세부적인 주석이 필요하다고 판단했고
  • 내가 구현한 기능에 대해서는 조금 더 설명이 필요하다고 생각했다.

다다익선? 과유불급? 어떻게 하는 것이 좋을까.

나는 과제의 주제를 보자마자 주제에 관련되서 내가 해보고 싶었던 것을 다 붙여서 작업을 해봤다.

근데 과제 테스트 문서를 조금 더 자세히 봤다.
함수 혹은 클래스로 구현해주세요.

어? 잠깐만요?

서버를 구축해서 기능 구현을 한 것도 분명 함수와 클래스가 맞긴 한데, 의문이 들어서 여쭤봤다.

짧은 시간에 많은 것을 구현하는 것은 긍정적인 평가로 이어질 수 있지만
그러면서 발생하는 실수같은 것으로 인하여 부정적인 평가로 이어질 수 있다.

어떻게 봐도 당연한 말같아서, 그냥 서버 구축 어짜피 다 했으니(...) 그냥 놔두고
클래스랑 함수로 구현을 또 해서 제출을 했다.

그렇지만 48시간이라는 시간을 거의 풀타임으로 사용을 해보려고 했던 나이기에
당연히 서버를 구축하는게 맞지 않나 라는 생각을 했던 것 같다.

...이게 일반적인 생각이 아닌가?

드디어 최신 버전을 써봤던 TypeORM

나는 지금까지 내가 했던 모든 프로젝트에서 TypeORM을 0.2.0 버전을 사용하고 있었다.

그러다가 너무 구식버전이라는 생각이 들어서 과제테스트에서는 그냥 제일 최신 버전으로 써봐야겠다! 라는 생각으로 밀어붙였다.

후회 진짜 많이 했다. 버전이 올라가면서 내가 사용하던 메소드들이 다 변경되거나 삭제가 된 상태여가지고
도대체 어떻게 해야하는걸까... 라며 고민을 하다가 검색해보니 이름만 바뀌었을 뿐이지 사용법은 똑같아서
버전이 달라졌다해도, 금방금방 찾아서 사용할 수 있을 것 같다.

Connection에서 DataSource로 바뀐 명령모음집(?)

처음 써봤던 REST API

지금까지 나는 GraphQL을 메인으로 사용하고 있었기 때문에 상대적으로 REST API는 아픈 손가락이었다.

스택과 라이브러리에 대한 제한이 없었기에 또 다시 GraphQL로 밀어붙여볼까 하다가
더이상 도망가면 안돼! 라는 생각이 들어서 부캠 동기의 코드를 해석하면서 사용법을 익혔다.

REST API를 다뤄보자, 문서 자동화도 함께 with NestJS

그래서 이번에 도입을 해봤는데, 제법 만족스럽게 사용할 수 있었던 것 같다.
swagger를 통해서 API dosc도 만들어봤고, 아쉬웠던 것은 인증인가를 도입하면 내 머리가 깨질 것 같다는 생각이 들어서
RESTful한 API를 만들지 못했다는 점?

내 맘처럼 안돌아가는 Redis

아니 싱글스레드라면서 왜 값이 틀어지나요?

사실 과제의 조건에는 없었는데, 내맘대로 만들어도 된다길래 그냥 한번 넣어봤다.

바로 동시성 이벤트에 대한 대처를 하는 것이였는데.....
안돼

동시성 이벤트 문제 해결은 어떻게 하지?

저기에 적혀있는 것처럼 똑같이 로직을 짰다.

일단 데이터베이스에 저장안하고 레디스에 저장된 값을 -1해주기로만.
응답속도가 20ms 이하로 나오는데 레디스에서 -1이 안된 값이 가끔씩 튀어나오는 것이였다(....)

싱글스레드라면서...? 같은 데이터베이스를 쓰는데 왜 값이 틀어지냔말이다!!!!!!!

그래서 도대체 어떻게 해야하나 고민을 하고 있다(...)
DB에 저장하는건 그냥 문제가 폭발하더라 ㅋㅋ

100개 지정해놓고 0개 빠질때까지 API 호출이 반복되는데
레디스가 60개 남아있을 때 디비에는 50개 남아있음

와! 동시성 이벤트 진짜 어렵다!

그래서 과제가 끝나긴 했는데, 과제고 뭐고 걍 재밌어보여서 좀 해결해보려고 한다.
배민에서는 큐시스템 구현해서 썼다는데 내가 원하는 것은 대기열을 보여주는게 아니고
그냥 선착순 이벤트를 구현하려고 하는 것이라서 거기까지는 갈 필요가 없다.

날짜를 다루는게 너무 어렵다.

날짜를 다뤄야하는 조건이 있어서 작업을 하다가 문득 의문이 들었다.

이건 그래도 그나마 금방 해결했다.
해당 월의 말일 계산을 어떻게 해야하지?

근데 여기서 내가 만들어놨던 로직들이 우수수 무너져나갔다 ㅋㅋㅋㅋ
윤년이면 2월이 29일까지 있을텐데 이걸 어떻게 해야하지?

대표적으로 2016년 2월은 29일까지 있는 날인데, 이걸 고려를 안하고 만들었다가 2016년을 기준으로 했을 경우 값이 다 틀어지는 일이 발생했다.
그래서 고쳤다(...)

사실 moment라는 유명한 라이브러리가 존재하긴 한다.

내가 알기로는 이게 날짜 관련된 라이브러리로 알고 있는데
이걸 쓰는게 답이라는 생각도 들었지만, 짧은 시간내로 해당 라이브러리의 사용법을 알아내는 것보다는
그냥 내가 직접 구현하는게 답이라고 생각해서 그냥 내가 직접 짰다.


그리고 날짜의 조건에 따라서 결과를 출력해야하는 기능이 필요했는데, 진짜 머리를 쥐어짜서 해결했다.

해당 코드를 공개할 순 없으니 과거에 팀프로젝트에서 사용했던 코드를 가져와봤다.

이것은 해당 날을 기준으로 한달간 카테고리에서 베스트 게시글을 가져오는 API였는데
이번에 구현해야하는 것은 조건이 훨씬 많아서(....)

한 두시간동안 머리 싸메다가 갑자기 커피마시니까 생각이 들어서 이게 진짜 마약인가(?) 라는 생각이 들었다.
그러면서 나는 생각보다는 쿼리빌더를 사용해서 SQL을 짜는 것은 할 줄 알면서도
순수 SQL은 정말 바보같다는 생각이 들어서, 공부를 하긴 해야겠다는 생각이 들었다.

나는 알고리즘 멍청이

나는 나를 너무 잘 알고 있어서 문제인데, 그 중에 알고리즘이 상대적으로 약하다.

알고리즘은 단번에 잘할 수 있는 것이 아니라, 시간을 들여야지만 발전할 수 있는 분야인데
솔직히 말해서 시간을 안썼다.

왜냐하면 코딩테스트를 보더라도, 기술면접이 존재할텐데
코테만 준비하면 기술면접에서 떨어질 것이라는 생각이 들었다.

그래서 나는 기술면접에 조금 더 비중을 두면서 공부를 하다보니 알고리즘 멍청이가 됐다(...)

과제테스트를 보자마자, 아! 어떻게 풀면 되는지 알겠다! 라고 생각해서 풀긴 했지만
특정 알고리즘을 요구한다거나 그런것은 파악하기 힘들었다.

조금 더 예쁜(?) 코드를 짤 수 있음에도 불구하고, 그냥 반복문과 조건문으로 풀어낸 것이 조금 아쉬웠달까.

실보다는 득이 많았던 나의 첫번째 과제 테스트

정말 많은 생각이 들었던 것 같다.

왜냐하면, 최근에 나는 무엇때문에 개발자를 하려고 하였는가 이런 일이 있었기 때문에, 상대적으로 멘탈에 데미지를 크게 입은 상태였다.

근데 첫날 오전 10시부터 새벽 3시까지 안쉬고 하나하나 풀어나가는 그 과정들이 너무 재밌어서, 내일도 해야하니까 자야겠다 라고 잘 준비를 하면서 그렇게 괴로워하고 고민할 필요가 없지 않을까? 내가 좋아하는게 아니라면, 이렇게 몰입해서 즐겁게 할 수 없을텐데 라는 생각이 들었다.

내가 정말 싫어하고 왜 해야하는지 이유를 모른다면 아마 문제가 해결이 안된 그 순간 "아 내가 이걸 왜 하고 있는지 모르겠는데?"라고 생각을 했을 것이라고 보았기 때문이다.

그래서 조금은 내 답답했던 마음을 후련하게 할 수 있었던 과제였다.

또, 내가 어려워하고 모자랐던 부분을 확인할 수 있는 시간이였다.

특히 알고리즘이 정말 모자르고 공부를 해야겠다고, 이제는 공부할 시간이라고 생각했는데 한번 더 체감을 할 수 있었다.

그리고 조금 더 좋은 코드, 가독성이 좋은 코드에 대해서 생각을 할 수 있었고
내가 어느정도 알고 있고 구현까지 할 수 있는지 알아볼 수 있는 좋은 시간이 됐다.


과제테스트에 대한 결과가 어떻게 될지는 모르겠지만, 난 최선을 다했고
많은 것을 배웠기에 떨어지면 당연히 아쉬울 것이라 생각하지만 앞으로 세발자국은 걸어간 느낌이다.

아, 그리고 과제비라는 것도 주더라 조금 신기했다(ㅋㅋ)
지금까지 면접을 가면서 면접비를 받았던 곳이 없었는데 준다라는 이야기만 들었지 받아본 것은 처음이라 기분이 좀 좋았다!

끝!

profile
물류 서비스 Backend Software Developer

1개의 댓글

comment-user-thumbnail
2023년 8월 8일

드림코딩 유튜브로 알게됬는데요. moment.js보다 쉬운 사용법의 timeago.js 추천합니닷
https://www.npmjs.com/package/timeago.js

답글 달기