brunch

라이킷 댓글 5 공유 449 브런치 글을 SNS에 공유해보세요
log 까먹은 문돌이의 컴퓨터공부
By dwan . May 09. 2017

나만의 프로그래밍 공부 커리큘럼 짜기

거, 공부하기 딱 좋은 디지털 시대네.

지난 글에서 무엇이 프로그래밍인지에 대한 나의 생각을 말했다. 오늘은 내가 어떻게 프로그래밍을 공부하고 있는지 이야기해볼까 한다.


나는 이번 학기에 컴퓨터공학 복수전공을 시작했다. 하지만, 수업을 한 달 정도 들어보니 학교 수업과 다른 리소스를 병행하는 것이 좋겠다는 생각이 들어서 이것저것 결합해서 나만의 커리큘럼을 만들었다.


시대가 변했다. 공부하기 좋은 리소스들이 넘치는 디지털 세계에서 학교 수업만으로 공부하는 것은 많은 기회를 보고도 잡지 않는 것이라고 생각한다.


공부를 하다보면 점점 더 큰 그림을 볼 수 있게 되기 때문에 조금씩 바뀌고 있긴 하지만, 현재 나의 커리큘럼을 소개해보겠다.



우선, 나만의 커리큘럼을 만들어야겠다는 생각이 든 것은 우연히 다음 글(https://hackernoon.com/i-wanted-to-learn-computer-science-so-i-created-my-own-degree-heres-my-curriculum-bad56f28c278)을 읽었기 때문이다. 요약하면 컴퓨터공학을 공부해야겠다는 생각이 든 글쓴이가 학교로는 돌아가기 싫어서 MOOC(Massive open online courses)를 가지고 자신만의 커리큘럼을 만들었다는 이야기다.


잠깐 MOOC에 대해 설명해보면,

무크(MOOC)는 학습자가 수동적으로 듣기만 하던 기존의 온라인 학습동영상과 달리 교수자와 학습자, 학습자와 학습자간 질의응답, 토론, 퀴즈, 과제 제출 등 양방향 학습이 가능한 새로운 교육 환경을 제공합니다. -위키백과

MIT, Harvard, Stanford 와 같은 유명 대학의 수업을 온라인으로 들을 수 있다. 수업을 동영상으로 듣고 과제가 있으며, 커뮤니티에서 Q&A도 할 수 있고, 시험도 본다. 돈을 내면 피드백과 수업 이수에 대한 Certification도 제공한다.(이게 실효성이 있는지는 잘 모르겠다만) 한국에도 K-MOOC라 해서 무크를 도입하고 있긴 한데, 외국의 MOOC에 비해 퀄리티가 현저하게 떨어진다. 오프라인 수업을 단순히 영상으로 촬영한 수준에 머물러있는 느낌.


MOOC로 공부를 하면서 든 생각은 대학이 단순한 지식 전달 이상의 가치를 제공하지 못하면 언젠가 몰락할지도 모르겠다는 것이다.


다시 본론으로 돌아가서, 어떤 사람이 이 커리큘럼을 들을 수 있을까?


1. 공부하려는 의지: 이게 가장 중요하다고 생각한다.

2. 프로그래밍 경험: 없어도 무관하다고 생각한다. 이 커리큘럼의 첫 수업인 Harvard CS50는 정말 쉽게 컴퓨터공학을 가르쳐준다.

3. 영어 리딩 능력: 영어를 읽는데 많은 부담을 느낀다면 MOOC 수업을 듣다가 지쳐버릴 것이라 생각한다. 토익 7-800점 정도의 리딩 실력이면 괜찮지 않을까 싶다. 물론, 1.이 강하다면 영어 공부를 하면서 꾸역꾸역 진행할 수도 있을 것이다.

4. 수학: Log 까먹은 문돌이가 컴퓨터 공부하는 이야기. 나의 첫 글이다. 나는 log도 모르는 상태에서 프로그래밍 공부를 시작했다. 수학 공부는 앞으로 시작하면 되는 것이라고 생각한다.



나의 커리큘럼은 어떤 리소스로 이루어져 있나?

MOOC - 대학 수업: MIT, Harvard 등의 수업을 듣는다. MOOC 플랫폼인 Udacity, edX, MIT opencourseware를 활용한다.

Khan academy: 칸이라는 사람이 어린 조카를 위해 수학 가르치는 동영상을 찍어 올린 게 시작점이 된 교육 비영리기관이다. 빌게이츠가 후원하는 걸로 알고 있다. 여러 과목을 가르치지만 나는 칸 아카데미에서 수학 공부를 할 계획이다. 학생을 대상으로 한 서비스라서 그런지 쉽게 가르친다.

FreeCodeCamp: 부트캠라고 해서 실리콘밸리에서 인기있는 단기간에 웹 프로그래머가 되는 과정이 있다. 프리코드캠프는 이와 비슷한 수업을 온라인으로 무료로 수강할 수 있도록 도와주는 비영리기관이다. 웹 프로그래밍을 브라우저에서 직접 코드를 입력해보며 배울 수 있다. 무료지만 컨텐츠가 잘 만들어져어 처음 시작하는 사람도 부담없이 시작할 수 있으며 커뮤니티가 활발해서 모르는 걸 질문하면 친절하고 빠른 답변을 들을 수도 있다. 총 이수해야 하는 시간을 2,000시간으로 명시하고 있는데, 공부해보니까 길어도 1,000시간 정도면 끝낼 수 있을 것 같다. (*참고로 국내 유료 부트캠프로는 코드스테이츠가 있다.)

기술 서적: 번역서보다는 한국인 저자의 책을 골랐다. 제대로 번역되지 않은 기술 용어는 어려워서 한국인 저자의 책이 이해하기 쉬운 경우가 많았다. 외국 서적이 읽고 싶다면, 차라리 원서를 보는 게 나은 것 같다.

학교 수업: 나는 학교를 다니고 있기 때문에 학교 수업을 13개 정도 커리큘럼에 포함시켰다. 하지만, 독자들의 편의를 위해 앞으로 소개하는 커리큘럼에는 이를 포함시키지 않았다.


그리고 커리큘럼에 포함되어 있는 것말고도 다음과 같은 것들로 공부를 하고 있다. 기술적인 것보다는 어떤 걸 공부해야 할지, 어떤 태도를 가져야 할지에 대한 인사이트를 얻기 위함이다. 시간을 정해놓고 보기보다는 심심할 때 편안한 마음으로 본다.


A. 개발자 코스프레하기: 개발자들은 평소에 이런 걸 하며 시간을 보내지 않을까하는 것들을 실천해보고 있다.

유튜브[포프TV]: 김포프라는 잘생긴 개발자님이 개발에 대한 여러 사실들을 올려주신다. 어떤 태도를 갖고, 어떤 방식으로 프로그래밍을 공부할지에 대한 인사이트를 많이 얻을 수 있다.

유튜브[개발 관련 아무거나]: 쉬거나 이동할 때, 개발 관련된 영상들을 아무거나 본다. 개발 컨퍼런스를 볼 때도 있고, 코딩 인터뷰를 볼 때도 있다. 실리콘밸리 취업 가이드 같은 것도 본다.

기술 블로그: 심심할 때마다 기업들의 기술 블로그를 본다. 내가 구독하는 블로그는 다음과 같다. 네이버 D2 카카오 아마존 웹 서비스 SK플래닛 티몬 비트윈 우아한형제들(배민) 스포카 리디북스 outsider's dev blog realm 

개발자 자기계발서: 기술 서적 외에 개발에 대한 이야기들이 담긴 책을 읽는다. 요즘 읽고 있는 책으로는 기술 지식이 거의 필요 없는 책은 <해커와 화가>, <소프트 스킬>, <알고리즘 행성 여행자들을 위한 안내서> 가 있고, 기술 지식이 필요한 책은 <실용주의 프로그래머>, <조엘 온 소프트웨어>, <스타트업 인 액션>가 있다. // 추후에 괜찮은 책들의 리스트를 정리해 포스팅할 것이다.

B. +Alpha: 길게 보면 결국 다 도움이 되지 않겠는가. 

기획 독서: 첫 글에서도 말했지만 프로그래밍은 문제를 해결하기 위한 수단이다. 고로 무슨 서비스를 만들지 기획하는 능력이 필요하다고 생각한다. 나는 기획자 출신이지만, 기획자 입장에서의 기획과 개발자 입장에서의 기획은 조금 다른 것 같아서, 앞으로 더 많은 책을 읽어볼 계획이다. 지금은 <구글: 스프린트>를 읽고 있다. 추천하는 책으로는 <생각하는 늑대 타스케>, <린 스타트업>이 있다.

인문학/사회학 독서: 독서 소모임을 운영하며 2주에 한 권씩 인문학이나 사회학을 읽고 있다. 인문학과 사회학은 자기 자신에 대해 깊이 고민하는 데 도움을 주어 자기 확신을 갖게끔 도와준다. 또한 사회와 나의 관계에 대해 생각해보고, 나아가 당연한 것들에 대해 의문을 제기할 수 있는 힘을 길러준다. 어떤 분야에서 일을 하든지 질문하는 능력은 탁월해지기 위해서 도움이 된다고 생각한다. 최근 읽고 있는 책은 <의심의 철학>이다.



나의 커리큘럼의 목표는 무엇인가?

2년만에 대단한 프로그래머가 될 수 있을 거라곤 생각하지 않는다. 성장 잠재력이 높은 소프트웨어 엔지니어가 되고 싶다. 다음과 같은 능력을 함양하고자 한다.

[중요: 스스로 학습할 수 있는 능력] (대학의 목적은 스스로 가르치는 자의 양성이다. -밀스)

새로운 기술을 빠르게 파악해 학습 및 적용할 수 있는 능력

컴퓨팅(Computational), 수학적 사고력

당연한 것에 의문을 던질 수 있는 통찰력

다양한 프로그래밍 언어 경험

유명 자료구조들을 이해하고 직접 구현할 수 있는 능력

유명 알고리즘들을 이해하고 복잡한 문제를 해결하기 위한 알고리즘을 스스로 설계할 수 있는 능력

사용자 경험(UX)에 대한 이해

문제를 정의하고 그에 대한 해결책을 프로그래밍으로 디자인할 수 있는 능력

내가 습득한 지식을 쉬운 언어로 다른 사람들에게 전달할 수 있는 능력

실무 개발 능력

오픈 소스 프로젝트에 참여할 수 있을 정도의 기술 지식, 참여 경험

흥미로운 토이 프로젝트 포트폴리오



나의 커리큘럼은 어떤 수업들로 이루어져 있나?

구글 커리어 가이드, 서울대학교 컴퓨터공학부 표준 이수 형태, 오픈 소스 대학(OSSU), 개인이 짠 커리큘럼, <스타트업 인 액션> 등을 참조했고(출처는 하단의 참고한 것에 있다), 이론뿐만 아니라 실무도 배우고 싶어서 웹 프로그래밍 / 게임 프로그래밍 / 응용 프로그래밍(스프레드시트, 워드프로세서 같은 것)을 넣었다. 정리해보면 다음과 같다,


A. 컴퓨터공학

1. 컴퓨터공학 기초

Harvard CS50

2. 하나의 언어를 깊게 파기: C

책 <열혈 C 프로그래밍>, 윤성우

<C programming: A modern approach>, K.N.King

3. 객체지향 언어 하나를 깊게 파기: Java [Python도 염두해두고 있다. (17.5.25 추가)

Java Programming: Data Structures and Beyond, UC San Diego.

책 <자바의 신 1>, 이상민

책 <자바의 신 2>, 이상민

첫 프로그래밍 언어로써 왜 Python인가? (17.5.25 추가)

4. 수학: 이산수학(Discrete mathematics), 선형대수학(Linear algebra)

Khan Academy - linear Algebra

책 <Linear algebra and its applications>, gilbert strang

Discrete mathematics: MIT 6.042J

5. 테스팅과 디버깅

Software debugging(Udacity)

Software Testing(Udacity)

책 <how google tests software>

6. 자료구조와 알고리즘

책 <열혈 자료구조>, 윤성우

Introduction to algorithm: MIT 6.006 

(advanced) Algorithm part 1 & part 2

백준저지(알고리즘 문제 사이트)

<알고리즘 문제해결 전략>, 구종만 (17.5.25 추가)

Udemy: 코딩 인터뷰 완전 준비 (17.5.25 추가)

7. 컴퓨터구조 및 운영체제

Computer Architecture: MIT 6.823

Operating System: Computer Science 162 by UC berkele

8. 인공지능(머신러닝)

Artificial Intelligence: MIT 6.034

9. 프로그래밍 언어와 컴파일러

Computer language engineering: MIT 6.035

10. 암호학 및 보안

Stanford Cryptography1

11. UX 디자인: UX가 무엇인가에 대해서는 pxd lab의 글을 참조. 공부 리소스는 홍대 IDAS 나건 교수님이 추천해주신 책으로 선정했다.

<Design of everyday things>, Don Norman 

<Human Factors in Engineering and Design>, McCormick & Sanders

12. 소프트웨어 엔지니어 인터뷰

Mastering the Software Engineering Interview


B. 실무적인 것

1. 웹/앱 프로그래밍

웹 풀스택 부트캠프(FreeCodeCamp)

IOS: Intro to IOS App development with Swift

Android: Android Developer Nanodegree by Google

2. 게임 프로그래밍

C#: MSDN (마이크로소프트의 C# 튜토리얼), 책 <뇌를 자극하는 C# 5.0 프로그래밍>

유니티: 책 <절대강좌! 유니티 3D>, <유니티 2D 게임 공작소>

Coursera: Build a Game Using Unity 3D

3. 응용 프로그래밍

MSDN .Net document (마이크로소프트가 제공하는 .Net 프레임워크 공식 문서)


이 글은 주기적으로 수정될 예정이다. 아직 모르는 부분이 많고(게임, 응용 프로그래밍 파트의 여백의 미를 보라), 공부를 하면 할수록 어떤 방향으로 나아갈지가 명확해지기 때문이다.



학기1

A1. 컴퓨터공학 기초:

Harvard CS50

하버드의 Computer Science Intro 수업이다. 듣고 반해버렸다. 컴퓨터공학을 입문하는 데에 최고의 강좌라고 생각한다. 스크래치라는 쉬운 교육용 프로그래밍 언어로 시작해서, C 언어를 가지고 배열, 알고리즘, 메모리, 자료구조를 설명하고 HTTP, 머신러닝, Python, SQL, Javascript의 기본을 알려준다.


A2. 하나의 언어를 깊게 파기:

책 <열혈 C 프로그래밍>, 윤성우

국내 C 언어 책 중 가장 유명한 <열혈 C 프로그래밍>을 가지고 공부를 하고 있다. 학교 수업을 듣다가 열혈 C 책을 읽어보니, 윤성우 저자님께 감사하다는 생각이 들었다. 정말 쉽게 써주셨다. 웹 프로그래밍으로 입문한 내가 C 언어를 공부하면서 느끼는 건, 정말 컴퓨터를 배우고 있다는 생각이 든다는 것이다. C 언어를 공부하다보면 컴퓨터의 표현 방식, 데이터 타입, 포인터, 입출력 등 컴퓨터의 작동 원리에 대해 생각해보게 된다.


(17.5.25 추가)

<C programming: A modern approach>, K.N.King 

열혈 프로그래밍을 읽으면서 C언어라는 게 대충 어떤 건지 알고 나서 이 책을 보기 시작했다. 이 책은 C언어를 제대로 공부할 수 있는 책이다. 영어라는 게 단점이지만, 어려운 단어가 별로 없어서 쉽게 읽히는 편이다. 왜 저 책을 추천하는지에 대해서는 다음의 글을 읽어보자: C언어 공부법과 책 추천


(17.5.25 추가) 

A6. 자료구조와 알고리즘: 

책 <열혈 자료구조>, 윤성우

다음 학기부터 시작하려던 자료구조 공부를 앞당겼다. 자료구조와 알고리즘이 컴퓨터공학의 핵심임을 알게 되었기 때문이다. 하나의 언어를 적당히 다룰 수 있으면 바로 알고리즘 공부를 시작하는 게 좋다고 생각한다. 처음에 욕심을 부려서 <코딩 인터뷰 완전 분석>이라는 유명하지만 어려운 알고리즘 책으로 공부를 시작 했는데, 너무 어려워서 기초부터 천천히 공부하기로 했다... C언어밖에 못 다루는 나는 C언어로 된 자료구조 책인 <열혈 자료구조>로 공부를 하고 있다. (통상적으로 자료구조 -> 알고리즘 순서로 공부를 하는 것 같다.)


B1. 웹/앱 프로그래밍:

부트캠프(FreeCodeCamp)

FreeCodeCamp는 웹 프로그래밍(프론트엔드, 백엔드, 컴퓨터공학 기초)을 공부하는 과정이다. 명시된 필요 공부 시간은 2000시간인데, 좀 뻥튀기한 것 같고, 1100시간 정도면 학습을 끝낼 수 있을 것 같다. 크게 보면 다섯 부분로 나뉜다.

1) 프론트엔드: 200시간

2) 데이터 시각화: 200시간

