좀더 열심히 프로그래밍 공부를 하기 위해, 전문 학원을 이용하는 것은 바람직한 일이다. 다만, 그 본질에 대해서는 충분히 알고 있는 상황에서 잘 활용을 하는 것과 잘 모르는 상태에서 맹목적으로 따라가는 것은 결과에 있어서 큰 차이를 만들게 된다. 학원 강의나 세미나 강연을 계속 해온 필자 입장에서는 부디 이러한 부분에 대해서 학원 강의를 수강하고자 하는 수강생들이 현명한 선택을 하기를 바란다. 


그리고, 누가 되었든 가르쳐 주는 것만 받아 먹으면서 "실력이 빨리 늘기"를 바란다면, 감나무 밑에 누워서 감이 떨어지기만을 기다리는 것과 같은 짓이다. 학원 공부 역시 나의 적극적이고 능동적인 태도가 수반되지 않는다면 프로그래밍 공부에 큰 도움이 되지 않을 수도 있다.


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


학원 강의 수강 시에 유의 사항


여러분이 소프트웨어를 개발하는 개발자가 되고 싶은데 전산학을 전공하지 않았거나 전공을 했어도 충분히 배우지 못했다고 생각될 때, 즉 마땅히 좋은 방법을 찾지 못했을 때에 가장 쉽게 선택할 수 있는 방법이 바로 전문 학원에 가서 배우는 것이다. 가까운 컴퓨터 학원을 찾아가서 일정한 교육 비용을 지불하고 나면 어렵지 않게 개발자가 되기 위한 기초 과정부터 고급 과정까지를 수강할 수 있게 된다. 특히나 요즘에는 스마트폰 열풍으로 인해 스마트폰 프로그래밍 교육 과정이 상당히 많이 개설되어 잘 찾아보면 국비 지원을 받아서 저렴하게 교육을 발을 수 있는 기회도 많다.


학원

주요 과정

비트교육센터

고급 과정 (Windows&.NET/Java/스마트폰)

단기 과정 (C/C++/Windows Programming/Java/Linux/FLEX/스마트폰)

SBS 아카데미 컴퓨터아트

스마트폰 앱 개발 과정(안드로이드/아이폰)

3D 게임 프로그래밍 과정

MBC 아카데미 디지털교육원

ASP.NET/웹 표준 프로그래밍/Flex 프로그래밍/게임개발자전문가/

아이폰 개발자

SOLDESK

Programming (C/C++ 프로그래밍/Java 프로그래밍)

Mobile (안드로이드 개발자/아이폰 개발자)

Database (Oracle/IBM DB/2)

T 아카데미

단기 과정 (Android/iPhone/Windows Phone 7/Cocos 2D/K-Apps/HTML5&CSS 모바일웹 프로그래밍)

전문가 과정 (Android/iPhone 전문가 과정)

게임 스쿨

C/C++/API/Network,MFC/2D 온라인게임 프로젝트/Direct3D/게임엔진

KGCA 게임 아카데미

1학기 (C/API/C++/MFC/Network/2D 게임제작 프로젝트/DirectX SDK/Direct3D Graphic/Max SDK/쉐이더)

2학기 (지형/애니메이션/물리&인공지능/이펙트/툴제작/졸업 프로젝트/포트폴리오제작)

쥬신 게임 아카데미

게임 프로그래밍/아이폰 게임 개발/안드로이드 개발

서울컴퓨터게임아트

게임프로그래밍 과정/아이폰 어플개발 과정/안드로이드 어플개발 과정

[2-2] 컴퓨터 프로그래밍 교육 과정을 운영하는 학원 목록


위쪽의 표에 나열된 학원 이외에도 지역별로 프로그래밍 교육 과정을 다루는 전문 학원들이 있고, 각각의 학원마다 특화된 교육 과정을 가지고 있기도 하기 때문에 꼼꼼히 살펴본 다음 자신에게 맞는 학원을 선택할 필요가 있다. 학원 교육의 가장 큰 목적은 “취업”이기 때문에, 대부분의 학원 강의는 수강생들이 취업을 하는데 있어서 꼭 필요한 커리큘럼 위주로 교육을 한다는 장점이 있다. 때문에 프로그래밍 공부 시 필요한 기본 지식을 사전에 습득했다면 무리 없이 따라갈 수 있겠지만, 그렇지 않다면 학원에서 배우는 것뿐만 아니라 기본적으로 갖추어야 하는 기초 지식들을 스스로 공부하여 보충해줄 필요가 있다.


주의해야 할 것은 전문학원이나 학원 강사들에 대한 지나친 기대감은 금물이라는 것이다. 컴퓨터와 관련된 특정 분야에 대해서 공인된 학력과 경력을 가지고 있는 대학교의 교수님들이 구성한 커리큘럼으로 배우는 것으로도 만족하지 못하는 경우가 많음에도, 전문 학원의 강사들의 강의가 무조건 큰 도움이 될 것으로 기대하는 것은 앞뒤가 맞지 않는 행동이기 때문이다. 학원 강사들 중에는 소프트웨어 개발 업무를 병행하는 사람들도 간혹 있기는 하지만, 대부분은 학원 강의만을 전문으로 하는 전문 학원 강사들이라서 가르칠 수 있는 것에 분명 한계가 있을 수 밖에 없다.


대부분의 수강생들은 전문 학원에서 2~3개월에서 6개월, 길면 1년 정도를 수강을 하고 나면 개발자가 되기 위한 준비가 끝났다고 생각을 하게 된다. 이 때에 순진하게 학원 관계자들의 말이나 주위의 사람들(비록 그 사람이 IT 업계에 종사하고 있는 개발자라고 해도 상관없다)의 말만 믿고 취업 준비를 하게 되면 낭패를 당하기 쉽기 때문에 주의해야 한다. 개발자를 선발하는 개발 업체나 인사 담당자 입장에서는 지원자가 어떤 학원에서 얼마나 오랫동안 배우고 어떤 포트폴리오를 만들었느냐는 별로 중요한 사실이 아니기 때문이다. 그 보다는, 입사 지원자가 한 사람의 개발자로써 실무에 투입될 수 있는 마음가짐이나 태도를 가지고 있는지, 기존 개발 인력들과 좋은 팀웍을 이룰 수 있는지, 그리고 기본적으로 필요한 지식과 경험을 갖추고 있는지가 더 중요한 사항일 것이다.


프로그래밍 공부를 위해서 프로그래밍 전문 학원을 이용하는 것은 활용하기에 따라서 큰 도움이 되는 경우가 많다. 혼자서 독학을 할 때에는 경험 부족으로 인해서 적지 않은 시행 착오를 겪을 수 밖에 없는데, 충분한 지식과 경험을 가지고 있는 강사를 통해서 이러한 실수를 줄일 수 있고 더 좋은 해결 방법을 알게 될 수 있기 때문이다.


필자도 대학교 1학년 때 독학으로 C언어를 공부하면서 방학 때 학원 수강을 했던 적이 있었다. 그 전에는 BASIC으로만 개발을 했었기 때문에, 처음 접한 C언어의 개념을 제대로 이해하지 못하는 부분이 있는 것 같아서 나름 체계적으로 정리하기 위해 학원을 다녔었다. 지금도 보관하고 있는 그 당시 학원 교재를 다시 보면, 꼼꼼하게 필기하면서 C언어의 개념을 정리했던 것을 확인할 수 있다. , 당시에 필자는 무조건 학원에서 새로운 지식을 배우려고 하기보다는 스스로 공부하고 있던 사항들을 학원 강의를 통해서 정리하고 이해가 되지 않은 부분을 보완하려고 했기 때문에 큰 도움이 되었던 것이다.


