본문 바로가기

Programming

컴퓨터공학과 에선 무었을 배울까? 제대로 알고가자! + 진로 및 조언

컴공은 학벌이 다른학과보다 

그렇게 중요하지않음 실력이 더 중요하다 

다른학과처럼 대가리로 외워서 공식들을 씨불이는게아니라 

배운거를 응용해서 직접 만들어야하거든 


실력만있으면 학벌은 집어치워도 되는데 

보통은 학벌이 좋으면 실력도 좋겠지?

학벌이 좋아도 컴공은 실력 없으면 천대받음


잘보면 우리나라 잘나가는 컴공봐라 다 서울대 카이스트임

컴공만큼 머거리 좋아야하는 분야도 없지

순수학문이 아니라 응용이니


그럼 응용못하는 애들은 어떻게 되냐고?

프로그래머라고 안한다 코더라고 하지.

컴퓨터 공학은 응용력은 물론이고 알고리즘 잘 짜는 애들이 갑이다. 

뭐 애플리케이션 개발이나 소프트웨어 개발직으로 가려면 

대학 컴공 때려치고 아이티뱅크가라. 

컴공은 좀 더 본질적인 학문을 다루는 곳이다. 

전산응용학이라고 생각하면 된다. 


요즘은 하드웨어 설계도 배운다(ARM). 

전자/컴퓨터 간의 경계를 허물고, 네트워크 구축, 커널 시스템 설계 또한 배운다. 

이 이상으로 가려면 대학원 가거나 기업 연구소 가야된다.

컴공이랑 애플리케이션 개발이랑 제발 구분짓자. 

학원에서 코더들한테 프로그래머라고 하니까 개나소나 프로그래머지. 

실제로 프로그래머는 그 이상을 뜻하는거다.


그럼, 컴퓨터 공학, 컴퓨터 과학, 전산학 등등으로 불리는 과에선 무엇을 배울까?

저기 전문대 무슨 소프트웨어 뭐시기과 이런 데서 배우는 

안드로이드앱, 웹디자인 이런 과목 말고

학문적으로 어떤 과목을 배우는지 알아보자.


일단 컴공에서도 기초 미적분학, 일반물리, 미분방정식, 선형대수 같은 기본적인 공학 과목들은 듣는다.

여기선 컴퓨터 과학/공학에 관해서만 다룸.






1. 기초 프로그래밍



주로 C언어, C++, 자바 등 프로그래밍 언어의 사용법, 즉 코딩에 대해 배워.

위에 코드는 아마 본 적 있는 사람도 많을 거야. 

C언어로 "Hello world!"라는 문자열을 출력하는 간단한 프로그램이야.

C언어를 개발한 벨 연구소의 튜토리얼 매뉴얼에서 

처음 언급된 이후 관습적으로 많은 프로그래밍 언어 서적에서 

처음 예제로 나오고 있어.


자료형(data type), 변수(variable), 입출력 방법, 함수(function), 조건문, 반복문(loop), 배열, 포인터, 클래스(class) 등에 대해 배워.

학원에서도 한두달이면 배울 수 있고 

C언어 책 사서 혼자 공부할 수도 있으니 

취미삼아 배워보면 재밌을거야.


이 과목을 수강하고 나면 간단한 별찍기 프로그램, 

숫자 입력을 받고 간단한 계산을 해서 출력을 하는 콘솔 프로그램 등을 직접 만들 수 있을 거야.

여기까지는 허접하지만 직접 프로그래밍한 결과물도 나오고 재밌을 지도 모르겠지만... 

사실 이건 요리학원에서 칼질 배우는 수준이라 할 수 있어.



2. 자료 구조(Data Structure)


배열(Array), 큐(Queue), 스택(Stack), 트리(Tree), 그래프(Graph) 등 여러가지 자료구조에 대해 배워. 

아마 프로그래밍 언어로 직접 구현하는 과제도 나올 거야.

자료구조가 왜 중요하냐면 이쪽 분야에서 효율성(efficiency)이 굉장히 중요해서 프로그래밍을 할 때 적합한 자료구조를 선택해야 하거든.


예를 들어 정보들을 입력받는 순서대로 단순배열 시키면 나중에 검색할 때 배열의 처음부터 끝까지 일일히 확인해봐야되.

