Search
Duplicate
🌏

9_2. title: 추상이란 복잡도와 오해가능성 사이의 트레이드오프가 있는 도구이다.

생성
🚀 prev note
🚀 next note
♻️ next note
9_3. title: 추상화, 구체화를 하는 이유는 빠른 내용 전달이다. 추상적인 생각을 그 자체로 받아들이면 안되는 이유는 해석(구체화)의 자유성 때문이다.
3__1.2.2_2.2.1. title: 인지적 종결 욕구가 높은 사람은 추상화 욕구가 높은 사람이다.
9_2_1. title: 문자가 없었어도 세상은 언어와 표현의 추상화 덕분에 인류는 학습하고 발전해나갔을 것이다.
b6__1.2. [info] title: 오르세 박물관 다섯시간 후기와 그에 덧붙여진 많은 미술 이야기들
bc9.3__1. title: TCP 클라이언트와 서버는 소켓이라는 별명을 가진 파일을 생성하고, 해당 파일에 값을 쓰거나 읽는 방식으로 통신한다는 착각하도록 만든다.
b3.4_5.1_1.1___1. title: 벡터와 벡터공간이라는 개념을 보다 복잡한 문제를 푸는 일에 사용하기 위해서는 대수학에서 다루는 벡터공간 개념의 의미를 이해해야 한다. 추상적이고 일반적인 개념은 복잡성을 감춘다. 선형대수학은 벡터공간이라는 추상적인 대수구조를 연구한다.
bb2.2.2. title: 크고 복잡하게 정의된 추상화 수준에 엄청난 삽질을 때려박아 하나의 더 나은 추상화 수준으로 만드는 것도 추상화이고, 크고 복잡하게 정의된 추상화 수준을 작은 단위로 분해하는 것도 추상화이다. 이런 재추상화는 문제를 다시 정의하는 것이다. 문제가 잘 정의되면 패러다임의 변화를 가져온다.
💡 아이디어조각
13 more properties

추상화(일반화) 능력 덕분에 발전한 인간

추상화는 복잡한 개념을 숨겨 간단하게 만드는 특징이 있고, 이러한 특징은 인간이 더욱 고등한 생각을 가능하도록 돕는다. 모든 생명체에는 수명이라는 것이 있다. 인간도 마찬가지다. 그래서 자신 인생의 모든 경험을 그대로 후대에 전달할 수 없다. 선대의 인간이 겪었던 경험을 그대로 100% 온전히 전달해야만 지식이 전수될수 있었다면, 후대의 지식은 선대의 지식과 1:1 대응이 될 뿐이다. 100년동안 겪은 경험을 전수받기 위해 100년동안 설명해야 한다고 생각해 보라. 인간은 여느 동물과 다를 바 없는 삶을 살았을 것이다. 그런데 왜 선대의 시행착오를 받아들이고 더 나은 세상을 구축하는 데 책 한 몇 권이면 충분할까? 내 결론은 추상이다. 인간은 경험을 일반화하거나 중요한 부분만을 추상화한 지식만을 빠르게 전달하면서 문명을 발전시켰다(from1:우리가 무언가에 이름을 부르는 것도 같은 이치이다).
이때 인간이 경험을 문자나 언어라는 매체를 통해 100% 전달하는 것이 아니라, ‘일반화’ 하거나 ‘중요한 부분을 추상화’ 시켜 지식을 전달한다는 성질(to7)귀납과 매우 비슷한 특징을 가진다. 귀납지식을 개척하는 동시에 사실을 숨기는 성질이 있는만큼 추상화된 정보를 기반으로 의사결정을 하거나 추상적인 개념을 바탕으로 사고를 발전시키는 일에는 큰 위험이 따르기도 한다(참고1).
인간이 얼마나 많은 것을 추상적으로 받아들이고 있는지를 잠깐 구체적으로 고민해 보자. ‘도덕성’ 이나 ‘사랑’(to3:사랑이란 무엇인가)이란 구체적으로 무엇인가? 이렇게 구체적으로 이해하기 어려운 단어들조차 사람은 ‘추상적’ 으로 정의하고 그것을 빠르게 공유하고 습득해 버린다. 위 사진 속 교수님의 표현을 빌리면 ‘너무 깊어서 이해하기 어려운 것’ 조차도 추상적인 생각 덕분에 빠르게 이해할 수 있는 것이다.
하지만 이렇게 추상적으로 공유되는 생각에는 문제가 있다. 대부분의 사람이 ‘의미론적 표현’ 으로 이해하고 있다는 ‘도덕’ 이라는 것의 시대주류적 생각 또한 끊임없이 달라져 왔다는 것이 그 증거이다. 모두가 도덕에 대해 고민하지만 도덕이라는 것의 정의는 시간이 흘러가며 계속 변화하고 사람들은 서로 다툰다. 십자군 전쟁은 당시 도덕적이었을 것이고, 마녀 사냥도 당시에는 도덕적인 행위였을 것이고, 오늘날의 자본주의와 양성평등주의도 많은 사람들이 도덕적이라고 합리적이라고 여기고, 몇마디 조언을 잘못 건넨 기성세대가 꼰대라고 불리게 되는 현상도 ‘도덕’ 에 대해서 가지는 관점이 끊임없이 변화한다는 것을 증명한다.

