컴퓨터 과학이 여는 세계 요약 - keompyuteo gwahag-i yeoneun segye yoyag

Data Engineering/Books

컴퓨터 과학이 여는 세계를 통해 생각해 본 추상화

Hyunie 2021. 11. 7. 20:13

컴퓨터 과학이 여는 세계 - 이광근 저

 

 처음 공부할 때는 툴의 사용에 집중했다. 입문 수준으로는 충분했으나 예상치 못한 에러를 만나는 등 응용이 필요한 상황이 생기거나 자꾸만 에러에 부딪히면서, 또는 내가 툴을 골라야 할 경우가 계속 발생하면서 조금 더 깊이있는 공부가 필요하겠다는 생각이 들었다.

 하드웨어가 먼저 발명이 되었고 소프트웨어는 하드웨어의 동작 방식에 기반하여 발명된다. 소프트웨어의 확장에 따라 요구사항에 맞게 하드웨어는 발전한다. 결국 소프트웨어와 하드웨어는 서로 호환적인 관계이기때문에 컴퓨터의 시작부터 흐름을 알아야겠다고 생각했으나, 어디서부터 어떤 자료를 참고하여 공부해야할 지 막막했는데 함께 일하는 분께서 이 책을 추천해줬다.

 

 컴퓨터의 시작은 1936년 엘런 튜링이 쓴 논문에 있다. 해당 논문에서 세운 가설을 증명하게 위해 '튜링 기계'라는 것을 고안하는데, 이것이 컴퓨터의 전신이다. 단순한 계산기에서 시작했을 것이라고 생각했는데 의외였다 (해당 기계의 자세한 동작 방식은 다루지 않겠다. 유투브에 저자가 설명한 강의가 있으니 들으면 바로 이해가 될 것이다).

 논문의 핵심은 '기계적인 방법으로 모든 문제를 풀 수 없다'는 것이었다. 현재 컴퓨터는 모든 문제를 풀려고 하는 연구의 주요 도구로 사용되고 있는데, 컴퓨터의 시작이 모든 문제를 푸는 것을 불가능하다는 가설을 증명하기 위해 사용되었다는 점이 흥미로웠다. 문제는 무한하고, 현실 세계에는 예상할 수 없는 변수들이 많으며 완벽해질 수 없는 기계의 한계 때문일 것이다.

 

 해당 기계는 입력값을 받고 주어진 '규칙표'에따라 출력값을 뱉는다. 결국 컴퓨터의 핵심은 입력과 출력이고, 사용하는 사람은 세부적인 동작을 알지 못해도 용도만 알면 기계를 사용할 수 있다. 여기에서 정말 말 그대로 추상적인 단어인 '추상화'라는 단어가 설명된다. 이 책에서는 계층구조와 추상화를 연결해서 '속내용을 감추며 차곡차곡 쌓기'라고 표현을 했는데 이게 더 헷갈리는 것 같다. 계층구조의 원어인 hierachy를 영영사전에서 찾아보면 'A hierachy of ideas and belifs involves organizing them into a system or structure'이라고 되어있고, 추상화는 '뭉뚱그리는 것'이라고 이해하면 빠를 것 같다. 즉, 잘 쌓아서 만든 전체 구조를 하나로 뭉뚱그리는 것이 추상화이다. 쉬운 예로 곱셈을 계산하는 기계가 있다고 생각해보자 (적절하지 않은 예시일 수 있다. 느낌만 보자). 나는 이 기계를 입력값 두 개 x, n이 들어왔을 때 x를 n-1번 더하는 계층으로 설계했다. 그러면 기계는 다음과 같은 순서로 동작한다.

  1. 입력값 x, n을 기계에 받음
  2. x에 x를 더함
  3. 2의 출력값에 또 x를 더함
  4. 3의 출력값에 또 x를 더함.....(반복)
  5. x에서 x를 더하는 과정이 n-1번째 되는 결과값 y를 출력함

 이 기계를 사용하는 사람은 2번부터 5번까지의 과정은 알 필요 없다. 그저 내가 2와 3을 곱한 결과값을 출력하고 싶다면 입력값에 2,3을 넣으면 된다는 것만 알면 된다. 중간 과정에 개입할 필요 역시 없다. 이것이 추상화이다.

 예시로 운전을 많이 드는 것 같은데, 자동차를 멈추고 싶으면 브레이크를 밟으면 된다는 것만 알면 된다. 내가 발로 브레이크를 누른 순간 자동차에 무엇이 어떻게 전달되고 마찰력을 어떻게 이용해서 차가 멈추는 지는 사실 운전자로써 알 필요 없다.

 하지만 이 기계를 나의 입맛에 맞게 잘 활용하려면 한 단계 더 나아가야한다. 빗길에서 똑같은 속도로 브레이크를 밟았는데 차가 더 늦게 멈춰서 사람을 치었다면, 드리프트를 하고 싶다면, 브레이크를 눌렀을 때 일어나는 어떤 일들 때문에 차가 멈추는지 조금 더 알아야한다. 거기서 내가 브레이크를 자유자재로 내가 원하는 목적에 맞게 사용하고 싶다면? 또는 현재 브레이크에서 가지고 있는 문제점을 고치고싶다면? - 이것이 응용이 될 것이다 - 브레이크의 작동 원리에 대해 완전히 알아야 할 것이다. 그래서 처음 파이썬을 배울 때는 코드를 따라치고, 실행해보는 것만 해도 충분하지만 에러를 고치거나 하고자 하는 업무에 파이썬이 적합한 지 판단할 때는 파이썬의 동작 원리를 어느 정도 알아야하는 것이다. 따라서 내가 서비스의 사용자냐, 유지보수자냐, 개발자냐에 따라 해당 서비스를 이해해야하는 계층구조의 단계가 다르다.

 사실 결론만 보면 너무 당연한 이야기인데 왜 추상화가 필요할까에 대해 생각하다보니 앞의 이야기가 길어졌다. 결국 현재 나의 입장이 무엇인지, 이 프로그램을 사용하는 나의 단계가 무엇인지에 따라 그 프로그램에 대해 이해해야하는 (작동 원리의) 계충구조가 달라진다는 것이다. 더욱 본질적인 부분이 내 업무에 요구될 수록, 알아야하는 단계는 낮아질 것이다 (점점 원초적인 단계로 간다는 뜻).

 

 배우는 단계거나 단순한 사용자라면 추상화 된 기술만 알면 된다. 이 서비스가 어떠한 입력과 출력을 받는지 아는 것이 가장 중요하다. 반대로 어떠한 서비스를 만드는 사람이라면 사용자들이 추상화된 제품을 사용할 수 있게끔, 즉, 복잡하지 않은 방법으로 핵심 기능에 접근할 수 있도록 추상화를 잘 하는 것이 중요할 것이라 생각한다.

 

 사실 논문을 읽어본 사람이라면 추상화의 개념과 필요성을 더 쉽게 느낄 수 있다. 추상화는 영어로 abstraction이고, 논문에서의 초록 - abstract-과 같은 단어이다. 초록의 역할은 '(너네 바쁘거나 여기에 크게 관심이 없으면) 이것만 읽어도 우리의 연구가 왜 시작됐고, 그래서 어떤 방법을 통해 어떤 결론이 나왔는지 알 수 있게 해줄게'이다. 즉, 초록만 읽어도 대충 논문의 시작과 결론에 대해 대략적으로 파악할 수 있다. 추상화도 같은 개념으로 생각하면 쉽지 않을까하는 생각이 든다.

 

