이 글은 제 개인적인 의견을 담고 있는 글입니다.

 

SW취업시장에서 필수가 된 알고리즘 문제해결능력(?)

요즘은 여러모로 경기가 좋지 않아서 왠만한 명문대 졸업자들도 취직을 하는게 하늘에 별따기 같습니다.

4차산업혁명 이야기를 막 하면서도, SW계열로 직업을 구하고자 하면, 이것 저것 능력을 많이 따져서 신입사원으로 지원하는 것임에도 불구하고 지원자에게 요구하는 능력 수준이 생각보다 꽤나 높습니다.

 

이름만 들으면 알만한 IT회사나 대기업들의 경우 신입사원 공채나 상시채용 프로세스에서 알고리즘 문제해결능력을 확인하는 과정들이 이제는 거의 필수처럼 되어가고 있는데, 왜 그런걸까요?

 

왜 IT SW계열 회사에서 알고리즘 능력을 강조할까?

Problem Solving(PS) vs Competitive Programming(CP)

일단 간단하게 용어를 조금 정하고 넘어가자면, 알고리즘 문제해결 분야를 보통 PS라고 줄여서 말합니다. Problem Solving의 약자로, 문제해결이라는 뜻이지요. 소프트웨어쪽에서 PS라는 단어를 쓰면 보통 이 용어를 뜻하는 것입니다.

 

비슷한 단어로 CP라는 단어가 있는데 이는 Competitive Programming의 약자로, 쉽게 말해서 코딩대회 같은 것을 생각하시면 됩니다. PS와 CP는 둘다 코딩할 수 있는 알고리즘 문제를 푼다는 공통점이 있는데, 조금 차이점이라고 하면 CP(Competitive Programming)의 경우 대회에서 경쟁하는 방식이므로 보통 수 시간(2~3시간)동안 문제를 빠르고 정확하게 풀면서 서로 점수와 푼 문제수로 경쟁한다고 한다면, PS(Problem Solving)는 문제를 푸는 것 그 자체에 포커스가 맞추어져 있습니다.

 

즉 대회에서 문제를 푸는게 아니라, 하나의 문제를 잡고 일주일이건 몇달이건 계속 풀고, 더 나은 해법을 찾고 하는 그런 행위들을 PS라고 하는 것이지요. PS를 평소에 즐겨해서 훈련이 되어 있다면 CP에도 도움이 될 것입니다. 다만 CP에서 좋은 성적을 얻기 위해서는 문제를 빨리 풀고 구현하는 능력도 훈련이 되어있어야겠지요?

 

IT회사에서 채용할때 PS능력을 얼마나 보는데?

일단, 국내 IT회사라고 하면 딱 떠오르는 네이버, 카카오, 라인플러스, NHN 등등이 있는데 이 회사들은 채용시 다 코딩테스트를 봅니다.

네이버의 경우는 공채를 자주 하지는 않지만, 최근에 한번 했엇지요? 그때도 서류(자기소개서) 제출 이후  온라인 코딩테스트를 통해서 지원자를 걸렀습니다.

라인플러스와 NHN도 신입사원 공채시 코딩테스트가 들어있었고, 일정 이상 점수를 받지 못한 사람들은 면접으로 가지 못했습니다.

카카오의 경우는 2017년 부터 매년 블라인드 코딩테스트라는 제도를 만들어서, 서류심사 없이 1차 2차 코딩테스트의 결과만으로 지원자들을 면접전형까지 보게 해주는 식으로 채용을 진행하였습니다. 그만큼 PS능력을 매우 중요시 한다는 것이지요. 수 많은 스펙보다 코딩 잘하는게 더 잘 증명되어있다 라고 생각하는 그런 부분이 보이는 현상이라고 생각합니다.

 

이 외에도 대부분의 IT회사들은 코딩테스트를 보거나, 상시채용을 실시하는 경우는 대규모로 같이 보는 것이 아니므로, 면접에서 이러한 알고리즘 문제해결능력을 알아볼 수 있는 질문들을 하곤 합니다.

