E D R , A S I H C RSS

프로그래머의길

마소 7월달 (1999년꺼로 기억) 승용씨의 글. 자유게시판에 인용된 글 옮김. (자유게시판 200번 대 글군. -_-;)

독자중 한 사람 필자에게 런 질문을 한적 있다.

"어떻게 하면 프로그래밍을 잘 할 수 있습니까? 만약있다면 그 해답을 가르쳐 주세요"

필자의 답변은 '해답은 없습니다.'였다. 하지만 어렵게 질문해온 독자에게 어설픈 답변을 할 수 없기 때문에 프로그래머의 길란 어떤 것인가에 대해 답변을 보낸 적 있다.
프로그래밍에 대한 정의는 여러가지가 있지만, 필자는 와 같 말하고 싶다.

'프로그래밍란 정열로 시작해 끈기로 끝나는 일련의 작업니다. 정열은 짧고 높지만 끈기는 길고 낮다.'

프로그래머는 화가와 같다. 화가의 그림에 대한 영감 프로그래머의 코드에 대한 영감며, 화가의 화판은 프로그래머의 자판인 것다. 단지 프로그래머는 화가가 사용하는 붓대신 손을 용한 코딩을 한다는 차점 뿐다. 맨처음 코딩에 대한 영감은 단순하게 시작한다. 하지만 그 영감을 현실속으로 끌어내기 위해서는 많은 시행착오를 거치게 된다. 자신의 실력을 한탄하기도 하면서 자신 만들어낸 알고리즘에 흠뻑 취하기도 한다.
초반의 정열은 무섭다는 표현 맞을 것다. 정말 자신 생각해낸 알고리즘의 성공 여부를 알아보기 위해 무섭게 그 일에 매달린다. 밤과 낮 서로 바뀌고, 모든 사회적 문화권에서 소외된다. 와 같 초반의 정열은 그 끝 어디인지도 모르는 자아도취의 행동인 것다. 하지만 러한 정열은 바로 시들어 버린다. 현실속에 안주할 것인가 아니면 상을 선택할 것인가 하는 기로에 놓게 되기 때문다.

현실 속의 안주는 시간과의 싸움다. 모든 프로젝트는 정해진 시간을 갖고 있다. 초반 설계 단계에 수립된 계획은 불가피하게 수정되는 경우가 태반다. 는 코딩중에 예상치 못한 복병(?)을 만나게 되는 경우가 있을 수 있으며, 관리자의 무리한 계획으로 초반 계획 수정되는 경우도 있다. 모든 프로그래머들은 항상 후자에 치중하게 된다. 현실도피를 위한 희생양으로 몰아세우는 격지만, 대부분의 경우는 관리자의 해 부족에 의한 비현실적 계획 주를 루기 때문다.

와 반대로 상을 선택하는 프로그래머는 그 다음부타 자신과의 싸움 시적된다. 끈기 바로 다. 흔히 우리는 능력 탁월한 사람보다는 성실한 사람을 더 높 평가해중다. 프로그래머 역시 끈기가 없으면, 완성도 높은 프로그램을 만들지 못한다. 자신 만든 알고리즘 아무리 탁월하다고 해도 용한 애플리케션의 완성도가 높지 않으면, 아무리 탁월하다고 해도 용한 애플리케션의 완성도가 높지 않으면, 아무도 알아주지 않는다. 필자는 수많은 디버깅과 요구사항을 수용해 나가면서 자신의 상을 실현해 나가는 프로그래머를 높 평가하고 싶다. 그리고 그러한 사람야말로 발전 가능성 있으며, 신뢰할 수 있는 프로그램을 만들기 때문다.

사실 완벽한 코딩란 존재하지 않는다. 다만 완벽을 위해 프로그래머는 키보드를 애인으로 삼을 뿐다. 끈기있게 코드를 디버깅하는 프로그래머는 그만큼 버그의 수를 줄일 수 있고, 또한 추가 요구사항에 대한 대비도 충분히 할 수 있다. 따라서 필자는 프로그래머란 정열보다는 끈기가 더 필요하다고 말하고 싶다. 정말 진정한 프로그래머란 자신의 역량보다는 한 주제에 대한 완벽에 가까운 해결책을 찾아내는 끈기있는 사람라고 생각한다. 우리 모두 학창시절 어려운 수학문제를 풀던 때를 생각하면서, 그 의미를 되새겨보자.


사람은 누구나 어떤 일을 하든 넘어야 할 벽을 만나기 마련다. 프로그래머역시 여러가지 벽을 만나게 되는데, 필자는 컴퓨터의 벽을 크게 해의 벽창조의 벽, 그리고 마음의 벽으로 구분하고자 한다. 해의 벽은 초보자가 넘어야 하는 벽창조의 벽은 중급자가, 그리고 마지막 벽인 마음의 벽은 전문가가 넘어야 하는 벽다.

