본문 바로가기
Development

프로그래밍 배우는 법

by Dev. Jkun 2013. 5. 28.
반응형

출처 : http://booiljoung.blogspot.kr/2013/05/blog-post_2918.html?m=1

정부일님의 블로그


  주변에 프로그래밍을 배우겠다는 분들이 계셨습니다.  PC와 씨름을 하다가 1주일을 넘기지 못하고 포기하시더군요.  이런 노력을 하신분들에게 다시 한번 시도해 보시고, 새로 도전하시는 분들에게 도움이 될 수 있도록 포스트를 합니다.

  학원이나 학교에서 배울 수도 있습니다. 그러나, 현실은 중/고등학생이거나 소프트웨어 비전공인데 어쩌다 소프트웨어 분야에 들어와서 프로그래밍을 배워야할 필요성을 느끼는 기획자, 테스터 그리고 UI 디자이너, 테크니컬 아티스트 지망자들은 학교나 학원에서 배우면 체계적으로 배울 수 있는데, 업무로 수업 진도를 따라가지 못하면 도중에 포기하게 됩니다. (마치 중고등학교 수학처럼 기본을 놓치면 따라가기 힘듦니다.)

  대학에서 컴공을 전공과정으로 하더라도 수업 진도를 놓치면 1학년에 포기합니다. 실제 자퇴 비율도 높습니다. 기본적인 언어와 알고리즘, 시스템 구조는 알고 대학 전공 과목을 선택하는 것도 좋습니다. 고3이라면 수능 끝나고 겨울 방학이 좋습니다.

  저는 중/고등학생 시절에 컴퓨터에 흥미를 느끼고 독학으로 프로그래밍을 익혔습니다. 당시의 8비트 컴퓨터는 프로그래밍을 익히지 않으면 사용할 방법이 없었습니다. 물론 제가 학습한 방법이 모든 분들에게 모두 좋은 방법인지는 확신하지는 않습니다. 더 좋은 방법도 분명 있을 것입니다. 하지만, 이 방법을 적용하여 계속 성공적으로 익혀 왔고, 그래서, 이 방법을 공유합니다.

1. 프로그래밍이란?

  프로그래밍 언어만 잘하는 사람에게 프로그래밍을 기대할 수 있을까요?  프로그래밍 언어만 안다는 것은 마치 초등학교 들어가기 전의 말 잘하는 여자 아이와 같습니다.  말은 잘하지만 (법이 허용하더라도) 아이가 재판정에서 변호를 할 수는 없습니다. 변호를 하려면 인류 가치에 대한 판단력, 법률에 대한 지식, 재판에 대한 경험 등이 필요합니다.

  프로그래밍이란, 컴퓨터가 주어진 작업을 할 수 있도록 지시하는 절차를 작성하는 것입니다.  프로그래밍 언어만 알면 프로그래밍을 할 수 없습니다.  컴퓨터의 내부 그리고 컴퓨터가 다루는 것, 그리고 컴퓨터를 통해 다루는 방법에 대한 지식과 기술이 필요합니다.

2. 목표는 두뇌에 에너지를 준다.

  프로그래밍 언어를 한번 배워 볼 까? 하는 생각이라면 프로그래밍을 배울 생각을 접는 것이 좋습니다.  프로그래밍은 배우는 것은 의식적인 학습이고 끈기와 노력이 필요합니다.

  우리는 당장 소프트웨어를 직접 개발할 계획으로 프로그래밍을 배워야 합니다.  그것은 게임, 블로그, 쇼핑몰일 수도 있습니다.  시급한 목표는 뇌에 에너지를 줍니다.  지금 당장 필요한 기술은 난해한 영어 원서를 읽어도 잘 이해되고 기억되지만,  시급한 목표 없이 미리 준비해 둘 목적으로 학습을 하면 아무리 쉬운 기술이라도 내것이 되기 어렵습니다.

  무엇보다 필요한 것은 "왜 내가 프로그래밍을 배워야 하는가" 입니다.