3) 백엔드: 200시간

4) 프로젝트: 400시간

5) 코딩 인터뷰: 100시간

이번 학기에 저것들을 다 들을 순 없고 1) 프론트엔드 2) 데이터 시각화를 들을 것이다.

영어가 부담스럽다면 생활코딩을 추천한다. 웹 애플리케이션 만들기 수업 기준 40시간으로 간단한 웹사이트를 하나 만들 수 있게 된다.

탈잉: 파이썬 웹 프로그래밍

지인이 웹 프로그래밍 강의를 열어서 조교로 참여하기로 했다. 입문자들과 같이 수업을 듣는데, 그들을 지켜보면서 어떤 어려움을 겪는지 기록해두고 나눠볼 계획이다. 


이곳부터는 미래에 대한 내용이라, 구체적으로 쓸 수 없다. 아마 시간이 지남에 따라 내용이 채워질 것이다.(아예 바뀔 수도 있다.)


학기1 - 방학

(17.5.25 수정) 수정 중에 있다. 자료구조 및 알고리즘 / 웹 프로그래밍에 집중할 것 같다. 

A4. 수학:

Khan Academy - linear Algebra

A5. 테스팅과 디버깅:

Software debugging(Udacity)

A11. UX 디자인:

책 <Design of everyday things>, Don Norman


