컴퓨터공학

1 정의

Computer Science(컴퓨터과학/전산학[1])/Computer Engineering(컴퓨터공학)
이 둘을 묶어 Computer Science and Engineering, CSE로 불리기도 한다. 혹은 후자만 떼어서 Computer System Engineering 이라고 하기도 한다.

컴퓨터의 소프트웨어[2]를 다루는 학문이다. 하드웨어는 전자공학에서 다룬다.

미국에선 컴퓨터 사이언스는 소프트웨어 프로그래밍과 수학적 알고리즘, 데이터 구조, 인공지능을 가르치는 분야이며 한국에선 컴퓨터공학이라 부르는 것이다.

2 연구하는 것

흔히 프로그래밍을 배우는 학문이라고 생각하지만, 그것은 마치 경제학이 펀드매니저들 하는 학문이라거나, 법학과사법시험 합격 요령을 배우는 곳이라고 생각하는 것과 같다. 컴퓨터공학과는 컴퓨터 공학이라는 독립적인 학문을 배우는 학과라는 것을 명심하자. 컴퓨터를 물리적 기기로 보고 연구하는 학문이 아니라, Compute + r 라는 "개념"과, 그 구조에 대한 학문이다. 우리가 흔히 쓰는 데스크탑, 스마트 폰 등은 그러한 개념들을 구체화한 일부일 뿐이다.

이를 일컫어 Hal Abelson은 컴퓨터 과학(Computer science)이라는 이름이 이 분야를 소개하기에 나쁜 이름이라고 한 바 있다. 컴퓨터 과학은 사실 과학이 아니며[3] 컴퓨터랑 그렇게 많이 관련 있는 것도 아니라나. 마치 물리학입자가속기에 대한 학문도 아니고 생물학현미경과 페트리 접시에 대한 학문이 아닌 것과 마찬가지인 셈.

실제 프로그래밍을 배우는 과목은 몇 개 안 되고, 대부분은 도대체 이걸 배워서 어디에 써먹을까 싶은 수학적, 이론적인 과목 혹은 진짜 수학 과목들이다. 코딩을 위한 테크닉 같은 건 알아서 배워야 한다. 그러므로 혹시 이쪽으로 뜻이 있는 학생이 있다면 입학 후 과내 스터디 동아리 활동을 적극 추천한다.

