AUSG / QCS-Books

Quick Circle Study - Books
MIT License
8 stars 0 forks source link

[Book Reviews] 2019 09 26, 고명진 - CODE(2014, 개정판) #1

Open rayleighko opened 5 years ago

rayleighko commented 5 years ago

Read this book from: 2019 09 16 to 10 14

Short reviews: 작년에 읽으려 했다가 중도포기를 하고 이번 기회를 통해 다시 읽어보려 이 책은 제안했습니다. 제 첫 주 리뷰는 당시 중도포기했던 14장까지를 다시 읽으며 정리한 내용을 토대로 작성되어있으니 참고하시기 바랍니다.

챕터 별 리뷰

Chapter 0. 들어가기 전에

나는 보통 어떠한 책을 읽을 때, 서문을 읽는다. 서문에는 책이 쓰여지는동안 느낀 저자의 고민과 최종적으로 이 책이 말하고자 하는 의도가 드러나있기 때문이다. 이번에도 마찬가지로 서문을 통해 저자가 이 책을 통해 전하고자 하는 가치가 무엇인지를 파악할 수 있었다.

보편적으로 컴퓨터 혹은 그와 관련된 이론을 공부하면 '동작원리'에 대해 궁금해 하기 마련이다. 어떻게 우리가 작성하는 코드가 차가운 기계 부품 속에서 살아 움직일까? 지금까지 이런 고민이 들 때면 '재미없어' 혹은 '지금 이게 중요한 게 아니지' 등과 더불어 '너무 로우해서 더 깊은 고민은 당장 내가 구현하는 로직에 도움이 안될 거야'라고 생각하며 넘어가기 일쑤였다.

그러던 중 만난 이 책은 지금까지 읽었던 지루하면서도 당연한 '컴퓨터는 어떻게 동작하는 거지?'에 대한 개론적인 이야기와는 조금 색다른 방식으로 문제에 접근한다.

서두에서 '컴퓨터는 어떤 방식으로 동작하는 거지?'라는 질문으로 시작해 그 질문에 대한 답을 가벼운 사례 혹은 예시를 통해 소개한다(물론 그럼에도 후반부로 갈 수록 지루해지는 건 사실이지만 이번 기회를 통해 이 지루함을 극복해 컴퓨터에 대한 내공을 쌓아보도록 하자).

Chapter 1. 친구들과의 대화

1장은 일반적으로 생각하는 'CODE'의 개념을 달리 볼 기회를 제공해준다. 일반적으로 CODE라 하면 컴퓨터(컴파일러)가 이해할 수 있는 언어(Language)로 된 문장이나 글이라고 생각할 수 있다. 그러나 이장에서 말하는 CODE는 그것보다 더 원초적인 CODE이다. 가령 Morse부호와 점자와 같은 것처럼 말이다. 또한 이러한 CODE가 만들어지게 된 배경에 대해서 가벼운 주제로 이야기해 재미있게 읽을 수 있었다.

Chapter 2. 부호와 조합

일반적으로 우리가 생각하는 Morse 부호에 관해 이야기하며 흔히 2진수라 부르는 체계가 어떻게 확립되었는지에 대해 언급한다. 이장을 읽으니 "아, 이러한 환경에서 발달한 시스템이기에 2진수가 되었구나"라고 생각할 수 있었다(만약 한국에서 발전했다면 다른 방식으로 발전했겠다고 생각하게 되었다).

Chapter 3. 점자와 이진 부호

Morse 부호가 생기기 이전, 현재는 흔히 알고 있는 '점자'가 확립된 과정을 하나의 이야기를 통해 설명한다. 앞선 장의 주제에서 파생하여 6개의 점으로 표현되는 점자가 2의 6승 즉, 64개만큼의 경우의 수를 지니고 있고, 현재 우리가 컴퓨터에서 사용하는 8bit 체계가 이런 형식에서 발전되었다는 것을 알게 되었다.

Chapter 4. 전등을 분해해 봅시다

다른 장들에 비교해 시간이 조금 걸렸던 장이다. '전자의 이동'에 대해서 기본적인 지식이 없다 보니 생각하면서 읽을 때 조금 어려웠기 때문이다. 그래도 작가와 옮긴이가 쉽게 풀어 설명하였기에 불편하지 않게 넘어갔다.

