Chapter Content
음… 그러니까, 우리가 기술적으로 점점 더 높은 곳으로, 더 멀리, 더 빠르게 나아갈수록, 어… 더 어려운 문제들을 해결하려고 하잖아, 보통. 근데 이렇게 어려움이 증가하는 거랑, 우리가 만드는 것에 조각들이 점점 더 많이 추가되는 거랑은, 이게 같이 간다는 거지. 그러니까, 어려운 상황 안에 존재하는 추가적인 요소들을 설명하려면, 어쩔 수 없이 더 많은 조각들이 필요한 거야.
예를 들어서, 작은 강을 가로지르는 다리를 생각해 봐. 이런 다리는, 뭐, 기본적인 몇 가지 부품만 있으면 되거든? 안전하게 딱 버틸 수 있게. 근데, 강폭이 넓은 다리를 짓기 시작하면, 이야기가 달라지는 거지. 이제, 하중을 제대로 지탱하고 분산시키려면, 기초도 더 많이 필요하고, 기둥도 더 많이 필요하고, 보도 더 많이 필요해. 그리고, 수많은 차량이랑 보행자들이 안전하게 건너다니려면, 더 많은 구획이랑 섹션, 그리고 갑판 재료도 필요한 거고. 또, 열팽창이나 바람, 그리고 지진 활동까지 고려하려면, 추가적인 접합부랑 베어링도 필요하고 말이야.
이게 어려운 문제들의 본질인 거야. 그러니까, 추가적인 조각들을 사용해서 더 많은 요소들을 처리해야 하는 거지. 우리가 역사적으로 만들어 온 해결책들을 보면, 문제의 난이도가 딱 드러나거든. 오늘날 우리가 짓는 것들은, 과거에 만들어진 어떤 것보다 훨씬 더 많은 조각들로 이루어져 있어. 현대 여객기 한 대만 해도, 백만 개가 넘는 부품이 들어간다고. 우리 전력망에는 수백만 개의 연결 지점이 있고. 인공위성들은 복잡한 안테나, 태양 전지 패널, 추진 장치들로 구성되어 있잖아. 자동차들도 이제는 성능, 안전, 편의성을 높이기 위해서 첨단 기술이랑 부품들로 가득 차 있고. 또, 단일 마이크로칩에만 수십억 개의 트랜지스터가 들어 있거든. 그러니까, 어려운 문제일수록 더 많은 조각들이 필요한 거야.
음… 사람들이 보통 생각하기에는, 우리가 만드는 것 안에 디테일이 많아지면, 당연히 그걸 만드는 사람이 더 많이 알아야 한다고 생각하잖아. 그러니까, 오늘날 뭔가를 만드는 사람은, 예전에 만들었던 사람들보다 훨씬 더 많은 걸 알아야 할 것 같잖아. 200년 전 다리 건설자가 필요로 했던 지식이, 오늘날에는 얼마나 더 많이 필요할지 상상해 봐.
근데, 여기서 질문이 생기는 거지. 어떻게 인간은 몇 세대 만에 이렇게 엄청난 발전을 이룰 수 있었을까? 어떻게 그 많은 조각들을 한 사람의 머릿속에 다 담을 수 있을까? 사람들이 그냥 더 똑똑해진 걸까? 아니면, 더 열심히 일하는 걸까? 근데, 그건 아니잖아. 우리 뇌는 5만 년 동안 변하지 않았고, 현대인이 훨씬 더 열심히 일하는 것도 아니잖아. 그럼, 어떻게 우리가 더 똑똑해지거나 더 많은 노력을 들이지 않고도, 이렇게 놀라운 발전을 이룰 수 있는 걸까?
사실, 인간의 지식이 발명품의 복잡성 증가 속도를 따라가지 못했다면, 기술 발전은 절대 일어나지 않았을 거야. 인간이 기술적으로 발전할 수 있는 이유는, 각 세대가 더 발전된 출발점에서 시작하기 때문이야. 오늘날의 세대는 현재 수준의 발전 단계에서 어떻게 작동하는지만 이해하면 되는 거지. 그러니까, 인간의 창의력은 부트스트랩되는 거야. 우리는 이전 세대의 결과물을 다음 세대의 입력으로 사용해서, 발명품을 계속 개선하고 다듬는 거지. 발전은 더 똑똑한 사람이나 더 나은 아이디어 때문이 아니라, 이전의 작업을 새로운 시작에 통합해서 자동적이고 불가피하게 이루어지는 거야. 오늘날의 해결책에 대한 세부 사항을 사용하기 더 쉬운 도구로 포장해야만, 인류가 앞으로 나아갈 수 있는 거지. 따라서, 인간의 발전은 추상화에 대한 이야기인 거야.
자, 소프트웨어 분야에서 지난 50년 동안 일어난 엄청난 개선을 생각해 봐. 이건 더 적은 코드로 똑같은 일을 더 쉽게 할 수 있게 된 이야기거든. 이 모든 건, 가장 힘든 방법, 즉 기계어에서 시작됐어. 기계어는 컴퓨터 하드웨어가 직접 처리하는 이진 명령어들로 구성돼 있어. 로봇에게 미로를 탐색하라고 지시한다고 상상해 봐. "걷다"라든지 "왼쪽으로 돌다" 같은 단어는 사용할 수 없어. 왜냐하면, 그런 정보는 로봇이 사용할 수 없거든. 오직 0과 1로 이루어진 문자열만 가능한 거지.
기계어는 마이크로칩에 가장 가까운 명령어이고, 따라서 가장 낮은 수준의 추상화를 나타내. 가장 낮은 수준의 추상화에서 작업하는 건, 각 명령어가 아주 기본적인 연산만 수행하기 때문에, 주어진 작업에 가장 많은 시간이 걸려. 마치 조립식 부품을 사용하는 대신에, 원자재로 집을 지으려고 하는 거랑 비슷한 거지.
추상화 수준을 한 단계 높이면, 어셈블리 언어가 있어. 어셈블리 언어는 기계어의 사람이 읽을 수 있는 버전이라고 생각할 수 있지. 어셈블리 언어는 인간에게 더 익숙한 기호를 사용해서, 읽기가 더 쉽고, 기계를 지시하는 작업 속도를 높여줘. 어셈블리 언어를 기계어 위에 놓인 인터페이스라고 생각할 수 있는 거지. 이 인터페이스를 사용하면, 프로그래머는 이전 세대가 훨씬 더 오래 걸렸던 일을 더 빠르게 달성할 수 있어. 왜냐하면, 어셈블리 언어에서 레버를 하나 당길 때마다, 기계어에서는 여러 개의 레버가 당겨지기 때문이지.
추상화 사다리를 계속 올라가면, 절차적 프로그래밍이 나와. 이런 언어를 사용하면, 프로그래머는 이름이 지정된 프로시저와 함수를 사용해서 기계에 지시할 수 있어. 이건 미리 포장된 어셈블리 언어 덩어리와 비슷해서, 훨씬 더 높은 수준의 추상화를 가져오는 거지. 어셈블리 언어를 덩어리로 포장함으로써, 프로그래머는 이제 컴퓨터 기능을 재사용 가능한 모듈이라는 관점에서 생각할 수 있게 된 거야. 이제 집 짓는 재료가 부분적으로 조립되어서 나오기 때문에, 집을 더 쉽게 지을 수 있게 된 거지.
소프트웨어를 구축할 때, 더 어려운 문제일수록 더 큰 팀과 더 나은 커뮤니케이션이 필요해. 다양한 요구 사항을 관리하고 개발 프로세스에 통합해야 하거든. 팀은 더 많은 가능성을 탐색하고, 필요한 것을 얻기 위해서 더 많은 프로토타입을 반복해야 해. 이 때문에, 절차적 프로그래밍은 많은 현대 애플리케이션에 너무 복잡해. 그래서, 객체 지향 프로그래밍(OOP)이라는 다음 세대가 등장한 거지. 이 혁신은 절차적 프로그래밍에 존재했던 낮은 수준의 세부 사항을 추상화해서, 데이터와 동작을 훨씬 더 높은 수준의 재사용 가능한 컴포넌트로 캡슐화하는 객체 같은 개념을 도입했어.
OOP를 사용하면, 집 짓는 부품이 훨씬 더 많이 미리 만들어져서 나와. OOP는 인간이 세상을 생각하는 방식에 더 가까운 컴퓨팅 구조를 가져다 줘. 상속, 다형성, 캡슐화 같은 개념을 사용하면, 소프트웨어 제작이 더 높은 수준의 문제가 돼. 조립식 건축 자재가 극단적인 디테일에 얽매이지 않고 주택 건설을 더 전략적이고 창의적인 행위로 만드는 방법을 생각해 봐. 산업 규모에서는 효율성, 품질 관리, 확장성, 지속 가능성을 최적화하는 데 더 집중할 수 있다는 뜻이지. OOP를 사용하면, 어셈블리 언어에서 시작된 기능의 "청킹(chunking)"이 이제 컴퓨터 프로그래밍을 더 빠르고, 컴퓨팅에 관심 있는 사람들이 훨씬 더 쉽게 접근할 수 있도록 만드는 수준의 모듈성과 확장성에 도달한 거야.
근데, 왜 거기서 멈춰야 할까? 사람들은 온라인 쇼핑몰, 소셜 미디어 플랫폼, 온라인 뱅킹 서비스, 학습 및 협업 도구, 여행 및 예약 웹사이트, 게임 시스템, 의료 및 구직 포털, 그리고 다양한 온라인 마켓플레이스 같은 동적인 웹 애플리케이션을 원하잖아. 스크립팅 언어는 여기서 매우 중요해졌어. 대화형 동적 사용자 인터페이스를 개발할 수 있게 해 주거든. 비동기 작업, 이벤트 처리, 브라우저 호환성 같은 문제 때문에, 훨씬 더 추상적인 언어가 등장하게 된 거야. 인간이 기계에 지시하는 방식을 더 간단하고 읽기 쉽게 만들어서, 메모리 관리나 포인터 연산 같은 것들이 추상화되었고, 동적 타이핑, 광범위한 라이브러리, 빠른 개발을 지원하는 대규모 커뮤니티 및 생태계로 대체된 거지. 스크립팅을 사용하면, 아이디어 구상과 실제로 작동하는 소프트웨어 간의 간격이 계속 좁혀졌어.
가장 높은 수준의 추상화는 시각적 인터페이스와 오디오 인터페이스야. 그래픽 사용자 인터페이스(GUI)는 기본 데이터와 기능에 대한 시각적 표현을 제공해서, 기계 상호 작용의 내부 세부 사항을 추상화해. 이제 소프트웨어를 조립하기 위한 드래그 앤 드롭 도구가 있고, 인공지능(AI)이 구축 도구에 통합되면서, 완전히 코드가 없는 개발이 현실이 되고 있어. 장애가 있는 사람들도 이제 음성 명령을 사용해서 코드를 작성할 수 있게 됐어.
오늘날에는 전체 애플리케이션을 몇 주 만에 프로토타입으로 만들 수 있어. 이걸 가능하게 하는 노동 조직은 50년 전과는 매우 달라졌지. 많은 비기술적인 사람들이 오늘날 소프트웨어 제품을 현실로 만드는 데 중요한 역할을 하고 있어. 기술 전문가와 비기술 전문가 간의 경계가 허물어지고 있고, 오늘날 소프트웨어 개발 도구에서 달성된 높은 수준의 추상화 덕분이지.
이건 소프트웨어로 해결할 수 있는 문제의 종류가 이전 세대가 해결할 수 있었던 어떤 것보다 훨씬 더 많다는 걸 의미해. 우리는 이제 이전에는 상상도 할 수 없었던 엄청난 양의 데이터를 분석할 수 있어. 우리는 음성 인식, 이미지 분류, 자연어 처리 같은 작업을 수행하는, 어느 정도의 지능을 보이는 기계를 만들 수 있고. 우리는 이제 첨단 기후 모델을 만들고, 환자 기록을 분석하고 상관관계를 파악하고, 먼 행성을 탐험하고, 우주의 현상을 연구하고, 화상 회의를 통해서 전 세계 사람들을 연결할 수 있어.
일종의 틈새 실험으로 시작했던 것이, 이제는 우리 경제에서 가장 큰 역할을 하는 것으로 여겨지고 있잖아. 소프트웨어는 전례 없는 규모로 협업과 인간 연결성을 가져다줘. 그리고, 이건, 그리고 지금도, 증가하는 수준의 추상화의 힘 덕분에 가능한 거야. 각 세대는 이전 세대보다 더 쉽게 소프트웨어를 조립할 수 있는 수단을 제공받았고, 그건 이전 세대보다 더 어려운 문제를 해결할 수 있다는 걸 의미해. 더 어려운 문제에 투입해야 하는 점점 더 많은 조각들을 관리하고 제어할 수 있다는 걸 의미하는 거지.
추상화는 세부 사항을 제거하는 게 아니라, 더 적은 레버를 사용해서 많은 조각을 작동할 수 있도록 해 주는 더 높은 수준의 구조로 통합하는 거야. 추상화는 발전을 불가피하게 만들어. 왜냐하면, 세부 사항을 패키징하고 인터페이스를 만들어서 인간의 창의력을 앞으로 밀어주거든. 그 인터페이스는 다음 세대를 위한 출발점인 거지.
우리가 주변을 둘러보고 고층 빌딩, 인공위성, 슈퍼컴퓨터, 고속 열차, 원자력 발전소, 스마트폰, 컴퓨터, 생체 의학 임플란트를 볼 때, 인간이 어떻게 그렇게 겉보기에 정교한 것들을 만들어 낼 수 있었는지 상상하기 어려워. 인간이 만든 물건들의 내부 작동 방식은 매우 자세하고, 복잡한 조정과 타이밍이 필요하고, 모든 걸 고려해 보면, 꽤나 신뢰할 만하잖아. 하지만, 각 세대가 이전 세대를 출발점으로 사용하기만 하면 된다는 걸 깨닫게 되면, 발전이 어떻게 일어나는지 분명해지는 거지. 한 세대 내의 건축가들은 모든 것이 어떻게 작동하는지 알 필요가 없고, 그들은 현재 수준의 추상화만 이해하면 되는 거야.
이건 사물의 내부 작동 방식에 대한 엄청난 양의 지식이 오늘날 살아 있는 사람 중 누구에게도 없다는 걸 의미해. 그러한 지식은 각 세대가 자신의 창조물에 추가하는 점점 더 높아지는 추상화 수준에 의해서 가려져 왔어. 이건 인간 혁신의 모든 영역에 해당되는 이야기지. 오늘날의 인간은 우리 조상보다 더 똑똑하지 않아. 우리는 더 열심히 일하지도 않아. 우리는 심지어 그렇게 많은 것을 알지도 못해. 인간의 발전은 증가된 추상화와 부트스트랩된 발전의 지속적인 이야기로 가장 잘 이해될 수 있어.
추상화는 보통 인지적인 맥락에서 생각하잖아. 인간은 특정한 예의 사용과 분류에서 파생된 높은 수준의 개념을 만들어내잖아. 구체적인 것들을 하나의 범주로 결합하기로 선택함으로써, 우리는 추상화를 구현하는 거지. 모든 견종이 "개"라는 범주에 속한다고 말하는 건, 개라는 추상화를 만드는 거야. 추상화를 그린다는 건, 인상을 만들어내는 데 필요한, 상세하지 않은 부분만을 구상하는 거고. 정신 속의 추상화는, 인간이 삶의 세부 사항을 헤쳐나가기 위해서 필요한 인지적 부담을 낮춤으로써, 복잡한 환경을 이해하고 탐색하는 방법인 거지.
어떤 사람들은 추상화가 순전히 정보적인 현상이라고 생각할 수도 있어. 결국, 각 세대의 컴퓨터 프로그래머들이 가져온 더 높은 수준의 구조는, 정보 덩어리고, 정보적인 수준에서 상호 작용하잖아. 프로그래밍에서 모듈을 만드는 것은, 인간 언어에서 "개"라는 범주를 만드는 것과 비슷하잖아. 그것은 소프트웨어 내부의 엄청난 수의 세부 사항을 휘두르는 데 필요한 인지적 부담을 낮추는 활동이고.
하지만 추상화는 물리적일 수도 있어. 집 짓기 비유는 단순한 비유가 아니었어. 더 큰 사전 제작된 조각들을 출발점으로 사용하면, 추상화를 가지고 작업하는 거거든. 정신이 특정한 것들을 하나의 범주로 결합할 수 있는 것처럼, 물리적인 세부 사항도 더 높은 수준에서 단일 기능을 수행하기 위해서 결합될 수 있거든.
우리는 인간이 사물을 어떻게 사용 가능하게 만드는지를 보면, 물리적 추상화를 이해할 수 있어. 누구도 돌도끼를 휘두르는 동안 날을 손잡이에 대고 잡아야 한다면, 돌도끼를 사용하지 않았을 거야. 사용된 끈은 날과 손잡이를 하나의 물체로 결합해서, 사용자가 부착을 고려할 필요성을 없애주는 거지. 사물은 작동하는 데 필요한 노력이 각 부분을 수동으로 조정해야 하는 경우보다 적을 때만 사용할 수 있어.
자동차를 생각해 봐. 운전자가 내연 기관, 섀시, 변속기의 모든 내부 작동 방식을 수동으로 조정해야 한다면, 아무도 차를 운전할 수 없을 거야. 운전자에게 제공되는 인터페이스는 기계의 내부 작동 방식보다 훨씬 적은 세부 사항을 가지고 있어. 수동 변속기의 스틱 시프트조차도 물리적 추상화야. 그것은 모든 추상화가 하는 일을 달성하거든. 즉, 작업을 완료하기 위해서 당겨야 하는 레버의 수를 줄여주는 인터페이스를 제공하는 거지. 스틱 시프트를 사용하면, 운전자는 레버와 클러치만 움직여서 원하는 기어를 선택할 수 있어서, 기어박스 내의 각 기어를 물리적으로 연결할 필요가 없어지는 거지. 명확하게 표시된 기어 위치는 인터페이스이고, 운전자가 일련의 내부 세부 사항을 탐색할 필요 없이 선택할 수 있도록 해 주는 인터페이스인 거야. 물론, 자동 변속기는 물리적 추상화를 다음 단계로 끌어올려서, 내부 작동 방식을 거의 고려하지 않고 기어를 작동할 수 있게 해 주지.
마치 우리가 서로 다른 것들을 정신적으로 결합해서 단일 범주로 만드는 것처럼, 스틱 시프트는 내부 물리적 세부 사항 세트를 포함하는 단일 물리적 구조를 나타내고, 자동 변속기는 (다음 세대 덕분에) 이걸 훨씬 더 높이 끌어올리는 거야. 인간의 창의력과 함께하는 물리적 추상화 버전은 인간 발전의 중요한 부분인 거지.
특정 산업이나 직업 내에서 구현되는 일련의 모범 사례는, 우리가 만드는 물리적 추상화를 중심으로 구성되어 있어. MRI 기사는 자화, RF 펄스 여기, 신호 감지, 데이터 획득, 이미지 재구성을 조정하지 않잖아. 바리스타는 수동으로 물을 데우거나, 압력을 가하거나, 콩을 갈거나, 풍미를 추출하거나, 증기를 생성하지 않지. 아스팔트 포장 기사는 돌, 자갈, 모래를 조달하거나, 바인더를 실험하지 않아. 어떤 분야의 전문가든, 물리적 추상화를 통해서 이전에 작업된 세부 사항 수준 위에서 작업을 하고 있어. 이건 지식과 기술에 대한 우리의 개념이 물리적 추상화와 완전히 일치한다는 걸 의미해. 왜냐하면, 그것들이 사람들이 자신의 분야에서 시스템을 작동하기 위해서 사용하는 출발점이기 때문이지.
인간의 모든 발전은 이전 세대보다 더 많은 지식이나 노력을 필요로 하지 않고 인류를 발전시키는 이야기야. 하지만, 그러한 발전이 자동적이고 불가피한 만큼, 인터페이스를 만드는 데는 신중한 생각이 필요해. 물리적 추상화를 만드는 건 신중한 고려를 요구하는 의도적인 행위거든. 인간이 만든 물리적 추상화는 역사적으로 설계에 의해서 가능해졌어.
물리적 추상화를 만드는 가장 분명한 방법은 설계를 통해서야. 우리는 어떤 조각을 포함할지, 어떻게 연결할지, 기본 기능을 인터페이스를 통해서 어떻게 노출할지에 대해서 의식적인 결정을 내릴 수 있잖아. 컴퓨팅 예에서, 절차적 프로그래밍은 기계어 조각을 더 높은 수준의 구문과 의미론으로 묶는 방법에 대한 신중한 결정을 내림으로써 생겨났잖아. 이걸 위해서는 계산된 추론이 필요해. 현재 추상화 수준의 내부로 들어가서, 그 조각들을 어떻게 연결하고 더 높은 수준으로 노출할지 결정해야 하는 거지. 설계는 객체의 내부 작동 방식을 패키징해서 물리적 추상화를 만들어내. 이것은 서로 다른 기능들을 더 높은 수준의 단일 구조로 그룹화하는 거지. 시스템 내부의 서로 다른 기능들을 외부에서 더 쉽게 조정할 수 있도록 해 주는 건 바로 이 번들링이야.
이건 추상화의 정보 버전과 물리 버전이 깊이 연결되어 있다는 걸 보여주지. 설계에 사용되는 신중한 추론은, 우리에게 서로 다른 것들의 일부 그룹의 공유 특성을 알아차리게 하잖아. 스틱 시프트는 공통된 목적을 공유하는 일련의 하위 수준 내부 조각에 연결되기 때문에 작동하는 거잖아. 그러한 물리적 구조는 패턴을 알아차리고 그 패턴을 더 높은 수준의 형태로 그룹화하는 우리의 정신적 능력을 사용해서 달성되었지. 물리적 추상화는 우리가 마음으로 만드는 의식적인 추상화의 반영인 거야.
우리는 인간이 추상화를 통해서 기술 발전을 이루고, 추상화가 설계를 통해서 실현될 수 있다는 걸 알 수 있어. 이것이 설계를 역사적 발전의 핵심 부분으로 만들었지. 하지만 설계에는 비용이 따르는데, 시스템의 내부 조각들이 서로 어떻게 부딪히는지 목격하지 않고는 설계할 수 없기 때문이야.
설계는 결정론에 달려 있다
설계한다는 것은 하위 수준과 상위 수준의 추상화 간에 이루어진 명시적 연결에 대해서 추론하는 거야. 이것이 바로 설계가 결정론에 의존하는 이유이지. 설계는 시스템의 출력이 어떻게 생성되는지 결정론적인 의미에서 평가할 수 있을 때만 작동하거든. 서로 다른 기어가 서로에게 어떤 영향을 미치는지 볼 수 없다면, 변속기의 내부 작동 방식을 더 높은 수준의 스틱 시프트로 묶을 수 없고. C 언어가 어떻게 명시적으로 작동하는지 볼 수 없다면, C 언어를 C++ 모듈로 묶을 수 없는 것과 같은 거지. 이것이 설계에 대한 전체 정당성의 근거가 되는 거야. 각 내부 조각이 상호 작용해서 출력을 생성하는 방법을 추론할 수 없다면, 우리의 설계는 추측과 억측에 지나지 않을 거야.
어떤 사람들은 설계가 실제로 높은 수준일 수도 있다고 제안하고 싶어할 수도 있어. 설계는 노력을 긍정적인 방향으로 유도하는 데 도움이 되는 일반적인 지침 세트가 될 수 없나? 이것은 설계를 엄격한 의미의 결정론과 단절시키지 않겠어? 하지만 그것은 설계가 아니라 방법론이나 프레임워크야. 프레임워크는 사람들이 특정 목표를 달성하기 위한 궤도를 유지하는 데 도움이 되는 포괄적인 원칙이지. 그러한 것들은 시스템에 손을 뻗어서 내부를 추론하지 않아. 설계한다는 것은 서로 다른 요소가 어떻게 상호 작용하고 관련되는지에 대한 의도적인 선택을 하는 거야. 설계는 결정론적 지식이라는 전제에 완전히 의존하는 거지.
결정론은 입력과 작동 규칙에 기반해서 동작을 완전히 예측할 수 있는 시스템이나 프로세스와 관련이 있어. 동일한 초기 입력을 결정론적 시스템에 반복해서 제공하면, 항상 동일한 출력을 생성하잖아. 반복 가능성, 예측 가능성, 무작위성의 부재라는 개념이 설계 개념에 내재되어 있는 거지. 설계는 입력에서 출력으로 흐르는 일련의 명시적인 단계가 있다는 가정하에 작동해. 그렇지 않다면, 특정 조각과 연결을 선택하는 것은 무의미할 거야.
결정론적 시스템과 비결정론적 시스템/프로세스를 다시 한번 구별하는 것이 중요해. 비결정론적 시스템은 동작을 완전히 예측할 수 없는 시스템이야. 주어진 입력 세트에 대해서 매번 동일한 출력을 생성하는 결정론적 시스템과 달리, 비결정론적 시스템은 동일한 입력과 초기 조건이 제공되더라도 다른 동작이나 결과를 생성할 것으로 예상될 수 있어. 동일한 속도로 운전하고 정지 표지판이나 신호등이 없는 교차로에 도착하는 동일한 자동차와 운전자 세트는 순전히 예측 가능한 교통 흐름을 생성하지 않을 거야. 차량의 움직임과 흐름 순서에는 큰 변화가 있을 수 있지. 동일한 입력을 제공받았음에도 불구하고 다른 결과를 생성하는 시스템은 설계할 수 없어.
일부 독자들은 여기서 멈춰서 앞의 예가 틀렸다고 주장할 수도 있어. 왜냐하면 우리는 교통 시스템이 실제로 설계될 수 있고, 그것들이 분명히 교통 흐름에 예측 가능한 동작을 추가한다는 것을 알고 있잖아. 하지만 이건 교통 자체를 설계하는 게 아니라, 비결정론적 시스템(교통)을 통제하는 외부 프레임워크를 설계하는 거야. 현재 교통 시스템은 차량 간의 특정 상호 작용을 제어하려고 시도하지 않고, 모든 차량에 적용되는 외부적인 제한을 둘 뿐이거든. 이건 정부가 자유 시장을 규제하는 프레임워크를 만드는 것과 비슷해. 자동차 간 또는 고객과 판매자 간의 특정 상호 작용을 지시하는 것과 같이, 시스템 자체를 설계하려는 시도는 비결정론적 시스템의 기능에 간섭할 것으로 예상할 수 있어.
결정론은 어려운 문제를 해결할 수 없다
비결정론은 문제의 난이도와 직접적인 관련이 있어. 비결정론적 시스템을 (내부적으로) 설계할 수 없는 것처럼, 어려운 문제는 결정론에 의해서 해결될 수 없거든. 어려운 문제는 4장에서 보겠지만, 시행착오와 휴리스틱을 필요로 하는 문제야. 서론에서 언급했듯이, 어려운 문제는 단순한 문제에 비해서 더 어려운 것이 아니라, 매우 다른 종류의 해결책을 요구하는 범주적으로 구별되는 상황이야.
자연을 보면 어려운 문제를 해결하기 위해서 해결책이 얼마나 달라야 하는지 알 수 있어. 이미 말했듯이, 자연의 해결책은 가장 어려운 문제를 해결하거든. 이러한 자연적으로 어려운 문제는 자연 환경에 의해서 제시되고, 결정론적으로 연결된 조각들의 단순한 조합을 사용해서 입력을 출력으로 변환하지 않는 객체에 의해서 해결돼. 자연은 창발적 구조의 실현을 통해서 문제를 해결해. 이건 자연이 입력과 출력 사이에 잘 정의된 단계가 있는 해결책을 만들지 않는다는 걸 의미하지. 그러한 구조는 자연의 상황을 정의하는 수많은 요소와 상호 작용으로 만들어져 있기 때문에, 자연적으로 어려운 문제를 해결할 수 없어. 자연의 복잡성을 설명하기 위해서 충분한 규칙을 수집하는 문제가 아니라, 사실 그건 규칙의 게임이 아니거든. 가능한 모든 우발 상황에 대한 규칙을 가진 물체를 만들 수 있더라도, 어려운 문제를 해결하는 데 실패할 거야.
어려운 문제를 마치 규칙 기반 시스템의 더 어려운 버전인 것처럼 생각하는 것은, 양자 역학을 고전 역학을 사용해서 설명하려고 하는 것과 비슷해. 양자 영역은 근본적으로 고전적이지 않기 때문에, 고전적인 설명은 실제로 일어나고 있는 일에 근접하지도 못해. 정도나 근사의 문제가 아니라, 완전히 다른 것이라는 문제인 거지.
자연의 해결책은 진정한 복잡성을 내포하고 있어서, 그 출력은 합산된 상호 작용이나 순차적 절차의 산물이 아니야. 자연은 규칙 기반 처리와는 완전히 다른 방식으로 필요한 출력을 생성하는 물질 구성을 만들어내. 우리는 이 다른 메커니즘에 대해서 나중에 살펴볼 거지만, 지금은 자연의 해결책이 인간이 만들어내는 단순한 시스템과는 근본적으로 다르다는 걸 인식하는 것이 중요해. 자연의 해결책은 비결정론이 많을 뿐만 아니라, 그렇게 기능하기 위해서도 비결정론이 필요해.
인간과 고급 AI 시스템이 자연스럽게 수행하는 안면 인식을 생각해 봐. 안면 인식을 어려운 문제로 만드는 것은 현상과 관련된 엄청난 수의 요소 때문일 뿐만 아니라, "해결"이라는 단어 자체가 우리의 일반적인 결정론적 프레임워크와는 다른 의미를 갖기 때문이야. 결정론에서는 해결한다는 것이 수학에서와 마찬가지로, 특정하고 결정적인 답 또는 답 세트를 찾는다는 의미야. 하지만 비결정론적 시스템은 어느 정도의 정확성을 가진 확률론적 답이라는 개념과 더 유사하고, 결정론에서 보는 것보다 더 부드러운 버전이지.
하지만 이 부드러움 비유는 비결정론의 정신에 더 가깝지만, 여전히 비결정론을 결정론적 시스템에서 보는 것의 대략적인 버전으로 프레임하고 있어. 예를 들어서, 계산적으로 어려운 문제에 대한 해결책을 찾으려고 하는 대부분의 계산적 접근 방식은 특정 기준이나 목표를 충족하는 만족스럽거나 수용 가능한 결과를 찾기 위해서 최적화와 같은 기술을 사용하잖아. 하지만 나중에 주장하겠지만, 비결정론이 결정론의 2류 또는 대략적인 버전이라는 생각은 정확하지 않아.
복잡성 하에서 일어나는 해결은 더 약하거나 더 대략적인 해결책이 아니라, 완전히 다른 유형의 해결책인 거야. 게다가 복잡성 하에서 발견되는 해결책의 유형은 정확하고 결정론적인 해결책이 될 수 있는 것보다 훨씬 더 강력하고 현실적이야. 근사라는 개념 자체는 단순성의 렌즈를 통해서 복잡한 것들을 부정확하게 생각하는 또 다른 부산물일 뿐이지. 어려운 문제에 대한 진정한 해결책은 근사하지 않고, 근본적으로 다른 컴퓨팅 개념을 사용해서 필요한 답을 직접 계산하는 거야. 수학적 계산을 실행하는 것과 실제 문제를 해결하는 것 사이의 심각한 구별은 나중에 설명될 거야.
복잡성의 핵심에 있는 인과 메커니즘의 부족은 설계가 복잡성을 다루기 쉽게 만드는 종류의 해결책을 만들어낼 수 있는 가능성을 배제해. 사용자에게 결정론적으로 연결된 인터페이스를 노출하기 위해서 만들 수 있는 번들이 없어. 결정론에 대한 설계의 의존성은 설계가 범주적으로 단순한 문제에 대한 해결책만 찾을 수 있다는 것을 의미해.
이것은 우리에게 사물을 건설해서 문제를 해결하는 역사적 접근 방식에 의해서 제기된 중요한 갈림길로 이끌어. 1) 우리는 발전을 위해서 물리적 추상화를 만들어야 하고, 2) 물리적 추상화의 창조는 항상 설계에 의해서 이루어졌고, 3) 설계는 어려운 문제를 해결할 수 없고, 4) 어려운 문제는 우리가 이제 사물을 건설해서 해결해야 하는 것이거든.
우리가 물리적 추상화를 만드는 현재의 방식은 곧 끝날 거야. 설계는 우리가 해결책을 만들기 위해서 건설해야 하는 것을 만들어낼 수 없어. 우리가 지금 직면한 상황의 본질적인 복잡성은 설계가 제공할 수 없는 것을 요구하거든. 우리는 조각과 연결에 대해서 추론할 수 없어. 왜냐하면 자연의 해결책이 문제를 해결하는 메커니즘은 본질적으로 다르기 때문이지.
자연을 마치 결정론적 기계인 것처럼 이야기하는 것은 항상 일종의 잘못된 구체성이었어. 때로는 세상을 보는 순진한 방식일 뿐이지만, 다른 때에는 이러한 위반이 사회와 정치에서 위험하게 나타나거든. 하지만 이제 자연이 규칙 기반 기계와 비슷하다는 개념은 발전을 직접적으로 저해하고 있어. 사물을 건설한다는 것이 무엇을 의미하는지 극적으로 재구성해야만 미래가 다루기 쉬워질 거야.
문제 클래스의 근본적인 변화와 그것들을 해결하는 데 필요한 해결책은 복잡성의 시대에 효과적으로 작동하는 데 필요한 철학적 변화를 뒷받침해. 문제는 인과 관계에 대한 이해의 저하를 단순히 받아들이는 것이 아니라, 지식, 기술, 인간 혁신에 대한 우리의 접근 방식에 대한 개념을 재정의하는 거야. 우리는 다르게 건설해야 해.
추상화는 발전에 필요하다
설계를 통해서 발전을 계속할 수 없다는 사실이 추상화가 발전에 필요하다는 사실을 부정하지는 않아. 더 어려운 문제는 단순히 더 많은 조각을 연결해서 다른 물체를 만드는 것만으로는 해결할 수 없어. 다음 세대가 사용할 수 있도록 조각을 더 높은 수준의 구조로 묶어야 해. 이것이 많은 수의 조각이 더 복잡한 물체에 올바르게 배치되는 방법이야. 수천 개 또는 수백만 개의 조각을 개별적으로, 신중하게, 올바른 조정으로 배열하는 것은 계산적으로 너무 부담스러워. 하위 수준의 조각은 한 수준 더 높은 문제를 해결하는 데 필요한 정보 응집력을 찾아야 하고, 추상화는 이 응집력이 달성되는 방법인 거지.
이건 어떤 개념의 발전에도 해당되는 이야기야. 인간의 정신이 세상을 이해하기 위해서 추상화를 만드는 방법을 생각해 봐. 우리는 우리가 보고 듣는 것을 더 높은 수준의 개체에 배치하지 않고는 삶을 헤쳐나갈 수 없어. 위협 대 기회, 친구 대 적, 음식, 위험, 피난처 등으로 사물을 분류할 수 없다면, 우리는 생존할 수 없을 거야. 정신 속에서 정신적 추상화를 만들어서, 피상적으로 다른 것들을 단일 범주로 포섭함으로써, 우리는 삶을 헤쳐나가는 데 필요한 인지적 부담을 극적으로 낮추는 거지.
서로 다른 것들 사이의 연결을 찾는 이 능력은 우리의 모든 혁신으로 확장돼. 새로운 철학에서 새로운 기술에 이르기까지, 모든 것은 우리가 정보와 물리적 사물을 새로운 개체로 묶을 수 있기 때문에 생겨나. 추상화는 어려운 문제를 계산적으로 실현 가능하게 만들어. 왜냐하면 추상화는 문제의 세부 사항과 해결책의 절차 간에 일대일 대응이 필요 없이 계산하는 새로운 정보 및 물리적 구조를 생성하는 것이기 때문이지. 추상화는 더 어려운 과제 내부의 수많은 요소에 필요한 내부 조정을 조각들이 처리할 수 있도록 사물을 배열하는 거야. 요컨대, 추상화 없이는 발전이 없어.
이건 인간에게 해당되는 만큼 자연에도 해당되는 이야기야. 자연은 시간이 지남에 따른 변화와 발전 과정을 통해서 발전해. 자연의 해결책은 끊임없이 변화하는 환경 스트레스 요인에 대항해서 문제를 해결해. 우리가 한 걸음 물러서서 인간 혁신 전체를 살펴보면, 이건 인간이 문제를 해결하기 위해서 대규모로 상호 작용하는 유기체이기 때문에 자연에 의해서 해결되는 문제이거든. 하지만 우리의 특정 발명품에 관해서는, 인간은 이미 논의된 것처럼 설계를 통해서 새로운 추상화를 만들어내. 함께 배치되는 조각은 이러한 조각이 상호 작용하는 방식에 대한 인과 정보를 사용해서 신중하게 수행돼. 이건 자연이 추상화를 만드는 방식일 수 없어. 자연은 조각을 더 높은 수준의 구조로 묶기 위해서 의식적인 추론을 사용하지 않아. 그렇지만 자연은 인간이 다리와 로켓 엔진으로 해결하는 것보다 훨씬 더 어려운 문제를 해결하잖아.
이건 중요한 질문을 제기해. 추상화를 통한 발전이 더 어려운 문제를 해결하기 위해서 진화하는 모든 시스템에 내재된 보편적인 속성이라면, 자연은 어떻게 추상화를 만드는 걸까?
물리적 추상화는 두 경우 모두 여전히 기능을 더 높은 수준의 그룹으로 묶고 인터페이스를 노출하는 것이지만, 자연의 번들은 결정론적으로 설계된 집계가 아니라, 물질의 통계적으로 자동적인 발현이야. 이 모든 것이 너무 막연하게 들린다면, 이 책의 나머지 부분에서 내가 의미하는 바를 설명할 테니 안심해도 좋아. 하지만 이 시점에서 중요한 것은, 자연의 물리적 추상화는 발전에는 중요하지만 설계되지 않았다는 것을 인정하는 거야. 어떤 조각과 상호 작용이 번들을 구성하는지 선택하려는 자연의 의식적인 노력은 없으므로, 자연의 추상화는 근본적으로 다른 메커니즘을 가져야만 해.
이것은 다음과 같은 질문을 제기해. 자연은 어떤 조각을 포함해야 하는지, 어떻게 연결해야 하는지에 대해서 추론할 수 없다면, 어떤 조각을 더 높은 수준의 구조로 결합해야 하는지 어떻게 "알까"? 자연은 어떻게 번들을 만들까? 자연 선택이라는 무심한 과정은 다음 수준의 물질을 위해서 한 수준의 물질을 연결하는 유사점을 어떻게 발견할 수 있을까?