윤준영, 더불어 성장하는 개발자    카테고리    태그

두 번의 실패로부터 내가 배운 것들

나는 계획형 인간이다. 그러다 보니 자연스레 취업을 준비하기 위해 먼저 계획을 세웠는데, 막상 계획을 세우려다 보니 취업이라는 게 워낙 변수가 많기 때문에 계획대로 하기가 힘들다는 것을 알게 되었다. 그래서 요즘에는 기회가 오면 내 계획에 없더라도 경험을 위해 일단 도전 해보는 게 낫다고 생각한다.

일 년의 절반이 지난 지금 난 경험을 쌓기 위한 두 번의 도전을 했으나, 둘 다 내가 바라던 것을 얻지 못했다. 항상 이런 실패를 겪고 나면 무엇이 문제였고, 다음번에는 어떻게 하면 좋을 것인지에 대해 생각하지만, 이런 것들은 아무래도 추상적이기 때문에 금방 잊혀지곤 한다. 그래서 이번 기회를 발판 삼아 내가 이 실패를 통해 얻은 것은 무엇이고, 고쳐나가야 하는 것은 무엇인지에 대해 생각한 것들을 문서화시켜 오래 간직하고자 한다.

교내 코딩 테스트

이 대회는 교내에서 진행한 코딩 테스트로 기업에서 코딩 테스트를 진행할 때 사용하는 플랫폼을 그대로 교내 대회에서 사용해 볼 수 있는 좋은 기회이다. 실제로 작년에도 이 대회에 참여한 적이 있었기 때문에 공고가 뜨자마자 망설임 없이 바로 신청했다.

문제는 총 세 문제로 난이도는 작년보다 조금 더 어려웠던 것 같다. 특히 마지막 문제가 조금 난해했지만 그래도 세 문제를 다 풀었다고 생각했는데 결과는 300점 만점에 92점이었다. 절반도 못한 성적이 나온 것이다. 처음에는 점수를 믿지 못했는데, 나중에 내가 제출한 코드를 다시 보니 쉽다고 생각한 첫 번째 문제부터 출력 양식을 제대로 지키지 못했던 실수를 범했다. 아쉽게도 두 번째 문제와 세 번째 문제는 어떤 것이 문제였는지 파악할 수는 없었지만, 아무래도 내가 너무 적은 반례만을 생각했던 점이 가장 큰 문제였다고 생각한다. 그리고 무엇보다 문제를 꼼꼼히 읽지 않았다는 것, 그것이 가장 큰 나의 실수였다.

현대 소프티어 부트캠프

내가 느끼기에 나는 프로젝트 경험은 다양하지만 아무래도 내 희망 직무인 백엔드 엔지니어와 관련된 심도 있는 프로젝트를 해 본 적이 없기 때문에, 이 부분에 대해 항상 고민이 있었다. 그래서 할 수 있다면 프로젝트 경험을 더 쌓고 싶었는데, 마침 현대자동차에서 진행하는 부트캠프가 있었기에 바로 신청했다. 특히, 이 부트캠프는 확률은 적지만 채용연계까지 해주는 게 정말 좋았기 때문에 프로젝트 경험뿐만 아니라 취업까지 한 번에 할 수 있는 기회였다.

부트캠프에 입과 하기 위해서는 코딩 테스트와 필기시험을 거쳐야 했고, 코딩 테스트는 금요일 저녁에 진행됐다. 문제는 총 5문제이고 시간은 총 두 시간이 주어졌다. 이전에 교내 코딩 테스트에서 문제를 제대로 읽지 않아 낭패를 당한 적이 있었기 때문에 이번 시험에서는 문제를 꼼꼼히 읽어나갔다. 총 5문제 중에서 나는 1번, 2번, 5번 문제를 풀 수 있었고, 이 중에서 특히 1번 문제에 가장 신경을 많이 썼다.

1번 문제는 숫자 배열이 주어질 때 배열의 각 요소를 합쳐 가장 큰 숫자를 만들어야 했는데, 이전에 비슷한 유형의 문제를 푼 적이 있었고, 그때 정렬을 통해 문제를 해결했던 기억이 있어 이번에도 이를 이용해 문제를 풀어나가기 시작했다. 하지만 정렬 기준을 어떻게 세워야 하는지에 대한 모호함이 생겼고, 그럴듯한 솔루션이 생각나면 새로운 반례가 생겨났다. 이 과정을 몇 번 반복하자 거의 한 시간이 훌쩍 지나갔지만, 다행히 마지막 솔루션의 반례를 찾지 못해 해당 솔루션을 토대로 코드를 작성했다. 그리고 거의 50분 정도가 남은 상태로 2번, 5번 문제를 풀어나갔다.

시험이 끝난 직후 그래도 세 문제를 풀었다는 생각에 다행이라고 생각했지만, 그 틈도 잠시 친구와 1번 문제의 유사 문제를 찾아 올바르게 풀었는지 확인하려던 찰나 역시나 반례가 존재함을 깨달았다. 지금 와서 생각해 보면 단순하게 문제를 풀 수도 있었으나 괜히 너무 어렵게 접근하여 문제를 해결했던 것이 문제였다고 생각한다. 그리고 비슷한 유형의 문제를 풀어봤음에도 불구하고 문제의 솔루션을 정확하게 기억하지 못했던 것은 분명한 나의 실수였다.

내가 느낀 것들

1. 너무 내 코드에 자만하지 말자

두 번의 코딩 테스트의 공통점이 있다면, 내가 너무 나의 코드를 믿었다는 것이다. 사실 내가 생각한 솔루션들이 그저 완벽할 수는 없기 때문에 항상 내가 작성한 코드를 의심해야 한다. 그리고 코드가 잘 작동한다면 이게 왜 작동하는지에 대해 생각해 봐야 할 것이다. 그저 입력에 대한 출력이 잘 나온다고 다른 테스트 케이스도 잘 될 것이다라는 생각은 큰 오산이다. 그리고 코드를 다 작성하고 나면 항상 내가 빼먹은 건 없는지 더블 체크도 필수이다.

