나의 프로그래밍 공부법 - 2.2. 전산학과의 필수 이수 컬리큘럼이 중요한 이유

2012. 11. 11. 16:01기타/나의 프로그래밍 공부법

이번 글은 나중에 알고 보니, 학교를 다니면서 배운 것들이 큰 도움이 되었다라는 필자 자신의 경험담을 적은 것이다. 필자가 대학을 졸업한지 15년이 되었고, 그 사이에 수많은 신 기술이나 개념, 패러다임 등이 생겨났지만 기본적인 부분은 큰 차이가 없었다. 그렇기에 더더욱 새로운 기술이나 개념이 등장하면 미친듯이 쫒아가는 신봉자들 대부분이 기초 지식(베이스)가 약하다는 점에 대해서 쉽게 이해가 된다.


여러분이 확실한 기초를 다진 상태라면 그 어떤 유행이 닥쳐와도 그것의 핵심이 무엇인지, 그리고 그 중에 쓰레기가 무엇인지를 쉽게 파악할 수 있을 것이다. 유행이 꺼지면 금방 사라질 쓰레기 기술을 붙잡고 자신의 중요한 시간과 비용을 낭비하는 실수를 반복하지 않으려면 무엇보다도 가장 기초적이고 기본적인 커리큘럼을 제대로 공부할 필요가 있다. 그리고 그것이 "프로그래밍 공부"를 더 잘할 수 있는 가장 빠른 지름길이다.


------------------------

전산학과의 필수 이수 커리큘럼이 중요한 이유


여러분이 현재 전산학을 전공하고 있거나 앞으로 전공할 예정이라면, 훌륭한 프로그래머가 되기 위해서는 가장 기초적이면서도 필수 학문인 전공 과목을 제대로 공부하여 이수하는 것이 무엇보다도 중요하다.


다음은 모 대학의 컴퓨터공학부의 교과목 목록 일부이다. 학교마다 다소 차이가 있겠지만, 여기에서는 이 목록을 중심으로 전산학과 커리큘럼에 대해서 알아보도록 하겠다.


과목 이름

학습 목표

컴퓨터 공학 개론

(Introduction to Computer Engineering)

컴퓨터 시스템의 하드웨어적 구성과 소프트웨어적 구성, 컴퓨터 시스템의 동작 원리, 운영체제와 응용 소프트웨어 등에 대한 기본 원리를 이해하며, 각종 응용 소프트웨어들을 활용하기 위한 능력을 실습을 통해 학습한다.

C 프로그래밍

(C programming)

C언어 프로그램 작성을 위한 구조적 언어의 기본적인 개념들과 구현 기술에서부터 언어의 활용까지 이론과 실습을 병행하여 학습한다.

비주얼 프로그래밍

(Visual Programing)

Visual Basic을 이용하여 비주얼 프로그래밍에 관한 이론을 배우며 실습을 통하여 프로그램 개발 능력을 익힌다.

윈도우 프로그래밍

(Windows Programming)

기본적인 프로그래밍에서 출발하여 윈도우 환경에서 비주얼하게 보여줄 수 있는 Visual 언어를 학습하고 이를 통하여 윈도우 프로그래밍에 대한 것을 학습한다.

리눅스 시스템

(Linux System)

컴퓨터 하드웨어와 소프트웨어의 기본 원리를 이해하고, Linux에서의 사용법 및 응용 프로그램 및 인터넷에 관련된 사항을 배운다.

공학 설계 입문

(Introduction to Engineering Design)

공학 설계를 위한 프로젝트 기반의 접근 방법을 통해, 팀별 작업과 설계 프로젝트를 효과적으로 수행하기 위한 개념 설계 방법 및 프로젝트 관리 도구들을 응용하는 방법을 배운다.

자료 구조

(Data Structure)

프로그래밍의 대상이 되는 자료를 컴퓨터 메모리 내에 표현하는 배열, 스택, , 트리, 그래프 등의 다양한 자료 구조들에 대한 기본적인 특성과 표현 방법들을 이해하고 프로그램 예제들을 통하여 관련 연산들을 조작할 수 있는 알고리즘과 구현 기법 등을 습득한다.

고급 프로그래밍

(Advanced Programming)

기본 C언어를 바탕으로 객체지향언어인 C++ 언어의 문법과 의미를 학습하고, 프로그램 능력을 향상시키기 위한 설계와 실습을 배운다.

인터넷 프로그래밍

(Internet Programming)

인터넷과 관련된 기본적인 개념, 용어, 제공되는 다양한 서비스를 공부하고, 인터넷 상에서 정보 표현을 위해 사용되고 있는 다양한 프로그래밍을 배운다. 인터넷과 웹(Web), 인터넷과 컴퓨터 네트워크에 대한 전반적인 이해를 돕는다.

논리 회로 설계

(Logic Circuits Design)

