CS50는 하버드 대학교의 컴퓨터과학 강좌명이다. 내가 이 온라인 강좌를 edX라는 MOOC 플랫폼을 통해 수강하게 된 계기는 페이스북 SW교육을 준비하는 선생님들의 모임 그룹에서 이런 강의가 있다는 것을 우연히 알게 되었기 때문이다. 이 글을 본 것이 올해 초였으니 마지막 과제를 제출하기까지 거의 1년이 걸렸다. 중간 중간 다른 일들이 있기도 했고 또 의욕이 충만했다가 사라졌다가를 반복했으니 당연한 결과라는 생각도 들지만 어쨌든 올해 목표로 잡았던 CS50 과정을 무사히 수료했다.

혹시나 이 과정에 도전할 다른 분들에게 도움이 될까 싶어 CS50에 대해 정리해보고자 한다.

미리 알아두면 좋은 점

  • CS50는 무료로 수강이 가능하며 self paced course, 즉 자신이 원하는 때에 언제든지 강의를 보고 과제를 제출할 수 있다.
  • 모든 강의는 영어로 진행된다. 따라서 영어 듣기 및 독해 능력을 필요로 한다. 다만, 동영상의 경우 스트리밍이 아니라 다운로드를 통해 시청할 수도 있는데 이때 한글 자막을 받아서 볼 수 있다. 그렇지만 모든 강의의 과제는 영어로 설명되어 있고 제출도 영어로 해야 한다.
  • ‘이 강의를 듣기 위해 선수지식이 필요없다.‘고 적어도 그들은 주장한다. 실제로 강의를 보면 알고리즘이나 어떤 원리에 대해 설명할 때 최대한 이해하기 쉽도록 실물을 사용하거나 학생들이 직접 체험하게 하고 있다. 하지만 개인적으로는 프로그래밍이나 컴퓨터의 동작원리에 대한 기본적인 이해가 있어야 수강이 수월하다고 생각한다.
  • 모든 강의 영상과 강의 자료 등은 공개되어 다운로드가 가능하다. 따라서 이 과정의 이수보다도 어떤 식으로 프로그래밍을 가르치는지에 대한 힌트를 얻고 싶은 선생님이 계신다면 이 강의를 살펴보는 것을 추천한다. 대학생을 상대로 하기 때문에 수준의 차이는 있겠지만 학생들에게 프로그래밍의 원리를 이해시키고자 할 때 어떻게 접근하는 것이 좋은지에 대해 고민해볼 수 있는 좋은 계기가 될 것이다.
  • 이 강의는 2015년 12월 31일이 마감일이다. 만약 이수하기를 원한다면 지금부터 12월 31일 사이에 모든 과제를 완료해야 한다. 다만 이 강의는 매년 새롭게 시작하기 때문에 올해를 놓쳤다면 내년초를 기약하면 된다.

edX에서 CS50 수강하기

먼저 edx에 가입을 하고 사이트에서 cs50로 검색을 하거나 https://www.edx.org/course/introduction-computer-science-harvardx-cs50x 에 접속한 후 ‘Enroll Now’ 버튼을 누르면 된다.

더 이상의 설명은 생략한다.

강의 개요

아래는 CS50의 소개 영상이다. 처음부터 마지막까지 강의를 이끌어나가는 David J. Malan 교수의 이야기를 직접 들어보자.

강의는 WEEK0부터 WEEK12까지 총 13주차의 내용을 담고 있지만 WEEK11은 휴일이어서 12주로 편성되어있다고 보면 된다. 보통 한 주차에 2개의 강의(Lecture, Lecture continued)가 있고 한 강의가 보통 1시간 내외의 분량으로 구성되어 있다. Lecture외에 Workthroughs, Section, Shorts 등이 있는데 이는 기본 강의를 도와주는 보조 강의들로 본인이 잘 이해하고 있다면 꼭 듣지 않아도 된다.

