OLD_posting

초보 프로그래머 와 전문 프로그래머의 차이

슈개 2012. 10. 16. 08:40
반응형

http://dual5651.hacktizen.com/tc/entry/초보-프로그래머-와-전문-프로그래머의-차이?category=2

 

 



근자에 VB Q&A란의 질문을 보다보면 자꾸 잠이온다. 피곤해서가 아니고 뜬 구름 잡는 질문을
가지고 그들이 이해할 만큼 설명을 하자니 세월이 까마득하고 간단한 힌트를 주자니 쪽지로 질문
공세고...이러지도 못하고 저러지도 못하고... 답답하니 잠이 오는것같다.

VB 첫화면에도 필독 문서가 있어 질문 전에 읽어 보기를 권장을 하고 있지만 아직도 읽어보지않은
분들이 많은가 보다. 검색....이것을 해보도록 권하지만 이것도 자주 해봐야 요령이 생기는데
아니하니 무슨 검색어로 해야 내가 원하는 답변이 나올지 모른다. 그러니 검색을 하지 않는다.

마침 이런글이 보여서 연구 보존코자 공지로 등록을 하니 부디 차근 차근 읽고 마음에 새겨서
스스로을 위한 마음을 다스림에 사용하자.......
=======================================================================================
원리 파악과 경험 축적으로「프로그래밍 길들이기」

중학교 시절 첫 프로그램인 격투기 게임을 완성하기 위해 수업 시간 뒤편에 앉아 베이직 코드를 적어 나갔다. 주말이면 이 코드를 컴퓨터에 옮기는 작업을 했고, 이런 일을 거의 몇 주 동안 반복했다. 드디어 게임 프로그램 완성의 시간이 다가왔고, 조심스럽게 RUN을 쳤다. 결과는 참담했고 그날 필자는 하늘에서 떨어지는 눈을 맞으며 펑펑 울었다. 사춘기 소년의 눈물이 아니었다. 이유가 무엇이었을까?

유경상 (마이크로소프트웨어) 2002/02/20


다음은 1부터 1000까지의 합을 구하는 C 코드이다. 하지만 제대로 작동하지 않는다. 왜 그럴까?

int i, sum;
sum = 0;
for(i=1; i <= 1000; i++);
sum += i;
printf("sum = %d", sum);

단번에 알아낸 독자들도 있겠지만 앞의 코드 오류는 for 문 맨 뒤의 세미콜론 때문이다. 이 세미콜론 때문에 sum 값은 1001이 된다. 필자는 몇 년 전 이와 비슷한 코드를 작성하면서 4시간 정도를 허비한 경험이 있다. 코드가 앞의 코드보다는 훨씬 더 복잡했지만 잘못된 세미콜론 하나 때문에 제대로 된 수치 해석 결과가 나오지 않았다. 덕분에 여기 저기 코드를 마구 수정했고 원인을 발견하고 수정한 코드를 다시 복구하는 데 모두 4시간이나 소요해야 했다.

프로그래머라면 누구나 코드를 작성하면서 겪는 황당한 경험들이 많이 있을 것이다. 사소한 실수부터 개발환경, 개발도구 등의 버그 등등…. 이러한 황당한 경험들을 겪었을 때 각자의 반응들은 다양할 것이다. 부정적인 반응 중에서 좀 심한 경우 "이 짓거리 더 이상 못하겠다"며 나동그라지는 사람이 있는가 하면, 긍정적인 반응으로 "앞으로 이런 실수는 하지 말아야지"하며 씨익 웃는 사람도 있을 것이다.

필자 역시 십 수년 동안 프로그램을 작성하면서 많은 경험을 했다. 필자가 직접 겪은 경험들도 있으며 후배나 선배를 통해 간접적으로 겪은 경험도 있다. 필자가 직간접적으로 겪은 이런 일들 중 몇 가지를 여기서 독자들에게 소개하고, 몇 가지 사건들로부터 필자가 얻은 교훈을 공유해 보고자 한다.

점진적 프로그래밍
중학교 2학년 때였다. 80년대 중반 필자가 처음 접했던 컴퓨터는 Z80이라는 8비트 CPU를 탑재한 퍼스널 컴퓨터였다. 64KB(64MB가 아니다)의 메모리에 BASIC을 기본 탑재한 이 컴퓨터는 그 당시 고가의 제품이었다. 필자의 기억으로 TV와 냉장고보다 훨씬 비쌌던 것 같다. 그다지 넉넉하지 않은 집안 사정상 필자는 이 컴퓨터를 사달라고 말할 엄두도 못 냈다.

필자는 모 회사의 컴퓨터 전시장에서 매주 토·일요일은 살다시피 하면서 프로그램을 작성했다. 처음 도전한 프로그램다운 프로그램은 격투기 게임. 매일 수업시간 뒤편에 앉아 노트에다 베이직 코드를 적었다. 컴퓨터가 없었기 때문에 평소에 코드를 정확히 기록해 놓고 주말이 되면 이 코드를 그대로 컴퓨터에 옮기는 작업만을 몇 주 동안 반복했다. 그리고 수천 라인의 게임이 완성되고 처음으로 실행시켜볼 때가 왔다.

RUN(베이직의 수행 커맨드)을 조심스럽게 타이핑하고 리턴 키(지금의 엔터 키)를 눌렀다. 결과는 참담했다. 코드는 전혀 제대로 작동하지 않았고 게임 화면은 엉망으로 나왔으며 캐릭터는 전혀 움직이지도 않았다. 그날 집에 돌아가던 필자는 내리는 눈이 왜 그리 서러웠던지 펑펑 울었던 기억이 난다.

갑자기 웬 자서전? 필자가 여기서 말하고 싶은 이야기는 점진적으로 코드를 작성하라는 조언을 하고 싶어서다. 필자가 겪은 실수의 원인은 점진적으로 코드를 작성하지 않고 수백 수천 라인의 코드를 단번에 작성하려고 했기 때문이다. 인간은 결코 완벽할 수 없는 존재다. 단 수십 라인의 코드를 작성하더라도 실수를 할 수 있다. 더 많은 코드를 작성해야 한다면 실수의 가능성이나 실수 횟수는 더 늘어날 것이다.

이러한 오류를 줄이기 위해서는 프로그램을 작은 기능 단위로 나누고 이것들을 하나하나 작성하고 테스트하는 작업을 반복하면서 전체 프로그램을 완성하는 것이 중요하다. 필자는 거의 하나의 함수를 작성할 때마다 그 함수가 제대로 작동하는가를 테스트한다. 그 함수가 예상대로 작동하는 경우에 다음 함수 작성에 들어간다. 물론 항상 이런 경우만 있는 것은 아니지만 대부분의 코딩 작업을 이러한 방식으로 수행한다.

시간이 더 많이 소요될 것 같지만 실제로 전혀 그렇지 않다. 더 많은 코드를 작성하고 테스트하는 것보다 더 적은 시간이 소요된다. 왜냐면 더 많은 코드는 보다 정확히 테스트하기 위해 더 많은 경우의 수를 테스트해야 하기 때문이다. 또한 코드에 문제가 발생했을 때 어느 부분에서 문제가 발생했는가를 알아내기 위해서도 더 많은 시간이 필요하다.