여태껏 내가 코딩 테스트를 해오며 느꼈던 것은 여러 문제를 푸는 것보다 한 문제를 완벽하게 마치는 것이 중요하다는 것이다. 한 문제를 풀었다고 생각하고 바로 다른 문제로 넘어간다면 새로운 문제에 대한 이해를 하는 데 시간이 소요되고, 다시 전반적인 문제를 훑기 위해 이전에 풀었던 문제로 돌아가는 경우 내가 작성한 코드를 이해하는 것부터 다시 시작해야 하기 때문에 다시 시간을 낭비하게 된다. 그러니 문제 하나를 풀 때마다 다시 보지 않을 것이라는 생각을 가지고 정성스레 푸는 습관을 들여야 할 것이다.

2. 무작위의 반례를 생각해보자

내가 두 번의 테스트를 통해 느낀 것은 너무 솔루션에 맞는 반례만을 생각했던 것이다. 예를 들면 어떤 솔루션을 생각해서 코드를 작성한 뒤에는 해당 솔루션에서 취약하다고 생각한 부분이나 신경을 많이 쓴 부분에 대해 잘 작동하는지 확인하려고 거기에 맞춘 반례만을 생각하곤 했다. 물론 작성한 코드가 잘 작동하는지 확인하기 위해 이런 과정을 거치는 것은 좋으나, 이 솔루션에서 내가 간과한 부분이 있을 수 있기 때문에 다양한 테스트 케이스를 적용해 보는 것은 중요하다.

하지만 어떻게 이런 짧은 시간 동안 그 많은 반례들을 생각할 수 있을까. 이에 대해 고민한 결과, 무작위의 반례를 만들어보는 것은 어떨까라는 생각을 했다. 일단 아무런 숫자를 넣어보고 내가 직접 기댓값을 계산한 뒤에 코드를 돌려 이 값과 일치하는 값이 도출되는지 파악하는 것이다. 어떻게 보면 반례 자체를 운에 맡기는 건데, 사실 그렇지만도 않다. 내가 말하고자 하는 것은 모든 반례를 무작위로 하는 것이 아니라, 기존의 내가 생각한 반례와 더불어 무작위 반례를 넣어보자는 것이다. 이렇게 하면 두 마리의 토끼를 잡을 수 있을 것이다.

3. 알고리즘 공부 방식의 변화가 필요하다

마지막으로 내가 이때까지 공부한 알고리즘의 공부 방식에 대한 변화가 필요하다고 생각했다. 특히, 소프티어 코딩 테스트를 하다가 느낀 건데, 분명히 내가 이전에 풀었던 문제임에도 불구하고 시간을 꽤 많이 빼앗겼다. 이 말인즉슨, 이전에 내가 풀었던 문제임에도 불구하고 문제에 대한 솔루션을 잊어버렸다는 것이다. 이것은 꽤 크리티컬하다고 생각하는데, 내가 푼 문제를 기억하지 못하면 나는 왜 알고리즘 공부를 꾸준히 하는 것인가. 그래서 내가 이때까지 해왔던 공부 방식에 대한 변화가 필요하다는 것이다.

하지만 인간의 뇌 용량에 한계가 있듯 여태껏 풀었던 모든 문제를 다 기억해 낼 수는 없을 것이다. 그래서 생각한 방법이 한 문제를 여러 번 푸는 것이다. 굳이 똑같은 문제가 아니더라도 비슷한 유형의 문제면 더 좋을 것이다. 지금까지 내가 알고리즘 문제를 고를 때엔 이전에 풀지 않은 문제들만 골라서 풀곤 했는데, 이 방법에 대한 변화가 필요하다고 생각했다. 이렇게 계속 풀었던 문제를 반복해서 풀다 보면 언젠간 개념을 정확하게 기억할 수 있을 것이다.

결론

사실 회사에 취업하는 것도 마찬가지고, 시험에 합격하는 것도 마찬가지로 실력뿐만 아니라 운도 중요한 요소라고 생각한다. 하지만 이 운이라는 요소가 주는 무작위성을 완화하기 위해서도 실력이 필요하기 마련이다. 실력만으로는 안 되는 것이 많고 운도 필요하지만, 또 운이라는 것을 극복하기 위해서는 실력이 필요하다니 얼마나 모순적인가. 하지만 이 두 요소 간의 관계는 사실 모순된 것이 아니라 상호보완적이라고 생각한다.

그렇기 때문에 실력이라는 요소를 보완하기 위해서는 꾸준히 공부하고, 운을 보완하기 위해서는 더 많은 도전을 해보는 것이 중요하다 생각했다. 하지만 그저 많이 도전한다고 해서 운이라는 것을 보완할 수 있는 것은 아닐 것이다. 단순히 도전하기보다는 도전을 통해 내가 얻은 것과 느낀 것을 회고하며 나를 계속 개선시키는 과정이 중요하다 생각한다. 그렇기 때문에 앞으로 있을 다양한 도전에 참여하고, 실패를 배우며, 그 실패로부터 끊임없이 나를 성장시키는 과정에 대한 이야기를 짧더라도 블로그에 작성해 보려 한다. 그럼 이제부터 제대로 시작해 보자!

🇨🇦 캐나다 단기어학연수 3주차 - 밴쿠버 아쿠아리움, 나이팅게일, 카필리노 현수교, Guilt & Co, 켄싱턴 파크

0합, 3불

Comments powered by Disqus.

바로가기