익숙함의 역설. 



우리는 때로 익숙함에 권태를 느끼며 회피하고자 하지만, 희미해져 가는 그 익숙함을 그리워 한다. 

익숙함은 상대의 소중함을 망각케 하지만, 사라진 익숙함은 상대의 소중함을 경각시킨다.


충동적이고 남들과는 사뭇 다른 세계관을 가진 클레멘타인과 과묵하게 내면의 세계를 굳건히 닫고 있는 조엘의 기억 저 편 이야기는 서로가 가진 익숙한 기억들의 범벅으로 묘사된다. 조엘은 클레멘타인에 대한 자신의 기억이 지워지는 과정에서 결국 자신이 원하던 것은 클레멘타인으로부터의 회피가 아닌, 그녀에게 다시 돌아가고자 하는 것이었음을 때로는 우스꽝스럽게 때로는 절절하게 상기하게 된다.





이러한 상기의 과정에서 흥미로운 점은 클레멘타인이 항상 열어보고 싶어했던 조엘의 속 깊은 내면을 그가 스스로 그녀에게 공개하며 그녀와의 탈출을 시도하는 모습들이다. 상대가 항상 자신에게 아쉬워했던 부분이 결국에는 본인의 후회로 남아 자리하게 되었던 것이었을까? 결국 기억 제거의 과정에서 이를 극복하며 함께 기억을 되찾으려는 노력의 모습은 한층 더 성장한 두 사람의 관계, 그리고 익숙함으로 돌아가고자 하는 의지의 반영이 된다.


영화를 지배하는 절제된 사운드, 과하지 않은 SF적 요소, 그리고 조엘의 단편적 기억 조각들이 맞추어지는 과정에서 관객들이 깨우치게 되는 도입부 만남의 의미. 왜 이 영화가 지속적으로 사랑 받아왔으며, 왜 미셸 공드리라는 감독이 이터널 선샤인을 능가하는 작품을 찍어내는 데 곯머리를 썩고 있는 지 여실하게 느낄 수 있는 작품이다. 서브 스토리 라인도 함께 아기자기한 정말 정말 좋은 작품.



[Quote]




Clementine: Joel? What if you stayed this time?


Joel: I walked out the door. There's no memory left.


Clementine: Come back and make up a good-bye at least. Let's pretend we had one.







살면서 한 번쯤은 들어봤던, 그러나 자세한 내막까지는 알지 못하던 다양한 분야의 인문학적 지식과 사실을 이해하기 쉽게 풀어놓은 책. 인문학에 대한 기반 지식이 많지 않더라도 책을 읽는 내내 부담감을 느끼지 않을 수 있는 이유는 책 제목 그대로 우리가 기존에 알고 있던 '상식'으로부터 시작한 인문학에 대한 이야기이기 때문이다. 책을 읽는 내내 기분이 좋았고, 많이 배운다는 느낌을 받았다. 다만 다루고 있는 내용의 그 깊이가 깊지 않기에, 더 깊은 공부를 위한 추가 독서가 꼭 필요하다고 생각한다. 작가의 말처럼 세상을 비틀어 볼 수 있는, 그러나 이성적으로 바라보는 시각을 가질 수 있도록 더 읽고, 더 공부해야겠다. 인문학 입문서로 추천하고 싶은 책.

[Sorting Algorithm]




정렬이란 데이터를 특정 순서에 따라 나열하는 일련의 과정으로, 대개 우리는 배열 요소에 저장되어 있는 값에 따라 정렬을 한다. 이러한 정렬에 있어 그 기준은 수가 될 수도 있고, 단어 혹은 배열에 인접한 쌍(pairs)이 될 수 있다. 이를테면, 우리는 학급에 속한 학생들을 키에 따라 정렬해볼 수 있다. 혹은 우리나라의 도시를 영문 알파벳 순으로 혹은 도시에 거주하는 시민의 수에 따라 정렬해볼 수도 있을 것이다. 그리고 이러한 정렬 과정에 있어 가장 많이 사용되는 기준은 수의 크기에 따른 정렬(numerical order) 혹은 알파벳순에 따른(alphabetical order) 정렬이다.



다음 그림과 같이 정수로 이루어진 간단한 배열을 생각해보자


 

우리는 이 배열을 다음과 같은 오름차순으로 정렬하고자 한다.


 


Computer Science의 Algorithm에는 위같은 정렬을 위한 많은 정렬 알고리즘이 있으며, 각각의 알고리즘들은 시간 복잡도와 메모리 사용에 있어 큰 차이를 가진다다음, 정렬 알고리즘의 몇 가지 예를 살펴보자.

 



1) Selection Sort





# Code in Python3


1
2
3
4
5
6
7
8
9
10
11
12
13
def selectionSort(A):
    n = len(A)
    
    for elem in range(n):
        minnum = elem
        
        for j in range(elem + 1, n):
            if A[j] < A[minnum]:
                minnum = j
        
        A[elem], A[minnum] = A[minnum], A[elem] # swap A[elem] and A[minnum]
    
    return A
cs



-      개념: 배열의 첫 번째 원소에서 시작하여, 첫 번째 원소를 포함한 배열의 모든 값들 중 최소값을 찾은 후 이 최소값을 배열의 첫 번째 원소와 교환한다. 이후 두 번째 원소로 넘어가 첫 번째 원소를 제외한 배열의 값들 중 다음 최소값을 찾는다. 이러한 과정을 마지막 원소까지 반복하게 된다.

배열의 원소 개수가 k개라면, 첫 번째 원소는 k번의 반복 이후 자기의 자리(right order)를 찾아가게 된다. 이러한 성질을 ‘loop invariant’라고 하며, 자세한 내용은 링크 참조.


* 시간 복잡도는 두 번의 반복문이 중첩되어 있으므로, O(n²)