손전등을 만드는 데 필요한 전자적 요소인 전지, 전선, 전구, Switch에 관해 설명하고, 역할을 소개했다(개인적으로 이장에서 중요하다고 생각된 것은 'Switch'였는데 1장으로만 설명한 것이 아쉬웠다).

Chapter 5. 다른 방법을 찾아봅시다

저자는 예를 들어서 나와 친구의 집 사이에 전등을 설치하고 내 집에서 신호를 보내면 친구의 집 전등에 불이 들어올 수 있게 하는 과정을 설명했다. 그래서 이 과정을 함께 따라가며 쉽게 전기가 고안되는 것은 원초적인 본능일 수 있었을 것으로 생각하게 되었다.

이장의 특이점은 'ground'라는 개념에 대한 생각이 바뀌었다는 것이다. '지표면 = 저항이 많다'는 내 생각이 '지표면 = 최고의 전열체'로 바뀌었기 때문이다(컴퓨터를 구성할 때의 ground는 저항이 가장 높은 곳이고, 그렇기 때문에 전기의 흐름이 항상 ground로 간다고 배웠기 때문이다).

또한 거리의 한계로 인해 이를 해결하기 위한 전신의 발명이 대단하다고 느끼기도 했다(전신에 대해서는 다음 장에서 살펴보자).

Chapter 6. 전신과 릴레이

들어가기에 앞서 전신은 새뮤얼 Morse, 그러니까 우리가 흔히 알고 있는 Morse부호를 만든 그분께서 만든 장거리 통신 장치이다. 드디어 6장에 들어와서 장거리 전기 신호 전송의 개념이 생긴 것이다!

이 부분에서 Morse는 전신을 만들기 위해 1832년부터 1836년까지 4년간 발명을, 1843년 의회를 설득해서 처음으로 공공기관에 전신 장치를 선보였다는 점에서 약 10년 동안 출시가 되지 않았다는 점에서 다시금 위대한 발명이라는 것을 깨달았다. 간단하다고 생각한 전신의 발명이 10년간의 노고 끝에 탄생했다는 것을 말이다.

이장에서는 '전구를 사용했을까?' 하는 생각을 잠깐 했지만, 책에서는 친절하게 전구는 1879년에 발명되었다고 전한다. 그래서 Morse는 전구를 사용하지 못하고, 전자기를 이용하기로 한다. 일반 철에 전기를 통하게 하는 방식으로 말이다.

이제 쌍방향 통신이 가능해졌다. 여기서 등장하는 개념이 '릴레이'다. 전선 길이가 길어짐에 따라 저항도 증가하기에 중간에 중계국을 두어 이를 해결하는데 거기서 사용되는 것이 릴레이가 되는 것이다.

이 점에서 드디어 대륙 내에서의 통신이 가능하게 되었다. 여기까지의 감상은 통신의 발전에 대해서 "당연히 이런 식으로 발전하는구나"라고 말하고 싶다. "과학자들은 어떻게 이런 생각을 하지?"라는 생각이 이제는 이해되는 것이다.

Chapter 7. 우리가 사용하는 열 개의 숫자들

이장에서는 우리가 어떻게 10진수라는 숫자 체계를 사용하게 되었는지 일목요연하게 설명한다. 여기서 새롭게 안 사실은 로마의 수 체계가 우리가 흔히 알고 있는 Alphabet(I=1, V=5, X=10, L=50, C=100, D=500, M=1000)으로 구성되어 있고, 우리가 흔히 알고 있는 '수 체계'가 정의된 배경이었다.

또한, 컴퓨터에서 사용되는 2진수를 설명하기 전에 2진수를 이해하는데 가장 핵심적인 내용에 대해 언급하는 것이 기억에 남는다.

Chapter 8. 십진수 이외의 것

앞선 장에서 십진수 체계에 대해 살펴봤다면 본격적으로 컴퓨터를 연산하는데 필요한 수 체계를 설명한다. 그 설명 과정에서 저자는 8진수 - 4진수 마지막으로는 2진수에 관해 설명하고, 컴퓨터를 구성하는 것에 2진수가 어떻게 사용되는지 간단하게 이야기한다.

