프로그래머들이 너무 많은 고민을 할 필요가 없다. 그대 앞에는 키보드가 놓여 있지 않은가? 

- 누군가의 말 - 


누가 했는지 기억이 안나지만 제가 가끔 인용하곤 하는 말입니다. 너무 기술 문서를 보다 보면 '내가 지금 뭐하고 있나' 라는 생각이 들 때가 있는데 그때마다 이 말을 기억하고 바로 뭔가를 만들어 볼려고 노력하게 됩니다. 

어쨌건 키보드를 잡으면 어지간하면 졸음이 달아나기 때문이지요 ㅎㅎ

 


    - 초간단 요약 -
    기존의 자바 서비스하고 있던 부분의 일부를 node.js 로 포팅해서 두개를 벤치마크 해 봄. 자바는 멀티코어 환경에서 테스트하고 node.js 는 cluster 를 안쓰고 단일 코어에서 (아무것도 안하면 단일코어에서 도니 ㅎㅎ) 동작시켜봄 결과는 아래와 같음 



    씨피유와 메모리는 적게 쓰지만 (훨씬 적게..) 성능은 그리 낫지 않음. 이거저거 바꿔가며 테스트를 하던중 ORM 을 지원하는 Sequelizer 가 느리다는 것을 알아냄, node-mysql 로 바꾸고 나니 바뀐 내용입니다.



단일 코어를 씀에도 불구하고 자바와 비슷하게 성능이 나오고 있습니다. 같은 하드웨어라 가정하면 node.js 에 클러스터 (cluster)를 적용한다고 한다면 자바의 거의 5배에 해당하는 효율을 보일 것으로 예상됩니다. 

   글쓴이가 올린 다음 글을 보면 , node.js 는 성능이 워낙 뛰어나고, 여러사람들이 참여하기 때문에 무섭게 성장하는 개발환경이 될것이기 때문에 주의깊게 보고 있기는 하나, 기업용으로 쓰기에는 아직 치명적인 약점이 있다고 합니다. 바로 node.js 자체의 개발 주기가 너무 짧기 때문에 오랜 기간을 개발해야 하는 기업용 환경에서는 좋지 않다는 것입니다. (개발 하는 중간에 메인 언어가 업데이트 된다고 생각해 보세요 ㅎㅎ) 그렇기 때문에 1.xx 대로 올라가서 안정화가 된다면 그 때부터 기업용으로 쓰기에 무리 없지 않을까 라고 본답니다. 물론 저자는 아주 만족한 거 같다고 하더군요. 

  저도 글쓴이의 의견에 어느정도 동의합니다. 다만 지금 버젼으로도 정말 기업용 커다란 사이트가 아닌, 간단한 기능을 제공하는 사이트를 제작하는 데에는 (특히나 App 서버로) 최고의 효율을 보이지 않을까 싶습니다. 

As programming environments grow in power, and languages become more abstract, the Lisp style of programming is gradually replacing the old plan-and-implement model. - Paul graham 



조금 의역을 하자면
(하드웨어 스펙들이 점점 좋아져서 언어별의 속도차이가 별로 티가 안나는) 프로그래밍 환경이 되어가면 갈 수록 , (프로그래밍) 언어들은 점점 더 추상적이 되어 가고 (조금 더 고수준의 언어가 되어 가고) 리습 스타일의 프로그래밍 방법들이 (Bottom-up 프로그래밍 스타일을 말하는 것 같습니다) 옛날 방식의 '계획을 세우고 구현을 하는' 모델을 점차적으로 대체할 것입니다. 

굳이 리습 스타일이라고 표현을 한 이유는 저 문구가 나온 책이 Ansi Common Lisp 이였기 때문이고요, 확실하게 예전의 워터폴 (Waterfall) 이라고 알려진 '요구사항 정의 - 분석 - 기획 - 설계 - 개발 - 테스트' 의 형식을 취하는 개발 방법론들은 점점 더 옛날 방식이 되어 가고 있습니다. 

게다가 하드웨어 스펙들이 점점 좋아지니, 자바나 노드제이에스(Node.js) 나 속도의 차를 일반 사용자는 잘 느끼지 못하는 단계에 이르다 보면 개발하기 빠른 언어로 프로젝트를 개발하는 것이 가장 좋겠지요. (빠른 하드웨어 시대에 가장 큰 병목은 개발자의 개발 속도 입니다) 

