CS50를 마치며 cover image

CS50를 마치며

김재동 • November 4, 2015

daily

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

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

미리 알아두면 좋은 점

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의 문제들은 단순히 점수를 매기기 위한 것이 아니라 이 또한 배움의 연장이라는 생각이 들게끔 만들어져 있다는 것이었다. 문제를 풀기 위해 필요한 개념을 설명한 동영상과 자료들이 문제 속에 많이 포함되어 있고 문제를 해결하기 위한 단서와 가이드라인을 잘 제공해주고 있다는 생각이 들었다. 각각의 문제를 간략히 살펴보면 아래와 같다.

페이스북에 소개한 글

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

정리하며

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

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

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