수학, 소프트웨어, 그리고 문제 해결 간의 상관 관계

sith-call.dev·2023년 11월 21일
0

Computer Science

목록 보기
15/15

글을 쓰게 된 계기

난 오늘 이 글에서 지금까지 날 괴롭혀 왔던 생각을 종결하고자 한다.

난 항상 기본에 충실하고 싶었다. 마치 과학자들이 물질의 근본 구성요소를 탐구해나가듯 수학을 배울 땐 수학의 가장 기본적이고 근본적인 규칙을 찾고 싶었고, 삶의 고충이 심해질 땐 내 삶의 버팀목이 되어줄 철학 또는 사상을 찾아다니곤 했다. 만약 내가 그러한 근본적인 규칙을 안다면, 어떤 문제든지 간단한 규칙들의 조합으로 풀어낼 수 있으리라 생각했기 때문이다. 그리고 시간이 흘러 이런 내 학습 성향은 나 자신만의 소프트웨어 엔지니어링이란 무엇인지 정의내릴 수 있고 이 글을 쓰게 된 계기가 되어주었다.

여기서 강조하고 싶은 점은 바로 연결이다. 내 나름대로 원하는 만큼 깊이 있게 지식들을 탐구하다 보니, 서로 완전히 다른 영역이라 생각했던 것들 간의 공통점을 볼 수 있게 되었고, 그 공통점은 그 지식들을 서로 연결해주었다. 처음에는 수학과 소프트웨어 간의 연결고리가 보였고, 그 다음에는 소프트웨어와 문제 해결 간의 연결고리가 보였다. 그래서 이 글은 이 연결고리들이 무엇인지에 대한 글이 될 것이다.

수학과 소프트웨어

1. 수와 연산의 정의를 말해보시오

난 한때 이런 생각을 한 적이 있다.

수학이란 무엇인가?
수에 대한 학문이다.
그렇다면 수란 무엇인가?

결론부터 말하자면, 수란 연산 가능한 모든 것을 지칭하는 말이다. 여기서 중요한 점은 연산 가능하다는 조건이다. 그렇다면 연산이란 무엇인가? 허무하게도 연산은 임의로 정의된 규칙이다. 물론 연산으로서 정의되기 위해선 수학적으로 몇 가지 조건을 충족시켜야 한다. 그러나 반대로 말하자면, 몇 가지 조건만 만족한다면 어떤 규칙이든 연산이 될 수 있으며 그 연산이 부여된 모든 대상은 수가 될 수 있다는 뜻이다. 즉, 내가 임의로 무엇이든지 간에 규칙을 부여할 수 있다면 그것은 수로서 취급 가능하단 뜻이다. 난 여기서 수학의 엄청난 확장 가능성을 느꼈다. 그리고 동시에 피타고라스의 '만물은 수이다'란 명제가 현대적으로 재해석 되는 시점이기도 하며 컴퓨터공학이 수학에 포함될 수 있는 근거를 찾은 시점이기도 하다.

위에서도 언급했지만 임의로 정의된 규칙은 몇 가지 조건을 만족해야만 연산으로서 취급될 수 있다. 그렇다면 이런 조건은 왜 존재하는 것일까? (만족해야 할 규칙에는 교환법칙, 결합법칙, 분배법칙 등이 있다) 바로 적어도 이 정도 조건은 규칙이 만족해줘야 쓸모 있다고 인정할 수 있기 때문이다. 예를 들어, 사람의 수를 세고 싶은데 철수를 먼저 세고 영희를 세면 두 명이지만, 영희를 먼저 세고 철수를 세면 한 명이라고 대답하는 규칙이 과연 쓸모 있는 것인가? 이렇듯 특정 규칙이 연산으로서 인정 받기 위해선 그 규칙이 합리적이어야 하고 덧붙여 실제 세계를 모방할 수 있어야 한다. 그래야만 그 규칙은 쓸모 있는 것이다.

난 여기서 연산이 실제 세계를 모방할 수 있다는 것에 집중하고 싶다. 왜냐하면 연산은 계산 가능하기 때문이다. 연산이 실제 세계를 모방한다면, 수를 이용한 계산은 곧 미래를 예측하는 것과 다름 없다. 그리고 놀라운 점은 종이와 펜만으로 미래를 예측할 수 있다는 점이다. 이는 물리학이 세상에 가져온 수많은 혜택들이 모두 예시가 된다. 물리학은 정말로 실제 세계에 있는 물질들에 연산을 부여하여 미래를 예측하는 학문이기 때문이다.

2. 컴퓨터에서 수와 연산을 정의하기

위에서 언급했듯이 컴퓨터를 이용하여 수와 연산을 정의하고 그리고 그 연산이 실제 세계를 모방하고 있다면, 우린 컴퓨터를 통해 원하는 미래를 예측해 볼 수 있다. 그리고 바로 이진수가 컴퓨터 내부에서 정의된 수이며 AND, OR, NOT에 해당하는 논리 연산자들이 이진수를 위한 연산들이다. 하필 컴퓨터가 이진수와 앞서 언급한 논리 연산자들을 채택한 이유는 하드웨어에 의한 제약 때문이다.