글을 읽고 있는 독자라면 어느 정도 프로그래밍을 해본 경험 있을 것다. 초보자라 함은 프로그래밍에 입문하고자 하는 사람을 말한다. 즉 컴퓨터 사용부터 천천히 배워나가고 있는 사람들다. 들은 특정 학원 혹은 학교의 정규 과정을 통해 동료들과 함께 배우기도 하고, 또는 개인적으로 학습해 나가는 경우도 있다. 초보자들의 공통점은 전문가들의 논쟁을 아직 해 할 수는 없지만큰 관심을 갖고 있으며, 컴퓨터로 모든 일 가능할 것라는 부푼 기대에 차있다는 것다. 여기서 그들의 기대감 문제시 된다. 기대가 크면 클수록 돌아오는실망감은 비례한다.바로 컴퓨터로 할 수 있는 일 한정돼 버리는 시점에서 더 상의 진전 없게 되는 것다.

초보자 들 중 주위 사람들 보다 좀더 많은 내용을 알고 있다는 자만심을 갖고 있는 특히 그럴 확률 높다. 들은 일종의 유틸리티를 용해 남들 하지 못하는 기법을 익혀 를 자랑하면서 우월감에 사로 잡히게 된다. 하지만 그러한 우월감은 그리 오래 가지 않는다. 자신보다 더 뛰어난 전문가를 만나면 '도대체 내가 무엇을 하고 있는가?'하는 반문 생기기 때문다. 여기서 들은 '해의 벽'을 피부로 느끼며, 컴퓨터를 용한 새로운 도전을 받아들게 된다. 물론 시점에서 해의 벽을 뛰어넘지 못하는 들도 있을 것다.하지만 프로그신머의 길을 걸어가기를 원하는 는 자신에게 닥친 상황을 돌파하기 위한 해결책을 찾는다. 바로프로그램다. 필자는 들에게 렇게 말하고 싶다.

"프로그래밍라는 것은 단순히 코딩한다는 의미보다는 컴퓨터를 해한다는 의미로 받아들여야 한다."

프로그램은 컴퓨터가 해할 수 있는 기계어를 사람 좀더 쉽게 알아볼 수 있도록 만든것에 불과하다 를 다시 표현하자면, 기계와 언어소통하기 위해 프로그램을 배운다는 것다. 우리는 외국어를 공부하면서 문화적 질감으로 인해 단어의 의미를 파악하기 힘들때가 종종 있다. 는 그 나라의 풍습과 역사를 해하지 못하기 문다. 컴퓨터도 마찬가지 다. 컴퓨터를 해하지 못하면 프로그램 역시 서투른 번역 돼버린다. 다시 한번 논하지만, 프로그램을 배우는 과정을 컴퓨터를 해한다는의미로 받아들면 좀더 쉽게 중급자의 길로 도약할 수 있을 것다.

첫번째 벽인 해의 벽을 뛰어넘은 중급자는 그들만의 고유 영역을 갖게 된다. 바로 코딩다. 코딩은 그 방법만 알면 쉽게 처리할 수 있다. 방법은 경륜라 해도 과언 아니다. 도공은 자신 만든 도자기를 보며, 완벽하지 않은 것들을 일반인 해할 수 없을 정도로 부셔 버린다. 우리는 아무리 보아도 그것 들의 차점을 알아낼 수가 없다. 하지만 경륜 많은 도공은 도자기의 빛깔과 형태만 보아도 좋은 도자기인지 아니면 버려야할 도자기인지 알아낸다. 프로그램도 마찬가지다. 컴퓨터를 해하고 있는 프로그래머는 실행되고 있는 응용 프로그램만 보다도 어떻게 그것을 만들어 냈는지 알 수 있다 그리고 어떤 어려운 문제가 닥치더라도 해결점을 찾아낸다.

그렇다면 정도의 실력을 갖추기 위해서는 어떻게 해야할까? 아마도 많은 독자들 궁금해하는 문제일 것다. 정확한 해답 있을 수 없는 질문다. 영어에 왕도는 없다라는 표현을 빌어 프로그램에는 왕도가 없다라고 표현하는 것 정답일 것다. 하지만 왕도는 없지만 방법은 있다. 바로 자신 할 수 있다고 판단하는 것보다 항상 더 많은 일을 만들어 내라는 것다. 의미는 도전 정신 필요하다는 뜻다. 예를 들어 자신에게 주어진 일 10만큼의 크기라면 자신의 목표를 20정도로 세우는것다. 그러면 10만큼도 하기 벅차다고 느끼던 것 어느날 목표한 10을 루고 20으로 다가가고 있는 자신을 발견하게 될것다. 만약 목표한 10도 루지 못했다고 해서 실망하지는 말자. 돌켜 보면 프로젝트가 실패했다고 해서 잃는 것보다는 얻은 것 더 많다는 것을 알게 될것다. 필자는 중급자의 벽인'창조의 벽'을 해결하기 위해서는 무엇보다도 도전 정신 필요하다고 주장하고 싶다.