학원 강의를 수강하는 것 자체는 효과적으로 프로그래밍 공부를 하는 여러 가지 방법 중에 하나이기 때문에 상황에 따라서는 필자 역시 여러분에게 추천을 하고 싶은 방법이다. 다만, 지나치게 수동적으로 학원 강의를 수강하게 되면 투자한 비용이나 시간에 비해 학습 효과가 현저히 떨어질 뿐만 아니라 자신의 프로그래밍 실력 향상보다는 그저 취업을 위해서 형식적으로 거치는 과정으로 전락할 수 있기 때문에 분명한 목표 의식을 가지고 누구보다 적극적인 태도로 자신의 프로그래밍 실력 향상에 도움이 될 수 있도록 만드는 노력이 필요하다.


by 나숑 2012. 11. 18. 11:23

몇년 간 전산학을 전공하고도 당당하게 "프로그래밍은 잘 못하지만.."이라는 단서를 달고 구직 활동을 하는 인력들을 만나서 황당한 경험을 바탕으로 쓴 글이다. "나"라는 상품을 팔러간 자리에서 "나는 이러이러한 하자가 있는 상품이지만, 이왕이면 좋은 가격에 구매해주셨으면 합니다"라고 말을 한다는 것은, 무지를 넘어서 무례한 것이 아닌지. 자신의 말대로 자신의 부족한 점을 알고 있다면 말로 커버하려고 하기보다는 부족한 점을 메우고 극복하려는 노력이 필요한 것이 아닐까.


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


전공자라고 해서 모두가 프로그래밍을 잘하는 것은 아니다.


전산학과를 졸업했어도 프로그래밍을 전혀 하지 못하는 사람들도 많다. 대학 진학 시에 전공 선택을 점수에 맞춰서 했거나 적성을 고려하지 않고 아무 생각 없이 전공을 선택하여 진학한 학생들도 많기 때문이다. 이들은 컴퓨터 프로그래밍도 고등학교 때 공부했던 영어나 수학처럼 공부를 하기 때문에 좋은 시험 성적을 받기 위해 이론적인 부분에 치중하고 필요한 만큼의 실습만을 하는 것이 특징이다. 전산학 전공자가 졸업을 하면 프로그래머 말고도 관련된 다양한 직종에 취업을 할 수 있고, 굳이 전공과 관련된 분야가 아닌 자신이 좋아하는 일을 하는 사람도 많기 때문이다.


최근에 대학을 갓 졸업을 한 지원자와 인터뷰를 했었는데, 개발자를 구인하는 면접 자리에서 그 지원자는 자신이 프로그래밍 스킬은 다소 떨어지지만 졸업 작품을 만들어 본 결과 프로그램의 기획이나 설계 파트를 더 잘한다는 것을 강조했다. 가장 기본이 되는 프로그래밍 스킬이 떨어지면 다른 것은 별다른 의미가 없다. 게다가 프로그램 설계 업무는 충분한 프로그래밍 경험이 없으면 쉽게 해 볼 수 있는 일도 아니다. 이처럼 전산학을 2~4년 동안 전공한 다음 대학을 졸업했지만 여전히 프로그래밍에 대한 개념을 잡지 못하는 졸업자들도 많은 편이다..


전공을 하고도 프로그래밍을 제대로 하지 못하는 경우는 대부분 프로그래밍 센스가 떨어지거나 적성에 맞지 않기 때문일 것이다. 그렇기 때문에 졸업 후 진로를 선택할 때에 이러한 부분을 충분히 감안해야 한다. 자신의 프로그래밍 센스가 다소 떨어지더라도 프로페셔널 개발자가 되고 싶다면 이것을 보충하기 위한 여러 가지 노력을 해야 하기 때문이다.


가장 손 쉽게 프로그래밍 감각을 익히고 부족한 부분을 보완하는 것은 전문 학원의 강의를 수강하는 것이다. 자신이 관심이 있는 분야의 커리큘럼을 적절한 비용과 기간에 교육을 해주는 전문학원을 찾아가서 수강을 해보는 것도 중요하다. 그러한 시도 한 가지 만으로 모든 문제가 해결될 것이라는 기대만 하지 않는다면, 충분히 많은 도움을 얻을 수 있을 수 있는 가장 현실적인 방법일 것이다.


기회가 된다면 그것보다 더 좋은 방법은 소프트웨어 개발사에 취업을 하거나 프리랜서로 소프트웨어 개발 프로젝트에 참여를 해보는 방법이다. 몇 년 전부터 스마트폰 시장이 본격적으로 열리면서 소프트웨어 개발자들에 대한 수요가 크게 증가하였고, 그 추세는 당분간 지속될 것으로 판단된다. 이는 특정 분야의 소프트웨어 개발자들에 대한 수요가 일시적으로 늘었다가 금방 식어버렸던 2000년대의 “닷컴 거품” 시기와는 다른 양상이며 모바일 산업의 특성 상 그 성장세는 다를 것으로 판단된다. 따라서, 소프트웨어 공학을 전공한 전공자라면 일반 직종에 지원해야 하는 취업준비생들보다는 훨씬 더 유리한 조건에 취업을 할 수 있는 기회가 많은 편이다. 처음부터 큰 욕심을 부리기 보다는 자신의 비전을 공유할 수 있고, 실력을 키워나가면서 차근차근 충분한 경력을 쌓을 수 있는 직장을 찾아서 입사하는 것도 좋은 방법이 될 수 있다.

by 나숑 2012. 11. 18. 11:17
  • 김승희 2013.09.02 12:02 ADDR EDIT/DEL REPLY

    좋은 내용 감사 합니다^^

    • 나숑 2013.09.02 18:10 신고 EDIT/DEL

      부족한 내용이지만 부디 도움이 되시기 바랍니다~!

결과적으로 보면 필자가 이야기하고 싶은 말은 "프로그래밍 공부를 하려면 동기를 확실하게 부여하여 적극적이고 능동적으로 하라"이다. 그런 의미에서 아래 내용은 "수동적인 태도"에 대한 비판이다.


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


공부를 방해하는 가장 큰 요소는 수동적인 태도이다


공부를 하는 것도 그렇고 일을 하는 것도 그렇고 가장 경계를 해야 하는 것은 “수동적인 태도”이다. 필자는 신입 면접을 볼 때 가장 중요하게 생각하는 것은 “능동적인 태도”나 “적극적인 태도”이다. 어차피 신입 사원 시절에는 경험과 지식이 부족할 수 밖에 없다. 그렇지만 그 신입 사원이 얼마나 빨리 업무에 적응을 하고 자기 몫을 해내느냐는 그의 “태도”에 따라 달려있다.


면접 시에 지원자들이 습관적으로 “입사를 하게 되면 열심히 배우겠습니다”라는 말을 자주 한다. 그 때마다 필자는 “학교나 학원에서 배운 것도 모자라서, 회사까지 들어와서 월급을 받으며 배울 생각이냐?”라고 면박을 준다. 열심히 배우겠다는 것이 마치 자신의 성실함과 열정을 표현하는 말이라고 생각을 하는 것 같지만, 사실은 무책임하고 불성실할 뿐만 아니라 상당히 수동적인 태도를 가지고 있다라는 뜻으로 밖에 보이지 않는다.