3. 언어만 파면 결코 언어를 배울 수 없다.

  프로그래밍 언어만 공부하면 결코 프로그래밍 언어를 배울 수 없습니다. 프로그래밍 언어 과정에 나오는 내용은 데이터 타입, 데이터 구조, 연산, 제어, 컴퓨터 구조, 알고리즘 등을 알아야  프로그래밍 언어를 배울 수 있습니다.  이 지식들은 서로 이끌고 밀어주며 상승 효과를 가져 옵니다.

  1. 시스템 구조 (전자계산개론, 전자계산기구조 등)
  2. 프로그래밍 언어
  3. 자료구조와 알고리즘 + 이산(전산)수학

  이 세가지를 동시에 배워야 합니다 (알고리즘, 시스템 구조 교재는 대학 교재가 좋습니다.  알고리즘, 시스템 구조 내용의 일부는 중고등학교 수학 과정에 포함되어 있습니다.)

  예컨데, C언어를 배울때 포인터에서 포기했다는 분들이 있습니다. 전자계산기구조를 모르기 때문이라고 생각합니다. 전자계산기 구조를 알면 포인터 = 메모리 주소라는 것을 알 수 있습니다.  int *p = &a;를  해석하자면 '정수형 변수 a의 메모리 주소'를 '주소를 담는 변수' p에 넣어라. 라는 의미로 이해할 수 있습니다.

  프로그래밍 언어에 해시, 디셔너리에 대한 데이터 구조와 문법이 있습니다. 그런데 해시가 무엇인지 모르면 이해하기 어렵습니다.  알고리즘, 이산(전산)수학을 보면 해시에 대한 설명이 있습니다.  해시 테이블, 디셔너리, 이진 트리를 이해하는 것은 해시를 지원하는 언어 학습에 도움 됩니다.

4. 프로그래밍을 배우려면 PC를 멀리하라.

  처음부터 타이핑해가며 학습하는 방법은 많은 멘탈 에너지를 소비합니다. 쉽게 피로하고 지치고 졸립니다.  엎드려 자거나  몇줄 타이핑하고 에러 메시지에 머리 싸매다가 멘붕에 빠집니다.

 교재를 살피면 설명, 샘플 코드, 스크린 샷, 실행결과 까지 모두 담겨 있습니다.  직접 타이핑 할 필요 없이 소파에 누워서, 공원 벤치에 앉아서, 커피를 마시며, 출근길 지하철에서 읽을 수 있는 포맷입니다.   PC 없이 상상력으로 코딩 할 수 있습니다.

  프로그래밍 언어를 배우려면 PC를 멀리하세요.  배우고 싶은 교재를 준비하여 누워서 읽으면 됩니다.

5. 프로그래밍은 기술이다.

  프로그래밍은 기술이고 기술은 반복 학습을 통해 습득합니다.  이해, 실험, 통찰을 통해 배우는 과정은 더 숙달된 나중의 일입니다.  아직 우리는 기본적인 지식부터 해결 해야 합니다.

  먼저, 우선 시스템 구조, 프로그래밍 언어, 자료구조와 알고리즘에 관한 교재를 준비하여 간략하게 1번씩 읽습니다. 이해 하려고 하지 말고 "어떤 내용이 있다" 라는 수준으로 무작정 읽으세요. 각각 1회씩 읽으면 됩니다.

  1회 읽고 나면, 다시 용어, 스펠링, 설명, 샘플 코드, 결과 등을 상세하게 읽습니다.  두번째에는 일부 내용들이 이해되기 시작할 것입니다.

  세번째 상세하게 읽습니다. 읽다 보면, 전에 읽었을 때 없던 내용들이 보이기 시작합니다.  이런 느낌이 든다면 반은 성공한 것입니다.  전에 읽었을때 집중력이 흐트러져 놓쳤거나, 잘 기억하지 못한것이고, 지금은 알고 있는 것과 모르는 것을 파악하고 있습니다.

  반복해서 5번 정도 읽으면 전체 윤곽이 그려지는데 5번 읽기는 지루해서 어렵습니다.

  다른 교재로 바꿉니다.  새로 구입하셔도 되고,  지인들끼리 미리 약속해서 책을 서로 교환해서 보셔도 됩니다. 물론 기존 책을 계속 읽으셔도 됩니다.  저는 교재를 바꾸는 것을 추천합니다.  항목별로 충실도가 다르기 때문입니다.

  새 교재로 세번 정도 더 반복해서 읽으면 전체 윤곽이 서로 연결되며 레이아웃이 잡히는 시기가 옵니다. 이제 이해된것입니다.  (예컨데, 함수를 호출하고 원래 위치로 돌아오는 코드는 자료 구조의 스택과 관련이 있습니다.  논리 AND 연산자는 전산계산기구조의 논리기호와 스테이트 차트에 그 의미가 나오고 이산(전산) 수학에도 나옵니다.)

  이 학습만 한다면 1개월 정도, 다른 일을 하며 틈틈히 하면 6~12개월 걸릴 것입니다.

  여기까지 하셨으면 학교나 학원에서 배울 수도 있습니다. 중간에 진도를 못따라가서 놓칠 가능성이 줄어듭니다.  또는 계속 독학으로 공부하셔도 됩니다. 빌게이츠, 주크버그, 워즈니악은 중고등학교때 독학으로 배웠습니다. 물론 학교나 학원을 통해 배우면 체계적으로 빠르게 배울 수 있습니다.