3.3장까지 읽으며 느낀 점

  1.  이 책을 읽으면서 컴퓨터는 수학과 물리학이 잘 버무려 진 결정체라는 생각이 들었다. 튜링 기계를 설명하며 나왔던 멈춤 문제의 증명, 대각선 논법 등도 정말 흥미로웠고 부울논법을 읽으면서 퍼셉트론을 배웠을 때가 생각나 신기했다. 증명을 보면 항상 콜럼버스의 계란같은 생각이 든다. 읽으면 쉽지만 만들어내려면 어려운..
  2. 글을 읽으면서 컴퓨터 자체부터 안에서 동작하는 모든 소프트웨어와 하드웨어에서 가장 중요한 것은 결국 입력과 출력이라는 생각이 들었다. 
  3. Bit가 binary digit의 줄임말이라는 것을 처음 알았다. 이걸 아니까 항상 헷갈리던 Bit와 byte가 자연스럽게 기억되었고 왜 영어가 1byte인지 바로 이해가 됐다 - 한 비트는 스위치 회로에서 선 하나에 해당된다. 흐르느냐 아니냐.
  4. 스위치의 동작 방식을 언어로 표현할 수 있다. 언어는 단순화될 수 있다. 이것도 추상화의 일종이지 않을까 생각이 들었고, 이걸 조금 더 잘 활용하면 간결하고 깔끔한 코드를 쓸 수 있지 않을까 한다.

    지난 2015년 6월 29일~7월20일까지 『컴퓨터과학이 여는 세계』 독후감 대회를 진행했습니다.

    참여해주신 모든 분께 감사드리고, 그 결과를 다음과 같이 발표합니다.

    1. 튜링상

    이준원(서평: http://james99322.blog.me/220432918159)

    2. 가작

    김연호(서평: http://blog.naver.com/gusdndnwls/220426151791)

    이정민(서평: http://wjdalsdl1016.blog.me/220424517320)

    박지민(서평: http://blog.naver.com/pjm00120/220426156910)

    3. 특별상

    김연호

    4. 참가상

    권재희, 노우찬, 명하준, 문예강, 안세진, 유신혁(가나다 순)

    시상 날짜와 장소는 개별적으로 통지하겠습니다.

    심사위원분들과 저자 이광근 교수님께도 다시 한번 감사 인사 드립니다. 🙂

    Share this:

    • 트위터
    • Facebook

    이것이 좋아요:

    좋아하기 가져오는 중...

    관련

    컴퓨터, 컴퓨터과학과 관련된 핵심 아이디어들을 소개한 책이다. 사실 실용서라기 보다 개론과 원론 서적에 가까운데… 저자는 ‘컴퓨터 세계의 근본이 궁금할 때 누구나 펼쳐 볼 수 있는 과학 교양서적’ 혹은 ‘컴퓨터 전문가의 기본을 준비시켜주는 예과 입문서’로서 이 책을 썼다고 했지만, 기본 지식 없이 (혹은 다른 도움 없이) 책 그 자체로 수월하게 읽기는 꽤 어려운 내용들이 포함되어있다. 하지만 달리 말하면, 그 덕분에 다른 것들(개념이나 이론들)을 찾아보게 만드는 책이기도 하다.


    다루고 있는 범위는 넓고 전체 분량에 비해 깊다. 일단 보편만능 기계로서의 ‘튜링기계’를 그와 관련된 증명들을 포함하여 자세히 설명한다. 이어서 부울이 이야기한 ‘그리고, 또는, 아닌’ 즉 부울식에 대한 이야기를 포함하고 있으며, 이것이 스위치로 어떻게 전이될 수 있는지, 그리고 그것이 컴퓨터에서 어떻게 실현되는지를 설명한다. (그리고, 이 과정에서 폰 노이만의 이야기가 등장한다.)


    소프트웨어 영역에서는 그 핵심이라고 할 수 있는 여러 알고리즘과 복잡도에 대해 설명하고 있고, 프로그래밍 언어의 경우 기계적인 관점과 람다의 관점에서 이를 풀어내면서 마지막엔 데이터의 관점에서 확률추론 프로그래밍(probabilistic programming - 관찰된 데이터로부터 그 원인을 가늠하는 프로그램을 짜는 , 즉 이 데이터로부터 명시한 인과관계를 거꾸로 거슬러 가능성 은 원인을 어림잡아 추측하고자 하는 것)을 설명한다.


    그 밖에도, 인간 지능이 컴퓨터를 통해 (혹은 컴퓨터와 협업하여) 어떻게 확장될 수 있는지 실 사례들을 제시하고 있고, 인코딩과 디코딩의 원리, 암호화와 복호화 기술에 대한 이론들도 간략히 덧붙이고 있다.


    특히, 책 전반에 걸쳐 소개된 이론들 중 인상깊었던 것은 아래와 같다.


    -------------------- 


    첫번째는, (오늘 오전에 읽은 용의자 X의 헌신에도 잠깐 나왔던!P ≠ NP 문제.


    (아마도) P ≠ NP이라 추측하지만, 아직 수학적으로 증명되지 않았다. 여기서 P는 현실적인 비용으로 수 있는 문제들, 즉 다항(polynomial) 알고리즘이 있는 문제들을 의미하며 P클래스 문제라고 한다. NP는 운에 기대면 현실적인 비용으로 해결할수 있는 문제들(non-deterministic polynomial),  현실적인 비용으로 수 있는지는 아직 모르는 문제들(알려진 알고리즘이 기하급수의 비용을 가진 것밖에는 없는 것들)을 의미하며 NP클래스 문제라고 한다. 다시 말해, P ≠ NP는 이 두 클래스의 문제를 명확하게 구분하는 (서로 다르다고 할 수 있는) 경계가 ‘있음’을 증명하는 문제다. 


    두번째는, 대학 시절 기호논리학에서 배웠던 러셀의 역설.


    러셀의 역설은 다음과 같다. “나는 지금 거짓말을 하고 있다”라는 문장은 거짓과 참을 구분할 수 없다는 것이다. 이를 수학적으로 표현하면, “자기 자신을 포함하지 않는 집합들”이라고 할 수 있는데, 풀어보면 다음과 같다. S가 저 문장에 해당하는 집합이라면, 그런 S들로 구성된 집합은 S를 원소로 갖는가(포함하는가) 갖지 않는가(포함하지 않는가)의 문제가 된다. 이는 모순이다. 이러한 개념은 프로그래밍에서 '타입(type)'을 정의하는데 영향을 주었다.


    세번째는, 구글의 검색 기술인 페이지 랭킹과 관련된 마르코프 체인.


    서로 다른 웹 페이지 간의 이동과 방문 빈도를 사전에 계산(시뮬레이션)하는 방법을 돕는 수학적인 도구가 마르코프체인(markow chain)이다. 마르코프 연쇄반응식의 기본 조건은 '모든 상수가 음이 아니면서 각 변수 앞에 곱하는 상수의 합이 각각 1이어야 한다.'는 것이다. 예를 들어, 서울시에서 세종시로 5%가 이동하고 세종시에서 서울시로  15%가 매년 이동한다면, 각각 시의 내년 인구는 다음과 같이 계산할 수 있다.


    내년 서울시인구 = 0.95 x 올해 서울시인구 + 0.15 x 올해 세종시인구

    내년 세종시인구 = 0.05 x 올해 서울시인구 + 0.85 x 올해 세종시인구


    그리고 실제 이 과정이 점화식 형태로 연쇄적으로 이루어지면 각각의 값은 특정한 값으로 ‘수렴’한다. 그리고, 이것을 웹 세계에 적용하면  33억(지금은 50억?) x 33개의 점화식이 되는데, 이 수렴값들을 계산해 내는 것이 구글의 페이지 랭킹기술이다


    네번째는, 몇몇의 암호화 방법들.


    서로가 사용하는 공통 비밀 키를 바탕으로 된 디피-헬만 열쇠교환(diffie-hellman key exchange) 암호화와 메시지의 원저자가 실제 그 사람인지를 확인할 수 있게 하는 RSA 암호방식, 그리고 데이터 복호화 없이 해당 데이터로 연산을 가능하게 하는 방법인 완전동형암호(fully homomorphic encryption)와 관련된 이야기들도 수업 중에 들었던 내용들이라 더 반가웠다.


    -------------------- 


    다만, 익숙하지 않은 용어를 강조한다거나 (연역, 귀납, 추론 등을 디덕, 앱덕, 인덕;; 으로 굳이 표기하고 있는데 굳이 왜 그래야 하는지 이해가 되지 않는다.) 완결되지 못한/혹은 매끄럽지 못한 문장을 사용하고 있는 부분, 그리고 여러 부분에서 중복된 문장이 나오고 있는 건 추후에 교정이 좀 되었으면 했다.