2) Counting Sort



[Input으로 받은 배열에서 0이 5번, 1이 3번, 2가 4번, 3이 0번 그리고 4가 2번 발생하였기 때문에 count array에 5, 3, 4, 0, 2가 기록되게 된다. 이 기록을 가지고 정렬된 배열을 Output으로 return 한다]


# Code in Python3


1
2
3
4
5
6
7
8
9
10
11
12
13
def countingSort(A, k):
    n = len(A)
    count = [0* (k + 1)
 
    for i in range(n):
        count[A[i]] += 1
    p = 0
 
    for i in range(k + 1):
        for j in range(count[i]):
            A[p] = i
            p += 1
    return A
cs



-      : Counting Sort를 이용하기 위해서는 정렬할 배열의 최대 크기 k를 알아야 한다. 이후 0을 포함하기 위해 배열의 최대 크기인 k에 1을 더한 크기 만큼의 [0]자 배열 count를 생성한다.

이후, 배열 A의 크기 만큼 반복문을 돌며 count의 index에 맞는 요소에 각 숫자의 등장 횟수를 count 해준다. 이후, count된 숫자를 그 등장 횟수만큼 배열 A에 삽입해주면, 오름차순 등장 횟수에 따른 배열 A가 정렬되게 된다.


* 시간 복잡도는 O(n + k). 배열의 모든 요소들을 정리하기 위해, O(k) 크기 만큼의 추가 메모리가 필요하다. 따라서 위 코드의 실행을 위해 필요한 시간 복잡도가 크게 느껴질 수 있다. 그러나 결국 이중 중첩된 아래 반복문의 연산(line 11, 12)은 O(n) 이상으로 수행되지 않는다.



3) Merge Sort * 아래 간단한 설명보다 구현이 복잡하기 때문에 wikipedia를 참고하는 것을 추천드립니다.




-      개념: 리스트의 길이가 0또는 1이면 이미 정렬된 것으로 간주하지만, 그렇지 않은 경우 정렬되지 않은 리스트를 절반(홀수라면 한 개의 차이가 발생하도록)으로 잘라 비슷한 크기의 2개의 리스트로 나눈다. 이후 나뉘어진 두 개의 부분 리스트를 recursive 하게 합병 정렬을 이용해 정렬한다. 마지막으로 나누어진 두 부분 리스트들이 다시 재귀적으로 하나의 정렬된 리스트로 합병하도록 한다.


* 시간 복잡도는 O(n log n)



4) Sorting functions


-      만약 정렬하고자 하는 배열에 속한 값들의 그 범위를 모를 경우, O(n log n)의 시간 복잡도를 가지는 내장 정렬 함수를 통해 모든 값들을 정렬할 수 있다. 우리가 사용하는 많은 다양한 프로그래밍 언어들의 장점은 그것들이 가지는 내장 정렬 함수 기능에 있다. 만약 Python에서 list를 정렬하고 싶다면 우리는 아래의 한 줄 코드로 이같은 정렬을 수행할 수 있다.


1
A.sort()
cs


* 시간 복잡도 O(n log n)






* 결론: 일반적으로, 정렬 알고리즘은 다른 알고리즘 문제에도 사용될 수 있는 흥미로운 수학적 개념들을 사용한다. 따라서 위와 같은 정렬 알고리즘이 내부적으로 어떻게 작동하는지 아는 것은 큰 배움이 될 수 있다. 그리고 더 나아가 이 알고리즘들을 스스로 구현해보는 것 역시 작동 방식을 아는 것 이상의 가치를 가진다! 또한 미래에는 내장된 정렬 함수를 사용해도 좋을 것이다. 내장 정렬 함수는 점점 빠른 성능을 보이게 될 것이며, 내장함수를 사용하는 것이 여러분의 코드를 보다 짧고 읽기 쉽게 만들어줄 것이기 때문이다.

[무식하게 풀기: Brute-Force]

 



1.     도입

l  알고리즘을 공부한 대부분의 사람들이 가장 많이 하는 실수는 쉬운 문제를 어렵게 푸려는 시도를 하는 것

l  무식하게 풀자(brute-force)’: 컴퓨터의 빠른 연산 능력을 백분 활용하여 가능한 경우의 수를 일일이 나열하며 답을 찾는 방법으로 시작하자! à 완전 탐색(exhaustive search)

 

2.     재귀 호출과 완전 탐색

l  재귀호출: 자신이 수행할 작업을 유사한 형태의 여러 조각으로 쪼갠 뒤 그 중 한 조각을 수행하고, 나머지 조각들은 자기 자신을 호출하는 재귀적 호출을 통해 실행하는 함수

l  기저 사례(base case): 모든 재귀 함수가 더 이상 쪼개지지 않는최소한의 작업에 도달했을 때, 답을 곧장 반환하는 조건문. 기저 사례가 존재하지 않거나, 제대로 설정되지 않는 경우 재귀 호출은 올바른 탈출을 못한 채 무한대로 돌게 되는 무한 Loop를 발생시키게 된다.

l  이러한 재귀호출은 코딩을 간편하게 해줄 수 있는 무기가 될 수 있다.

[알고리즘의 시간 복잡도 분석]



0. 알고리즘이란?


- 알고리즘: 어떤 한 작업이 주어졌을 때 컴퓨터가 그 작업을 해결하는 방법으로, 하나의 같은 문제를 해결하더라도 다양한 경우의 수를 가진 알고리즘들이 나타날 수 있다.


* 좋은 알고리즘의 평가 기준

- 시간: 알고리즘이 적은 시간을 사용한다면 더 빠르게 동작한다.

- 공간: 알고리즘이 적은 공간을 사용한다면 더 적은 용량의 메모리를 사용한다.