B1. 웹/앱 프로그래밍:

부트캠프(FreeCodeCamp) 3) 백엔드 4) 프로젝트



학기2

A3. 객체지향 언어 하나를 깊게 파기: Java [Python도 고려 중이다.]

Java Programming: Data Structures and Beyond, UC San Diego.

책 <자바의 신 1>, 이상민

책 <자바의 신 2>, 이상민

첫 프로그래밍 언어로써 왜 Python인가?

A4. 수학:

책 <Linear algebra and its applications>, gilbert strang

A6. 자료구조와 알고리즘:

책 <열혈 자료구조>, 윤성우

A7. 컴퓨터구조 및 운영체제:

Computer Architecture: MIT 6.823


학기2 - 방학

A4. 수학:

Discrete mathematics: MIT 6.042J

A5. 테스팅과 디버깅:

Software Testing(Udacity)

책 <how google tests software>

A11. UX 디자인:

책 <Human Factors in Engineering and Design>, McCormick & Sanders


B1. 웹/앱 프로그래밍:

부트캠프(FreeCodeCamp) 5) 코딩 인터뷰

Android: Android Developer Nanodegree by Google




학기3

A4. 수학

오일러 프로젝트(수학 문제를 프로그래밍으로 푸는 사이트)

A6. 자료구조와 알고리즘:

