프로그래밍 교육의 새로운 패러다임

프로그래밍 교육의 새로운 패러다임

2020, Aug 15    

Abstract

이 글은 내가 만든 c++ 교육 커리큘럼을 홍보하고 그 우수성을 정당화하기 위해 쓰여졌다. 이제(2020년 8월 현재) 막 학부 과정을 갓 마친 나는 거의 대부분의 대학교 컴퓨터공학과에서 진행하는 프린이들을 위한 프로그래밍 과목 (프로그래밍 입문, 객체지향 등등) 의 문제점을 고찰하게 되었고, 이를 해결하는 커리큘럼을 제작했다. 커리큘럼의 우수성은 대학생들을 약 4개월간 가르친 Case study를 통해 검증되었다. 이 글은 또한 지금 이 글을 읽는 당신이 커리큘럼에 기여할 것을 그리고 스타를 박아줄 것을 종용한다.

Domain analysis

내가 처음 프로그래밍을 제대로 배운 것은 약 2년여 전인 2018년 대학 객체지향프로그래밍 수업을 통해서였다. 그 당시 막 복학해서 친구도 없고 물어볼 사람도 없고 그래서 정말 힘들게 공부했는데, 개발환경 세팅부터 프로젝트까지 정말 삽질에 삽질을 거듭했던 기억이 난다. 아무튼 그 당시 그렇게 배운 언어가 c++이었는데, 뭐 썩 괜찮은 시작이었다. 멘땅에 헤딩을 무지막지하게 하긴 했지만 결과적으로 프로그래밍 실력이 많이 늘긴 했으니까.

그 수업을 들었던 그때부터 지금까지 현재까지 나는 알파고와 비트코인, AI라는 세 쌍 날개를 달고 떡상한 컴퓨터공학과에 속해 있다는 이유만으로 수많은 친구들의 프로그래밍 과제를 대행할 기회를 얻었다. 그리고 이를 통해 수많은 대학의 프로그래밍 과목의 커리큘럼에 대해, 특히 개발의 관점에서 어떤 문제가 있는지 본의아니게 알게 되었다. 내가 나름 좋은 수업이라고 생각했던 우리 학교의 객체지향프로그래밍 수업에도 몇 가지 문제점 존재한다는 것을 알게 된 것은 덤이었다. 공통적인 문제들을 정리하자면 대충 다음과 같다.

