블로그에 마지막으로 생각 기록을 남긴지 벌써 1년이 지났다.
지난 1년간 참으로 많은 일들이 있었다. 개인적으로나, 사회적으로나, 전 지구적으로나..
작년 3월에 마지막으로 쓴 글을 다시 읽어보았고,
그 때의 ‘Keep it going’ 마인드가 아직 변하지 않았음에, 번아웃이 한 번도 오지 않았음에 감사한다.
그래서 오늘, 백준 Gold 2 를 달성한 기념으로 글을 하나 써보기로 했다.
알고리즘 문제풀이는 너무너무 재미있다.
지난 1년간 프로그래머스 115문제, Leetcode 121문제, 백준 149문제를 풀었으며,
백준 문제풀이를 본격적으로 시작한지는 3개월째다.
백준은 비록 input, output 이 깔끔하지 않아 짜증날 때도 있지만,
시간복잡도와 공간복잡도의 제한이 매우 빡빡하여 복잡도 계산을 하는데 매우 좋고,
거의 모든 알고리즘 문제 유형을 제공하고 있으며,
전 세계의 다양한 PS contest 기출문제들이 널려있기 때문에
알고리즘 실력을 향상시키기에는 굉장히 좋다고 생각한다.
3개월간 하루에 최소 골드 1문제, 많게는 4~5문제 정도를 풀려고 노력했는데
백준 문제풀이를 시작하고 3개월만에 골드2를 달성했으니 나쁘지 않은 수확이라 생각한다.
하지만 아직 갈 길은 멀고, 알고리즘의 세계는 너무나도 광활하여 탐구해야 할 영역이 무궁무진하다.
종만북도 샀겠다, 이대로 꾸준히 실력을 연마하여 내년에는 뭔가 제대로된 온라인 저지 대회에도 참가해보고 싶다.
그럴려면 올해 안에 최소 플래티넘3은 달아야되지 않을까?(이게 된다고?)
작년 1월에 처음 동기들과 알고리즘 스터디를 시작하고 블로그에 프로그래머스 문제 솔루션을 올리기 시작했다.
그때 내 코드를 다시 보니…참 ㅋㅋㅋ
당시에는 Stack이나 Queue같은 정말정말 기본적인 자료구조도 몰랐었고,
DFS, BFS, 재귀함수와 같은 알고리즘 지식도 없었다.
그냥 어떻게 어떻게 for문으로만 꾸역꾸역 풀어내다가 조금씩 자료구조를 익혀갔던 것 같다.
Stack, Queue를 한번씩 구현해보고, DFS, BFS 문제도 풀어보고, 그 유명한 하노이의 탑도 풀고…
그러다보니 DP, 다익스트라, 투 포인터, 위상정렬, 분할정복 등도 익히게 되고…
알고리즘 지식의 범위가 조금씩 늘어나게 되었다.
풀리지 않는 문제를 2~3일동안 고민하다가 마침내 풀어낸 경험도 적지 않다. 그 때의 희열이란…
그 때와 지금의 나는 조금 다른데,
당시엔 어떤 문제를 내가 아는 지식을 활용해 어떤 방식으로든 풀어보려고 낑낑댔다면,
지금은 기초 이론들과 개념들을 함께 공부해가면서 응용 문제들을 풀어보는 방식이다.
과거와 현재의 공통점은, 여전히 풀리지 않는 문제가 있더라도 답을 절대 보려고 하지 않는다는 점이다….
왜냐면..답을 본다는 건 쉬운 길을 택하는거라는 느낌이 자꾸 들고(실제로는 그렇지 않지만)
그 순간 내 스스로한테 지는 것 같아서 자존심이 상하기 때문이다(…).
다만, 과거엔 풀리지 않는 문제를 그냥 며칠이고 붙잡고 있었다면,
지금은 조금 하다가 안풀리는 것 같으면 일단은 pass하고 다른 문제를 풀다가
며칠 뒤에 다시 문제를 보거나 한다. 그렇게 풀린 문제들이 많다.
왜 PS가 재미있을까…에 대해 생각해봤는데,
문제 풀이 과정을 내 머릿속으로 그리고 그걸 직접 손으로 구현한다는 것 자체가 굉장히 Creative한 일련의 과정이라서 즐겁고,
문제를 푼다는 것이 하나의 challenge이고, 그 challenge를 이겨냈을 때 내 스스로가 성장함을 느끼는 것이 좋다.
뇌가 말랑말랑해지는 느낌과, challenge를 이겨내고 goal을 달성해냈다는 성취감, 그리고 실력이 올라간다는 것이 좋다.
PS는 내가 대학교 때 훈련했던 소위 문과적 사고 - 어떤 사회적 사안에 대해 원인과 결과를 분석하고 논리적이고 합리적인 결론을 내리는 - 와는 뇌를 쓰는 느낌이 조금 다른 것 같다.
PS를 꾸준히 하니 실제 개발할 때나 코드를 짤 때, 디버깅을 할 때
사고가 훨씬 유연해지고 문제상황을 머릿속으로 그리는 능력이 향상되었음을 느낀다.
물론 PS도 계속하면 고인물의 세계에 빠져버릴 위험이 크지만…그래도 아직까지는 꾸준히 순항중이다.
사실 2월 안에 골드1을 달성해보고 싶은데, 요즘은 알고리즘보다는 웹개발 공부 및 CS 기초지식 공부를 하고있어서
조금 집중도를 덜고있…다고 생각했는데,
생각해보니 동기들이랑 새로운 PS스터디를, 그것도 30개의 알고리즘 주제를 새로 선정하여 하고있네?
이번주 주제는 종만북에서도 후반부에 나오는 공포의 네트워크 유량인데, 스터디 과제를 잘 해갈수 있을지 모르겠다.
1년간 나는 성장하였는가? 그런 것 같다.
개발자에게 성장이란 어떤 지표로 정의되는가? PS풀이 실력? 프로젝트 개수? 프레임워크에 대한 이해도?
아직 스스로를 ‘개발자’라고 부르기도 부끄럽지만…어쨌든 개발자를 꿈꾸는 낑낑대는 한 사람으로서 한 마디로 정의해보자면..
프로그래머의 성장이란, ‘스스로가 컴퓨터와 비슷해지는 것’이라 할 수 있지 않을까?
마치 바둑의 고수가 바둑 그 자체가 되어가는 것처럼 말이다.
내가 짠 코드가 어떻게 컴파일 되고 어떻게 컴퓨터에게 전달되는지,
컴퓨터는 그 명령을 어떻게 받아들이고 어떤 액션을 취하는지,
클라이언트 컴퓨터와 서버 컴퓨터는 어떻게 통신하며 데이터를 전달받는지 등등..
컴퓨터는 한 치의 오차도 허용하지 않는 수학 귀신과 같은 존재이기 때문에
내 자신이 컴퓨터가 되지 않으면 얘가 왜 동작하지 않는지 모른다.
코드를 복붙하여 어플리케이션이 잘 돌아가는지만 확인한다면,
그건 컴퓨터가 되는 것이 아니라 그냥 컴퓨터 세계 안의 작은 프로그램 부분만이 되는 것 같다.
컴퓨터가 되기 위해서는 개발자들이 입이 닳도록 말하는 기초 CS지식을 익혀야하고,
수많은 오류와 삽질 속에서 컴퓨터를 이해하고 점점 닮아가야 하고,
이미 컴퓨터가 된 수많은 고수들이 만들어 낸 응용 지식들을 체화해야만 한다.
그것이 그냥 코딩하는 사람과 진짜 개발자의 차이가 아닐까?
아직 나는 컴퓨터가 되진 않았다.
그러나, 이 세계에 입문할 때는 ‘뭔가 컴퓨터는 내가 시키는거 잘 하니까 이렇게 하면 되지 않을까?’ 정도의 사고로 임했었다면,
지금은 ‘내가 지금 이 명령을 내리면 컴퓨터는 이러이러한 과정을 거쳐서 이런 결과를 내겠지’ 정도의 추측은 시도하는 것 같다.
또한 수많은 삽질로 인해, 이제 어떤 문제와 마주했을 때 구글신을 활용해서 그 문제를 어떻게든 해결해낼 자신이 생겼다.
나는 살면서 어떤 새로운 집단에 들어갈 때 한 번도 그 집단에서 상위권으로 출발해본 적이 없다.
그게 공부든, 외국어든, 운동이든..
고등학교 첫 야자 시간에 이미 고3용 수학의 정석을 풀고있는 친구들을 보고 경악을 금치 못했었고,
대학생때는 외국인들과 자연스러운 프리토킹을 하는 외고출신 학생들을 보고 엄청난 벽을 느꼈다.
그런데..그 집단에서 성장하기를 포기 해본적도 한 번도 없는 것 같다.
왜냐하면 나는 옛날부터 밑에서 위로 치고올라가는 것에 이미 익숙해져 있었고,
꾸준히 하다보면 어느 순간 한 걸음 앞으로 나가있음을 늘 깨달아왔기 때문이다.
작년에 컴퓨터의 세계로 들어갔을 때 전공자 동기들과의 격차를 느꼈을 때도 그 벽이 정말정말 크게 다가왔었는데…
지금은 그 벽 너머는 볼 수 있을 정도로 올라온 것 같긴 하다(아직 벽을 넘지는 못한거 같지만..).
작년 TED 스터디에서 브라질에서 온 Lincoln이 GRIT에 대해 발표했었는데,
나는 GRIT의 Strong Believer다.
올 상반기와 내년에 내가 계획했던 몇 가지 큰 Challenge들이 나를 기다리고 있다.
지금까지 해왔던 것 처럼 꾸준히, 포기하지 않고, 스트레스 관리 잘 하면서 성장해나가자.