Introduction to algorithm: MIT 6.006 

백준저지(알고리즘 문제 사이트)

A7. 컴퓨터구조 및 운영체제(OS):

Operating System: Computer Science 162 by UC berkele

A9. 프로그래밍 언어와 컴파일러:

Computer language engineering: MIT 6.035


B1. 웹/앱 프로그래밍:

IOS: Intro to IOS App development with Swift


학기3 - 방학

A4. 수학

오일러 프로젝트(수학 문제를 프로그래밍으로 푸는 사이트)

A6. 자료구조와 알고리즘:

백준저지(알고리즘 문제 사이트)


B2. 게임 프로그래밍:

C#: MSDN (마이크로소프트의 C# 튜토리얼), 책 <뇌를 자극하는 C# 5.0 프로그래밍>

유니티: 책 <절대강좌! 유니티 3D>, <유니티 2D 게임 공작소>

Coursera: Build a Game Using Unity 3D



학기4

A4. 수학

오일러 프로젝트(수학 문제를 프로그래밍으로 푸는 사이트)

A6. 자료구조와 알고리즘:

(advanced) Algorithm part 1 & part 2

백준저지(알고리즘 문제 사이트)

A8. 인공지능(머신러닝)

Artificial Intelligence: MIT 6.034

A10. 암호학 및 보안

