본문 바로가기
카테고리 없음

MIT의 프로그래밍 언어-자료구조-알고리즘 강의의 내용과 수준에 대해서.

by 카카오블로거 2021. 12. 31.

MIT에서도 python을 사용하고 있기 때문에 python을 좋은 프로그래밍 언어이다. 이렇게 얘기하는 분이 있습니다.

제가 프로그래밍 언어를 왠만하면 C언어부터 하라고 하는 것은 그래야 학부모님들이 학원에서 하는 수업 자체에 대한 검증이라도 할 수 있기 때문입니다.

python 자체도 좋은 프로그래밍 언어이기는 합니다. 파이썬을 사용하기에 적합한 대상은 대학 졸업 예정자나 혹은 현업에서 일하는 개발자들에게나 좋은 프로그래밍 언어이지, 대학에서 컴퓨터공학을 전공하려는 학생들에게는 그다지 적합한 프로그래밍 언어가 아닙니다.

왜 대부분의 대학의 전공에서 파이썬이라고 하는 프로그래밍 언어가 1학년 1학기 공통 교양 강좌에서 개설이 되는지를 생각을 해봐야할겁니다.

Columbia 대학 공대의 1학년 수업을 보면, 아래와 같이 여러 프로그래밍 언어 및 matlab이 동시에 개설되어 있는 것이 보편적인 커리큘럼입니다. 근데 대부분 이런 얘기는 없이, 그냥 대학에서 python 수업이 개설되어 있으니, 이 프로그래밍 언어를 공부하면 된다는 식으로 글을 작성하는 분들이 있습니다.

대부분의 대학의 교양 강좌에서 보통은 python, R, Matlab 이런 수업들은 비전공자들이 데이터 분석을 위해서 사용하는 프로그래밍 언어 혹은 도구일뿐입니다.

ENGI E1006: Introduction to computing for engineers and applied scientists

COMS UN1003: Introduction to computer science and programming in C

COMS UN1004: Introduction to computer science and programming in Java

COMS UN1005: Introduction To Computer Science and Programming In MATLAB

COMS UN1007: For students who have placed out of COMS 1004 with AP scores

컴퓨터공학 전공

C, C++, Java, python, matlab 정도는 모두 사용할 수 있어야, 전공 수업 따라갈 수 있습니다.

(python 하나 가지고 버틸 수 있는 전공 아닙니다.)

공학계열(전자/기계)

하드웨어를 제어하는 측면에서 C언어는 구조체와 함수포인터를 사용하는 수준까지는 알고 있어야 하며, C++의 클래스를 사용하는 방법을 익히고, C#이라고 하는 프로그래밍 언어를 익히면 됩니다. C#이라고 하는 프로그래밍 언어는 C/C++의 포인터를 알지 못하는 Java 개발자들이 windows 운영체제 기반의 프로그램을 개발할 수 있도록 만든 프로그래밍 언어입니다.

그래서 C++의 클래스 구조를 익히거나 혹은 Java를 공부하고 java의 graphic/swing 관련 개념들을 학습하고 C#으로 넘어가면 공부할 때 좀 수월하게 넘어갈 수 있을 겁니다.

전공 수업에서 데이터 분석을 위한 수치해석 프로그램 및 차트(그래프)그릴 때 필요한 프로그램으로 matlab이 필요하니, C/C++을 공부하고 matlab으로 넘어가야 합니다.

일부 대학에서 matlab 대신에 python으로 수업을 하는 경우들도 있으나, 3~4학년 전공과정이나 혹은 대학원 연구실에서 어떤 프로그램을 사용해서 데이터 분석을 하는지 그걸 확인을 하세요.

공학계열(Bio-informatics)

보통 컴퓨터공학 전공자들이 이 분야로 연구를 하게 되면, 가장 기본이 되는 과목들이

자료구조-알고리즘-패턴인식

이 과정이 기본적으로 학습을 해야 하는 내용이라고 보면 됩니다. 이 과정을 얼마나 많이 이해하고 있느냐에 따라서 할 수 있는것과 할수 없는 것이 구분이 될겁니다. 컴퓨터공학의 경우에는 데이터를 처리하는 과정과 DB화 시키는 과정에 초점이 맞춰져 있기 때문에 위의 과목과 DB에 대한 과목을 공부하고 난 이후 4학년 과정에서 보통 Bio-informatics 관련 분야쪽 개론 정도의 수업이 진행됩니다. 보통 이 분야는 대학원에서 공부해야할 과정이라고 보면 됩니다.

컴퓨터공학 전공이 아닌 Bio 관련 학과의 경우에는 프로그래밍 언어-자료구조-알고리즘에 대한 기본이 거의 안되어 있는 상태이기 때문에, python이나 R을 가지고 이미 만들어져 있는 라이브러리 사용하면서 이론적인 것을 익혀나가게 될겁니다.

https://www.itfind.or.kr/WZIN/jugidong/1035/103501.htm

이전에 인공지능 분야에 대한 글을 작성해놓은 것이 있는데, 거기에 보면 겹치는 내용들이 있을 겁니다.

https://cafe.naver.com/tatoobbc/48687