반면 적은 양의 코드, 즉 함수 단위를 테스트하는 데는 훨씬 더 적은 경우의 수만을 테스트해도 되며 문제가 발생한 곳을 정확히 알아낼 수 있다. 그리고 단위 함수가 제대로 작동하기 때문에 이들 함수들이 연동돼 작동하는 작업 역시 테스트하고 문제를 파악해 내기가 쉽다.

하나의 변수가 프로젝트의 실패로 연결된다
필자의 후배가 아르바이트를 할 때였다. 그 후배가 맡은 일은 국회의원 선거 결과를 통계적으로 추측해 당선 여부를 유추해 내는 프로그램을 작성하는 것이었다. 그리고 그 결과는 모 방송사를 통해 생방송으로 방송될 예정이었다.

선거 날이 다가왔고 예비 조사가 수행되고 그 조사 결과가 프로그램의 입력으로 주어졌다. 프로그램은 당선 가능성이 있는 후보들을 지목했고 이 내용이 일부 방송됐다. 하지만 개표가 진행됨에 따라 프로그램이 예측한 것은 전혀 엉뚱한 것이었음이 밝혀졌다. 프로그램의 수행 결과가 테스트할 때와는 달리 이상하게 나온 것이다.

그 방송사는 추측 보도를 포기하고야 말았다. 프로젝트는 완전 실패로 돌아간 것이다. 그 후배가 저지른 실수는 5개의 중첩된 for 문장에서 반복 변수 하나를 잘 못 썼기 때문이었다. 이 실수는 그 코드를 수행하는 함수가 별도로 테스트되지 않았기 때문에 발견되지 않았다. 단 하나의 변수가 프로젝트의 실패라는 참담한 결과를 낳은 것이다.

바보가 아닌 다음에야 누구나 점진적인 방식으로 코딩할 것 같지만 실제는 전혀 그렇지 않다. 많은 개발자들이 수 백 라인의 코드와 십 수개의 함수를 작성하면서 단 한번의 테스트 수행을 해보지 않고 개발하는 경우가 많다. 이렇게 하면 한 번에 제대로 작동할 수도 있지만 그렇지 않을 확률이 훨씬 더 높다. 그리고 코드가 원하는 대로 작동하지 않을 때 문제를 찾아 해결하는데 오랜 시간이 소요될 것이다.

오류 메시지의 중요성
필자는 가끔씩 프로그래밍 관련 사이트에 들어가 질문에 답변을 하거나 필자에게 직접 전달되는 질문에 대한 답변을 하곤 한다. 이 때 필자를 황당하게 하는 질문들은 '막연히 이렇게 저렇게 했더니 오류가 나더라 어떻게 하면 되느냐'는 것이다. 어떤 오류인지는 말하지도 않고 막연히 안 된다는 것이다. 이럴 때는 정말 답변해 주기 난감하다. 원인을 알아야 그 문제를 해결할 텐데 이 경우는 아예 원인에 접근하기 위한 단서를 주지 않는 경우이기 때문이다.

오류 메시지는 문제를 해결하기 위한 중요한 단서다. 하지만 초보 개발자나 많은 개발자들이 이 오류 메시지의 중요성을 간과하는 것 같다. 프로그램을 개발하다 보면 예상하지 못한 오류 메시지가 자주 등장할 것이다. 그리고 이 오류를 해결할 수 있는 첫 번째 단서는 이 오류 메시지다. 메시지를 잘 읽어보면 왜 오류가 발생했는가를 알 수 있다. 때에 따라 친절하게도 오류가 발생한 위치도 알려준다. 비록 이 위치가 정확하지 않을 때도 많지만 말이다. 한 가지 예를 들어보자. 다음 비주얼 베이직 스크립트 코드를 살펴보자. 얼핏 봐서는 별다른 문제가 없는 듯한 코드다.

strConn = "Provider=SQLOLEDB;Data Source=(local);User ID=Tester;Password=Test"
strSQL = "SELECT * FROM Employees"
Set adoRS = WScript.CreateObject("ADODB.RecordSet")
adoRS.Open strSQL, strConn, adOpenStatic, adLockReadOnly

이 코드를 윈도우 스크립팅 호스트나 ASP에서 수행해보자. 분명히 오류 메시지가 나타날 것이다. 오류 메시지는 "잘못된 형식이거나 올바른 범위 밖에 있거나 서로 충돌하는 인수입니다"로 나타나며, 오류가 발생한 위치는 네 번째 라인인 adoRS.Open에서 발생한 것으로 표시될 것이다. 메시지는 인수(parameter)에 문제가 있음을 알려주고 있다. strSQL이나 strConn의 문제는 아닌 듯하다.

그렇다면 adOpenStatic과 adLockReadOnly 둘 중 하나가 혹은 모두가 문제일 가능성이 높다. 하지만 우리가 사용한 매개변수는 ADO에서 정의하는 정확한 상수임에 틀림없다. 정확한 상수이지만 이 상수는 어디에도 정의되지 않았다. 따라서 이 상수 값은 0이 되며 이것을 ADO가 거부하는 것이다. 이 코드를 제대로 작동시키기 위해서는 adOpenStatic과 adLockReadOnly의 상수 값을 미리 정의하든가 이 상수 대신 숫자 값을 사용해야 한다.

비록 단순한 예이지만 이 예를 통해 오류 메시지가 주는 힌트를 조금만 생각해 보면 오류 메시지의 원인을 찾아 낼 수 있다는 것을 알았을 것이다. 대부분의 오류 상황은 이 보다 훨씬 복잡한 상황일 것임에 틀림없다. 하지만 이 오류를 해결하는 최초의 단서는 오류 메시지임을 누구도 부정하지는 않을 것이다.

소스 코드는 가장 훌륭한 메모장
프로그램을 작성해본 사람이라면 누구나 소스 코드에 주석(comment)을 다는 것이 좋은 습관이라는 것을 알고 있다. 필자가 아는 K 프로그래머는 프로젝트 진행 중에 한 모듈의 코드를 보고 "누가 이렇게 작성했냐"며 길길이 날뛴 적이 있다고 한다. 그 코드는 너무 복잡했기 때문에 유지 보수가 어렵다는 것이었다.

하지만 팀원 누구도 그 코드를 작성하지 않았다. 자세히 코드를 살펴본 결과 그 코드의 작성자는 다름 아닌 K 씨 자신이었다. 그리고 그는 그렇게 복잡하게 코딩하지 않으면 안 되었던 이유를 겨우 생각해 냈다. 왜 그런 식으로 코딩했는지 몇 줄의 주석만 달아 놨더라도 아마 이런 해프닝은 발생하지 않았을 것이다.

주석만 달았어도 이 고생은 안했을텐데…
자기가 작성한 코드라도 몇 개월이 지나면 기억하기 어렵다. 특히 대형 프로젝트일수록 이러한 상황이 심하다. 필자가 리눅스 커널의 TCP/IP 시스템 코드를 수정할 때였다. 그때 커널 버전은 1.0.8이었지만 여전히 거대한 분량의 커널 코드는 필자를 압도하고도 남았다. 논문은 고속의 데이터 전송을 위한 운영체제 레벨의 지원에 대한 것이었는데, 커널의 디바이스 드라이버를 수정해야 했다.

드라이버를 수정해 원하는 속도 향상을 얻었다. 그리고 두 달 후, 관련 논문을 작성하다가 드라이버 코드를 참고해야 할 상황이 왔다. 하지만 코드를 아무리 살펴봐도 정말 '무식한' 방법으로 코딩이 되어 있었다.