컴공 떡상이란 재앙을 일으킨 만악의 근원

  1. 대학의 문제 대학은 애초에 학문을 가르치는 곳이지 개발을 가르치는 곳이 아니다. 그렇기에 대학 컴퓨터공학과에서 프로그래밍 과목을 여는 가장 큰 목적은 학생들이 이후 들을 어려운 전공과목을 따라갈 수 있는 기초적인 프로그래밍 실력을 기르게 하는 것이다. 수업의 개설 목적이 애초에 개발능력 배양이 아니기에, 이 수업을 듣고 무엇인가 프로그램을 개발하기는 어렵다. 예를 들어, 위에서 언급한 객체지향프로그래밍 수업에서는 c++을 가르치면서 STL (Standard Template Library) 사용을 금지했다. 직접 자료구조를 구현하면서 그 원리를 익히라는 의도고, 그것이 Computer Scientist의 양성에는 효과적인 방법인 것도 사실이다. 그러나 실제 개발과 프로그래밍에서 가장 중요한 능력인 남이 만든 라이브러리나 코드를 잘 활용하는 능력을 기를 기회를 차단하는 일이기도 했다. 또한, GUI를 제대로 가르치지 않는다. 뭐 터미널에서 돌아가는 CLI 프로그램도 중요하다고 생각할 수 있겠지만, 그러는 당신 역시 크롬이나 익스플로러라는 강력한 GUI 웹 브라우저를 통해 이 글을 보고 있지 않은가? 평생 콘솔에다 별찍기만 할 것도 아니고, GUI 프로그램을 만들어 보는 것은 프린이의 성장에 있어 아주 중요하다. GUI 프로그램을 짜보며 객체지향에 대한 지식을 얻는 것은 덤이다. 마지막으로, 한정된 기간도 문제다. 기초 프로그래밍 과목을 듣는 학생들은 대부분 프로그래밍을 처음 접하는 경우가 많다. 한 학기 3개월 남짓한 기간 동안 프로그래밍에 대해 아무것도 모르는 사람이 Computational Thinking을 할 수 있게 하고, 어떤 프로그래밍 언어로 뭔가 쓸모있는 프로그램을 만들게 한다? 일주일에 2시간씩 듣는 수업을 통해 뭔가 의미있는 무엇인가를 만들기에 3개월은 너무 짧은 시간이다. 아마 매일매일 수업듣고 프로그래밍만 하는 국비과정 학생들에게도 3개월은 부족할 것이다.

  2. 교수의 문제 교수는 연구자다. 개발자가 아니다. 그들은 새로운 지식을 만들어내는 사람이지 새로운 프로그램을 만들어내는 사람이 아니고, 실제 구현보다는 아이디어와 통찰력으로 승부하는 사람이다. 한마디로 말하자면 그들은 프로그래밍과 개발의 전문가가 아니다. 결국 대학이 교수에게 프로그래밍 강의를 맡기는 것은 같은 포르투갈어를 쓴다는 이유만으로 포르투갈학 박사에게 브라질학 강의를 시키는 것과 다를 바 없다. 당연히 수업의 질은 떨어진다. 이 문제는 사실 굉장히 간단한 방법으로 해결 가능하다. 강의교수 (lecturer)을 많이 고용하는 것이다. 실제 개발 경험이 많은 사람들을 강의교수로 선임해 이런 기초 프로그래밍 과목을 맡기는 것은 수업의 질을 높여주는 것은 물론이고, 전임교수들이 자신의 전공 분야에 대한 심도있는 수업을 개설할 여력을 주기에 교육과정 전반을 발전시킬 것이다. 그러나 아주 슬프게도 우리나라에서는 교육법상 비전임교원 (시간강사, 강의교수, 연구교수 등)을 정규직으로 뽑지 못한다. 박사급이나 되는 사람들이 고작 비정규직 하려고 연봉을 억단위로 주는 회사를 버리고 대학에 올리는 만무하다.

  3. 조교의 문제 위에서 말했듯이 교수는 프로그래밍의 전문가가 아니다. 그래서 조교의 도움을 받는다. 과제를 준비하고, 시험을 내고, 채점하는 것은 조교의 몫이다. 그러나 조교 역시 주 업무가 교수의 수업을 보조하는 것이 아니다. 조교들의, 아니 대학원생들의 본 업무는 연구고, 사실 수업 준비 좀 대충 한다고 해서 큰 문제가 생기는 것은 아니다. 자연히 과제의 질은 떨어지고, 시험은 채점하기 쉬운 손코딩으로 나오기 시작하며 결국 피해는 수강생들이 입는다. 조별과제 프로젝트를 할 경우 이 문제는 더 심해진다. 조교가 무슨 프로그래밍의 굇수도 아니고, 프로젝트 하나하나를 케어하는 것은 불가능하고 뭐 그럴 의지조차 없는 경우가 비일비재하다. 이와 관련해 하나 재밌는 일화가 있다. 이전에 P모공대에서 열린 객체지향프로그래밍 수업에서 조교가 과제 문서를 배포했는데, 프로그램 캡쳐가 프로그램을 개발해서 이를 실행시켜 캡쳐한 것이 아니라 cout(표준 출력)으로 찍은 것이었다. 이걸 들킨 이유도 코미디가 따로 없었는데, 똑같은 기능인데 어떤 캡쳐에서는 문제 :(콜론)을, 또 다른 캡쳐에서는 ;(세미콜론)을 쓰고 있었던 것이다. 뭐 이거 말고도 또 다른 조교가 테트리스를 만들어오라고 한 후 그냥 테트리스 링크를 걸고 그대로 만드세요 라고 한 경우도 있었고, 뭐 그 당시 조교들이 한심한 꼴을 많이 보여줬다고 들었다. 사실 이걸 가지고 지금 이 순간에도 컴퓨터공학의 발전을 위해 갈려지고 있는 이 땅의 모든 조교(대학원생)들을 욕하려는 것은 아니다. 나 역시 대학원생이기에 얼마나 많은 대학원생들이 과중한 업무에 시달리는지 잘 안다. 그러나 최소한 선은 지켜야지!

  4. 학생의 문제 생각보다 대학생들은 공부를 열심히 하지 않는다. 이는 소위 말하는 띵문머도 마찬가지다. 다들 술먹고 노느라 바쁘다. 지금 이 문장을 읽고 나는 아니라고 생각하지 않았나? 바로 너 얘기다. 뭐 사실 열심히 사는 학생들도 많지만, 이런 학생들 역시 프로그래밍 수업만 듣지 않는다. 수학도 배워야 하고, 교양도 들어야 하고, 동아리도 하고 할게 많다. 그렇기에 1번에서 말했던 “짧은 기간 안에 프로그래밍을 제대로 배울 수 없다는 문제”는 더욱 심화된다.