추상화(일반화)된 표현은 이해하기 어렵다는 편견

다시 추상화 논의로 돌아와 보자. 추상화와 비슷한 의미를 가진 단어로 일반화(수학에서 자주 사용함)가 있다. 추상화와 일반화는 지식 확장의 측면에서 약간의 차이가 있곤 하지만 그것이 당장 중요한 논의는 아니다. 추상화된 표현이든 일반화된 표현이든 곧이곧대로 이해하기 어려울 수 있다는 측면에서 매우 비슷하다. ‘철학자들의 물음들이나 명제들은 대부분 우리가 우리의 언어 논리를 이해하지 못하는 데에서 기인한다.’ 따위의 추상화된 표현은 직관적으로 이해하기 어렵다. 수학의 일반식(to6:이상엽이 말한 일반화의 관점)도 마찬가지다. 수학의 일반화 과정을 통해 만들어진 간단한 수식은 해당 일반식을 증명하거나 분해해보지 않은 사람에게 더 이해하기 어려운 모습이 된다(참고3:동은이형의 의견).
고등학교 수학 지식 정도만을 갖춘 친구에게 다항식을 이해시켜야 한다고 생각해 보자. 위와 같이 일반화된 표현을 사용해서 가르칠 것인가? 나는 아니다. ax+b,ax2+bx+c,ax3+bx2+cx+d,...ax+b, ax^2+bx+c, ax^3+bx^2+cx+d, ... 이런게 다항식이란다~ 라고 설명할 것이다. 일반화된 정보보다 일반화가 내포하는 구체적인 사례가 훨씬 직관적이다.

추상화(일반화)한다고 무엇인가가 어려워지지 않아