아무리 생각해봐도 왜 내가 그렇게 코딩했는지 생각이 나지 않았다. 그래서 좀더 효율적인 코드로 바꿔보았다. 수정한 코드는 제대로 작동하지 않았고 그때서야 왜 그렇게 무식한 방법을 사용했는지 이유가 떠올랐다. 이 경우도 비슷하게 몇 줄의 주석만 있었다면 이런 고생은 안 했을 것이다.

그 이후로 필자는 코드에 주석을 다는 습관을 들였다. 그리고 추가적으로 코드를 메모장처럼 사용하는 습관도 들였다. 대부분의 프로그래머는 많은 시간을 소스 코드와 함께 보낸다. 따라서 코딩과 관련된 사항을 종이나 다른 파일 등에 기록하는 것보다 소스 코드에 기록해 두는 것이 매우 효율적이다.

다음에 작업할 내용이나 다른 코드가 완성된 후에 수정해야 할 사항, 하드 코드(hard code)된 내용 등을 소스 코드 내에 주석으로 남겨두는 것이다. 그리고 차후 작업할 때 이 주석을 보면 앞으로 해야 할 내용, 수정해야 할 내용 등이 설명과 함께 남게 될 것이다. 다음은 필자가 소스 코드에 사용한 몇몇 주석을 예로 들어본 것이다.

// FIXME : 테스트 후 잘 작동하면 삭제할 것!
// FIXME : 다음 멤버 변수를 private로 바꿀 것!
// CONSIDER : 여기서 예외를 발생하는 것이 합당할까?
// HARD CODE : 보다 간단히 하기 위해 아스키 코드를 하드 코드함

이렇게 작성된 주석들을 탐색기의 검색 기능이나 대부분의 에디터가 제공하는 검색을 통해 키워드(FIXME, CONSIDER 등)를 찾으면 소스 코드에서 어떤 작업을 더 해야 하는가가 명백히 드러난다. 소스 코드는 다른 어떤 것 보다 훌륭한 개발 일지이자 메모장이다.

고수는 자료를 잘 찾는 사람
독자들이 프로그램을 작성하다보면 어려운 문제나 쉽게 해결되지 않는 오류에 부딪힐 때가 많을 것이다. 그럴 때 독자들 중에 많은 사람은 인터넷의 개발자 포럼에 자신이 부딪힌 문제를 질문할 때가 종종 있을 것이다.

대개 제목은 "고수님들 부탁 드립니다…로 시작되기 쉽고" 얼마 후에 고수가 문제에 대한 해결책 혹은 해결을 위한 실마리를 알려준다. 그렇다면 그 고수라 불리는 사람들은 다양한 분야의 여러 질문을 어떻게 척척 대답해 주는 것일까? 그들의 머리는 정말 좋아서 모든 상황을 기억하고 있는 것일까?

필자의 경험에 비추어 본다면 전혀 그렇지 않을 가능성이 높다. 10여 년 전이라면 모를까 요즘에는 너무도 많은 기술과 너무도 많은 개발환경, 프로그래밍 언어, 플랫폼이 쏟아져 나오고 있다. 이들에 대해 모두 잘 알고 있는 사람은 정말 드물다. 그렇다 할지라도 게시판에서 답변을 잘해주는 고수들을 보면 세세한 함수들의 매개변수까지 정말 잘 알고 있다는 생각이 드는 것은 사실이다.

필자는 요즘의 고수란 필요한 프로그래밍 자료, 기술 가이드, How-to 등의 자료를 잘 찾는 사람이라고 말하고 싶다. 수만 개의 함수와 클래스 등을 모두 외우고 다니는 사람은 없을 것이다. 하지만 간략한 키워드만으로 필요한 함수와 클래스를 찾을 수 있는 능력이 있다면 그는 고수 반열에 오를 충분한 자격이 있다.

누군가가 질문을 하거나 자신이 프로그램을 작성할 때 특정 함수 혹은 기능이 필요하다면 고수라 불리는 사나이는 "어디서 봤었지…"'라고 몇 마디 중얼거리며 인터넷이나 관련 책자를 뒤적거릴 것이다. 오랜 시간을 소요하지 않고도 그는 자신이 필요한 기능을 찾을 것이고 구체적인 사용법 등은 그 자료에 모두 실려있다. 이제 프로그램을 작성하는 데 별 어려움은 없을 것이다.

반면에 남들이 고수라고 부르지 않는 사람들은 무언가 하고 싶지만 그것을 어떻게 할지 모를 때면 먼저 가슴이 답답하고 눈알이 튀어나올 것 같은 막막함에 부딪힌다. 관련 자료를 찾아보고 싶지만 어디서 자료를 찾아야 할지도 잘 모른다. 겨우 자료가 인터넷이나 어떤 책에 나와 있다고 주워 들어 구하게 된다. 됐다 싶은 마음에 자료를 살펴보지만 자료의 양이 너무 방대하다. 요즘 컴퓨터 관련 책들이 좀 두꺼운가? 게다가 MSDN 라이브러리 같은 자료는 CD 3장 1.8GB에 달하는 방대한 분량이다. 숨이 막히기 딱 좋은 분량 아닌가?

고기도 먹어본 사람이 잘 굽는다
"그렇다면 고수들처럼 자료를 빨리 잘 찾으려면 어떻게 해야 합니까?" 먼저 많이 찾아봐야 한다. 고기도 먹어본 사람이 잘 굽는다고 했다. 자료를 많이 찾아 본 사람은 어디에 유사한 자료가 있는지 알고 있다. 게다가 이렇게 자료를 찾다보면 자신도 모르는 사이에 공력이 쌓인다. 공력이라 함은 예전에 찾아보지 않았더라도 '이런 자료는 여기에 있을 거야'라고 추측할 수 있는 능력을 말한다. 그리고 실제로 찾아보면 대개 80∼90%는 원하는 자료가 찍어 본 그곳에 떡(?)하니 있기 마련이다.

비록 원하는 자료를 찾지 못하더라도 그것을 찾기 위한 실마리 정도는 얻을 것이다. 필자가 주로 참조하는 자료는 뭐니뭐니 해도 MSDN 라이브러리다. 윈도우 플랫폼에서 개발하는 개발자라면 모두 이 MSDN 라이브러리를 끼고 살아야 한다. 개발에 가장 많이 참조하기 때문에 하드디스크 용량이 아무리 부족해도 MSDN 라이브러리 CD 3장을 거의 모두 설치한다.

그리고 필자가 겪는 문제의 많은 부분을 여기 MSDN 자료에서 해결하곤 한다. MSDN 라이브러리를 한번이라도 돌아본 사람은 알겠지만 여기서 원하는 자료를 찾기란 쉽지 않다. 인덱스가 잘 갖춰져 있지만 키워드 하나를 던지더라도 그 키워드에 포함되는 자료가 수십 수백 개가 나타나기도 한다. "이들 중에서 내가 필요한 것은?" MSDN 라이브러리를 많이 참고해 본 사람은 그 많은 내용 중 내가 원하는 것이 무엇인가를 어렵지 않게 골라낼 수 있다.

