본문 바로가기

프로그래밍 언어/Python

[MIT OCW_6.00] Introduction to Computer Science & Programming_01강 정리

여느때 처럼 KN King 아저씨의 C programming, Modern Approach 를 공부하고 있는데 외국인 친구한테 DM이 왔다.

DM을 주고받으며 재밌게 놀고 있었는데, 여기서 이런 생각이 들었다.

나는 컴공 공부를 이렇게 하고 있는데 외국 애들은 어떻게 하고 있을까?

.

.

그래서 시작하게 되었다! 바로 MIT의 opencourseware 강의!!!

처음에는 Introduction to Algorithms를 들을까하고 Syllabus를 확인해봤는데 별 처음보는 해괴한 자료구조와 들어보지도 못한 알고리즘들을 다루길래 아 이거 좀 무섭네.. 하고 겁먹고 있던 찰나,

prerequiste 에 6.00J, Introduction to Computer Science & Programming 이걸 알고있다는 가정하에 수업을 진행한다길래 옳다구나하고 바로 들어봤다.(쫀거 아님 ㅎㅎ)

그리고 그 후기와 내용을 정리하기 위해 포스팅을 작성하려한다!! 오해의 소지를 불러 일으킬만한 문장이나 내가 번역해놓고 좀 껄끄러운 문장들은 교수님이 하신 말들을 그대로 적어왔다!(기울임꼴로 적었음.)

바로 드가보자 ㅎㅎ

MIT OCW

 


 

내용 정리

The Goal of the course(강좌의 목표)

어떤 문제를 해결하려 할때, 계산적사고(컴퓨팅적 사고)로 접근했을때 이 문제를 해결 할 수 있는지 할 수 없는지 아는것.

(an understanding of the role computation can and cannot play in tackling problems.)

 

세부적인 목표로는, 

  • Understanding Computational thinking, 즉 컴퓨팅 사고를 이해하는것. 이는 코드를 쓸 수 있는 능력과 연관된다.
  • Understanding Code, 다른 사람이 작성한 코드를 이해하는 능력. Computer Science는 표절(plargarism)이 용인되는 몇 안되는 분야중 하나이다. 다른 사람에 의해 만들어진 것을 볼 수 있고 그 내부에 무엇이 있는지, 제대로 작동하는지, 그리고 그것을 어떻게 구축하는지의 이해를 포함한다. 
  • Understand abilities in limits, computational thinking의 한계점을 알 것. 분명히 한계는 존재한다. 
  • map it into something computationl, 내가 겪는 문제를 컴퓨팅적 사고로 바라보는 능력, 풀어낼 능력을 갖출 것.

※ prof. Eric grimson : 스스로의 노트를 작성할 것! 나만의 노트를 만들떄(writing) 뇌를 많이 사용한다. 스스로 주석(annotation)을 달면서 강의를 익혀라. 강의자료가 없는 이유이다.

 

Computation

이 강의의 목표는 여러분이 컴퓨터 과학자 처럼 생각하게 만드는 것(Think like Computer Scientist and raise the ability to think computational mode of thoughts)이다. 그렇다면 컴퓨터 과학자처럼 생각하는것은 뭘까? 이를 해결하기 위해선 다음 질문이 필요하다. 

 

 "What is Computation?"

 

이 때 Computation 과 Computer 는 다르다는것을 짚고 넘어가자. 후자는 인공물(artifact) 이다. 

저 질문에 답하기 위해 더욱 이전 단계로 가보자.

 

"What is knowledge?"

 

지식은 두 가지로 나뉜다. 첫번째는 서술적인 지식이고(Declarative knowledge) 두 번째는 절차적인 지식(Imperative knowledge) 

Declarative knowledge는 사실의 진술이다(statments of facts). 이를 테면, 이런 예를 들어보자.

 

y^2 은 x 이고 y가 양수라면 y는 루트 x이다.

 

이는 제곱근의 정의(Definition)이고 자명한 이치(axiom)이다. 

