반응형
웹 서핑을 하면서 블로그를 읽다가 흥미로운 글을 하나 읽게 되었다.

서광열님의 소프트웨어 개발 이야기 에 올라와 있는 ACM 문제 풀지말라 

요지는 ACM-ICPC(세계 대학생 프로그래밍 경시대회) 유형의 문제들은 딱 떨어지는 정답을 만들기 위해 단순화시킨 요구사항과 언제나 정답이 있는 문제이기 때문에 저학년의 프로그래밍 공부에 도움이 될지 몰라도, 학부 고학년 수준에 이르게 되면 눈높이 수학식의 문제 풀이 연습밖에 되지 않기 때문에 프로그래머로서의 깊이있는 사고능력과 다양한 디자인 능력을 오히려 방해한다는 것이다.

ACM-ICPC 에 출전했었고, 현업에 있는 지금도 ACM-ICPC 유형의 알고리즘 문제들을 재미삼아, 공부삼아 푸는 입장에서 이 주장에 대해 일부 공감이 가면서도 반론을 제기하고 싶다.

우선 이 블로그의 의견에 동의하는 것은, 많은 ACM-ICPC 준비생들이 빠지기 쉬운 오류 중 하나로 알고리즘이나 기출문제들을 공식처럼 외우고, 쉬운 문제들을 빨리, 많이 푸는 기계적인 연습을 해서 자신이 기존에 풀어본 문제와 비슷한 유형이 출제되거나, 혹은 본인이 알고있는 알고리즘을 끼워넣으면 바로 풀리는 문제를 풀수있게 훈련을 한다는 것이다. 보통 이런 사람들은 아는 문제는 쉽게 쉽게 금방 풀지만 조금만 응용이 되거나 사고를 요구하는 문제에는 손을 놔버리는 경우가 많다. 또한 실제 이런식으로 공부를 하면 연습할때는 문제를 많이 푼 것 처럼 보여도 실제 대회나 프로젝트에 임하였을때는 그동안 공부한 것이 큰 도움이 되지 못하는 경우가 많다. 알고리즘을 공식처럼 끼워서 푸는 문제상황은 대회에서나 현업에서나 그리 잘 발생하는 경우가 아니기 때문이다. ( 가끔 있긴 있다. )

ACM-ICPC 의 본래 취지를 생각해보면 책에서 배운 알고리즘을 외워서 예제처럼 집어넣으면 바로 풀리는 문제들을 푸는 대회는 아닐 것이다. 다만 ACM-ICPC 출전자들의 수준차는 IOI 부터 준비한 최상위권 학생들부터 일반학생들에 이르기까지 다양한 스펙트럼을 보여주고 있어 실제 대회에서 모두 어려운 문제들로만 출제가 된다면 변별력도 없고, 준비한지 얼마 되지 않는 학생들에게 대회에 대한 의미가 없을 수 있기 떄문에 쉬운 문제 2-3 문제에 어려운 문제가 혼용되어 출제하는 것이라 생각한다.

사실, 개인적으로 ACM-ICPC 에 대해 많은 추억을 갖고 있는 입장으로서 이 글에 대해서는 반론을 많이 제기하고 싶다. 우선, ACM-ICPC 유형의 문제들은 다양한 패턴의 풀이가 나오는 경우들이 많다. 같은 문제를 풀더라도 O(N^2) 로 푸는 사람이 있는가하면 O(N) 혹은 O(1) 로 푸는 방법도 있을 수 있다.

자신이 처음에 구상한 알고리즘과 자료구조를 갖고 문제를 풀어본 후, 자기보다 더 깔끔하고 효율적으로 문제를 푼 사람의 소스코드를 보면 많은 것을 배울 수 있다. 동일한 Spec 의 문제를 다른사람은 어떻게 접근하여 해결했는지를 배울 수 있는 중요한 기회이며, 현업의 실제 프로젝트에서는 이런 방식의 경험을 하기가 상당히 어렵다.

또한, boundary test 나 overflow 와 같이 실제 프로젝트에서 치명적으로 발생하는 유형의 버그에 대한 경험을 다양하게 해볼 수 있다. ACM-ICPC 의 문제들은 솔루션의 무결성을 점검하기 위해 다양한 test data 를 제공하는데, 모든 test case 를 통과할 수 있는 깔끔하고 완벽한 솔루션의 중요성을 직접 체험할 수 있는 더없이 좋은 기회가 바로 이런 알고리즘 문제풀기라 할 수 있다. 현업에서는 개발 - QA 테스트를 통해 진행되는 프로세스를 ACM 문제풀이를 통해 단순화시켜 경험해 보고 있다고 볼 수 있는 것이다.

특히, 알고리즘(algorithm) 이란 학문은 책으로만 배워서는 안되며, 실제 알고리즘을 다양한 응용사례에 맞게 직접 구현해 보는 것이 무엇보다도 중요한데, 알고리즘의 공부에 있어서 ACM-ICPC 유형의 문제를 풀어보는 것은 정말 좋은 공부방법이라 할 수 있다.

Google 이나 IBM,  Microsoft 와 같은 회사들이 기술면접에서 ACM-ICPC 유형의 알고리즘 문제를 면접때 제출하는 것은 여러가지로 시사하는 바가 크다고 생각한다. (사실 위와 같은 대기업 뿐만 아니라 외국의 IT 회사들은 많은 회사가 이런 소위말하는 "압박면접" 을 채택하는 것으로 보인다. 외국 회사의 기술면접 스타일에 대해서는 "조엘 온 소프트웨어" 를 보면 잘 나와있다. )

ACM-ICPC 와 같은 문제풀이의 장점을 한 가지만 더 들자면 ACM-ICPC 나 TopCoder 와 같은 대회 참가를 통해서 세계 각국의 수준높은 프로그래머들을 많이 만날 수 있고(온라인 상이서 혹은 오프라인 상에서) 그들의 솔루션과 소스코드를 분석해 볼 기회가 생기며 - 앞서 말했듯이 같은 문제를 나와 다른 자료구조와 알고리즘, 다른 코딩 테크닉을 활용해서 그들이 어떻게 풀었는지를 보는 것은 정말 중요하다 - 이러한 과정에서 본인에게 굉장한 motivation 을 줄 수 있는 기회가 된다. 추가로 이런 대회에서 성적이 좋으면 본인의 이력서에 멋진 이력으로 추가할 수 있다. 그리고 무엇보다도 재미 라는 즐거움이 있다. ^^

+ Recent posts