대충 이번 이야기의 결론은 이렇다. 고수라고 해서 모든 것을 알고 기억하는 것은 불가능하다. 그러나 그들은 필요한 자료를 빨리 찾는 방법을 알고 있다. 그 방법은 배울 수 있는 것이라기보다는 자료를 많이 찾아봄으로써 스스로 터득하는 것이다. 물론 누군가가 옆에서 계속 자료 찾는 것을 도와 줄 수 있지만 스스로 고생하면서 터득한 자료 찾는 방법이 훨씬 더 값지다는 것을 명심하자.

보다 많은 경험
이제까지 필자가 직간접적으로 경험한 에피소드 몇 개를 소개했다. 마지막으로 황당한 에피소드는 아니지만 필자가 초보 프로그래머와 보다 고급 프로그래밍을 하고자 하는 개발자에게 해줄 수 있는 몇 가지 조언을 해보기로 하겠다. 다분히 개인적이고 주관적인 내용이기 때문에 모든 독자들이 공감하리라고 생각하지는 않는다. 그래도 1985년부터 프로그램을 짜온(대개 프로그래머들은 프로그램을 '짠다'라고 표현한다) 한 프로그래머의 이야기니 들어봐 주기 바랄 뿐이다.

프로그래밍은 경험이다
먼저 권장하고 싶은 것은 보다 많은 경험을 해보라고 권하고 싶다. 필자의 주관 하에 프로그래밍은 경험이라고 말하고 싶다. 보다 많은 프로그래밍 경험을 갖고 있는 사람은 주어진 문제를 보다 빨리 해결할 수 있는 능력을 갖고 있다. 말을 좋게 해서 많은 경험이지 속된 말로 '닥치는 대로 프로그램을 짜보라'고 권하는 것이다. 아무리 프로그램이 작더라도 직접 작성해 본 것과 그렇지 않은 것은 매우 큰 차이가 난다. 작은 연습 프로그램을 많이 작성해 본 사람은 큰 프로그램도 잘 짜기 마련이다. 큰 프로그램도 결국은 작은 모듈들의 집합이기 때문이다.

경험을 늘리는 방법 중 하나는 다른 사람이 작성해 놓은 예제를 분석해 보는 것도 좋은 방법이다. 하지만 반드시 그리고 정말 중요한 것은 예제를 분석하는 것에 그치지 말고 스스로 비슷하거나 진보된 예제를 작성해 보라고 권하고 싶다.

필자가 2000년 말 닷넷과 C#을 처음 접한 이후로 지금까지 작성한 예제 코드들이 수백 가지이며 7만여 라인이 넘는다면 믿겠는가? '믿거나 말거나'지만 필자는 이렇게 많은 코드들을 작성해 보면서 닷넷 플랫폼과 C#이라는 언어를 이해할 수 있게 됐다. 독자들은 어떠한가?

필자는 왜 이렇게 프로그래밍 경험을 중요시할까? 경험에 관련된 필자의 한 후배 이야기를 하고자 한다. 필자의 한 대학 후배는 대학교에 들어와 처음으로 프로그래밍을 시작했다. 상당히 성실했고 머리도 매우 좋아 프로그래밍을 빠르게 배워나갔다. 필자가 보기에도 짧은 기간에 빠르게 프로그래밍을 배우는 것 같았다.

하지만 그 후배는 프로그램을 작성하다 예상하지 못한 문제에 부딪히면 그 문제를 해결하는데 상당한 시간을 소비하고 있었다. 후배가 부딪힌 문제들은 대개 경험 많은 개발자라면 손쉽게 해결할 수 있는 것이었다. 여기서 프로그래밍 경험의 차이가 조금씩 나타나기 시작했다.

그 후배는 프로그래밍을 배운지 얼마 안되 어느 경지에 이르게됐지만 그 경지 이후부터는 성장이 크게 둔화됐다는 것이다. 그 이후의 고급 프로그래머 나아가서 컨설턴트가 되기까지는 많은 경험을 요구하고 있었던 것이다. 짧은 기간에 그러한 경험을 쌓기는 아무래도 무리가 있었나보다.

비단 프로그래밍이 아니더라도 어느 경지까지는 학원이나 도서나 다른 사람의 도움을 통해 열심히 공부해 다다를 수 있다. 그 이후부터는 부단히 많은 경험을 쌓아가면서 다듬는 과정이라 할 수 있다. 경험은 곧 실력과 연결되며 그것은 곧 프로그래머로서의 자신의 가치를 높이는 일이다.

경험을 쌓아가는 좋은 방법은 실제적인 코드를 작성해 보는 것이다. 실제 프로젝트가 있다면 매우 좋겠지만 항상 그럴 수는 없을 것이다. 또한 자신의 관심사와는 다른 프로젝트를 수행할 수도 있을 것이다. 이럴 때에 수십 라인에서 수백 라인정도의 샘플들을 작성해 보는 것은 자신의 경험을 축적하는 좋은 방법이 될 것이라 필자는 생각한다.

한 기술에 정통하려고 노력하자
보다 넓은 경험 외에 한 가지 더 추천하고 싶은 것은 한 가지를 깊이 파고들라고 권하고 싶다. 한 가지 기술에 정통한 사람은 다른 기술에도 쉽게 적응할 수 있다. 대부분 기술들의 뿌리가 비슷하거나 같기 때문이다. 이 규칙이 가장 잘 적용되는 것은 아마도 프로그래밍 언어 분야일 것이다. 한 가지 언어에 정통한 사람은 다른 프로그래밍 언어도 쉽게 배운다.

그것도 초보적인 수준이 아닌 고급 수준에 쉽게 다다를 수 있다. C++에 정통한 사람은 델파이에서 사용하는 오브젝티브 파스칼(Objective Pascal)을 어렵지 않게 습득할 수 있다. 비슷하게 자바에 정통한 사람 역시 C#, 오브젝티브 파스칼 등의 언어에 쉽게 접근할 수 있다. 이유는 프로그래밍 언어들의 기저에 깔려 있는 기술·사상·구현이 서로 비슷하기 때문이다.

프로그래밍 언어뿐만 아니라 분산객체 기술 역시 한 가지 기술에 정통하면 나머지 역시 어렵지 않게 접근할 수 있다. 분산 객체의 기본 사상이 서로 비슷하기 때문에 한 가지 기술을 마스터한 사람은 자기가 알고 있는 기술과 배우고자 하는 기술의 차이점 위주로 지식을 습득하기 때문에 시간을 절약할 수 있다.

게다가 한 기술을 마스터 하면서 쌓은 노하우와 경험은 대부분 새로운 기술에도 비슷하게 적용될 수 있기 때문에 빠른 시간에 고수 반열에 오를 수 있는 것이다. CORBA 고급 엔지니어와 COM 고급 엔지니어가 의사 소통하는데 별다른 어려움이 없는 것은 이런 맥락에서 풀어볼 수 있겠다.

필자는 98년부터 지금까지 COM에 대해 공부하고 실제 프로젝트를 수행해 왔다. 이제 COM 컴포넌트나 액티브X 컨트롤을 만드는 일은 C++, VB, 델파이 등의 다양한 언어로 작성할 수 있게 됐고 다양한 분야에 COM 기술을 응용할 수 있게 됐다. 그리고 1년 전에 등장한 새로운 기술인 닷넷으로 이전하는 데는 그다지 긴 시간을 요구하지 않았다. COM이나 닷넷의 뿌리가 비슷했기 때문이다.

