ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 컴퓨터 과학이 여는 세계를 통해 생각해 본 추상화
    Data Engineering/Books 2021. 11. 7. 20:13
    728x90
    반응형

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

     

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

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

     

     컴퓨터의 시작은 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. 스위치의 동작 방식을 언어로 표현할 수 있다. 언어는 단순화될 수 있다. 이것도 추상화의 일종이지 않을까 생각이 들었고, 이걸 조금 더 잘 활용하면 간결하고 깔끔한 코드를 쓸 수 있지 않을까 한다.
    5. 3.4장부터 앞에서 설명했던 스위치, 논리구조, 튜링기계들이 어떻게 현재의 컴퓨터를 만들어지는데 활용되었는지 나오는 듯하다. 조금 더 집중해서 읽어봐야겠다.
    728x90
    반응형

    댓글