오늘의 목표

: 적절한 컨디션으로, 최고의 준비 상태로 임하기.

오늘의 작업

  1. ‣ : 완료

느낀 점

  1. 불태웠다. 그리고 후회는 없다.

    5시간 동안 1분도 집중하지 않은 순간이 없다. 손은 정말 빠르게 움직였다. 막힘이 없었다. 예전같아서는 무언가 안되면 ‘왜 안되지?’라는 생각이 머릿 속을 채우며 이것저것 시도를 해봤을 것이다. 하지만 이번에는 달랐다. 잠깐 키보드에서 손을 떼고 생각을 해보았다. ‘어디가 문제일까?’에 대해서만 집중적으로 생각했다. 덕분에 문제도 빠르게 해결할 수 있었다.

    2시간 동안 핵심 기능을 구현하고, 1시간 30분동안 예외 테스트 케이스를 통과하고, 1시간 동안 정상 테스트 케이스를 통과하고, 남은 30분 동안 빠뜨린 건 없는지 체크하고 리팩토링을 했다. 핵심 기능을 구현하는데 생각보다 오랜 시간이 걸렸다. 그럼에도 핵심 기능을 나름 잘 구현한 덕분에 뒤의 작업들을 막힘없이 진행할 수 있었다.

    예외 테스트가 정말 많았다. 입력값을 받는 것이 6개인데 각각 예외 처리가 2-3개씩 되었다. 한 번 꼬이면 쉽지 않겠다는 생각으로 최대한 집중을 했고 중간중간 커밋을 통해 저장을 해두었다.

  2. 우선순위대로 개발을 했고, 그 우선순위에 있는 것들은 전부 해냈음에 뿌듯하다.

    내 개발 우선순위는 다음과 같았다.

    1. 핵심 기능을 명확하게 수행한다.
    2. 예외 케이스를 전부 고려한다.
      • 테스트 케이스(각각 기능 테스트, 예외 테스트)를 통과한다.
    3. 코드를 설명할 수 있다.
      • 즉, 근거 있는 코드를 작성한다.

    특히 1번은 입학 설명회에서도, 준님이 오늘 시험 보기 전에 말씀하시면서도 강조하셨던 부분이다. 내 생각에는 이 ‘핵심 기능을 수행’을 강조하는 것을 보니, Jest의 테스트를 실행해 채점을 하는 듯했다. 그 채점이 가장 많은 비중을 차지할 것이라 판단했다. 그래서 나 또한 이 부분을 1순위로 두고 개발을 했다.

    여기서 ‘문서화’는 우선순위에 없었다. 끝나고 잠깐 문서화를 거의 안했음에 ‘아차차’싶었지만 지나고나니 너무 잘한 선택이라 생각했다. 시간이 남았을 때 나는 요구사항에 빠뜨린 것이 없는지, 문제를 잘못 이해한게 아닌지 다시 한 번씩 읽어보았다. 시간이 넘쳐나는 게 아니기 때문이다. 내가 할 수 있는 행동은 한정되어있기 때문이다. 다시 돌아가도 나는 그렇게 할 것이다.

  3. 어려웠다.

    작년, 저작년 최종 코딩테스트 난이도를 기대했지만 그에비해 꽤나 더 어려웠다. 난이도는 작년 기준 약 1.2배 정도 올라간 거 같고 양은 1.6배 정도 늘어난 거 같다. 작년 최종 코딩테스트는 5시간 안에 풀고 검토까지 하고, 문서화까지 할 수 있는 정도의 수준이었다면 이번에는 전혀 그렇지 않았다. 오로지 검토만 해야했다.

    나는 그래도 JavaScript를 공부한지 조금 기간이 되기도 했고, JavaScript로 코딩테스트 준비한 경험이 있어서 JavaScript와 관련된 어려움은 없었다. 하지만 JavaScript를 시작한지 얼마 안된 사람들에게는 확실히 어렵다고 느낄 수 있겠다는 생각을 했다.

    케이스가 4개나 되었다. 입력값은 각 상황에 맞게 받는데, 총 6개 정도 된다. 처음보는 유형이엇다. 그럼에도 이에 맞게 방향을 잡고 그대로 이어나갔다. 그 방향성을 잘 잡은 덕분에, 끝까지 되돌아감 없이 완수할 수 있었다.

  4. 고생했다.

    프리코스 기간 4주 동안, 그리고 최종 코딩테스트를 준비하는 1주일 동안 하루도 허투루 보낸 날이 없다. 중간중간에 적절한 휴식도 물론 함께 해주었다. 덕분에 후회없는 시험을 볼 수 있었다. 5주간 미끄러짐 없이, 꿋꿋하게 내 길을 가준 나에게 칭찬해주고싶다.

  5. 준비를 잘했다.

    미리 프로세스를 만들어둔 것이 너무 잘한 선택이라 생각한다. 덕분에 중간에 방황하지 않을 수 있었다. 특히 이번에 최종 준비하며 만든 입력메시지의 함수화, 변수명 일괄 수정 프로세스 등이 큰 효과를 발휘했다.

    테스트케이스도 잘 분리를 했다. 예외 케이스와 정상 케이스, 그리고 각 케이스별고 감싸고, test.each의 활용. 리드미 요구사항에 작성 > 테스트 코드 작성 > 코드 고치기 이 프로세스도 너무 잘 수행했고 덕분에 효율을 상당히 높여줬다. 테스트케이스에 통과하지 못했다면 기존 내 코드, 혹은 바꾼 내 코드, 로직에 문제가 있다는 걸 의미한다. 이러한 TDD방식을 너무 잘 이용했다.

  6. 모든 것에는 후회가 남는 법

    인간은 후회의 동물이다. 원래 타고난 것이 그렇다. 무엇을 해도 후회는 남게 되어있다. 그 후회를 통해 다음에는 더 발전하도록 만들어진 것이다. 1번에서 ‘후회가 없다’고 했지만 내 머릿 속에서 나도 모르게 생겨나는 ‘후회’의 감정은 어쩔 수 없다.

    내 머릿 속에 당분간은 잔상으로 남을 것이고 가끔씩 내 머릿속에 머물려고 할 것이다. 그럴 때마다 ‘제어할 수 없는 것’이라는 것을 기억하자. 이미 시험은 끝이 났고 그 시간 동안 나는 최선을 다했다. 그거면 된 거다.

  7. 이제 끝

    이제, 결과 발표까지 내가 할 수 있는 것은 없다. 이번 주말에는 결과 발표 전까지 남은 기간동안 무엇을 할지 고민하는 시간을 가져야겠다.

  8. 1시간 남기고 당황했다.

    시험을 한 시간 남겨둔 17시, 과제를 제출할 수 있다. 과제를 바로 제출하자, 2/5 테스트 케이스를 통과한 것이다. 당황했다. 내 눈이 좌우로 움직였다. 손이 떨렸다. 심장이 빠르게 뛰었다.

    그럼에도 마음을 가다듬고 차분하게 지난 4주차의 과제 테스트를 처음에 실패한 기억을 더듬으며 내가 수정하기 전 ApplicationTest.js코드를 가져와 로컬에서 실행해보았다. 동일하게 2/5인 것이다. 휴우- 한숨부터 쉬었다. 이제 원인을 파악할 수 있기 때문이다. 그 원인은

    1. ‘혹시’나하는 마음을 가지고 있었지만, 과제에서 명시하지 않아 간과했던 요구사항
    2. 오타(과제 요구사항의 오타라고 코치님이 공지해주셨다)를 고치지 않은 것
    3. 처음에 더미 데이터로 작성한 코드를 수정하지 않은 것

    이었다. 하나씩 차분하게 해결해나갔다.

    4주차 과제 때 내가 만약 한 번에 통과했으면 어떡할 뻔했을까 잠깐 상상을 했다. 나는 지금까지도 그 원인을 찾지 못해 헤매고 있었을 것이다. 4주차 과제 때 이 시행착오를 겪었기에 해결책 또한 알고 있었고 O(1)의 시간복잡도로 즉시 해결할 수 있었다. 그 해결책은 바로, 위에서 이야기한 것처럼 변경 전 ApplicationTest코드를 가져와 로컬에서 실행하는 것이다. 왜냐하면 미션 제출 페이지의 테스트케이스는 최초 ApplicationTest와 동일하다는 것을 4주차 이슈를 해결하며 알았기 떄문이다.

    그러한 이슈를 미리 겪어 너무 다행이라 생각하고 많은 문제와 고난, 고민을 미리 겪는 것이 참 중요하다고 다시 한 번 생각했다. 문제를 해결하고, 고난을 이겨내고, 고민을 해서 결론을 내린 사람은 동일한 일을 다시 한 번 겪었을 때 O(1)의 시간복잡도로 해결할 수 있다. 이것을 겪은 것과 겪지 않은 것은 1과 0의 차이, 하늘과 땅 차이이다.

    항상 경험 중심인 사람이 되자. 문제를 해결하고, 고난을 이겨내고, 고민을 해결하며 문제 해결사가 되도록 하자.

아쉬운 점

  1. 4주차에 나왔던 다시 시작하는 함수를 throw catch가 아닌 다른 방식으로 유틸화 하지 않은 것

    그럼에도 while문으로 잘했다.