운이 좋아서 3, 4번 째에 찾고자 하는 정보가 있으면 모르겠지만, 최악의 경우 배열의 제일 끝까지 모든 자료를 일일히 확인해야 할 지도 몰라.

그러나 계층구조를 갖는 자료구조를 이용해 정보를 입력받을 때 계층별로 정렬한다면 검색할 때 해당 계층만 검색하면 되겠지?


3. 알고리즘(Algorithm)




알고리즘 하면 순서도를 떠올리는 사람도 있을 거야. 알고리즘이란, "어떠한 문제를 해결하기 위한 방법"이라고 할 수 있어 .

아까 말했듯이 이쪽 분야에선 효율성이 굉장히 중요해. 그래서 똑같은 일을 수행하는 프로세스라도 더 효율적이게 만들려고 끊임없이 연구하고 있어.

"복잡도"라는 것을 이용해서 알고리즘의 효율성을 따지는데, 복잡도가 뭔냐면...


원래는 수학적으로 정의되어 있고 별로 어려운 내용은 아니지만 초단간하게 직관적으로 예를 들어줄게.

n개의 요소를 갖는 배열이 있어. 여기서 무언가를 검색하려면 최대 n번까지 배열을 순서대로 확인해야겠지?

이런 경우 이 배열에 대한 검색 알고리즘의 복잡도는 O(n)이야.


그럼 nxn 행렬에서 검색할 때는? 일단 1행의 1번부터 n번까지 확인하고, 

그 다음 2행의 1번부터 n번까지 확인하고...

이런 식으로 n행의 1번부터 n번까지 확인하면 최대 nxn번 확인해야겠지?

그럼 이 행렬에 대한 검색 알고리즘의 복잡도는 O(nxn), 즉 O(n^2)이야. 

O(n) 이런 식으로 쓰는 걸 Big-O notation이라고 함.

[2, 4, 1, 9, 6, 3] 이런 배열을 오름차순으로 정렬하는 알고리즘만 해도 

단순한 알고리즘은 O(n^2)의 복잡도를 갖는 반면,

좀 더 고급 알고리즘은 O(nlogn)의 복잡도를 가져. 

n^2이랑 nlogn이랑 별 차이 없다고 느낄 지도 모르는데, 

n의 값이 커질 수록 그 차이는 기하급수적으로 커져. 

정렬 알고리즘에 대해 더 알고싶은 사람은 

위키백과에 Sorting algorithm 검색 ㄱㄱ.


또 한 가지 흥미로운 주제가 있어. 행렬 곱셈의 시간복잡도는 얼마나 될까? 

n곱하기n 행렬이라고 가정했을 때. 아마 행렬곱셈을 할 줄 아는 사람이라면 직관적으로 O(n^3)이라는 걸 알거야. 

오랫동안 사람들은 행렬곱셈의 시간복잡도에서 n의 지수를 3 밑으로 줄이는 것이 불가능하다고 생각했어. 

근데 Strassen이라는 사람이 n의 지수를 3 보다 작게, 약 2.8정도로 줄일 수 있는 알고리즘을 개발했어! 

마찬가지로 n^3이랑 n^2.8이랑 별 차이 없다고 생각할지도 모르겠지만, n의 값이 커질 수록 그 차이는 커져. 

n이 1000만 되도 4배의 속도차이가 나는데 

이 말이 뭐냐면 기존 행렬곱셈방식을 사용하면 4일동안 컴퓨터가 계산해야 할 일을, 

Strassen algorithm을 통해 하루만에 완료할 수 있다는 거야.


이외에도 자료구조에서 배운 자료구조들의 복잡도를 분석한다던지, 

dynamic programming, greedy algorithm, amortized analysis 등 

알고리즘을 디자인하거나 분석하는 방법에 대해서도 배워.



4. 컴퓨터 구조(Computer Architecture)


컴퓨터 구조 혹은 컴퓨터 조직론(Computer Organization) 등으로 불리는 과목이야. 

주로 배우는 내용은 마이크로프로세서가 인식할 수 있는 명령어 집합(Instruction Set Architecture, ISA), 

