컴공과의 타임머신

타임머신이 필요한 컴공과! 당신을 대학교 1학년 1학기 첫 수업으로 되돌려 앉혀서 수업을 같이 들어 드리겠습니다!


※ 이 글은 제이펍 출판사의 현지환님과 수다를 떨다가 "이런 내용의 책, 재밌지 않을까?" 라는 이야기가 나와서 쓰기 시작한 글입니다. 시리즈물로 제가 생각한 앞 부분만 살짝 연재해볼 생각입니다. 책으로 내보자는 이야기도 있었는데 제가 실력이 없으므로 안될겁니다. 만약 출판하게 되는 경우는 제이펍 출판사가 선점권을 갖습니다. 근데 이 글이 계속 연재될진 알 수 없...


프롤로그. 나는 누구, 여긴 어디

대한민국의 많은 고등학생들은 수능을 보고 대학을 갑니다. 그리고 상당수가 컴퓨터 관련 학과를 고릅니다. 그리고 그들 앞에 놓여지는 시련은 실로 가혹합니다. 이제까지는 웹툰 브라우저, 게임 실행기로 쓰여왔던 컴퓨터가 돌연 자기를 깊숙히 매만져달라고, 프로그래밍 언어로 속삭여달라고 달려듭니다!

으아아아 저리가! 나는 너 다룰 줄 몰라!

이 글은 저렇게 달려드는 컴퓨터를 어떻게 상대해야하는지, 기초를 알려주는 글입니다.

예상 독자는 다음과 같습니다.

  1. 컴공에 입학했는데 교수님의 강의를 듣고 멘붕한 그대
  2. 멍하니 시간이 흘러 취업이 앞에 닥쳐있지만 컴공과 치곤 아무것도 할 줄 몰라 멘붕이 오는 그대
  3. 학교 강의는 재미가 없는데 어떻게 공부해야하는지 모르겠는 그대

따라서 이미 컴퓨터랑 프로그래밍하면서 잘 노는 분들은 이 글이 별로 필요가 없을것 같습니다.

이 글을 쓴 이유

저는 중학생때부터 코딩을 했습니다. 사실 그 당시 한 것이 정말 유의미한 무언가를 만들어내었는가에 대해선 웃음밖에 안나오지만, 저 나름대로는 저 스스로 제가 좋아하는 것을 찾아낸 기회였다고 생각합니다. 그리고 대학에 왔더니 강의가 너무 잔혹한겁니다.

"어떻게 이렇게 설명해주고 학생들보고 이해하라는거지?"

저는 그래도 욕심이 있었던 편이라서 나름대로 독학도 하면서 버텼지만, 주위를 둘러보면 그렇지도 않은 것 같더라구요. 다들 코딩 포기자가 되어서 코딩을 해야하는 강의는 죄다 집어던진다던가 하는 모습들을 보면서 참 씁쓸했습니다.

"왜 모두가 코딩을 포기해야 하는걸까?"

대학에선 의존할 만한 것이 무서운 교수님, 겁주는 선배님, 그리고 외계어 같은 교재밖에 없습니다. 하지만 모두 접근하기 어려운 존재들이었습니다. 특히 교재! 교재들은 학생을 배려를 해주지 않아요! 저는 그런 교재들을 보면서 아쉬움이 항상 남았었습니다.

나 혼자 자습하기 좋은 책은 없는걸까?

대학 입학 후로 긴 시간이 흘렀지만 저는 결국 그런 책은 찾아내지 못했습니다. 그래서 아쉬운데로 제가 떠오르는데로 노하우 겸 실패 경험담 등을 공유해보고자 합니다.


배울게 너무 많아!

컴공과에 오면 가장 먼저 느끼는 것은 컴퓨터에 대해 배우는 것이 너무 많다는 점입니다. 제가 다닌 학교의 경우는 1학년 1학기때 컴퓨터 프로그래밍 관련해서만 HTML, C, 컴퓨터 개론의 3과목을 배웠어요. 당연히 이 정보들을 한 번에 배운다고 소화가 될 리가 없습니다. 그리고 소화가 안 된 상태로 중간고사와 기말고사를 보고 성적표를 받아보죠.

아, 나 학교 때려칠까?

2학기때는 좀 더 열심히 해보리라 다짐하지만 2학기에 배우는 내용들은 1학기를 전제로 깔고 있습니다. 제 경우에는 2학기때는 JavaScript, C 심화를 배웠던 것 같네요. 알 수 없는 소리가 길어지는 수업이 점점 듣기 싫어지고, 그렇게 하나 둘 코딩을 포기하기 시작합니다. 그러다보면 졸업을 앞두고도 구구단조차 제대로 짜지 못하는 상황이 벌어집니다.