컴퓨터는 크게 CPU와 Memory로 구성되어 있다. Memory는 트랜지스터로 구성되어 있으며, 트랜지스터는 On, Off 상태만을 기억할 수 있다. 이때 On, Off가 각각 1과 0으로 대응되기 때문에 컴퓨터는 이진수만을 사용할 수 있는 것이다. 또한 AND, OR, NOT의 태생 자체가 하드웨어를 위한 연산이었기 때문에 자동적으로 이진수는 해당 논리 연산자들을 연산으로서 채택한 것이다.

이진수는 괴델 수 대응에 의해서 범용성을 보장 받는다. 왜냐하면 괴델 수 대응은 임의의 단어, 문장, 정보 등을 하나의 수로 일대일 대응시키는 방법이기 때문이다. 여기서 괴델 수 대응이란 개념이 어려울 수 있지만, 결론적으로 임의의 정보를 하나의 수로 일대일 대응 시킬 수 있다는 결론만 받아들이자. 그래서 우리는 이진수를 통해 적어도 인간 세계에 존재하는 정보들은 표현 가능한 것이다.

AND, OR, NOT 논리 연산자들의 범용성은 부울 대수에 의해서 보장 받는다. 이 명제는 수학적 귀납법에 의해서 증명 가능하다.

  1. 결과값이 1개인 모든 논리식을 AND, OR, NOT으로 표현할 수 있다.
  2. 결과값이 k개인 모든 논리식을 AND, OR, NOT으로 표현 가능하다면, 결과값이 k+1개인 모든 논리식을 AND, OR, NOT으로 표현 가능하다.
  3. 만약 위의 두 명제가 모두 참이라면, 수학적 귀납법에 의해서 결과값이 임의의 자연수 n개인 모든 논리식을 AND, OR, NOT으로 표현 가능하다.

여기서 1번 명제는 간단하게 NOT만을 이용하면 참이라고 증명할 수 있다. 문제는 2번 명제인데, 이 명제를 증명하기 위해선 정규형식(Normal Form)에 대해서 알아야 한다. 정규형식의 일종인 논리곱 정규형식(CNF, Conjuction Normal Form)은 임의의 논리식을 표현할 수 있다고 알려져 있다. 이는 직접 논리곱 정규형식을 써보면 체감할 수 있는데, 이러한 사실로 인해서 2번 명제 또한 참이다. 그렇기 때문에 수학적 귀납법에 의해서 모든 논리식을 AND, OR, NOT으로 표현 가능하다는 명제를 참이라고 증명할 수 있다. 덧붙여 AND, OR, NOT은 논리곱, 논리합, 부정이란 논리 연산자와 각각 대응되기 때문에 논리학을 통해서 부울 대수에 대한 사실을 추론할 수 있는 것이다.

덧붙여 부울 대수는 "Investigation of the Law of Thoughts"란 조지 부울의 논문에서 소개된 것으로 전자기 회로를 대수학으로 설계 및 계산하고자 하는 배경에서 탄생되었다. 왜냐하면 이 논문이 나오기 전까지만 해도 전자기 회로 설계는 일종의 Art였고, 만드는 사람의 기예에 따라서 다른 결과물이 나오던 시대였다. 조지 부울은 논리 회로의 게이트들이 논리식과 대응됨을 깨닫고 이를 종합하여 부울 대수를 만든 것이다. 이 또한 수와 연산을 정의하여 원하는 결과를 계산해낸 한 예시이기도 하다.

모든 프로그램은 이진수와 논리 연산자로 구성되어 있다. 컴퓨터공학에는 추상화란 개념이 있다. 마치 자동차 내부에는 사용자에게 필요한 장치들만 노출시키듯이 프로그램 내부에서도 개발자에게 필요한 부분만을 남기고 필요 없는 부분은 숨기곤 한다. 이를 반복하면 추상화 계층(Abstraction Hierarchy)이란 것이 생긴다. 즉, 이미 추상화된 코드들을 모아서 만든 코드를 다시 추상화 하는 것이다. 그래서 일종의 피라미드와 같은 구조로 코드가 이뤄져 있는 것이다. 그리고 내가 생각하는 추상화 계층은 아래와 같다. 밑에서부터 위로 가며 추상화 된 것이다.

  • 자료구조와 알고리즘
    • 인간 관점에서 추상화 된 수와 연산
  • 이진수와 논리 연산자
    • 가장 근본적인 수와 연산

우린 지금까지 수와 연산이 무엇인지 그리고 컴퓨터에서 사용하는 수와 연산인 이진수와 논리 연산자가 얼마나 범용적인지 알아보았다. 그러나 이진수와 논리연산자는 하드웨어 관점에서 만들어진 수와 연산이다. 그래서 컴퓨터 내부에서 쓸 수 있는 인간 관점의 수와 연산이 필요했기에 만들어진 것이 바로 자료구조와 알고리즘이다. 덧붙여 이것은 위에서 언급한 범용성에 의해서 구현 가능하다. 정리하자면 자료구조와 알고리즘은 이진수와 논리 연산자로 구현된 인간 관점으로 추상화 된 수와 연산이다. 이를 통해 인간 관점에서 손쉽게 컴퓨터 내부에서 수와 연산을 사용할 수 있게 되었고, 이러한 수와 연산을 사용한 계산이 곧 프로그램인 것이다.