그러나 이 두 가지가 상충한다면 더 우선시 되어야 하는 것은 알고리즘의 시간이며, 메모리 사용량을 희생하여 수행 속도를 높이는 동적 계획법이 그 대표적인 예이다.

 

1. 도입


: 보다 빠른 알고리즘을 만들기 위해 가장 먼저 해야 할 일은 알고리즘의 속도 측정 방법을 정하는 것으로, 두 알고리즘의 속도를 비교하는 가장 직관적 방법은 각각의 알고리즘을 프로그램으로 구현하여 구현된 프로그램의 수행 시간을 측정하는 것이다.

그러나, 이렇게 구현된 프로그램의 수행 시간은 프로그래밍에 사용된 언어, 프로그램을 동작시키는 컴퓨터의 하드웨어, 운영체제, 컴파일러 등 수많은 요소에 의해 바뀔 수 있기 때문에 적합한 측정 방법이라 할 수는 없다.

cf) C++에서 크기가 큰 구조체를 함수의 인자로 넘길 때는 reference 형태로 넘겨 주는 것이 좋다. Vector 전체를 넘길 경우, vector를 모두 읽어오는 것부터 많은 시간을 잡아먹기 때문으로, reference(in C++) 혹은 pointer(in C)의 형태로 넘기는 것이 시간적으로 더 유리하다.

 

반복문이 지배한다



여러 비교에 있어서 한 가지 항목이 다른 항목들의 대소를 지배(dominate)하는데, 알고리즘에서는 반복문이 시간 복잡도와 수행 시간을 지배하게 된다.

 

 

2. 선형 시간 알고리즘

Input의 크기 N에 정비례하는 수행 시간을 가지는 선형 시간 알고리즘

 

3. 선형 이하 시간 알고리즘

입력으로 주어진 자료에 대해 미리 알고 있는 경우, 선형 시간 알고리즘보다 빠르게 동작하는 알고리즘의 구현이 가능 (log N)


l  이진탐색(Binary Search): 10만 개의 자료 중 5만 번째 자료 확인 à 75천번째 자료 확인 àà 대략 17개의 자료만으로 원하는 결과 얻어낼 수 있음

l  Binsearch(A[ ], x) = 배열 A[ ]에서 x를 삽입할 수 있는 위치 중 가장 앞에 있는 것을 반환한다. , 배열 내 x가 존재할 경우 첫 번째 x의 위치를, 없는 경우 x보다 큰 첫 번째 원소를 반환한다
ex {0, 0, 0, 0, 0, …, 0, 1, 1, 1, …, 1, 1, 1}


* cf. 결국에는 선형 시간?

1)    배열을 넘긴다고 하였지만 사실은 배열을 넘기는 것이 아니다. 확인하고 싶은 위치의 자료만 판단하면 되는 구조

2)    ‘10만 개의 자료를 미리 정렬한다는 의미는 이 문제의 해결 뿐 아니라 다른 문제의 해결을 위해서도 쓰일 수 있는 것이기 때문에 문제 해결의 일환으로 보지 않는다.

 

4. 지수 시간 알고리즘


l  다항 시간 알고리즘: 반복문의 수행 횟수인 N에 따라 달라지는 다항 시간 알고리즘. 다항 시간 알고리즘 간에 발생하는 지수의 차이에 따라 수행 시간에 큰 차이가 발생

l  가장 단순하게 최소값을 구하는 방법은 재귀 알고리즘 형태의 구현!

l  지수 시간 알고리즘: 지수의 증가에 따른 수행 시간의 증가

l  다항 시간 알고리즘의 구현이 가능한 문제는 쉬운 문제, 그렇지 않은 문제는 어려운 문제로 단순하게 분류할 수 있음.

l  숫자의 개수가 아닌 숫자의 크기에 따라 수행 시간이 달라지는 알고리즘들 또한 지수 수행 시간을 가질 수 있음
ex)
소인수 분해: 입력 값이 소수인 경우, n-1 번의 실행 횟수를 가지게 됨.


* cf. 과연 소인수 분해가 지수 수행시간을 가지는가?

이진 탐색, 이동 평균 계산 등은 입력의 값들이 일정 범위 내에 있기 때문에 입력의 개수가 메모리에서 차지하는 공간이 직접적으로 비례한다.

그러나, 소인수 분해 문제에서는 입력 값에 따라 알고리즘의 동작이 변화하기 때문에 숫자의 특정이 불가능하다. 입력의 값이 커지면 숫자를 저장하는 필요한 메모리의 공간 증가하게 되는 것이다. 이에 따라 Input값이 차지하는 메모리 내 비트의 수가 증가하여 수행 시간이 증가하게 되는 현상이 발생할 수 있게 된다..


*
비트의 수가 하나 증가할 때마다 표현할 수 있는 수의 범위와 알고리즘의 최대 수행 시간은 두 배로 증가

 

5. 시간 복잡도


l  기본적인 연산: 더 작게 쪼갤 수 없는 최소 크기의 연산(대입, 사칙연산, 대소 비교 등)

l  반복문이 포함되는 순간, 그 연산은 기본적인 연산이 아니게 됨

l  입력 크기에 따라 시간 복잡도가 높은 알고리즘이 더 빠르게 동작할 수 있음
ex)
반복문을 여러 개 중첩하더라도 입력값이 작으면 반복문이 적은 알고리즘보다 좋은 성능을 낼 수 있는 경우가 생김

l  최악의 수행 시간, 수행 시간의 기대치를 기준으로 알고리즘을 작성하는 것이 보편적

l  점근적 시간 표기(Big - O 표기)

: 식에 존재하는 상수 등은 고려하지 않고, 가장 빨리 증가하는 항인 반복문의 반복 수만 고려한 표기 방법


* 특이 알고리즘:
- N
2M + N log M + NM^2 = O(N2M + NM2)
à N2MNM2 중 어느 식이 더 커질 지 모르기 때문에 두 식 모두 표기