게다가 회사에 입사를 해서야 비로소 열심히 하겠다는 생각은 다소 늦은 감이 있다. 학교나 학원에서 공부를 할 때에 이미 남들보다 열심히 노력을 해야 하고, 제한적이라도 가능한 범위 내에서 다양한 경험과 시행 착오를 겪어 봐야 한다. 그러나 많은 시간적인 여유가 있었음에도 불구하고 대부분의 지원자들은 학교나 학원에서 시키는 것만 겨우 해보았을 뿐, 스스로가 어떤 목표를 가지고 만들어 보거나 공부해 본 적이 없다는 것이 문제이다. 이것이 이들이 “수동적”으로 배웠다라는 가장 큰 증거이기도 하다.


필자가 지금까지 15년이 넘게 소프트웨어 개발을 해오면서, 한번도 내가 알고 있는 지식 만으로 프로젝트를 수행할 수 있었던 적은 단 한번도 없었다. 매번 새로운 기술과 환경에서 일을 해야 했고, 그때마다 새로운 분야에 대한 도전을 하는 입장되어 열심히 공부를 하면서 동시에 실무에 적용을 하여야 했다. 그만큼 프로그래밍이라는 것이 항상 트렌드가 바뀌고 늘 새로운 것들을 공부 해야 하는 분야라는 이야기 이다.


그런데도 자기가 아는 분야의 일만 하겠다는 개발자들도 생각보다 많다. 이들은 나중에 가서야 그때 공부를 좀더 할 걸 그랬다고 후회하는 경우가 많은데, 이렇듯 개발 경력자들조차도 “수동적인 태도”를 견지하게 되면 언제든지 도태될 수 있는 것이 소프트웨어 개발 분야이다.


이렇게 수동적으로 누군가가 가르쳐주거나 시키는 대로 하는 것으로 만족하는 것이 아니라, 자신이 맡은 일에 대해서 적극적이고 능동적으로 일을 하기 위해서 반드시 필요한 것은 바로 “열정”이다. , 기본적으로 자신이 하고자 하는 일이나 직업에 대한 “열정”을 가지고 있는 사람이라면 당연히 적극적인 태도를 가지고 누구보다 열심히 임하게 되는 것이 당연하다. 반대로 이러한 열정이 부족하거나, 아예 없다면 결과적으로 수동적인 태도를 보일 수 밖에 없는 것이다. 지금 당장 여러분이 프로그래밍 공부에 대한 열정을 가지고 있는지를 확인해보자. 열정이 부족하다고 생각된다면 그 열정에 불을 붙이는 것이 무엇보다 먼저 해야 할 일이다.

by 나숑 2012. 11. 18. 11:11

이번 글은 나중에 알고 보니, 학교를 다니면서 배운 것들이 큰 도움이 되었다라는 필자 자신의 경험담을 적은 것이다. 필자가 대학을 졸업한지 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 언어를 제대로 공부할 수 있도록 하는데 간접적으로 도움을 주었다고 생각을 한다. 또한, 주된 개발 분야가 데이터베이스나 네트워크 프로그래밍과는 인연이 없었음에도, 간혹 필요 할 때마다 적절하게 활용할 수 있었던 것도 대학 시절에 배운 데이터베이스, 네트워크 및 데이터 통신 과목을 이수했었던 경험이 도움이 되었기 때문이다.


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


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

by 나숑 2012. 11. 11. 16:01

대학 생활을 하는 내내 필자를 불편하게 했었던 사실은, 동기나 선후배를 통틀어서 전산학과 학생들 중에서 컴퓨터를 좋아하거나 프로그래밍 공부를 하기 위해 대학 진학을 한 사람이 거의 없었다는 점이다. 그들은 시험 점수에 맞춰서 대학은 물론 학과까지 결정한 경우이거나 또는 단지 취업이 잘될 것 같아서 선택한 경우가 대부분이었기 때문이다.


그것을 단지 무조건 대학을 진학해야만 한다는 우리 사회적인 문제이거나 시대적인 문제로 치부할 수도 있겠지만, 미안하게도 그런 사회나 시대에 살고 있다고 해서 모든 사람이 그렇게 살고 있는 것은 아니다. 필자 자신만 해도 전산학을 전공하고자 마음을 먹은 것은 이미 중,고등학교 때 확정을 지은 것이었다. 좀더 나은 사회적인 지위를 얻기 위해서 진학해야 하는 대학이나 학과를 원하셨던 부모님을 납득시키는 것도 쉬운 일이 아니었다.


아무 생각 없이, 또는 억지로 전산학과에 진학을 한 학생들의 "프로그래밍 공부법"이란 수학의 공식을 외우거나 영어의 단어를 외우는 것과 별 차이가 없었다. 그래서 그들은 제대로된 프로그래밍을 하지 못한 것은 당연한 결과였고 그저 리포트를 제출하기 위한, 시험을 치르기 위한 공부에 그치고 말았다. 그에 반해 필자는 프로그래밍 공부 자체를 즐겁게 열심히 하고 있었기 때문에, 리포트가 되었든 시험 문제가 되었든 주어진 문제를 해결하는 프로그래밍이 어렵지 않았다.


어떻게 보면 이것이 어떤 공부이든 잘하는 방법이 아닐까 한다. 필자 역시 중,고등학교 시절에 영어와 수학을 프로그래밍 공부처럼 했었다면 좀더 공부를 잘했을 수도 있을테니까 말이다. 이제와서야 비로소 공부를 잘하는 방법을 조금 알게 되었다는 것도 나름 다행이라고 생각한다.


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

학교에서는 기본 지식만을 배울 수 있을 뿐이다.


학교 교육이나 학원 교육에 지나치게 의존하는 사람들의 문제라고 한다면, 마치 학교나 학원에서 모든 것을 알려줄 것이라는 “환상”을 가지고 있다는 점이다. 모든 일에는 만병통치약이 없듯이, 교육에 있어서도 마찬가지 이다. 전산학 전공자가 전공 교수님으로부터 배울 수 있는 것은 컴퓨터나 소프트웨어, 하드웨어 등의 기본적인 사항에 대한 커리큘럼 정도이다. 게다가 전공 필수 과목과 선택 과목 모두를 합쳐도 생각보다 많은 과목을 수강하는 것도 아니다. 따라서, 학교에서 배우는 지식은 소프트웨어 개발에 있어서 가장 기초가 되는 정도라고 생각하는 것이 좋다.


2년 또는 4년 정도를 전산학을 전공하고 졸업한 대학 졸업자들을 면접 보면, 90% 정도가 그 부족하고 기본 밖에 안 되는 교육 조차 제대로 익히지 못하고 졸업을 한 경우가 많다. 본인들 스스로도 학교에서 배운 것만으로는 부족하다고 판단을 했는지, 졸업 후에도 관련 학원을 몇 개월간 다니면서 과정 수료를 하게 되지만 그렇다고 해서 달라지는 것은 별로 없다.


마치 전산학을 전공하고 나오면 모든 것을 마스터할 수 있다는 막연한 환상을 가지고 대학을 진학하는 것도 그렇고, 대학 재학 중인 기간 동안 내내 학교에서 가르치는 기본적인 지식을 배우는 것 조차 중,고등학교 때 국어, 영어, 수학을 배우는 것처럼 공부를 하는 것 모두가 문제이다. 학교에서 다루는 커리큘럼을 기반으로 스스로가 관련된 사항들을 찾아서 공부를 해야 하고, 단순히 리포트를 작성하거나 시험을 치르기 위한 준비만 하는 것이 아니라 배우고 익힌 것들을 활용하여 실전에 응용해보는 노력이 필요하다.