프로그래머들의 마지막 벽인 마음의 벽, 벽은 상당한 의미를 가진다. 전문가로 성장한 프로그래머들은 누구보다도 마음 굳게 닫혀 있는 경우가 많다. 자신만 완벽한 코드를 작성해 낸다는 마음자세가 들을 그렇게 만들어 버린다. 프로그래머의 고집은 가히 말로 표현할 수 없을 정도로 완강하다. 아니 고집 아닌 아집에 가깝다. 고집은 자신 스스로 잘못을 인정할 수 있는 수준지만, 아집은 그 잘못도 자신 아닌 다른 사람의 영향에 의해 발생한 것라 말하는 것다. 고집 없는 프로그래머는 프로그래머라 할 수는 없지만, 그 고집 아집 돼서는 안된다.

만약 자신 만들어낸 우수하다고 생각된다면 약간의 고집으로 자신의 의견을 관철시킬 수 있는 자세가 들에게 필요하다. 다른 팀원의 사고를 자신의 론으로 집중시키고, 그 론의 타당성을 타진해 보는 것 바람직하다. 때 고집아집으로 바뀌지 않은 시점에거 차협점을 찾아야 할 것다. 만약 자신의 채택되지 않더라도 실망하지는 말자. 다만 러한 것을 만들 수 있다는 확신만 버리지 않는다면 언젠가 자신의 옳다는 사실을 남들 인정해 줄것다.

지금까지 프로그래머가 걸어가면서 만나게 되는 세가지 벽에 대해서 살펴 보았다.물론 모든 러한 벽을 만난다는 것은 아니다. 하지만 필자가 지금까지 프로그래밍을 해오면서, 그리고 많은 사람들과 같 프로젝트를 진행해 오면서 경험한 일을 토대로 나름대로 정리해 본것다. 아직 필자도 세번째 벽인 마음의 벽을 완전히 뛰어 넘었다고 생각하지 않는다. 만약 벽을 뛰어넘는다면 또 다른 제4의 벽 다가올지도 모른다.

불교의 경전인 반야심경(般若心經)에 '색즉시공 공즉시색(色卽是空 空卽是色)라는 용어가 있다. 를 풀하면 '얻는다는 것은 공 잃음요, 잃어버리는 것 곧 얻음라'고 말할 수 있다. 필자가 깊은 말뜻을 해하고 있다는 것은 아니다. 그렇다고 종교적 가치관 뚜렷하다는 것은 더더욱 아니다. 하지만 프로그램을 자성해 오면서 반야심경 전하는 말뜻을 조금나마 해하게 됐다는 표현 적절할 것다.

인간의 욕심은 끝 없다는 표현기도 한 '어떻게(어떤게? - 문맥상 어느게 더 어울릴까요 - 오타수정하던 임인택) 프로그래머들 가져야 할 자세인가'라고 반문하는 독자들 있을 것다. 지금까지 프로그래머의 길을 연재해 오면서 필자는 프로그래머라면 욕심을 갖고 있어야 한다고 강조했고, 또한 도전정신에 의해 그 욕심을 실현하라고 표현했다. 그렇다면 역설적인 표현 아닌가!

만약 와 같 생각한 독자가 있다면 필자가 의도하는 내용을 정확하게 파악한 것 아니다. 버리라고 표현한 것은 자기 자신 가지고 있는 생각, 즉 프로그램에 대한 생각을 버리라는 것다. 우리 인간은 변화에 대한 불안함을 내포하고 있다 특히 나가 들수록 그 정도는 심화되고, 젊은 사람들의 사고를 해하기보다는 왜곡됐다고 평하게 된다. 는 그 사람의 가치관 고정돼 버렸기 때문에 자신의 사고와 일치하지 않는 다른 모든 행동을 잘못됐다고 생각한다.

프로그래머들 가장 쉽게 빠져드는 유혹 바로 런 점다. 자신 지금까지 프로그램을 해도던 방식야말로 정석며, 진리라고 생각한다. 컴퓨터는 하루가 다르게 변하고 있지만 아직까지도 구시대 유물 전부라고 생각한다. 필자는 단호하게 말하고 싶다.

"자신 작성한 코드를 버려라"

자신 지금까지 작성한 코드를 버린다는 것은 실로 엄청난 일다. 하지만 프로그래머라면 자신 만든 코드를 자기 자신의 관점 아닌 다른 관점에서 자신의 코드에 대해 비평할 수 있는 능력을 키워야한다. 러한 비평은 자신에 대한 코딩 가치관의 변화를 가져야한다느 것고, 변화의 물결에 동참할 수 있어야 한다는 뜻다.

