글로 배우는 코딩 1 | 가장 중요한 문제해결력, 응용력을 배우려면?
2017년 대한민국을 뒤흔들었던 가장 핫한 키워드들은 ‘4차 산업혁명’과 ‘비트코인’이었다. 한 키워드는 대선과 맞물려 정치계에서 언급되었고, 다른 키워드는 암호 화폐 투자의 활황과 더불어 급부상했다. 이 두 키워드는 한 가지 공통점이 있는데, 그것은 바로 코딩이다.
한편, 정부는 2018년부터 코딩 교육 의무화를 선언하였다. 이에 발맞추어 사교육 시장에서는 코딩 학원이 우후죽순처럼 생겨나고 있다. 비단 어린 학생들을 위한 사교육뿐만 아니라 성인들을 위한 코딩 교육 열풍도 만만치 않다. 많은 직장인들이 요즘 열풍이라는 코딩에 뛰어들고 있지만 실패를 경험하고 있다.
그래서 준비한 ‘글로 배우는 코딩’ 연재 시리즈를 준비했다. 코딩에 있어서만큼은 실패하고 좌절하지 않기 위해 더 나은 코딩 공부 방법론과 코딩에 대한 이야기를 연재하려고 한다. 코딩을 시작했는데 막막하거나 이제 막 시작하는 분들이 적은 실패를 경험하면서 실력을 향상하는 데 도움이 되었으면 한다.
이번 글에서는 학습 방법론에 대한 이야기를 해 보겠다. 학습자가 아니라 교수자에 대한 글인 것 같지만, 학습자에 관점에서 왜 이런 방식으로 코딩 공부를 해야 하는지 대해 이야기하려고 한다.
이번 포스팅은 단순히 코딩을 잘하는 ‘코더(Coder)’의 학습 방법이 아니라 어떤 문제를 만나든 능숙히 대처할 수 있는 ‘프로그래머(Programmer)’로서의 학습 방법에 대해 이야기할 것이다.
글을 읽고 있는 당신이 만약 if, for 문도 익숙하지 않은 왕초보라면 프로그래밍 언어의 문법을 손으로 익히고 지식을 암기하는 작업들이 필요하다. 하지만, 만일 당신이 기본적인 문법을 익힌 상태라면 슬슬 지식 암기 위주의 학습법에서 벗어날 필요가 있다.
많은 사람들이 학습하는 방법에 있어 실수하는 부분이 바로 이것이다. 이전까지 지식을 암기하는 학습 방법으로 공부해 오다 보니 일정 단계가 지난 후에도 계속 이런 방식으로 학습한다. 새로운 함수나 클래스 혹은 새로운 언어의 문법들을 배우면서 그 지식을 습득하는 데에만 집중한다.
하지만 프로그래밍은 무엇보다 응용력이 중요하다. 물론, 절대적인 지식의 양도 중요하겠지만, 소프트웨어 엔지니어의 실력은 지식의 넓이가 아니라 지식의 깊이로 판가름한다. 그리고 그 깊이는 지식을 배워서 응용하고 새로운 문제를 맞닥뜨리더라도 당황하지 않고 해결할 수 있는 실력이다.
그래서 일정 수준의 지식 단계에 도달한 후에는 지식 습득이 아니라 문제 해결 중심의 학습 방법이 필요하다.
왜냐하면 우리는 코드를 짜는 것 자체가 목적이 아니라,
코드를 통해 문제를 해결하는 것이 목적이기 때문이다.
학습 방식을 지식 습득 중심에서 문제 해결력을 키우는 방법으로 바꿔야 하는 또 다른 이유가 있다. 그 이유는 아무리 많은 지식을 습득해도 그 습득한 지식보다 더 많은 양의 지식이 쏟아져 나오기 때문. 프로그래밍의 세계는 엄청나게 빠른 속도로 변화하고 있다. 그 속도는 그 분야의 전문가들조차 따라잡기 힘든 속도로 변한다.
이러한 상황에서 단순 지식의 습득은 지식의 습득 관점에서 볼 때 오히려 지식의 규모를 줄이는 꼴이다. 전체 지식의 총량보다 자신이 습득하는 지식의 속도가 느리다면 비율의 관점으로 봤을 때 줄어든다고 볼 수 있기 때문이다. 지식의 바다에서 우리가 가진 그릇으로 아무리 그 지식을 담는다 해도 한계가 있다.
지식의 바다를 모두 마실 수는 없다.
그래서 우리가 익혀야 할 것은 두 가지다. 한 가지는 ‘Learn How to Learn.’ 새롭게 변화하는 환경에서 빠르게 적응하기 위해 빠르게 배우는 방법을 배우는 것이다. 그리고 다른 한 가지는 문제 해결력과 응용력이다. 이번 포스팅은 문제 해결력과 응용력에 집중하도록 하고 Learn How to Learn은 다른 포스팅에서 다루도록 하자.
혹시 자신이 누군가에게 코딩을 티칭 받고 있다면, 혹은 자신의 학습 방법이 티칭을 받는 식의 학습법이라면 진지하게 고민해볼 필요가 있다. 여기서 티칭은 지식 전달 위주의 학습 혹은 교수법이다. 위에서도 언급했지만 코딩에서 티칭은 일정 부분의 수준까지만 필요하다. 아까도 언급했듯이 그 많은 양의 지식을 모두 익힐 수는 없기 때문이다.
그래서 필요한 것이 바로 코칭이다. 코칭은 직접적으로 지식을 전달하는 것이 아니라 옆에서 지켜보면서 필요한 부분들을 코치한다. 이런 코칭 방식은 한국에서 그렇게 강조하지만 잘 이루어지지 않고 있는 자기 주도적 학습 방법과 맞닿아 있다.
학습자 스스로가 학습을 하면서 문제를 맞닥뜨렸을 때 해답지를 바로 보여주는 것이 아니라 그것을 해결할 수 있게 유도를 하는 것이 코칭이다. 사실 이런 방식은 어떻게 보면 굉장히 비효율적이고 불편하다. 문제의 해결책을 알려주는 것은 굉장히 쉽지만, 스스로의 해결책을 만들게 도와주는 것은 정말 어렵기 때문이다. 하지만 이 방법이 결국에는 더 좋은 결과를 낸다.
자신의 학습 방법이 지식 습득 위주인 티칭인지, 문제 해결력을 중점으로 하는 코칭인지를 고민해보자.
티칭은 지식을 주고, 코칭은 피드백을 준다.
‘나는 혼자서 공부하고 옆에서 알려주는 사람도 없는데’라고 하는 사람도 있을 수 있겠다. 하지만, 독학하는 사람이라도 모르는 것이 있다면 책이나 강의 혹은 학습 사이트에서 답을 구하려고 할 것이다. 이때 자신이 원하는 것이 해결책인지 피드백인지 고민해보라.
“그래서 문제 해결력과 응용력을 어떻게 키우라는 건데?” 이런 질문이 당연히 나올 것이다.
그 방법은 자신이 문제를 만나고 해결한 과정을 알고리즘화하는 것이다. 모르는 문제가 나오고 그것을 해결하는데 골머리를 앓다 보면 해결 과정을 기억하기가 쉽지 않다. 그런데 이것을 어떻게 해결하게 되었는지 도식화하고 그 과정을 강화해가면 기억할 수 있다. 즉, 문제 자체뿐만 아니라 그것을 해결하는 과정도 같이 학습하는 것이다. 예를 들어, 아래와 같은 방식으로 자신이 문제를 해결해 나간 과정들을 서술해 볼 수 있을 것이다.
어떤 문제를 만났는데
시도를 해보니 안 풀렸고
혹시 단순 문법 실수인지 확인하고
참고 문서를 읽어보고
사람들에게 질문했다.
이런 과정은 자신이 무엇이 부족한지 알게 해 주고, 어느 방법으로 문제를 해결해야 빠르게 해결이 가능한지 또 가장 빠른 문제 해결 프로세스가 무엇인지 알게 해 준다. 즉, 문제는 항상 바뀌지만 바뀌지 않는 자신만의 문제 해결 프로세스를 구축해서 문제를 풀어나가는 것이다.
그리고 그 프로세스를 피드백을 통해 강화하고 보강해간다. 이것으로 스스로의 코칭 프로세스를 세우는 것이다. 물론, 만일 누군가 코칭해주는 사람이 있다면, 이런 복잡한 작업의 시간 소요는 줄 것이다. 전문가의 피드백과 코칭을 받다 보면 자연스레 그 학습법이 몸에 익히고 자신만의 문제 해결 방정식을 세울 수 있기 때문이다.
만일 이러한 방법들을 스스로 실행하기 어렵다면, 코드스테이츠와 같은 코딩 교육 기관을 찾는 것도 방법이다. 하지만 단순히 지식을 전달하는 교육을 하는 곳이라면 가지 않는 것을 추천한다. 왜냐하면 요즘에는 정말 좋은 학습 사이트들이 많기 때문에 지식 전달만 하는 곳은 오히려 돈만 버리는 꼴이 될 수도 있다. 한글화된 학습 자료들도 많고 눈을 넓혀서 외국 사이트를 알아본다면 퀄리티가 높고 다양한 자료들이 존재한다. 또한, 학습자료뿐만 아니라 알고리즘 문제에 대한 사이트도 찾아보면 잘 정리되어 있는 곳이 많다.
단순 지식을 배우기 위해서는 인터넷에 얼마든지 많은 자료가 있다. 그러므로 티칭이 아니라 코칭을 해줄 수 있는 교육기관을 찾아야 한다. 물론, 이런 과정이 처음에는 불편하고 돈을 냈는데도 친절하게 알려주지 않아서 짜증이 날 수도 있다. 코드 스테이츠의 몇몇 수강생들도 처음에는 이런 불만을 토로하는 분들이 계신다. 하지만, 과정이 끝날 때는 그 이유에 수긍하시면서 만족해하신다.
정리해 보자면, 처음에는 단순 지식 암기로 문법을 익히면서 코딩에 대한 감을 잡을 필요가 있다. 그러나 일정 수준에 도달하면 지식의 습득보다는 문제 해결력과 응용력을 키우는 데 집중을 해야 한다. 왜냐하면, 코딩의 지식은 정말 방대하기 때문이다.
그리고 이 방법은 티칭보다는 코칭이 더 코딩 교육에 적합하다. 자신만의 문제 해결 프로세스를 구축하면서 학습하면 문제 해결력을 키우고 응용력을 함께 가져갈 수 있는 학습을 할 수 있다.