ISA를 처리하는 프로세서 구현(microarchitecture 혹은 computer organization이라고 불림), 

memory hierarchy 등에 대해서 배워. 

폰 노이만 구조라고 들어본 적 있을 거야. 

산술논리장치(Arithmetic Logic Unit, ALU)와 control unit으로 구성된 

중앙처리장치(CPU), memory, 인풋/아웃풋 디바이스 등으로 이루어진 구조고, 

현대의 주류를 이루는 컴퓨터는 대부분 이 폰 노이만 구조를 기반으로 하고 있어.


여기서 배우는 ISA 역시 폰 노이만 구조를 기반으로 하고 있어. 

예를 들어 메모리에 있는 데이터를 CPU의 레지스터로 load하는 명령어, 

CPU의 두 레지스터에 저장된 값을 더해 

새로운 레지스터에 저장하는 add 명령어, 레지스터에 저장된 값을 메모리로 strore하는 명령어 등등.


그리고 ISA를 처리하는 processor가 어떻게 생겨먹었는지도 배워. 

Pipeline을 이용해 한번에 여러 명령어를 stage별로 동시에 처리하는 방법 등등... 

복잡하니 자세한 설명은 줄일게. 


이론만 배우냐? 

많은 학교에서 실제 processor를 구현해보는 과제를 내주고 있어. 

실리콘칩으로 진짜 만드는 건 아니고 Verilog같은 하드웨어 기술 언어를 이용해 

pipeline과 ALU등을 코드로 구현해야.

(ARM같은 반도체 회사도 하드웨어 기술 언어로 설계한 코드를 

삼성같은 반도체 제조 회사에 판매한다! 갤럭시에 들어간 엑시노스도 

ARM에서 설계 코드 라이센스를 구매한 후 삼성에서 실리콘칩으로 제조한 거임.)


5. 운영체제(Operating System)


컴공의 꽃이라고 할 수 있는 과목이야. 운영체제 사용법이 아닌 운영체제를 어떻게 구현하는지를 배워.


배우는 내용은 크게 1. 프로세스 관리, 2. 메모리 관리, 3. File-system으로 나눌 수 있어.

컴공 과목답게 이론에서 끝나지 않고 실제 구현하는 프로젝트도 있는데,

프린스턴 대학교에서 학부생 교육 목적으로 개발한 Pintos Project가 널리 쓰이고 있어.

해외 대학들 뿐만 아니라 우리나라도 서울대, 카이스트, 포스텍 등 컴퓨터 공학을 제대로 가르치는 대학에선 많이들 사용하고 있어.

디테일하게 설명하면 복잡해지니 간단하게 설명하자면, 

이쪽 분야가 그렇듯

"어떻게 하면 컴퓨터 시스템을 최대한 

효율적이고 안전하고 사용하기 쉽게 만들까"라는 것이 이 과목의 목표야.


프로세스를 예로 들어보자. 

프로세스는 현재 실행되고 있는 컴퓨터 프로그램이야. 

프로그램과 프로세스의 차이가 뭐냐면, 

바탕화면에 크롬 "프로그램"이 있지? 

이걸 더블클릭해서 실행하면 하드디스크에 있던 

크롬 프로그램을 메모리로 복사해서

 "프로세스"가 시작되는 거야. 


크롬 프로그램을 또 실행하면? 

프로세스가 하나 더 실행되는 거지. 

프로그램=실행코드, 프로세스=실행중인 task. ㅇㅋ? 

아무튼, 초기 컴퓨터는 한 번에 한 개의 프로세스밖에 실행하지 못했어. 

계산기를 실행하고 끝날 때까지 기다렸다가 

문서작성 프로그램을 실행하고, 

문서작성을 다 끝내고 나서야 다른 일을 할 수 있고... 이런 식이었지.


그런데 스케줄링 기법을 적용해서 

심지어 하나의 CPU 코어만을 가지고도 

multi-processing을 할 수 있게 된 거야. 


스케줄링 기법이란 

예를 들어, 프로세스가 어느 정도 일을 했다고 판단하면(물론 OS가 판단함) 

현재 프로세스는 ready queue에 집어넣고, 

그 프로세스가 사용하던 CPU를 다른 프로세스가 차지하고... 