6. 첫 언어 배우기가 가장 어렵다.

  첫 언어를 배우고 나면 두번째 언어부터 쉽습니다.  그러니까 처음부터 어려운 언어를 선택할 필요가 없습니다.  어려운 언어는 쉽게 포기하게 합니다. 아이폰 앱을 만들고 싶다고 하여 처음부터 어려운 Objective-C를 배울 필요가 없습니다.  그리고 프로그래머로 일을 하려면 적어도 3~4가지 정도의 언어(주력, 스크립트, 시스템, 기타 등)는 알고 있는 것이 낫기 때문입니다.

  (오래돗안 프로그래밍을 하여 숙달되면 책 두권을 3일 정도에 읽으면 언어를 이해하고 코딩 시작할 준비가 됩니다. 일주일 정도면 툴을 사용하고 간단한 앱을 만들어 볼 수 있습니다.  문법과 사용방법만 다를뿐 기본은 비슷하기 때문입니다.  물론 언어의 깊은 내용과 프레임워크를 익히는 것은 많은 시간이 걸립니다. 완전 숙달 되려면 프레임워크 크기에 따라 3년 걸립니다. 그리고, 숙달정도에 따라 실제 개발 현장에서 속도 차이가 발생합니다.)

  첫 언어로 인터렉티브 쉘을 가진 언어를 권합니다. Python, Ruby, haskell 등이 인터렉티브 쉘을 가지고 있습니다.

  맥을 사용하고 있으면 Python, Ruby는 설치되어 있습니다.  윈도우즈의 경우 설치는 쉬우나 별도로 시스템 설정을 통해 경로를 제대로 설정해줘야 합니다.  리눅스의 경우 Ruby가 설치되어 있지 않습니다.  리눅스에 설치하는 방법은 이 포스트를 참조하시면 됩니다.

  혹자는 Python이나 Ruby로 앱을 못만든다 또는 속도가 느리다. 하는 주장을 합니다. 우리는  속도가 빠른 애플리케이션을 만드는 목적이 아닙니다. 축구 경기에 이기기 위해서는 골을 넣어야 하며,  센터라인을 돌파하여, 상대편 골포스트로 전진해야 합니다. 우리는 센터라인을 넘기 위한 학습이 필요한 것입니다.  그리고,  Python, Ruby가 앱을 못만든다는 얘기는 잘 모르는 사람의 거짓말입니다.  Python, Ruby도 창을 띄우는 단독 실행 패키지를 만들 수 있으며, 좋은 점은 패키징 툴만 바꾸면 맥, 윈도우, 리눅스등에서 실행이 되는 애플리케이션이 됩니다. 모바일 앱은 래퍼가 없고 속도 문제로 현재 어렵습니다.

  애플 맥 유저는 쉘에서 idle을 입력하면 Python 인터렉티브 쉘을 사용할 수 있고, irb를 입력하면 Ruby 인터렉티브 쉘을 사용할 수 있습니다.  인터렉티브 쉘은 프로그래밍을 쉽게 파악할 수 있도록 도움을 줍니다.

  이제 교재에 나온 샘플들을 직접 타이핑해가며 실행해 봅니다. 프로그래밍 언어나 알고리즘은 이미 알고 있습니다. 직접 타이핑해가며 실행하는 과정에서 오타로 인해 에러메시지가 쏟아져 나올 것입니다.  에러메시지를 꼼꼼히 읽고 해석하거나 구글에서 검색해 보면 에러 메시지가 발생한 이유를 알고 대책을 세울 수 있습니다.

  (키보드를 보지 않고 타이핑 할 수 있어야 합니다.  키보드를 보면서 타이핑하면 결코 프로그래밍을 배울 수 없습니다.  키보드 연습 소프트웨어를 통해 손가락 나눠 맡기, 맥거린 타이핑을 익혀야 합니다.)

7. 알고리즘 퍼즐 풀어 보기

  퍼즐형 알고리즘 문제를 푸는 학습을 통해 문제를 더 쉽게 해결하는 여러가지 알고리즘을 익히는 것도 좋습니다.  소프트웨어 개발 업무들은 미들웨어나 프레임워크에서 대부분 해결 해 주기도 하지만, 알면 더 어려운 문제 해결이 가능하고 프레임워크를 이해하는데 도움이 됩니다.  "OO로 풀어보는 알고리즘", "X를 자극하는 알고리즘"등에 나오눈 문제를 쉬운 언어를 사용하여 미리 경험해보면 좋습니다.

8. 두번째 언어로 프로젝트 진행하기

  프로그래밍을 어느정도 익혔으니 무엇이라도 만들고 싶은 생각이 듭니다. 첫 언어도 충분한 프레임워크들을 가지고 있으니 그 언어로 시도해도 되고, 본격적으로 배우고 싶은 다른 언어와 프레임워크를 새로 배울 수 있습니다. 두번째이니 짧으면 일주일 길면 한달 정도 걸릴것입니다.

  그런데, 지금 당장 앱을 만들기 시작하면 다시 시간을 낭비하게 됩니다.