- 42 = O(1)
à 상수 시간 알고리즘


l  Big - O 표기법은 알고리즘의 수행 시간을 간단히 나타내는 표기법일 뿐, 최악의 수행 시간과 관련 있는 것은 아니다.

 

6. 수행 시간 어림짐작하기


l  주먹구구 법칙

: 시간 복잡도와 입력 크기로 대략적 수행 시간 예측이 가능한데, 1초당 반복문의 수행 횟수가 1억을 넘어가면 모든 문제에서 시간 제한을 초과할 가능성이 있다.

 

l  추가적으로 고려해야 할 요소

1)    시간 복잡도가 프로그램의 실제 수행 속도를 반영하지 못하는 경우: Big - O표기법의 경우 상수나 최고차항 이외의 항들을 모두 지워버리므로, 실제 프로그램의 수행 속도는 달라질 여지가 다분함

2)    반복문의 내부가 복잡한 경우: 반복문의 내부가 복잡하거나, 단순하면 Big – O의 예상치와는 다르게 작동하게 될 수 있음

3)    메모리 사용 패턴이 복잡한 경우: 하드웨어적으로 캐시의 사용은 시간 복잡도에는 영향을 미치지 않지만, 수행 속도에 영향을 미치게 된다. 따라서 캐시의 사용 여부에 따라 프로그램의 수행 시간 차이를 보일 수 있음

4)    언어와 컴파일러의 차이: C++의 최적화의 사용 여부 등 언어와 컴파일러에 따라 수행 시간의 차이가 발생하게 됨

 

7. 더 읽을거리

마스터 정리(Master Theorem): 재귀적 알고리즘의 시간 복잡도를 계산하는 수학적 정리

 


최근 많은 비전공자들이 프로그래밍 분야에 발을 내딛고 있는 것 같다. 나도 지난 여름까지 비전공자였던 사람 중 하나로(현재는 제 2전공을 통해 소프트웨어를 따로 공부하고 있다), 프로그래밍에 새로이 발을 디딛고자 하는 분들에게 조금이나마 도움이 되고자 내가 어떻게 C를 통해 프로그래밍에 입문하였는지에 대한 간략한 후기글을 남기고자 한다. 

* 비전공자가 아니거나, 이미 Visual C 등을 통해 프로그래밍 언어를 접해본 분이 지금 이 글을 읽고 계시다면 과감하게 '뒤로 가기'를 눌러주시기를 권고한다.. 나도 아직 미흡한 점이 많은 초보 학부생이기 때문에..


사실 Machine Learning에 대한 관심의 급증과 더불어 요즘 대세라 칭할만한 Python이나 생활코딩의 이고잉님이 가르치시는 CSS, HTML 등 비전공자들이 처음으로 프로그래밍에 입문하기에 충분한 동기부여와 학습 의지를 줄 수 있는 많은 다양한 언어(?)들이 존재한다. 그럼에도 내가 C를 첫 프로그래밍 언어로 선정한 데에는 두 가지 이유가 있다.



1. 프로그램이 돌아가는 컴퓨터 작동 원리에 대해 더 자세히 알고 싶었다. 

2. Native Language 하나를 제대로 알면 다른 언어를 쉽게 알 수 있을 것이라 믿었다

3. 학교의 자료구조 수업이 C로 진행되었다..



이러한 이유(사정)들로 인해 나는 C를 나의 첫 언어로 선택하였고, 내가 선택한 첫 책은 지금은 절판된 최호성 저자의 '최호성의 C 프로그래밍' 이었다. 이 책을 선택한 이유는 우선 절판된 책이었기에 인터넷 상에서 PDF를 무료로 구할 수 있었고, 목차를 살펴본 결과 C 언어를 상당히 Hardware의 관점에서 다룬다는 점이 내가 원하는 부분과 일치했기 때문이다. 또한 유튜브를 통해 무료 강의를 제공한다는 점에 있어서도 상당히 매력적인 교안이라고 생각한다.