이 부분에서는 가장 간단한 수 체계인 2진수와 그의 친구들(4진수, 8진수)을 소개한다. 아주 어려운 내용이 없이 쉽게 읽히는 구간이었다.

Chapter 9. 비트(bit), 비트, 비트

해당 장에서는 비트의 표현 방식에 관해 설명하고 있다. 앞서 배운 2진수를 기반으로 00, 01, 10, 11의 2자리 표현 방식부터 4자리 표현 방식, 카메라 필름의 필름 구분방식, 바코드 인식에 대한 설명이 나온다.

카메라 필름에 대해 설명을 할 때에는 카메라에 대한 설명이 주가 되어 간단하게 보고 넘어갔다. 필름의 표현 방식에 대해서는 이해하겠지만 자세한 이야기는 이해가 잘 안 되었기 때문일 것이다(2독부터는 이 부분을 참고해야겠다).

또한 barcode에서는 Parity에 대한 간략한 설명과 바코드가 홀, 짝수 Parity로 구성되고, 마지막에는 특정 연산에 의한 값을 넣어 중복의 불가와 바코드를 속이는 것을 방지한다는 것을 배웠다(사실 이 부분에선 머리만 좋으면 도용할 수 있겠다는 생각도 했다).

결국, 여기까지 비트로 표현할 수 있는 여러 가지 방법에 대해 살펴보았고, 이런 방식들은 논리학과 연결되어 (부울)Boole 대수의 뼈대가 되었다는 것을 느낄 수 있었다.

Chapter 10. 논리와 스위치(Switch)

이번에는 논리식에 대해서 알게 된다. 사실 학부에서 배운 내용이지만 책을 통해 더욱 광범위한 이해가 가능했다. 크게 흥미로운 내용은 없었지만, 만약 이 책을 통해 논리의 개념에 대해 처음 접했다면 '이런 방식으로도 생각할 수 있네?'라고 깨닫게 될 수 있는 내용이 다뤄졌다.

Chapter 11. 빌 게이츠? 논리게이트!

사실 앞 장을 읽다 보면 '논리'라는 개념이 뜬구름 잡는 이야기라고 생각할 수 있다. 그러나 이장을 읽고 난 후에 돌이켜보면 정말 소름이 돋게 된다. 사실 학부에서 논리회로를 배울 때만 해도 '이걸 왜 배우지?'라는 생각을 했다. 그런데 이제야 학습의 의의를 찾게 된 것이다.

이번 장의 내용에 관해 이야기하면 앞서 배운 논리의 개념과 릴레이의 작동 원리가 섞여 논리 게이트라는 개념이 탄생하게 되고, 이 게이트들을 조합해 논리식을 구현할 수 있다는 것을 알려주는 장이다. 드디어 컴퓨터의 뼈대를 찾게 되었다.

이 책의 첫 장에서부터 지금까지 느끼는 것은 학부의 커리큘럼에 대한 안타까움과 내가 이러한 지식 없이 공부를 했다는 것이 아쉬울 따름이다.

Chapter 12. 이진 덧셈기

이번에는 '가산기(덧셈기)'에 대한 이야기를 한다. 논리 게이트를 배우고, 이것을 통해 덧셈 연산을 하는 가산기의 구조를 살펴본다. 이후에는 '반가산기'와 '전가산기'에 대해 배우고 흔히 컴퓨터 과학 개론에서 나올법한 내용이 조금 등장한다. 여기서는 컴퓨터를 구성하는 것의 발전 과정을 간략하게 이해하게 되었고, 앞으로 컴퓨터를 구성하는 것을 학습하면서 필요한 내용을 사전 습득할 수 있었다.

Chapter 13. 그렇다면 뺄셈은 어떨까요?

필자는 사실 가산기에 대한 이야기를 처음 접했을 때, '컴퓨터는 뺄셈은 어떻게 할까?'라는 의문이 들었다. 처음에는 이진수의 뺄셈을 생각했지만, 생각하다 보니 마이너스 값에 대해 표기는 할 수 없을 것이라고 단정 지었다. 그 이후에 이번 장을 보니 확실히 이해할 수 있었다.