3. 수학 세계와 실제 세계

수학에는 수학은 만들어진 것인지 또는 발견된 것인지에 대한 논의가 있다. 그리고 그 논의는 아직도 끝나지 않고 이어지고 있다. 그러나 이 논의에서 중요한 점은 실제 세계와 수학 세계는 서로 대응된다는 점이다. 그래서 두 세계는 상호 작용하곤 한다. 실제 세계에 있는 물체를 세기 위해서 태초에 자연수란 개념이 탄생(발견) 되었고, 뉴턴에 의해서 미적분이란 개념이 탄생(발견) 되면서 우린 물체의 운동을 계산 및 예측할 수 있게 되었다. 사실 이런 쌍방향 상호 작용이 모두 가능하기 때문에 수학은 발명의 산물인지, 발견의 산물인지 논의가 끊이질 않는 것이다.

위에서 살펴봤듯이 소프트웨어 세계도 수학 세계 못지 않게 크다는 것을 알고 있다. 그리고 난 수학을 매개로 소프트웨어 세계도 실제 세계와 대응된다고 생각한다. 물론 직접적인 대응이 어려운 경우도 있을 것이다. 그러나 수학 세계에 있는 것이라면 소프트웨어 세계에도 있는 것일테고, 실제 세계는 수학 세계와 대응되기 때문에 소프트웨어 세계도 실제 세계와 대응되는 것이다. 사실 난 이 주장을 하기 위해서 지금까지 글을 쓴 것이다.

소프트웨어와 문제 해결

1. 소프트웨어의 가능성과 한계

지금까지 쓴 글을 통해 소프트웨어는 수학에 의해서 큰 범용성을 갖고 있으며, 실제 세계의 문제를 소프트웨어 세계에 대응시켜 해결할 수 있음을 알 수 있다. 그리고 문제 해결에 필요한 것은 실행할 수 있는 컴퓨터뿐이다. 이 사실만 보면 모든 문제를 해결할 수 있을 것만 같다. 그러나 소프트웨어의 한계는 하드웨어로부터 나온다. 어찌보면 실제 세계와 소프트웨어 세계 사이에 하드웨어 세계가 끼어져 있는 것일지도 모른다.

이러한 한계는 소프트웨어 산업 및 생태계가 어떻게 변화했는지 보면 알 수 있다. 인공지능에 대한 개념은 지금처럼 인공지능이 활발한 시기보다 한참 전에 만들어졌다. 오히려 인공지능이 외면 받았던 시절도 있다. 그런데도 불구하고 지금 인공지능 붐이 일어난 이유는 인공지능을 구현할 수 있을 만큼 컴퓨팅 파워가 강해졌기 때문이다. CPU와 GPU의 성능이 높아졌고, 메모리의 가격은 낮아졌다. 그렇기 때문에 사람들은 보다 더 많은 크기의 데이터, 즉 빅데이터에 대한 요구가 높아졌고 소프트웨어는 경량 쓰레드를 구현하는 등의 방식으로 이를 따라가고 있다.

또 다른 예로는 클라우드 컴퓨팅도 있다. 클라우드 컴퓨팅에 대한 개념도 붐이 일기 전에 먼저 나왔었다. 그러나 그때 당시에도 이를 구현할 수 있는 하드웨어 성능이 뒷받침 해주지 못해서 클라우드 컴퓨팅 산업이 클 수 없었던 것이다. 그런데 하드웨어 성능이 높아져 클라우드 컴퓨팅이 가능해지니 많은 것이 변했다. 특히 컨테이너 기술이 각광 받았는데, 이는 클라우드 컴퓨팅에 친화적이었기 때문이라고 생각한다. stateless하게 인스턴스를 빠르게 만들어 낼 수 있으며, 개발 환경에 종속적이지 않기 때문이다. 이처럼 소프트웨어 산업은 하드웨어 산업에 의해서 제약을 받는다.

결론

그래서 결론은 이렇다.

  1. 소프트웨어는 수학을 근거로 하여 범용성을 보장 받는다.
  2. 소프트웨어 세계와 실제 세계는 서로 대응된다.
  3. 따라서 실제 세계의 문제를 소프트웨어 세계로 대응시켜 계산(프로그램 실행)을 통해 해결할 수 있다.
  4. 그러나 소프트웨어는 하드웨어 성능이 허락하는 만큼만 문제를 해결할 수 있는 한계가 있다.
  5. 그래서 하드웨어 성능에 의해서 소프트웨어 생태계는 영향을 받는다.

덧붙여 소감을 쓰자면, 아주 오랫동안 머릿속에서 떠도는 이런 생각들을 정리하고 싶었다.
그리고 이렇게 글을 정리해두면 언제든지 내 생각의 방향성을 잡을 수 있으리라 생각했다.
이 글을 통해 앞으로도 계속 정진할 수 있기를!

profile
Try again, Fail again, Fail better

0개의 댓글