필자는 초등학교 때부터 프로그래밍을 시작했기 때문에, 대학교에 진학하여 따로 프로그래밍에 대해서 배운다기보다는 그 동안 이론적인 베이스 없이 몸으로 익혔던 부분들에 대해서 기본적인 원리나 개념에 대해서 정리를 한다고 생각을 하고 열심히 공부하였다. 아무리 어렸을 때부터 많은 경험을 했다고는 하나 필자 역시 극히 일부 분야에 대한 경험만 가지고 있었을 뿐, 대부분의 분야가 생소하고 낯설었던 것은 마찬가지였다. 그래도 상대적으로 경험이 많다는 것은 다른 분야에 대한 이해도를 높여주는 역할을 했고, 남들보다 탄탄한 기초를 쌓는데 큰 도움이 되었다.


국어, 영어, 수학 등에만 선행 학습이 필요한 것이 아니다. 최소한 여러분이 전산학을 전공하고자 한다면 대학 진학 전부터 깊이 있게는 어렵더라도 다양한 분야에 대해서 기초적인 사항들에 대해서는 충분히 리뷰를 하고 진학하는 것이 좋다.

by 나숑 2012. 11. 11. 15:53

아마도 이번 장 역시 전 장에서 강조하는 "센스"에 대한 고집처럼 "전산학 전공자"에 대한 필자의 주장은 이 글을 읽는 대부분의 독자들에게 반감을 살 수도 있다. 미안하지만, 그렇다고 하더라도 필자는 이왕이면 프로그래머가 되기 위해서는 "전산학" 또는 유사 학과를 전공하는 것이 조금이라도 좋을 수 있다는 의견을 계속 견지하고 싶다.


다행히 여러분이 전산학 전공자라면 문제가 없겠지만, 만일 여러분이 비전공자이면서 "프로그래밍 공부"를 시작하려는 분들이라면... 전공자 못지 않은 기초 실력을 다지기 위해서 더 많은 노력을 해야한다는 논리로 받아들여주었으면 한다. 일부 경험을 기초로한 필자의 선입견으로만 판단한다면 비전공자들은 자신들의 불리한 점에 대해서는 조금 인정하지만, 그것을 극복하기 위해서 전공자 못지 않은 노력은 거의하고 있지 않기 때문이다.


즉, 여기서 중요한 것은 전공자냐 비전공자냐 편을 가르고 싶은 것이 아니다. 전공자이든 비전공자이든 제대로된 프로그래밍 공부를 위해서 필요한 기초 지식부터 열심히 학습하고 준비하는 자세가 필요하다는 것이다. 그것이 준비되어 있지 않은 상태에서의 "프로그래밍 공부"라는 것은 명백하게 한계가 있고, 그렇기에 대부분 제대로 공부를 끝내지 못하는 것이다.


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

2 장 전산학 전공자와 비전공자의 차이


여러분들이 프로그래머가 꿈인 청소년이라면 우선 전산학(Computer Science)을 전공을 선택하여 대학에 진학하는 것을 권하고 싶다. 소프트웨어 개발과 관련하여 기초적인 학습 지식을 배울 수 있는 “전산학” 관련 학과는 컴퓨터공학과, 컴퓨터학과, 전자계산학과, 전산과학과, 소프트웨어공학과 등이 있는데, 학교와 학과에 따라서는 다루는 커리큘럼이 다소 차이가 있을 수 있으니 잘 알아보고 지원을 하는 것이 좋다. 담당 교수들의 성향에 따라서는 하드웨어 비중이 높을 수도 있어서 소프트웨어와 관련된 커리큘럼을 사전에 체크해보자.


그러나 여러분이 프로그래머가 되고 싶어하는, 이미 대학교를 졸업한 전산학 비전공자라면 어떻게 해야 할까? 소프트웨어 개발 역시 “기술” 직종이기 때문에, 소정의 기술 교육을 받으면 충분히 개발자가 될 수 있다고 생각하는 경우가 많다. 이러한 생각은 한 편으로는 맞지만 한 편으로는 “틀리다”라고 말 할 수 있다.


단순하게 프로그램 구현을 위해 소스 코드만을 작성하는 “코더”라면 기술 교육을 받아서 충분히 해낼 수 있기 때문에 맞는 이야기라고 할 수 있다. 하지만, 기초가 탄탄하지 못하고 전체 시스템에 대한 충분한 이해가 없다면 기본적인 프로그래밍 그 이상은 불가능하기 때문에 맞지 않은 이야기라고도 할 수 있는 것이다.


물론 전공자라고 해서 모두가 제대로 교육을 받고 기초를 탄탄하게 쌓은 것은 아니지만, 귀동냥으로라도 전산학 관련 과목을 이수한 경우라면 전혀 이수하지 않은 사람보다는 분명히 나을 수 밖에 없는 부분이 있다. 대학교 전공 수업 이외에는 소프트웨어 관련 기초 학문을 마땅히 배울 수 있는 기회가 별로 없기 때문이다. 수지 타산이 맞지 않기 때문에 “소프트웨어 공학”, “운영체제론”, “이산 수학”이나 “데이터베이스 개론”, “인공지능”을 가르칠 수 있는 학원은 없을 것이다.


훌륭한 요리사가 되기 위해서 허드렛일부터 하나씩 배워야 하는 것은 누구나 다 인정을 하면서도, 제대로 된 프로그래머가 되기 위해서는 기초부터 탄탄하게 다져야 한다는 점에는 의문을 던지는 경우가 종종 있다. 어렸을 때부터 단지 컴퓨터를 좋아했었고, 전공을 하지 않았지만 학원에서 6개월씩이나 배웠으니 충분히 좋은 개발자가 될 수 있다고 이야기 하는 것은 어렸을 때부터 요리에 관심이 많았고 정식으로 요리를 배우지는 못했지만 요리 학원에서 6개월 수강했으니 충분히 훌륭한 요리사가 될 수 있다고 이야기하는 것과 같은 이야기이다. 과연 이 말을 쉽게 인정해줄 수 있는 요리사가 얼마나 있을까?


by 나숑 2012. 11. 11. 15:41



<에피소드1 - 나의 베이직 프로그래밍 공부법>


필자가 Apple //+로 베이직을 배운 것은 초등학교 4학년 때였다. 당시에는 알파벳만 겨우 알던 나이였는데, 베이직 명령어와 DOS 명령어를 달달 외우면서 프로그래밍을 시작했다. 예를 들어 MS-DOS에서의 “dir”이나, UNIX에서의 “ls” 명령어와 같이 8비트 Apple 컴퓨터에서 사용하는 DOS에도 “catalog”라는 명령이 있었는데, 그것을 필자는 무슨 뜻인지도 모르고 “씨-에이--에이---지”라고 외워서 쓰곤 했다. 그것이 “카탈로그”라는 단어라는 것을 알게 된 것은 한참이 지나서이다.


그럼에도 불구하고 필자가 나름 프로그래밍이라는 것을 할 수 있었던 것은, 반복 학습을 통해서 언어나 명령어의 기능을 몸으로 익혔기 때문이다. 어린 시절의 필자는 똑같은 소스를 수도 없이 반복 입력하면서 구동 로직을 잘 몰라도 어떠한 결과를 얻기 위해서 어떻게 코드를 작성하면 되는지를 알고 있었다. 친구들과 누가 빨리 소스 코드를 타이핑해서 결과를 출력하는지를 시합하기도 하였고, 컴퓨터 잡지나 컴퓨터 서적에 수록된 소스 코드를 따라 입력하면서 새로운 로직이나 테크닉에 대해서 배우기도 했다. 이 모든 것은 많은 시간을 할애하면서 그것들을 익히기 위해 꾸준히 노력을 한 것 뿐이었다.


 