Curriculum Design

Problem Solving

아무튼 이러저러한 문제가 있다고 이야기했다. 그런데 세상에서 제일 꼴불견인 사람은 뭔가를 비판하거나 비난한 다음에 대안을 제시하지 않는 사람이다. 나는 그런 사람이 되기 싫었기에 대안을 제시했다, 그러나 대안을 제시할 시간도 경험도 없었기에 오랫동안 입을 닫고 있었다.

그런데 올해 초 여자저차 이러쿵저러쿵해서 대학생들한테 cpp를 강의할 기회가 생겼고, 나는 나의 대학 프로그래밍 교육에 대한 허접한 이상을 실현할 기회라고 여겨 열심히 커리큘럼을 만들고 매주 강의를 진행했다. 그 커리큘럼의 특성과, 그 특성들이 위에서 언급한 문제를 어떻게 해결하는지에 대해 간단히 설명하자면 다음과 같다.

  1. 무엇인가 실제로 사용할 수 있는 프로그램을 만들어낼 수 있는 능력을 빠르게 기르는 것을 주된 목표로 삼았다. c++을 통해 프린이 레벨에서 좀 실용적인 프로그램을 만들어내려면 STL과 GUI의 사용법을 알아야 한다. 그렇다. 위에서 말한 학교의 문제다. STL이 제공해주는 편리한 인터페이스와 자료구조가 개발기간을 얼마나 단축시키는지는 말할 것도 없다. GUI를 배워야 하는 이유는 위에서 구구절절 설명했다. 그런데 GUI 프로그래밍의 구조를 알기 위해서는 객체, 클라스, 상속, 다형성 등의 개념을 알아야 하고, STL을 이해하기 위해서는 template에 대해 이해해야 한다. 애초에 STL의 이름이 Standard Template Library다. 이러한 개념들을 모르고 GUI와 STL에 대해 가르치는 것은 사칙연산을 모르는 사람에게 미적분을 가르치는 것과 다를 바 없다. 물론 사칙연산 모르고 미적분을 할 수는 있다. 그 옛날 인간극장에서 미적분을 시연하기 위해 문제와 풀이를 몽땅 외워서 쓰고 있던 유근이처럼 말이다. 그런데 뭐 그게 제대로 하는 건 아니지 않은가? 나는 예전에 과제를 대행해주던 중 template이 뭔지, 링크드리스트가 뭔지도 제대로 가르쳐주지 않고 STL에 포함된 vector를 사용하게 하던 모 대학의 만행에 경악을 금치 못했다. STL을 가르치는 것은 아주 좋은 일이지만, 제대로 가르쳐야 한다. 뭐, 내 커리큘럼에서는 최소한 가르치는 순서는 정상적이다.