그런 의미에서 공감이 되는 글이라고 할 수 있습니다. (이 사람은 이걸 90년대 초반에 예견했네요 ㅎㅎ) 


 


이거 웹 디자인 하시는 분이라는데.. 왠만한 개발자 보다 수준이 훨씬 높으신 듯 ㅎㅎ 
저번에 살짝 언급했던 일을 처리중입니다. ( 요기에서 언급함 ) 뭐 우리가 무슨 힘이 있겠습니까? 해달라면 해줄 뿐이지 ㅎㅎ 

바꾸면서 나도 무슨 테이블인지, 무슨 컬럼인지 자세히 봐야지만 알 수가 있는 네이밍 컨벤션이더군요.. 투덜 투덜..

아 이제 그만 투덜되고!! 그렇다고 많지도 않지만 또 어찌보면 많은 부분을 다 찾아주기가 귀찮더군요. 그래서 어떻게 하면 편하게 바꿀 수 있을까를 고민했습니다. 

'훌륭한 해커는 게을러 지기 위해서 프로그래밍을 한다!!' 라는 멋진 사상과 부합되간다면 저도 훌륭하지는 않지만 해커의 길로 나선 것이라고 볼 수가 있습니다.  더구나 제가 쓰는 텍스트 에디터가 바로 이맥스 아닙니까? 바로 개발 들어갔습니다. 



바껴야 될 쿼리 부분을 리젼으로 지전하고 change-table 함수를 호출해 주면 변환은 끝입니다.

 

'하늘 아래 새로운 것은 거의 없다' 


제가 즐겨 하는 말입니다. 물론 제품의 완성 단계에서 똑같이 베껴서 제품을 내 놓는 경우는 모방이라기
 보다는 '복제'라고 볼 수 있습니다. 저는 '복제'를 말하는 것이 아니라 '모방'을 말합니다. 차이가 애매하다고 볼 수 있습니다. 

새로 시작하는 입장에서 무엇인가 만들어 가려면 막막할 수 밖에 없습니다. 저는 그 때 필요한 것이 모방이라고 봅니다. 

모방하며 개발을 진행하면, 그 결과로 개발 인프라가 쌓이고, 모방하여 개발한 제품을 운영하면 그 결과로 운영 인프라가 쌓입니다. 

자 이렇게 인프라를 따라 잡았다면 그 다음은? 

바로 혁신이 필요할 차례입니다. 이 혁신의 과정에서 선두 주자를 앞 지를 수도 있는 것입니다. 

모방과 혁신!! 

이 두가지를 항상 염두에 둬야 합니다. 

Node.js 와 Node.js 를 잘 활용하기 위한 웹 프레임워크까지 쭈욱 따라하기 식으로 하루만에 쫓아갈 수 있는 훌륭한 튜토리얼이 정리되어 있습니다. 비록 영어이긴 하지만 신기술은 번역되어 있는 것을 구하기 힘드니 여기서 쭈욱 따라가시면서 이해만 하시면 충분히 node.js 로 바로 웹 사이트 하나 만들 수 있는 실력을 구비하실 수 있을 것입니다. 

Node.js 설치하기 는 예전 제 포스트를 참조하시면 됩니다. 

기본 (The Basics) (1-2 시간 소요)


기본적인 문법과 Asynchronous 코딩에 대한 기본을 설명해주고 있는 훌륭한 책입니다. 정말 쭈욱 따라하시면 됩니다. 

더 깊게 들어가기 (Going Deeper) (1 시간 소요)

chapter7 Asynchronous 한 Control Block 에 관한 개요와 설명입니다. 꼭 읽어볼만한 부분입니다. 
추가로 chapter9 , chapter10 , chapter11 도 보시면 좋습니다. 

익스프레스 웹 프레임워크 (The Express Web Framework) (45 분 정도 소요)

아쉽게도 현재 동영상 서비스를 중단한 상태더군요. nodetuts.com 에서 서비스 되고 9, 10, 11  편입니다. 빨리 서비스 재개가 됐으면 좋겠습니다.