대부분 주당 한 가지의 과제가 있는데 Problem Set에서 확인이 가능하다. Problem Set은 0부터 8, 그리고 기말 과제(Final Project)까지 총 10개가 존재한다. 각각의 Problem Set은 또 다시 작은 몇 가지의 문제들로 구성되어 있다. Problem Set 1부터 5까지는 소스코드를 제출하면 컴퓨터가 직접 채점해서 바로 결과를 확인할 수 있고 그 외 과제들은 제출하면 최대 2주안에 CS50 스탭이 채점하여 Gradebook을 통해 그 결과를 확인할 수 있다.

주요 내용

보통 ‘프로그래밍’하면 대학에서는 C언어를 많이 다룬다. 교대 재학시절에도 컴퓨터교육이 전공이어서 C언어를 한 학기동안 배운적이 있는데 CS50는 이에 비해 상당히 많은 주제에 대해서 생각보다 깊게 배운다. 한마디로 빡세다. 간략하게 소개하자면 이 강의는 C언어, 알고리즘과 자료구조, 디버깅, 메모리 최적화, 네트워크, 웹 개발, MVC 등에 대해 다룬다. 아래의 강의 계획을 보면 굉장히 많은 개념들을 짧은 시간안에 소화한다는 것을 알 수 있다.

Week 1
Linux. C. Compiling. Libraries. Types. Standard output.

Week 2
Casting. Imprecision. Switches. Scope. Strings. Arrays. Cryptography.

Week 3
Command-line arguments. Searching. Sorting. Bubble sort. Selection sort. Insertion sort. O. Ω .Θ. Recursion. Merge Sort.

Week 4
Stack. Debugging. File I/O. Hexadecimal. Strings. Pointers. Dynamic memory allocation.

Week 5
Heap. Buffer overflow. Linked lists.

Week 6
Hash tables. Tries. Trees. Stacks. Queues.

Week 7
TCP/IP. HTTP. HTML. CSS.

Week 8
PHP. MVC. SQL.

Week 9
JavaScript. Ajax.

Week 10
Security. Guest Lecture.

Week 11
holiday

Week 12
Exciting conclusion.

과제들