현 세대의 IT 기술은 세분화돼 있으며 정말 다양한 분야가 존재한다. 그리고 많은 기술들의 깊이는 수년에 걸쳐 상당히 심화돼 있다. 개인이 이렇게 다양한 분야의 기술을 모두 정통할 수 없을 것임은 너무도 자명하다. 그렇다면 한 가지 기술을 마스터할 정도로 깊숙이 파고드는 것은 중요하다고 볼 수 있다.

물론 모든 것을 다 할 수 있다면 금상첨화겠지만 그렇게 할 수 없기에 한 가지만이라도 깊숙하게 그 기술을 파고들라는 것이다. 남들이 대부분 알고 있는 정도를 내가 알고 있다면 그것은 그 기술을 심화했다고 할 수 없다. 내가 알고 있고 자유 자재로 남들에게 설명할 수 있는 내용이 다른 사람들이 잘 모르고 있다면 그는 어느 정도의 수준에 올랐다고 볼 수 있을 것이다.

한 가지 기술을 파고들어야 한다면 어떤 기술을 파고들어야 할까? 닷넷인가? 자바인가? 아니면 새로운 그 무엇인가? 만일 자바라면 자바에 대한 모든 것을 깊이 파고들 것인가? 아니면 JSP, EJB 등의 세부 분야에 대해 파고들 것인가? 이것이 선택의 갈림길이며 어려운 부분 중에 하나이다. 이 선택은 순전히 독자들의 몫이다. 기술이 지금까지 발전돼 온 방향과 앞으로 발전 방향을 고려하며 자신의 진로 역시 고려해야 할 것이다. 다만 현재 상황으로 C#과 자바 중 어느 것을 선택하더라도 향후 몇 년 동안 후회하지는 않을 것 같다.

원리를 파악하자
마지막으로 독자들에게 권고하고 싶은 사항은 원리를 파악하라는 것이다. 원리를 파악하는 것만큼 중요한 것은 없다. HTTP의 원리나 TCP/IP의 원리를 모르고 ASP나 JSP를 코딩하는 것과 알고 코딩하는 것은 많은 차이를 드러낸다. 원리를 알고 코딩하는 사람은 다양한 응용이 가능하며, 문제가 발생했을 때 그 문제의 원인이 무엇인지 빨리 알아내고 해결책 역시 빨리 찾아낼 가능성이 높다.

반면 원리를 잘 이해하지 못한 사람들은 응용은 둘째치고 문제가 발생하면 문제의 원인조차 파악해 내지 못하는 경우가 많다. 기초를 건실하게 다져가면 새로운 기술들이 등장하더라도 빠르게 대처할 수 있다. 앞서 제시한 한 가지 기술을 깊게 파고드는 것과 비슷한 맥락으로 한 기술을 깊게 파고들면 그 원리를 터득하게 되는 것은 당연한 결과로 볼 수 있겠다.

그렇다고 지금부터 운영체제·컴파일러·TCP/IP 네트워킹 원리를 공부하라는 얘기는 아니다. 자신이 사용하는 기술을 단순히 '사용'하는 방법만 아는데 그치지 말고 '그 원리가 어떤 것일까'라는 호기심을 갖고 알아보라는 얘기다. ASP 개발자라면 HTTP라는 것이 어떤 프로토콜인가 한번 찔러 보고, HTTP가 TCP/IP를 사용한다던데 하면서 TCP/IP도 한번 찔러 보라는 얘기다. 이런 식으로 원리를 파악하려고 자주 시도하고 실제로 원리를 파악해 내는 것이 중요하다. 원리만을 위해서라면 다시 학교로 돌아가야 할 것이다.

지금까지 필자는 경험을 바탕으로 프로그래밍에 대한 몇 가지 이야기를 소개했다. 황당 에피소드라는 제목 하에 정말 황당한 이야기를 재미있게 했어야 하는데 필자의 글발로는 무리가 있었던 것 같다. 아무쪼록 프로그래밍의 고수가 되는 길은 자신의 부단한 노력과 상당한 시간이 필요함에는
이올린에 북마크하기

Posted by Dual

2005/07/31 13:43 2005/07/31 13:43
Response
No Trackback , 5 Comments
RSS :
http://dual5651.hacktizen.com/tc/rss/response/76

Trackback URL : http://dual5651.hacktizen.com/tc/trackback/76