배우는 과목을 크게 나눠보면(구체적인 과목명은 학교마다 다르고 학교의 학풍과 교수들의 전공분야에 따라 중시하는 과목이 다르다.)

  • 코딩 계열 : C, C++[4], Java프로그래밍 언어의 문법과 프로그램 제작법을 배운다. 실용적, 취업지향적인 학풍이 강할수록 이쪽 과목의 비중이 크다. C, C++, Java 정도는 대부분의 학교에서 1학년 과목으로 취급한다.[5] 그런 학교는 2학년 이후 교육 과정에서 스크립트 언어[6], 함수형 언어[7], 논리형 언어[8] 등을 가르치는 것이 보통이다. 아예 일반적이지 않은 프로그래밍 언어 몇 개를 모아서 "고급 프로그래밍" 정도의 과목명으로 가르치는 강의를 개설하는 경우도 있다[9].
  • 아키텍처 계열 : 논리회로CPU 구조, 마이크로프로세서, 컴퓨터 구조, 임베디드 등 컴퓨터가 어떻게 생겼고, 어떤 원리로 동작하는지 배운다. 이 경우에도 H/W는 일절 만지지 않는 경우가 많다. 번외편으로는 디지털 로직[10] 정도가 있다. 학교에 따라서 8051이나 AVR, PIC 또는 DE2 보드 정도를 가지고 "논리회로 실습" 정도의 제목으로 실제 하드웨어를 구현하는 입문 과정이 개설된 경우도 있다.
  • 전산수학 계열 : 여기서도 공학과학이 갈린다. 공학 쪽에 가까운 분야들은 프로그램에서 '사용가능한' 알고리즘을 목적으로, 공대생이라면 반드시 들어야 하는 미적분학, 선형대수학 등을 시작으로 이산수학, 알고리즘, 수치해석 등을 주로 배우며 응용을 하게되면 OpenGL 등을 사용하는 그래픽 과목으로 진화하는 경우가 많고, 암호학[11]으로 가는 경우도 많다. 과학쪽에 가까운 분야들에서는 알고리즘 시스템 자체를 수학적 대상으로 삼아 연구하는 경우가 많다. 이런 경우에는 논리학, 오토마타, 계산이론, 증명이론 등을 배우는데, 이것들은 일반적으로 상상하는 수학과는 크게 다르기 때문에 어느 정도 현대수학의 경험이 뒷받침되어야 따라갈 수 있는 경우가 많고, 덕분에 일반적인 컴공생보다 수학전공자들이 많이 보인다. 실제로 이쪽은 교수부터 수학전공자 출신인 경우가 많다.[12] 학교에 따라서는 확률통계를 가르치는 곳도 있는데 대학원에 진학할 생각이 있다면 반드시 배워두자. 절대 손해 안본다. 특히 인공지능[13]과 이것을 응용하는 분야(영상처리, 음성처리, 정보검색 등), 자연어처리, 네트워크 프로토콜 같은 분야를 염두에 두고 있다면 확률통계는 무조건 필수이므로 학부 때 미리 빠삭하게 해 놓으면 대박 좋다[14].
  • 인공지능: 인공지능이나 기계학습을 다루기는 하는데, 학부 수준에서는 맛만 보는 수준 이상의 내용을 다루는 데는 한계가 있다. 그래도 Prolog나 자연어처리(NLP), 검색엔진(정보검색) 같은 것을 맛만 보는 단계지만 접해볼 수 있다.
  • 프로그래밍 언어 계열 : 프로그래밍 언어들의 특징과 역사, 언어구조론[15], 형식언어, 컴파일러의 구조 등을 배운다. 대학마다 배우는 내용이 꽤나 다르다. 그 이유는 '프로그래밍 언어' 라는 분야 자체에서는 논문이 전부 '증명' 형식이기 때문. 예를 들어, POPL '15[16]에서 아무 논문이나 클릭해보자. 논문들이 죄다 수학 논문처럼 증명하는 방식으로 써져있다는 것을 알 수 있다. 만약 PL 교수가 학생들에게 '프로그래밍 언어 분야' 를 소개하고자 한다면, 보통 수업 시간에 증명을 상당히 많이 다루게 된다. 반면, 교수가 학생들에게 그냥 다양한 언어들의 특성을 가르치게 된다면, 그런 느낌은 별로 들지 않는다. 만약 후자면 프로그래밍 경험이 많으면 잘 따라갈 수 있지만, 그렇지 않고 증명 느낌으로 과목을 가르치게 되면, 수학적인 논리가 부족한 학생들은 죽을 맛이 된다...
  • 개발 방법론 : 소프트웨어 공학 등 시스템 설계와 개발방법에 대해서 배운다. 프로그램의 설계 방법과 프로젝트 중 시간관리, 인력관리, 자원관리법 등 배우는 내용을 보면 오히려 경영학에 가깝다. 문과적 소양이 없는 순수 컴덕이 만나게 되는 난관 중 하나. 실제 개발에 사용되는 방법[18]을 개념적으로 배우며 실습 역시 병행한다. 교수의 기대치와 학생의 능력의 괴리감이 아마도 가장 큰 과목일 것이다.[19].
  • 멀티미디어 : MPEG, 영상 신호처리, 코덱, 컴퓨터 그래픽 처리, 미디어의 압축[20]과 전송 등 멀티미디어와 관련된 내용을 배운다. 게임 프로그래밍을 배우는 경우도 있다. 절대로 포토샵, MAYA 같은 툴 사용법을 배우는게 아니다! 다만, 학교에 따라선 DirectX, Cuda, OpenGL등을 사용하는 코딩을 위주로 하는 경우[21]도 있으니 듣기전에 확인이 절대적으로 필요하다. 쉽게 생각하다가 피보기 좋은 분야.
  • 네트워크 : 네트워크와 통신, 보안, 클라우드 컴퓨팅 등이 있다. OSI 계층에 따른 분류를 기준으로 각각의 구조를 배우기도 하며 네트워크 통신 프로그래밍을 지칭하는 경우도 있으며 그 두개의 짬뽕을 의미하기도 하는 역시 잘 하는 사람은 잘 하고 못 하는 사람은 희망이 없는 과목으로 보는 경우가 많은 분야.[22]
  • 그 밖에 여러 가지를 몽땅 다룰 수밖에 없는 정보보안 같은 과목이 개설된 학교도 있다.

3 다른 공학과의 관계

막상 보면 다른 공학과 비교해서 차이점이 크다. Computer Engineering(컴퓨터공학)이기도 하면서 Computer Science(컴퓨터과학)이라고도 불린다. 컴퓨터공학은 공학 분야의 하나로서 산업과 밀접한 관계를 가지며, 동시에 과학 분야의 하나로서 학문 연구가 진행된다.

3.1 전기/전자공학

대부분 대학에서의 컴퓨터공학과는 전자공학의 당시 최첨단 이론인 반도체를 바탕으로 시작했고, 결국 전자공학과로부터 독립하게 되었다. 따라서 두 과간에 행정적으로나 연구적으로나 교류가 많다. 하지만 학문적으로 컴퓨터공학의 뿌리는 수학이다. 우리가 아는 대부분의 초기 컴퓨터과학 선구자들은 수학자였다. 전자공학에서 컴퓨터공학 관련된 연구하는 경우는, 보통 컴퓨터 시각이나 음성인식 같은 아날로그와 디지털의 경계에 있는 분야 정도이다.