https://cafe.naver.com/tatoobbc/48643

Bio-informatics 분야의 경우에 데이터 해석 분야쪽에서 네트워크 해석,그리고 그래프 비교 알고리즘/계산/ 특징 추출이라고 되어 있을 겁니다. 그래프를 가지고 표현할 수 있는 하위 네크워크 중에서 clique, n-clique, clane, n-clan, k-plex, lamda set, community, component라는 개념이 있다고 얘기를 한 적이 있습니다. 이런 그래프 데이터 형태들을 처리하는 방법들을 알고 있어야, Bio-informatics 관련 분야로 들어가더라고 연구/개발이 가능하다고 보면 됩니다.

MIT의 과목 이수체계도

그래서 MIT의 과목 이수 체계도와 github를 통해서 MIT 수업에서 어떤 내용들이 수업에서 진행되고 있는지를 설명을 해드릴려고 합니다. MIT에서 python 기반으로 진행되는 수업의 강의계획서와 학생들이 과제한 내용들이 github에 올려져 있는것들이 있는데, 이걸 기준으로 설명을 해드리겠습니다.

이전에 작성한 글에서 자료구조와 알고리즘 전공 과목에서 어떤 내용들을 학습하는지 써놓은 글들이 있으니, 이걸 가지고 비교를 해보세요.

컴퓨터공학을 전공하는 대학생이라면, 자료구조와 알고리즘이라고 하는 수업에서 어떤 내용들을 학습하는지, 그걸 확인하고 공부 방향을 자 세워보세요.

https://cafe.naver.com/tatoobbc/48643

그리고 파이썬 학원을 보내고 있는 학부모님들이나 혹은 파이썬을 공부하고 있는 학생들이라면, 내가 공부하고 있는 내용들이 어느 정도의 수준인지를 비교를 해보세요.

https://www.eecs.mit.edu/academics/undergraduate-programs/curriculum/6-3-computer-science-and-engineering/

1. 6.0001 programming skills - python 수업.

이 로드맵에서 python을 배우는 수업은 6.0001 programming skills 이라고 하는 강좌입니다.

http://student.mit.edu/catalog/search.cgi?search=6.0001

아래 URL을 클릭하면 이번 학기에 개설된 수업의 강의 계획서를 확인할 수가 있습니다.

https://sicp-s1.mit.edu/fall21

MIT의 python 수업에서 9월 29일 이후의 일정들을 보면 대부분 객체지향 프로그래밍 방식인 Class라는 구조에 대한 설명입니다.

대부분의 python을 수업하는 학원가에서 가리키는 python 내용을 보면 9월 28일까지의 내용 기초 문법과 list를 사용하여 1/2차원 배열 학습시키는 정도 진행을 할 겁니다.

이 수업에서 사용하는 교재는 "Introduction to Computation and Programming Using Python"입니다.

http://ailab.chonbuk.ac.kr/class_board/pds1_files/Introduction+to+Computation+and+Programming+using+Python+%28rev.%2Bed.%29%2B%5BGuttag%2B2013-08-09%5D.pdf

이 책은 python 기본 문법 + 자료구조 + 알고리즘 + 인공지능 분야 까지 기술된 책입니다.

1. Getting Started

2. Introduction to Python

3. Some Simple Numerical Programs

4. Functions, Scoping, and Arstraction

5. Structured Types, Mutability, and Higher-Order Functions

6. Testing and Debugging

7. Exceptions and Assertions

8. Classes and Object-Oriented Programming

------------------여기까지가 프로그래밍 언어 관련 내용 -------------------------

9. A Simplistic Introduction to Algorithmic Complexity

10. Some Simple Algorithms and Data Structures

11. Plotting and More About Classes

----------------------- 자료구조-----------------------------------------------------

12. Knapsack and Graph Optimization Problems

13. Dynamic Programming

-------------------------알고리즘의 일부 내용--------------------------------------

14. Random Walks and More About Data Visualization

15. Stochastic Programs, Probability, and Distributions

16. Monte Carlo Simulation

17. Sampling and Confidence Intervals

18. Understanding Experimental Data

19. Randomized Trials and Hypothesis Checking

20. Conditional Probability and Bayesian Statistics

21. Lies, Damned Lies, and Statistics

22. A Quick Look at Machine Learning

23. Clustering

24. Classification Methods

MIT의 python 수업은 강의계획서를 보면 8장까지 진행되고 있습니다. 이 수업의 내용은 MIT OCW에 공개되어 있으니, 이 수업에 대해서 관심이 있다면 아래의 URL을 클릭해서 보면 됩니다.(python을 배우고 있는 중고등학생이라면 한번 MIT에서 공개된 수업을 보면서 내가 배우고 있는 python이 제대로 배우고 있는 것인지를 비교를 해보세요.)

https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-0001-introduction-to-computer-science-and-programming-in-python-fall-2016/

2. 자료구조- 6.009 Fundamentals of Programming

http://student.mit.edu/catalog/search.cgi?search=6.009

이수업을 들었던 MIT 학생이 github에 수업 관련 내용들, 실습한 내용들을 올려놨습니다.

lab0-https://github.com/FizzyBubblech/MIT-6.009/tree/master/lab0

