얼마전에 읽은 ‘나는 프로그래머다’라는 책에서 임베디드 프로그래머 유영창님의 파트에서 ‘학교에서 배운 지식은 죽은 지식이 아니다’라는 제목의 글이 있었다.
우선 ‘나는 프로그래머다’라는 책에 대해서 간략하게 설명하자면 같은 IT분야이지만 서로 다른 분야에 있는 7명의 프로그래머가 모여서 엮은 책입니다. ‘임백준의 소프트웨어 산책’의 저자인 임백준씨와 임베디드 프로그래머 유영창씨, SI분야의 원은희씨, 게임프로그래머 김용준씨, 기업 전산실에 대해서 글을 쓰신 김종호씨, 데이터 아키텍트에 대한 글을 쓰신 이춘식씨 그리고 OKJSP사이트의 운영자이자 웹프로그래머이신 허광남씨. 이렇게 같으면서도 다른 분야의 7명의 IT인의 글이 실려있는 책이다.
프로그래머를 꿈꾸는 한 명의 후배로서 다양한 분야의 선배님들의 글을 참 재미있게 읽었고 또한 좋은 말들은 마음속에 새기며 즐겁게 책을 읽을 수 있었다. 현업에서 뛰고 있는 프로그래머들이 어떤 일을 하며 어떻게 생활하며, 어떤 생각을 가지고 살아가는지도 무척 궁금했었는데 어렴풋이 나마 느낄 수도 있게 해 주었던 책이었다.
오늘 쓰고자 하는 것은 임베디드프로그래머 유영창씨의 글 중에 있었던 제목인 ‘학교에서 배운 지식은 죽은 지식이 아니다’라는 것에 대한 이야기이다.
나 역시 학교에서 배운 지식은 죽은 지식이 아니라고 생각하고 있다. 다른 분야는 잘 모르겠지만 전산학과에서 만큼은 확실히 진실이다. 친구들이나 전산학과에 있는 몇몇 사람들을 보면서 참 자주 들었던 이야기가 “학교에서 배운건 참 쓸데없다”라는 뉘앙스의 이야기였다. 하지만 난 그렇게 생각하질 않는 걸.
대부분의 학교에서 비슷하겠지만 전산학과에선 참 많은 것들을 배운다. 기본적으로 프로그래밍 언어부터 데이터베이스, 자료구조, 알고리즘, 컴파일러, 운영체제, 소프트웨어 공학, 논리회로, 인공지능 등등 참 배우는 것도 많다.(전산수학은 그냥 뺐습니다. 분명 필요한 과목이지만 전 싫어요..ㅠㅠ)
모두 중요한 과목인데 프로그래밍언어 외의 각각 과목은 ‘도대체 이걸 어디다 써먹는 걸까?’, ‘써먹을 데는 있는 걸까?’, ‘이건 그냥 고리타분한 이론들이잖아.’ 라는 생각을 갖게 만들기 일수이다.
Automata, Hash, List, SortAlgorithm, Tree.. 뭐 이런 걸 알아 다가 어디다 쓸까. 하지만 분명 쓰일 일이 있고 알아야 할 때가 있다. 전공을 살려서 직업을 선택하게 된다면 말이다. 평생 알 필요 없이 잘만 살 수도 있으나 내가 생각하기엔 알면 편하고 알면 좋고, 알면 모르는 사람보다 훨씬(!) 유리하다.
간단하게 자바의 ArrayList를 생각해 보자. 내부적으로는 리스트구조로 만들어 져 있다는 이야기를 들은 적이 있다. 사실 나도 자세하게 공부하진 않아서 깊은 지식까지는 없지만 일단 예로 들어보고자 한다. 이미 만들어져 있는 API이니 우리는 그냥 대충 이해하고서도 충분히 프로그램을 짤 수 있고 지장은 없다. 하지만 필요에 의해서 ArrayList를 확장(extend)해서 사용하게 되거나 어쩔 수 없는 상황에 의해서 ArrayList처럼 리스트구조로 된 업무에 필요한 API를 만들어서 사용해야 할 일이 있다고 생각해보자. 그럼 그 때가 되어서 대학시절 배웠던 자료구조 책을 찾아 가면서 다시 공부하고 뒤져가면서 만들텐가?
물론 필요하다면 다시 책을 찾고 공부를 하면서 만들어야 하겠지만 대학시절 관심있게 공부했던 상태에서 책을 찾는것과 전혀 관심을 두지 않아 아무것도 모르는 상태에서 책을 뒤지는 것과 어느 쪽이 유리할까?
자료구조 뿐만 아니라 컴파일러, 알고리즘도 프로그래밍에 대해서 깊게 공부해야 할 수록 많은 도움이 된다. 여러 가지를 공부함에 있어서 학교에서 배운 지식이 쓸데 없는 것이 아니라는 것을 느끼며 당시 수업을 들었던 것이 지금 공부하는 것의 이해에 많은 도움이 된다는 것을 알아가고 있다. 가끔은 당시에 대충 수업을 들었던 것에 대한 후회를 일으키기도 한다.
아는 것도 적고 글 재주도 없어서 이렇게 밖에 설명을 못하겠지만 ‘나는 프로그래머다’라는 책을 읽어보면 학교에서 배운 지식은 죽은 지식이 아니라는 것을 좀 더 와 닿게 느낄 것이다. 아무래도 나 보다는 더 많은 것들을 겪은 선배들의 글이니까 말이다.
아, 관련해서 또 생각나는 이야기가 게임프로그래머 김용준씨의 글을 읽어보면 게임프로그래밍에서는 자료구조를 정말 잘 알아야 한다고 합니다. 자료구조가 필요한 게 게임프로그래밍 뿐이겠냐 만은 게임프로그래밍에선 더 중요한가 봅니다.
Update 2007/8/22
곰곰이 생각해보니 가장 많이 써먹는 자료구조로 스택하고 큐가 있네요. 이걸 예로 들었으면 더 좋았을껄..;;;
Update 2007/8/23
본문에 자바의 컬렉션프레임워크 중 하나인 ArrayList를 가지고 예를 만들어 적었었으나 제가 잘못 알고 있는 부분이 있는 것 같습니다. 자세하게 설명해 주실 분 안계신가요?ㅠㅠ 지식이 얕으니 글쓰기가 항상 조심스럽네요^^ㅋ
확실히 학교에서 배운것들은 무시 못학것들이 참 많죠.
자료구조 선택시에도 각 방식에 따른 차이점을 아니까 상황에 맞춰 선택할 수 있게 되고. 뭐, 여러가지 있겠죠 ㅎㅎ
그리고 ArrayList는 List를 가지고 Array를 구현한것 아닌가요? AbstractList를 상속받는걸 보니 그런것 같은데. -_-??
동감하시는 또 한분 발견^^ㅋ
아, ArrayList말인데요.지금 API를 뒤져보니 AbstractList를 상속하고 List인터페이스를 구현해 놓은 클래스이네요.
이것을 Array구조를 가진 List라고 봐야 할까요?
List구조를 가진 Array라고 봐야 할까요?
헷갈리네요.;;;;
저는 학교 수업시간에 배운지식이 죽은지식이 아니라고봅니다.
위에도 쓰셨듯이 학교마다 공통적으로 들어가는 과목들은 그만큼 중요하고 실제로 그쪽으로 나가면 많이 쓰이기도 하는 내용들이죠.
자료구조나 오토마타등도 많이 쓰이죠
Stack, Queue 는 말할것도 없거니와 Heap, Hash, PriorityQueue, Tree(셀수없이 많죠)
그리고,
java의 ArrayList 가 내부적으로 Array형식으로 구현이 된다고 합니다.
저도 절대 죽은 지식이 아니고 더불어 수많은 교수님들이 쓸데 없는 것들을 가르친다고 생각하지 않습니다^^ㅋ
요즘 자바 책 하나를 구입해서 중반부까지 읽고 있는데 자료구조의 중요성을 새삼 느끼고 있답니다. 학교에서 분명 배웠던 기억이 있는데 내용이 기억이 나질 않아서 고민도 좀 해 봤구요.
아, ArrayList말이죠. kfmes님이 제 방명록에 써주셨던 글을 떠올리면서 썼는데 전 왜 Array구조가 아닌 List구조라고 기억하고 있었던 걸까요..;; 본문을 수정해야겠습니다..에고..;;
이런 실수들 때문에 이런 글을 블로그에 쓰게 될 때 항상 긴장이 된답니다..;;;