Stanford Cryptography1

A12. 소프트웨어 엔지니어 인터뷰

Mastering the Software Engineering Interview


학기4 - 방학(+Alpha)

수평적인 조직 문화를 가진 스타트업에서 인턴을 해보며 실무 경험.


B3. 응용 프로그래밍:

MSDN .Net document (마이크로소프트가 제공하는 .Net 프레임워크 공식 문서)



위의 커리큘럼과 학교 수업을 병행하며 공부를 해볼 계획이다. 빡센감이 적지 않지만, 학교를 다닌지 4년차에 드디어 즐겁게 공부할 수 있는 게 생겨서 일단은 열심히 해볼 생각이다.


현재 내가 알고 있는 선에서 내가 공부하기에 제일 괜찮을 것 같은 커리큘럼을 여러 자료들을 참고하여 만들어보았다. 경력 개발자분들이 보기에는 엉성해보이는 커리큘럼일 수도 있을 것 같다. 댓글로 조언을 주신다면, 잘 새겨 듣고 커리큘럼을 보완할 것이다. 아마 이 커리큘럼은 계속해서 수정될 것이며, 본 커리큘럼을 이수하는 과정이 앞으로의 포스팅의 주제가 될 것이라 생각한다.


대학에서만 공부하는 시대는 지나갔다. 디지털 시대에서는 오프라인 수업, 온라인 수업, 책, 유튜브 등 다양한 매체를 가지고 공부를 할 수 있다. 프로그래밍도 그렇게 공부해보자. 프로그래밍은 꼭 전공자만의 것이어야 하는가?