이런 식으로 마치 여러 프로세스가 동시에 일을 하는 것 처럼 만드는 거야. 

OS 과목의 디테일에 대해 더 설명하면 매우 복잡해지니 설명은 여기서 줄이도록 함.



자 졸업을 하면 이제 어떤 직장을 구해야 할까? 

여기 까지는 다들 같은데, 취업을 하면서 다들 달라진다. 

그런데 아래 3가지 직종 어느 곳을 가서 

어떤 일을 하더라도 학교 전공이 중요하다. 

그러니까 대학생 컴공들은 무조건 학교공부 열심히 해라.


졸업할 때가 되면, 나는 컴공을 했으니 IT관련직종을 가야지! <- 라고 생각하고

구인구직 사이트에 등록되는 각종 공채에 IT관련직종은 모조리 지원한다.

여기서 흔한 실수가 벌어진다. 

향후에 어떤 일이 벌어질지. 

이 지원과정이 앞으로 본인 인생의 테크트리를 어떻게 타야할지를 

나도 모르게 결정하는 행위라는 거지.




1. 개발자



위에서 말했듯이 

우리나라 컴퓨터 관련학과에서는 

소프트웨어 관련 과목을 주로 배운다.


그래서 하드웨어 따위는 잘 모른다. 

고작해야 세븐세그먼트를 조작하는 

임베디드 잠깐 배우는게 전부다.


그래서 대부분 개발자가 된다. 

사실 개발자가 천조국에서는 매우 대접받는 직종인데 

우리나라에선 그렇지 않지. 


개발자에도 종류가 매우 많다. 

금융쪽 전문 개발을 하는 사람이 있는가 하면, 

제조쪽도 있고, 게임도 있지.


한 우물만 파는 개발자가 있는가 하면, 

소위 SI(System Integration)회사에 취직해서 여기 저기 옮겨다니며 

닥치는 대로 개발하는 개발자도 있다. <- 이게 엄청 많다. 

(대표적으로 샘숭SDS, LGCNS 등이 있다.)



-> 개발자에 대해 조언을 한 마디 하자면, 큰 회사든 작은 회사든, 내 제품을 가지고 있고, 그 제품을 팔고, 그 제품을 업그레이드하는 회사에서 개발자로 일하는 것이 좋다는 것이다. 처음 부터 대형 SI 회사에 취직하면 내가 개발하는 모듈이 전체의 어떤 부분을 차지하는지도 모르고, 무슨 일을 하는 모듈인지도 모르고, 그저 입력 데이터 샘플 받아서 특정 연산을 처리하여 다른 모듈로 패스하는 것만 개발한다. 전체를 볼 수 있는 곳에서 착실하게 배우면 기회가 온다.




-> 그리고, 개발은 여러가지 종류의 개발이 있다. 이를테면 금융권에서 HTS라는 주식 매매 프로그램을 개발하는 사람이 있는가 하면, 게임을 개발하는 사람이 있다. 각자 자기 분야에서는 ㅆㅆㅅㅌㅊ 능력을 인정받은 사람인데, 서로 직종을 바꿔놓으면 ㅍㅌㅊ 정도 밖에 안된다. 그 만큼 같은 개발자라도 세부 전공이 존재한다. 의대 게이들이 내과 안과 외과 같은 세부전공을 정하는 것 처럼 말이다. 그래서 잘 생각해서 결정해라. 한 우물을 파는게 좋다.




-> 전문적인 프로그래머가 되더라도 오픈소스쪽 활동도 열심히 하자. 다 나를 위해 좋은 일이 된다.


-> 아, 가끔 자기는 전문 개발자 되겠다고 학교 공부 안 따라가고 학원가서 자바 부터 배우는 바보들 있는데, 이건 스스로를 망치는 행위다. 절대 그러면 안된다.








2. 운영



대부분 갑질을 하는 곳이다. 

고객이라는 이야기다. 생각하기 나름이지만, 

신입으로 이 곳을 택하면 이직은 상대적으로 쉽지 않은 편이다.


대부분의 회사는 전산 시스템을 자체적으로 가지고 있다.

회사 홈페이지가 돌아가는 웹 서버, 메일 서버를 비롯하여 