컴퓨터의 원리를 습득하기 위해 수의 진법과 연산, 코드 변환, 전자논리회로 등을 이해한다. 부울 대수를 기초로 조합 및 순서 논리회로의 분석과 설계를 하며, 기억장치, 입출력 장치 등을 각종 디지털 회로의 기본 원리를 배운다.

운영체제

(Operating System)

컴퓨터의 효율적인 관리와 쉬운 사용을 위해 제공되는 운영체제의 이해를 위하여 프로세스 관리, 기억장치 관리, 주변기기 관리, 파일 관리 등의 효율적 시스템 관리기법에 대해 학습한다.

컴퓨터 구조

(Computer Architecture)

컴퓨터를 구성하는 연산 및 제어장치, 기억장치, 입출력 장치 등의 논리적 구조와 마이크로 프로그래밍 기법을 학습하고 이를 이용한 컴퓨터를 설계하는 능력을 배양한다.

데이터베이스

(Database)

데이터베이스와 관계 데이터베이스 시스템에 대한 기본적인 개념을 학습하고, 데이터 모델링과 데이터베이스 설계에 대해 학습한다. 또한 관계 데이터베이스 시스템의 질의어인 SQL을 배우고 실습한다. 이를 통하여 다양한 상업용 데이터베이스관리 시스템을 사용할 수 있는 능력을 기른다.

객체 지향 프로그래밍

(Object-Oriented Programming)

객체 및 클래스, 캡슐화, 상속, 지연 바인딩 등 객체지향 패러다임의 주요개념을 학습하고 객체지향 프로그램 언어의 구조 및 특성을 이해하고 이를 이용한 프로그래밍 능력을 향상시킨다.

네트워크 및 데이터 통신

(Network and Data Communication)

LAN, WAN, ISDN, 초고속 통신망, Internet 등의 통신망에서 사용되는 전송 방식, 데이터의 코딩 기법, 전송 기법, 동기화 방법, 오류 탐지 및 복구 기법 등을 학습하고 멀티미디어의 통신 IPv6, 무선 네트워크 등에 대해 학습한다.

알고리즘

(Algorithm)

주어진 문제를 효과적으로 해결하기 위한 알고리즘을 개발하기 위한 기초 지식들과 다양한 기법들을 문제 유형별로 학습한다. 알고리즘의 표현 방식, 기능, 난이도 비교 등을 통해 효율적인 알고리즘을 분유하고 활용한다.

인터넷 프로토콜

(Internet Protocol)

컴퓨터 통신 프로토콜의 표준처럼 사용되고 있는 Internet Protocol의 구조와 동작원리, 핵심 프로토콜인 IP, TCP, UDP 등의 원리, 그리고 중요한 응용 프로토콜인 HTTP, TELNET, FTP, SMTP, POP 등의 구조와 원리를 배운다.

임베디드 시스템

(Embedded System)

임베디드 시스템에 대한 전반적인 개념을 확립하고, 임베디드 시스템을 구성하는 개개의 구성 요소에 대한 개략적인 내용에 대하여 학습한다. 임베디드 시스템 실험 교육 장치를 사용하여 하드웨어 구조와 소프트웨어 구성 과정을 이해한다.

오토마타

(Automata)

유한 상태 기계 및 형식 언어 등의 형식 모델, 튜링 머신, Recursive 이론, 복잡도 이론 등을 학습하고, 상태 변화의 개념을 이용하여 컴파일러나 기타 소프트웨어 설계에 응용할 수 있는 기초를 학습한다. 튜링 기계의 종류, 문법, 성형언어, 정규 수식 및 이들의 상호 관련성과 생성 및 인식 과정 등을 포함한다.

인공지능

(Artificial Intelligence)

지식 표현 방법, 컴퓨터 학습 및 인식, 자연 언어 처리, 자동 프로그래밍, 이론 증명, 전문가 시스템 등 지능 지향 소프트웨어에 관련된 이론과 기법을 학습한다.

소프트웨어 공학

(Software Engineering)

효율적인 소프트웨어 프로젝트 수행을 위한 전통적 소프트웨어 개발 과정을 살펴보고, 객체 지향 소프트웨어 공학을 위한 객체지향 분석 및 설계, 객체지향 구현 및 테스트, 객체지향 CASE 등에 대하여 학습하며 실습을 통하여 개발 능력을 배양한다.

네트워크 프로그래밍

(Network Programming)

트랜스포트 계층 위에서 동작하는 네트워크 응용 프로그램 작성 방법을 배우며 BSD 소켓을 중심으로 Winsock, JavaSocket 등 관련 TCP/IP 기반의 네트워크 프로그래밍 기술에 대해서도 배운다. 전 과정을 실습을 통해 네트워크 응용 프로그램 작성 능력을 높인다.

마이크로프로세서

(Microprocessor)