Let's try a MOOC!



공유 수가 생각보다 많은 걸 보니 제 글이 누군가에게 도움이 되고 있나봅니다. 혹시 원하시는 주제가 있으시면, 댓글로 말씀해주시면 추후에 글을 쓰는 데에 도움이 될 것 같습니다. :)


지금 생각하고 있는 주제는 다음과 같습니다.

1) 기술 서적 리뷰

2) 개발자 자기계발서 리뷰

3) 헷갈리는 기술적인 내용들

4) 프로그래밍 공부 흐름


그리고 페이스북합니다. 프로그래밍에 관심있는 분과 교류하고 싶어요! (메시지 하나 주시면 감사합니다)

https://www.facebook.com/johsuakim.dwan


참고한 것:

모비인사이드: 스타트업 테크+@ 블로그 리스트 총 정리

카만녀님이 만드신 기술 블로그 정리 스프레드시트 https://docs.google.com/spreadsheets/d/19a_uaUBvbcoQ8u2v_h2dJjHUuPeno86rHCxQcOYx_8E/edit

MOOC/컴퓨터공학 커리큘럼

OSSU(Open Source Society University) 

Github own open source curriculum

google career guide 

I Wanted To Learn Computer Science so I Created My Own Degree — Here’s My Curriculum

서울대학교 컴퓨터공학부 전공 이수 표준 형태

10 courses every software engineers should take by Dave Xiang

sangkon님의 블로그: 내가 추천하는 프로그래머 필독서 50선

나프다 커뮤니티: 프로그래머 필수도서는 무엇이라고 생각하세요?

미디엄 CookAtRice님의 글 programming is not math

<스타트업 인 액션>, 전호상

[유니티독학] 추천 책 리스트 










keyword
magazine log 까먹은 문돌이의 컴퓨터공부
나를 긍정하려고 쓰는 사람. 카페에 앉아 생각하고 메모하고 책 읽고 대화하기를 즐김.
댓글

    매거진 선택

    키워드 선택 0 / 3 0
    브런치는 최신 브라우저에서 최적화 되어있습니다. IE chrome safari