아, 나 학교 왜 다녔지?

이 생각이 드는건 당연합니다. 학생은 잘못이 없어요! 너무 많은걸 빨리 먹으려고 해서 체했을 뿐이에요. 우리는 무엇을 언제 어떻게 먹어야 하는지를 알아야할 필요가 있습니다. 너무 서두르지 맙시다. 빨리 가는 것 보다 제대로 가는 것이 중요합니다.

우리는 뷔페에 왔다

자, 그럼 우리가 상대해야할 컴퓨터 프로그래밍이란 무엇인지 알아봅시다. 컴퓨터 프로그래밍쪽 용어 중에 스파게티 코드라는 말이 있는데, 스파게티 면발 마냥 뒤섞인 프로그램을 말합니다. 그런데 사실 우리가 배워야할 과목들도 심층적으로 보면 스파게티마냥 뒤섞여 있어요. 우리가 할 일은 적당히 먹기 좋게 풀어낸 다음 맛있게 먹는 것입니다.

하드웨어와 소프트웨어

컴퓨터는 크게 두 가지로 나눌 수 있습니다. 맘대로 안 될때 걷어 찰 수 있는 부분(Hardware)와 걷어찰 수 없는 부분(Software)으로 말이죠. 그래서 사실 컴퓨터를 배운다고 하면 두 가지를 모두 배우게 되는 경향이 있습니다. 프로그래밍은 이 중에 소프트웨어에 속합니다. 하드웨어에 가까운 대표적인 예는 컴퓨터 구조, 마이크로프로세서 같은 것들이 있겠네요.

범람하는 용어 정리하기

우리 앞에는 매우 많은 용어들이 범람합니다. 영어도 섞여있고 약어라서 겁이 납니다. 하지만 뭐하는 녀석인지 알고 나면 생각보다 덜 무서워집니다. 함께 정리해보도록 합시다.

프로그래밍 언어

프로그래밍 언어는 컴퓨터랑 의사소통할때 쓰는 일종의 언어입니다. 영어, 중국어, 일본어 같은 일종의 언어에요. 그러다보니 서로 비슷한 언어도 있고, 아예 다른 느낌의 언어도 존재해요. 예를 들어 아직도 많은 대학들이 1학년때 다루는 C 언어는 나중에 배우는 C++과 비슷합니다. 하지만 Java와 JavaScript처럼 이름만 비슷하고 딴판인 언어도 존재해요. 우리가 전세계의 모든 언어를 다 알 필요는 없는 것 처럼 모든 언어를 잘 해야할 필요는 없어요. 하지만 자신이 주력으로 쓸 언어는 한 정도 정해야 합니다. 물론 그 언어를 대학에서 배운 언어 안에서 정할 필요는 절대로 없습니다. (언어에 대한 좀 더 깊은 이야기는 다음 장에서 이야기 합시다)

언어를 프로그램으로

프로그래밍 언어는 사람이 보라고 만든거에요. 당연히 기본적으로 컴퓨터는 그 자체만으로는 이해할 수 없어요. 컴퓨터가 알아먹을 수 있도록 변환하는 과정이 필요할 수 있어요. 그래서 "빌드"란 작업을 해서 "컴파일"과 "링킹"을 합니다. 이런 작업을 해주는 프로그램을 "컴파일러"라고 하는데, 보통 학교에선 Visual Studio라는걸 많이 쓰죠. 컴파일러가 필요한 대표적인 언어로는 C가 있습니다.

이런 작업이 필요 없는 프로그래밍 언어도 존재해요. 그런 언어는 "인터프리트 언어"라고 하는데(혹은 "스크립트 언어"), 이런 언어는 컴퓨터가 실시간으로 조금씩 읽어서 해석해요. 기본적으로 컴파일러가 필요 없는 대표적인 언어로는 JavaScript가 있습니다.

프로그램을 만들 때 쓰는 프로그램

교수님들 취향에 따라서 극명하게 갈리는 편이지만, 그래도 프로그램을 만드려면 프로그램이 필요해요. 위에서 언급한 Visual Studio같은 것들이 말이죠. 학교에서는 꼭 그 프로그램을 쓸 것을 강요하는데, 사실 그럴 필요는 없어요. 익숙한 도구를 쓰더라도 바르게(빠르게가 아닙니다!) 익히는 것이 더 중요합니다.