컴퓨터 하드웨어의 중심부인 마이크로 프로세서의 기본 구조와 다양한 종류의 프로세서들의 특징을 비교 검토하며, 특히 마이크로 프로세서의 하드웨어 구성, 마이크로 프로세서의 명령어 구조를 익히고 프로그램 작성 능력을 배양한다.

컴퓨터 그래픽스

(Computer Graphics)

컴퓨터의 2차원 및 3차원 그래픽스를 위한 하드웨어, 소프트웨어 구성, 데이터 구조 및 알고리즘, 기술 등을 학습한다. 특히 체계적이고 기초적인 이론 강의와 오픈 그래픽스 라이브러리(OpenGL)를 이용한 실습을 통하여 컴퓨터 그래픽스에 대하여 교육한다.

컴파일러

(Compiler)

컴파일러 구성에 필요한 컴파일 과정, 문법 분석, 파싱, 의미 분석, 기억장소 관리, 코드 생성, 오류 취급 등의 기본 이론과 컴파일러 구성 기법을 학습한다.

정보 보호론

(Information Security)

정보 보호의 필요성에 대해 학습하며 구체적으로 정수론, 고전/현대 암호기술, 대칭키/공개키 암호 알고리즘과 메시지/사용자 인증 기술 및 키 관리 기술 등 정보 보호를 위한 기본적 이론을 학습하고 정보 보호 기술을 이용하여 응용 분야에 접목하는 방안에 대해 배운다.

[2-1] 전자계산학과 주요 커리큘럼


여기에 나열한 과목 이외에도 다양한 학문들을 다루고 있고, 이 중에 대부분은 필자가 대학교에 재학 중이던 18년 전부터 가르치던 커리큘럼들이다. 필자 역시 전산학을 전공하는 학생 입장일 때에는 잘 몰랐었지만, 지금 다시 찬찬히 살펴 보니 대학 시절에 이러한 전공 과목들만 제대로 열심히 공부한다면 누구나 좋은 프로그래머가 되기 위한 준비를 충분히 할 수 있다고 생각된다. 필자 역시 대학 전공 과목에서 배운 과목들에 필자가 15년 동안 프로그래머로써 소프트웨어 개발을 하면서 사용한 웬만한 이론적인 베이스와 응용에 필요한 기초 개념 등이 모두 포함되어 있기 때문이다.


필자의 경우 지금은 전혀 사용하지 않은 파스칼이나 코볼을 전공 과목으로 이수를 했었다. 그것을 배울 때 이외에는 사용할 기회가 따로 없었지만, 필자가 프로그래밍 언어에 대한 개념을 익히고 나아가서는 C 언어를 제대로 공부할 수 있도록 하는데 간접적으로 도움을 주었다고 생각을 한다. 또한, 주된 개발 분야가 데이터베이스나 네트워크 프로그래밍과는 인연이 없었음에도, 간혹 필요 할 때마다 적절하게 활용할 수 있었던 것도 대학 시절에 배운 데이터베이스, 네트워크 및 데이터 통신 과목을 이수했었던 경험이 도움이 되었기 때문이다.


이와 같이 적지 않은 시간 동안 컴퓨터와 프로그래밍에 대해서 기초 학문부터 체계적으로 배울 수 있는 기회는 대학교의 전산학 관련 전공 과정이 유일하다. 그렇기 때문에 필자는 기본이 갖춰진 개발자가 되기 위해서는 반드시 전산학을 전공하여 전공 과목을 필히 이수하는 것이 중요하다고 생각한다. 간혹 컴퓨터를 전공하고도 자신이 배웠던 전공 과목에 대한 가치를 폄하하는 졸업자들을 볼 수 있는데, 전공 과목에서 다루는 학문적인 깊이나 그것을 가르치는 교수님의 자질 문제 보다는 그것을 제대로 배우지 못하고 자신의 것으로 만들지 못한 그 자신들의 문제라고 생각한다.


또한, 전산학 과정을 이수함으로써 모든 분야를 직접 경험 해보지 않더라도 특정한 기술의 특징이나 한계에 대해서 어느 정도 예측이 가능하다는 이점도 있다. 대학 시절에 “인공지능” 과목을 공부할 때, 필자는 “인공지능” 분야가 아직도 이론적으로 체계화 되어 있지 않은 것은 물론 실전에 응용할만한 유용한 사례가 많지 않다는 것을 알게 되었다. 덕분에 현재의 인공지능 기술 수준을 짐작할 수 있게 되었고, 게임 등에서 사용하고 있는 인공지능 “기술”들에 대해서 상대적으로 쉽게 이해하고 받아들일 수 있었다. 만일 지금 당장 누군가가 필자에게 인공지능이 필요한 소프트웨어 개발을 의뢰한다면 이러한 지식을 바탕으로 요구 사항에 맞는 적절한 기술이나 사례를 찾아서 완벽하지는 않더라도 그럴 듯하게 동작되는 소프트웨어를 개발할 수 있을 것이다.