lab1-https://github.com/FizzyBubblech/MIT-6.009/tree/master/lab1

lab2-https://github.com/FizzyBubblech/MIT-6.009/tree/master/lab3

lab3-https://github.com/FizzyBubblech/MIT-6.009/tree/master/lab4

lab4-https://github.com/FizzyBubblech/MIT-6.009/tree/master/lab4

lab5-https://github.com/FizzyBubblech/MIT-6.009/tree/master/lab5

lab6-https://github.com/FizzyBubblech/MIT-6.009/tree/master/lab6

lab7-https://github.com/FizzyBubblech/MIT-6.009/tree/master/lab7

이 수업의 프로젝트 과제인데, 한번 어떤 것이 나와있는지를 읽어보세요. 이정도를 할 수 있으려면, usaco silver-gold레벨 사이는 되어야 할 겁니다. 올림피아드의 simulation 형태의 문제가 나와 있습니다. 이정도면 삼성전자 SW 역량테스트 A형 레벨 통과 가능한 수준입니다.

lab0-https://github.com/FizzyBubblech/MIT-6.009/tree/master/lab0

3. 알고리즘-6.006 Introduction to Algorithms

MIT Subject Listing & Schedule Fall 2021 Search Results

이 수업도 마찬가지로 3년전에 어떤 학생이 수업에서 작성했던 자료들을 올려놓은 github가 있습니다.

GitHub - HinsonM/6.006-Intro-to-algorithms-assignments: Follow the course on MIT OCW and finish the problem sets.

여기 들어가보면 제일 위에 BST-AVL이라고 되어 있는 것이 balanced tree중 하나인 AVL 트리입니다.

이 수업에서 사용되는 강의교안은 아래 URL에서 확인이 가능합니다.

https://github.com/HinsonM/6.006-Intro-to-algorithms-assignments/tree/master/Lecture%20%26%20Recitation%20Notes

이 내용이 인공지능 수업 들어가기 전에 MIT에서 학습하는 내용입니다. 5번 rubik's cube 관련된 내용은 다른 글에서 설명을 한 적이 있습니다.

double linked list 기반에서 graph라는 것을 구현해보고, 2차원 배열 형태인 hashing이라는 것을 구현한 다음에 2차원에서 4방향/8방향으로 검색하는 것을 먼저 해보라고 얘기를 했습니다. 이게 기본적으로 되어야 3차원 형태의 cube 탐색이 가능합니다.

단순히 python으로 인공지능 분야 공부하면 된다 생각하시는 분들이 참 많은데, MIT의 커리큘럼 또한 이산수학-자료구조-알고리즘-인공지능 이 순서대로 되어 있습니다.

다만 python을 가지고 수업을 하는 것만 다를 뿐, 어차피 python은 제대로 사용할 수 있으려면, C, C++에 대한 개념을 제대로 모르면 어느 단계 이상 부터는 python만 공부해서는 해결이 안되는 부분들이 생길 겁니다.

python 프로그래밍 언어 자체를 폄하할 생각은 없습니다. 그걸 가리키는 학원가의 실력이 수준 미달이라서, 그걸 배우지 말라고 하는 것이지, C, C++기반에서 만들어진 python이라고 하는 프로그랭 언어는 C, C++을 모르면 python에 대한 공부 자체도 수박겉핥기 식의 교육밖에 되지 않습니다.

python을 가지고 공부를 해도 상관은 없습니다. MIT의 수업 내용 자체는 상당히 높은 수준의 레벨입니다. 중간에 학생들 스스로 공부를 해야할 내용들이 참 많이 있습니다. 그 단계를 건너뛰어도 될 만큼 뛰어난 자질이 있는 학생들이기에 가능한 커리큘럼입니다.

저정도 커리큘럼을 따라가려면 적어도 usaco gold레벨 이상은 되어야 따라갈수 있는 커리큘럼이라고 보면 됩니다.

+더해서

컴퓨터공학을 전공하려는 중고등학생들이나 혹은 현재 컴퓨터공학을 전공하고 있는 대학생이라면, 제가 써놓은 것처럼 학교의 커리큘럼을 찾아보고, 그 과목의 과목 번호나 과목 명으로 구글 검색을 해보세요.

대부분의 컴퓨터공학 전공하는 학생들이 자신이 들었던 수업 자료들을 포트폴리오 형태로 관리하려고, github에 많이 올려놓고 있습니다.

그러면 그 대학에서 어떤 내용들을 수업하고 있는지를 확인을 할 수가 있습니다.

그렇게 자기가 입학하려고 하는 대학의 전공 과목의 내용과 수준을 확인할 수가 있습니다. 그리고 이 수업을 제대로 따라가려면 어떻게 공부를 해야 하는지를 확인을 하세요.

학원이나 개인 튜터라면, 커리큘럼을 보여주고, 이 수업을 따라갈수 있는 정도로 가르쳐 줄수 있는지를 확인하고 선행하는 방법으로 공부를 하면 될겁니다. 그러면 적어도 1, 2학년때 전공 수업 이해못해서 전공을 포기하는 일은 없을 겁니다.

댓글