Comments List

  1. 조아 2009/07/14 13:21 # M/D Reply Permalink

    우왕~ 대단한 포스가 느껴지네요.. ㅎㄷㄷ

  2. astraphobia 2011/03/05 15:14 # M/D Reply Permalink

    좋은글 감사합니다.

  3. AmesianX 2011/07/21 02:35 # M/D Reply Permalink

    초보 프로그래머와 전문 프로그래머의 차이는 단, 하나이다..

    초보 프로그래머는 char * 를 쓰고, 중수 프로그래머는

    LPCTSTR 같은 한번 매크로화된 문장을 쓰고 고수 프로그래머는

    CString 을 쓴다.(MS 의 프레임워크를 쓴다는 의미, CString 을
    쓰면 초보처럼 보이고 우스워 보이지만 의미자체로 따지면 일반화
    되었기에 우스워보이는 것일 뿐 첫 MS 의 시도에서는 우스운 개념이
    아니었다는 얘기..)

    고수를 벗어난 이른바 전문가가 된 사람들은 CString 을 쓰지 않고

    CString 을 개조 또는 업그레이드 시켜서 개인용으로 사용한다.

    이것을 템플릿화(C++ 의 템플릿을 말하는게 아님!!) 했다고 말한다.

    자신만의 것으로 정형화 시켰다고 말할 수 있다. 이 자신만의 완벽화

    시킨 템플릿을 직접 만들어서 많이 갖고있는 사람들을 우리는 Guru 라

    칭한다.(중요한 점은 그럴리는 없겠지만 언제라도 필요한 상황이 다시
    온다면 여전히 다시 그 템플릿 이상으로 재작성이 가능한 실력을 동시에
    보유하고 있어야 한다.)

    이러한 템플릿이 많은 사람들을 전문가라 칭한다. 자신이 직접 구현하여

    만든 템플릿을 많이 갖고있는 사람들은 필연적으로 프리랜서를 뛰는

    수순을 밟는 것이 99.9% 라 할 수 있다. 이익을 추구하는 개발전문 회사가

    프리랜서를 고용하는 이유는 단 하나밖에 없는데 프리랜서가 자신들보다

    더 정확하고 뛰어나며 효율적인 프로그래밍 템플릿을 더 많이 보유하고

    있다는 전제가 깔려있기 때문이다. 자신들이 직접 만드는데 수개월이상

    걸리고 안정검증까지 받으려면 그 비용보다 이미 더 많이 들기 때문이다.

    더불어 돈을 많이 들여도 안정성 검증 문제가 발생하여 실패할 가능성

    또한 다분하기에 프리랜서를 고용한다. 이 프리랜서들을 우리는 고수라

    부를수 있다. 이러한 케이스들 중에서는 간혹 이른바 초고수라 부를 수

    있는 Guru 레벨을 넘어가는 사람들이 있는데, 대부분은 이러한 사람들의

    경우 뒷조사를 해보면 해커의 삶을 살아온 사람들이라고 할 수 있겠다.

    본래 해커에는 세가지가 있는데(명시적으로는 위키페디아 기준, 비명시
    적으로는 해커들의 세계관적 개념. 위키페디아는 이 개념으로만 존재하는
    해커의 개념을 명시화시켜놓은 정도임.. 굳이 기준을 명시화 시켜야만하는
    근거를 대라고 하면 전문가들이 직접 작성하는 백과사전인 위키페디아에도
    증명되어 있다는 얘기.)

    1번째가 Subculture Programmer 들이다. 간단히 말하면 GNU Hacker 들을

    칭한다고 할 수 있는데.. 이상적인 개념을 좀 많이 제거시켜서 표현하자면

    한마디로 개발자형(프로그래머형) 해커를 말한다. MIT 에서 태동한 최초의

    해커들이 이 1번째 Subculture Programmer 해커들이다. 오늘날 보안전문가

    내지는 리서쳐로 불리는 전문화된 사람들은 아류가 되어 전문화된 상태라고

    볼 수 있다. 본인이 말하는 것은 위에서 언급한 전문개발자 내지 전문 프로

    그래머들 중에서 그런 레벨을 가진 사람들이 알게모르게 꽤 있다는 말임..

    그런 사람들은 전형적인 해커의 모습이라는 것임. 그리고 그런 사람들의

    경우에 진짜로 전문가라고 불릴 수 있다는 것인데 이런 경우에 특징이 바로

    스스로 만든 템플릿을 어느정도 보유하고 있느냐가 관건이란 얘기가 된다..

    개발자인 사람들은 자신이 만든 프레임워크 or 라이브러리로 짜는가

    아니면 MS 에서 디폴트로 제공한 것으로 짜는가.. 단 두가지로 나뉨.

    전문 프로그래머는 전체를 새로 설계한 자신의 언어를 만들어서 사용하고

    초보 로그래머들 또는 중고수 정도의 실력은 되지만 자신의 것이 없는

    상태에서 MS 가 제공한 상태의 날것을 사용하는 두 부류로 나눠진다.

    그럼 무슨 차이점이 존재하는가?

    두가지 상황이 생긴다..

    자신의 템플릿을 갖고 있는 전문프로그래머는 엔진을 갖고있기 마련인데,

    이 엔진이라는 것은 프레임워크까지 만든 경우가 있고 프레임워크까지는

    가지 못하지만 라이브러리까지는 가는 경우가 있다.

    이 말이 전나 어렵게 들릴수 있으므로 재해석적으로 말해준다면..

    MFC 나 볼랜드의 MFC 격인 OWC(맞나? 기억이 안남)나 또는 QT 나

    기타등등을 우리는 프레임워크라고 부르지 라이브러리고 부르지 않는다.

    비슷하게는 라이브러리안에 이러한 프레임구조가 들어있는 경우도 있다.

    그럼 프레임이란 무엇인가?

    추상적인건 집어치우고 프레임을 좀 더 조잡하게 설명하여 이해를 돕고자

    한다면, C 언어의 경우에는 함수포인터를 배열안에 다 집어넣은 상태에서

    배열자체가 함수포인터이므로 이 배열을 돌려가면서 함수를 호출하는 구조

    자체를 짜는 경우에 우리는 프레임을 만들려고 한다는 표현을 쓸 수 있다.

    좀 더 고급스러운 말을 쓴다면 간접기교를 얼마나 부릴수 있는가가 바로

    프레임의 관건이거던..?

    C++ 의 경우에는 컨스트럭터와 디스트럭터가 있다. 그래서 인스턴스를

    만들면 컨스트럭터가 호출되는 것은 자동(프레임)이며 인스턴스가 사용

    종료가 될 때는 디스트럽터가 호출된다.(프레임) 이런 경우에 클래스의

    컨스트럭터에 init 라는 초기화 작업을 삽입하고 디스트럭터에 close 를

    삽입할 수 있다. 즉, 인스턴스를 생성만 해서 사용해도 init 작업과 close

    종료작업은 자동화되어 일어난다. 이런 가장 단순한 작업을 우리는 프레임을

    만드는 작업이라고 말할 수 있다. 여기에 좀 더 고급의 설계작업을 넣는다면

    C++ 의 컨스트럭터와 디스트럭터외에 직접 호출할 수 있는 멤버함수인

    Process 라는 메써드(함수)와 OnAction 메써드(함수)를 두는 것이다.

    Process 라는 메써드인데 그 안에 프로그래밍 내용은 어떤 작업을 뺑뺑이

    (루프)를 도는 상태이다. 그리고 뺑뺑이 루틴안에는 pObject->OnAction(arg)

    라고 되어있다. 이 말은 뭔가?

    만약 ABC 라는 어떤 클래스의 실체인 a 라는 인스턴스를 생성하였다면

    컨스트럭터와 디스트럭터는 기본으로 준비되고 a.Process 라는 형태로

    메서드를 호출하면 뺑뺑이를 돌면서 무언가를 처리하기 시작할 것이라는

    말이다. 그런데, Process 라는 메서드가 뺑뺑이가 돌면서 무언가 특정

    조건이 발생하면 pObject->OnAction 을 호출하는 구조라는 얘기이다.

    이때 pObject 는 p 라는 접두사에서 보는 것처럼 포인터이다.

    그리고 pObject 는 ABC *pObject 였다. 방금 말한 클래스안에 자기자신이

    또 들어있는 경우라고 생각할 수 있다. Process 메서드는 클래스가 초기화

    될때 Init 의 처리에 의하여 이미 pObject 가 ABC 클래스의 포인터를 받게

    할 수 있다. 즉, pObject->OnAction 에서 OnAction 함수는 가상함수가

    되어야 한다는 것이다. 그렇게 되면 ABC 라는 클래스를 상속받은 ABCD

    라는 클래스를 사용자가 만들면 ABCD 클래스의 인스턴스 b.OnAction 만

    새로 정의(버추얼함수이므로 오버라이딩할 수 있게되니까..) 한다면

    본래의 ABC 클래스가 뭔가를 열심히 하다가 OnAction 이라는 메서드를

    호출하는 격이므로 이벤트가 발생하였다라는 표현을 쓸수가 있게된다..

    C 언어에서는 이것을 콜백함수라고 말하지만 C++ 에서는 콜백이라는

    용어보다는 이벤트 드라이븐 방식의 코딩이라고 할 수 있겠다..

    MFC 라는 프레임도 이런식으로 구현되어져 있다고 할 수 있겠다..

    단지 C 와 C++ 만 갖고 설명을 하였다. 그런데 C 언어는 어셈블리로

    설명이 가능하다.. C 가 스택을 쓰거나 힙을 쓰거나 C++ 까지 확장했을때

    익셉션을 설정하는 것까지 모두 어셈블리단으로 표현이 된다..

    그럼 한가지로 정의가 될 수 있겠다..

    프레임이란 무엇인가?

    "컴퓨터의 근원작동 모습인 메모리 간접주소 지정방식을 구조화 시켜서
    형성시킨 아키텍처 모델"

    이라는 말과 동일하다..

    컴퓨터 언어에서 간접 주소지정방식이라는 것은 어마어마한 능력을 부여

    하는데 이러한 간접 주소지정방식이라는 아주아주 기계적이고 단순한

    특징을 구조화시켜서 나온 언어가 C 언어이고 C++ 언어이다. 그리고

    어셈블리같은 매우 저수준 단계의 힘든 작업을 좀 더 쉽게 C 와 C++ 언어를

    사용하여 좀 더 고수준의 간접지정방식을 만들어서 나온 프레임들을 갖고

    나오는 언어들이 자바나 C# 이나 오브젝트 C 나 COM 이나 오브젝트

    파스칼 같은 부류들이 된다.. 전체를 하나로 뭉뜽그려서 설명하라고 한다면,

    "간접주소지정방식의 장난이 불러일으킨 화근 덩어리들"

    이라고 말할 수 있다.. 화근덩어리라고 표현한 이유는 이러한 내용을 전혀

    인식하지 못하고 언어를 사용하는 사람들이 "간접주소지정방식" 의 위대함에

    되려 도전장을 내밀고 말쌀하려고 역으로 주장해오는 어처구니 없는 일들이

    발생하고 있기 때문일 것이다.. "호로자식들도 아니고 부모도 몰라보나..?"

    라는 질문을 안할 수 없다는 것이다..

    전문프로그래머들은 이러한 프레임을 직접 설계해서 사용할 수 있는 프로

    그래머들을 말한다. 즉, 자신이 주력하는 언어를 이용하여(그것이 어떤언어
    이건간에)

    간접주소지정 방식의 혜택을 활용할 수 있는 사람이 바로 전문프로그래머

    이고 이들이 장차 아키텍트가 되는 것이다.

    깨달음을 얻은 어떤 프로그래머 분은 이런말을 하기도 한다.

    진정한 프로그래머가 되면 Virtual 만 열심히 정의한다라고..

    이 말은 경험이 없는 프로그래머들이(초중급 프로그래머들 + 일부 고수라고
    착각하는 프로그래머들)

    듣게 되면 굉장히 우습게 생각할 수도 있다. 하지만, 진정으로 깨달음을

    얻은 프로그래머들은 Virtual 을 제대로 정의할 수 있는 능력이야 말로

    프로그래머의 궁극레벨이라는 것을 알고 있다..

    이 말을 바꿔서 말하면 "간접주소지정방식을 제대로 쓸 수 있는 즉, 활용

    하는 수준을 넘어 절묘하게 재조합해서 맞물려들어가는 설계수준" 을

    열심히 해야한다는 말이기 때문이다. 간단하게 극과 극으로 설명을 해주

    겠다. 어셈블리로 C++ 언어로 짜고 컴파일했을때 생성되는 버추얼펑션

    테이블을 직접 만들수 있다. 일반적인 C++ 도 가능하고 COM 도 가능하다.

    버추얼펑션테이블은 말 그대로 인덱스테이블이다. 그런 가상함수 테이블에

    어셈블리로 주소를 덮어 씌우면 오버라이딩이다. 이것은 어셈블리를 좀

    하는 사람이 리버싱쪽 공부 조그만 하면 중고딩도 다 이해할 수 있는 내용

    이다. 그런데, 이 오버라이딩 구조만 볼 뿐 어셈블리 자체에서 지정하는

    간접주소지정방식의 한계가 없다는 것은 알려고도 하지 않는다..

    이 글을 읽는 사람은 한번, 시중에 오브젝티브 C 2.0 어쩌구 저쩌구라는

    하얀색과 빨간색이 뒤섞인 책이 있는데 그 책을 보길 바란다.. 저자는

    이미 다 바닥까지 꿰뚫고 책을 썼는데 그 사람 역시 언급하는 말이

    간접주소지정방식이다.. 오브젝티브C 라는 매우 고급화된 언어에서 간접

    주소지정방식을 논하다니.. 왠말인가..?

    오브젝티브 C 언어에서 자랑하는 특징중에서 함수를 구현하지 않아도

    통합이되는 막강한 기능이라고 설명되는 부분이 있다. 이것을 이해하려면

    저레벨의 작동구조를 모르면 절대로 이해하기 힘들 것이다. 포인터는 인덱스

    자체이며 증가시킨다면 계속해서 증가시킬수 있다. 1 과 2 와 3이 있는데

    4가 없다고 하더라도 포인터만 증가시키면 4 를 지정한 것처럼 만들 수 있다.

    그 기능은 원래 아주아주 저레벨인 어셈블리에서만 가능하지만 고수준의

    언어에서 이 제한을 풀어버렸다는 얘기이다. 오브젝티브C 에서는 실체가

    없는 메서드도 지정을 할 수 있다는 식의 설명이 나온다. 그것이 막강하다고,

    본인은 오브젝티브 C 를 하지 않지만 무슨설명인지는 알 수 있었다. 이미

    COM 프로그래밍에서도 그런 비슷한 부분이 나오기도 한다..



    최초에

    아주아주 저레벨의 기계언어라고 부르는 어셈블리가 있었다.. 이 어셈블리

    언어를 설계한 개발자들은 이 언어에 무한한 확장성 한가지를 주어서 좀더

    편하려고 하였다. 그런데, 그 확장성은 기계라는 특징때문에 어쩔수 없이

    부가할 수 밖에 없었던 것이었다. 그래서 그 기계에 시계침 같은 바늘을

    하나 주었다. 그 바늘은 메모리를 가리킬 수 있었다. 단지 가릴킬 수만 있

    었다. 그것을 우리는 오늘날 포인터라고 부른다. 이 포인터라는 것은 C

    언어라는 고급언어로 왔어도 그 특징이 사라지지 않았다. 그리고 C++ 이란

    언어에 와서도 사라지지 않았다. 심지어 자바나 C# 이나 자바스크립트나

    PHP 나 뭐나 그 어떤 언어에서 조차도 전혀 사라지지 않았다. 아니, 사라질

    수 조차 없다. 최초의 기계가 그걸 필요로 했다. 아니, 인간 자체가 그걸

    필요로 했다. 포인터를 말하면 C 만 생각하고 C++ 만 생각한다. 포인터의

    의미는 간접주소지정방식이다.. 이 포인터는 우리가 말하는 인덱스를 단지

    좀 더 첨예하게 표현하는 것에 불과하다.. 포인터는 즉, 인데스로 대체되어서

    표현이 되어도 똑같은 말이 된다. 실제로 스크립트 언어나 기타 고급화된

    언어들(컴모넌트 기반 언어들) 모두 포인터를 인덱스화해서 대체하여서

    구현한 것에 불과하다. 이 것을 특징으로 생각해야 한다. 로우레벨처럼 생각

    해서는 안된다.. 이 인덱싱특징을 생각해야 한다. 간접주소지정방식이라는

    기계적인 특징을 생각해서는 안된다는 말이다..

    그 "방식" 을 깨달아야 한다는 얘기이다..

    전문프로그래머는 이 방식을 알고 있어야 한다. 다시 설명하면 이 방식은

    "지정자" 를 사용하여 지정법을 이용하여 구조화 시킬 수 있다는 것이고

    구조화라는 것은 일종의 모델링 기법이다..

    우리가 흔히 알고있는 디자인 패턴에서의 싱글톤 구조라던지 기타등등도

    결국, 구체적인 간접주소지정법이 언어마다 다를수는 있어도 방식은 동일

    하게 갈 수 있다.


    어떠한 언어분야에 있다손 치더라도 전문프로그래머라면 이러한 특징을

    (간접주소방식) 기반으로 설계하여 만들어낸 자기만의 프레임을 가지고

    있어야 한다는 말이다.


    현실적으로는 C/C++ 의 분야에서 대부분 전문프로그래머로써 실력이

    출중한 사람일 경우에 처음부터 다 재설계를 한다. MFC 를 사용하지

    않고 API 레벨로 MFC 처럼 구조골격을 만들어내서 사용하는 프로그래머

    들이 있다. 일종의 직접 엔진을 만들어서 사용한다고 봐도 과언은 아닐

    것이다.. 실제로 대부분의 게임엔진 같은 경우에 리소스 관리부터 시작

    하여 스트링함수나 자잘한 STL 관련함수까지 모두 다 직접구현해서

    사용하고 있다. API 만 OS 에 의존적일 뿐 윈도우와 리눅스 양 사이를

    오간다고 해도 거의 두군데에서 크로스 플랫폼처럼 다 작동될 수 있는

    수준의 독립화 상태로 직접구현한 프레임워크(엔진)를 갖고 있다는 말이다.

    실제로 우리는 인터넷에서 자주 목격한다. 이런 프레임들에서 가장 흔하고

    대표적인 예가 QT 나 WX 위젯 라이브러리나(위젯은 라이브러리라고
    부를수 밖에는 없지만, 프로그래밍의 골격을 상당히 바꿔버리므로 거의
    프레임수위까지 갔다고 봐야한다..)

    기타등등 있겠지만, 뒤지다 보면 아주 간단간단한 프로젝트들인데도 이런

    프레임 요소를 갖춘 녀석들이 보일 것이다..

    다시한번 언급하지만.. 프레임은 간접주소방식을 응용한 모델링기법으로

    탄생한 작동체(작동가능한 구조를 지니고 확장성을 지닌 몸체)일 뿐이다..

    이걸 직접 만들어보고, 갖고있으며 언제라도 뭔가를 만들어야 한다고 하면

    이것을 십분 활용하여 소스를 짜낼 수 있을때 우리는 전문프로그래머라고

    부른다..

    그리고 이들이 짠 소스는 떳떳하게 공개할 때 절대 쪽팔리지 않게된다...

    만약, 당신이 자신이 만든 프로그램의 소스를 어딘가에 공개해보고 싶은데

    쪽팔려서 못하겠다는 생각을 해본 적이 있다면 적어도 로우레벨 고수는

    되었다는 얘기이다.. 만약, 로우레벨의 고수를 벗어나서 진정으로 해커다운

    해커가(1번 부류의 Subculture Programmer 레벨) 되고 싶다면 어디에나

    소스를 공개해도 절대 쪽팔리지 않는 코드라고 스스로 자부할 수 있을 때에

    가능해질 것이다.. 그 정도로 완벽한 코드를 창조하려면 어셈블리만 파지

    말고 어셈블리의 특징인 간접주소지정 "방식!!" 이 상위레벨로 올라오기까지

    그 특징을 잃지않고 존재하는 본질을 보는 눈을 보유할 수 있어야 할 것이다.

    주변에 프로그래머로써 자존심을 걸고 굉장히 이쁜 코드를 짜려고 노력하는

    사람과 하드코딩에 목숨을 메는 사람이 있다면 미래의 모습은 뻔할 것이다..

    하드코딩에 목숨을 메는 사람은 그 수준의 코드수준만 평생 짜고 세상을

    마무리 할 것이고 가치에 해당하는 "돈" 도 그 수준에서 그칠 것이다..

    하지만, 이쁜 코드를 짜려고 노력하며 아키텍트가 되고자 노력한 프로그래머

    라면 적어도 사업체 하나쯤은 운영하고 있을 것이고, 더 나아가 구글이나

    MS 에도 도전장을 내밀 수 있는 거대한 꿈을 가진 해커로써 삶을 누리고

    있을 것이다..



    당신은 정말 해커가 될 것인가?

    아니면..

    엔지니어로 머물 것인가?

    1번 해커(Subculture Programmer)가 될 것인가?

    아니면

    2번 해커(Security Researcher)가 될 것인가?

    아니면

    1번과 2번을 합친 제 4번 해커(Hybrid Programmer)가 될 것인가?

    (참고: 3번 해커는 하드웨어 해커임..)

    오늘날

    세계를 이끄는 선두주자에 서있는 해커들은 2번이 직업이지만 1번을

    표방하고 있다.. 즉, 4번 해커부류에 서있는 해커들이 오늘날 앞서나가는

    진정한 해커로 거듭나고 있다. 쉽게 말하면, 코드를 짜고 이쁘게 만들려는

    노력을 하는 것은 취미중에 가장 고상한 취미로 가져가야 하고 그 고상한

    코드를 짜는 취미를 방해하는 장벽이 생기면 뚫어서 넘을 줄 알아야 한다.

    만약, 아이폰에 무언가 고상한 코드를 짜서 넣고 싶다면 더러운 하드코드를

    먼저 짜서 장벽을 넘고 그 다음에 그 안에 고상한 코드를 짜서 넣는다는

    개념으로 설명한다면 이해하기 편할 것이다..

    오늘날에 진정한 해커들은 이런식으로 간다..

    이들을

    다른 말로 말하면..

    진정한 전문 프로그래머들이다..



    너무 길었나..?



    P.S: 외국애들(미국, 유럽, 일본)은 이렇게 간다.. 그래서 외국애들이
    대단해 보이는 것이다.. 우리나라는 이정도까지 시야를 갖고 볼
    사람도 없겠지만 본다고 해도 시도자체를 하지 않는다..
    몇몇 있는 사람들 마져도 해커와는 동떨어진 그냥 프로그래머계통
    사람들이 주도하고 있고, 오히려 해커라고 부를 수 있는 사람들보다
    정통 프로그래머로써의 길을 걸어온 사람들이 더 해커같다..
    이것이 본인이 쪽팔려서 뒤로 자꾸 숨는 이유이기도 하고..
    누군가는 이걸 깨주었으면 좋겠다..
    이왕이면 정통 프로그래머 출신들이 깨주지 말고..
    내가 이름을 들어보고 닉네임을 들어본 정통 해커출신들이라고
    할 수 있는 기라성 같은 해커들이 좀 해줬으면 좋겠다..
    그랬으면 좋겠다..
    이게 내가 죽기전에 보고 싶은 것들이다..

  4. Air Jordans 2011/08/29 17:43 # M/D Reply Permalink

    555clf1
    thanjks for you

  5. Nike Air Max for Sal 2011/08/29 17:43 # M/D Reply Permalink

    555clf4
    very gpod

Leave a comment
« Previous : 1 : ... 11 : 12 : 13 : 14 : 15 : 16 : 17 : 18 : 19 : ... 42 : Next »

블로그 이미지

슬픔 메아리쳐, 난 너무도 약했어..

- Dual

Notices

    Archives

    Authors

    1. Dual

    Calendar

    «   2012/10   »
    Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4 5 6
    7 8 9 10 11 12 13
    14 15 16 17 18 19 20
    21 22 23 24 25 26 27
    28 29 30 31      

    Site Stats

    Total hits:
    126818
    Today:
    106
    Yesterday:
    227

    반응형

    'OLD_posting' 카테고리의 다른 글

    스레드 개념과 원리  (0) 2012.10.22
    윈도우 프로그래밍 잡지 기사  (0) 2012.10.21
    주요 포트 정리  (0) 2012.10.08
    리버스 텔넷  (0) 2012.08.06
    PE (Portable Executable) 포맷  (0) 2010.11.24