[그림 1-1] 필자가 초등학교, 중학교, 고등학교 때까지 구독했던 컴퓨터 잡지인 “컴퓨터학습”과 “학생과컴퓨터”


여전히 필자가 가지고 있는 1980년대에 출간된 “컴퓨터학습”이나 “학생과컴퓨터”라는 컴퓨터 잡지들에는 항상 여러 가지 참고할 만한 소스들이 수록되어 있었다. 재미있어 보이는 게임과 같은 프로그램의 소스는 엄청나게 길어서 그것을 입력하는 것만 해도 반나절이 걸리기도 했다. 한번은 효성에서 나온 APPLE //+ 호환 기종을 가지고 있던 친구 집에 놀러 가서, 하루 종일 둘이서 번갈아 가면서 입력을 하고는 몇 번 해보지도 못하고 집으로 되돌아 가야 했었던 적이 있었다. 당시에는 플로피 디스크 드라이브 조차 귀한 시절이라 열심히 입력한 코드는 컴퓨터 전원을 끄면 모두 날라 가버렸었다.


초등학교 6학년 때, 아버님께서 거금을 들여서 APPLE //+ 호환 기종을 풀 세트로 구입해주셨을 때부터 본격적으로 베이직 프로그래밍을 공부하기 시작할 수 있었다. 세운상가에 갈 때마다 몇 가지의 게임을 복사해와서 즐기는 것도 좋았지만, 무엇보다도 재미있었던 것은 프로그램을 만드는 일이었다. 나이가 어리고 경험도 많지 않았기 때문에 만들고자 했던 것을 끝까지 만들어본 적은 없었지만 간단한 성적 관리 프로그램은 물론 교육용 프로그램, 어드벤쳐 게임, RPG 게임 등등 여러 가지 프로그램을 만들기 위해서 이리저리 고민을 하기도 했었다.