곧 제대하는 유근이가 표절 경험을 딛고 훌륭한 연구자로 성장하길 진심으로 기원한다.

  1. 아주 흥미롭고 재미있고 유익하며 그때그때 배운 내용을 잘 적용할 수 있는 과제를 제공한다. 이를 달성하기 위해 뭔가 깔쌈한 무언가를 보여주는, 뭔가 있어보이는, 또한 뭔가 흥미롭게 배울 수 있는 과제를 제작했다. 뭔가가 붙은 이유는 그게 사실 나 혼자만의 생각일 수도 있기 때문이다. 만일 과제를 해보고 그렇지 않다고 느낀다면, 새로운 과제를 기여해주길 바란다. 특히 cpp로 간단한 인공지능 손글씨 분류기를 짜는 과제는 아주 심혈을 기울여 만들었다. 이 과제를 통해 학생들은 c++에서 아주아주 중요한 클래스, 상속의 개념과 함께 인공지능에 대해서도 아는척을 할 수 있게 된다. 우리는 AI 시국에 발맞춰야 한다.

  2. 쉬운 내용은 호다닥 끝내버리고, 중요한 개념들 위주로 커리큘럼을 만들었다. 개인적으로 대학교에서 프로그래밍을 처음 배우는 학생들이 이를 어려워하는 가장 큰 이유중 하나가 처음에 쉬운거를 길게 끌기 때문이라고 생각한다. 솔직히 for문 if문 이런거 10분만 설명해도 충분한 것을 한주씩 수업하고 앉아있으니 제대로 따라가지 않기 시작하는 것이 이상한 일은 아니다. 문제는 이제 그러고 포인터 지옥에 빠졌을 때도 그 태도를 버리지 못하다가 과제 마감 직전에 멘탈이 나가고 결국 수업을 드랍하게 된다는 것이다. 또 앞쪽에서 배운 기본 문법을 까먹는 일도 발생한다. 나는 이러한 문제를 해결하기 위해 기초적인 문법을 한주만에 다 끝내버리는 방식을 선택했다. 물론 무책임하게 공부하라고 개념한 덜렁 적어놓지 않았고, 각 문법을 제대로 이해하기 위한 실습을 제공했다. 이를 통해 학생들은 초반에 조금 힘들 수는 있어도 c++의 문법을 빠르게 익히게 되고, 포인터, 객체, 템플릿 등 뒤에 개념을 어려워하지 않게 된다고 나는 생각한다. 결과적으로 더 많은 내용을 집약적으로 배울 수 있게 되는 것이다.

뭐 이렇게 위에서 언급한 문제들을 어떻게 해결하려 했는지 구구절절 적어보았다. 2번이 빠진 이유는, 나 역시 개발의 전문가가 아니기에 이를 해결할 수 없기 때문이다. 2번을 해결하기 위한 개발 전문가들의 기여를 기다린다.

Additional Feature

나는 여기에 더해서 학생들이 프로그램을 만들고 땡치는 커리큘럼을 원하지 않았다. 컴퓨터과학, 공학에 관심을 가지고, 컴퓨터가 어떻게 돌아가는지 대략적으로나마 이해시키고 싶었다. AI 과제를 만든 것도 같은 맥락에서였다. 이 목표를 위해 나는 포인터, 동적할당과 같이 하드웨어와 밀접하게 연관된 부분들에 대해서도 확실하게 짚고 넘어가는 것을 선택했다. 물론 이런 부분들을 배우는 것은 당연히 프로그래밍 실력 향상에도 도움이 된다. 또한, 나는 여러 도구들에 익숙해지는 것 역시 개발에 있어 아주 중요하다 본다. 그래서 missing session이라는 이름으로 git, vim, latex 과 같은 유용한 도구들에 대해서도 배울 수 있는 코너를 마련해 놓았다.

Conclusion

뭐 이렇게 해서 디자인된 커리큘럼은 깃헙 레포지토리에서 확인할 수 있다. 위에서 언급했듯이 이 커리큘럼을 사용해 5명의 대학생들을 실제로 4개월간 가르쳤고, 굉장히 좋은 반응을 얻었다. 중간에 그만두신 분도 계시긴 하지만 그것은 그분의 스케줄 때문이지 절대 커리큘럼의 문제는 아닐 것이다.

컴퓨터공학과의 교육과정을 까면서 커리큘럼의 우수성을 역설했지만, 사실 내가 만든 자료 역시 아직 부족한 점이 많다. 일단 혼자 만들어서 그렇기도 하고, 과제에도 (지금까지 나오진 않았지만) 버그가 숨어있을 가능성이 있다. 그래서 나는 여러분의 기여가 절실하다. 만일 이 글을 읽고 내 커리큘럼을 비판하고자 한다면, 그 비판할 만한 부분을 발전시켜 기여해주길 바란다. 깃헙 스타도 부탁한다. 스타는 개발자들의 일용할 양식이다!!