이번 장에서는 뺄셈을 위해 보수의 개념과 부호 bit를 설명하고 있다. 의외로 부족했던 부분을 채울 수 있는 시간이 되었다. 특히 '보수'의 개념에 대해서와 (아마도 배우게 될) '바이어스(bias)'에 대한 생각을 다시금 하게 되었다.

Chapter 14. 피드백과 플립플롭(flip-flop)

이번 장은 굉장히 까다로운 내용이 등장했다. '컴퓨터 구조(Computer Architecture)'에 대해 공부했지만, 너무 오래된 것이 문제일까 이해하기 까다로운 것들이 등장한 장이었다. 물론 해당 내용을 다 읽고 난 지금은 이해가 되지만, flip-flop을 처음 본 이들이 느낄 이해에 대한 부담감은 말로 설명하기 어려울 것이다.

이번 장을 읽고 느낀 것은 컴퓨터의 내부적 구조에 대한 고찰과 아직 어떤 분야에 사용할지에 대해서는 의문이지만 아직은 상당히 느리게 동작한다는 것이 불만이었다.

책을 읽으며 들었던 "전기가 계속 통한다면 이 전기들은 아예 사라지지 않는 것인가?" 혹은 "이런 구조의 컴퓨터라면 정말 느리겠군!"과 같은 생각들은 14장을 다 읽고 난 이후에는 어렵지 않게 이해할 수 있었다.

rayleighko commented 5 years ago

Chapter 15. 바이트와 16진수

이번 장에서는 이전 장에서 구현한 플립플롭들을 활용해 바이트 개념에 대해 앞서 배웠던 8비트 덧셈 개념을 통해 바이트와 16진수를 설명하고 있다. 가볍게 읽을 수 있는 내용이지만, 14장의 내용이 다소 복잡했기에 무슨 장난을 쳐놓은 건 아닐까 긴장하면서 봤다.

결과적으로 각 진수 별 변환 노하우를 배웠고, 부호의 표현에 대한 수 표현을 고려할 수 있게 되었다.

Chapter 16. 메모리를 만들어봅시다.

14장의 친구라고 생각한다. 가볍게 메모리의 특징(휘발성, 데이터 저장 등)을 기억과 엮어 설명하며 시작한다. 14장에서 배운 레벨 트리거 D타입 플립플롭을 기반으로 데이터 저장의 기본 개념을 설명하며, 전류의 이동에 대한 값 보존(Hold That Bit)을 '데이터 쓰기'라고 명시한다.

14장에서 언급했던 것과 같이 레벨 트리거 D타입 플립플롭을 래치라고 이야기하며 1비트 래치를 8개로 묶어 8비트 래치를 만들고 8비트 래치, 8:1 선택기, 3-8 디코더를 결합해 한 바이트 정보(00000000)를 기록하는 1바이트 램을 만들 수 있다는 걸 보여준다(내 노트북은 8기가 램인데,, 8기가 = 8,000메가 = 8,000,000키로 =8,000,000,000인 것을 고려하면 이런 거 80억 개가 내 노트북에 들어있다는 말이잖아..).

글이 쓰여질 당시가 1999년인 것과 함께 64M, 128M렘이 보편적이라며 64K 렘보고 "1980년대에서 왔나보군요"라고 하면서 깐다.. 64K 렘을 언급하며 이를 제어하기위한 제어판을 보여준다.

마지막에는 결국 이런 데이터의 흐름이 릴레이의 값이 변할 때마다 전자석에 말려 있는 코일을 통해 전기가 흐르게 되고, 이것이 금속 접점을 원하는 자리에 머무르게 하는 것이라며 렘의 전원을 끄면 내부의 모든 전자석이 자성을 잃으면서 종료되는 소리(텅)을 내면서 게이트가 천이되지 않은 상태로 되돌아가 렘에 있던 자료가 사라지는 것이라고 이야기한다. 그렇군,, 굉장하군,, 렘은 휘발성,, 메모,,