[그림 1-2] 필자가 1986년부터 지금까지 소유하고 있는 ROMAX-2000 (Apple //+ 호환 기종)


볼품은 없었지만, 필자의 첫 번째 프로그램은 “Result Handling”이라는 성적 계산 프로그램이었다. 각 과목의 점수를 일일이 입력하면 그 결과를 화면에 적당히 포매팅하여 출력해주는 것이 프로그램이 가진 기능 전부였었다. 단순한 프로그램이었지만, 여러 가지 버전을 만들면서 다양한 시도를 해보면서 계속 발전 시켜나갔다.


그 다음에는 몇 가지 게임들을 기획하고 구현을 해보았었다. 깊은 인상을 받았던 어드벤처 게임의 영향을 받아서 아마존을 배경으로 하는 텍스트 어드벤처 게임을 만들다가 말거나, “울티마” 시리즈의 아류작(“Sed Tell’s Story”라는 타이틀을 가지고 있었다)을 본격적으로 기획하여 엄청난 단순 노가다 작업을 통해 겉모습을 그럴 듯하게 만들다가 제풀에 지쳐서 그만두기도 했었다. 중요한 것은 이렇게 무언가를 만들기 위해서 구체적인 노력을 계속 했다는 점일 것이다. 덕분에 베이직 언어를 공부하는 것이 일회성으로 끝나지 않고 조금씩 계속 성장할 수 있는 계기를 만들어 갔기 때문이다.


지금도 기억이 나는 것은 대형 서점의 컴퓨터 서적 코너에 있는 외국 서적을 번역하여 출간된 책들을 펴놓고, 연습장에 책에 적혀 있는 소스 코드를 베껴와서 집에서 입력해보기도 했다는 것이다. 그 때 필자에게 프로그래밍은 “일”이 아니라 “놀이”에 가까웠기 때문에 많은 시간을 투자해서 결과를 만들기 위한 시행 착오를 겪어 볼 수 있는 기회를 만들어 준 것 같다.


이렇게 조금씩 쌓이기 시작한 경험을 바탕으로, 필자는 고등학교 1학년 때 비로소 하나의 프로그램을 기획해서 완성할 수 있었다. 그것은 당시에 재미있게 즐겼던 “카멘센디에고”라는 교육 요소가 포함된 게임을 따라서 만든 것으로 “한반도”라는 거창한 이름을 가진 프로그램이었다. 매년 가을에 열리는 축제에서 컴퓨터 동아리 전시회를 열었는데, 그때 출품하기 위해서 여름 방학 내내 열심 만든 프로그램이었다. 고등학교 컴퓨터 동아리 전시회에서 전시하는 프로그램이라면 간단한 퀴즈 게임 스타일의 프로그램이 대부분이었는데, 필자는 그래픽 유틸리티와 라이브러리까지 활용하여 그럴 듯한 게임으로 만들어낼 수 있었다.


대학교 1학년 때에는 GW-BASIC으로 스프레드시트 프로그램인 “큰종이”를 만들었다. 학교 전산실에서 GW-BASIC으로 열심히 코딩을 하면서 만든 프로그램인데, 간단한 표 계산과 그래프 그리기가 가능했다. 이것을 마지막으로 약 10년간 사용하던 베이직 언어를 더 이상 사용하지 않게 되었지만, 필자가 한 사람의 개발자로써 자리매김을 하는데 많은 기여를 했던 프로그래밍 경험이었다. , GW-BASIC으로 만든 “큰종이 1.0”은 필자의 베이직 프로그래밍 시절을 결산하는 의미를 담고 있는 “결정판”이라고 할 수 있다.






[그림 1-3] GW-BASIC으로 만든 “큰종이 1.0”의 실행 화면


학교 수업이 끝나거나 수업 중간 중간에 시간이 나면 학과 전산실에 가서 만들었던 “큰종이 1.0”은 그 해 11월에 개최된 전산학과 소프트웨어 공모전에서 선배들을 제치고 당당하게 대상을 수상하게 만들어 주었다. 어쩌면 이 때부터 공부하기 위해 만든 프로그램으로 공모전에 출품하여 상을 타는 공식을 만들어가기 시작한 것 같다.


필자가 초등학교, 중학교, 그리고 고등학교까지 아마추어 시절 내내 사용했던 “베이직 언어”를 공부했던 방법은, 베이직 언어를 이용하여 내 스스로 만들고 싶었던 게임이나 프로그램을 직접 만들어 보는 방법이었다. 그것이 성공할 때도 있고, 실패할 때도 있었지만 어떠한 목표를 가지고 프로그래밍 언어를 활용하기 위해 고민을 하다 보면 더 빨리 프로그래밍 언어를 배울 수 있었고 실력도 금방 늘 수 있었다는 것을 깨달았다는 사실이 더욱 중요한 교훈이었다.


by 나숑 2012. 11. 4. 16:53
  • 2018.04.08 01:36 ADDR EDIT/DEL REPLY

    비밀댓글입니다

    • 나숑 2018.10.17 21:02 신고 EDIT/DEL

      도움이 되신다니 다행입니다. ^^;; 저는 프로그래밍이란 "문제를 해결하는 과정"이라고 생각합니다. 꽤나 오랫동안 프로그래밍을 해왔지만, 항상 새로운 문제에 부딪치게 되고 그때마다 좌절하고 힘든 과정을 겪기 마련입니다. 하지만, 모든 문제는 거의 대부분 해결할 수 있는데, 그때까지는 인내심을 가지고 평정심을 유지하면서 다양한 방법으로 시도하면서 해결의 실마리를 찾는 것이 중요합니다. 아무리 대단한 소프트웨어라고 해도 결국 우리와 같은 사람이 만든 것이기 때문에, 우리라고 못할 이유는 없으니까요.

자신이 하고 싶은 분야의 일을 뒤늦게라도 찾아서 할 수 있게 되었다면, 분명히 행복한 일임에 틀림이 없다. 이 세상에는 자신이 좋아하는 일을 하거나 자신의 적성에 맞는 일을 하는 사람이 그다지 많지 않기 때문에 그것이 늦고 빠름은 크게 중요하지 않다.


예전이나 지금이나 다른 분야에서 짧게는 3~4년, 길게는 10년 이상 근무를 하다가 개발자로 전향하려고 하는 지원자들이 있다. 여기에 적은 글은 필자가 실무에서 늦깎이 개발자들을 많이 경험해본 것을 기초로 작성한 것이니 부디 참고하셔서 좋은 결과가 있기를 바란다.


시작이 늦었다고 해서 반드시 모든 것이 늦어야 한다는 법이 없기는 하지만, 상대적으로 시작이 늦은 만큼 더 많은 인내심을 가져야 하는 법이다. 준비된 자만이 기회를 잡을 수 있는 것처럼, 인내심을 가진 자만이 성공을 맛볼 수 있기 때문이다.


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

늦깎이 개발자에 대한 단상


필자는 일반적인 중소기업의 인사 담당자 못지 않게 개발자를 희망하는 수많은 지원자들의 이력서를 검토해왔고, 많은 지원자들과 면접을 본 다음 그 중에서 적지 않은 인원을 채용하여 업무를 수행한 경험을 가지고 있다. (물론 개발자뿐만 아니라 디자이너, 기획자 등도 많이 뽑아보았다.) 그러한 경험을 통해서 배운 사실 중에 하나는 늦게 시작할수록 자신의 적성이나 소질이 있는지 여부를 먼저 확실하게 파악을 한 다음, 그 다음에 행동으로 옮겨야 한다는 점이다. 아쉽게도 뒤늦게 개발자가 되고자 하는 분들은 “늦깎이 개발자 = 대부분 프로그래밍 소질이 떨어지거나 적성이 맞지 않음”이라는 공식에서 자유롭기 힘들기 때문이다.


이런 지원자들의 자기소개서 내용은 거의 비슷한데, 오랜 기간 동안 다른 분야의 일을 해왔지만 마음속으로는 계속 개발자가 되고 싶어했고 많이 늦기는 했지만 지금이라도 개발자가 되기 위해서 여러 가지 리스크를 감수하고 지원한다는 내용이다.


물론 여러 가지 분야에서 뒤늦은 나이에 자신의 소질을 발견하여 성공하는 사례들이 있기는 하다. 하지만, 프로그래밍 소질이 다소 부족하더라도 10년 정도를 소프트웨어 개발 관련 업무를 수행해온 경력을 가지고 있는 개발자와 비교해 본다면, 10년간 개발과는 아무런 상관이 없는 업무만 해왔던 사람이 아무리 프로그래밍 소실이나 잠재력이 많다고 하더라고 그 차이를 단기간에 따라 잡는 것은 쉬운 일은 아닐 것이다. 그런데, 거기에 엎친 데 덮친 격으로 프로그래밍 소질마저 없다면 얼마나 위험한 선택이라는 것인지는 여러분도 어렵지 않게 예상할 수 있을 것이다.


이런 경우에는 우선 기존에 다니던 직장을 그만두지 말고, 개인적인 시간을 활용하여 자신이 하고 싶어하는 소프트웨어 개발을 직접 해보는 것을 권장한다. 개발용으로 사용할 수 있는 스마트폰 단말기를 쉽게 구입할 수 있고, 누구나 손쉽게 자신의 어플리케이션을 등록하여 판매할 수 있는 앱 스토어가 있는 요즘과 같은 시대의 장점을 최대한 활용을 하여 자신이 정말 소프트웨어 개발자로서 자리매김을 할 수 있는지를 미리 확인해보는 것이 필요하기 때문이다. 더 좋은 것은 이러한 시도를 하면서 어떠한 성과 (앱 판매/다운로드 순위 상위 랭킹, 공모전 수상 등)를 이끌어내는 것이다. 이러한 성과들은 뒤늦기는 했지만 개발자로서 가능성이 있음을 알려주는 객관적인 판단 근거가 되어 줄 수 있다.


개인적인 시간을 프로그래밍 공부나 소프트웨어 개발에 사용하는 것은 쉽지 않을 것은 물론이고, 가장 큰 문제는 남들처럼 할 것 다 하면서 자신은 남들보다 더 나은 성과나 결과를 얻기를 원하는 태도일 것이다. 이미 사회 생활을 충분히 해본 늦깎이 개발자라면, 이 세상에는 그런 식으로 쉽게 얻을 수 있는 것은 아무 것도 없다는 것을 잘 알고 있을 것이다. 남들에 비해 많이 늦었음을 알고 있다면 말로만 그에 따른 리스크를 감수하고 더 많은 노력을 할 수 있다고 말하기 전에, 자신에게 남는 모든 시간을 프로그래밍 공부에 사용을 하기 위해 노력하는 자세를 갖추어야 할 것이다.


어찌 어찌해서 다행히 업무에 적응하여 자기 몫을 제대로 해냈다고 하더라도 예상치 못하게 숨어 있는 복병이 하나 있다. 처음에는 자신이 새로 시도하는 분야이기 때문에, 처음에는 상대적으로 열악한 조건으로도 근무가 가능하다라는 점을 강조했지만 어느 정도 자신감을 가지게 되면 스물 스물 본전 생각이 나고 애초에 협의된 근무 조건이 부당하다라는 생각이 들게 되는 문제이다. 대개 이런 경우에는 자신이 “늦깎이”라는 리스크에 대해서는 크게 고민하지 않고, 다른 사람들과의 동등한(!?) 대우를 요구하다가 그간의 고생을 인정 받지 못하고 그만두는 경우가 많다. 사람이라는 동물이 아무리 화장실을 가기 전과 갔다 와서가 달라질 수 있다고는 하더라도, 업무에 있어서는 다소 손해를 보는 것 같아도 계속 일관성을 유지하려는 노력이 필요하다. 지금 당장은 손해인 것 같아서 장기적으로 보면 개발자로써 성공적인 안착이 더 중요한 목표이기 때문에, 자신의 능력에 대해서 객관적인 평가 기준이 성립하기 전까지는 감수할 가치가 있는 것이다.


필자가 항공사진 구축&서비스 시스템을 한창 개발하고 있던 시기에, 잠시 같이 일을 했었던 촬영 담당자 M씨가 전형적인 늦깎이 케이스였다. 촬영 분야의 경력이 전무했지만 늦깎이임에도 나름 열정과 적극성을 보여서 열악한 근무 조건으로나마 합류할 수 있었다. (좀더 정확히 말을 하자면 “급여는 주시는 대로 받겠습니다”였다.) 마침 촬영 작업 자체도 처음으로 진행되는 일이라서 여러 가지 시행 착오를 겪어야 했고, M씨는 나름 고생을 하면서 항공사진 촬영 작업에 대한 기초 프로세스를 만들어 낼 수 있었다. 하지만, M씨는 그렇게 몇 개월간 고생을 하고 나니 회사 내에서 자신이 아주 중요한 일을 맡아서 하고 있다고 느껴졌고, 현재 받고 있는 급여는 그에 비해서 너무나도 형편이 없다라고 생각이 들게 되었다. 그래서 회사 사장님과 자신의 급여나 대우에 대해서 성급하게 재협상을 시도했고, 불행하게도 그것이 잘되지 않아서 곧바로 다른 인력으로 너무나도 쉽게 대체되고 말았다. 다른 인력으로 대체되었으나 업무 진행에 문제는 없었으니 결과적으로 M씨 본인만 아쉬운 상황이었을 것이다.


늦깎이 개발자가 실력을 제대로 인정 받고 적절한 대우를 받기까지는 많은 인내심이 필요하다. 그리고 그 인내심은 처음 그 길을 가기로 결심했을 때 생각했던 것보다 훨씬 더 많고 오랜 시간을 필요로 하게 된다. 따라서, 절대로 조급해하지 말고 누구보다 못지않은 실력과 경험을 쌓을 때까지는 남들보다 훨씬 더 많은 노력을 해야 한다. 그리고 그러한 노력을 제대로 인정을 받게 될 때까지 겸손하고 겸허한 마음 가짐을 가지고 기다리자.


by 나숑 2012. 11. 4. 16:49
  • 치킨맨 2013.11.25 23:58 ADDR EDIT/DEL REPLY

    참 안타까우면서도 많은 생각을 하게하는 글입니다...더 늦기전에 이쪽으로 다시 틀기를 잘했다는 안도감이 들면서도, 학원에서 같이 공부했던 늦깎이 형들을 떠올리게 하네요..ㅜㅜ

    • 나숑 2013.11.26 08:29 신고 EDIT/DEL

      네, 안타깝지만 실무에서 이런 케이스를 너무 보다보니 도움이 될까해서 쓴 글입니다. 그렇기 때문에 학창시절이나 사회 나와서 한살이라도 더 어렸을때 내가 하고 싶은 일과 나의 적성에 맞는 일을 찾으려는 노력이 아주 중요하다고 생각합니다.

이 부분은 필자가 실무를 경험하면서 많이 본 사항에 대해서 다룬 부분이다. 아마도 조금이라도 실무 경험이 있다면 쉽게 이해할 수 있겠지만, 반대로 유사 경험이 없다면 이해하기가 힘든 부분일 수도 있다. 분명히 말할 수 있는 것은 창의력을 발휘하여 문제를 해결할 수 있다면 여러분의 프로그래밍 공부는 보다 쉬어질 수 있다.


아쉽게도 창의력이라는 것이 인위적으로 개발되고 발달시키는 것이 어렵다는 것이 문제이다. 요즘에는 마치 특정 교육을 받으면 창의력을 가진 인재를 만들 수 있는 것처럼 광고하기도 하지만, 필자 생각에 창의력이라는 것은 총체적인 학습, 경험, 사고 등을 기반으로 하여 자연스럽게 표출되는 능력이라고 본다. 그런 의미에서 똑똑한 공부법은 자신이 가지고 있는 창의력을 최대한 발휘하여 좀 더 빠르게 몸으로 체득하는 것이 될 수도 있을 것이다.


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

무엇보다 중요한 것은 창의력이다


어느 누구에게든 제일 어려운 문제는 바로 “창의력”이다. 굳이 개발자가 아니더라도 창의적인 사고를 할 수 있는 인재는 생각보다 그렇게 많지 않다. 특히나 요즘에는 “창의력”에 포커스를 맞춘 교육을 어릴 때부터 하고 있기는 하지만, 단순히 그런 교육만으로 누구에게나 “창의력”이 갑자기 생길 수는 없을 것이다. 이러한 창의력은 다른 일을 할 때에도 큰 도움이 되는 요소이기는 하지만, 프로그래밍 공부를 할 때에도 반드시 필요한 덕목이라고 할 수 있다.


소프트웨어 개발과 관련된 학문 자체가 이공 계열의 학문이다 보니, 개발자들은 일반인에 비해 지나치게 논리적, 수학적, 기술적(엔지니어적)인 사고 방식을 가지고 있다. 이러한 이공계 출신들의 사고 방식 자체는 나쁘지 않지만, 문제는 지나치게 한쪽으로만 편중되어 있는 것이 문제라고 생각한다. , “인문학적인 사고나 통찰력 등이 가미가 된 엔지니어”와 같이 다른 분야에도 열려있고 융화될 수 있는 형태로 생각을 하고, 이것들을 바탕으로 “창의적”인 사고를 할 수 있는 개발자가 된다면 더 좋은 결과를 충분히 만들어 낼 수 있을 것이다.


두 사람의 개발자에게 동일한 프로그램의 기획서와 GUI 가이드를 전달해주고, 각자 자신의 스타일대로 프로그래밍을 하도록 시켜보면, 이러한 창의력의 차이가 가장 확실하게 드러나는 것을 확인할 수 있다. 대부분 기획자의 기획 의도와 디자이너의 디자인 의도를 저마다 다르게 해석을 해서 전혀 다른 두 개의 프로그램이 만들어지기 때문이다. 밋밋한 기획서와 디자인 가이드를 주었음에도 불구하고 톡톡 튀는 프로그램으로 만들어 내는 개발자가 있는 반면에, 완벽한 기획서를 전달해주었음에도 불구하고 아주 평범하고 심심한 프로그램을 개발하는 개발자가 있기도 하다. , 창의적인 개발자는 단순히 기획자와 디자이너가 시키는 대로만 프로그래밍을 하는 것이 아니라 자신의 다양한 아이디어를 녹여내어 더 좋은 프로그램으로 만들어 낼 수 있다는 것이다.


그리고, “소프트웨어 개발”이라는 일은 항상 어떤 문제를 해결해내는 “해결책”을 찾는 일이다. 그렇기 때문에 상대적으로 조금이라도 더 좋은 해결 방법을 찾는 개발자가 “실력이 있는 개발자”라고 불릴 수 있다. 같은 문제라고 해도 그것을 해결하려고 하는 개발자마다 저 마다 다른 방법의 해결책을 찾아낼 수 있고 이러한 문제 해결 방법이라는 것은 “정답”이 따로 있는 것이 아니기 때문에, 주어진 여건 속에서 가장 최선의 방법을 찾는 것이 중요하다고 할 수 있다. 이 때에도 절실하게 필요한 것이 바로 “창의성”이다.


창의력이 있는 개발자들은 주어진 문제를 평면적으로 보기보다는 문제 해결을 위해 다양한 접근 방법을 열어두고 검토하기 때문에, 남들보다 기발한 방법으로 손쉽게 문제를 해결해낼 수 있는 편이다. 반대로 창의력이 부족한 개발자들은 지나치게 좁은 시야로 문제를 바라보기 때문에 우회를 하면 쉽게 풀 수 있는 문제도 본의 아니게 복잡한 방식을 채택하여 어렵게 풀어 나가는 경우가 많다. 더욱 안 좋은 것은 주위에서 좀 더 나은 아이디어나 힌트를 제공해주더라도 그것을 쉽게 받아들이지 못하고 굳이 비효율적인 방법을 고집하는 경우도 종종 있다.


필자가 한때 같이 일을 했었던 A모 개발자는 프로그램의 사소한 기능의 변경이나 추가 작업을 할 때마다 “그것을 처리하기 위해서는 기존 구조를 모두 바꿔야 하기 때문에 시간이 많이 걸립니다”라는 답변을 앵무새처럼 늘 이야기 했었다. 처음에는 정말로 그렇게 많은 공수가 들어가야 하는 일이라고 생각하여, 가급적이면 기능이 변경되지 않도록 하거나 꼭 필요한 기능 이외에는 추가하지 않도록 관리를 해야 했다.


그러나, 어느 날 A모 개발자가 프로그램을 개발하는 모습을 옆에서 지켜보니 너무나도 쉽게 해결될 수 있는 문제들 조차 큰 의미도 없는 자신만의 코딩 규칙이나 원칙을 지키기 위해서 처리하지 못하고 있는 것을 발견하였다. 살짝 생각을 달리해보면 쉽게 해결될 수 있는 방법들이 많았음에도 불구하고 미처 그런 생각을 하지 못하는 것은 물론 설명을 해주어도 쉽게 이해를 하지 못한다는 문제가 있었던 것이다. 그래서 일부러 경험이 많은 선임 개발자를 붙여주어 근본적인 문제를 해결할 수 있도록 처리하였으나, 아쉽게도 A모 개발자는 이후에도 창의력이 부족한 방법으로 업무를 이해하였고 제한적인 방법으로만 문제를 해결하려고 했다.


필자는 개인적으로 창의력을 높이려면 가급적 다양한 분야에 대한 직접적/간접적인 경험들이 많아야 한다고 생각한다. 평소에 많은 것을 보고 느끼면서 배우는 것들이 있어야 정말 필요할 때 이전에 경험한 것을 바탕으로 적절한 “창의성”이 발휘될 수 있다고 보기 때문이다. 따라서, 여러분들이 비록 IT 업체에서 소프트웨어를 개발하기 위해서 프로그래밍 공부를 하고 있다고 하더라도 컴퓨터 이외의 다양한 분야에 대해서 관심을 가지고 다양한 정보를 얻으면서 색다른 시각을 가질 수 있도록 노력해야 한다.


by 나숑 2012. 10. 28. 15:24

본문 내용에도 적어놓았지만, 필자는 인문계 이과를 선택하였지만 수학 과목은 잼병이었다. 개인적으로 수학이라는 학문하고 궁합이 맞지 않는 부분에 대해서는 진심으로 아쉽게 생각한다. 왜냐하면 프로그래밍을 할 때에, 무식한 노가다성 알고리즘 보다는 효율적이고 안정적인 알고리즘을 만들 수 있는 확률이 더 높았을 것 같기 때문이다. 어떠한 방식으로든 프로그램을 구동시켜서 결과를 만들어내는 것은 가능하지만, 그 프로그램이 얼마나 더 효율적으로 운용되느냐는 그 프로그래머의 진정한 실력을 가늠할 수 있는 잣대가 되기 때문이다. 


만일 여러분이 수학을 잘한다면 프로그래밍 공부에 더욱 날개를 달아주는 조건을 갖추었다는 사실에 기뻐해야 한다. 전문적인 수학을 다루는 프로그램을 개발하지 않더라도, 수학을 공부하면서 다져진 기본적인 "수학적인 사고"는 여러분이 프로그래밍 공부를 할 때 큰 도움이 될 수 있기 때문이다. 


아직 수학을 배우고 있는 학생이라면, 좋은 프로그래머가 되기 위해서 지금부터라도 더 열심히 수학 공부에 매진하라. 물론, 프로그래밍 공부도 그만큼 더 열심히 해야한다.


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

프로그래머는 수학을 잘해야 한다?


가장 많이 듣는 질문 중에서 프로그래밍을 잘하려면 “수학”을 잘 해야 하느냐라는 질문이다. 개인적으로는 여기서 말하는 “수학”이란 우리가 일반적으로 말하는 “수학”이라기 보다는 “수학적인 사고”를 뜻하는 것이라고 생각한다. 단순히 수학 문제를 잘 푸는 것도 중요하지만 주어진 문제를 해결하기 위해서 수학적인 사고력을 이용하여 더 나은 해결 방법을 찾는 것이 중요할 것이다.


“수학”은 대수학, 미적분학, 수리논리학, 집합론, 범주론, 정수론, 해석학, 기하학, 위상수학, 응용수학, 확률론, 통계학, 수리물리학, 그리고 “이산수학” 등으로 구분할 수 있다. 이 중에서 전자계산학과에서 배우게 되는 대표적인 수학 과목은 “이산수학(離散數學:Discrete mathematics)”이다. 이산수학은 컴퓨터에서 다루는 자료형이 이산적이라는 관점에서 전산학의 기초라고 볼 수 있으며, 이산수학에서 나온 개념이나 기호 등은 컴퓨터 알고리즘과 프로그래밍 언어의 문제를 해결하는 방법을 찾는데 큰 도움이 된다.


이 자리에서 고백을 하자면, 필자는 인문계 고등학교에서 이과를 선택하여 수학을 배웠고 대학교에서도 공학 계열인 전자계산학을 전공을 하였지만 수학 성적이 좋은 편은 아니었다. 그래서 지금까지 오랫동안 프로그래밍을 해왔지만, 종종 수학 공부가 부족한 것에 아쉬웠던 경우가 있었다. 예를 들어 그래픽 명령어를 이용하여 곡선을 그릴 때 왜 그런 공식을 사용해야 하는지 쉽게 이해가 가지 않거나, 수학 개념을 사용하여 문제를 풀 수 있는 알고리즘을 만들어야 할 때, 그리고 무엇보다도 3D 프로그래밍을 망설이는 이유도 다른 프로그래밍에 비해 수학에 대한 높은 이해도를 요구하기 때문이었다.


이러한 필자의 경험에 비추어 본다면 수학을 잘 한다고 해서 반드시 프로그래밍을 잘하는 것은 아니겠지만 더 좋은 프로그래밍을 위해서 수학을 잘하는 것이 도움이 될 수 있다는 점은 분명하다고 할 수 있다.


간단하게 예를 들어보겠다. 컴퓨터 그래픽을 이용하여 원을 그린다고 할 때 우리는 수학 시간에 배운 공식을 이용하면 생각보다 쉽게 원을 그릴 수 있다.


radian(호도) = 각도 * π(PI) / 180


X = 반지름 * sin( radian )


Y = 반지름 * cos( radian )


이와 같은 공식을 이용한다면 각도 값으로 0부터 360까지 넣어 각각의 x, y 좌표를 구한 다음, 해당 좌표에 점을 찍어서 연결해주면 하나의 원이 완성할 수 있다. 이것을 간단하게 C언어로 작성을 한다면 다음과 같이 만들어 볼 수 있다. 아직 프로그래밍 언어를 배운 적이 없는 독자도 있겠지만, 그래도 한자한자 읽어보았으면 한다.


#include <graphics.h>

#include <math.h>


main()

{

int rasious = 100;

for (int degree = 0; degree < 360; degree++)

{

double radian = degree * M_PI / 180;

int x = radious * sin(radian);

      int y = radious * cos(radian);

putpixel(x, y, 1);

}

getch();

}


물론 이것 말고도 원을 그리는 알고리즘은 여러 가지가 있지만, 수학적이 베이스가 전혀 없는 개발자들이 원을 그려내기 위해서 억지로 머리를 짜내어 작성한 소스 코드를 보면 왜 수학적인 베이스가 중요한지를 새삼 느끼게 된다. 간단한 원 하나를 그리는 것도 이러한 차이가 있는데, 실시간으로 복잡한 수학 연산을 해야 하는 경우라면 얼마나 큰 차이가 있을지 여러분도 쉽게 짐작이 될 것이다.

by 나숑 2012. 10. 28. 15:17
| 1 2 |