그러나, 만약 x가 주어졌을 때 여러분이 루트 x 값을 찾으려 한다고 가정해보자. 이 지식은 여러분에게 아무런 루트x값을 얻는데 아무 도움을 주지 못한다. 단적으로 옆에 친구를 붙잡고 위에 서술해놓은 저 문장을 말해주고 2의 제곱근을 물어봐라. 좀 이상한 친구가 아니고서야 조금 고민하다가 1.3? 1.4? 라고 말할것이다. (물론 바로 1.41529 를 말하는 이상한 친구들이 있다!) 즉, Declarative knowledge는 어떤 걸 테스트하는 방법은 알려줄지언정 어떻게? 에 대해서는 알려주지 않는다. (it tells you how you might test something but it doesn't tells you how to)

 

 

그렇다면 이제 절차적 지식(Imperative knowledge) 에 주목해보자. 

Imperative knowledge는 특정 명령들의 일련의 순서이다.(It's an sequence of specific instructions)

예시로 든 제곱근을 비유하자면,

 

G라는 값을 먼저 어떤 특정값으로 가정하자.(First, start guess G)

그 다음, 만약 G^2 의 값이 x 랑 가까우면(if) , 멈추고 G를 결과값으로 반환한다.

만약 그렇지 않다면(else), G 를 (G + x/G) / 2 값으로 갱신하고 이를 반복한다.

 

이는 조리법(Recipe)이다! 그 문제를 해결해나가는 단계의 서술인것이다!(Description of set of steps)

다시 말해, 제곱근을 구하는 방법을 알려주는것이다. 즉 how - to knowledge 이다.

이게 바로 Computation이 무엇인지 나타낸것이다. 

 

우리는 나아가 이 과정을 캡쳐하고싶다. 그런데 어떻게 캡쳐하지? (capture를 프로그램으로 만들어서 포획한다?뉘앙스로 봐도 되고 저 공식들을 말그대로 캡쳐한다 라고 생각하셔도 될거같습니다)

 

이때, 더하는 기능을 하는 부품, 곱하는 기능을 하는 부품 등 여러 작은 부품을 이용해 작은 회로를 만든다고 생각하라!(Circuit) 이것이 바로 최초의 컴퓨터이다.

 

 

Stored Program Computer

옛날의 컴퓨터들은 어떤 것이었을까?

대표적으로 간단한 연산을 수행하는 계산기, 그리고 천재 컴퓨터 공학자 앨런 튜링에 의해 만들어진 bombe 라는 컴퓨터가 있다. 2차 세계대전때 독일군의 암호기 에니그마의 암호를 해독하기 위해 만들어졌다. 

이러한 컴퓨터는 Fixed program Computer 라는 것으로, 컴퓨터 자체가 특정 computation을 목적으로 만들어졌다.

 

이에 비해 현대의 컴퓨터들은 Stored Program Computer 방식을 따른다.

컴퓨터에게 내가 수행하고 싶은 처리과정을 묘사하는 명령들의 일련의 집합을 제공하고 그 안에 실제로 레시피대로 명령이 수행되도록 하는 처리과정이 있다. (번역해놓고 나니 무슨 말인지 ㅋㅋㅋㅋ 죄송합니다 여러분 ㅠㅠ 교수님 말씀 그대로 옮기면요, provide to the computer a sequence of instructions describing the proscess I want it to execute and inside of the machine there is a process that will allow that sequence to be executed as described in the recipe)

이러한 내장형 프로그램 방식에서 우리는 어떠한 것도 레시피대로 실행시킬 수 있다!

 

이런 내장형 프로그램 방식은 다음과 같은 구조를 지닌다. 

stored program computer

이러한 구조는 나중에 배우기로 하고, 중요하게 봐야할 게 몇 가지 있다.

바로 Instruction A, B ,..., Z와 같은 명령들은 메모리 안에 위치해 있다는것, 그리고 그림에도 적어놓았지만

Computation의 근본은 여기서 나온다. 바로 pc(program counter)라는 레지스터가 존재해 실행될 명령의 순서를 제어한다는것!

정리하자면, 우리의 descriptions, 레시피는 원시적인 명령형태(primitives, 어셈블리언어에서 ADD 정도를 생각하시면 될 듯 합니다) 로 우리가 직접 만드는 것이고, 우리가 흐름의 제어권을 가지고 있다는 것이다.

(The heart of the computer is simply this notion that we build our descriptions, our recipes on a sequence of primitive instructions. and then we have a flow of control and moving through a sequence of instructions, occasionally changing where we are as we move around.)

 

프로그램은 다시 말해, 레시피이다!(That is, it's a sequence of instructions)

아까 primitives 라고 말했는데, 옛날에는 이러한 원시적인 명령들 단 6개로 모든 걸 프로그래밍했었다. 정말 뭐든 다 짤 수 있었다! 그런데 우리는 이 정도 레벨에서 시작하지는 않을것이다.

이제 이러한 레시피를 짜기전에 앞서, 뭐가 필요한지 살펴보자.

우선 프로그래밍 언어가 필요하다!

 

잠깐 프로그래밍 언어에 대해 설명하자면,

어떤 특정한 면에 대해서 어떤 언어가 더 낫다 라는 건 있을 수 있어도, C에서는 할수 있는걸 Fortran에서 못한다 이런건 없다. 이걸 우리는 튜링 호환성(Turing compatibility) 라고 부른다!

또한, 최고의 프로그래밍 언어 라는건 없다. 존재하지 않아! 저런 표현보다는 어떤 언어들이 특정한 목적에 더 적합하다 라고 표현하는게 맞다. 이를테면 Matlab이 벡터와 행렬의 계산에 용이한것 처럼 말이다.

 

우리는 앞으로 Python 으로 강좌를 진행할것이다. 그런데 문장 뒤에 세미콜론을 찍어야 된다는 등의 문법적인 지식을 배우는게 아니라 컴퓨팅 사고를 기르기 위해 python을 사용한다는 것을 명심할것, 그리고 레시피, 즉 프로그램을 어떻게 설계하고 구축할 것인지를 명심할 것!

 

파이썬은

  • High-level(not low level) : 여기서 High - level 이냐 low level이냐를 따지는 것은 너가 얼마나 기계 근처에 가까이 있냐를 따지는것이다. (how close are you to the guts of the machine)
  • General(not targeted) : 특정 목적을 가지고 있는가? 예를 들어 Matlab은 targeted language이다!
  • Interpreted(not compiled) language : 컴파일 언어는 소스코드 전체를 컴파일러가 컴파일하여 obj 파일을 만든다. 덕분에 실행이 빠르다. 인터프리터 언어는 소스코드를 따로 처리하지 않고 런타임시에 한꺼번에 처리하기때문에 느리다.

또한, 코드 작성 시

  • Syntax : "What are legal expressions?" 마치 "그는 컴퓨터 필요." 처럼 전혀 문법에 맞지 않는 것.
  • Static Semantic : "What programs are meaningful?" 마치, "내 책상은 zzino다." 이게 의미가 있냐? 라고 따지는 것이다 . 책상에 정말 zzino라는 애칭을 붙여줬다면 모르는 일이지만 보통 책상에 애칭을 붙여주진 않는다!
  • Full Semantic : "What does program means?" 내가 코드를 실행시키면 어떤 일이 일어나는가?

해당 항목에 유의하면서 작성하자!

 


강의 내용 정리는 마쳤고....

후기를 간단히 말하자면, 우선 Eric grimson 교수님 유머코드가 나랑 잘 맞는다는점이다 ㅋㅋㅋ!!

MIT학생들의 컴퓨터 공학 첫 입문 강의라 그런건지는 몰라도, 좋은 인상을 심어주시려고 최대한 재밌게 강의를 진행하시려 한다. 중간중간에 계속 드립을 치시는데 매우 재밌었다!(근데 웃는 애들이 한명도 없더라 ㅠㅠ)

중간에 실직한 하버드 컴공생 드립을 친걸로 봐서는 마치 우리나라 연대 고대 느낌일것같다는 생각이 들었다 ㅎㅎ.

강의 내용은 너무 좋았다. 사실 다 알고 있는 내용이어서 시간이 좀 아깝긴 했는데, 한편으론 그래도 잘 공부해온거 같아서 다행이라는 생각이 들었다. 아니야. 항상 겸손하자! 저런 생각은 금물이야...

말이 너무 빠르셔서 영어 자막을 키고 몇 번은 돌려본것같다 ㅠㅠ.

앞으로 강의때문에 파이썬공부를 해야될것같다. 과제도 올라왔던데 한 번 풀어봐야겠다.ㅎㅎ

 

읽어주셔서 감사합니다~ ㅎㅎ 모두 안녕히!