Chapter 17. 혼자서 움직이는 컴퓨터

'자동화' 개념이 서서히 들어가는 챕터. 일반적으로 연산을 진행하느 계산기와 컴퓨터의 가장 큰 차이는 데이터를 '분기'하느냐에 따른다는 것을 깨닫게 되었다. 조건문, 반복문, 선언문이 컴퓨터의 기본이자 가장 큰 특징이라는 것으로부터 모든 프로그래밍 언어의 기반이 된다는 것을 느꼈다. 또한, 기계어로부터 어셈블리어로 의미가 부여된다는 것을 느껴 새로웠다.

rayleighko commented 5 years ago

Chapter 18. 주판에서 반도체까지

흔히 알던 IBM이 지금처럼 세계적인 기업이 될 수 있었던 것은 천공카드 시스템의 판매를 시작이 있었다는 사실에 충격을 받았다. 더불어 1970년대에 처음 등장한 마이크로 프로세서를 기반으로 현재의 컴퓨터가 생겨났다는 것을 통해 기술의 발전에 따른 삶의 변화를 체감할 수 있었다.


이와 동시에 인터넷이 상업적으로 보급화된 1993년 이후 첫 웹 브라우저인 모자익과 확장판 느낌의 넷스케이프 이후 흐른 시간은 불과 26년인데, 20살에 개발을 시작해 46세를 지나는 개발자의 존재는 무엇을 의미하는지, 그러니까 개발자의 수명 자체에 대한 불신이 생겼다.

그래서 대부분의 웹 개발자 혹은 타 직무의 개발자 모두가 처음부터 웹을 한 건아니겠구나, 지금 내가 선택하는 직업의 수명을 걱정하기 이전에 여러 방면에 관심을 두어야 적절한 태세 전환이 가능한 것이 아닐까라는 생각도 할 수 있었다.

물론 여기까지는 책의 내용과 하등 상관없는 개인적인 생각일 뿐이다.


roeniss commented 5 years ago

동시에, 하나를 깊게 파도 모자랄 세상이라서... 참 어렵고 재밌습니다 :)

rayleighko commented 5 years ago

Chapter 19. 두 가지 고전적인 마이크로프로세서들

본격적으로 어셈블리어를 통해 명령어를 조작하기 시작했다. 실제로 어셈블리어의 키워드는 각 레지스터의 명령 조작에 사용되며 실제로 우리가 사용하는 컴파일 언어 또한 결과적으로 메모리에 올라가 컴퓨팅 파워를 사용하는 것일탠데 그 과정이 궁금하기도 했다(학부에서 배운 것보다 간결하게 이해하고 싶다).

이와 함께 일반적으로 메모리로의 접근이 적을수록 효율적인 프로그램이 되며, 클럭 수와 함께 메모리의 크기도 프로그램 속도를 좌지우지할 수 있다는 것을 소개했다.

더불어 고든 무어가 인텔을 만들면서 '무어의 법칙'을 통해 인텔의 엔지니어가 추구해야 할 목표를 설정했다는 것을 알 수 있으며 결국 엔지니어들은 갈려나가 현재의 인텔이 된 것 같기도 하다.

이번 주는 총 2개의 챕터를 읽었는데 왠지 갈수록 읽는 속도가 더뎌지고 있다.. 약 200페이지 정도가 남았는데 매일 적어도 40페이지는 읽어야 여유롭게 기한을 맞출 수 있을 듯 하니 4주에 책 한 권 읽는 것도 쉽지 않다는 것을 느꼈다.

멍청한 나 자신같으니라구,,

roeniss commented 5 years ago

흑흑... 멍청한 나 자신같으니라구22..

챕터 19 - 3번째 줄에 오타있어요!

생각해보면 아마존도 물류 회사였는데 매우 발빠르게 움직여서 지금의 넘버원 클라우드 서비스 회사를 만들었네요. 반면 야후는 몇 번이고 회사를 MS, Amazon 등에 팔 기회가 있었는데 버티고 버티다가 망했다는 얘기도 들었습니다. 최근엔 도커가 자금을 확보하지 못해 많이 힘들어한다는 얘기를 들었는데, 과연 도커의 미래는...? 라는 생각이 명진님 리뷰를 본 후 빙글빙글 돌았습니다 :)

