티스토리 뷰



180509


컴퓨터공학 전공에서 배우는 핵심 개념을 망라한 지침서.
제목과 내용이 그대로 일치하는 최고의 개념서. 제목으로 낚시하는 베스트셀러의 범람 속 오아시스 같은 책.
필자처럼 컴퓨터공학을 뒤늦게 공부하려는 사람에게 꼭 추천해주고 싶다.


필자는 경제학과 학생이다. 프로그래밍 동아리를 통해 뒤늦게 컴퓨터 프로그래밍을 공부하게 됐고, 데이터 분석을 공부하다가 현재는 블록체인으로 관심을 옮겼다. 운 좋게도 주변에 문과이면서 컴퓨터공학에도 능숙한 친구들과 함께할 수 있었지만, 깊이 공부하면 공부할수록 기반지식이 전무한 상황에서 쌓는 지식에 한계가 보였다. 데이터 분석을 논하려면 데이터가 무엇인지부터 제대로 알아야 했고, 블록체인의 분산원장 시스템은 데이터베이스의 구성 방법 중 하나인 분산형 데이터베이스의 발전된 형태이다. 회사에서 개발팀으로 인턴을 하면서 ‘시스템 부하를 줄일 수 있도록 효율적으로 코딩하는 법’이 중요하다는 것도 느꼈다. 구글 검색으로 수면 위에 떠오른 과제들을 해결하는 방법만 익혀 온 내게는 거대한 벽 같은 느낌이었다.
  
비록 융합소프트웨어 연계전공을 이수하는 중이지만, 컴퓨터공학 학사 수준에서 가르치는 내용이 무엇인지 제대로 알아야겠다는 생각이 들었다. 내가 관심을 갖고 공부하는 부분이 컴퓨터공학의 어느 영역인지, 내가 공부해야 하는 컴퓨터공학은 어떤 내용들을 다루고 있는지 로드맵을 알고 싶었다.
  
결과적으로 이 책은 제목과 내용, 책의 목적 세 가지가 일치하는 진정한 ‘양서’였다. 너무 어렵지 않으면서도, 컴퓨터공학에서 다루는 핵심 개념들이 목차별로 모여 하나의 목표를 꿰뚫고 있다. 
 





Chapter 1에서는 컴퓨터가 문제를 해결하는 방식을 이해한다. 이산수학이 등장하고, 어떻게 문제를 해결해야 하는지 순차적으로 접근하는 방법을 접한다. Chapter 2에서는 컴퓨터가 문제를 푸는 데 필요한 자원을 측정하는 ‘복잡도’라는 개념이 등장한다. 시간자원의 소모량을 측정하는 시간복잡도 (정확히는, 입력량을 처리하는 데 필요한 연산의 횟수를 말한다), 메모리 공간 점유를 측정하는 공간복잡도의 개념을 배운다. 다뤄야 할 데이터의 양이 많을수록 복잡도가 매우 중요해진다. 시간복잡도가 지수함수일 경우 데이터 양이 증가하면 연산횟수가 기하급수적으로 커지기 때문이다. 컴퓨팅 연산을 적게 소모하면서 원하는 결과를 얻어낼 수 있는 프로그램을 설계하는 것이 중요하다는 사실을 접할 수 있다.

  
Chapter 3는 본격적으로 컴퓨터의 문제해결 전략을 배운다. 컴퓨터가 문제를 해결하는 방법인 ‘알고리즘’의 근간을 이루는 몇 가지 방법이 등장한다. for문과 while문, Recursion을 이용한 반복과 같이 간단한 방법에서부터 발견법(Heuristic function), 역추적, 분할 정복에 이르기까지 다양한 전략을 확인할 수 있다.
  
Chapter 4에서는 컴퓨터가 연산을 하기 위해 저장하는 여러 가지 데이터 형식을 볼 수 있다. 추상데이터의 기본 종류인 Queue와 Stack, List와 Map부터 데이터 구조를 나타내는 array, 연결 리스트, Tree구조, 해시 테이블 등의 개념을 학습한다. Chapter 5에서는 Chapter 3과 4의 내용을 바탕으로 실제로 컴퓨터가 연산에 사용하는 알고리즘이 등장한다. 알고리즘은 워낙 분야별로 다양하고 종류가 많기 때문에 이 책에서 깊게 다루지 않지만, 기본적으로 다루는 정렬 / 탐색 알고리즘과 그래프에서 각 노드를 탐색하는 방법인 ‘깊이 우선 알고리즘’과 ‘너비 우선 알고리즘’을 소개한다. 저자는 어떤 문제를 해결해야 한다면, 그 문제를 해결할 수 있는 알고리즘이 있는지 먼저 찾아보라는 충고를 덧붙인다. 이미 존재하는 알고리즘과 방법으로 충분히 해결할 수 있는 문제가 대부분이라며.
  
Chapter 6은 데이터베이스를 다룬다. 컴퓨터가 연산을 하기 위해서 저장하는 데이터베이스의 여러 형식을 다룬다. 가장 직관적인 데이터베이스 형식인 관계형 데이터베이스부터 비관계형 데이터베이스, 키-값 저장소, 그래프 데이터베이스를 다룬다. 몇 년 전 핫했던 ‘빅데이터’도 거품 빼고 학문적으로 접근하며, 분산형 데이터베이스의 세 가지 종류 - 단일 마스터 레플리케이션, 다중 마스터 레플리케이션, 샤딩 - 을 설명한다. 다양한 시스템에서 호환되는 방식으로 데이터를 저장하기 위한 직렬화 형식으로 SQL, XML, JSON, CSV 데이터형식도 언급된다.
  
컴퓨터공학에서 컴퓨터 연산처리의 하드웨어 측면을 다루는 게 Chapter 7이다. CPU의 아키텍처와 연산방식, 메모리의 구조, 컴파일러의 존재이유, 역어셈블리와 역공학 등등을 설명한다. CPU 내에서 자주 쓰이는 연산은 RAM에 접근하기보다는 CPU 내에 임시로 저장하는 1차 / 2차 캐시메모리의 개념, 외부 저장장치(HDD, SSD)의 발전까지를 다룬다.
  
Chapter 8은 프로그래밍 자체를 다루는 장이다. 구조적 / 절차적 프로그래밍, 선언형, 함수형, 논리형 프로그래밍의 개념을 설명한다. 저자가 언급했듯 이 장은 스스로 프로그래밍 언어로 코드를 짜는 게 훨씬 학습에 도움이 된다. 
  
애초에 이 책이 컴퓨터공학 학부 개념을 요약한 책이기 때문에, 이 책의 내용을 다시 요약하는 행동이 그다지 의미를 갖지는 못할 것 같다. 책을 먼저 읽어본 다음, 책에서 다룬 핵심 키워드를 다시 되짚어 보는 용도로 이 독후감을 읽는 걸 추천한다.


댓글
댓글쓰기 폼