정말 간단하고 빨리 웹 개발을 할 수 있는 Express 프레임워크에 대한 설명입니다. 간단한 app server 만들기에 거의 최적화 되어 있다고 보면 됩니다. 비디오로 되어 있고 3편입니다. 

실제 예제 (A Real Example) (1 시간 소요)

express-mongodb 익스프레스와 몽고디비를 연결해서 구현하는 방법에 관한 실전 예제입니다. 

참조 사이트 : http://project70.com/nodejs/beginners-tutorial-node-js/ 


아이디어 기획의 시작은 종이와 연필로 부터 , 프로그래밍 시작은 키보드로 부터 



아이디어 자체보다 실행이 중요하며, 프로그램은 머리로 짜는 것이 맞지만, 손 부터 움직이지 않으면 일 시작하기가 애매합니다. 빠른 개발론 (Rapid Development)을 실현화 할려면 무엇보다 시간을 많이 잡아먹는 변수를 없애야 합니다. 그 변수중 첫째는 기획 문서 만드는 것과 둘째는 프로그램 개발의 시작입니다.

이 두가지 변수를 없애는 방법은 '빠르게 시작하는 것' 일단 종이와 연필을 가지고 아이디어를 구상하고 구상 단계가 끝나면 잽싸게 키보드를 부여잡고 개발을 시작하는 것입니다.

진행하면서 생각하기!! 빠른 개발론의 시작입니다. 

 

문혜군이 말했습니다. "참, 훌륭하도다. 기술이 어찌 이런 경지에 이를 수 있을까?"

요리사가 칼을 내려놓고 대답했습니다. "제가 귀히 여기는 것은 도입니다. 기술을 넘어선 것입니다. 제가 처음 소를 잡을 때는 눈에 보이는 것이 온통 소뿐이었습니다. 삼 년이 지나자 통째인 소가 보이지 않게 되었습니다. 지금은 신(神)으로 대할 뿐, 눈으로 보지 않습니다. 감각 기관은 쉬고, 신(神)이 원하는 대로 움직입니다. 하늘이 낸 결을 따라 큰 틈바귀에 칼을 밀어 넣고, 큰 구멍에 칼을 댑니다. 이렇게 정말 본래의 모습에 따를 뿐, 아직 인대나 건을 베어 본 일이 없습니다. 큰 뼈야 말할 나위도 없지 않겠습니까? 

훌륭한 요리사는 해마다 칼을 바꿉니다. 살을 가르기 때문입니다. 보통의 요리사는 달마다 칼을 바꿉니다. 뼈를 자르기 때문입니다. 저는 지금까지 19년 동안 이 칼로 소를 수천 마리나 잡았습니다. 그러나 이 칼날은 이제 막 숫돌에 갈려 나온 것 같습니다. 소의 뼈마디에는 틈이 있고 이 칼날에는 두께가 없습니다. 두께 없는 칼날이 틈이 있는 뼈마디로 들어가니 텅 빈 것처럼 넓어, 칼이 마음대로 놀 수 있는 여지가 생기는 것입니다. 그러기에 19년이 지났는데도 칼날이 이제 막 숫돌에서 갈려 나온 것 같은 것입니다."


'장자' 의 포정각우 (庖丁解牛) 부분에 나온 내용입니다. (리눅스에서 글을 쓰니 '포' 자가 깨지는 군요..) 
단지 소잡는 기술이지만 그를 행함에 있어서 '도'를 느낀다는 이야기에 백정이지만 일국을 다스리는 군주가 감탄을 한다는 내용입니다.  

여기에 나와 있는 내용을 보자니 문득 '도'를 수련하는 단계에 대한 생각이 떠 오릅니다.

불교 용어에서 건너와 무도 수행의 단계를 표현하는 말로 정착되었다. ‘수(守)’란 ‘가르침을 지킨다’라는 의미. 스승의 가르침을 받들어 정해진 원칙과 기본을 충실하게 몸에 익히는 단계를 말한다. ‘파(破)’는 원칙과 기본을 바탕으로 하면서도 그 틀을 깨고 자신의 개성과 능력에 의존하여 독창적인 세계를 창조해 가는 단계이다. 그렇지만 이 시기의 수련은 다분히 의식적이고 계획적이고 작위적인 수준에 행해지는 것이 특징이다. 다음 단계인 ‘리(離)’는 파의 연속선상에 있지만, 그 수행이 무의식적이면서도 자연스러운 단계로 질적 비약을 이룬 상태이다. 자신도 모르게 ‘파(破)’를 행하되, 모든 면에서 법을 잃지 않고, 규칙을 벗어나지 않는 경지에 이름을 뜻한다. 수련의 최후단계이다. 