가령 예를 들자면 HTML 강의에서 메모장(nodepad.exe)를 쓰라고 하는 교수님들이 많아요. 하지만 교수님들이 메모장을 쓰라고 하는 것은 나모 웹 에디터나 드림위버 같은 위지윅 프로그램을 써서 대충 넘어가는 것을 막는게 목적이에요. 당연한 소리지만 HTML을 다루는 프로그래머들도 메모장으로 실제 작업을 하진 않습니다. 장인은 도구를 가리지 않는 다는 말이 있는데 거짓말이에요. 장인은 이미 좋은 도구를 쓰고 있습니다. (좋은 도구는 뭐가 있을지도 나중에 다루도록 하겠습니다)

운영체제

한국에서 대부분의 사람들은 Windows만 쓰고도 살 수 있습니다. 하지만 컴공과에 던져진 사람들은 갑작스레 다른 세계의 존재들과 조우하고, 멘붕하게 됩니다. 바로 다른 운영체제인데요, 이렇게 설명하는 것은 너무 무식한 소리 같지만, 운영체제는 컴퓨터 프로그램을 관리하는 대장 같은 녀석입니다. 당연히 여러 종류가 존재합니다. 당장에 이것들을 쓰기 시작해야하는 것은 아니겠지만 그래도 이름 정도는 알아두는 것이 좋지 않을까요?

차림표

사실 여기에 모든 것을 다 나열할 수는 없어요. 뷔페에 가도 전 세계 모든 요리를 차려놓지는 않잖아요? 반대로, 여기 나온 모든 것을 알 필요도 없습니다. 여태까지, 그리고 앞으로도 계속 들어야할 단어들을 단순무식하게 분류해서 나열해보았습니다. 개략적으로 이런 것들이 있다는 정도만 알고 갑시다.

프로그래밍 언어

종류 언어 목록
컴파일한 결과를 실행하는것이 기본인 언어 C, C++, C#, Java, Objective-C 등등
컴파일 하지 않고 바로 실행하는 것이 기본인 언어 JavaScript, Python, Ruby, PHP 등등
프로그램을 만들땐 필요하지만 프로그래밍 언어는 아닌 것 HTML, CSS, XML 등등

표를 보시면 "컴파일한 결과를 실행하는것이 기본인 언어"와 "컴파일 하지 않고 바로 실행하는 것이 기본인 언어"로 나누었습니다. 여기서 중요한 부분은 "기본"이란 단어인데, 기본적으로 C는 컴파일해서 쓰는 것이 기본이고, 그렇게 설계된 언어이지만, 사실 만들려고만 하면 컴파일하지 않고 쓸 수 있게 할 수 있기 때문입니다. 반대로 JavaScript도 컴파일해서 사용할 수 있도록 만들 수 있고 말이죠. 그렇기에 사실 이 표의 구분은 무의미할지도 모릅니다. 하지만 적어도 통상적인 사용법 정도는 알아두는 것이 좋다고 생각합니다.

프로그램을 만들때 쓰는 프로그램

종류 프로그램 목록
컴파일러 (Windows C용) Visual Studio, MingW 등등
컴파일러 (기타) gcc, clang, cc 등등
컴파일러 (다른 언어) javac, rustc 등등
통합 개발 환경(C용 IDE) Visual Studio, Dev-C++, CLion 등등
통합 개발 환경 (다른 언어) 이클립스(Eclipse), IntelliJ, Android Studio, emacs 등등
TEXT 에디터 notepad, notepad++, Sublime Text, Atom, Visual Studio Code, vim 등등

운영체제

종류 운영체제 목록
MicroSoft Windows 제품군, Windows Server 제품군
Linux 우분투(Ubuntu), 센투스(CentOS), 페도라(Fedora) Arch Linux 등등
Apple iOS, MAC OS X
Google Android

프로그래밍 강의를 하지만 그 자체는 다른 프로그래밍 언어를 쓰는 경우

  • 제이쿼리(jQuery), Spring 등의 프레임워크나 라이브러리 과목
  • ASP, JSP같은 특정 언어의 서버 페이지를 다루는 과목
  • 자료구조, 알고리즘 같은 이론 과목
  • Android, iOS 기반의 프로그램 개발 과목

기타 프로그래밍과 밀접한 과목들

  • 이산수학 (이산구조)
  • 자료구조
  • 파일구조
  • 데이터베이스
  • 논리회로
  • 알고리즘

이것들은 사실 결국 다 맛을 조금씩은 봐야하는 녀석들이지만 겁을 먹을 필요는 없습니다. 앞으로 재밌는 공부로의 여정이 되었으면 좋겠습니다.


수정 안내

  • kyagrd님의 지적에 따라 컴퓨터 공학/과학과 컴파일/인터프리트 언어에 대한 설명을 변경했습니다.

2장 이어서 보기