각종 사내/외 서비스를 제공하기 위한 IT 인프라(H/W, S/W)를 

모두 관리하는 직종이고,


대부분의 회사에 있다.

IT운영부서로 통칭하는데, 

내 회사 자산을 관리하고, 운영하는 직종이라고 생각하면 된다. 


물론 하드웨어와 소프트웨어가 나뉘어져 있는데, 

같이 하는 경우도 있고, 정규직은 소프트웨어만 하고 

하드웨어는 외주를 주는 경우도 있고, 별의별 방식이 다 있다.


대부분 그냥 사무실에 앉아서 일한다.


짧은 직장 생활이지만, 한 가지 조언을 하자면,


-> IT로 벌어먹고 사는 회사의 IT운영부서/팀에 취직하는 것이 그렇지 않은 회사에 취직하는 것 보다 훨씬 좋다.


-> 이를테면 제약회사의 IT운영부서 보다, IT로 먹고사는 네이버/다음/게임회사 등과 같은 IT회사의 IT운영부서 취업이 낫다는 이야기다.


-> 왜 그런지 궁금하나? 이왕 제약 회사를 예로 들었으니, 제약회사로 치면, 회사 경영진의 시각으로 보면 IT는 돈을 벌어오는 부서가 아니라 쓰는 부서다. 당연히 투자를 잘 받지 못하고 빛이 안난다. 승진할 때도 다른 부서보다 적은 인원수만 진급하고, 신입사원도 잘 받지 못한다. 당연하다. 제약회사는 약만들고 파는놈이 장땡이다. 외냐? 제약회사니까..


-> 반대로 네이버나 다음을 들면, IT 자체로 돈을 버는 회사니까 IT운영부서에 훨씬 많은 투자를 한다. 빛도 많이 본다. 신입사원도 많이 받는다. 어느게 더 나은지 판단이 오냐? KT나 SK를 예로 들면 다른 운영팀 보다 클라우드 운영팀이 최근 몇년 새 사내의 많은 투자를 받고 있다고 보면 된다.


-> 그렇다고 제약회사가 무조건 안좋다는 건 아니다. 요즘은 IT에 대한 시각이 많이 바뀌었다. IT 투자 없이는 회사가 발전할 수 없다는 경영마인드를 가진 기업도 꽤 많아졌다. 내가 아는 모 증권회사는 전산에 엄청난 투자를 한다. 이제는 주식과 선물의 매매가 거의 전산으로 이루어지다 보니, 이쪽에 많은 투자를 했다. 그래서 다른 곳 보다 좋은 대우를 받는다. 그런데 이런 건 대졸신입이 사전에 확인하기가 노무노무 어렵다. 따라서, 평균적인 시각에서 설명했다. 



-> 또, 이러한 운영팀 중 규모가 좀 있는 곳에는 계약직을 종종 사용한다. 소위 OP라고하는 운영팀 소속 계약직인데, 전문대나온 애들이 가끔 취업한다. 그런데 운영을 하고 싶어하지 않고 엔지니어가 되고 싶어하는 경우가 많다.


OP가 주로 근무하는 곳이 이런 곳. 

주로 모니터링을 하고, 뭔가 문제가 발생하면 보고한다. 

자기가 직접 하는 일은 거의 없다. <- 가능하면 이런 일 하지마라.






3. 엔지니어


은근히 이 직종 종사자가 생각보다 많다. 

근데 이러한 직종이 있는지 모르는 대학생이 많아서 신입 유입이 적은편이다.


물론 당연히 하드웨어나 소프트웨어 쪽으로 나뉜다. 

내가 이 쪽에서 일한다. 당연 (좀 더 자세히) 쓴다.




하드웨어를 다룬다. 흔히 알려진 서버를 비롯해서 스토리지, 네트워크, 보안, 관제 등 분야는 다양하다.


제품을 만드는 회사를 벤더라고 하고, 벤더사 물건을 받아서 판매하는 총판, 리셀러 등 다양한 업체가 있는데,


대표적인 하드웨어 벤더는 아래와 같다. (빠진 게 있더라도 이해바란다.)




이 중 SUN은 망했고 오라클이 인수 합병했다.