그렇다고 추상적인 표현이 어려운 표현과 동치라는 것은 아니다(참고13). 애초에 추상화(abstraction)는 몬드리안이 그렸던 나무의 추상화(nonobjective art) 와 같이 '객체(object)가 아닌 분위기(mood)를' 표현하는 과정(참고6), 즉, '더 본질만, 더 특징만 남기려고 하는 과정' 이다(참고5). 테슬라의 수석 엔지니어 안드레 카파시(Andrej Karpathy) 는 이 과정을 ‘증류하는 과정’(distill) 라고 표현했고(참고7), 테슬라의 CEO 일론 머스크(Elon Musk)와 삼성의 회장 이건희는 추상화란 ‘본질에 대해 고민하는 과정’ 이라고 표현했다(참고8). 추상적인 표현이 이해하기 어려운 것은 일부 추상화 과정에서 나타나는 부수적인 현상일 뿐이다.
추상적인 표현도, 구체적인 표현도 무엇이 나쁘다고 할 수 없다. <얼마나 직관적으로 알아듣기 쉬운 표현으로 풀어가면서까지 비전문가들에게 와닿게 만드는 데 집중할 것이냐(구체적), 새로운 각도에서 좋은 표현을 정의하고 표현을 이해하는 전문가 집단 내에서 빠르고 정확한 소통을 할 것이냐(추상적)> 논의의 tradeoff 일 뿐이다.
몬드리안의 나무 추상화
이때 이 '전문가 집단' 이라고 함은, 어떤 추상화된 표현에 대해서 가지고 있는 관념이 매우 높은 유사성을 가지고 있는 집단을 의미한다. 몬드리안의 추상화 <나무> 를 온전히 이해하기 위해서 단순히 창밖의 나무를 쳐다보는 행위는 별 도움이 되지 않는다. 창 밖의 나무를 바라보며 저 나무들의 공통점을 무엇이라고 생각했는지, 내가 지금 바라보고 있는 나무뿐 아니라 온 세상의 나무들의 공통점이 무엇인지, 이것들을 하나의 도화지 안에 그려 넣으려면 어떻게 해야 하는지 먼저 고민해 보자. 그러면 당신도 해당 추상적 표현을 공유하는 ‘전문가 집단’ 이 될 수 있다. 그리고 나서 다시 작품을 바라보면 은은한 감동을 느낄 수 있다. 비슷하게 앞서 살펴 보았던 수학의 일반식을 이해하기 위한 노력을 이미 충분히 거쳤던 ‘전문가 집단’ 은 일반식을 그 자체로 이해할 수 있기 때문에 구체적인 표현을 사용하는 것보다 후렀니 효율적이라고 느낀다(to6).
python 에서 나무를 그려내는 방법
C언어에서 나무를 그려내는 방법
컴퓨터 언어에도 추상화가 일어난다. 책 <컴퓨터 구조와 디자인(Computer Organization and Design MIPS Edition)>은 컴퓨터 설계자가 전기회로를 설계하는 일부터 우리의 삶을 윤택하게 만드는 프로그램이 작성되기까지의 전 과정에서 추상화된 개념을 이용해 많은 사람들이 컴퓨터의 전기 회로까지 이해하지 않고도 복잡한 프로그램을 작성할 수 있는 과정을 설명한다.
어셈블리보다 추상화된(high level) 언어는 C언어, C언어보다 추상화된 언어는 파이썬이라고 알려져 있다. 한편 그 반대 표현은 잘 알려져 있지 않다. 파이썬보다 구체적인(low level) 언어는 C언어, C언어보다 구체적인 언어는 어셈블리다. 이해를 돕기 위해 눈에 보이는 예시들을 가져왔다. 아래 등장하는 코드를 모두 이해할 필요는 전혀 없다. 동일한 기능을 만들기 위해서 어셈블리, C, 파이썬이 얼마나 많이 무섭게 생겼는지, 얼마나 구체적인지, 얼마나 추상적인지만 한번 비교해 보자. 나는 앞서 추상과 소통의 관계를 이야기했다. 과연 프로그래머라는 전문가 집단은 어떤 코드로 의사소통하는 것을 훨씬 선호할지 고민해 보라.
def bubble_sort(arr): for i in range(len(arr) - 1, 0, -1): for j in range(i): if arr[j] > arr[j + 1]: arr[j], arr[j + 1] = arr[j + 1], arr[j]
Python
복사
파이썬 코드 (참고10)
void bubble_sort(int arr[], int count) { int temp; for (int i = 0; i < count; i++) { for (int j = 0; j < count - 1; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } }
C
복사
C 코드 (참고11)
.text .globl main main: la $t1,array li $s1,10 L1: beq $s1,$s2,L2 li $v0,5 syscall sw $v0,0($t1) addi $t1,$t1,4 addi $s2,$s2,1 j L1 li $s1,40 li $s2,0 li $s3,4 L2: beq $s1,$s2,printf add $t1,$t1,$s2 lw $t0,0($t1) #a[i] L3: beq $s3,$s1,incc add $t1,$t1,$s3 lw $t2,0($t1) #a[j] slt $t3,$t0,$t2 beq $t3,$0,swap L4: addi $s3,$s3,4 j L3 swap: sw $t0,0($t1) sub $t1,$t1,$s2 sw $t2,0($t1) j L4 incc: addi $s2,$s2,4 j L2 printf: la $t1,array li $t0,0 li $v0,4 la $a0,print syscall li $s2,0 li $s1,10 L5: beq $s1,$s2,out li $v0,1 lw $t0,0($t1) move $a0,$t0 syscall li $v0,4 la $a0,space syscall addi $s2,$s2,1 addi $t1,$t1,4 j L5 out: li $v0,10 syscall .end .data array: .word 0,0,0,0,0,0,0,0,0,0 print: .asciiz "\nthe sorted array : " space: .asciiz " "
WebAssembly
복사
어셈블리 코드(참고9)
동일한 기능을 수행하는 일임에도 불구하고 코드의 길이 차이가 느껴진다. 몇 줄 정도만 구체적으로 들여다보자. 사람이 ‘종이 A와 종이 B에 적혀 있는 숫자를 바꿔줘~’ 라고 말하는 일과 동일한 작업을 파이썬에서는 A, B = B, A 로 아주 단순하게 표현 가능하다. 위 예제 코드에서는 아래와 같이 드러나 있다.
arr[j], arr[j + 1] = arr[j + 1], arr[j]
C
복사
하지만 C언어는 그렇게 단순하게 표현할 수 없다. C언어에게는 이렇게 명령해야 한다. ‘자, 일단 종이 C를 가져와, 종이 C에다가 A에 적혀 있는 숫자를 옮겨 적어, 그러면 이제 종이 A의 숫자를 지우고 B에 적혀 있는 숫자를 A에 옮겨 적어. 그러면 이제 마지막으로 종이 C에 적혀 있던 숫자를 B에 옮겨 적어’ 라고 명령해야 한다. 위 예제 코드에서는 아래와 같이 드러나 있다.
temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp;
C
복사
어셈블리의 상황은 훨씬 좋지 않다. 여러분은 몰랐겠지만(이것도 훌륭한 추상화 덕분이다), 이세상 모든 컴퓨터의 연산장치들은 동시에 수십개의 값들조차 외우고 있기 어려워한다. 연산장치가 값을 써둘 수 있는 공간에는 s1, s2, s3, t1, t2, t3 … 따위의 이름이 붙어 있다. 이들 하나하나에 직접 접근해 명령해 주어야 한다. 게다가 컴퓨터는 원래 덧셈 뺄셈 수준밖에 못 한다. 모든 기능들을 덧셈과 뺄셈을 이용해 구현해 주어야 하는 것이다. 위 예제 코드에서는 아래와 같이 드러나 있다. 사실 쳐다보기도 싫다.
add $t1,$t1,$s2 lw $t0,0($t1) #a[i] L3: beq $s3,$s1,incc add $t1,$t1,$s3 lw $t2,0($t1) #a[j] slt $t3,$t0,$t2 beq $t3,$0,swap L4: addi $s3,$s3,4 ... swap: sw $t0,0($t1) sub $t1,$t1,$s2 sw $t2,0($t1) j L4
C
복사
우리는 별다른 생각을 않고 컴퓨터에게 ‘두 스케치북에 적힌 숫자를 바꿔 줘!’ 라고 명령하고 싶다. 하지만 이쯤 느낄 수 있겠지만 ‘바꿔 줘!’ 는 굉장히 추상화된 명령이다. 대한민국의 모든 사람은 ‘바꾸다’ 라는 개념에 대해 비슷한 관념을 가지는 ‘전문가 집단’ 인 셈이다. 하지만 C는 그런 관념을 공유하지 않고, 파이썬은 훨씬 더하다. 구체적인 것이 마냥 좋지만은 않은 이유다. 분명히 이번에는 추상적인 것보다 구체적인 것이 어렵다.
내가 나무 1만 그루가 심겨져 있는 숲을 그린다고 쳐 보자. 파이썬이라는 도구로 그림을 그린다면, 몬드리안이 그려 놓았던 나무 그림 중 가장 추상화된 뼈대들을 가지고 세상을 도장찍듯 그려나갈 수 있다. 반면 C언어라는 도구로 그림을 그리는 사람도 있다. 이 사람들은 나무가 어떤 것인가? 에 대한 물음부터 해소해야 할지도 모른다. 한발 더 나가서 어셈블리라는 도구로 그림을 그리는 사람도 있다. 이 사람들은 나무 줄기에 달려 있는 이파리 하나하나를 모두 그려넣고, 줄기의 생김새를 하나하나 모두 정의하고, 줄기들과 이파리들을 하나하나 나무에 붙여서 나무 하나를 정성스럽게 그려내는 일을 해야 할지도 모른다(참고12: 실제로 프로그래밍 자동화 도구 코파일럿의 슬로건은 ‘더 큰 문제를 푸세요' 이다).

추상적인 것들이 가치를 만드는 방향으로

나무 1만그루가 심겨진 숲처럼 거시적인 시스템을 구현해내야 하는 오늘날, 어셈블리와 C를 직접 다루는 사람들이 적은 이유가 여기 있다. 딥러닝과 같이 아주 복잡한 개념들을 다루기 위해 어셈블리나 C 언어가 아닌 파이썬을 사용하는 이유도 비슷한 맥락이라고 해석할 수 있다(참고14). 지식이 복잡해지고 정교해질수록 복잡함을 가려놓고 새로운 차원의 복잡성을 가진 학문을 발전시킬 수 있는 훌륭한 시스템들이 빛을 발한다. 우리는 스마트폰의 회로가 어떻게 생겼는지와 상관없이 화면을 터치하는 행동과 키보드를 두들기는 행동만을 통해 다양한 전자기기들과 매우 쉽게 상호작용한다. HCI, UI, UX 라는 학문의 본질에는 추상화가 있다. “오늘이 가장 과학기술의 발전이 느린 날” 이라고 평가하는 과학자들이 있는 이유도 추상화라고 생각할 수 있다.
어셈블리, C, 파이썬같은 컴퓨터 언어뿐 아니라 코드 그 자체에도 추상화가 일어난다. 예를 들어 ‘파이썬에서 클래스를 작성하는 원칙’ 과 같이 코드로 적절한 추상적 개념을 만들어나가는 패턴들을 소프트웨어공학이라는 학문에서 다룬다. 올바르게 추상화된 프로그램은 복잡한 시스템도 매우 단순하게 처리해낼 수 있게 된다. 이를 보통 클래스 설계라고 부른다. 조금 더 넓게는 소프트웨어 아키텍쳐 설계라고 부른다. 이를 정형화해놓은 틀을 디자인 패턴(‣ Design pattern)이라고 부른다.
20년 전 어셈블리는 컴퓨터전공의 필수과목이었지만 2021년 현재에는 제외된 학교가 대다수인 이유도 여기 있다. 최근 몇년간 컴퓨터공학을 뿌리로 한 다양한 학과들이 나타난다. 우리학교만 해도 데이터사이언스, 인공지능, 지능기계전자공학이라는 이름으로 많이 생겨났다(from2). 몇 년 전까지만 해도 학교에는 컴퓨터공학과밖에 없었다는 사실과 크게 대조되는 모습이다. 더 과거로 몇 년 전까지만 거슬러 올라가도 컴퓨터공학과는 전산학과라고 불렸다.
과거에는 컴퓨터로 할 수 있는 가장 복잡한 일들을 ‘계산하는 일’ 쯤으로 여겼던 것이다. 그렇다면 미래는 어떨까? 미래의 프로그래밍은 인간의 추상에서 일어날지도 모른다. 인간이 ‘A 와 B 에 들어있는 값을 바꾸기’ 라고 말하면 그에 맞는 코드를 만들어낸다거나 하는 것처럼 말이다(참고12). 오늘날 이런 기술들이 속속 등장하며 많은 프로그래머들이 이것이 프로그래머를 대체하네 마네 갑론을박을 벌이지만 생각보다 결과는 자명하다. 추상화의 관점에서, 추상화가 사람 수준까지 올라가려는 노력의 일환으로 보인다(참고15). 당연히 그 기술이 점점 좋아진다면 사람의 추상과 컴퓨터의 추상을 번역해주는 일을 맡았던 전통적인 프로그래머의 수요가 줄어드는 것이다(to9).

추상의 특징을 이해하고 이를 기반으로 빠르게 학습할 것

이렇게 추상을 잘 이용하면, 역사적으로 우리와 우리의 선배들이 그러했듯 원하는 것을 달성하기 위해 최소한으로 공부할 수 있게 된다. 우리가 어떤 지식을 접하면 해당 지식은 필연적으로 추상적인 지식일 수밖에 없다. 우리에게 중요한 것은 바로 이 추상을 대하는 태도이다.
첫째, 우선 해당 추상을 이용하기 위해서는 그 추상적인 표현들을 이해하고 공유하는 ‘전문가 집단’ 에 들어가야 한다. 우리는 가장 빠르게 ‘전문가 집단’ 이 될 방법을 고민하면 된다(to5).
둘째, 추상화는 구체성을 잃어버린다는 특징이 있다. 해당 추상화를 통해 얼마나 많은 것들이 숨겨지고 있는지, 은닉으로 인해 어떤 부분을 오해하도록 만들고 있는 부분이 대충 무엇인지, 내가 얻고자 하는 것을 더욱 잘 해결할 수 있도록 도와주는 훨씬 더 좋은 추상은 없는지, 이 추상 표현으로 얻을 수 있는 이익이 무엇인지(이 추상 표현 위에 쌓여진 학문이 무엇인지)에 대한 정보를 포함하고 있지 않는다. 빨리 배우기 위해서는 이러한 것들을 빠르게 파악할 수 있는 사람이 되어야 한다(참고5).
parse me
1.
지구과학에서 배우는 천구 이야기를 하면 좋겠다. 가상의 구를 도입하면서 생각이 얼마나 단순화됐는지. 실제로는 구는커녕 우주는 팽창하고 별도 움직이고 지구가 도는거지 우주가 도는 것이 아니다. 하지만, 별은 충분히 느리기에 나를 중심으로 일정한 거리의 점들의 집합 위에 있다고 어기면서 순식간에 사고가 단순화됐다.
from
to
2.
3.
8.
10.
supplementary
4.
참고
2.
.
4.
.