2007/01/31

원문 :http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Vim/Documents/UsedVim



VIM을 사용하자

윤 상배

dreamyun@yahoo.co.kr

고친 과정
고침 0.9 2004년 3월 10일 17시
vim 모드와 관련된 부가내용 추가
고침 0.8 2003년 3월 1일 23시
최초 문서작성

1

1. vim 이란

vim 은 유닉스 계열에서 전통적으로 널리 사용도던 vi 의 improve 즉 undo, syntax coloring, split windows 등의 기능을 포함시킨 vi 의 보강된 프로그램이다.

이 문서는 vim 의 기본적인 사용법과, 프로그래밍을 위한 여러가지 팁을 담고 있다. vim 버젼은 6.0 을 기준으로 한다. vim(vi)에 대한 자세한 사용방법은 여기에서는 제시하지 않을것이다. 가장 기본적인 사항만 언급할것이며, 자세한 사용법은 vi 사용자그룹 사이트를 참고하기 바란다.


2. VIM의 기본사용법 익히기

이번장에서는 vim의 기본적인 사용법에 대해서 알아보도록 하겠다. 위에서 언급했듯이, 이문서는 VIM의 레퍼런스 가이드는 아니다. 기본적인 사용이 가능하도록 가장 기초적인 내용들만 다룰것이다.


2.1. vim 모드

다른 에디터를 사용하던 유저가 vim을 처음 접하면서 가장 난감해 하는 부분이 vim의 상태(mode)개념이다.vim은 다른 에디터들과 달리, 실행을 시켰다고 해서 즉시 입력이 이루어지지 않는다. 많은 vim을 처음 접하는 유저는 어떻게 글을 입력할지 몰라서 vim의 사용을 접게되는 경우가 발생하는데, 여기에 그 이유가 있다. vi 는 크게 세가지 상태로 나뉘어진다. 첫번째가 명령어 모드로 키입력이 바로 실행되는 상태이며, 다음은 상태모드로 실제 문서를 편집하는 모드 마지막이 ex 상태로 ex 명령을 실행시키는 상태이다.

vi 를 처음실행시키면 입력모드가 아닌 명령모드 상태에 놓이게 된다. 이 상태에서는 문자의 입력이 이루어지지 않으며, 찾기등과 같은 간단한 문서관련 명령을 실행할 수 있다. 이 명령모드 상태에서 ":" 키를 누르면 ex 상태로 a, i, o 키 등을 누르면 입력 상태로 넘어가게 된다. 일단 입력상태로 들어가게 되면 문서 편집을 할수 있게 되는데, 이때 ESC 키를 누르면 명령모드 상태로 넘어가게 된다.

표 1. vim의 상태(mode)

명령 상태 처음 vim을 실행했을때, 입력상태/명령상태에서 ESC입력시 간단한 찾기, 커서 이동, ex 상태로 넘어가기
ex 상태 명령 상태에서 (":") 각종 치환, 저장, 파일읽기, vim설정등과 같은 대부분의 작업들
입력 상태 명령 상태에서 (a,i,o 키 입력) 내용 입력

2.2. 명령어모드의 사용

우리는 명령모드에서 여러가지 명령을 입력함으로써, 복사, 붙이기, 삭제 문서입력, 문서저장, 문서불러오기, 커서이동 등의 작업을 할수 있다. 이번 장에서는 이러한 명령모드에서 사용되는 각종 명령어에 대해서 알아보도록 하겠다.


2.2.1. 커서 이동

기본적으로 vi 는 입력모드에서 방향키를 이용해서 커서 이동을 하지 못하도록 되어있다. 비록 최근의 vim 이 입력모드에서 방향키를 이용한 커서 이동을 지원하고 있기는 하지만, 명령모드에서의 키이동이 훨씬 빠르고 편하므로, 처음에는 좀 어색하더라도 명령모드에서의 키 이동을 익히도록 하자.

표 2. 커서 이동