개발기술 또한 단지 방법의 영역이지만 그것을 열심히 갈고 닦는 다면, 도의 경지를 못 느낄 수 없다는 것입니다. 소잡는 기술 이 '도'의 경지로 승화 될 수 있다 하지 않았습니까? 

개발 기술의  '수(守)' 란 닥치는 대로 기술을 익히는 단계와도 비슷하다고 하겠습니다. 이런 저런 기술을 마구 마구 공부하고 배우는 단계입니다. 

개발 기술의 '파(破)' 란 전 단계인 '수' 에서 익힌 기본 기술을 기반으로 해서 의식적으로 자유롭게 개발을 할 수 있는 상태며 

개발 기술의 '리(離)' 란 무의식적으로 어떠한 프로그램을 짜야 겠다고 생각하면 자연스럽게 개발을 할 수 있는 단계가 아닐까 추측하고 있습니다. 

일조 일석에 이러한 개발의 도를 느낄 수는 없을 것 같습니다. 저 또한 이러한 마음가짐으로 개발을 수련할려고 마음 먹고 공부하지만 아직도 '수'의 단계를 못 벗어 난게 아닐 까 생각이 듭니다. (하지만 거듭되는 깨달음으로 최근 '파'에 근접한 거 같다는 느낌을 받았습니다)

다만 이제 개발을 시작하시는 분들은 바로 '파' 단계로 진입을 할 수는 없다는 것입니다. 지루하고 괴로운 '수'의 과정을 거쳐야지만 파격을 시도할 수 있는 단계로 진입을 하는 것이지요. 추사 김정희의 추사체는 서도에 처음 뛰어드는 사람에게 절대 안 보여주는 이유도 같을 것입니다. 실제로 김정희는 자기 자식에게 보여줄 책은 인쇄한 것과 다름 없는 수준의 정자체로 글을 남겼습니다.

아무리 기술의 발전이 빠르고, 자신의 마음이 급해도 자기 수준에 걸맞는 기술을 익힐려면 지루하고 괴로울 지라도 반복, 반복해서 자신의 몸에 체득시키는 것이 중요하다는 것을 말씀드리고 싶습니다. 혹시 누가 알겠습니까? 개발의 최종단계에 이르러 '도'를 느끼고 개발을 끝내면 온 몸에 기운이 차 오르는 '양생(養生)'의 단계를 느끼게 될지..

 
"How to Design Programs" 라는 책에서 언급된 DESIGN RECIPE 라고 불리우는 프로그램 디자인을 하는데 필요한 몇가지 단계 


Contract 단계 

   area-of-ring : number number -> number 

   area-of-ring 이라는 프로그램은 number 2개를 인자로 받아서 number 를 리턴하는 프로그램이다. 라고 구상하는 단계 


Purpose 단계 

outer 라는 바깥쪽의 원의 반지름과 inner 라는 안쪽 원의 반지름을 가진 두원의 사이에 끼어져 있는 고리의 영역을 계산하기 위한 것이 목적이다. 


Example 단계 

   (area-of-ring 5 3) 이거나 area-of-ring (5, 3); 은 50.24 의 값이 나와야 한다. 


Definition 단계 

 

 (define (area-of-ring outer inner)
     (- (area-of-disk outer)
        (area-of-disk inner)))



이건 Scheme 으로 구현한 것이고 

 

  int area-of-ring (int outer , int inner) {
     int outer-area = area-of-disk(outer);
     int inner-area = area-of-disk(inner);

     return outer-area - inner-area ;
    }


이건 (C/C++, Java) 계열 이겠군요. 자신이 즐겨 쓰는 언어로 구현 하는 단계를 말합니다. 

   
Tests 단계

   (area-of-ring 5 3) 또는 area-of-ring (5 ,3);
   의 기대값 
   50.24 

크나 작으나 이러한 절차를 따라서 자기도 모르게 만들어가고 있는 것이라고 볼 수가 있습니다. 

+ Recent posts