9. 프레임워크 파악하기

  경력 많은 개발자들이라고 하여 모든 프레임워크에 익숙하지는 않습니다.  다른 유사한 프레임워크를 통한 경험이 있기 때문에 빠르게 배울 수는 있죠. 자주 사용하는 프레임워크는 익숙하게 사용하지만, 자주 사용하지 않는 프레임워크는 문서를 보거나,  검색하거나, 주위의 도움을 받아가며 합니다.  

  프로젝트를 진행하기 전에 전체 프레임워크 윤곽을 알고 있어야 합니다. 어떤 클래스, 인터페이스, 모듈,  컴포넌트들이 존재하고 어떤 용도와 목적을 가지고 기능들을 지원하는지 알고 있어야 작업을 할때 어떤 프레임워크의 힘을 빌릴지 생각해낼 수 있습니다.  모르면, 프레임워크에 있는데도 불구하고 구현해 버릴 수도 있습니다.

  시간을 아끼기 위해 프레임워크 문서, 이름과 첫 오버뷰들을 읽어 두시면 됩니다.  그리고 해당 프레임워크의 필요성을 느꼈을때 그것을 기억해 낼 수 있고, 그때 자세히 파악하시면 됩니다.

10. 첫 프로젝트는 실패하기 마련

  직접 만들어 보는 것은 중요합니다.  직접 부딪히며 얻는 지식과 경험이기 때문입니다. 하지만, 3~5개 정도는 중간에 포기합니다.  계획에 비해 경험이 없으니 어려워 포기하죠.  프로젝트는 단순하게 계획합니다. 창 1~2개 정도, 웹 페이지 1~2개 정도. 간단한 슈팅 게임, 혹은 내 소개 페이지, 게시판등을 만들어 보세요.  

11. 구글링과 스택오버플로우 그리고 조력자들

  GDD라는 개발자들의 우스개 용어가 있습니다.  Google Driven Development 입니다. 프로그래밍은 구글을 통해서 한다는 뜻입니다. 대부분 프레임워크 사용법, 예제, 에러메시지에 대한 대책을 찾는 것이죠. 원인을 알 수 없는 에러메시지의 경우 구글에서 검색해보세요. 대부분 Stackoverflow.com에서 검색해 줄것입니다.

  포럼 등을 잘 활용하세요. 초급에 해당되는 질문에 대한 답변은 잘 해주지 않습니다. 기초적인 내용은 책이나 여러 문서에 찾아 볼 수 있기 때문입니다.  포럼은 보통 중상급의 질문만 받습니다.

  지금 소프트웨어 회사에서 기획자나 테스터로 일하고 있다면 주변에 프로그래머가 있을 것입니다. 어려운 문제는 프로그래머에게 물어보세요. 그들은 자신의 무용담에 대해 잘난척 하기를 좋아 하고, 지식의 교류가 발전의 힘임을 알고 있습니다. 만일, 학교나 학원이라면 교수나 강사로 부터 도움을 받습니다.

11. 오픈 소스 분석하기

  기초에서 초급으로 빠르게 올라 설 수 있는 방법 입니다.  Python을 배운다면 PyPI에 등록된 소스를 읽거나, PyPy 소스를 읽는 것도 좋습니다. Unity3d을 배운다면, 예제 프로젝트를 다운로드하여 소스를 분석하고 이해합니다.  C언어를 배운다면 gcc 소스나 libc소스를 읽고 분석합니다.  StarUML 같은도구들이 있습니다. 설계도를 그려보고 소스의 윤곽을 잡아봅니다. (소프트웨어를 분석하기 전에 해당 소프트웨어를 사용할 줄 알아야 합니다. 기능을 먼저 정리해보고 소스를 분석하면 도움이 됩니다.)

마치며

  큰 프로젝트를 진행하려면 팀에 속해야 합니다. 그리고 다른 소프트웨어들의 도움을 받아야 합니다.  SQL, NoSQL, 네트워크, 운영체제, 컴파일러, 디자인 패턴, UML, 리팩토링, git, issue tracker, 요구분석, 아키텍쳐, 테스트, 애자일, 더 향상된 알고리즘, 그리고 많은 미들웨어, 프레임워크, 라이브러리들 등 학습할 내용이 기다립니다.  계속 배워 나가시면 됩니다. 역시 반복해서 읽는 방법(간략 - 상세 - 상세 - 간략 - 상세 - 상세)은 계속 도움이 될것입니다.


반응형

'Development' 카테고리의 다른 글

CAPTCHA  (0) 2013.05.29
웹사이트 최적화  (0) 2013.05.29
웹매트릭스 단축키 (Web Matrix Shot Cut Key)  (0) 2013.05.21
isDeveloper  (0) 2013.04.26
서적 - 조엘 온 스프트웨어  (0) 2012.08.31

댓글