그렇다면 어떤 시점에 코드를 버려햐 하는가? 필자는 크게 두 가지 시점에 대해 논하고자 한다. 첫번째 시점은 프로젝트를 진행하고 있는 과정에서 발생한다. 정확하게 표현하면, 새로운 기능의 가능성을 타진해 보는 프로토타입 프로그램을 완성한 시점 된다. 소프트웨어 공학에서 설계의 중요성을 강조하기 위해 객체지향라는 패러다임을 만들 만큼 코딩전의 설계 단계를 강조하고 있다 물론 잘 작성된 프로그램 설계는 프로토타입라는 중간 프로그램 생성 필요 없 설계 명세서에 의한 코딩만 하면 완벽한 응용 프로그램을 개발할 수 있다.

하지만 필자의 경험에 미뤄보면 러한 경우는 업무 자동화와 같은 특정한 형식 있는 응용 프로그램에 적용된다. 만약 프로젝트 설계자가 경험 없는 응용 프로그램을 만들어야 한다는 가정을 두면 상황은 반전된다. 즉 설계자의 미경험에 의한 시행착오가 발생하는 것다. 러한 시행착오를 줄는 방법 새로운 기술에 대한 프로토타입의 개발기는 하지만, 프로토타입으로 끝나야 한다. 하지만 우리의 실정은 아직까지도 프로토타입을 완성된 프로그램으로 생각하고 있는 경향 지배적인것 같다.

코드를 버러야 하는 두번째 시점은 완성된 프로그램의 버젼 업그레드에서 발생한다. 첫번째 경우보다 더 많은 용단을 필요로 하는 시점기도 하다. 응용 프로그램의 버전업은 미 만들어진 응용 프로그램에 사용자의 추가 요구사항을 수렴해서 개발한다는 의미와 전 버전에서 발생된 문제점을 해결한다는 의미를 동시에 가지고 있다. 간혹 사용자의 추가 요구사항 프로그래머가 상상할 수 없는 경우일 때도 있다. 그 모든 요구사항을 다 수렴해 프로그램을 만들수 는 없기 때문에 프로그래머는 타협점을 찾아 다음버전의 기능을 제한시키게 된다.

바로 사용자와 프로그래머 사에서 발생되는 타협점을 결정하는 시점에서 프로그래머의 마음 가짐 능동적인 자세인지 수동적인 자세인지 따라 코딩의 방향 결정된다. 능동적고 적극적인 프로그래머는 사용자의 요구사항을 검토해 참신한 아디어일 경우 를 적극 수렴한다. 하지만 수동적인 프로그래머는 현재 버전에서 지원될수 있는 사항만을 검토하는 성향 있다.

프로그래머들 시점에서 생각하는 것은 시간다. 주어진 시간에 어떻게 그 기능을 추가할 것인가를 걱정한다. 너무 많은 코드의 변화는 주어진 시간에 완성할 수 없다는 것다. 따라서 적당한 타협점을 찾는 것 프로그래머의 보편적인 경향다. 하지만 사용자의 요구사항을 수렴하는 방향으로 전환한다면, 프로그래머는 자신의 코드를 다시 한번 생각하게 될것다. 필자는 것을 바라는 것다. 지신의 코드를 다시한번 돌켜 보면 , 자신의 오류를 찾을수 있고, 또 사용자들 바라는 방향을 예측할 수 있게 된다. 바로 완벽에 가까운 코드를 작성하는 방법일 것다.

한정된 시간안에 미 작성된 코드를 버리는 것 낭비란 생각하지 말자. 코드를 버리고 다시 작성한다고 전 만큼 시간 소비되지는 않는다. 만약 프로그래머가 10일 동안 작성한 코드를 겸허한 마음으로 다시 작성한다면 2일에서 4일 안에 더 좋은 코드를 작성할 수 있을 것다. 물론 코드를 버리고 다시 작성하기 때문에 시간 더 필요한 것은 사실다. 하지만 시간에 종속된 코드가 아닌 시간을 지배하는 코드를 만든다는 신념으로 생활하자. 모든 프로젝트의 시간은 유동적일수 있다. 코딩은 사람 하는 창조적인 작업기 때문에 그 누구도 시간을 예측할 수는 없다. 다만 자기 자신 스스로 잘못된 부분을 찾아 수정해 잘 다듬은 코드를 보면 나름대로 누구도 느껴보지 못한 자신감 생길 것다.

자기가 작성한 코드에 대한 자신감, 바로 자신감 프로그래머의 자존심고 코딩하는 즐거움 아닐까!

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:31:25
Processing time 0.0428 sec