따라서 둘을 복수전공하는건 쉽지 않을뿐더러, 전술했듯이 많은 학생들이 생각하는 것과는 다르게 두분야의 호환성이 크지 않다. 컴퓨터공학을 더 깊게 파고 싶으면 이산수학이나 수리통계, 또는 하고 싶은 분야에 따라 언어학 (자연어처리) 같은 전공을 복수전공하는 것이 차라리 낫다.
  1. KAIST는 여전히 전산학과로 부른다.
  2. 알고리즘, 최적화, 운영체제의 원리, 프로그래밍 언어 등
  3. 자연 현상을 관측하고 원리를 밝히는 것이 아니기 때문이다.
  4. 상당히 많이 사용되는 언어이기는 하지만 '프로그래밍 언어 공부'라는 목적에 있어서 C나 C++은 그리 좋지 못한 선택이는 비판도 있다. 하지만 학생 시절 가장 먼저, 그리고 가장 빨리 접하게 되는 언어.
  5. 서강대학교 처럼 오직 C만 집중적으로 깊게 가르치고 나머진 겉핥기식으로 배우는 학교도 있다
  6. Javascript, PHP, Python
  7. LISP, Haskell
  8. Prolog
  9. 보통 학교에 프로그래밍 언어를 연구하는 교수가 있으면 이런 과목들이 개설된다.
  10. DE2보드 정도는 직접 다루는 경우가 많다
  11. 정말로 학부시절 수준에서는 이 이상의 전산수학은 없다라는 소리가 나올지도 모른다
  12. 다만, 한국에서는 거의 죽은 분야에 가깝다. 한국의 경우, 교육열이 입시에 쏠려있어, 고교수학에 매우 강하며 실제 대학에서도 이런 경향이 이어져 고교 때 배우는 미적분을 많이 다루는 해석학과 같은 분야쪽에 쏠리는 경향이 강하다. 컴퓨터 과학에서 사용되는 수리논리학은 수학에서 해석학과 거리가 가장 먼 분야로 볼 수 있으며, 덕분에 한국에서 이쪽 전공 교수 자체가 별로 없다. (다만 철학과까지 범위를 넓혀보면 그나마 숫자가 좀 늘어나긴 한다. 즉 수학과외에 철학과에도 수리논리학을 포함한 논리학 전공 교수들이 있다. 참고로 논리학은 원래 철학의 한 분야이다. 그러나 국내 수학과 내에 논리학 전공 교수가 많지 않듯이, 국내 철학과에서도 논리학 전공교수가 많진 않다.) 당연히 컴퓨터 과학에서도 마찬가지. 국내는 이쪽 관련 인프라가 열악하므로 이쪽을 전공하고싶다면 해외로 나가는 수밖에 없다.
  13. 현재 인공지능은 통계적 기법이 대세다. 룰이나 논리 기반 추론은 이미 연구될 만큼 연구되었고 더 이상 주목할 만한 학문적 성과가 나오고 있지 않기 때문이다.
  14. 이런 쪽을 생각하고 있다면 확률통계는 물론이고 해석학, 선형대수 등 기본적으로 수학실력이 어느 정도 받쳐줘야 한다. 안 그러면 대학원을 안 가느니만 못한 사태가 발생할 수도 있다.
  15. 특정 언어를 사용하는 법이 아니라 언어와 문법이 어떤 식으로 구조화되어 있는지를 배우며 이를 이용하여 컴퓨터 언어를 만드는 법에 대한 기초 이론이다. 상당히 수학적인 과목이면서도 언어학적인 과목. 컴파일러 과목의 기초이며 이 과목을 배우면 노엄 촘스키의 위대함을 깨달을 수 있다.
  16. 프로그래밍 언어 분야 탑 컨퍼런스
  17. 90년대에는 UC 버클리에서 만든 Nachos를 많이 사용했다. PintOS는 2004년에 스탠퍼드에서 Nachos를 개량하여 대체한 실험용 운영체제이다.
  18. 즉, Agile Process운용 기법, ITBM, IS구축 기법, IT Integration 등을 배운다
  19. 실제 이쪽 담당의 교수 밑에서 학생들을 가르친 조교의 증언에 의하면, 일단 학생들의 전반적인 코딩 능력이 바닥을 기는데다 오로지 정답만을 찾도록 12년동안 훈련된 학생들을 상대로 정답이 없는 분야의 내용을 가르치려니 글자 그대로 애로사항이 꽃핀다고.
  20. JPEG라든지
  21. 이경우엔 3D 렌더링에 대한 기본지식도 있어야 한다!!
  22. 그래도 이쪽 분야로의 진로를 계획하는 사람이 있다면 독학으로라도 공부해 두도록. 현업에 나가면 이쪽의 지식을 써먹을 분야가 많다. 소켓 프로그래밍을 할 필요가 없는 웹 개발자라 하더라도 이쪽 지식을 알고있는 사람과 모르는 사람간의 격차가 크다.