각 주별로 주어지는 과제는 강의에서 배웠던 내용들을 잘 이해하고 응용해야만 해결할 수 있는 문제들로 구성된다. 인상깊었던 것은 CS50의 문제들은 단순히 점수를 매기기 위한 것이 아니라 이 또한 배움의 연장이라는 생각이 들게끔 만들어져 있다는 것이었다. 문제를 풀기 위해 필요한 개념을 설명한 동영상과 자료들이 문제 속에 많이 포함되어 있고 문제를 해결하기 위한 단서와 가이드라인을 잘 제공해주고 있다는 생각이 들었다. 각각의 문제를 간략히 살펴보면 아래와 같다.

  • Problem Set 0: Scratch
  • 조건에 맞게 스크래치 프로젝트를 만들어 보는 문제
  • Problem Set 1: C
  • 주어진 높이만큼 마리오 산(?)을 출력하는 문제
  • 잔돈을 거슬러 줄 때 동전이 몇 개 필요한지 계산하는 문제
  • Problem Set 2: Crypto
  • 주어진 문장을 몇 가지 방법으로 암호화 하는 문제
  • Problem Set 3: Breakout
  • 검색, 정렬에 관한 문제
  • 벽돌깨기 게임을 완성하는 문제
  • Problem Set 4: Forensics
  • BMP 파일의 구조에 대해 이해하고 암호화 되어 있는 사진 파일을 복구하는 문제
  • BMP 파일을 resize하는 문제
  • 파일 시스템의 구조를 이해하고 메모리 카드에서 삭제된 파일들을 복구하는 문제
  • Problem Set 5: Mispellings
  • 여러가지 자료구조 및 사전 파일을 활용하여 텍스트 파일의 맞춤법을 검사하는 문제
  • Problem Set 6: Web Server
  • HTTP 1.1의 명세를 이해하고 미완성 웹서버의 기능을 완성하는 문제
  • Problem Set 7: C$50 Finance
  • HTML/CSS, PHP, MySQL 등에 대해 이해하고 기본적인 CRUD를 다루는 웹사이트를 구축하는 문제
  • Problem Set 8: Mashup
  • 구글의 뉴스와 지도 API를 활용해 매시업 사이트를 제작하는 문제
  • Final Project
  • 기말 과제는 실제의 문제를 해결할 수 있는 것을 목표로 사용 언어나 형태의 아무런 제한 없이 자신만의 프로젝트를 만드는 문제다.
  • 앞의 문제들처럼 소스코드를 직접 제출할 필요는 없다. 대신 2분 이내의 영상을 만들어서 본인의 이름, 사는 곳과 프로젝트명, 그리고 프로젝트에 대해서 알리고 싶은 내용들을 담으면 된다.
  • 나는 초등학교 교육과정 중에 지역에 대해서 소개하는 편지를 교환하는 내용이 있는 것에 착안하여 보다 쉽게 학급 교류를 도와줄 수 있는 서비스를 만들었다. 크로스(https://cross.zzolab.com) 참고.
  • 크로스 개발 후기는 조만간 남겨볼 생각이다.

페이스북에 소개한 글

크로스는 학급간 교류를 도와주는 서비스이다. 초등학교 교과서를 보면 지역 사회의 자연환경과 인문환경에 대해 배우면서 지역을 소개하는 편지를 교환하거나 기행문을 교환하는 등의 활동이 있는데 이런 활동을 하기 위해 드는 교사의 노력을 좀 줄여줄 수 있는 서비스이다. 물론 이 외에도 프로젝트 수업을 한다거나 다른 지역의 학급과 무언가를 함께 하고 싶을 때는 언제든지 활용할 수 있다.
이 서비스의 가장 큰 특징은 학급 교류 희망을 지도를 통해 직관적으로 확인할 수 있다는 것이다. 보통 학급 교류를 희망하는 글은 인디스쿨 같은 커뮤니티에서 게시판을 통해 많이 게시되고 있는데 한 번에 확인하기도 어려울 뿐더러 이미 마감이 된 것인지 아닌지도 확인하기가 어렵다. 크로스는 이런 문제를 쉽게 해결할 수 있다.
사용법도 간단하다. 먼저 본인이 희망하는 내용대로 학급교류를 신청하고 다른 선생님의 신청에 교류 희망 의사를 표시하거나 나에게 들어운 희망을 수락하면 교류가 이루어진다. 이때 상대 학급 선생님의 이메일 주소 또는 휴대폰 번호 등을 가입할 때 등록한 이메일을 통해 안내해 주게 된다. 나에게 다른 선생님이 교류를 희망할 때에도 이메일이 발송된다.

정리하며

나는 초등학교 때부터 프로그래밍 공부를 시작했고 중학교, 고등학교, 대학교에 가서도 프로그래밍이나 자료구조 및 알고리즘에 대해 접할 기회가 있었다. 그리고 현재까지 여전히 컴퓨터 관련 일들을 조금씩 하고 있다. 이런 입장에서 CS50의 강의 계획을 처음 봤을 때는 사실 ‘이정도야 기본이지’하는 생각이 들었지만 막상 강의를 듣고 문제를 하나씩 해결하다보니 내가 생각보다 깊이 이해하지 못하는 것들이 눈에 들어오기 시작했고 깊이 파고들어가려면 한없이 들어갈 수 있겠다는 생각이 들었다. 물론 그렇게 하지는 않았다. 오덕후가 될까봐.

스택이나 큐, 연결리스트 같은 자료구조야 워낙 유명한 것들이지만 Trie 같은 자료구조에 대해 알게 되고 직접 프로그래밍 해본 것은 좋은 경험이었다. 또 포렌식 부분에서 암호화된 사진을 복호화 한다거나 웹서버 프로그램을 직접 완성해보는 것도 흥미로웠다. SW교육적인 측면에서는 Malan 교수가 정렬 알고리즘에 대해 설명하면서 학생들을 직접 무대 위로 불러 숫자나 문자가 인쇄된 종이를 하나씩 들고 다양한 방법으로 정렬하는 과정을 눈으로 볼 수 있게 한 것이 인상적이었다. 문자로 보거나 말로만 설명을 듣는 것보다 훨씬 직관적이고 이해하기 쉬웠다.

마지막 문제까지 제출하고 나니 올 한 해는 내가 하고 싶은 공부를 진득하게 해냈다는 생각이 들어서 정말 스스로에게 박수를 쳐주고 싶다. 잘했다 정말!!