이러다 보니, 코딩테스트 환경을 대행해주는 서비스 영역도 생기게 되었지요.

 

대기업의 경우에는 공채 프로세스에서 대부분 인적성이라고 하는 NCS와 비슷한 필기 문제를 통해서 사람들을 거르게 되는데, 삼성전자의 경우는 소프트웨어 직군의 엔지니어를 채용할 때에는 삼성계열사 인적성인 GSAT대신 SW역량테스트라는 알고리즘 문제를 냅니다.

그리고 채용 이후에도 신입사원 교육때 알고리즘과 같은 기초 부분은 중점적으로 다시 교육시킵니다.

 

그리고 세계적인 IT회사인 구글의 경우도 알고리즘 문제해결능력을 매우 Intensive하게 체크한다는 것도 널리 알려져 있습니다.

 

형태는 다들 다르긴 하지만, SW엔지니어를 채용할 때 알고리즘 문제해결 능력을 중요시 하다는 점은 자명해졌습니다.

 

그러면 PS를 잘하면 뭐가 좋을까요?

 

알고리즘 문제 해결(PS)능력이 뛰어나면 잘하는 것들

하지만 사실 알고리즘 문제 해결능력이 뛰어나면 부수적으로 딸려오는 능력들이 있습니다.

구현 능력

어떤 비즈니스 로직이나 알고리즘을 구현하는 능력이 꽤 많이 능숙해집니다. 빠르고 정확하게 구현할 수 있는 능력이 생기는데, 이는 SW엔지니어에게는 기초체력과 같은 능력이지요. 그리고 이런 능력은 은근히 기르기에 어렵고 시간도 많이 걸리는데, PS와 CP를 즐겨하는 사람들에게는 기본적으로 같이 있는 능력입니다.

 

시간복잡도와 공간복잡도에 대한 이해

물론 이 복잡도들은 학부 1~2학년때 배우는 내용이므로, 기초적인 내용이긴 하지만 실제로 구현을 하고 잘못 짜서 TLE(Time Limit Exceed) 판정을 보면서 문제를 풀어온 사람들에게는 매우 직관적으로 잘 이해되게 됩니다.

유명한 알고리즘과 자료구조들에 대한 이해

마찬가지로 자주쓰이는 balanced tree나 hash table과 같은 자료구조들, 그리고 유명한 알고리즘 dfs, bfs, dijkstra's shortest path 등에 대한 이해도가 남다릅니다. 직접 구현까지 해보고 시간복잡도 공간복잡도도 다 분석해본 사람들이니 말입니다.

남의 코드를 읽는 능력

PS를 하다보면, 남이 작성한 정답코드를 확인해 볼 일이 꽤 있는데, 이 과정에서 남이 작성한 코드를 이해하는 능력이 많이 길러지게 됩니다. 이 능력 역시 매우 기르기 어려운 능력인데, 자연스럽게 길러지는 것이지요.

 

알고리즘 문제를 잘 풀면 실무(개발)를 잘하나?

실무 != 알고리즘

사실 어플리케이션단의 개발을 하려면 알고리즘 문제를 매우 Intensive하게 잘 할 필요는 없습니다. 그리고 보통 알고리즘 문제해결능력이 좋으면 다 장땡이다 라는 생각을 비판하는 분들도, 알고리즘 잘 풀어도 일 잘하는거랑은 관계없다, 알고리즘 못해도 일 잘하는 사람 있다 라는 의견들을 많이들 내십니다.

 

물론 맞는말입니다. 요즘은 라이브러리나 오픈소스들이 잘 되어 있어서 그러한 Low-level 부분들을 하나하나 다 구현하지 않아도 잘 사용할 수 있습니다. //(O(NlgN)//)의 정렬을 구현하지 못해도, Java나 C등의 기본 라이브러리에 있는 sort라는 함수를 한번만 호출해주면 알아서 정렬을 해 주고, HashMap같은 것을 직접 구현하지 않아도, 라이브러리에 있는 녀석들을 사용하면 간단하게 개발을 할 수 있습니다.

 