rayleighko commented 5 years ago

크흐흠.. 오늘 정보처리기사 실기가 있다는 사실을 어제 알았다.. 그래서 사실 책 읽을 예정이었던 시간에 정보처리기사 실기 공부를 했고,, 책을 읽지 못했다.. 반성한다.. 그래서 깊은 내용을 다루고 있는 부분을 일부 생략해가면서 겨우겨우20장을 읽었다... 반성한다.. 다음 주에는 무슨 일이 있어도 다 읽어보자!

Chapter 20. 아스키 코드와 문자의 변환

문자 코드의 발전과 아스키코드에서 유니 코드로 변환되는 과정에 대한 이야기가 매우 흥미로웠다. 결과적으로 우리가 사용하는 텍스트 파일은 아스키 혹은 UTF-8로 변환되어 그 데이터는 다시 기계어로 변환되어 컴퓨터에 저장되는 구조를 다시금 생각해보게 되었다. 내가 짠 모든 코드는 결국 0과 1의 덩어리일 뿐이고,, 효율에 따라서 덩어리 크기가 달라지기 때문에 최대한 효율적으로 코드를 짜야겠다는 생각을 했다..

rayleighko commented 4 years ago

Chapter 21. 버스에 올라탑시다

운영체제에 필요한 전반적인 하드웨어 지식을 이야기하며 임베디드 시스템에서 필요한 개념들에 대해 설명한다. 전반적으로 시스템을 공부하며 만났던 지식들이기에 그것들을 배우기 전에 이 책을 통해 사전 지식을 쌓았으면 어땠을까싶다.

Chapter 22. 운영체제

스케줄링이나 세마포어, 크리티컬 섹션, 뮤탈 익스클루전 등 운영체제에 필요한 전반적인 개념에 대해 되새겨볼 수 있었다. 다만, 급하게 읽느라 거의 대부분의 내용을 곱씹는다기보다는 흝고 지나간 것같은 느낌.

Chapter 23. 고정소수점과 부동소수점

소수점에 대한 이해와 규약에 대해 생각해볼 수있었다. '정규화'의 중요성과 함께 모든 혁신의 시작은 '규칙'에서 온다는 것을 느끼기도 했다.

Chapter 24. 고수준 언어와 저수준 언어

현대의 개발 언어와는 조금 다르지만, 저자가 이야기하고자 하는 고수준과 저수준의 차이를 느낄 수 있었고, 결과적으로 어떤 언어를 학습하느냐는 중요하지 않다는 것과 컴퓨터 과학은 CS, PS 등이 중요한 영역이라는 것을 다시 한 번 느낄 수 있었다.

Chapter 25. 그래픽 혁명

이 책의 종장. 지금까지 책에서 언급했던 내용을 갈무리하며 결과적으로 현대의 컴퓨터 과학 생태계를 이야기한다. 현 시점에서 혁신을 유지하는 건 결과적으로 단단한 기반 지식과 기술이라는 점도 놓칠 수 없는 요소인 듯 하다.

만약 내가 트랜지스터를 만지고 반도체 공학을 공부한다고 한들 그런 모습은 결과적으로 내가 원하는 미래보다는 현실적이고 합리적이라는(사실은 과한) 생각을 바탕으로 나온 괴물의 모습이 아닐까 한다.

실제로 스스로가 알고리즘이 좋고 CS가 좋으며 연구가 좋고 더 깊은 곳을 탐구하는 능력이 있었다면 Low한 환경에 흥미를 느낄테지만, 당장은 그런 너드한 느낌보다는 기술의 최전선에서 기술 학습하는 게 내가 생각하는 기술자의 길이 아닐까 한다.

물론 컨퍼런스를 간다거나 프레임워크를 학습하는 것은 시대적인 흐름을 배우는 느낌이기 때문에 기반 지식에 대한 학습을 게을리하면 안되겠다는 생각을 했다(브라우저를 감싸는 모든 지식은 CS 기반 지식에서 오기 때문일 것이다).