코딩 교육
minjang님의 2013년의 베트남, 1988년의 대한민국의 코딩 교육
우선 원글에 언급된 베트남 고등학생들이 45분만에 풀었다는 알고리즘 문제를 풀어봤다.
- 열린 공간과 닫긴 공간을 구분하는 기준을 다음과 같이 잡았다. 가장자리에 있거나 가장자리 셀과 같은 0의 값으로 연결된 셀은 열렸다고 보고 다른 값으로 바꿔준다. 열렸는가에 대한 판단이 종료된 이후에도 여전히 0으로 남아있으면 닫힌 공간이 된다.
- 가장자리 셀부터 시작해서 동일하게 공백 문자로 채워넣어서 인접 셀을 모두 공백 문자로 늘려가는 연산을 flood라고 부른다.
- 이 연산을 iteration이나 recusion으로 수행한다.
- 더 이상 공백 문자로 바뀌는 게 없다면 수행을 종료한다.
- 닫힌 공간은 아직 0의 값으로 남아 있는데 전체 공간을 스캔하여 닫힌 공간인 셀을 발견할 때마다 recursion을 이용해 닫힌 공간 전체를 특정 값으로 채워준다.
- flood 연산을 반복하면서 닫힌 공간마다 다른 값으로 채워준다.
- 닫힌 공간에 대한 표지 작업이 끝나고 나면 넓이를 구하면 된다. 좌표계를 입력받은 게 아니어서 넓이 계산이 좀 까다로운데, 입력 데이터의 특성을 잘 활용하면 간단하게 구할 수 있다.
- 닫힌 공간 중에서 (홀, 짝) 또는 (짝, 홀) 좌표에 위치한 셀의 수를 세면 그게 실제 넓이와 1:8의 비율로 비례하게 된다. 예제의 첫번째 닫힌 공간은 64개 셀이 이 조건에 해당되므로 실제 넓이는 8이고, 두번째 닫힌 공간은 16개 셀이 이 조건에 해당되므로 실제 넓이는 2가 된다.
* 좀 더 고민해서 생각해낸 알고리즘
열린 공간을 태깅하는 단계를 건너 뛰고 닫힌 공간을 태깅하는 단계부터 시작해도 이 문제는 풀 수 있다. 열린 공간은 가장 큰 넓이를 가지는 공간으로 판단되면 안 되니까 제외시켜야 하는데, flood 연산에 가장자리를 만나면 해당 영역을 후보에서 제외시키는 flag를 켜주면 된다.
이 문제의 풀이법을 생각하는데 30분 정도 걸렸고 Python으로 개발해보는데 2,3시간 정도 걸린 것 같다.(중간에 flood 연산을 완전히 고쳐서 만들었음) 내가 전산 전공자이고 경력 15년차의 개발자임을 감안해보면 베트남 고등학생들의 수준이 상당한 것을 알 수 있다. 아마 주위 개발자들에게 풀어보라고 해도 완벽하게 돌아가는 프로그램 코드가 1시간 내에 완성되는 걸 보기는 쉽지 않을 것으로 생각된다.
국내의 많은 대학들의 교육이 알고리즘보다는 코딩 기술이나 도구 사용의 습득에 초점이 맞춰져 있다보니 베트남 고등학생보다 나은 개발자를 찾기가 쉽지 않다. 우리 회사 개발자 채용 면접에서 1 + n의 합을 구하는 함수 또는 바이트 단위로 string compare하는 함수를 즉석 코딩해보라는 문제를 내면 면접자들이 겨우 풀어내고, POSIX의 strstr과 같은 부분 문자열 탐색 알고리즘을 짜보라고 하면 면접자들의 대부분이 풀지 못하는 현실을 생각해보면 SW 산업의 미래가 불투명할 지경이다.
개인적으로는 코딩 교육에 반대한다. 오히려 논리적이고 수학적인 사고능력을 키울 수 있는 교육이 더 절실하다고 본다. 프로그래밍이 교육 과정에 포함된다면 수학적인 사고를 도울 수 있는 도구로서 동작해야지 그 자체가 목표가 되어서는 안 된다.
SW 프로그래밍은 알고리즘(문제를 풀어내는 논리)과 코딩의 결합이라고 할 수 있는데, 알고리즘만 있다고 SW 개발이 바로 되는 건 아니다. 실제로 시장에서 팔릴 수 있는 SW를 개발하기 위해서는 개인적으로는 수많은 코딩 기술과 디버깅 경험이 필요할 뿐만 아니라 동료들과 협업할 수 있는 방법론에 대한 이론과 체험이 필요하다. 반대로 코딩 기술만 익히고 알고리즘이 허술한 개발자들은 생산성이 좋지도 않거니와 개발자 인력 시장에서 경쟁력이 약할 수 밖에 없다.
정부가 원하는 것이 인건비가 저렴한 SW 개발 인력의 수급이라면 코딩 교육같은 저급한 정책이 필요하겠지만, 국가 경쟁력을 높이는 백년지대계를 세우려한다면 좀 더 기초학문의 중요성에 관심을 가져보는 건 어떨까 싶다.