('최호성의 C 프로그래밍' PDF: http://freelec.co.kr/bbs/read.asp?BBSName=BOOKPDS&page=3&id=206115)



<최호성 강사의 YouTube 채널, 자신의 모든 책들에 대한 강의를 '무료'로 제공한다>



결과적으로 이 책을 첫 C 교재로 선택한 것은 정말 탁월한 선택이었다. 나는 당시 여름방학을 이용해 2학기에 있을 자료구조, 컴퓨터구조 등의 수업에 대비하기 위해 C 언어를 시작하였는데, 이 때 당시의 예습이 2학기 수업을 따라감에 있어 정말 많은 도움이 되었다. 앞서 언급한 것과 같이 C를 Hardware로 접근하기 때문에 최호성 강사는 디버깅을 굉장히 많이 실습시킨다. 디버깅을 통해 내가 사용한 변수와 포인터 등이 메모리에서 어떻게 자리잡고 변화하는지에 대한 흐름을 익히라는 뜻에서였을 것이다.

*디버깅: 쉽게 말하면 작성한 코드를 한 줄 한 줄 따라가며, 그에 따라 생기는 변화를 확인하는 과정 (to find bug)


이렇게 시작 언어였던 C에서부터 메모리를 뒤지고, Data가 담기는 과정을 확인하는 등의 방식을 학습 하니 컴퓨터구조를 학습함에 있어 레지스터와 메모리 PC(Program Counter) 등의 변화에 대한 공부에 정말 많은 도움이 되었다. 또한 내가 다니는 학교는 자료구조를 C로 구현하도록 하였는데, 생각보다 많은 학생들이 Pointer를 제대로 활용하지 못해 제대로 된 자료구조를 구현하지 못하였다. 그러나 최호성 강사는 Pointer를 정말 이해하기 쉽게 가르치기에 이 책을 통해 공부한 나는 큰 어려움 없이 수업에 임할 수 있었다.


내가 그랬듯, 처음 입문하는 비전공자분들이 이 수업을 처음으로 선택하는 것에는 많은 노력이 필요하다. 강사의 스타일이 Pointer, 메모리 구조 등의 어려운 부분을 초반 부에 미리 주입시키는 방식으로 가르치기 때문이다. 따라서 초반에 많이 고전할 가능성이 크지만, 그 힘든 초반을 잘 이해하고 넘어낸다면 후반 부의 내용을 만나는 순간 '아, 이런거였구나.' 라는 탄식을 내뱉고 있는 자신을 발견하게 될 것이다. 개인적으로도 이같이 초반에 고생하고 후반에 깨우치는 수업을 굉장히 좋아한다.





앞서 소개한 '최호성의 C 프로그래밍'을 다 학습한다면, 2015년에 새로이 나온 최호성의 '독하게 시작하는 C 프로그래밍'을 학습하는 것이 좋다. 아니, 처음부터 이 책으로 시작하면 더더욱 좋다. '최호성의 C 프로그래밍'을 먼저 소개한 이유는 PDF를 통해 지금 당장이라도 쉽게 구할 수 있는 책이기에 소개를 한 것이며, 개정된 이 '독C'를 사실 더 추천한다. 이 책은 앞전에 소개한 책에는 존재하지 않는 C 언어의 함수에 대한 고급 이론 등을 더 수록하고 있다. 그리고 일단 무언가를 공부한다면 서적을 하나 가지고 있는 것이 좋다고 생각한다. 모르는 부분이 생겼을 때 언제건 책을 꺼내 확인할 수 있는 것이 좋다고 생각하기 때문이다. 


두 책의 저자인 최호성 강사는 네이버에 개인이 운영하는 카페(http://cafe.naver.com/windev)가 따로 존재하니 질문 등 저자와 소통하고 싶으신 분이 있다면 가입을 해두는 것도 좋을 것 같다. 나는 개인적으로 정말 많은 도움을 받은 두 강의였고, 카페를 통해서도 다양한 정보를 꾸준히 받고 있어서 참 감사한 인터넷 스승(?)이 아닌가 싶다. 지난 여름방학 이전까지 컴퓨터라곤 온라인 게임을 즐기는 용도로만 사용한 나도 이 강의들을 통해 수준을 많이 끌어 올렸으니, 나보다 뛰어난 비전공자 여러분들은 훨씬 더 고급진 개발 지식을 함양할 수 있을 것이다. 무료로 강의까지 제공하는데 굳이 마다할 이유는 없지 않는가? 


C언어를 통해 전반적인 프로그래밍 언어에 대한 지식을 다졌다면 다음으로는 자료구조와 알고리즘을 학습하는 것이 좋다고 생각한다. 물론, 바로 실무적 지식을 쌓고자 하는 분들은 이 두 과목의 중요성에 의문 부호를 품겠지만, 기업 취업은 물론이거니와 Computer Science의 근간이 되는 두 과목은 '내 입장에서는' 정말 중요한 과목이라고 생각한다. 두 과목의 대한 공부 방법은 다음 포스팅으로 잠시 미룬다. 


나를 비롯한 많은 비전공자 출신 개발자 지망생들이 더 많아졌으면 좋겠다는 생각을 한다. 그리고 그들이 모여 그들만의 시너지를 낼 수 있다면 더 할 나위 없이 좋지 않겠는가? 뒤늦게 시작하다 보니 고충을 나눌 주변 사람이 없다는 것이 참 서글프다는 것을 이제야 느끼고 있다. 아무튼 많은 분들이 더 함께 공부하고, 더 같이 소통할 수 있는 날이 왔으면 좋겠다 :)




'주절주절' 카테고리의 다른 글

얀테의 법칙  (1) 2018.07.19
더 나은 무지  (2) 2018.07.06
My own roadmap to be back-end dev.(~18.07)  (0) 2018.07.01
Library 함수 사용에 관한 고찰  (0) 2017.10.05

"High-level reasoning requires very little computation, 

but low-level sensorimotor skills require enormous computational resources."

<Moravec's paradox>



AI에 대한 호기로운 관심부터 인공지능 논쟁에 있어 빠지지 않고 등장하는 AI가 인간 삶에 미칠 부정적 영향까지. 사실 인공지능은 과거부터 꾸준히 우리의 관심을 받아온 기술 분야였다. 사람들은 인공지능의 발전으로부터 더 나은 삶의 수준을 얻을 수 있게 될 것이라 기대하면서 동시에 그러한 편안함으로 말미암아 자신들의 일자리를 잃게 되지는 않을까 우려해왔다. 그리고 작년, 딥마인드의 알파고가 이세돌에게서 '바둑'이라는 종목으로부터 승리를 따낸 이후 인공지능의 대한 관심은 '기대'보다는 '우려'에 맞추어졌다.


다시 한 번, 인공지능은 우리에게 낯선 주제나 기술이 아니다. 우리는 아마존의 'Alexa'나 애플의 'Siri' 등 선진화된 인공지능을 어디서나 쉽게 만나볼 수 있다. 그리고 눈 여겨봐야할 점은 그러한 인공지능이 행할 수 있는 기능이 날로 다양해지고 있다는 사실이다. 이전에는 알람 설정, 특정 음악 재생 등 단순한 기능의 수행에 그쳤다면, 이제는 'Chatbot'과 같은 기술로 인간 수준의 대화를 행할 수 있고 더 나아가 목소리의 인식을 통해 상대방의 감정을 예측하려는 움직임도 보인다. 


그럼에도 현재 AI가 가진 부족한 부분은 대화를 함에 있어, 인간 수준의 '공감' 능력을 가지고 상호작용을 하지 못한다는 점이다. 공감능력은 고등사고 중에서도 높은 사고력을 요하는 부분으로, 아직까지 AI에게서 인간 수준의 공감 능력을 기대하기란 어렵다. 현재 AI는 목소리의 떨림 혹은 감정 변화에 따른 신체 변화 등으로 인간의 감정을 판단하고, 그렇게 분석된 Data를 통한 공감을 하는 수준에 그치고 있다고 한다. 


또한 인공지능은 Command와 Input에 대한 연산을 수행하도록 만들어졌기에, 그에 반하는 혹은 명령어로 산출될 수 있는 Output 보다 더 창의적 결과물을 만들어내려는 노력을 찾아보기 힘들다고 한다. 정재승 교수를 비롯한 뇌과학자들의 비유에 따르자면 인공지능의 이러한 창의적 일탈이 일어날 확률은 '원숭이에게 아무렇지 않게 타자기를 두들기도록 했을 때 셰익스피어의 <햄릿>이 나올 확률'이라고 한다. 


이처럼 우리가 우려하면서도 기대하고 있는 인공지능은 현재 영화 속에서 그려지는 것처럼 하나의 '인격체' 정도로서의 기능을 수행하지는 못한다. 그럼에도 인공지능이(정확히 말하자면 딥마인드가) 작년 전 세계를 강타한 이유는 이처럼 '불가능하다고 여겨진 일'을 해냈기 때문이다. 바둑이라는 종목은 체스보다 고도의 사고를 필요로 할 뿐더러 경험과 직관 등 수치화될 수 없는 다양한 외부 요소가 승패에 작용한다고 한다. 따라서 인공지능 전문가들 조차 인공지능이 발전을 거듭하더라도 '바둑'이라는 종목에서 인간을 넘어설 수 없다고 주장해왔다.



<응, 아니야>


그러나 인공지능에게 불가능이란 없었다. 강화학습, 머신러닝, 딥러닝 등 나에겐 이름만 친숙한 다양한 분야가 발전하기 시작하더니 결국 인공지능이 '바둑'의 최강자들을 물리치기 시작했다. 판 후이, 이세돌, 커제 등 다양한 정상급 기사들을 패전기사로 전락시키며 전 세계에 커다란 파장을 불러일으킨 것이다. 그리고 이 여파는 특히나 우리나라에 크게 작용하여, 정부급 인사를 비롯한 수많은 사람들의 4차 산업혁명에 대한 관심으로 귀결되었다.

(결국 코딩 의무교육의 시초는 알파고..)


이처럼 날로 발전하는 인공지능의 특성 상, 나는 머지않은 미래에 인격체와 같은 사고가 가능한 인공지능이 탄생할 것이라는 주장에 전적으로 동의한다. 문제는 이러한 기술이 단순이 가능하다, 불가능하다의 문제가 아니라는 것이다. 이러한 인공지능이 정말로 탄생(생명이다, 정말로)했을 때 이후에 벌어질, 그리고 바뀌게 될 우리 사회에 대한 밑그림이 그려지냐는 것이다.




영화 <Her>는 인공지능과 인간의 사랑이라는 지금으로서는 다소 상상하기 어려운 주제를 다루며, 인간과 인공지능의 사랑이 정말로 가능한 것인가? 라는 단순한 질문에서부터 사랑에 대한 본질적 질문, 인간이 인공지능과 달리하는 특성 등 관람객의 사고 정도에 따라 더 깊게 발생할 수 있는 난해한 질문들을 마구마구 쏟아낸다. 그리고 이 영화가 던지는 질문들이 우리가 앞으로 다가올 인공지능을 맞이하기에 앞서 고민해봐야 할 밑그림의 거름이다.


인공지능과의 사랑, 내 일자리를 앗아갈 인공지능, 성적 분출구가 될 로봇 등.. 인공지능과 기술의 발전에 따라 그에 대한 찬반양론은 다양한 주제로 끊이지 않고 계속해서 쏟아져 나오게 될 것이다. 그리고 우리는 이러한 우리의 사고를 단순한 논쟁거리로만 치부하지 말아야 한다. 끊임없이 이에 대해 고민하고, 의견을 공유하며 다가올 미래에 대한 건강한 사고관을 확립할 수 있어야 한다. 


"우리가 일자리에 대한 두려움을 가지는 것은 이기심이 아닌가?" 

많은 사람들이 프로그래밍화된 인공지능이 본인들의 회계장부를 맡아주기를 원하게 되면, 회계사라는 직업을 가진 사람들의 일자리가 위태로워 진다. 많은 사람들이 이전의 판례들을 모두 분석한 인공지능이 자신의 변호를 맡기를 원하게 되면, 변호사라는 직업이 위태로워 진다. 나는 편리해지고, 남은 위태로워진다. 그럼에도 본인의 직업에 대한 소멸만을 걱정한다고?


"인공지능과 사랑하는 것은 있을 수 없는 일인가?"

사랑에는 한 가지 사랑만이 존재하지 않는다. 이에 따라 육체적 사랑만을 좇는 사람이 있는가 하면, 속칭 Platonic Love이라 불리우는 정신적 사랑만을 좇는 사람 또한 존재한다. 인공지능과의 사랑은? 굳이 분류하자면 후자의 정신적 사랑이라고 분류할 수 있겠다. 물론 이후 기술적 발전과 더불어 현재 세계 각지에서 개발 중인 '섹스 토이'와 인공지능과의 결합을 통해 두 사랑 모두를 인공지능이 취할 수도 있고 말이다. 


이렇게 된다면 인공지능은 두 가지 사랑을 모두 충족하게 된다. 여기서 지적할 수 있는 문제는? 프로그램의 한 패널은 "인공지능은 무조건적으로 자신의 편이 될 것이다. 사랑은 일방향적 종속이 아닌 서로 간의 수평적 관계를 가져야 한다." 라고 주장하였다. 일리있는 말이라고 생각한다. 하지만 이 주장 또한 한 사람의 주장이기에 더 생각해보아야 할 문제인 것 같다.


앞으로 호의적 입장을 취했든, 부정적 입장을 취했든 우리는 인공지능의 발전을 계속해서 지켜보게 될 것이다. 따라서 인공지능에 대한 무조건적 찬성, 무조건적 반대가 아닌 자신이 계속해서 견지할 수 있는 뚜렷한 사고를 확립하는 것이 다가올 미래를 맞이하여 우리가 준비할 수 있는 하나의 예비 과정이 될 수 있을 것이라고 생각한다.

혼자 프로그래밍 언어를 공부하다 이번 학기 전공 수업으로 강의를 수강하며 듣다보니, 과제의 조건이 굉장히 낯선 경우가 많다.

이전까지는 간단한 문제 풀이로 복습을 해왔다면, 학교에서는 프로그램의 구현을 통해 복습을 하는 느낌이랄까..

그 중 나에게 있어 가장 골치 아프고 과제 수행을 하는 내내 화를 참기 어려운 것이 바로 이 조건이다.


"Don't use library functions."


모든 교수들이 이같은 조건을 내거는 것은 아니지만, 초장부터 끝장까지 뚝심있게 이 조건을 내거는 강의들 또한 존재한다.

과제를 처음 내받을 때는 큰 감정의 변화는 없다. 다 한 번쯤은 써본 함수로 구현하는 과제일테고, 어떻게 어떻게 작동 과정을 거치면 되겠다!

그리고 이러한 생각이 끝나갈 때 쯤, 항상 위 말을 한국어 버전으로 들을 수 있다. "함수나 메소드 사용하지 않고, 직접 구현해서 작성하세요" 


하나의 조건이 추가된 것 뿐이지만 이전에 떠올린 생각은 완전히 무의미한 사고가 되었다. 도움이 될 때도 있지만, 대부분은 아니다. 그리고 과제의 수행을 위해 라이브러리 함수가 가진 기능을 직접 구현하고 있는 자신을 보고 있자면 이런 생각들이 나를 지배한다. 왜 멀쩡히 존재하는 기능을 쓰지 않는 것일까? 우리가 함수 개발자가 되길 바라시는 것일까? 굉장히 변태적이구나.. 


대학 과제 외에도 이처럼 라이브러리 함수 사용의 제한을 두는 집단들이 존재한다. 듣자하니 삼성 소프트웨어 멤버십의 일정 하이 레벨에 이러한 제한이 있고, 사내 심사에 있어 제한을 두는 기업들도 있다고 한다. 모두 비슷한 생각을 가지고 시험에 임할 것이 눈에 그려진다.


그렇다면 이러한 제약은 왜 존재하는 것이고, 이로 인해서 피시험자 혹은 학생이 얻게 될 이점은 무엇이 있을까?

생활코딩의 '이고잉'님은 HTML / CSS 강의 내 초기 수업들을 메모장을 이용하여 진행하신다. 그리고 일정 시차가 지났을 때, Atom을 소개해주신다. Visual Studio를 이용하는 많은 프로그래머들은 초보 코더가 Visual Studio로 코딩을 시작하는 것을 완전히 추천하지 않는다고 한다.


나는 라이브러리 함수 사용의 제약이 앞의 두 가지 예와 같은 이유를 공유한다고 생각한다. '불편함의 미학'이 바로 그 이유이다. 이 말은 불편한 것이 최고이며, 아름답다는 말이 아니다. 본인이 직접 불편함을 마주하여 겪어보고, 겪은 불편함에 대한 고민을 해 본 경험이 있는 사람이 그렇지 않은 사람보다 더 비판적 사고를 지닐 수 있게 되는 것이다. 불편함을 겪지 않는다면 왜? 그리고 어떻게?에 대한 고민없이 너무나도 쉽게 편리한 기능에 익숙해지기 때문이다. 그리고 이는 우리가 쉽게 사용하고 있는 기능, 컴파일러, 언어 등 모든 개발자 영역에 적용이 가능한 매너리즘의 한 부분이라고 생각한다.


물론 이같이 불편함으로부터 소중한 경험을 하는 것 외에도 말 그대로 라이브러리 함수, 컴파일러 등이 어떻게 구현되고 작동하는지에 대한 정확한 이해를 묻기 위해 이 제약을 내걸 수도 있다(레벨 및 사내 심사는 이 부분에 분류되어야 할 것이다.) 그러나 대학 과제에서 제시하는 이 제약은 불편함의 미학을 가르치기 위함이 확실하다고 믿고 있다.


그럼에도 앞으로 '라이브러리 함수 사용 금지'라는 조건이 내걸린 과제를 본다면 탐탁치 않은 기분으로 과제를 받아 들이겠지만, 이같은 고찰을 한 번이라도 해보았으니 내가 이 제약으로부터 얻을 수 있는 긍정적 요소들(이를테면 라이브러리 함수에 대한 이해, 선대 개발자가 이전에 느꼈을 불편함..)을 많이 떠올리며 최대한 즐겁게(?) 과제에 임할 수 있도록 시도해봐야겠...다...


'주절주절' 카테고리의 다른 글

얀테의 법칙  (1) 2018.07.19
더 나은 무지  (2) 2018.07.06
My own roadmap to be back-end dev.(~18.07)  (0) 2018.07.01
비전공자의 C언어 입문기  (0) 2018.01.07

정재승 교수가 강연자로 출연한 '차이나는 클라스' 프로그램의 19화를 시청하였다.

사실 정재승 교수는 인지도 면에서 워낙 타의 추종을 불허하는 과학자이기에 모두에게 그리 낯설지 않을 것이다.

나 또한 개발 관련 공부를 시작하기 이전부터 정재승 교수의 초심자용 과학 관련 도서들을 읽으며 자라왔고,

진중권 교수와 함께 집필한 '크로스'라는 책도 흥미롭게 읽은 경험이 있다. 


때문에 정재승이라는 과학자는 나에게 굉장히 긍정적 느낌을 주는 사람으로 자리해왔다.

그러나 최근 '4차 산업혁명'이라는 말이 가지는 파급력이 강해지고, 각계각층에서 이 용어에 관심을 기울이기 시작하며

이 뇌과학자의 발언에 찬반양론이 발생하는 광경을 종종 목격하였다.


혹자는 이 뇌과학자가 AI의 발전으로 인해 국영수를 공부할 필요가 없어지는 세상이 올 것이라고 주장했다 말하며, 

어떤 이는 정재승이 4차 산업혁명의 여파로 미래에 대한 불확실성과 실업률이라는 부정적 영향만이 남을 것이라고 주장했다 말한다. 

나는 '왜 이러한 반 정재승이 생겨나게 되었을까?'를 고민하며 이 방송을 찾아보게 되었다.


강연을 통해 정재승 교수는 4차 산업혁명이라는 용어가 생겨나게 된 역사적 배경부터 어떠한 방식으로 지금의 연구원, 과학자들이 

4차 산업혁명을 주도하고 이끄는 노력을 하고 있는지 알기 쉽게 설명한다.



4차 산업혁명의 핵심은 'Atom(현실)'과 'Bit(online)' 이 두 세계를 정보 통신 기술을 이용해 합치는 데에 있다. 현실 세계의 다양한 기계들이 'IoT'를 통해 연결이 되고, IoT의 운영 및 유지에 있어 필요한 모든 데이터들은 'Cloud'라고 하는 가상의 'Database'에 저장이 된다. 그리고 이러한 DB에 대한 빅 데이터 분석을 통해 최종적으로 인간이 원하고, 필요로 할 만한 Data들이 쏟아져 나오는 것이다. 


이 뿐만이 아니라 'Desktop Factory'라는 개념 또한 등장한다. 1, 2차 산업혁명에서 비롯된 '인간 소외 현상'과 자본가에게만 부가 축적되는 문제점에서 비롯된 이 개념은 'Desktop'이라는 개개인이 소지할 수 있는 무기를 가지고 기업에 대응할 수 있을 만한 하나의 Factory를 구현하자는 것이다. Desktop에서 시작해 전세계적 미디어로 자리한 마크 주커버그의 Facebook과 같이 말이다. 이러한 주장은 현재 3D Printer의 발전과 함께 힘을 얻고 있으며, 유통비의 절감과 창고 및 저장 공간의 불필요 등 다양한 이점을 지닌 채 지속적으로 발전하고 있다. 



그렇다면 과연 이러한 혁명의 물결 속에서 우리는 무엇을 해야하고, 무엇을 할 수 있을까? 정재승 교수는 이렇게 주장한다. Fast Follower로 성장해온 우리나라의 교육 여건 상, 우리는 국영수 등 결과적 지표를 확실하게 낼 수 있던 인재를 찾아내고자 했었다. 그러나 First Mover로의 전환이 불가피한 4차 산업혁명의 물결 속에서 이제는 국영수 등 단순 해답을 내는 교육열에서 벗어나, 본인이 가진 생각을 잘 표현할 수 있고 변화하는 환경에 잘 적응할 수 있는 인재에 대한 고민이 절실하게 필요하며 그러한 인재를 양성할 수 있는 교육 양식이 필요하다고 말이다.


과연 정재승 교수는 4차 산업혁명에 대한 부정적 시각과 의구심만 내비친 것일까? 

AI의 발전에 따라 우리 인간이 학습에 대한 고민을 할 필요가 없어졌다는 주장을 한 것일까? 


나는 "개발자가 되겠다"라는 생각을 가지고 공부를 하며 페이스북 내 '생활코딩' 그룹의 글을 관심있게 지켜봐왔다. 그리고 그 곳에서 일어나는 4차 산업혁명에 대한 논쟁은 항상 절대 다수의 부정적 의견에 의해 일방향적 성장만을 일구어 나갔다. 나는 그러한 글들을 보며 자문했다. "흔히 말하는 이 '현직자'들은 본인들이 속한 field의 발전을 싫어하는 것일까? 다수의 다른 사람들의 유입으로 인해 본인들의 field가 훼손되는 것을 싫어하는 것일까?"


그렇게 나는 '현직자'가 아니기에 명쾌한 답을 찾기 못하였다. 그리고 그 분들의 주장을 그렇게 신뢰하지도, 자주 찾아보지도 않겠다고 다짐을 하게 되었다. 이 분야의 공부를 늦게 시작한 입장에서 보자면, 그 분들의 그러한 방어적이고 회의적 태도가 나의 발전에 전혀 도움이 되지 않는다고 생각하기 때문이다. 그렇다고 정재승 교수와 같이 희망적 사고를 주장하는 분들에게 절대적 지지를 표하는 것 또한 아니다. 

(나또한 엘론 머스크와 마크 주커버그가 미디어를 두고 펼치는 AI에 대한 논쟁을 재미있게 지켜보는 입장이다.)


그저 정재승 교수가 주장한 것 처럼 '현재의 우리는 미래에 어떠한 일들이 벌어질지 '예측 불가능'한 상태에 놓여있는 것'이기 때문에 계속해서 고민을 하고, 공부를 하는 것 뿐이다. 세상을 경험하며 고민하고, 공부를 하고, 미래를 준비하다 보면 언젠가 '나'라는 사람만이 잘할 수 있는 분야를 찾아 개척할 수 있지 않을까 하는 생각을 하며 말이다.

+ Recent posts