소프트웨어 벤더는 너무 많지만, 대표적으로 아래와 같다.




국산 하나 넣어봤다.






암튼 이런 곳이 있다. 

이런 회사에서도 앞 서 설명했던 개발자, 운영 등을 뽑지만,

다만, 여기에서는 엔지니어에 대해 설명한다.


이러한 회사에서 엔지니어로 일을 시작하게 되면 

개발된 자사 제품이 어떤 고객에게 판매되어 설치를 해야 하거나,


문제가 생겨 수리를 해야 하거나, 

고객의 요구대로 변경을 해야하는 등과 같은 일을 맡게 된다.


이 직종은 24시간 언제든 출동해야 할 수도 있고, 

고객을 직접 상대해야 되기 때문에 커뮤니케이션 스킬도 필요하다.


그러나 이 직종이 힘든 만큼 수년간 경력을 쌓게 되면 

IT 인프라의 하드웨어/소프트웨어에 대한 전체 구성을 

컨설팅할 수 있는 능력을 가지게 된다.

그럼 고액 연봉을 받으며 일할 수도 있다.




-> 하드웨어 보다는 소프트웨어가 낫다.


-> 하드웨어는 이제 벤더간 격차도 거의 없고, 시장이 이미 포화상태인데다 중국(대표적으로 화웨이)에서 저가로 공격하고 있어 쉽지 않다.


-> 이왕 갈 거면, 벤더사로 가는게 좋다. 벤더사 물건을 받아서 판매하는 업체는 아무래도 한계가 있다. 그러나 총판사 정도의 규모라면 나쁘지 않다.


-> 하드웨어를 하건 소프트웨어를 하건 반대 기술도 배워둬야 한다. 그래야 전체 그림을 그릴 수 있다.


-> 가끔, 고객의 눈에 들어서 (2)운영으로 이직하는 경우도 있다.


4.대학원


대학원 나오면 일반적으로 '연구원'이라고 불리는 쪽에 지원을 많이 한다.

내가 말한 내용은 대부분 학사의 경우이고,

석/박사 출신들은 특정 제품이나 솔루션을 개발(코딩하는게 아니다.)하기 위한 설계를 하거나, 

설계를 하기 위한 특정 분야의 연구 목적으로 인력을 뽑는다.


학사로 컴공을 하고,

대학원에서 세부 전공을 택할 때, 빅데이터를 택했다고 치면,

빅데이터를 이용하여 매출을 많이 일으킬 수 있는 분야. 

이를테면 비가 오는 날에는 빵이 많이 팔리더라 <- 라는 분석을 얻기 위한. 따위의,

위에서 설명한 내용보다 한 차원 위쪽의 일을 한다고 보면 된다.


논문 1년 포함해서 한 3년정도 걸린다고 치면,

대리 직급 정도 받아서 입사한다고 생각하면 쉽다. 경력은 대부분 쳐 준다.


학사 칼 취업하고 3년 지난 애들보다 조금 더 받는데, 

그 차이는 많지 않다.

나는 학사 칼취업하고, 회사 다니면서 석사를 했는데, 

석사 따도 연봉 올려주지 않더라.

석/박사 게이는 그에 맞는 직종이 따로 있다.


대학원 가서 메리트 있는 공부를 하거나 

좋은 논문을 쓸게 아니라면, 바로 취업이 낫다고 본다.


내 기준에서 대학원은, 가고싶어야 한다.

다른 목적이 있어서 가는 대학원은 결국 시간낭비다.


졸업 전 한가지 충고를 하자면 (혹시 컴공 가고싶은 새내기들포함)

수학, 영어는 지금 못하더라도, 

열심히 공부 할 각오가 되어 있어야 한다.

학교 공부는 어떻게든 가능하지만, 필드로 나가면 

대부분의 메뉴얼이 영어고, 

한글 문서로 공부하는 건 한계가 있다.

수학을 모르면 구조적, 논리적 사고가 불가해진다. 

계산을 잘해야된다는게 아니다. 수학은 꼭 필요하다. 

적어도 이산수학이라도...

난 대학 3학년 때, 시간 내서 공통수학 정석 다시봤다. 

끝까지 보진 못했지만..