k 커서를 위로 움직임
j 커서를 아래로 움직임
h 커서를 왼쪽으로 움직임
l 커서를 오른쪽으로 움직임
- 커서를 줄의 처음으로 옮김
e, E 다음단어의 끝으로, 문자단위 이동
w, W 다음단어의 처음으로, 문자단위 이동
$ 줄의 마지막으로
0 줄의 처음으로
^ 줄의 처음으로(공백이 아닌 처음시작되는 문자)
Shift+g 문서의 마지막으로 이동한다.
gg, 1g 문서의 처음으로 이동한다. 1대신 다른 숫자를 입력하면 해당 숫자의 라인으로 이동한다.
), ( 다음, 이전 문장의 처음으로
}, { 다음, 이전문단의 처음으로
]], [[ 다음, 이전 구절의 처음으로

2.2.2. 화면 스크롤

위의 커서명령 이동이 매우 편하기는 하지만, 만약 페이지가 한 2000라인 될경우, 위의 커서를 이용해서 한줄씩 이동하는데에는 너무 많은 시간이 걸릴것이다. 그래서 vi 에서는 화면 단위의 스크롤이 가능한 명령들을 제공한다. 아래의 화면 스크롤 명령어들을 익히면 빠른 위치이동을 위해 매우 유용하게 사용할수 있다. ^F 는 CTRL+F 를 의미한다.

표 3. 화면 스크롤

^F 한 화면 을 앞으로 스크롤
^B 한 화면 을 뒤로 스크롤
^D 반 화면 을 앞으로 스크롤
^U 반 화면 을 뒤로 스크롤
^E 한줄 앞으로 스크롤
^Y 한줄 뒤로 스크롤
Shift + h 화면의 맨 윗줄로
Shift + m 화면의 중간줄로
Shift + l 화면의 맨 아랫줄로

2.2.3. 마크 이동

일종의 책갈피 기능이라고 보면 된다. 자주 참조해야할 라인에 마크를 해놓고 필요할때 곧바로 마크된 영역으로 이동하기 위해서 사용한다. 마크는 mx 형식으로 사용할수 있다. x 는 (a~z)까지의 문자로 마크된 영역의 이름을 지정하기 위해서 사용한다. 마크된 영역으로 이동하기 위해서는 'x 와 `x 를 사용한다. 'x 는 마크된 라인의 가장 앞으로 이동하고, `x 는 마크된 라인의 정확한 위치로 이동한다.


2.2.4. 입력 명령

지금 vi 를 실행시켜보자. vi 는 기본적으로 명령모드로 실행되므로, 지금상태에서는 문서 작성을 할수 없을것이다. 우리는 다음과 같은 키입력을 통해서 입력모드 상태로 전환할수 있다.

표 4. 입력 명령

i 현재위치에서 삽입
I 현재줄의 처음위치에서 삽입
a 현재위치에서 한칸앞으로 이동해서 삽입
A 현재줄의 마지막위치에서 삽입
o 새로운 줄을 커서 아래에 연다
O 새로운 줄을 커서 위연다
s 현재 위치의 문자를 지우고 입력모드로 들어간다.
S 현재위치의 라인을 지우고 입력모드로 들어간다.

2.2.5. 편집명령

여기에서는 vi의 편집기능인 복사, 붙이기, 삭제에 대해서 알아 보도록 하겠다. 다른 에디터들은 보통 마우스를 이용해서 블럭을 지정해서 편집을 하는 반면, vi 는 명령어 모드에서 키보드 만을 이용해서 편집이 가능하므로, 매우 편리하고 빠르게 편집작업들이 가능하다. 또한 라인단위 블럭, 블럭단위 블럭등의 선택 모드를 지원함으로써, 문서에서 원하는 부분에 대한 작업을 좀더 쉽게 할수 있다.


2.2.5.1. 편집(none visual block 모드)

visual block 모드가 아닌 상태에서이 편집에 관한 내용이다.

표 5. 복사,삭제,붙이기

y 한줄 복사
yn 현재 라인에서부터 n라인만큼을 복사
p 복사된 내용 붙이기
dd 한줄삭제
dw 한단어 삭제
Shift+d, d$ 현재커서 위치에서 마지막까지 삭제
Shift+j 현재 행의 개행문자를 제거한다. 즉 아래라인을 현재라인에 덧붙인다.

2.2.5.2. Undo (되돌리기)

vim 은 다중의 undo 기능을 지원한다. 뒤로 되돌리고 싶다면 단지 'u'키만 입력하면 된다.


2.2.5.3. 블럭 지정

이번엔 블럭지정, 그중에서도 vim 에서 지원하는 visual 블럭 지정에 대해서 알아보겠다. vim visual 블럭 지정 기능을 사용할경우 지정범위가 반전되면서 눈에 보이기 때문에, 효과적인 블럭지정이 가능하도록 도와준다. 범위지정을 위해서 'hjkl', 'Shift+g,GG' 과 같은 이동명령 과 화면스크롤 명령을 사용해서 범위지정을 좀더 빠르게 할수 있다.

표 6. 블럭지정

v 단어단위로 블럭지정이 가능하다. 블럭범위는 이동명령인 'hjkl' 로 원하는 범위 만큼 지정할수 있다.
Shift+v 라인단위 블럭지정이다. 라인전체가 선택되며, 위아래 이동명령 'hj' 으로 범위 지정이 가능하다.
Ctrl+v 블럭단위 블럭지정이다. 4각형의 블럭지정이 가능하며 이동명령인 'hjkl' 로 원하는 범위를 지정할수 있다.
Shift+v 와 같이 블럭지정을 한후 Shift+G 를 입력하면 현재라인부터 마지막 라인까지가 블럭 지정이 될것이다.

2.2.5.4. 편집(visual block 모드)

일단 vim 의 visual 블럭 지정 기능을 이용해서 편집하기 원하는 블럭을 지정했다면, 각종 편집명령을 이용해서 복사, 붙이기, 삭제 작업이 가능하다. 블럭을 지정한 상태에서 아래의 명령을 이용해서 편집을 하면 된다. 명령어는 기본적으로 none visual block 모드의 편집 명령어과 같다.

표 7. 편집(복사, 삭제, 붙이기)

y 지정된 블럭을 복사한다.
p 복사된 블럭을 현재라인(커서) 아래에 붙인다.
d 지정된 블럭을 삭제한다.
dd 현재라인을 삭제한다.

2.3. ex 모드

2.3.1. 찾기/치환

vim 의 기능중 가장편리한 기능으리면 뭐니뭐니 해도, 정규표현식을 이용한 강력한 찾기기능과 치환기능이라고 할수 있을것이다. 물론 다른 대부분의 에디터들도 찾기기능과 치환기능을 제공하긴 하지만, vim 의 기능은 다른 에디터들에 비해서 정말로 독보적인 편리함과 강력함을 제공한다. vi 사용자가 다른 에디터로 넘어가기 힘든이유중 가장큰 이유가, 바로 "키를 이용한 방향입력" 과 "찾기 및 치환" 기능 때문이다.

사실 찾기 치환의 기능을 제대로 이해하고 사용하기 위해서는 정규표현식(regular expression) 에 대한 이해가 필요로 하는데, 이것은 다음의 사이트를 참조하기 바란다. 정규 표현식의 간략한 소개

먼저 찾기 기능에 대해서 알아보겠다. 찾기기능은 ':/패턴/' 를 이용 하면된다. 찾기 원하는 문자혹은 패턴을 입력하고 엔터키를 누르면 현재 커서위치에서 가장 가까운 곳에 위치한 문자열로 커서를 이동시킨다(문서 아래방향으로). 다음 문자열을 찾기를 원한다면 'n'키를 누르면 된다. 문서에서 가장 마지막에 이르르게 되면, 문서의 가장처음부터 다시 찾기 시작한다. 'Shift+n' 을 이력하면 반대 방향(문서의 위쪽으로)으로 찾기를 시작한다.

치환이야 말로 vim 의 꽃이라고 할수 있다. :[범위]s/[oldpattern]/[newpattern]/ 의 형식으로 사용하면 된다. 범위 지정은 visual block 을 이용할수도 있으며, 직접 범위를 입력할수도 있다. visual block 를 이용한 치환은 visual block 를 지정한다음 ':' 를 입력해서 ex 모드로 넘어가면 된다. 그리고나서 ':'<,'>s/[oldpattern]/[newpattern/' 과 같은 방법으로 치환하면 된다.

visual block 를 사용하지 않고 직접범위를 입력할수도 있다. :[시작],[마지막]s/[old]/[new]/ 식으로 범위를 지정하면 된다. 여기에는 몇가지 지정된 범위를 위한 특수 기호들이 있다. '%' 는 전체문서(처음부터 끝까지), '.' 은 현재, '$' 은 마지막 을 나타낸다. 숫자를 입력할경우 숫자는 라인을 나타낸다. 다음은 간단한 사용예이다.

# 문서 처음부터 마지막까지의 char 를 _char_ 로 치환한다. 
:%s/char/_&_/g

# 현재(커서위치)부터 마지막까지의 char 를 _char_ 로 치환한다.
:.,$s/char/_&_/g

# buf_.*[255], buf_in[255], buf_get[255] 와 같은 문자열을 hello 로 변경한다.
:1,10s/buf_.*[255]/hello/g
마지막에 쓰인 'g' 는 global 이다. 즉 해당 라인 전체에 걸쳐서 검색후 치환한다. 'g' 를 사용하지 않을경우 라인에서 처음에 검색된 문자만 치환하고 다음 라인으로 넘어간다.

2.3.2. 파일 저장, 열기, 종료

파일열기의 경우 vi 를 실행시킬대 명령행 옵션으로 열기가 가능하다. 또한 vi 를 이미 실행 시킨후에도 명령모드에서 명령을 입력함으로 파일을 열수 있다. 열고자 하는 파일이 이미 존재할경우에는 존재하는 파일이 열리고, 열고자 하는 파일이 존재하지 않을경우 새로운 파일이 만들어진다.

표 8. 저장,열기,종료

:e [filename] filename 으로 파일열기
:q, :q!, :wq 종료, 강제종료, 저장후 종료
:w, :w [filename] 현재파일명으로 저장, filename 로 저장
:<범위>w [filename] 지정한 범위만 다른 파일로 저장
:e [filename] filename 을 편집하기 위해서 연다
ZZ 지금파일을 저장하고 vim 을 종료한다.
:f 현재 작업중인 파일의 이름과, 라인수를 출력한다

3. 개발자를 위한 vim 사용팁

3.1. 화면 나누기

vim 은 수평나누기와 수직나누기를 제공한다. 수평나누기는 ":split [파일이름]" 수직나누기는 "vs [파일이름]" 으로 나눌수 있다. 파일이름을 지정한 경우, 새로 만들어진 창에는 파일이름 을 가지는 파일이 열리고, 파일이름을 지정하지 않을경우 똑같은 파일이 열린다. 이 기능은 현재 파일의 다른 부분을 참조하고 싶을때 유용하게 사용할수 있다(참조하는 부분으로 이동하기 위해서 왔다갔다 하지 않아도 되므로). 또한 ":10split [파일이름]", "10vs [파일이름]" 등으로 창의 크기를 조절해 줄수도 있다. 창 나누기는 2개 이상 나누기도 가능하다.

이렇게 창을 분할시켜 놓으면 쏘쓰를 참조하기도 편하고, 무엇보다 편집(삭제,복사,붙이기)가 가능하므로 훨씬더 작업을 수월하게 할수 있다.


3.1.1. 화면 이동

명령 모드에서 CTRL+ww 를 입력하면 된다. 그러면 아래창으로 이동한다. 임의로 이동하기 위해서는 Ctrl+w 를 입력한 상태에서 이동명령[hjkl]를 이용하면 원하는 방향으로 창이동이 가능하다.


3.1.2. 파일 네비게이션

vim 6.0 부터는 파일네비게이션 기능이 존재합니다. 예를들어 vi 로 파일을 열때 파일을 디렉토리로 지정하면 해당디렉토리의 내용이 네비게이션 되고, 디렉토리 이동및 파일 선택이 가능하다.

	
vi ./ # 현재 디렉토리내용을 네비게이션 해준다.

3.2. 파일 네비게이션 바 만들기

윈도우의 울트라 에디트와 같은 프로그램을 보면 왼쪽에 파일네비게이션이 있어서 원하는 파일을 바로 선택해서 편집하는 기능이 있다. vim 으로도 이러한 기능을 구현할수 있다. 이것은 vim 의 file navigation 기능과 창나누기 기능을 이용해서 구현하면 된다.

vi 가 실행되 상태에서 수직창 나누기 기능을 이용해서 ":20vs ./" 명령을 내려보자 그럼 그림과 같이 오른쪽에 파일 네비게이션 바가 생김을 알수 있다.

그림 1. 파일네비게이션을 만든 화면

이제 열기를 원하는 파일위치에 가서 shift+o 를 입력해보자, 그럼 옆의 편집창에 새로운 파일이 열리는것을 알수 잇을것이다. 여기에 더해서 편집장을 split 로 나누면, 여러개의 파일을 오가면서 편집이 가능해질 것이다.

3.3. 여러개의 파일 편집하기

위에서는 창나누기를 이용한 여러개의 파일편집에 대해서 알아봤는데, 또다른 방법이 있다. 처음에 vim 을 통하여 여러개의 파일을 open 하고 여러개의 열린 파일을 이동하면서 편집하는 방법이다. 먼저 vim을 다음과 같이 실행시킨다.

 
[yundream@localhost test]# vim file1.txt file2.txt ...
그러면 처음 화면은 file1.txt 편집화면일것이다. 2번째 파일인 file2.txt 편집화면으로 넘어가길 원한다면(앞에 있는 파일 편집)
:n
file2.txt 에서 file1.txt 를 편집하길 원한다면(뒤에 있는 파일편집)
:e#
split 를 이용해서 여러개의 파일을 편집할때와 마찬가지로, 각종 편집기능(복사,삭제,붙이기)이 서로 공유되므로 편하게 작업이 가능하다.

3.4. 잠시 쉘로 나가기

보통 vim상에서 쉘명령어를 실행시키기 위해서 :![명령어] 를 사용하는데, 이것 보다는 Ctrl+z 를 이용해서 쉘로 빠져나가서 작업하는게 더 편하다. sehll 이 job control 기능을 이용한것으로, 쉘에서 원하는 작업을 수행하후 fg 명령을 이용해서 다시 vi 편집 상태로 되돌아 올수 있다. vim 사용자를 보면 가끔 쉘작업을 하기 위해서 vim 을 아예 종료 시켜서 쉘로 빠져나간 다음에 작업을 하고 vim 을 다시 실행시키는 경우가 있는데, 이제는 그럴필요가 없이 좀더 편하게 작업을 할수 있을것이다.


3.5. 선택된 block 를 다른 이름으로 저장하기

split 기능을 이용해서 창을 나누고, 원하는 블럭을 선택해서 복사한다음에, 새로만든창에 가져다 붙이기를 하면 된다.

그러나 이방법은 조금 복잡한 감이 없잖아 있다. 이럴때는 블럭을 선택해서 :'<,'>w [파일명] 하면 좀더 간단하게 원하는 작업을 수행할수 있다.


3.6. 빠른 괄호 이동

C나 C++ 을 사용하다보면 제어문이나 함수에서 많은 괄호('{','(')를 만나게 된다. 이때 괄호의 제일 마지막으로 이동하고 싶을때가 있을것이다. 이럴때는 ']}' 를 사용하면 된다. '[{' 를 사용하면 괄호의 처음으로 이동한다.


3.7. 위치 마크(mark)하기

일종의 북마크기능으로 자주참조할만한 라인을 마킹해두고 필요할때 간단히 해당 마킹지역으로 이동하기 위해서 사용한다. 마킹을 위해서는 명령모드에서 m키를 눌러서 마킹모드로 들어가면 된다. 그리고 영문 [a-zA-Z]키중 아무거나 눌러주면 된다. 만약 a를 눌러주었다면, 현재라인은 a이름으로 마킹된다. 이후 작업을하다가 a마킹라인으로 가고 싶다면 'a 해주면된다. 이상태에서 원래라이으로 되돌아가고 싶다면 ''를 눌려주면 된다.

물론 다중마킹도 허용한다. 마킹할수 있는 문자는 단일영문자이다. 마킹에 사용되는 영문자는 대소문자를 구분함으로 최대마킹가능한 수는 27*2가 될것이다.


3.8. 폴더(접기) 기능이용하기

vim 6.0 에 새로이 포함된 좋은 기능으로 코드의 특정영역을 접을수 있다. 그럼으로 코드를 분석할때 쓸데 없는 부분을 감춰줘서 좀더 편하게 분석이 가능합니다. visual block 를 이용해서 원하는 영역을 선택한다음 :zf 를 이용하면 해당영역이 접힌다. :zo 를 사용하면 접힌영영을 원상태로 복구할수 있고 :zc 를 사용하면 해당영역을 다시 접을수 있다. 또한 다중 접기를 허용해서 접근구역을 다시 접을수도 있다.


3.9. 간단한 man 페이지 참조

vim 을 이용 코딩중에 함수의 프로토 타입이 생각나지 않을때 주로 man page 를 참조하게 된다. 보통은 창을 하나따로 띄워서 그곳에서 man page 를 보는데, 코딩중에 간단하게 해당 함수에 대한 man page 를 볼수 있다. man page 를 원하는 함수 위로 커서를 옮긴다음 Shift + k 를 입력하면 함수의 man page 가 뜰것이다. 'q' 를 입력해서 man page 를 종료시키면 원래의 vim 화면으로 되돌아온다.


3.10. 함수/변수명 자동완성

코딩중에 가장 범하기 쉬운 잘못중의 하나가 변수명및 함수명 오타일것이다. 또 변수명이 기억이 잘 나지 않아서 처음 선언한곳을 다시 확인하는 작업역시 코딩을 매우 번거롭게 한다. 이때 함수 자동완성 기능을 이용하면 이러한 염려들을 줄일수 있다.

int client_sockfd 라고 변수 선언을 했다고 하자. 코딩중에 client_sockfd 를 쓸일이 있다면 cli^p 를 입력해보자. 그러면 변수 이름이 자동으로 완성되는것을 볼수 있을것이다. ^p는 Ctrl+p 이다.


3.11. ctags 를 이용한 쏘쓰 분석

쏘쓰를 분석하는데 있어서 가장 중요한 것은 역시 함수를 분석해서, 함수가 어떤일을 하는지 알아내는 것이다. ctags 를 이용하면 이러한 쏘쓰 분석작업을 좀더 수월하게 할수 있다. ctags 와 관련된문서는 ctags 를 이용한 쏘쓰 분석 을 참고하기 바란다.


3.12. 자동들여쓰기

프로그래밍 할때 indent 는 쏘쓰코드를 보기좋게 만들기 위한 필수 사항이다. 보통 tab 을 주로 쓰는데,

:set ai
명령을 이용하면 자동적으로 indent (auto indent) 를 적용시켜주므로, 좀더 코딩에만 집중할수 있도록 도와준다.
:set noai 
명령을 사용해서 auto indent 상태를 해제할수 있다.

요즘의 vim 은 기본적으로 auto indent 상태이므로, 별다른 설정없이 편하게 사용가능하다. 그러나 웹에서 가져다 붙이기를 할때 여기에 auto indent 가 적용되어서 것잡을수 없이 tab 이 들어가는 경우가 생길때도 있는데, 이럴때 set noai 를 이용해서 auto indent 를 해제하고 가져다 붙이기를 하면 된다.


3.13. 탭사이즈 조정하기

쏘쓰에서 indent 를 위해서 주로 탭을 사용하는데, 보통 이 탭 사이즈는 8로 되어 있다. 그런데 8이란 탭사이즈가 때로는 너무 커서, 쏘쓰가 화면밖으로 나가서 오히려 쏘쓰 보기를 어렵게 만들때도 있다. 이럴때 는 탭사이즈를 줄여야 하는데 다음과 같은 명령을 통해서 탭사이즈 변경이 가능하다.

:set ts=4

3.14. 라인 넘버링

코딩하다보면 라인넘버가 있으면 할때가 있다. 그럴때는

:set nu 
하면 된다.

그림 2. 라인 넘버링

라인넘버를 없애고 싶다면,
:set nonu
하면 된다.

3.15. 코드를 HTML로 저장하기

vim 은 또한 코드를 HTML 형태로 저장하는 기능을 가지고 있다. 이 기능을 이용하면 syntax highlight 된 상태 그대로 HTML로 변환이 가능하다. 쏘쓰코드의 예제를 만들어서 웹상에 올리고자 할때 유용하게 사용할수 있는 기능이다.

:so $VIMRUNTIME/syntax/2html.vim 

3.16. vim 설정파일 만들기

지금까지 우리는 다양한 설정을 통해서 vim 을 좀더 쉽게 사용하는 방법을 알아 보았다. 그런데, 탭사이즈를 적용하기 위해서 vim 을 실행시킬때 마다 ":set ts=4" 이런식으로 하면 작업이 매우 귀찮을것이다. 이럴때는 vim 을 위한 설정파일을 만들어서, vim 이 시작할때 설정파일을 읽어들여서 환경이 자동으로 설정되도록 하면된다.

자기의 계정(Home) 디렉토리에 보면, .vimrc 라는 파일이 존재 할것이다. (존재하지 않는다면 만들도록한다) 이것이 설정파일로 아래와 같은 방법으로 자기가 원하는 내용을 설정하면 된다.

set ts=4
set nu

2007/01/30


원문 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Beginner

1 목적

  • 프로그래밍 세계에 입문하는 유저를 위한 가이드 라인 제시
    1. 학습방법및 방향
    2. 학습문서들 : 언어, 프로그래밍 환경...
    3. 업계현황, 정보, 조언
    4. FAQ 정리
  • 사이트 이용과 관련된 도움문서 제작
    1. 위키 사용법 (기존에 있지만 보기 힘들었음)

2 필요한 것들

  • 관련문서 수집
  • 시스템 정비 : 게시판의 선택 혹은 확장
  • RSS(12) : 기존에 있는 시스템의 확장

3 관련 문서들


이름 제목 변경일 크기
HowToAsk 좀더 나은 질문을 위한 방법 2007/01/17 14:59 92
UsedWiki 초 간단 위키 사용하기 2007/01/12 11:11 5309


4 나의 프로그램 배움

나는 개인적으로 공부란 말을 별로 좋아하지 않는다. 배움이라는 단어를 더 좋아한다.
여기를 출입하는 많은 분들 중에 프로그래밍를 습득한 분도 많고 습득하기를 원하는 분도 많다. 특히 [http]프로그래밍 갤러리를 통해서 이곳으로 들어 오는 분들은 말이다. 많은 사람들을 만나 보면서 이런 질문을 하는 사람들이 정말 많다. 프로그래밍은 어떻게 공부 해야 하는가? 어떤 언어를 배워야 하는가?

[http]나의 영어 공부 From Freefeel
처럼 많은 고수(또는 일반인)들의 이야기를 들어 봤으면 좋겠다. 나는 이렇게 배워 왔다. 이런 시행착오(Try and Error)를 해 봤다. (후배들은 덜 하길 바라며...) --Crystal

4.1 질문하는 법

질문하는 법

무시되는 질문들
  • 입문서로 뭐가 좋을까요 ?
  • (소스를 그대로 올리고) 이거 안되는데 좀 봐주세요.
  • printf 로 어떻게 찍어야 하나요? 수준의 질문
  • 어떻게 공부해야 하나요.

무시되는 질문이 있는가 하면, 욕먹는 질문도 있습니다. 모든 커뮤니티의 Q&A에 공통적으로 해당되는 사항입니다.
  • 숙제를 그대로 올리는 유형
    .... 하는 함수를 작성하라. 단 .... 해야함
  • 테스트를 가장한 질문
  • 답변이 없다고 중복해서 올리는 행위
    왜 답변이 없는지를 확인해 보도록해야 합니다. 위의 질문하는 법문서를 읽어 보시기 바립니다. 물론 좋은 질문임에도 불구하고 답변이 올라오지 않는 경우도 있는데, 그렇다고 해서 중복해서 질문을 올리면 욕먹습니다.

질문올리기 전에 다음 사이트들을 검색해 보세요.
이거 가능할까요 ?

4.2 C언어 혹은 어셈블리어를 배울 필요가 있는가

1
많은 개발자들이 C언어와 (C++도 포함하겠다) 어셈블리어를 구석기 시대쯤에 사용되는 언어로 취급한다. 확실히 이들 언어는 강력하긴 하지만 플렛폼 지향적이지도 않으며, 객체지향적이지도 않다. 문자열을 다루기도 쉽지않고, 메모리 관리도 어드레스 수준에서 직접 해주어야 한다. C++은 그래도 최신의 언어들이 가지고 있는 기능들을 지원하기는 하지만 C와의 호환성과 업계표준이라는 보수성 때문에 지원에 한계를 보여주고 있다. 그러나 여전히 이들 언어는 많이 사용되고 있으며, 다음과 같은 이유로 배워야할 가치가 충분하다고 생각된다.

  • 뛰어난 학습 효과 :
    이 이유는 아마도 전공 학부생에게 주요한 이유가 될 것이다. 시간이 부족하거나 활용에 치중해야 하거나, 이미 실무에서 높은수준의 응용을 만드는 일에 종사하고 있다면 인정하기 어려울 수도 있을 것이다.

    어셈블리(:12)언어는 (기계어를 제외하고는) 컴퓨터 시스템에 가장 근접한 언어며, C가 그 뒤를 따르고 있다. 이말은 이 언어들을 사용할 경우 더욱 자연스럽게 컴퓨터과학(혹은 공학)에 대한 학구적인 접근이 가능하다는 얘기가 된다. Java, Python, Ruby와 같이 고도로 추상화된 언어들은 소프트웨어공학의 입장에서 더 좋은 학습 환경을 만들어 주기는 하지만, 그 추상화가 단점이 되어서, 추상화 아래 단계에 근본적인 접근을 어렵게 한다.

    여러분이 컴퓨터/소프트웨어 공학에 뜻을 두고 있거나, 혹은 학부생이라면 어셈블리와 C는 기본을 튼튼하게 하는데 많은 도움을 줄 것이다.

  • 여전히 널리 쓰인다.
    비록 학생이라고 하더라도, 내가 배운 언어가 실제 산업현장에서 널리 사용되고 있는가 하는 점은 중요한 점이다. Java언어와 엎치락 뒤치락 하고 있으며 많은 영역을 내주기는 했지만, C/C++이 더 잘하는 영역이 여전히 존재하며, C/C++ 을 합한다면 확실히 현재 가장 널리쓰이는 언어다. 특히 14위에 랭크되어 있는 D언어의 약진을 눈여겨 볼만하다. D언어는 C/C++을 계승하고 있으며, 우리나리엔 아직 알려진거 같지 않긴 하지만, Ruby 언어와 함께 가장 주목되는 언어 중 하나다.

    Position
    Jan 2007
    Position
    Jan 2006
    Delta in Position Programming Language Ratings
    Jan 2007
    Delta
    Jan 2006
    Status
    1 1 Java 19.160% -3.10% A
    2 2 C 15.807% -3.20% A
    3 3 C++ 10.425% -1.04% A
    4 5 (Visual) Basic 9.123% +0.03% A
    5 4 PHP 7.943% -1.46% A
    6 6 Perl 6.237% -0.81% A
    7 7 C# 3.521% -0.03% A
    8 8 Python 3.502% +0.90% A
    9 10 JavaScript 2.845% +1.31% A
    10 21 11 * Ruby 2.519% +2.15% A
    11 11 SAS 2.343% +1.18% A
    12 9 Delphi 2.336% +0.75% A
    13 12 PL/SQL 1.570% +0.54% A
    14 22 8 * D 1.335% +0.97% A-
    15 20 ABAP 1.229% +0.82% A-
    16 14 Lisp/Scheme 0.674% +0.07% B
    17 18 Ada 0.638% +0.17% B
    18 13 COBOL 0.637% -0.13% B
    19 15 Pascal 0.570% +0.04% B
    20 34 14 * Transact-SQL 0.510% +0.34% B
    출처 : http://www.tiobe.com/tpci.htm

  • 기초가 된다
    위에서도 언급했듯이 이들언어는 컴퓨터/소프트웨어 공학에 관한 기초를 다지는데 많은 도움을 준다. 이는 다른 언어나 새로운 개발 환경에 쉽게 적응할 수 있음을 얘기한다. 실제 C/C++ 프로그래머라고 해서, 이들 언어만을 사용해서 개발하는 개발자는 흔하지 않다. 주언어로 Java를 함께 사용하며, 유틸리티 언어로 Perl, Python 언어들을 사용한다.

    예를들어 여러분이 보안전문가로써의 길을 걷고 싶다고 가정을 해보자. 이 경우 필요한 능력은 언어를 잘 다루는 능력이 아니다. C, Java, 혹은 Python을 얼마나 능숙하게 다루며, 객체지향적인 마인드를 가지고 있는가 하는건 부차적인 문제다. 정말 필요한 능력은 시스템과 네트워크에 대한 이해다. 일반적으로 추상화된 언어들은 사용자로 하여금 하부구조에 신경을 써도 되지 않도록 만들기 때문에, C/C++/어셈을 다루어본 경험자에 비해서 (비슷한 시간을 투자했을 경우) 하부구조에 대한 이해가 떨어질 수 밖에 없다. 즉 자신의 영역을 확대시키가 어렵다는 얘기가 된다. 이는 기초를 바탕으로 자신의 영역을 선택해야 하는 학생에게는 매우 중요한 요소다. 기초가 튼튼하면 그만큼 선택의 폭도 넓어 진다.

    고수준의 언어로 프로그래밍 환경에 빠르게 적응한 후, 기본이 되는 환경에 대해서 배우면 되지 않느냐고 할 수 있을거 같다. 물론 그렇기는 하다. 모든건 효율의문제다. 인간은 기본적으로 낮은 곳에서 높은 곳으로 향하려고 하는 욕구를 가지고 있으며, 이에 익숙하도록 되어 있다. 오늘 PHP를 이용해서 Hello World를 출력할 수 있는 웹페이지를 만들었다면, 내일은 DB연결, 내일 모레는 게시판 만들기를 하고 싶어하는게 본성이다. 어떻게 브라우저를 통해서 Hello World가 찍힐까를 알아보기 위해서, TCP/ IP, socket도구, pipe환경변수를 제공하는 운영체제의 시스템특성에 대해서 공부하는 건 일반적인 경우가 아니다. 더 높은 단계에서 이룩해야 할 많은 것들이 눈에 보이기 때문에, 하부단계에 대해서는 신경쓸 여력도 없다.

    웹플밍은 좀합니다. 그런데 더 나아갈려면 기초도 튼튼해야 될거 같아서, 네트워크나 시스템쪽도 좀 알아보려고 하는데, 시간이 없어서 못하겠네요. 하는 얘기는 흔히 듣는 얘기중 하나다. 그렇다면 초기에 좀 힘들더라도 기초부터 튼튼히 다진 다음에 자연스럽게 앞으로 나아가는게, 나중에 익숙하지 않는 방향으로 힘들게 뒤로 유턴하는 것보다는 훨씬 효율적일 것이다.

    왜 C++을 선택해야 하는가
    왜 C++인가 : 게임 프로그래머의 입장에서 C++의 장점을 설명한 글이다.

  • 어셈블리어
    C/C++은 그렇다 치고 어셈블리어를 배워야 하는지에 의문을 가질 수 있을 것이다. 개인적인 생각으로도 특별한 목적의식 없이 어셈블리어를 깊이 배울 필요는 없다고 생각한다. 어셈블리어 관련 교체를 보면 처음 5장 정도를 컴퓨터 구조와 소프트웨어에 대해서 언급을 하는데, 이들 문서만 읽어도 충분한 가치가 있다. 컴퓨터 시스템 구조와 소프트웨어에 대한 기본적인 소양을 갖추게 하는데 많은 도움을 주며, C/C++,Java와 같은 고수준 언어를 더 쉽게 이해하고 공부할 수 있도록 만들어 준다.

    1주 정도 틈틈이 시간을 내어서 공부를 하고 - 아마 1주에 공부를 한다면, 어셈블리어가 아닌 컴퓨터 시스템의 구조에 대한 학습을 하게 될 것이다. - 더욱 관심이 있다면, 가벼운 마음으로 뒷장들을 읽어 나가면 될것이다. Spim문서를 기준으로 한다면 1-9장 정도를 가볍게 읽어주면 된다. (실제 가벼운 내용이다)

  • Embedded System 분야에서 :
    2007년1월 현재 임베디드 시스템을 동작시키는 대부분의 언어는 98%의 C언어 +2%의 어셈블리어(기본 제공 된 소스 그대로 사용)이다. 프로젝트에 따라 달라질수도있으며 자바또 는 다른 언어가 사용되기도 하지만 절대강자는 C이다. 당신들이 사용하고 있는 PMP, DMB, 휴대폰(휴대전화), 머리에 떠 있는 인공위성등 모든것을 C로 이루어 진다고 추측합니다. 단 이것은 Crystal의 경험에 의한것 입니다. (2007 01 21)


4.3 운영체제의 선택

일정 수준이상에 올라가면 언어와 운영체제가 상관없다라고 합니다만, 우리는 아직 일정수준에 올라가 있지 않기 때문에 운영체제의 선택에 있어서 어느정도 신중할 수 밖에 없을 겁니다.

저는 Unix 그 중에서도 Linux를 운영체제로 선택할 것을 권합니다. 이유는 다음과 같습니다.

  • Unix 를 따른다.
    비록 Linux가 Unix와는 전혀다른 운영체제라고 말하지만 철학,운용,개발 환경 모두 Unix의 그것을 따르고 있습니다.

    그렇다면 Unix를 따르는게 왜 선택의 이유가 되는지가 궁금해질 수 있을 겁니다. Unix운영체제는 현재 운용체제의 모습을 확립한 선조격이 되는 운영체제 입니다. 비록 처음이라고 할 수는 없겠지만 현실적으로 모든 운영체제의 할아버지격이 되는 운영체제라고 할 수 있습니다.

    지금의 인터넷이 가능하게한 TCP/ IP와 같은 프로토콜과 서비스들이 Unix 환경에서 만들어지고 테스트되어져 왔습니다. 또한 운영체제가 가져야될 여러가지 구성요소들인 파일, 디렉토리, 소켓, IPC, 프로세스/쓰레드 개념과 이들을 사용하기 위한 시스템함수들이 유닉스에서 만들어졌습니다. 이러한 개념과 함수들은 전혀 다른 운영체제라고 생각할 수 있는 윈도우즈와 Mac OS에도 거의 그대로 전승되고 있습니다.

    즉 Unix를 공부한다는 것은 현대적인 네트워크 시스템과 컴퓨터 시스템을 공부한다는 것을 의미하게 됩니다.

    물론 다른 운영체제로도 위의 일들은 가능합니다. 그러나 효율성에 있어서 차이가 있습니다. 윈도우즈는 네트워크와 시스템의 많은 부분을 추상화 시킨 운영체제 입니다. 이는 뛰어난 장점이 될 수도 있지만 기초부터 공부를 하고자 할때, 오히려 방해요소가 될 수도 있습니다.

    반면 유닉스 운영체제들은 추상화단계가 낮은 단순화된 환경을 제공합니다. 프로그램을 만들거나 운영체제를 제어하는데 있어서, 이것 저것 많은 것을 알아야 된다는 의미가 됩니다. 이는 초기 운영체제에 대한 접근을 어렵게 하므로 단점이 될겁니다. 그러나 기초부터 공부를 하고자 한다면, 이는 크나큰 장점이 됩니다. 공부해야 하는 필요성을 느끼는 환경을 만들어 준다고 보시면 될거 같습니다.
    유닉스를 따름으로 얻는 또다른 잇점은 리눅스를 통해서 획득한 지식을 유닉스에 거의 그대로 확장시킬 수 있다는 점입니다. 리눅스에서 만든 프로그램은 소스코드의 변경없이 그대로 유닉스에서 사용할 수 있다라는 건 분명히 과장이 섞인 주장이긴 합니다만. 리눅스를 통해서 얻은 지식은 유닉스에 거의 그대로 적용할 수 있으며, 비교적 쉽게 다른 유닉스 환경에 적응할 수 있습니다.

    좋은 리눅스 개발자는 더 쉽게 좋은 유닉스 개발자가 될 수 있습니다.

  • Free
    리눅스는 이러한 유닉스의 장점을 계승할 뿐만 아니라. 운영체제와 그 위에서 움직이는 거의 모든 프로그램들이 완전히 공개 (free)되어 있습니다. 라이센스 걱정 없이 설치해서 사용할 수 있으며, 크고 작은 수많은 잘만든 소스코드를 얻어서 분석하고 수정하고 테스트할 수 있습니다.

    이건 실무개발자와 공부하는 학생을 막론하고 축복입니다.

4.3.1 리눅스의 선택

리눅스는 다양한 배포판이 존재한다. 이 배포판들은 만들어진 용도가 각각다르며, 독자적인 패키징 형식을 가지고 있다. 이러한 차이점으로 인해서 - 비록 모든 리눅스 배포판이 근본적으로 같다고 하지만 - 하나의 배포판에 익숙해진 상태에서 다른 배포판으로 넘어가는건 그리 쉬운일이 아니다. 그러므로 초기 배포판을 잘 선택할 필요가 있다. 다음은 대표적인 배포판들이다.
이름 패키징 설명
RedHat RPM 접근용이, 많은 자료
Fedora RPM 접근용이, 많은 자료
Suse RPM 접근용이, 중간 자료
Ubuntu 데비안 접근용이, 많은 자료
gentoo portage 접근어려움, 중간 자료

가장 손쉽게 사용할 수 있는 배포판은 FedoraUbuntu인데, 이 중 Ubuntu를 추천한다. Ubuntu와 관련된 내용은 [http]Ubuntu 한국 커뮤니티를 참고하기 바란다. gentoo는 개발자를 위한 최고의 배포판이란 평을 듣고 있지만, 초기에 접근이 좀 어렵다는 평가가 있다.

4.4 공부하는 방법 - yundream

제가 나름 대로 생각하는 공부하는 법입니다. 공부하는데 있어서 이게 최선의 방법이다 라는게 있지는 않을겁니다. 개인적인 경험을 바탕으로한 의견이며, 어떻게 받아들일지는 여러분의 몫입니다. 방법론이 중요한 것은 문제를 해결하기 위한 길을 제시하기 때문에 중요한게 아니라고 생각합니다. 생각의 넓이를 넓힐 수 있는 계기를 만들어 주기 때문에 중요한 것이라 생각합니다.

4.4.1 문법책은 빠르게 독파

C언어 자체는 매우 단순합니다. 또한 말그대로 언어이기 때문에, 문법과 몇 가지 주요 요소를 숙지하는 수준까지만 올리면 충분합니다. 내용을 암기할려고 한번 두번 읽을 필요 없이 한달 정도에 걸쳐서 한번 읽을 정도면 충분합니다. 그 이상 비슷한 문법책을 두권이상 사서 보는건 낭비라고 생각합니다. 혹은 C++ 부터 시작해도 관계는 없습니다. C++은 C를 포함하고 있으며, 여기에 객체지향과 같은 철학을 적당히 구현할 수 있도록 기능이 확장되어 있습니다.

영문학을 한다고 해도, 문법익히는데 걸리는 시간은 사실은 1년 정도도 채 안될겁니다. 나머지는 문화를 공부하는 것이지 문법을 공부하는건 아니니까요.

문법책은 그렇게 한번 훑어보고, 음.. 가능하면 assembly쪽을 한번 쭉 훑어보는게 컴퓨터의 작동방식을 이해하는 방식으로 나가면 좋을거 같구요. 깊게 들어갈 필요없이 소설책 읽듯이 부담없이 읽어가면 충분합니다. Programming from the Ground Up, Spim 문서를 추천합니다.

4.4.2 시스템/네트워크 프로그래밍의 세계로

문법책을 떼고나면 뭘해야 될지 모르는 상황이 오게 됩니다. 배우긴 배웠는데, 어디에 써먹어야 될지를 모르게 되니, 내가 배우긴 배운건가 하는 불안감을 가지게 되고, 불안감을 해소 하기 위해서 간단간단한 코드 만들기 등을 시도하게 됩니다. 많은 예제를 포함한 책들을 선택하게 되는 이유이기도 합니다. 물론 이러한 코드들을 보면, 많은 도움이 됩니다. 이러한 책혹은 코드들은 문제가 주어졌을 때, 어떤식으로 풀면 되겠다라는 아이디어를 줍니다. 팁이라는 거죠. 팁도 당연히 중요합니다만 일에는 순서가 있는 법입니다. 공부를 잘하는 100가지 방법 ? 많은 도움이 되겠지만, 일단 머리에 든게 있어야 방법을 써먹을 수 있겠죠. 1

시스템 프로그래밍
문법책을 떼었다면 시스템프로그래밍쪽을 공부하도록 합니다. 시스템 프로그래밍은 모든 프로그래밍의 기초가 됩니다. 여러분이 네트워크프로그래밍을 하든 임베디드, 게임, 보안을 하든 웹을 하든지간에 반드시 필요합니다. 게임이든 보안솔류션이든지, 웹응용이든지 간에 시스템 위에서 돌아가는 프로그램들입니다. 시스템을 이해하지 못하면 제대로된 프로그램을 작성할 수 없습니다. 시스템 프로그래밍은 시스템에 대한 이해도와 활용도를 높여준다는 점에서 필수 코스 입니다.

시스템 프로그래밍은 그 양과 깊이가 매우 방대하기 때문에, 단시간내에 마스터할 수 있는 성질의 것이 아닙니다만, 단계별 공부와 응용이 가능한 기초 수준 정도로 올리는 것이라면 3달 정도면 됩니다.

네트워크 프로그래밍
이렇게 한 4달 하면 언어도 어느정도 사용할 수 있고, 시스템 프로그래밍에 대한 개념도 어느정도 잡히게 될겁니다. 그럼 네트워크프로그래밍을 공부하면 됩니다. 모든게 인터넷으로 통하는 세상이니 네트워크 프로그래밍의 중요성에 대해서는 강조할 필요도 없으리라 생각됩니다.

네트워크 프로그래밍의 중요성이 강조되다 보니, 가끔 문법을 띠고 나서 바로 네트워크 프로그래밍으로 발을 들여놓으려고 하는 분들도 있습니다. 그러나 네트워크 프로그램도 시스템 위에서 돌아가는 겁니다. 시스템 프로그래밍에 대한 이해가 필수선행 조건입니다.

다시 시스템 프로그래밍으로
네트워크 프로그래밍 진도가 나다가 보면, 어느 단계에서 고급 시스템 프로그래밍 기법의 응용이 필요함을 절감하게 됩니다. 이 시점에서 다시 시스템 프로그래밍을 공부하게 됩니다. 이미 어느정도 기초를 닦아두었기 때문에 효율적인 공부가 가능할겁니다. 이쯤되면 네트워크 프로그래밍과 시스템 프로그래밍의 경계는 사라집니다. 병행하면서 공부해 나가게 되는 거죠.

관심 분야로 진출
시스템/네트워크 프로그래밍에 대해서 어느정도 가닥이 잡히게 되면, 뭘해야 할지 혹은 뭘하고 싶은건지에 대한 감이 올겁니다. 간혹보면, 이들에 대한 기초없이 처음부터 목표를 정해 놓고, 뭘 공부해야 좋을까요를 물어보는 경우가 있습니다. 평소에 게임을 좋아하는데 MFC를 하는게 좋을까요. 이런류의 질문입니다. 아는 만큼 보인다라는 말이 있습니다. 알아야지 자기가 뭘 하고 싶은건지, 어디에 재능이 있는건지를 판단할 수 있습니다.

프로그래밍에 대해서 아는 거라고는 게임과 오피스 밖에 없는데, 뭘 할지 뭘 좋아하는지를 어떻게 판단할 수 있나요.

먼저 기초를 잡고나가면, 기존에 하고 싶었던것 이외에도 해야할 엄청나게 많은 것들이 있다는 것과 뭐를 하면 잘할 수 있겠다라는 것을 파악하실 수 있습니다. 기존에 하고 싶었던 일을 더 잘할 수 있음을 말할 필요도 없겠지요.

객체지향과 같은 프로그래밍 철학, 개발 방법론, 시스템 관리, 네트워크 관리, 임베디드, 보안, 웹서비스, 모바일, 그래픽, 고급 유저 응용 등등에서 원하는 것을 선택하면 됩니다. Java나 Python과 같은 새로운 언어를 접할 기회도 생길겁니다.

4.4.3 테스트를 위한 코드들

다양한 응용이 가능하도록 테스트해볼 수 있는 코드들

4.4.4 암기는 가장 나쁜 학습법

사람들이 암기를 선호하는 가장 큰 이유는 빠른시간내에 인지할 수 있는 결과를 얻을 수 있음으로 학습에 대한 (심리적인)만족도를 높일 수 있다는 점 때문입니다. 물론 암기가 필요한 경우가 있긴 합니다. 운전면허나 기타 면허를 따기 위해서 족보를 공부해야 하는 경우가 되겠죠.

하지만 그 지식을 나의 것으로 하고자 하는 중/장기적인 목표의 학습에 있어서 암기는 학습을 방해하는 최대의 적입니다.

암기는 학습자에게 획일적인 생각을 하도록 강제합니다. A를 해결하는 방법은 B이다. 이걸 머리로 달달 외어버리고, 그에 대한 학습효과에도 만족을 느끼기 때문에, 다른 생각을 하지 못하게 됩니다. 편협한 사고방식을 가지게 될 확률이 높게되고, 이건 프로그래머에게는 치명적입니다.

인간의 머리는 한계가 있습니다. 별로 되지도 않는 공간에 집어 넣을 수 있는 정보는 그 끝이 있습니다. 머리를 유연하게 가져가세요. 굳이 암기하려고 하지말고, 이해하고 넘어가세요. 이해하고 넘어가는 경우에 학습자는 뭔가 불분명하기 때문에 학습에 대한 만족도가 떨어집니다. 하지만 인간의 두뇌가 강력한것은 어떤 사실에 대한 암기력 때문이 아니라, 여러가지 이해된 정보들을 네트워크화 할 수 있는 능력때문입니다. 머리속에 정보의 네트워크를 만들려면 생각이 유연해야 합니다. 암기는 머리를 굳어버리게 만듭니다 - 경험을 통해서 이미 알고 있으리라 생각됩니다 -.

4.5 전문가가 되는 법

1153807845_how_to_be_an_expert.jpg
  1. 아놔 젠장 못해 먹겠네. 이건 내가 할 수 있는게 아냐.
  2. 오케이 해냈어. 이거 하나면 충분해.
  3. 오케이 해냈어. 하지만 해내기 위한 더 좋은 방법이 있을거야. 이걸 찾아내기 위해서 노력할거야.

4.6 기타 개발자와 관련된 문서들


4.6.1 프로그래머의 길을 선택해야 할지 고민이 되시나요 ?


지금까지의 글들은 이미 프로그래머로의 길을 가기로 마음먹은 분들 혹은 시작하려 하는 분들의 입장에서 작성되었습니다. 이제 그 이전 단계인 선택의 갈림길에서 고민하는 분들의 입장에서 글을 써보도록 하겠습니다.

  • 하고자 하는 자신감만 있으면 된다? 아니다.
    선택은 고민되는 일 입니다. 이 선택이 잘한 것일까? 내 적성에 맞는 것일까? 괜찮은 미래가 보장될까? 등등등 이죠. 이러한 선택의 기로에 있는 분들에게 하고 싶으면 시작해라. 자신감 하나면 충분하다라고 말하는 경우를 종종 보게 됩니다.

    하지만 당신도 노력하면 Bill Gates가 될 수 있습니다. Steve Jobs는 창고에서 시작해서 지금의 성공에 이르렀다. 이런 류의 조언은 도움이 되지 못합니다. 왜냐하면 이 세계는 나 혼자 잘한다고 되는 세계가 아니기 때문입니다. 비슷한 진로를 가고 있는 사람들과 경쟁해야 하며, 또 다른 영역의 사람들과 경쟁 해야 합니다.

    놓인 의자는 하나인데, 앉으려고 하는 1000명의 사람들이 경쟁하는 열악한 조건을 생각해 보세요. 당신도 열심히 하면 의자에 앉을 수 있습니다. Bill Gates를 보세요. 의자를 독차지하고 저 높은 곳에 군림하고 있지 않습니까.라 는 조언이 타당한 조언이라고 생각되지는 않을 겁니다. 물론 여러분이 불굴의 정신과 투지, 체력, 판단력을 가지고 있다면 999명의 경쟁자를 물리치고 의자를 차지할 확률이 높아지긴 하겠지만. 여러분 모두가 슈퍼맨일 수는 없는 겁니다.

  • 자신감은 기본적으로 가지고 있어야 하는 거지 전부가 아닙니다. 사이클 선수가 되려면 자전거를 가지고 있어야겠죠. 그러나 자전거를 가지고 있다고 해서 사이클 선수가 되는건 아닙니다.

  • 그러므로 현실을 알아볼 필요가 있다
    이미 들어서 알고 있겠지만, 현실은 그리 밝지 않다. 일단 소프트웨어 개발회사가 없다. 생각나는 소프트웨어 회사가 혹은 제품이 있는가 ? 아마 5개 이상 생각해내기가 힘들 것이다. 여러가지 이유로 소프트웨어 회사는 전멸직전이고, 몇개 서비스회사들만 존재한다. 멋진 서비스만 만들어 내도 되는 것 아니냐라고 할 수 도 있겠지만. 제조업이 모든 사업의 기본이 되는 것처럼, 소프트웨어 패키지 제작업체가 이 분야의 기초가 된다.

  • 소프트웨어 제작 업체가 없다는 것은 소프트웨어 산업기반이 그만큼 취약할 수 밖에 없다는 것을 의미하고, 기술인력의 수요가 그만큼 줄어든다는 얘기가 될 것이다. 그렇다고 너무 상심해할 필요는 없다고 생각된다. 내가 알기로 다른 분야 역시 소프트웨어 분야만큼 어렵다. 대충대충 할거면 이쪽을 선택하지 않는게 좋다. 응용범위가 넓은 인문학과는 달라서, 이 분야는 다른 분야로 눈을 돌리는게 그리 수월하지 않다.

4.6.2 프로그래밍 관련


이름 제목 변경일 크기
Brain 프로그래머의 뇌 구조 2007/01/28 15:44 82
DevSchedule 개발 일정에 영향을 미치는 요소들 2007/01/09 11:46 699
GoogleMeeting 회의의 6원칙 2007/01/09 11:46 54
HiraMethod Hira Method (소스코드 해석 방법론) 2007/01/09 11:46 3614
LanHistory 고급언어 연표 2007/01/09 11:46 86
ProblemWithProgramming 프로그래밍의 문제점 2007/01/09 11:46 11483
WhyCpp 왜 C++ 인가 ? 2007/01/09 11:46 11043
WhyPublic 왜 공개하는가 2007/01/09 11:46 1945
badjob 소프트웨어 개발자는 미취업자의 대안 직업이 아니다. 2007/01/09 11:46 8888
wiki 위키 백과에 참여해야 할 이유 2007/01/09 11:46 62609

4.7 관련 문서 프로젝트

4.7.1 이런저런 잡다한글들


이름 제목 변경일 크기
CtrlC 주기도문 개발자 버전 2007/01/09 11:46 485
DomainNameAppraisal 도메인 가격 평가 2007/01/09 11:46 78
HistoryOfBug Bug의 유래 2007/01/09 11:46 810
LastQuestion 최후의 질문 2007/01/22 20:24 7601
LinuxLife 리눅스 사용한지 어언 10년 2007/01/09 11:46 67
StvenJobs 스티븐 잡스의 연설에 대한 반응 변화 2007/01/09 11:46 71
TypeOfBlood 혈액형별 자존심을 건들었을 때 2007/01/09 11:46 60


이름 제목 변경일 크기
Adsense 구글 Adsense 2007/01/09 11:46 62
BestJop 최고의 유망 직업 "소프트웨어 엔지니어" 2007/01/09 11:46 1323
FirefoxRate FF2.0발표 두달동안의 점유율 변화 2007/01/09 11:46 75
FirefoxVsIE firefox 2.0발표 기념 브라우저별 점유율 2007/01/09 11:46 100
GPLv3 GPLv3의 위험과 문제 2007/01/09 11:46 9342
GoogleView 구글 본사 견학기 2007/01/09 11:46 4689
GoogleVsNate Google VS Naver 2007/01/09 11:46 5151
InterNetUserAnalytics 인터넷 사용자 분석 2007/01/09 11:46 60
ProgramerISArtist 프로그래머는 아티스트 ? 2007/01/09 11:46 65
ProverbForProg 프로그래머를 위한 속담 2007/01/09 11:46 876
RealHacker Hello World로 알아보는 프로그램 유형 2007/01/09 11:46 6899
StevenJobsSpeech 스티븐 잡스의 스텐포드 대학졸업식 연설문 2007/01/09 11:46 11293
StevenJobsWords 스티븐 잡스 명언록 ? 2007/01/25 11:58 4469
WhyNotFOSS 왜 F/OSS가 활성화 되지 못하는가 ? 2007/01/09 11:46 55638
WhyPatentsAreBadForSoftware 왜 특허권이 소프트웨어에 부정적인가. 2007/01/28 17:12 21272


4.8 자바하는넘



4.9 프로그래머의 뇌 구조

Site/Development/Forum/manager/Brain
1155571965.jpg

6477503482.jpg



4.10 빵집-양병규

빵집 도움말 읽어보면...

5 권장 문서들


5.1 권장 사이트


5.2 권장 도서


6 디렉토리



제목 변경일 크기
Document Beginner 문서모음 2007/01/09 11:46 65




7 외부 링크 (참고 사이트)

7.1 C언어 기초 관련 외부 링크