그리고 요즘 핫한 딥 러닝이나 블록체인 개발/구현 등을 한다고 할 때, 이러한 알고리즘 문제 풀이 능력은 크게 도움이 안되는 것 처럼 보입니다. 알고리즘 문제 풀 시간에, 최신 딥 러닝 논문을 한 편 더 보는게 도움이 더 될 것이다, 이런 생각들이 들겠지요

 

알고리즘 < 실무

실무라고 하는 범위가 매우 다양할 수 있기 때문에, PS능력이 절대적으로 모든 실무능력을 다 커버해주진 않습니다. 하지만 실무를 하면서 맞닥드릴 수 있는 상황들을 쉽게 해쳐나갈 수 있는 능력을 줍니다.

PS에 능숙한 사람이라면 다음과 같은 상황은 생각보다 쉽게 해쳐나갈 수 있습니다.

 

1. 내가 원하는 기능을 정확히 수행하는 라이브러리나 오픈소스가 없을 경우 직접 구현하거나, 기존 것을 변경해서 사용해야하는 경우

2. 남이 작성한 코드를 빠르게 이해해야 하는 경우

3. 직접 구현할 때 실수 없이 빠르게 구현해야 하는 경우

 

특히나 어플리케이션 단이 아닌 임베디드와 같이 물리적 제약조건이 많은 환경이나, OS/커널과 같이 Low-level에서 구현해야 하는경우, 그리고 코어한 엔진부분 구현이라던지 하는 부분은 직접 작성해야하는 경우가 많습니다.

 

라이브러리에 잦은 의존을 하던 사람은 이러한 코어개발자가 될 기회를 PS를 즐겨하는 사람에게 뺏길 가능성이 높습니다.

 

언젠가는 주니어 SW엔지니어 중에서도 대부분이 어려워하는 분야도 해낼 수 있는 시니어 엔지니어로 거듭나야하는데, 이 과정에서 PS역량이 많은 도움이 된다고 볼 수 있습니다.

 

계속 변하는 기술트랜드

요즘은 기술을 배우는 시간보다 새로운 기술이 나타나는 시간이 더 빠르다는 이야기도 있습니다. PS능력은 새로운 기술이 나왔을 때 빠르게 배울 수 있는 기초체력과 같은 능력이 됩니다. 

사실 요즘 핫한 딥 러닝이 유행을 탄 지도 5년 정도도 채 안되었다고 볼 수 있습니다. 만약에 곧 딥러닝의 인기가 시들해지고, 새로운 기술이 각광받는다면 또 그 기술을 배워야 하는데, 어차피 이렇게 계속 기술을 배워야 한다면, 몇년만에 유행을 타는 기술들이 아닌, 한번 제대로 배워놓으면 수십년은 가는 컴퓨터공학의 근간을 이루는 시스템, 네트워크, 자료구조, 알고리즘 등의 실력을 탄탄히 길러놓는 것이 현명한 방법 아닐까요?

 

끝으로 구사과님이 알고리즘 대회 열심히하는게 무용하다'라는 의견의 코드포스 블로그에 남긴 댓글 링크를 걸면서 이만 글을 줄이겠습니다.

 

 

 

http://codeforces.com/blog/entry/49289#comment-332844

 

추가적으로 더 읽을만한 글도 있습니다.

https://www.acmicpc.net/blog/view/49

CP와 PS를 비교하면서, CP를 하면서 점수(레이팅)에 집착하지 말자는 그러한 내용의 글입니다.

 

https://medium.com/@ghilbut/%EC%8B%A4%EB%AC%B4-%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%97%90%EA%B2%8C-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%9D%80-%EB%8D%9C-%EC%A4%91%EC%9A%94%ED%95%A0%EA%B9%8C-2-45714fc83e15

+ Recent posts