2006년 12월 29일 금요일

어떻게 개발할까 [펌글]

-------------------------------------------------------------------
1. 어떤 언어를 사용하느냐 하는 것은 중요한 것이 아닙니다.
------------------------------------------------------------------
     문제 위주로 생각하는 버릇을 키워야 합니다.
     많은 프로그래머들이 자신이 당면한 문제를 정확하게 이해하는 경우가 매우 드뭅니다.
     일단 언어와 개발환경에 익숙해지면 다른 사고와 접근 방식을 요구하는  문제 해결에는 속수무책인 경우가 많습니다.
     이것도 일종의 문화이기  때문이겠죠.

     C/C++을 배우려고도 하지 않고, 시스템 프로그래밍을 하지 못하는   대다수의 프로그래머를 실력이 없거나,
     한계를 갖는 프로그래머로 매도하는 경향이 일부 있는데 이는 바람직하지 않다고 봅니다.

     2000년 문제를 해결해야 할 대다수의 프로그래머는 C/C++나    어셈블리어를 사용하는 사람보다는 코볼을 사용하는
     프로그래머입니다. 그들에 대한 수요가 절대적인 이유는 문제가 그것을 주로 사용하는 시스템에서  빚어지기 때문입니다.
     (메인프레임의 MIS/뱅킹/.... 관련 프로그램들은 거의   코볼로 작성되었다고 보면 됩니다)

     특정 환경에 맞는 특정 언어가 존재하며, 어떤 언어를 선택하느냐 하는 것은   프로그래머의 마음이나 능력이 아닙니다.
      실제로는 문제가 결정하며,   궁극적으로는 시장이 결정합니다.

     만약 비디오 대여점에 맞는 프로그램을 짠다고 가정합시다.   비주얼 베이직으로 하는 것이 Visual C++프로그래밍보다는
     훨씬 경제적이다는   것은 누구나 다 아는 일일 것입니다.

     저는 개인적으로 두 툴을 다 사용하고 Visual C++을 더 좋아하지만(이것은   완전히 개인적인 기호입니다),  유사시에는
     두개의 툴을 동시에 사용합니다.  그리고 C/S 환경에서 프로그래밍을 즐겨 짭니다.

     네트워크 프로그래밍을 할 경우, 서버 소프트웨어를 짜는 과정에서    분석된 도큐먼트 하에서 프로그래밍을 하더라도,
     클라이언트 운용환경 하에서    테스트를 해야 할 필요성을 느낍니다.

      NT환경하에서, 서버 소트프트웨어는 Unix의   데몬과   같은 Service형태로 돌아가고     네트워크 퍼포먼스와
      과부하를 견딜 수 있는 소프트웨어를 짜야만 한다고   가정합시다. 그러면 선택의 여지는 별로 없습니다. C++이죠.
      그러나, 아직 클라이언트 소프트웨어는 만들어지지도    않았기 때문에,     여러가지 내가 만든 소프트웨어의 잠재적
      위험성은 상당히 높다고 보아야   합니다.

     이 경우 아주 빨리 클라이언트 프로토타입을 만드는 도구를 선택한다면  비주얼 베이직이 될 것입니다.
     소켓 프로그래밍에서부터, 데이터베이스 프로그래밍에 이르기까지 아주 빨리     아주 편리하게 클라이언트의 프로토타
     입을 남몰래(도큐먼트에 없는    비공식 테스트용으로) 만들어 테스트를 해 나갈 수 있죠.

     이 경우 제거되는 소프트웨  어의 비효율성이나, 문제점은 상당하며  개발속도 및 디버깅 속도를 향상시켜 줍니다.
     저는 실제로 비주얼 베이직을 프로토타입 작성용으로 즐겨 사용하고 있습니다.   (때로는 실제 클라이언트 릴리지 버전
     제작용으로도 사용하죠)   사실 비주얼 베이직 그 자체로도 훌륭한 도구입니다.

     만약 비주얼 베이직이  문제가 된다면, 그 환경이 비주얼 베이직으로 해결되지 않거나, 반대급부가   너무 큰 경우이겠
     지요....     어떤 도구를 사용할 것인가에 너무 집착하면 문제를 잘못볼 수가 있습니다.

     어떤 도구도 완벽한 것은 없기 때문에 어떤 환경/문제에 어떤 도구가   적합한지를 판단할 수 있는 훈련을 하는 것이
     바람직합니다.

--------------------------------------------------------------------
2. 아키텍처를 이해하십시오.
---------------------------------------------------------------------

     종종 프로그래밍을 시작하는 사람들은 그 언어 사용법이나, 도구가 제공하는  환경(IDE같은)을 이해하는 데에 많은
     시간을 할애하는 것을 봅니다. 그러나,    이보다 더 큰 문제는 마치 이것을 전부인 것처럼 생각하는 것입니다.

     프로그래밍을 한다는 것이 반드시 무에서 유를 창조하는 것만은 아닙니다.    오히려 그런 경우는 아주 소수이지요.
     여러분이 아키텍처를 발표한다든지,   운영체제를 만든다든지 하는 일은 연구소나, 학계에서 일하지 않는 한 거의
     없을 것입니다.
     만약 여러분들이 협애한 생각으로 프로그래밍을 한다면, C/C++만 가지고 할 수   있는 일은 거의 없을 것입니다.
     널리 수행되는 데이터베이스 프로그래밍을 하는 것은 C/C++을 알면 도움이  되긴 하지만, 사실 그 자체와는 아무런
     관련이 없습니다.
     오히려 SQL과 데이터베이스 커넥션(네트워크)에 대해 알아야 할 것입니다.   때로는 Embeded SQL이나, ODBC에 대해
     알아야 할 것입니다.


     C/C++프로그래밍을 한 사람이 네트워크 프로그래밍을 하지 못한다면,  그 사람은 아마 네트워크 아키텍처에 대해
     잘 모르기 때문이지 실력이 없어서는  아닐 것입니다. (네트워크 분야라 할지라도, IPX/SPX 프로그램밍, RPC 프로
     그래밍, TCP/IP 소켓 프로그래밍 등등 여럿이 있으니까요...)

     때로는 표준이기도 하거나, 때로는 완성되지 않은 아키텍처이기도 하겠지만,   하나의 아키텍처를 얼마나 신속하고 빨리
     이해할 수 있느냐 하는 것이 매우  중요합니다.   사실 제가 경험한 신입사원들은 사용언어보다는    아키텍처를 이해하는
     데에 더 많은 시간과 노력을 투자해야 한다는 것을   뼈저리게 처험했습니다.

     개발경력이라고는 전혀 없는 신입사원들이 수행했던  프로젝트는 광파일 시스템이었는데 이해하여야 할 아키텍처가
     상당했거든요...(이미지 프로세싱, TCP/IP네트워크 프로그래밍, C/S, RDBMS     등등 선너머 산이었죠.)

     이렇게 닥달을 당하고 훈련되니까, 3개월만에 자연스럽게 잘 하더라구요.....    심지어, 그 중에 한 친구는 비주얼 베이
     갖구 win32프로그램을 하더라구요   (물론 약간 제한적이기는 하지만).

     그들은 지금도 서슴없이 이야기하죠. 뭐 언어는 중요한게 아니라구요.  아키텍처가 중요하다구요.
     농담삼아 야한 이야기를 할 때도 "허리아래 아키텍처"에 대해 논해보자구  할 정도의 노이로제 증상을 보이는 정도랍니다.

     C++을 배우기 위해서, Visual C++을 공부하는 사람에게 저는 종종   다음과 같은 이야기를 하지요...
     먼저 죽어두 MFC프로그램밍으로 시작하지 말라구요....
     MFC는 사실 아주 숙련된 C++프로그래머(OOP입장에서 볼때 능숙한 C프로그래머가 아니라)와 능숙한 Win32프로그래
     머를 위한 것이에요.     <<<이것은 마이크로소프트의 도큐먼트에도 나와있는 이야기입니다.>>>

     윈32 아키텍처를 이해하지 못하는 대부분의 초보 프로그래머, 더군더나 여기에  C++ 아키텍처도 잘 모르는 프로그래머가
     위저드의 도움으로 프로그래밍을   작성했을 경우 자신의 코드를 이해하는 데 걸리는 시간은 윈32 아키텍처와
     C++아키텍처를 이해하고 다시 MFC를 공부하고 프로그램을 짜는 데 걸리는   시간보다 더 길다는 것을 사람들은 이해
     하지 못합니다.

     전체로서의 구조화된 아키텍처를 이해하고 숙달되려고 노력하는 지난한 과정이   필요합니다. 윈도우 프로그래밍을 배
     우려 한다면,   한번쯤 (당장은 아니더라도 머릿속에 항상 기억하십시오)  Win32 아키텍처를 이해하도록 노력하여야 합
     니다.

     인터넷 프로그래밍을 하고싶다면(혹시 C/C++을 사용해서), RFC 도큐먼트를 조해야만 하는 경우가 생깁니다.
     WEB이 강력하고 저도 자유롭게 즐겨쓰는 프로토콜과 환경을 제공해주지만,  때로는 인터넷으로 메일을 보내고 소켓을
     바로 열어 다른 형태의 프로토콜로    대화를 해야할 필요도 있으니까요.

     이렇듯 여러분이 앞에 있는 것은 사용법이나,  도구와 관련된 문제가 아니라, 아키텍처의 이해와 적용에 관한 문제가
     아닐까    합니다.

     참고 : MFC프로그래밍은 단순히 User와 GDI서비스를 적절하게(?)   클래스 라이브러리화한 것에 지나지 않습니다.
      (스레드, ISAPI나 소켓 등   일부는 예외). 커널 서비스와 관련된 작업은 전적으로 당신의 몫입니다.

---------------------------------------------------------------------
3. 사용자 지향의 마인드를 가져야 합니다.
---------------------------------------------------------------------

     여러분이 만약 프로그래밍을 생계의 수단으로 삼고 그것을 유통경로를 통해 다른 누군가에게 판매하고자 한다면,
     시장을 석권하기 전까지는 자신이 짠 프로그램에 대해 자부심을 갖지 마십시오.
     그건 당신의 착각일 수 있습니다.


     아무리 화려한 기능과 성능으로 무장을 하였더라도 사용자가 원하는 사소한  기능이 빠졌다면, 그것은 바로 당신의 무
     능함을 말하는 것입니다.  그사이에 경쟁자는 더욱 구매자의 구매의욕을 자극할 제품을    내 놓을지도 모릅니다.

     저도 이 생각을 받아들이기까지 많은 시간이 걸렸습니다.
     처음에는 속으로 "뭐 이런 것들이 다 있나"하는 생각도 해보 았지요.
     사용자가 현명하기 때문에 사용자가 왕이 아니라, 그들이 바로  내가 짠 프로그램을 구매하기 때문에 왕이라는 사실을
     몸으로 체험하기까지는 시간이 결렸습니다.      더 싸게, 더 강력하게, 그렇지만 더 작고 더 편리하게 만들 수 없다는 것이
     판명나면, 그날로 당신은 시장에서 매장당하게 될 것입니다.

     특히 우리나라 시장에서 나타나는 코딩과 관련되서 나타나는 문제는 사용자  인터페이스입니다. 사용자 인터페이스는 그
     자체로 아주 방대하고 상당한  경험을 요구하는 분야입니다. 뿐만 아니라, 상당한 비용(소프트웨어 개발   비용보다도 더
     드는 경우가 많습니다)을 요구합니다.

     어느 정도 수준에 도달한 사용자 인터페이스를 갖춘 국산 프로그램을 보기란 아주 어렵죠....   여러분들은 윈도우의 커먼
     콘트롤들을 사용하는 이유를 잘 아실 겁니다.  이것들이 좁은 화면에서 사용자와 상호 정보를 주고받기 위한 상당히 계
     산된  도구들이라는 것을요... 그러나, 이것이 전부는 아닙니다.

     불필한 정보의 표시, 잘못된 버튼의 위치, 중목된 정보, 보기싫은 아이콘,  맞춤법은 흔히 나타나는 문제에 불과합니다.
     기본 정보와 고급 정보의 분리 및 배치, 시스템 장애시의 조치사항,     마우스 이동 경로의 계산(최소 이동 경로), 운영
     시간을 단축할 수 있는    최소 작업 경로의 배치, 다양한 사용자의 운영 습관에 대응하는 인터페이스,  사용자 운영 시스
     템에 대한 고려, 관리상의 편리를 도모할 수 있는 인터페이스  등등 실제 현장에서 나타나는 문제는 그야말로 산적해 있
     습니다.

     여러분들이 바로 오퍼레이터(때로는 고객)라는 생각을 가지고 프로그래밍을 하는 것이 중요합니다. 그것은 나중이 아
     니라, 지금부터입니다. 윈도우 프로그래밍의 보이지 않은 기본적인 과제는 사실 손쉬운   인터페이스의 구현에 있습니다.
     그러나, 비주얼 툴이 결코 자동적으로   좋은 사용자 인터페이스를 가져다 주지 않습니다.
     사실 이 부분은 교재나 샘플코드에 나와있지도 않으며, 누가 가르쳐주는 내용도    아니기 때문에 경험있는 사람들의 조
     언이나, 본인의 노력, 사용자들의 조언에   의존하는 바가 큽니다.

     자신의 결과에 대한 비판적인 자세가 필요하다고 봅니다.

---------------------------------------------------------------------
4. 팀 작업을 염두에 두어야 합니다.
--------------------------------------------------------------------

     공부하는 단계에서 뭐 이런 것까지 필요할까 생각하는 분들이 있을 겁니다.  사실 급한 것도, 당장 필요한것도 아니
     지요.....  그렇지만, 내가 만드는 소프트웨어가 나 혼자 개발하는 것이 아니라는 염두에   둔다면 과정과정에서 많은 도
     움을 얻을 수 있습니다.  여러분들에게 앞서 사용자 인터페이스를 염두에 두어야 한다는 말을 했습니다.

     이제는 프로그래머 사이에 존재하는 인터페이스를 이야기하고 싶군요.  개발과정이 복잡해지면 질수록 개발방법 또한
     복잡해집니다.  이에 따라, 개발자 사이에 의사소통도 복잡해지고 여가에서 발생하는 문제도   아주 커집니다.
     여러분들이 앞으로 OEM 소프트웨어나 상용 프로그램을 개발할 경우,  결코 단독으로 개발하는 일은 거의 없을 것입니다.

     사소하게는 디자이너와도 이야기해야 하며, 싫은 일이지만 관리 파트와도   이야기해야 할 때가 있습니다.
     모든 부분들은 공식적인 이야기이며, 여기에는 사소하더라도 도큐먼트가    따라가게 됩니다.

     하나의 프로젝트가 끝나면, 프로젝트 관련 문서는 산더미처럼 쌓이게 되죠.  전자형태이든, 종이의 형태이든, 대화의 형
     태이든 이런 작업은 계속적으로  처음부터 끝까지 이루어집니다. 피할 수 없는 지겨운 작업이죠.....
     여러분들이 공부할때부터 이런 습관을 들이는 것은 아주 좋은 일이죠......

     1) 주를 충분히 달아두는 연습(프로그래밍을 잘한다고 하는 사람일수록   이것을 잘 안하죠.) 현란한 기법에 빈곤한 주,
         아마 인수자에겐  지옥일 겁니다. 그리고, 시간이 오래되서 본인이 망각할 경우(특히 공부할   때는 더더욱 그렇죠),
         주가 없다면 시간이 많이 걸리겠죠..

     2) 인용이나, 참고에 대한 메모 : 종이가 만약 아깝지 않다면 이 부분은   반드시 메모하거나, 프린트 해두세요... 언제든
         반드시 다음에 참고가  되고, 인수인계나 공동작업시 좋은 반려자가 된답니다.

     3) 좋은 인터페이스 설계: 내부의 복잡한 임플리멘테이션을 숨기고 헤더만   공개할 경우 가능한 한 최소한의 충분한 내
         용을 담고 있어야 하며,   이것과 관련된 사용방법을 매뉴얼화하여야 합니다. 클래스 설계나,   라이브러리, 기타 작업에
         있어서 이것은 피할 수 없는 일입니다. 되는  기능과 안되는 기능에 대한 조언이 있다면 더욱 좋구요.

        네트워크 프로토콜의 경우도 마찬가지예요.   여러분이 델파이나, C++, 비주얼베이직 등으로 클래스를 만들었을 때
        한번 이작업을 해 보세요.  그러면 다른 사람만이 아니라, 여러분 자신에게도 많은 도움이 될 꺼예요.

     4) 좋은 팀 프로그래밍 관리 소프트웨어의 사용법을 알아두세요. 소스관리에도  좋구요. 나중에 여러사람이 같이 작업할
         때 아주 좋아요.

     기타 등등이 많겠지만 지금은 이정도가 생각나네요....

     참고) 소프트웨어 개발이 일차적으로 끝나고 나면 가장 골치아픈 일이 버전   관리예요. 소프트웨어를 버전별로 관리하는
          것이 굉장히 어렵죠. 때로는      동일버전 넘버가 플랫폼에 따라 여럿인 경우가 생기게 되죠.
          이런 습관이 안들어져 있으면 결과는 글쎄요.....
          먼 훗날의 일이 아니라, 바로 얼마뒤면 부딛힐 문제가 아닌가 합니다.
           (팀 프로그래밍을 잘하는 프로그래머, 아마 그사람은 인간성도 끝내줄 거예요. 저는 잘 못하는 거든요)

--------------------------------------------------------------------
4. 사소한 아이디어라도 놓치지 마십시오.
--------------------------------------------------------------------

     C++은 귀신같이 다루지만 아이디어가 없는 프로그래머, 서투르지만 비주얼  베이직을 다루고 아이디어가 풍부한 프로
      그래머. 당신은 누굴 선택하실건가요?

     누가 더 뛰어난 프로그래밍 실력을 갖고 있는가는 분명히 측정할 수 있습니다.이건 주어진 난이도의 과제를 해결하는
     시간이 말해줍니다. 어려운 과제를 완성도(성능, 기타)가 주어진 상태에서 빨리 풀어낼수록 좋은 프로그래머인 것은
     분명합니다.   그러나, 누가 더 가능성있고 능력있는 프로그래머인가는 측정하기가 곤란합니다.

     저는 여러가지 이유로, 후자를 택합니다.

     C/C++를 귀신같이 사용하는 사람만이 진정한 프로그래머는 아닙니다.  이런 사람들이 주로 종사하는 분야의 시스템 프
      로그래밍이 프로그래밍의 전부는 아닌것과 마찬가지입니다.

     MIS 프로그래밍을 하는 프로그래머들이 종종 도마의 대상이 되고는 하는데  만약 이들이 욕을 먹는다면, 그것은 그들이
     편리한 도구를 사용하기 때문이  아니라, 편리한 도구로도 할 수 있는 안하는 태도때문이어야 할 것입니다.
     (사실 그런 경향이 많이 보이기는 하지만, 문제를  거꾸로 보면 안될 것 같군요)

     원자폭탄을 만든 사람만이 대단한 것이 아니라, 반창고를 만든 사람도 저는  대단하다고 생각합니다. 무엇인가 더 복잡
     하고 더 정교한 것을 만들 수 있는 능력은 존경받아 마땅하지만, 사소한 것이라도 놓치지 않고 유심히 관찰할 수
     있는 능력도 저는 정말 대단한 것이라 생각합니다.

     사실 공부하는 여러분들이야말로 제가 보기엔 보물덩어리입니다.  프로젝트에 찌들고 프로그래밍에 권태를 느끼는 그런
     경력사원   (저는 정말 그런 사람 너무 많이 보았거든요)보다는 여러분이야말로  프로그래밍을 프로그래밍답게 할 수
     있는 사람이라고 생각해요...
     너무 MFC니, 윈도우니 하는 것들에 매몰되지 않도록 노력하시기 바랍니다.   교재에 나온 대로 일단 해보시고, 되면, 그
     리고 이해하면 그것을 훌훌  내던져 버리세요. 그리고 여러분의 상상력을 화면에 채우시기 바랍니다.

     지금 안된다고 잊어 버리지 말고 메모해 두고 다음에 아이디어를 더 구체화해서  실력이 되면 구현하도록 하는 자세가
     필요합니다. 때로는 아이디어를 구현하기  해당분야를 공부하는 것도 지름길이죠.

     아이디어야말로 프로그래머를 살찌우는 보약입니다!!!!!!!!!!!!!

--------------------------------------------------------------------
5. 자신이 가지고 있는 개발 능력이 곧 한계에 부닫힐 수 있다고 생각하여야 합니다.
-------------------------------------------------------------------

     항상 새로 시작한다는 생각을 가지십시오.
     세상은 급변하고 있습니다. 특히 프로그래밍 분야는 그야말로  지진, 해일, 홍수가 매일같이 프로그래머들을 덮쳐
     수도없이 재해지역을 만들어 내고 있습니다.   그러나, 아무도 여러분들을 대가없이 도와주지는 않습니다.

     3년전의 일로 기억되는군요.  인터넷이 대중화되고 웹에 기반한 인트라넷이라는   개념이 태동되었을 때 세상은 완전히
     끓는 냄비 속이었습니다.

     하나의 아키텍처가 나와 그것을 이해하고 사용하는데에 약 3년 정도이던  시절에 익숙했던 프로그래머들은 3개월단위로
     쏟아져 나오는 수십개의  아키텍처에 놀라움을 금치 못하고 드디어는 "나보고 어쩌란 말이냐?"라는     푸념을 서슴없이
     하던 때였습니다.


     지금도 그 후유증에 시달리는 사람이   많이 있습니다.
     코볼을 하는 사람들은 2000년 문제를 보면서 하는 말이 있습니다.
     이것이 코볼 프로그래머의 마지막 특수라고요..... 자조섞인 농담이겠지요.
     컴퓨터업계를 둘러 싼 세상은 지금도 요동을 치며 목숨을 건 싸움이  전개되고 있으며, 한치 앞을 내다볼 수 없는 상황입
     니다.    이때문에 내가 가지고 있는 기술과 능력이 하루아침에 무용지물이 되거나,  적어도 절름발이가 될 수 있습니다.

     이것은 필요하다면, 주저하지 않고 곧바로 새로운 아키텍처와 환경에 적응하려는
     자세를 요구합니다.

     그러나, 너무 겁을 낼 필요는 없습니다. 그 어느 기술도 하루 아침에  나온 것은 아니며, 또 아무 기반 기술 없이 나온 것은
     아니니까요.  각각의 기술은 다른 기술과 거미줄처럼 얽혀있는 경우가 허다하니까, 하나의 기술을 전체적인 시각에서
     조망하면서, 이해하고 닦아나가면   다른 기술을 이해하기는 전보다 훨씬 수월해질 것입니다.
     공부를 하는 시점에서는 가능한 한 기초가 되는 공부를 하는 것이 바람직하겠죠?
     누가 만약 MFC가 기초라고 이야기한다면 그것은 아마 거짓말일겁니다.   오히려 C++이나, OOP, 분산 객체 기술등을
     공부하는 것이 더 장래를 튼튼히  하는 비결이 될 겁니다.   그리고, 막상 취직이 되어서 공부를 하려 한다면,
     아마 최악의 상황을 머릿속에 그리시면 될 겁니다.

--------------------------------------------------------------------
6. "지금은 12시 10분전" ?
-------------------------------------------------------------------

     이런 이야기가 있습니다.
     지금 12시 10분전, 12시에 소프트웨어를 포장해서 납품(흔히 Shipping)해야 할 때
     당신이 할 수 있는 일은 무엇인가?
     물론 서둘러 디버그 코드를 릴리즈 코드로 바꾸어야겠지요.
     디버깅 정보를 날립니다. 릴리즈에 필요한 정보를 담습니다.  그리고 기타 등등....
     그런데 이때 문제가 발생한다면? 혹은 아직도 테스트가 끝나지 않은 코드가 있  다면? 쉬핑하자마자 문제가 있음을
     깨닫게 된다면? 또 다른 문제가 있다면?

     이 모두는 정말 생각만 해도 치명적인 것들이지만, 실제로 필드에서는 다반사로  일어나는 문제들입니다. 이 문제를 사
     전에 방지하는 것이 유능한 프로젝트  매니저이지만, 그 책임은 일부 프로그래머도 져야 합니다.
     시간과 싸울 줄 아는 프로그래머, 생산성을 고려할 수 있는 프로그래머가  유능한 프로그래머로 대접받는 것은 냉랭한
     자본주의 사회에서는 어쩔 수 없는 현실입니다. 시간과 싸운다는 것은 정말 피말리는 일이지요.

     여러분도 사실은 시간과의 싸움을 시작하고 있는 거지요.
     이 사실을 깨달은 사람은 인정받는 프로그래머가 될 소지가 있어요.
     여러분들은 여러분들에게 주어진 시간 안에, 혹은 여러분이 설정한 시간안에 주어진 목표를 달성하여야 합니다.
     그 결과는 여러분만의 몫이라는 것이 다를 뿐이죠.
     책을 읽는 것, 프로그래밍 연습을 하는 것, 자료를 구하는 것, 조언을 얻는 것 모든 것이 결과적으로 하나의 시간표위에
     자리잡게 될 것이기 때문입니다.
     프로그래밍 연습을 할 경우, 아예 계획을 잡아 놓고 하는 것도 바람직하겠죠...
     내실있는 학원에서 프로젝트별로 학원생을 육성하는 것은 좋은 현상이지요
     (뭐, 학원생이 한번의 프로젝트로 그것을 익히리라는 생각은 저도 안하지만요)
     아마 제가 학원 교육 커리큘럼을 진행한다면 정해진 시간안에 프로젝트를
     완성하지 못하면 졸업을 시키지 않게 할 지도 모릅니다.(너무 심했나?)

-------------------------------------------------------------------
7. 기타
-------------------------------------------------------------------
     다음은 몇가지 이야기들을 덧붙여서 이야기하겠습니다.
     1) 디버깅에 익숙해지도록 노력하십시오 : 디버깅 과정에 익숙해져 있지 않으면  프로그래밍이 점점 더 어려워집니다.
        에러는 프로그래머에게 많은 정보를    줍니다. 책에서는 흘렸던 내용이 에러로 잉태하여 세상에 나오면
        그냥나오지 않고 줄줄이 정보(때로는 필요 이상으로 너무    많은 정보)를 가져다 줍니다. 디버깅을 최소화하는 능력과
        디버깅을 안하거나,   무시하는 태도와는 구별을 해야겠지요. 물론 이과정은 인내심을 요구합니다.)
        초보자일수록 디버깅을 많이하게 되고, 또 많이 하여야 합니다.

     2) 만약 윈도우 프로그래밍을 한다면, Win32 아키텍처에 익숙해져야 합니다.    이것은 API를 많이 아는 것과는 다른 것
        입니다. 또 User나 GDI서비스가 전부   라고 생각해도 안됩니다. 실로 방대하고도 아주 강력한 커널 서비스들을
        적용해야 할 상황들을 아주 많습니다.
        굳이 MFC를 공부하야 하는 상황이라면, 그만큼의 시간을 네이티브한 Win32  프로그래밍에 할애하여야 합니다.
        만약 여러분들이 분산 객체환경에서 조그마한 콤포넌트를 개발한다고 할 경우,   그리고 작고 가벼운 콤포넌트를 만들
        어야 한다면, 아마도 MFC는 거의 도움을  주지 않으며 다른 기법(ATL을 이용한 방법)을 해야만 할 것입니다. 이때 여러
        분이 공부한 Win32 프로그래밍은 아마 강력한 무기가 될 것입니다.

     3) C++은 단순히 C에 몇가지를 덧붙인 언어가 아닙니다.
        만약 이렇게 이해하고 공부를 한다면 그것은 사실 C++ 프로그래밍이  아니라, 향상된(?) C프로그래밍이라고 보아야
        합니다.   제 경험으로 보건데, 분명히 C++컴파일러를 사용하는데, 코드는 C 스타일인 경우(약간만 C++스타일)를 많이
        보게 됩니다.     C++은 C와 비교할 때, OOP라는 패러다임의 변화를 요구한다고
        종종 이야기합니다.
        OOP스타일로 사고하고 OOP스타일로 프로그래밍한다는 것은  C프로그래머에게는 종종 견디기 힘든 고통이 되기도
        합니다.
        저도 예전에 C스타일로 짠 프로그램과, OOP스타일로 짠 프로그램을  동시에 비교해 보면 많은 생각을 하게 된답니다.
        물론 이제 저는 C++을 C++답게 사용하는 프로그래밍의 옹호자입니다.


어떻게 공부할까? 프로그래머를 위한「공부론」

어떻게 공부할까? 프로그래머를 위한「공부론」

우리 프로그래머들은 항상 공부해야 합니다. 우리는 지식을 중요하게 여깁니다. 하지만 지식에 대한 지식, 즉 내가 그 지식을 얻은 과정이나 방법 같은 것은 소홀히 여기기 쉽습니다. 따라서 지식의 축적과 공유는 있어도 방법론의 축적과 공유는 매우 드문 편입니다. 저는 평소에 이런 생각에서 학교 후배들을 위해 제 자신의 공부 경험을 짬짬이 글로 옮겨놓았고, 이번 기회에 그 글들을 취합, 정리하게 되었습니다. 그 결실이 바로 이 글입니다.

김창준 (마이크로소프트웨어) 2002/06/02


이 글은 공부하는 방법과 과정에 관한 글입니다. 이 글은 제가 공부한 성공/실패 경험을 기본 토대로 했고, 지난 몇 년간 주변에서 저보다 먼저 공부한 사람들의 경험을 관찰, 분석한 것에 제가 다시 직접 실험한 것과 그밖에 오랫동안 꾸준히 모아온 자료들을 더했습니다. '만약 다시 공부한다면' 저는 이렇게 공부할 것입니다.

부디 독자 제현께서 이 글을 씨앗으로 삼아 자신만의 나무를 키우고 거기서 열매를 얻고, 또 그 열매의 씨앗이 다시 누군가에게 전해질 수 있다면 더 이상 바랄 것이 없겠습니다.

이 글은 특정 주제들의 학습/교수법에 대한 문제점과 제가 경험한 좋은 공부법을 소개하는 식으로 구성됐습니다. 여기에 선택된 과목은 리팩토링, 알고리즘·자료구조, 디자인패턴, 익스트림 프로그래밍(Extreme Programming 혹은 XP) 네 가지입니다.

이 네 가지가 선택된 이유는 필자가 관심있게 공부했던 것이기 때문만은 아니고, 모든 프로그래머에게 어떻게든 널리 도움이 될만한 교양과목이라 생각하여 선택한 것입니다. 그런데 이 네 가지의 순서가 겉보기와는 달리 어떤 단계적 발전을 함의하는 것은 아닙니다. 수신(修身)이 끝나면 더 이상 수신은 하지 않고 제가(齊家)를 한다는 것이 어불성설인 것과 같습니다.

원래는 글 후미에 일반론으로서의 공부 패턴들을 쓰려고 했습니다. 하지만 지면의 제약도 있고, 독자 스스로 이 글에서 그런 패턴을 추출하는 것도 의미가 있을 것이기에 생략했습니다. 그런 일반론이 여기 저기 숨어있기 때문에 알고리즘 공부에 나온 방법 대부분이 리팩토링 공부에도 적용할 수 있고, 적용되어야 한다는 점을 꼭 기억해 주셨으면 합니다. 다음에 기회가 닿는다면 제가 평소 사용하는 (컴퓨터) 공부패턴들을 소개하겠습니다.

알고리즘·자료구조 학습에서의 문제
우리는 알고리즘 카탈로그를 배웁니다. 이미 그러한 해법이 존재하고, 그것이 최고이며, 따라서 그것을 달달 외우고 이해해야 합니다. 좀 똑똑한 친구들은 종종 "이야 이거 정말 기가 막힌 해법이군!"하고 감탄할지도 모릅니다. 대부분의 나머지 학생들은 그 해법을 이해하려고 머리를 쥐어짜고 한참을 씨름한 후에야 어렴풋이 왜 이 해법이 그 문제를 해결하는지 납득하게 됩니다.

그리고는 그 '증명'은 책 속에 덮어두고 까맣게 사라져버립니다. 앞으로는 그냥 '사용'하면 되는 것입니다. 더 많은 대다수의 학생은 이 과정이 무의미하다는 것을 알기 때문에 왜 이 해법이 이 문제를 문제없이 해결하는지의 증명은 간단히 건너뜁니다.

이런 학생들은 이미 주어진 알고리즘을 사용하는 일종의 객관식 혹은 문제 출제자가 존재하는 시험장 상황에서는 뛰어난 성적을 보일 것임은 자명합니다. 하지만 스스로가 문제와 해답을 모두 만들어내야 하는 상황이라면, 또는 해답이 존재하지 않을 가능성이 있는 상황이라면, 혹은 최적해를 구하는 것이 불가능에 가깝다면, 혹은 알고리즘을 완전히 새로 고안해내야 하거나 기존 알고리즘을 변형해야 하는 상황이라면 어떨까요?

교육은 물고기를 잡는 방법을 가르쳐야 합니다. 어떤 알고리즘을 배운다면 그 알고리즘을 고안해낸 사람이 어떤 사고 과정을 거쳐 그 해법에 도달했는지를 구경할 수 있어야 하고, 학생은 각자 스스로만의 해법을 차근차근 '구성'(construct)할 수 있어야 합니다(이를 교육철학에서 구성주의라고 합니다. 교육철학자 삐아제(Jean Piaget)의 제자이자, 마빈 민스키와 함께 MIT 미디어랩의 선구자인 세이머 페퍼트 박사가 주창했습니다). 전문가가 하는 것을 배우지 말고, 그들이 어떻게 전문가가 되었는지를 배우고 흉내 내야 합니다.

결국은 소크라테스적인 대화법입니다. 해답을 가르쳐 주지 않으면서도 초등학교 학생이 자신이 가진 지식만으로 스스로 퀵소트를 유도할 수 있도록 옆에서 도와줄 수 있습니까? 이것이 우리 스스로와 교사들에게 물어야 할 질문입니다.

왜 우리는 학교에서 '프로그래밍을 하는 과정'이나 '디자인 과정'(소프트웨어 공학에서 말하는 개발 프로세스가 아니라 몇 시간이나 몇 십 분 단위의, 개인적인 차원의 사고 과정 등을 일컫습니다)을 명시적으로 배운 적이 없을까요? 왜 해답에 이르는 과정을 가르쳐주는 사람이 없나요? 우리가 보는 것은 모조리 이미 훌륭히 완성된, 종적 상태의 결과물로서의 프로그램뿐입니다. 어느 날 문득 하늘에서 완성된 프로그램이 뚝 떨어지는 경우는 없는데 말입니다.

교수가 어떤 알고리즘 문제의 해답을 가르칠 때, "교수님, 교수님께서는 어떤 사고 과정을 거쳐, 그리고 어떤 디자인 과정과 프로그래밍 과정을 거쳐서 그 프로그램을 만드셨습니까?"하고 물어봅시다. 만약 여기에 어떤 체계적인 답변도 할 수 없는 분이라면 그 분은 자신의 사고에 대해 '사고'해 본 적이 없거나 문제 해결에 어떤 효율적 체계를 갖추지 못한 분이며, 따라서 아직 남을 가르칠 준비가 되어있지 않은 분일 것입니다. 만약 정말 그렇다면 우리는 어떻게 해야 할까요?

자료구조와 알고리즘 공부
제가 생각건대, 교육적인 목적에서는 자료구조나 알고리즘을 처음 공부할 때 우선은 특정 언어로 구현된 것을 보지 않는 것이 좋을 때가 많습니다. 대신 말로 된 설명이나 의사코드(pseudo-code) 등으로 그 개념까지만 이해하는 것이죠. 그 아이디어를 절차형(C, 어셈블리어)이나 함수형(LISP, Scheme, Haskell), 객체지향(자바, 스몰토크) 언어 등으로 직접 구현해 보는 겁니다. 그 다음에는 다른 사람이나 다른 책의 코드와 비교합니다. 이 경험을 애초에 박탈당한 사람은 귀중한 배움과 깨달음의 기회를 잃은 셈입니다.

만약 여러 사람이 함께 공부한다면 각자 동일한 아이디어를 같은 언어로 혹은 다른 언어로 어떻게 다르게 표현했는지를 서로 비교해 보면 배우는 것이 무척 많습니다.

우리가 자료구조나 알고리즘을 공부하는 이유는, 특정 '실세계의 문제'를 어떠한 '수학적 아이디어'로 매핑시켜 해결할 수 있는지, 그것이 효율적인지, 또 이를 컴퓨터에 어떻게 효율적으로 구현할 수 있는지 따지고, 그것을 실제로 구현하기 위해서입니다. 따라서 이 과정에 있어 실세계의 문제를 수학 문제로, 그리고 수학적 개념을 프로그래밍 언어로 효율적으로 표현해내는 것은 아주 중요한 능력이 됩니다.

알고리즘 공부에서 중요한 것
개별 알고리즘의 목록을 이해, 암기하며 익히는 것도 중요하지만 더 중요한 것은 다음 네 가지입니다.

①알고리즘을 스스로 생각해낼 수 있는 능력
②다른 알고리즘과 효율을 비교할 수 있는 능력
③알고리즘을 컴퓨터와 다른 사람이 이해할 수 있는 언어로 표현해낼 수 있는 능력
④이것의 정상작동(correctness) 여부를 검증해 내는 능력

첫 번째가 제대로 훈련되지 못한 사람은 알고리즘 목록의 스테레오 타입에만 길들여져 있어서 모든 문제를 자신이 아는 알고리즘 목록에 끼워 맞추려고 합니다. 디자인패턴을 잘못 공부한 사람과 비슷합니다. 이런 사람들은 마치 과거에 수학 정석만 수십 번 공부해 문제를 하나 던져주기만 하면, 생각해보지도 않고 자신이 풀었던 문제들의 패턴 중 가장 비슷한 것 하나를 기계적·무의식적으로 풀어제끼는 문제풀이기계와 비슷합니다. 그들에게 도중에 물어보십시오. "너 지금 무슨 문제 풀고 있는 거니?" 열심히 연습장에 뭔가 풀어나가고는 있지만 그들은 자신이 뭘 풀고 있는지도 제대로 인식하지 못 하는 경우가 많습니다.

머리가 푸는 게 아니고 손이 푸는 것이죠. 이렇게 되면 도구에 종속되는 '망치의 오류'에 빠지기 쉽습니다. 새로운 알고리즘을 고안해야 하는 상황에서도 기존 알고리즘에 계속 매달릴 뿐입니다. 알고리즘을 새로 고안해 내건 혹은 기존의 것을 조합하건 스스로 생각해 내는 훈련이 필요합니다.

두 번째가 제대로 훈련되지 못한 사람은 일일이 구현해 보고 실험해 봐야만 알고리즘 간의 효율을 비교할 수 있습니다. 특히 자신이 가진 카탈로그를 벗어난 알고리즘을 만나면 이 문제가 생깁니다. 이건 상당한 대가를 치르게 합니다.

세 번째가 제대로 훈련되지 못한 사람은, 문제를 보면 "아, 이건 이렇게 저렇게 해결하면 됩니다"하는 말은 곧잘 할 수 있지만 막상 컴퓨터 앞에 앉혀 놓으면 아무 것도 하지 못합니다. 심지어 자신이 생각해낸 그 구체적 알고리즘을 남에게 설명해 줄 수는 있지만, 그걸 '컴퓨터에게' 설명하는 데는 실패합니다. 뭔가 생각해낼 수 있다는 것과 그걸 컴퓨터가 이해할 수 있게 설명할 수 있다는 것은 다른 차원의 능력을 필요로 합니다.

네 번째가 제대로 훈련되지 못한 사람은, 알고리즘을 특정 언어로 구현해도, 그것이 옳다는 확신을 할 수 없습니다. 임시변통(ad hoc)의 아슬아슬한 코드가 되거나 이것저것 덧붙인 누더기 코드가 되기 쉽습니다. 이걸 피하려면 두 가지 훈련이 필요합니다.

하나는 수학적·논리학적 증명의 훈련이고, 다른 하나는 테스트 훈련입니다. 전자가 이론적이라면 후자는 실용적인 면이 강합니다. 양자는 상보적인 관계입니다. 특수한 경우들을 개별적으로 테스트해서는 검증해야 할 것이 너무 많고, 또 모든 경우에 대해 확신할 수 없습니다. 테스트가 버그의 부재를 보장할 수는 없습니다. 하지만 수학적 증명을 통하면 그것이 가능합니다. 또, 어떤 경우에는 수학적 증명을 굳이 할 필요 없이 단순히 테스트 케이스 몇 개만으로도 충분히 안정성이 보장되는 경우가 있습니다. 이럴 때는 그냥 테스트만으로 만족할 수 있습니다.

실질적이고 구체적인 문제를 함께 다루라
자료구조와 알고리즘 공부를 할 때에는 가능하면 실질적이고 구체적인 실세계의 문제를 함께 다루는 것이 큰 도움이 됩니다. 모든 학습에 있어 이는 똑같이 적용됩니다. 인류의 지성사를 봐도, 구상(concrete) 다음에 추상(abstract)이 옵니다. 인간 개체 하나의 성장을 봐도 그러합니다. 'be-동사 더하기 to-부정사'가 예정으로 해석될 수 있다는 룰만 외우는 것보다 다양한 예문을 실제 문맥 속에서 여러 번 보는 것이 훨씬 나을 것은 자명합니다. 알고리즘과 자료구조를 공부할 때 여러 친구들과 함께 연습문제(특히 우리가 경험하는 실세계의 대상들과 관련이 있는 것)를 풀어보기도 하고, ACM의 ICPC(International Collegiate Programming Contest: 세계 대학생 프로그래밍 경진 대회) 등의 프로그래밍 경진 대회 문제 중 해당 알고리즘·자료구조가 사용될 수 있는 문제를 같이 풀어보는 것도 아주 좋습니다. 이게 가능하려면 "이 알고리즘이 쓰이는 문제는 이거다"하고 가이드를 해줄 사람이 있으면 좋겠죠. 이것은 그 구체적 알고리즘·자료구조를 훈련하는 것이고, 이와 동시에 어떤 알고리즘을 써야할지 선택, 조합하는 것과 새로운 알고리즘을 만들어내는 훈련도 무척 중요합니다.

알고리즘 디자인 과정의 중요성
알고리즘을 좀더 수월하게, 또 잘 만들려면 알고리즘 디자인 과정에 대해 생각해 봐야 합니다. 그냥 밑도 끝도 없이 문제를 쳐다본다고 해서 알고리즘이 튀어나오진 않습니다. 체계적이고 효율적인 접근법을 사용해야 합니다. 대표적인 것으로 다익스트라(E. W. Dijkstra)와 워스(N. Wirth)의 '조금씩 개선하기'(Stepwise Refinement)가 있습니다. 워스의 「Program Development by Stepwise Refinement」(1971, CACM 14.4, http://www.acm.org/classics/dec95)를 꼭 읽어보길 바랍니다. 여기 소개된 조금씩 개선하기는 구조적 프로그래밍에서 핵심적 역할을 했습니다(구조적 프로그래밍을 'goto 문 제거' 정도로 생각하면 안 됩니다). 다익스트라의 「Stepwise Program Construction」(Selected Writings on Computing: A Personal Perspective, Springer-Verlag, 1982, http://www.cs.utexas.edu/users/EWD/ewd02xx/EWD227.PDF)도 추천합니다.

알고리즘 검증은 알고리즘 디자인과 함께 갑니다. 새로운 알고리즘을 고안할 때 검증해 가면서 디자인하기 때문입니다. 물론 가장 큰 역할은 고안이 끝났을 때의 검증입니다. 알고리즘 검증에는 루프 불변식(loop invariant) 같은 것이 아주 유용합니다. 아주 막강한 무기입니다. 익혀 두면 두고두고 가치를 발휘할 것입니다. 맨버(Udi Manber)의 알고리즘 서적(『Introduction to Algorithms: A Creative Approach』)이 알고리즘 검증과 디자인이 함께 진행해 가는 예로 자주 추천됩니다. 많은 계발을 얻을 것입니다. 고전으로는 다익스트라의 『A Discipline of Programming』과 그라이스(Gries)의 『The Science of Programming』이 있습니다. 특히 전자를 추천합니다. 프로그래밍에 대한 관을 뒤흔들어 놓을 것입니다.

알고리즘과 패러다임
알고리즘을 공부하면 큰 줄기들을 알아야 합니다. 개별 테크닉도 중요하지만 '패러다임'이라고 할만한 것들을 알아야 합니다. 이것에 대해서는 튜링상을 수상한 로버트 플로이드(Robert Floyd)의 튜링상 수상 강연(The Paradigms of Programming, 1978)을 추천합니다. 패러다임을 알아야 알고리즘을 상황에 맞게 마음대로 변통할 수 있습니다. 그리고 자신만의 분류법을 만들어야 합니다. 구체적인 문제들을 케이스 바이 케이스로 여럿 접하는 동안 그냥 지나쳐 버리면 개별자는 영원히 개별자로 남을 뿐입니다. 비슷한 문제들을 서로 묶어서 일반화해야 합니다.

이런 패러다임을 발견하려면 '다시 하기'가 아주 좋습니다. 다른 것들과 마찬가지로, 이 다시 하기는 알고리즘에서만이 아니고 모든 공부에 적용할 수 있습니다. 같은 것을 다시 해보는 것에서 우리는 얼마나 많은 것을 배울 수 있을까요. 대단히 많습니다. 왜 동일한 문제를 여러 번 풀고, 왜 같은 내용의 세미나에 또 다시 참석하고, 같은 프로그램을 거듭 작성할까요? 훨씬 더 많이 배울 수 있기 때문입니다. 화술 교육에서는 같은 주제에 대해 한 번 말해본 연사와 두 번 말해본 연사는 천지 차이가 있다고 말합니다. 같은 일에 대해 두 번의 기회가 주어지면 두 번째에는 첫 번째보다 잘 할 기회가 있습니다. 게다가 첫 번째 경험했던 것을 '터널을 벗어나서' 다소 객관적으로 볼 수 있게 됩니다. 왜 자신이 저번에 이걸 잘 못 했고, 저걸 잘 했는지 알게 되고, 어떻게 하면 그걸 더 잘할 수 있을는지 깨닫게 됩니다. 저는 똑같은 문제를 여러 번 풀더라도 매번 조금씩 다른 해답을 얻습니다. 그러면서 정말 엄청나게 많은 것을 배웁니다. '비슷한 문제'를 모두 풀 능력이 생깁니다.

제가 개인적으로 존경하는 전산학자 로버트 플로이드(Robert W. Floyd)는 1978년도 튜링상 강연에서 다음과 같은 말을 합니다.


제가 어려운 알고리즘을 디자인하는 경험을 생각해 볼 때, 제 능력을 넓히는 데 가장 도움이 되는 특정한 테크닉이 있습니다. 어려운 문제를 푼 후에, 저는 그것을 처음부터 완전히 새로 풉니다. 좀 전에 얻은 해법의 통찰(insight)만을 유지하면서 말이죠. 해법이 제가 희망하는 만큼 명료하고 직접적인 것이 될 때까지 반복합니다. 그런 다음, 비슷한 문제들을 공략할 어떤 일반적인 룰을 찾습니다. 아까 주어진 문제를 아예 처음부터 최고로 효율적인 방향에서 접근하도록 이끌어줬을 그런 룰을 찾는 거죠. 많은 경우에 그런 룰은 불변의 가치가 있습니다. … 포트란의 룰은 몇 시간 내에 배울 수 있습니다. 하지만 관련 패러다임은 훨씬 더 많은 시간이 걸립니다. 배우거나(learn) 배운 것을 잊거나(unlearn) 하는 데 모두.

수학자와 프로그래머를 포함한 모든 문제 해결자들의 고전이 된 죠지 폴리야(George Polya)의 『How to Solve it』에는 이런 말이 있습니다:

심지어는 꽤나 훌륭한 학생들도, 문제의 해법을 얻고 논증을 깨끗하게 적은 다음에는 책을 덮어버리고 뭔가 다른 것을 찾는다. 그렇게 하는 동안 그들은 그 노력의 중요하고도 교육적인 측면을 잃어버리게 된다. … 훌륭한 선생은 어떠한 문제이건 간에 완전히 바닥이 드러나는 경우는 없다는 관점을 스스로 이해하고 또 학생들에게 명심시켜야 한다.

저는 ACM의 ICPC 문제 중에 어떤 문제를 이제까지 열 번도 넘게 풀었습니다. 대부분 짝 프로그래밍이나 세미나를 통해 프로그래밍 시연을 했던 것인데, 제 세미나에 여러 번 참석한 분이 농담조로 웃으며 물었습니다. "신기해요. 창준 씨는 그 문제를 풀 때마다 다른 프로그램을 짜는 것 같아요. 설마 준비를 안 해 와서 그냥 내키는 대로 하는 건 아니죠?" 저는 카오스 시스템과 비슷하게 초기치 민감도가 프로그래밍에도 작용하는 것 같다고 대답했습니다. 저 스스로 다른 해법을 시도하고 싶은 마음이 있으면 출발이 조금 다르고, 또 거기서 나오는 진행 방향도 다르게 됩니다. 그런데 중요한 것은 이렇게 같은 문제를 매번 다르게 풀면서 배우는 것이 엄청나게 많다는 점입니다. 저는 매번, 전보다 개선할 것을 찾아내게 되고, 또 새로운 것을 배웁니다. 마치 마르지 않는 샘물처럼 계속 생각할 거리를 준다는 점이 참 놀랍습니다.

알고리즘 개론 교재로는 CLR(Introduction to Algorithms, Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest)을 추천합니다. 이와 함께 혹은 이 책을 읽기 전에 존 벤틀리(Jon Bentley)의 『Programming Pearls』도 강력 추천합니다. 세계적인 짱짱한 프로그래머와 전산학자들이 함께 꼽은 위대한 책 목록에서 몇 손가락 안에 드는 책입니다. 아직 이 책을 본 적이 없는 사람은 축하합니다. 아마 몇 주간은 감동 속에 하루하루를 보내게 될 겁니다.

리팩토링 학습에서의 문제
먼저, 본지 2001년 11월호에 제가 썼던 마틴 파울러의 책을 추천하는 글을 인용하겠습니다.

OOP를 하건 안 하건 프로그래밍이란 업을 하는 사람이라면 이 책은 자신의 공력을 서너 단계 레벨업시켜줄 수 있다. 자질구레한 술기를 익히는 것이 아니고 기감과 내공을 증강하는 것이다.

혹자는 DP 이전에 RF를 봐야 한다고도 한다. 이 말이 어느 정도 일리가 있는 것이, 효과적인 학습은 문제의식이 선행해야 하기 때문이다. DP는 거시적 차원에서 해결안을 모아놓은 것이다. RF를 보고 나쁜 냄새(Bad Smell)를 맡을 수 있는 후각을 발달시켜야 한다. RF의 목록을 모두 외우는 것은 큰 의미가 없다. 그것보다 냄새나는 코드를 느낄 수 있는 감수성을 키우는 것이 더 중요하다. 필자는 일주일에 한 가지씩 나쁜 냄새를 정해놓고 그 기간 동안에는 자신이 접하는 모든 코드에서 그 냄새만이라도 확실히 맡도록 집중하는 방법을 권한다. 일명 일취집중후각법. 패턴 개념을 만든 건축가 크리스토퍼 알렉산더나 GoF의 랄프 존슨은 좋은 디자인이란 나쁜 것이 없는 상태라고 한다. 무색 무미 무취의 무위(無爲)적 자연(自然) 코드가 되는 그 날을 위해 오늘도 우리는 리팩토링이라는 유위(有爲)를 익힌다.

주변에서 리팩토링을 잘못 공부하는 경우를 종종 접합니다. 어떤 의미에서 잘못 공부한다고 할까요? '실체화'가 문제입니다. 리팩토링은 도구이고 방편일 뿐인데, 그것에 매달리는 것은 달은 보지 않고 손을 보는 것과 같습니다. 저는 리팩토링 책이 또 하나의 (이미 그 병폐가 많이 드러난) GoF 책이 되는 현상이 매우 걱정됩니다.

리팩토링 공부
사람들이 일반적으로 생각하는 바와는 달리 리팩토링 학습에 있어 어떤 리팩토링이 있는지, 구체적으로 무엇인지 등의 리팩토링 목록에 대한 지식과 각각에 대한 메카닉스(Mechanics: 해당 리팩토링을 해나가는 구체적 단계)는 오히려 덜 중요할 수 있습니다. 더 기본적이고 유용한 것은 코드 냄새(Code Smell)와 짧은 테스트-코드 싸이클입니다. 이것만 제대로 되면 리팩토링 책의 모든 리팩토링을 스스로 구성해낼 수 있으며, 다른 종류의 리팩토링까지 직접 발견해낼 수 있습니다.

그 책에서는 테스트의 중요성이 충분히 강조되지 않았습니다. 하지만 테스트 코드 없는 리팩토링은 안전벨트 없는 자동차 경주와 같습니다. 그리고 테스트 코드가 리팩토링의 방향을 결정하기도 합니다. 양자는 음과 양처럼 서로 엮여 있습니다. 이런 의미에서 리팩토링은 TDD(Test Driven Development)와 함께 수련하는 것이 좋습니다. 훨씬 더 빨리, 훨씬 더 많은 것을 배울 수 있을 겁니다.

리팩토링을 공부할 때는 우선 코드 냄새의 종류를 알고, 왜 그것이 나쁜 냄새가 될 수 있는지 이해하고(그게 불가하다면 리팩토링 공부를 미뤄야 합니다) 거기에 동의할 수 있어야 합니다. 그런 다음, 대충 어떤 종류의 리팩토링이 가능한지 죽 훑어봅니다. 그 중 몇 개는 메카닉스를 따라가면서 실험해 봅니다. 이제는 책을 덮습니다. 그리고 실제 코드를 접하고, 만약 거기에서 냄새를 맡는다면 이 냄새를 없애기 위해 어떻게 해야 할지 스스로 고민합니다. 리팩토링 책의 목록은 일단 무시하십시오. 그 냄새를 없애는 것이 목표이지, 어떤 리팩토링을 여기에 '써먹는 것'이 목표가 되어선 안 됩니다. 이 때, 반드시 테스트 코드가 있어야 합니다. 그래야 '좋은' 리팩토링을 할 수 있습니다. 책을 떠나 있으면서도 책에서 떠나지 않는 방법입니다.

리팩토링을 하기 전에 초록색 불(테스트가 모두 통과)이 들어온 시점에서 코드를 일부 고치면 빨간 불(테스트가 하나라도 실패)로 바뀔 겁니다. 이게 다시 초록색 불이 될 때까지 최소한도의 시간이 걸리도록 하십시오. 현 초록색에서 다음 초록색까지 최소한의 시간을 소비하도록 하면서 코드와 테스팅을 오가게 되면 자기도 모르는 사이에 훌륭한 리팩토링이 자발공으로 터져 나옵니다. 여기서 목적지는 우선은 OAOO(Once And Only Once: 모든 것은 오로지 한 번만 말해야 한다)를 지키는 쪽으로 합니다. 그러면 OAOO와 짧은 테스트-코드 싸이클을 지키는 사이 어느새 탁월한 디자인이 튀어나옵니다. 참고로 저는 '모래시계 프로그래밍'이란 걸 가끔 합니다. 모래시계나 알람 프로그램으로 테스트-코드 사이클의 시간을 재는 것입니다. 그래서 가급적이면 한 사이클이 3분 이내(대부분의 모래시계는 단위가 3분입니다)에 끝나도록 노력합니다. 여기서 성공을 하건 실패를 하건 많은 걸 얻습니다.

리팩토링 수련법
제가 고안, 사용한 몇 가지 리팩토링 수련법을 알려드립니다.

①일취집중후각법: 앞에 소개한 본지 2001년 11월호에서 인용된 글 참조
②주석 최소화: 주석을 최소화하되 코드의 가독성이 떨어지지 않도록(혹은 오히려 올라가도록) 노력합니다. 이렇게 하면 자동으로 리팩토링이 이뤄지는 경우가 많습니다.
③OAOO 따르기: OAOO 법칙을 가능하면 최대한, 엄격하게 따르려고 합니다. 역시 자동으로 좋은 리팩토링이 이뤄집니다. 여기서 디자인패턴이 창발하기도 합니다. GoF 책을 한번도 보지 못한 사람이 디자인패턴을 자유자재로 부리는 경우를 보게 됩니다.
④디미터 법칙(Law of Demeter) 따르기: 디미터 법칙을 가능하면 지키려고 합니다. 어떤 리팩토링이 저절로 이뤄지거나 혹은 필요 없어지는가요?
⑤짝(Pair) 리팩토링: 함께 리팩토링합니다. 혼자 하는 것보다 더 빨리, 더 많은 걸 배우게 됩니다. 특히, 각자 작성했던 코드를 함께 리팩토링하고, 제3자의 코드를 함께 리팩토링해 봅니다. 사람이 많다면 다른 짝이 리팩토링한 것과 서로 비교하고 토론합니다.
⑥'무엇'과 '어떻게'를 분리: 어떻게에서 무엇을 분리해 내도록 합니다. 어떤 리팩토링이 창발합니까?

여기서 번, 짝 리팩토링은 아주 효과적인 방법입니다. 저는 이것을 협동적 학습(Collaborative Learning)이라고 부릅니다. 상대가 나보다 더 많이 아는 경우만이 아니고, 서로 아는 것이 비슷해도 많은 양의 학습이 발생합니다. 특히, 전문가와 함께 짝 프로그래밍을 하면 무서울 만큼 빠른 학습을 경험할 수 있습니다. 저와 짝 프로그래밍을 한 사람이 학습하는 속도에서 경이감을 느낀 적이 한두 번이 아닙니다. 문화는 사회적으로 학습되는 것입니다. 우리가 지식이라고 하는 것의 상당 부분은 문화처럼 암묵적인 지식(Tacit Knowledge)입니다. 전문가가 문제가 생겼을 때 어떻게 사고하고, 어떤 과정을 거쳐 접근하며, 어떻게 디버깅하고, 키보드를 어떤 식으로 누르는지, 사고 도구로 무엇을 사용하는지, 일 계획과 관리를 어떻게 하는지, 동료와 어떻게 대화하는지 등은 성문화되어 있지 않습니다. 그러나 이런 것들은 아주 중요합니다. 프로페셔널의 하루 일과의 대부분을 이루고 있기 때문입니다. 이런 것들은 전문가 바로 옆에서 조금씩 일을 도와주면서 배워야 합니다. 도제 살이(Apprenticeship)입니다. 진정한 전문가는 모든 동작이 우아합니다. 마치 춤을 추는 것 같습니다. 이 모습을 바로 곁에서 지켜보게 되면, 주니어는 한마디로 엄청난 충격을 받습니다. 그리고 스펀지처럼 빨아들이게 됩니다. 도대체 이 경험을 책이나 공장화한 학교가 어떻게 대신하겠습니까. 이와 관련해서는 레이브와 웽거(Jean Lave, Etienne Wenger)의 『Situated Learning : Legitimate Peripheral Participation』을 강력 추천합니다. 이 글을 보는 모든 교육 종사자들이 꼭 읽어봤으면 합니다. 이 협동적 학습은 두 사람만이 아니고 그룹 단위로도 가능합니다. 스터디에 이용하면 재미와 유익함 일석이조를 얻습니다.

이 외에, 특히(어쩌면 가장) 중요한 것은 일취집중후각법 등을 이용해 자신의 코드 후각의 민감도를 높이는 것입니다. 코드 후각의 메타포 말고도 유사한 메타포가 몇 가지 더 있습니다. 켄트 벡은 코드의 소리를 들으라고 하고, 저는 코드를 향해 대화하라고 합니다. 코드의 소리를 듣는 것은 코드가 원하는 것에 귀를 기울이는 것을 말합니다. 코드는 단순해지려는 욕망이 있습니다. 그걸 이뤄주는 것이 프로그래머입니다. 그리고 짝 프로그래밍을 할 때 두 사람의 대화를 코드에 남기도록 합니다. 주석이 아닙니다. 왜 이것이 중요한가는 본지 2001년 12월호 「허실문답 XP 강화」를 참고하기 바랍니다.

기학으로 우리 사상사에 큰 획을 그은 철학자요, '서울서 책만 사다 망한 사람'으로 이름을 날릴 정도로 엄청난 지식욕을 과시하던 조선시대 사상가 혜강 최한기는 그의 저술 『신기통』(神氣通)에서 '눈에 통하는 법(目通), 귀에 통하는 법(耳通), 코에 통하는 법(鼻通)' 등을 이야기하고 있습니다. 어떻게 하면 우리는 코드에 도통할 수 있을까요? 리팩토링을 공부하거나 혹은 했던 사람들에게 많은 영감과 메타포를 주는 책으로 일독을 권합니다. 필자가 기회가 닿는다면 프로그래밍을 혜강의 사상적 측면에서 조망한 글을 써보고 싶습니다.

앞서의 것들이 어느 정도 이뤄지고, 리팩토링에 대한 감이 오게 되면 그 때 비로소 리팩토링 책을 하나 하나 파헤치고 또 거기서 제대로 된 비판을 할 수 있게 됩니다.

디자인패턴 학습에서의 문제
잡지에 연재되거나 서적으로 출간된 혹은 세미나에서 진행되었던 디자인패턴 '강의'를 몇 가지 접했습니다. 훌륭한 강의도 많았지만 그렇지 못한 것도 있었습니다. 몇 가지 문제점을 지적하겠습니다.

◆패턴을 지나치게 실체화, 정형화해 설명한다.
◆컨텍스트와 문제 상황에 대한 설명이 없거나 부족하다. 결과적으로 문제를 해결하기 위해 패턴이 도입된 것이 아니라 패턴을 써먹기 위해 패턴이 도입된 느낌을 준다.
◆문제의식을 먼저 형성하게 하지 않고 답을 먼저 보여준 뒤 그걸 어디에 써먹을지 가르친다. 왜 이걸 쓰는 게 좋은지는 일언반구 언급이 없다. 독자는 '어린아이가 망치를 들고 있는 오류'에 빠질 것이다.
◆패턴이 어떻게 생성되었는지 그 과정을 보여주지 못한다. 즉, 스스로 패턴을 만들어내는 데 도움이 전혀 되지 않는다.
◆해당 패턴이 현실적으로 가장 자주 쓰이는 맥락을 보여주지 못한다. 대부분 장난감 문제(Toy Problem)에서 끝난다.

그런 패턴 강의를 하는 분들이 알렉산더(Christopher Alexander, 패턴언어 창시자)의 저작을 충실히 읽어봤다면 이런 병폐는 없을 것이라 생각합니다. 알렉산더의 저작을 접해보지 못 하고서 패턴을 가르치는 사람은 성경을 읽어보지 않은 전도사와 같을 것입니다. 알렉산더가 『The Timeless Way of Building』의 마지막에서 무슨 말을 하는가요?

이 마지막 단계에는 더 이상 패턴은 중요하지 않다. … 패턴은 당신이 현실적인 것에 대해 수용적이 되는 것을 가르쳐줬다.

패턴 역시 도구요, 방편일 뿐입니다. 패턴은 현실적인 것에 대해 수용적이 되도록 가르친다는 말은 결국 우리가 궁극적으로 추구하는 것은 패턴이 아니라 현실이어야 한다는 이야기입니다. 물론 처음 단계에는 교육적인 목적에서, 어느 정도 패턴에 얽매여도 괜찮다고는 해도, 나중에 패턴을 잊고 패턴에서 자유로워지려면 처음부터 패턴에 대해 도구적·방편적인 인식을 가져야 합니다.

미국 캘리포니아 주립대학의 교수 베티 에드워즈(Betty Edwards)가 쓴 책 중에 『Drawing on the Right Side of the Brain』이라는 유명한 베스트셀러가 있습니다. 사람의 뇌와 그림 그리기의 관계에 대한 탁월한 책입니다. 에드워즈는 자신의 그리기 실력을 향상시키기 위해 우뇌를 적극적으로 사용하는 구체적인 방법들을 가르쳐줍니다. 그 중 대표적인 것 하나가 대상을 뒤집어 놓고 그리는 것입니다. 지금 실험해 보길 바랍니다. 1000원권 지폐를 바로 놓고 그걸 비슷하게 그려보고, 이번에는 그걸 위아래가 거꾸로 되게 놓고 따라 그려보십시오. 아마 무척 놀랐을 겁니다. "아니 내가 이렇게 그림을 잘 그리다니! 그것도 거꾸로!" 그렇습니다. 우리는 자신의 머리 속 패턴에 얽매여 세상을 제대로 보지 못 할 때가 많습니다. 실체가 코에 약간이라도 비슷하게 보이면 우리는 그것을 이미 우리 머리 속에 추상적으로 갖고 있던 기하학적 '코'의 패턴으로 대체해버리는 것입니다.

디자인 패턴 공부
우선은 제 교육철학과 언어교습론, 그리고 공부론 이야기를 잠깐 하겠습니다.

기본적으로 교육은 교육자가 피교육자가에게 지식을 그대로 전달하는 행위가 아닙니다. 진정한 교육은 피교육자의 개인적 체험에 기반한 전폭적 동의에서 출발합니다. 저는 이를 동의에 의한 교육이라고 합니다.

제가 "주석문을 가능하면 쓰지 않는 것이 더 좋다"는 이야기를 했을 때 이 문장을 하나의 사실로 받아들이고 기억하면 당장 그 시점에는 학습이 일어나지 않는다고 봅니다. 대신 여러분이 차후에 여러 가지 경험을 하면서도 이 화두를 놓치지 않고 있다가 어느 순간엔가, "아! 그래, 주석문을 쓰지 않는 게 좋겠구나!"하고 자각하는 순간, 바로 그 시점에 학습과 교육이 이뤄지는 것입니다. 이는 기본적으로 삐아제와 비갓스키(Lev Vygotsky)의 구성주의를 따르는 것이죠. 지식이란 외부에서 입력받는 것이 아니고, 그것에 대한 모델을 학습자 스스로가 내부에서 구축할 때 획득할 수 있는 것이라는 사상이죠.

권법에서 주먹에 대해 달통한 도사가 '권을 내지르는 법'에 대한 규칙들을 정리해서 애제자의 머리 속에 아무리 쑤셔 넣는 데 성공한들 그 제자가 도사만큼 주먹이 나갈리는 만무합니다. 권을 내지르는 법을 유추해 내기까지 그 스승이 겪은 과정을 제자는 완전히 쏙 빼먹고 있기 때문입니다. 소위 '몸'이 만들어지지 않은 것이지요. 제자는 마당 쓸기부터, 물 긷기 등의 수련 과정을 겪어야만 하고 스승이 정리한 그 일련의 규칙에 손뼉을 치고 춤을 추며 기쁨의 동의를 할 수 있을 정도로 수련 과정이 축적된 이후에야 비로소 진정한 '가르침'이 이뤄지는 것이며, 청출어람의 가능성도 생각해 볼 수 있는 것입니다.

이런 동의라는 것은 학습자 자신만의 컨텍스트와 문제의식을 바탕으로 한 것입니다. 우리는 많은 경우, 어떤 지식과 동시에 그 지식의 필요성까지도 지식화해서 외부에서 주입을 받습니다. 하지만 진정 체화된 지식을 위해서는 스스로가 이미 문제의식을 갖고 있어야 합니다.

패턴도 마찬가지인데, 대부분 그 패턴의 필요성을 체감하지 못한 채 그냥 도식적 구조를 외우기에만 주력하는 사람이 많습니다만, 사실 그렇게 되면 어떤 경우에 이 패턴이 필요하고 어떤 경우에는 사용하면 안 되는지(GoF는 패턴을 정말 안다는 것은 그 패턴을 쓰면 안 될 때를 아는 것이라 했습니다) 등을 알기 힘듭니다. 설령 책에 나온 가이드를 암기했더라도요. 자신의 삶 속에서 문제의식이 구체적으로 실제 경험으로 형성되지 않았기 때문입니다.

GoF 중 한 명인 랄프 존슨(Ralph Johnson)은 다음과 같이 말합니다.

우리[GoF]는 책에서, 정말 그 패턴들이 필요하다는 것을 알만큼 충분한 경험을 갖기 전에는 그것을 [시스템 속에] 집어넣는 것을 피해야 한다고 말할 만큼 대담하진 못했다. 하지만 우리 모두는 그 사실을 믿었다. 패턴은 프로그램의 초기 버전이 아니고 프로그램 생애의 훨씬 나중에 가서야 비로소 등장해야 한다고 나는 늘 생각해 왔다.

결국은 어떤 패턴의 필요성을 자신의 경험 속에서 절감하지 못한다면 그 패턴을 제대로 아는 것이 아니라고 말할 수 있을 겁니다. 따라서 패턴 하나를 공부할 때는 가능한 한 실제 예를 많이 접해야 합니다. 그리고 패턴을 적용하지 않은 경우에서 그 필요를 느끼고 설명할 수 있게끔 다양한 코드를 접해야 합니다.

소프트웨어 개발에 푹 빠지기
패턴 중에 보면 서로 비슷비슷한 것이 상당히 많습니다. 그 구조로는 완전히 동일한 것도 있죠. 초보자를 괴롭히는 것 중 하나입니다. 이것은 외국어를 공부할 때 문법 중심적인 학습을 하면서 부딪치는 문제와 비슷합니다. '주어+동사+목적어'라는 구조로는 동일한 두 개의 문장, 즉 'I love you'와 'I hate you'가 구조적으로는 동일할지라도 의미론적으로는 완전히 반대가 될 수 있는 겁니다. 패턴을 공부할 때는 그 구조보다 의미와 의도를 우선해야 하며, 이는 다양한 실례를 케이스 바이 케이스로 접하면서 추론화 및 자신만의 모델화라는 작업을 통해 하는 것이 최선입니다. 스스로 문법을 발견하고 체득하는 것이라고 할까요.

DP는 사전과 같습니다. 이 책은 순서대로 소설 읽듯이 읽어나가라고 집필된 것이 아니고, 일종의 패턴 레퍼런스로 쓰인 것입니다. 역시 GoF의 한 명인 존 블리스사이즈(John Vlissides)는 다음과 같이 말합니다.

여기서 내가 강조하고 싶은 것은 디자인패턴, 즉 GoF 책을 어떻게 읽느냐는 것이다. 많은 사람들은 그 내용을 온전히 이해하기 위해서는 순서대로 읽어야 한다고 느낀다. 하지만 GoF는 소설이 아니라 레퍼런스 북이다. 독일어를 배우기 위해 독영 사전의 처음부터 끝까지 하나하나 읽으려고 하는 경우를 생각해 보라. 그렇게는 결코 배울 수 없을 것이다! 독일어를 마스터하기 위해서는 독일어 문화에 자기 자신을 푹 담궈야(immerse) 한다. 독일어로 살아야 하는 것이다. 디자인패턴도 똑같다. 그걸 마스터하기 이전에 소프트웨어 개발에 자신을 푹 담궈야 한다. 패턴으로 살아야 하는 것이다.
만약 꼭 그래야 한다면 소설 읽듯이 디자인패턴 책을 읽어라. 하지만 거의 아무도 그 방식으로 유창해지지 못한다. 소프트웨어 개발 프로젝트의 열기 속에서 패턴이 동작하게 하라. 실제 디자인 문제를 직면했을 때 그 패턴들의 통찰을 이용하라. 이것이 GoF 패턴들을 자신의 것으로 만드는 가장 효율적인 방법이다.

어떤 지식을 체화하기 위해선 그 지식으로 살아야 한다는 말을 확인할 수 있습니다. 영어를 배우려면 영어로 살고, DP를 배우려면 DP로 살라는 단순하면서도 아주 강력한 말입니다.

어떤 특정 문장 구조를 학습하는 데 최선은 그 문장 구조를 이용한 실제 문장을 나에게 의미 있는 실제 컨텍스트 속에서 많이 접하고 스스로 나름의 모델을 구축하여 교과서의 법칙에 '기쁨에 찬 동의'를 하는 것입니다.

주변에서 특정 패턴이 구현된 코드를 구하기가 힘들다면 이 패턴을 자신이 만지고 있는 코드에 적용해 보려고 노력해 볼 수 있습니다. 이렇게 해보고 저렇게도 해보고, 그러다가 오히려 복잡도만 증가하면 "아 이 경우에는 이 패턴을 쓰면 안 되겠구나"하는 걸 학습할 수도 있죠. GoF는 패턴을 배울 때는 한결 같이 "이 패턴이 적합한 상황과 동시에 이 패턴이 악용, 오용될 수 있는 상황"을 함께 공부하라고 합니다.

이런 식의 '사례 중심'의 공부를 위해서는 스터디 그룹을 조직하는 것이 좋습니다. 혼자 공부를 하건, 그룹으로 하건 커리프스키(Joshua Kerievsky)의 「A Learning Guide To Design Patterns」(http://www.industriallogic.com/papers/learning.html)를 참고하세요. 그리고 스터디 그룹을 효과적으로 꾸려 나가는 데는 스터디 그룹의 패턴 언어를 서술한 「Knowledge Hydrant」(http://www.industriallogic.com/papers/khdraft.pdf)를 참고하면 많은 도움이 될 겁니다. 이 문서는 뭐든지 간에 그룹 스터디를 한다면 적용할 수 있습니다.

LG2DP(「A Learning Guide To Design Patterns」) 뒷부분에 보면 DP를 공부하는 순서와 각 패턴에서 던질만한 질문이 같이 정리되어 있습니다. DP는 순차적으로 공부해야만 하는 것은 아닙니다. 효과적인 공부의 순서가 있습니다. sorry라는 단어를 모르면서 remorseful이라는 단어를 공부하는 학생을 연상해 보세요. 외국어 공부에서는 자기 몸에 가까운 쉬운 단어부터 공략하는 것이 필수적입니다. 이런 걸 근접 학습(Proximal Learning)이라고도 하죠. 등급별 어휘 목록 같은 게 있으면 좋죠. LG2DP에서 제안하는 순서가 그런 것 중 하나입니다.

랄프 존슨은 이런 순서의 중요성에 관해 다음과 같은 말을 했습니다.

… 하지만 나는 언제나 싱글톤 패턴을 가르치기 전에 콤포짓, 스트래터지, 템플릿 메쏘드, 팩토리 메쏘드 패턴을 가르친다. 이것이 훨씬 더 일반적인 것들이며, 대다수의 사람들은 아마도 이것들 중 마지막 두 가지를 이미 사용하고 있을 것이다.

마이크로패턴
그런데 사실 GoF의 DP에 나온 패턴들보다 더 핵심적인 어휘군이 있습니다. 마이크로패턴이라고도 불리는 것들입니다. DP에도 조금 언급되어 있긴 합니다. 이런 마이크로패턴은 우리가 알게 모르게 매일 사용하는 것들이고 그 활용도가 아주 높습니다. 실제로 써보면 알겠지만, DP의 패턴 하나 쓰는 일이 그리 흔한 게 아닙니다. 마이크로패턴은 켄트 벡의 『Smalltalk Best Practice Patterns』에 잘 나와 있습니다. 영어로 치자면 관사나 조동사 같은 것들입니다.

그리고 이런 마이크로패턴과 함께 리팩토링을 공부하는 게 좋습니다. 리팩토링은 패턴의 필요를 느끼게 해줍니다. 제가 리팩토링 공부에서도 언급했지만 OAOO를 지키면서 리팩토링을 하다보면 자연스레 디자인패턴에 도달하는 경우가 많습니다. 이 때는 지나친 엔지니어링(Overengineering)이 발생하지 않고, 오로지 필요한 만큼만 생깁니다. 이에 관해서는 커리프스키의 「Stop Over-Engineering!」(Software Development Magazine, Apr 2002, http://www.sdmagazine.com/documents/s=7032/sdm0204b/0204b.htm)의 일독을 권합니다. 리팩토링이 디자인패턴을 어떻게 생성해낼 수 있는지 보여주고 있습니다.

1980년대 이후 최근 알렉산더의 향방도 이런 쪽으로 가고 있습니다. 그는 자신이 발표한 기존 패턴들이 너무 크다고 생각해 그런 패턴들을 구성하고, 자동으로 만들어 내며, 또 관통하는 더 작은 원칙들을 발견하는 데 노력해 오고 있습니다. 코플리엔(James Coplien)은 컴퓨터계가 알렉산더의 최근 발전을 쫓아가지 못한다고 늘 이야기합니다.

제대로 된 패턴 구현을 위한 다양한 접근 시도하기
우리의 지식이라는 것은 한 가지 표현양상(representation)으로만 이뤄져 있지 않습니다. 사과라는 대상을 음식으로도, 그림의 대상으로도 이해할 수 있어야 합니다. 실제 패턴이 적용된 '다양한 경우'를 접하도록 하라는 것이 이런 겁니다. 동일 대상에 대한 다양한 접근을 시도하라는 것이죠. 자바로 구현된 코드도 보고, C++로 된 것도 보고, 스몰토크로 된 것도 봐야 합니다. 설령 '오로지 자바족'이라고 할지라도요(전 이런 사람들을 자바리안(Javarian)이라고 부릅니다. 자바와 바바리안(barbarian)을 합성해서 만든 조어지요). 이런 '오로지 하나만 공부하는 것'의 병폐에 대해서는 존 블리스사이즈가 쓴 「Diversify」(http://www.research.ibm.com/people/v/vlis/pubs/gurus-99.pdf)라는 글을 읽어보세요. 이렇게 다양화를 해야 비로소 자바로도 '상황에 맞는' 제대로 된 패턴을 구현할 수 있습니다. 패턴은 그 구현(implementation)보다 의도(intent)가 더 중요하다는 사실을 꼭 잊지 말고, 설명을 위한 방편으로 채용된 한 가지 도식에 자신의 사고를 구속하는 우를 범하지 않기를 빕니다.

이런 맥락에서 저는 DP를 공부할 때 GoF와 동시에 『Design Patterns Smalltalk Companion』을 필수적으로 읽기를 권합니다. 두 권은 말하자면 양날개입니다. 하나는 정적언어로 구현되었고(간간이 스몰토크 구현이 있긴 합니다), 다른 하나는 동적언어로 구현되어 있습니다. 언어와 패턴의 고리를 느슨하게 하고, 패턴을 여러 관점에서 신선하게 볼 수 있는 계기가 될 것입니다. 또, 한 쪽을 보고 이해가 잘 되지 않을 때 다른 쪽을 보면 쉽게 이해됩니다. 서로 상보적인 것이죠.

패턴도 결국 '문제해결'을 위한 한 가지 방편에 지나지 않습니다. 주변에서 "이 경우에는 무조건 이 패턴을 써야 합니다"하고 생떼를 쓰는 사람을 보면 씁쓸한 기분을 감출 수 없습니다.

디자인패턴 추천서
디자인패턴 책 중에 중요한 서적을 몇 권 소개하겠습니다.

◆『Design Patterns Explained』(Shalloway, Trott): 최근 DP 입문서로 급부상하고 있는 명저
◆『Design Patterns Java Workbook』(Steven John Metsker): DPE 다음으로 볼만한 책으로 쏟아져 나오는 시중의 조악한 자바 패턴 책들과는 엄연히 다르다. 워크북 형식을 채용해서 연습문제를 풀고 뒷부분의 답과 대조해 볼 수 있는 등 독학자가 공부하기에 좋다.
◆『Refactoring』(Martin Fowler): DP 공부 이전에 봐서 문제의식 형성하기(망치를 들면 모든 것이 못으로 보이는 오류 탈피)
◆『Design Patterns』: 바이블.
◆『Design Patterns Smalltalk Companion』: GoF가 오른쪽 날개라면 DPSC는 왼쪽 날개
◆『Pattern Hatching』(John Vlissides): DP 심화학습. 얇지만 밀도 높은 책.
◆『Smalltalk Best Practice Patterns』(Kent Beck): 마이크로 패턴. 개발자의 탈무드. 감동의 연속.
◆『Pattern Languages of Program Design』 1,2,3,4: 패턴 컨퍼런스 논문 모음집으로 대부분은 인터넷에서 구할 수 있음
◆『Pattern-Oriented Software Architecture』 1,2: 아키텍처 패턴 모음. 2권은 네트워크 애플리케이션의 아키텍처 모음.
◆『Concurrent Programming in Java』(Doug Lea): 컨커런트 프로그래밍에 대한 최고의 서적.
◆『Patterns of Software』(Richard Gabriel): 패턴에 관한 중요한 에세이 모음.
◆『Analysis Patterns』(Martin Fowler): 비즈니스 분석 패턴 목록. 비즈니스 애플리케이션 개발자에게 많은 도움이 됨.
◆『A Timeless Way of Building』(Christopher Alexander): 프로그래머들이 가장 많이 본 건축 서적. 패턴의 철학적·이론적 배경. '구약'('신약'은 올해 안에 출간 예정인 동저자의 『The Nature of Order』).
◆『A Pattern Language』(Christopher Alexander): 알렉산더의 건축 패턴 모음집.
◆『Problem Frames』(Michael Jackson): DP의 해결(solution) 지향식의 문제점과 극복 방안으로서의 문제 지향식 방법. 마이클 잭슨은 요구 사항 분석 쪽에서 동명의 가수만큼이나 유명.

DP를 처음 공부한다면, DPE와 DPJW를 RF와 함께 보면서 앞서의 두 권을 RF적으로 독해해 나가기를 권합니다(하버드 대학의 뚜웨이밍 교수는 요즘 칸트를 유교적으로 독해하고 있다고 합니다. 하나의 책을 다른 각도에서 독해하는 것, 여기서 배우는 것이 많습니다). 이게 된 후에는 GoF와 DPSC를 함께 볼 수 있습니다. 양자는 상호 보완적인 면이 강합니다. 이쯤 되어 SBPP를 보면 상당히 충격을 받을 수 있습니다. 스스로가 생각하기에 코딩 경험이 많다면 다른 DP 책 이전에 SBPP를 먼저 봐도 좋습니다.

이 정도의 책을 봤다면 POSA와 PLOPD 등에서 자신이 관심이 가는 패턴들을 찾아 읽는 것이 좋습니다. 그리고 동시에 알렉산더의 원저들을 꼭 읽기를 권합니다. 가브리엘의 책이 알렉산더의 사상 이해에 많은 도움이 될 것입니다.

패턴 공부를 해나가면서 남을 가르치는 것이 공부에 많은 도움이 됩니다(사실 자바 패턴 책 중에 어떤 것은 "내가 패턴을 처음 공부하면서 같이 쓴 것이다"라고 저자가 고백한 것도 있습니다). 보이스카웃에서는 보통 다음 과정을 통해 뭔가를 '학습'하게 한다고 합니다. 처음은 어떻게 하는지를 보여주고, 다음은 스스로 그것을 해보게 하고, 다음으로 그걸 남에게 가르치게 합니다. 이 때 중요한 것은 상대가 이해하지 못 하면 그 이유를 자기 자신에게서 찾는 것이 나에게 더 이득이 된다는 것입니다. "내가 설명을 잘못 했군"하고 생각하는 것이죠. 그러면 다음번에는 설명을 좀더 잘 할 수 있게 되고, 동시에 자기의 이해도 더욱 명료해지게 됩니다. 저는 'OOP 개념을 한 시간 만에 가르치기'나 '특정 언어 문법을 한 시간 만에 가르치기' 등을 하나의 도전으로 생각하고 즐깁니다. 가르치면서 동시에 배운다는 것은 정말 놀라운 경험입니다.

익스트림 프로그래밍 학습에서의 문제
앞의 경우와 비슷합니다. 익스트림 프로그래밍을 공부하는 사람들은 실제로 행해보지 않고 책만 들여다보면 안 됩니다. 그렇다고 책이 중요하지 않다는 말은 아닙니다. 하지만 자전거 타기는 자기 몸으로 직접 굴려봐야 합니다.

게다가 켄트 벡 스스로가 『XP Explained』를 만약 다시 쓴다면 뜯어고치고 싶은 부분이 상당히 된다고 말하는 것을 봐도 알 수 있듯이 초기 XP 이후 바뀌고 보완된 점이 상당수 있습니다. 따라서 책만으로 XP를 공부하기는 힘듭니다. 지금은 책 속의 XP가 사람들의 머리 속 XP에 한참 뒤쳐져 있습니다.

어찌 되었든 XP에는 무술이나 춤, 혹은 악기 연주 등과 유사한 면이 많습니다. 따라서 글을 보고 그것을 익히기는 쉽지 않습니다. 그나마 메일링 리스트 같은 '대화'를 보면 훨씬 더 많은 것을 얻을 수 있기는 하지만, 태권도 정권 찌르기를 말로 설명하는 것이 불가능에 가깝듯이 XP를 언어를 통해 익히기는 정말 어렵습니다. 우리의 언어는 너무도 성글은 미디어입니다(XP는 매 초, 매 순간 벌어지는 '일상적' 장면의 연속이 매우 중요합니다).

익스트림 프로그래밍 공부
XP를 이해하려면 다음 기본 자료에 대한 이해가 우선해야 합니다(본지 2001년 12월호 「허실문답 XP 강화」 참조).

◆『XP Explained』(Kent Beck): XP 선언서
◆『XP Installed』(Ron Jeffries et al): C3 프로젝트에 적용한 예, 얻은 교훈 등
◆『Planning XP』(Kent Beck, Martin Fowler): 계획 부분 설명(관리자, 코치용)
◆『Refactoring』(Martin Fowler): 리팩토링에 대한 최고의 책
◆『XP Applied』: 유즈넷과 메일링 리스트의 논의 등 최근 자료를 반영
◆『XP Explored』: 가장 쉽고 구체적인 XP 안내서


이 중에서 XPI나 XPX를 먼저 권합니다. XPE는 좀 추상적인 서술이 많아서 봐도 느낌이 별로 없을 수 있습니다(2001년 본지 11월호에 제가 쓴 리뷰 참고). 여유가 되면 다음 자료를 더 참고합니다.

◆『The Timeless Way of Building』: 패턴 운동을 일으킨 알렉산더의 저작. 현장 고객(On-site Customer), 점진 성장(Piecemeal Growth), 소통(Communication) 등의 아이디어가 여기에서 왔음.
◆『XP in Practice』(Robert C. Martin 외): 두세 사람이 짧은 기간 동안 간단한 프로젝트를 XP로 진행한 것을 기록. 자바 사용(중요한 문헌은 아님).
◆『XP Examined』: XP 컨퍼런스에 발표된 논문 모음
◆『Peopleware』(Tom DeMarco): 개발에 있어 인간 중심적 시각의 고전
◆『Adaptive Software Development』(Jim Highsmith): 복잡계 이론을 개발에 적용. 졸트상 수상.
◆『Surviving Object-Oriented Projects』(Alistair Cockburn): 얇고 포괄적인 OO 프로젝트 가이드라인
◆『Software Project Survival Guide』(Steve McConnell): 조금 더 전통적인 SE 시각.
◆『The Psychology of Computer Programming』(Gerald M. Weinberg): 프로그래밍에 심리학을 적용한 고전. 코드 공유와 짝 프로그래밍에 필수인 비자아적 프로그래밍(Egoless Programming)이 여기서 나왔다.
◆『Agile Software Development』(Alistair Cockburn): 전반적 애자일 방법론에 대한 개론서
◆『Software Craftsmanship』(Pete McBreen): 장인으로서의 새로운 프로그래머 상
◆『Agile Software Development with SCRUM』(Schwaber Ken): 최근 확장성(Scalability)을 위해 XP+SCRUM의 시도가 애자일 쪽의 큰 화두임.
◆『A Practical Guide to eXtreme Programming』(David Astels 외): 저자들이 직접 참여한 프로젝트를 따라가 보면서 배움. 자바로 구현. XPP보다는 스케일이 큼.
◆『Agile Modeling』(Scott Ambler): 애자일 쪽에서 모델링이 무시되는 느낌이 있을 수 있는데, 그쪽으로 깊게 천착한 사람이 앰블러임.
◆『Agile Software Development Ecosystems』(Jim Highsmith): 각각의 애자일 방법론에 대한 소개와 동시에 각 방법론의 대표자들 인터뷰가 백미.
◆『Test Driven Development』(Kent Beck): 곧(아마 올해 내에) 출간 예정인 최초의 TDD 서적. TDD를 모르면 XP도 모르는 것(TDD를 실제 적용하려면 적어도 반년 정도는 계속 훈련해야 함)
◆IEEE Software/Computer, CACM, Software Development Magazine 등에 실린 기사
◆『XP Conference, XP Universe 등의 논문들(특히 최근 것들)
◆유즈넷, 메일링 리스트, 오리지널 위키(http://c2.com)의 논의들

특히 유즈넷, 메일링 리스트, 오리지널 위키는 늘 가까이 하고 있어야 합니다. 이 세 곳을 살필 때, 특히 다음 사람들의 글은 꼭 읽어보고 항상 레이더를 열어두면 좋습니다(이 외에도 개발 경력 10년, 20년이 넘는 짱짱한 사람이 많으므로 눈 여겨 관찰하세요. 모든 글을 읽는 것은 무리이므로 그들의 대화를 일차적으로 읽어야 합니다).

켄트 벡, 론 제프리즈(Ron Jeffries), 워드 커닝엄(Ward Cunningham), 앨리스테어 코번(Alistair Cockburn), 마틴 파울러, 로버트 마틴 혹은 엉클 밥(Robert C. Martin aka Uncle Bob), 마이클 페더즈(Michael Feathers), 켄 아우어(Ken Auer), 윌리엄 웨이크(William Wake), 로이 밀러(Roy Miller), 데이브 토마스(Dave Thomas), 앤디 헌트(Andy Hunt), 랄프 존슨, 스카트 앰블러(Scott Ambler), 짐 하이스미스(Jim Highsmith), 조슈아 커리프스키(Joshua Kerievsky), 로렌트 보사빗(Laurent Bossavit), 존 브루어(John Brewer) 등

이런 자료들 외에, 기회가 된다면 주변에서 XP를 직접 사용하는 곳을 방문해서 하루만 같이 생활해 보기를 권합니다. 반년 공부를 앞당길 수 있습니다. 제가 공부할 때는 주변에 XP를 아는 사람이 없어서 혼자 공부했는데, 그것에 비해 XP를 직접 사용하는 상황에 처한 사람은 (제가 억울하리만큼) 더 적은 노력으로 몇 배 이상 빨리 몸에 익히는 것 같았습니다.

이게 힘들면 같이 공부하는 방법이 있습니다(앞서 언급된 스터디 그룹에 관한 패턴 참고). 이 때 같이 책을 공부하거나 하는 것은 시간 낭비가 많습니다. 차라리 공부는 미리 다 해오고 만나서 토론을 하거나 아니면 직접 실험을 해보는 것이 훨씬 좋습니다. 두 사람 당 한 대의 컴퓨터와 커대란 화이트보드를 옆에 두고 말이죠. 제 경우 스터디 팀과 함께 저녁 시간마다 가상 XP 프로젝트를 많이 진행했고, 짤막짤막하게 프로그래밍 세션도 많이 가졌습니다. 나중에 회사에서 직접 XP를 사용할 때 많은 도움이 되었습니다.

Refactor Me
제가 하고 싶은 말은 더 있지만 이 글은 일단 여기서 끝이 납니다. 서두에서 말씀드렸듯이 애초 쓰려던 '일반론'은 생략하고, 대신 독자들의 몫으로 남겨두려 합니다. 이 글 자체가 여러분의 리팩토링 수련의 연장(延長)이 되었으면 하는 바램입니다. 이 글과 함께 실생활에서 직접 실험을 해보면서 - 이 때 욕심 부리지 않고 한 가지씩 지긋이 해보는 느긋함과 음미의 정신이 필요할지도 모르겠습니다 - 자신의 경험을 축적해 나가고, 동시에 이 글을 적절히 리팩토링해서 자신만의 패턴을 차근히 만들어 나가길 바랍니다. 그렇습니다. 리팩토링은 대상에 대한 이해가 깊고 경험이 많을수록 더 잘할 수 있습니다.

이 글에 소개된 제 공부론은 어찌 보면 상당히 진부해 보이기도 할 것입니다. 하지만 저는 이런 상식적이고 일상적이며 심지어는 소소해 보이는 것들에서 많은 감동을 받아왔습니다. 이 글도 사실 제 감동의 개인사입니다. 저는 "만약 오늘 어떤 것에라도 감동한 것이 없었다면, 오늘은 뭔가 잘못 산 것이다"라는 신조를 갖고 있습니다. 그것이 컴퓨터이건 대화이건 상관없이 말이죠. 저는 날마다 감동하며 살려고 노력합니다. 그러나 이 감동에 뭔가 꼭 대단한 것이 필요한 것은 아닙니다. 저는 오히려 감동 받기 위해 스스로 대단해져야 할 필요를 느끼기도 합니다. '감동'이라는 것은 주어지는 것이 아닙니다. 나와 타자가 공조하여 만드는 대화입니다.

감동해야 체득할 수 있다고 생각합니다. 그리고 이 감동은 개인적 삶 속에서 자기가, 자신의 몸으로, 직접 얻는 것입니다. 工夫 열심히 합시다. @


2006년 12월 7일 목요일

티스토리 변신

오... 티스토리 멋지게 변신했네요..ㅎㅎ

자세히 보면서 이뻐해줘야겠네요..

설정하는것도 바뀌고... 설정하는건 비슷하겠죠...

2006년 11월 22일 수요일

마우스우클릭,키보드,드래그방지 제한 풀기

마우스우클릭,키보드,드래그방지 제한 풀기
function r(d){d.oncontextmenu=null;d.onselectstart=null;
d.ondragstart=null; d.onkeydown=null;d.onmousedown=null;
d.body.oncontextmenu=null;d.body.onselectstart=null; d.body.ondragstart=null;
d.body.onkeydown=null; d.body.onmousedown=null;}
var tb=document.all.tags(’BODY’);if(tb.length==0) {for(var i=0;i<
top.frames.length;i++){r(top.frames[i].document);}}else{r(document);}

마우스 드래그 방지 및 마우스 오른쪽 사용 금지
body onContextmenu=”return false” onSelectstart=”return false”  

Embed 영상있는 주소에 태그에 아래를 삽입
embed src=”http://user.chol.com/~cirius1208/tearful-story-3.wmv
enablecontextmenu=”false” oncontextmenu=”false” ondragstart=”false”
onselectstart=” false” width=”340″ height=”300″  

마우스 우클릭 드래그 키보드 방지 태그
body oncontextmenu=”return false” onselectstart=”return false”
ondragstart=”return false”  이것을 사용해 주시면 됩니다.
oncontextmenu는 마우스 오른쪽 버튼을 클릭했을 때
나오는 메뉴를 말합니다. return false 라고 하면 마우스 오른쪽 버튼을
아무리 클릭해도 나오지 않습니다. onselectstart와 ondragestart는
마우스를 드래그 해서 글자들을 선택할 수 있는가의 여부입니다.
모두 return false로 두면 선택하고 드래그할 수 없습니다.
더 추가 하자면 onkeydown=”return false” 를 추가하면 키보드도 안 먹히죠

이것이 가장 막기 좋은 방법
body oncontextmenu=”return false” onselectstart=”return false”
ondragstart=”return false” onkeydown=”return false”

첫 번째 방법은 브라우저 설정으로 보는 방법인데.. 인터넷옵션에서
보안을 높음으로 하면 자바스크립트가 작동되지 않으므로
마우스 오른쪽 막아둔 것이 먹히지 않게 되죠..그래서 소스를 볼 수 있구요..

두번째 방법은 프로그램을 이용하는 방법.. 아이토이나, 웹마 등의 프로그램을
이용하면 메뉴에 해당 사이트 소스보기나, 제한해제라는 메뉴가 있습니다.
그것을 선택하면 제한이 풀리게 되는데, 그 다음 마우스 오른쪽으로 눌러서
소스보기 하면 됩니다. 스니퍼 같은 프로그램을 이용하면
애플릿 같은것을 다운받기가 수월하게 되죠..

세 번째 방법은 각종 단축키들을 이용하는건데.. 팝업창에서는 F11 을 눌러서
view-source: 를 이용한다거나,히스토리 버튼을 눌러서 지나온 페이지들을
검색하면 해당 페이지 주소가 나옵니다. 거기서 소스를 보는 방법도 있고,
링크를 누를 때 Shift 버튼을 누르고 클릭하면 새로운 창에서 열리는데,
이 창에서 보기 > 소스 하는 경우도 있구요..팝업창의 경우 Ctrl + N 누르면
새 창에서 열리는데, 여기서 소스를 보는 방법도 있습니다…
벅스뮤직 음악재생창 소스보기 할때도 단축키를 이용하면 편리합니다..

네 번째 방법은 임시 인터넷 파일을 이용하는 겁니다.. 웹사이트를
보게 되면 그 사이트를 구성하고 있는 파일들이 컴퓨터 어딘가에
저장되게 됩니다. 이 파일들을 임시 인터넷 파일이라고 하는데..
이 파일을 검색해서 해당 파일을 복사한 후 원하는 폴더로
붙이기 해서 메모장으로 열면 소스가 봐집니다. 단, 사이트에서
캐쉬 관련 헤더를 첨부한 경우 임시 인터넷 파일에 저장이
안 되는 경우도 있습니다. 그리고 POST 방식으로 열린 페이지도
임시 인터넷 파일에 저장이 안됩니다. 요즘에는 소스를 암호화
한다던가 하지만, 그렇게 해도 다 뚫는 방법이 있으므로 소용이 없습니다.

마우스 오른쪽 버튼은 되는데 메모장이 안 뜨는 경우에는, 해당 페이지를
새로고침 한 후 소스보기를 하면 소스가 보입니다.
간단한 방법으로는 해당페이지의 독자적인 경로를 띄웁니다;
“쉬프트+링크클릭”이 되겠죠; 그런다음 익스에서 보기-소스 보기 하시면 되구요;
이런 방법때문에 키보드의 쉬프트제한 방법도 쓰지만; 마우스 우클릭창
키보드로 띄우기 창안에 마우스를 위치시킨 후에 shift + f10을 눌러줍니다.
왼쪽 프레임에다가 올려놓고 위 단축키를 누르면 왼쪽 프레임 소스가 나타나는 겁니다.

웹 브라우저의 주소줄의 맨 앞에 view-source: 라는 명령어를 추가해보세요.
예를 들어 http://kr.yahoo.com/의 html 소스를 보려
인터넷 익스플로러의 주소줄에… view-source:http://kr.yahoo.com/ 그럼 됩니다..

Windows XP 메모리 최적화 방법

언제부터인가 XP가 오류가난다.. 계속하드가 버벅거리고.. 그냥 깔아만 놓고 별설정을 해주않았는데..
아무래도 좀 읽어보고 설정을 해줘야겠다.

다음은 다른 블로거님한테퍼온글이다.

Windows XP를 대부분 사용하고 있을 것이다. 그러나 최적의 성능이 나도록 만들어서 쓰는 사람은 많지 않을 것이다. Windows XP를 오래전에 설치하고 오랫동안 별다른 조치 없이 사용하고 있는 컴퓨터라면 버벅거리는 증상이 보이고 여러가지 약간씩 신경을 자극하는 느린 증상 등을 겪게 될 것이다.



제대로 된 최적화 가이드가 별로 없다보니 어떻게 해야 최적화가 되는지도 모르겠고, 해서 별다른 조치 없이 사용하고 있는 분들께 도움이 될까 해서 최적화하는 방법에 대해 살펴 보려고 한다.



Windows XP의 메모리 서브시스템에 영향을 주는 하드웨어로는 메모리, CPU, 하드디스크 등이 있는데 이들을 최적화시키는 방법에 대해 살펴 보려고 한다.

보실려면 '펼치기' 버튼 클릭하기

펼치기




2006년 11월 14일 화요일

왕의남자 OST "반허공"




어제 SBS에서 했던 왕의남자 OST네요..
피아노치는분은 다음에서 유명한 양승구씨네요..^^
다음에서 퍼왔습니다.

2006년 11월 4일 토요일

내 컴퓨터 설치 순서 입니다.

나중에 설치하게 될때 참조하자...
프로그램이 너무많아지면 너무 느려지므로 최소한 필요한 설치하는게 중요하다..


▶▶ 컴퓨터 설치 순서 ◁◁

♤ 기본설치 드라이버
  BIOS 업데이트 ( 필요시)
  LAN드라이버
  프린터 드라이버: HP
  그래픽 드라이버: ATI
  SOUND MAX, SB-LIVE DRIVER 설치
  백신설치: VIROBOT

♤ 동영상    
  곰플레이버
  코덱 설치 (Z코덱)
  ITUNES...IPOD전용
  WINAMP
  WINDOWS MEDIA PLAYER
  바닥인코딩

♤ 메신져    
  구글토크(메일검사), 구글툴바
  네이트온 3.5
  SKYPE

♤ BURN CD굽기
  NERO BURNING 7.0
  CLONECD
  알콜

♤ 공부, 일
  싸이버대학 설치파일
  MS-SQL, OCX, VISUAL STUDIO 6.0 + MSDN
  한글2005
  포토샵CS2
  팜관련SW (팜데스크탑,아젠더스)
  오피스2003

♤ 기타툴

  ADOBE ACROBAT 7.07
  EDITPLUS2
  WINRAR
  알씨가족들(알씨,알FTP)
  Easy CD-DA Extractor 7.1
  TREE SIZE   

♤ P2P
  동키호테(P2P)
  BITCOMET    

♤ 큰용량 프로그램들
  JAVA STUDIO & JAVA 2 SE(필요시)
  나모 웹에디터

2006년 10월 29일 일요일

영문이메일에서 자주 나오는 예문 & 약어집 [퍼온자료]

영문 이메일은 보통 영문의 편지문장과 몇 가지 차이가 있다. 가장 다른 점은 인포멀하고 간결한 문체일 것이다. 짧고, 친밀감을 담는 문체이지만 받는 사람에게 실례가 되지 않게 쓰지 않으면 안 된다. 이러한 어려움 때문에 지금까지는 영문으로 전자메일을 쓰려고 생각해도 부담이 되어서 쓰기를 망설였던 사람들이 많을 것이다. 그런 분들을 위해서 영문 e-mail에 자주 나오는 편리한 표현을 오랜 작업끈에 정리해 보았다. 이러한 표현을 참고하셔서 이제는 주저하지 마시고 짧아도 괜찮으니 영문 e-mail를 한번 써 보자.


자기 소개의 표현


I'm sending this mail from Seoul, Korea.
한국의 서울에서 메일을 보냅니다.
This is my first mail to send to this mailing list.
이 메일링리스트에 처음으로 메일을 보냅니다..
I work for a multimedia company that makes educational software.
교육용 소프트를 만드는 회사에서 근무하고 있습니다.
I am Bnghee Han from Daejeon-City, Korea.
한국의 대전시에서 살고 있는 한 봉희라고 합니다.

인사 표현


How have you been (doing)? Nothing much new here.
안녕하십니까. 이곳은 별다른 일없습니다.
I'm happy to join this movie lover's mailing list.
이 영화 동호인 메일일 리스트에 가입되어 영광입니다.
I sent e-mail to you last weekend but I guess I sent it to the wrong address.
제가 지난주에 메일을 보냈습니다만 잘못된 주소에 보낸 것 같네요.

감사의 표현


Thanks for your quick reply(Response).
빠른 답장 감사합니다.
Thank you for your e-mail dated April 15, 2001.
2001년 4월 15일자 메일 고맙습니다.
If you could take a few minutes to answer our questions, we would really appreciate it.
저희들의 질문에 시간을 조금만 내서 답변을 해 주신다면 감사하겠습니다.
Thank you in advance for your help.
아무쪼록 부탁 드립니다. (미리 감사드립니다. )

사죄의 표현


Sorry I didn't write to you earlier.
좀 더 빨리 쓰지 못해 죄송합니다.
I apologize for not having gotten into contact with you sooner.
좀 더 빨리 연락을 드리지 못해서 죄송합니다.
Sorry for any confusion and it is a pleasure doing business with you.
혼란스럽게 해서 죄송합니다. 그리고 당신과 비즈니스를 같이하게 되어 기쁩니다.

제안의 표현


I'd like to make a proposal: why don't we write our messages all in English?
제안이 있습니다. 우리는 왜 메시지를 전부 영어로 쓰지 않습니까?
Are you interested in going to a baseball game with me this weekend?
이번 주말에 저와 야구하러 가는 것에 관심이 있습니까?
Why don't you stop by Korea if you are coming to Japan?
일본에 온다면 한국에도 들러 주세요!

문의의 표현


Does anyone know if those movies are available on videotape?
이러한 영화가 비디오테이프로 가능할지 누가 모릅니까.
I need your help.
도와주세요.
When can I expect a reply from you?
언제 답장을 받아 볼 수 있을까요!.
I just want to check if you have received my mail of April 23rd.
4월 23일날 보낸 나의 메일을 받으셨는지 확인하고 싶습니다.
Is there anybody out there who has the last month's English Network?
누군가 지난달의 영어네트워크를 갖고 계시지 않습니까?

답변의 표현


I am responding to your job opening announcement in the Korea Times dated April 5th.
4월 5일자의 코리아 타임즈 구인 광고 건으로 연락하고 있습니다.
Here is my answer to your question of April 1st.
4월 1일자의 당신 질문에 대한 답변입니다.
I wish I could go, but I have already made plans on the 12th.
갈 수 있으면 좋겠습니다만, 벌써 12일에는 계획이 있습니다.
Hope this helps.
이것이 도움이 되길 기대합니다.

의뢰의 표현


I hate to ask you this, but would it be possible for us to stay with you?
이러한 것을 부탁드리기가 싫지만 당신과 함께 머무르는 것이 가능할까요?
Let me know the results of your entrance exams in the next mail.
다음 메일로 입시의 결과를 가르쳐 주세요.
Could you help me with my survey?
나의 조사에 답해 주실 수 있겠습니까?
May I ask a favor of you?
부탁을 해도 될까요?
I am looking for key-pals in Mexico, Spain or South America.
멕시코와 스페인과 남아메리카에서 전자메일로 펜팔할 상대를 찾고 있습니다.
We would like to e-mail with an elementary school class in Italy.
이탈리아의 초등학교 클래스와 전자메일을 교환을 하고 싶습니다.
Please respond to
iambong@netsgo.com
연락은
iambong@netsgo.com 로 주세요!

확인의 표현


Did you mention you wanted to start this business by March this year or March next year?
이 비즈니스를 금년 3월까지 시작하기로 언급했습니까? 아니면, 내년 3월까지라고 언급했습니까?.
Did you also say we need a unix machine for this?
당신은 또한 UNIX의 컴퓨터가 필요하다고 말했습니까?

감정의 표현


I'm a bit disturbed by your reply to our new product.
저희들의 상품에 대해서 당신의 답변에 놀랐습니다.
I'm so glad/happy that you liked our gift.
당신이 우리의 선물을 좋아하시니 기쁩니다.
I'm terribly sorry to hear of Dr. Johnson's sudden death.
죤슨 선생님의 갑작스런 죽음을 듣고 놀랐습니다. 명복을 빕니다.

축하의 표현


I wish you the best of luck /good luck with your final exams.
기말 시험에서의 행운을 빕니다.
How are you feeling? I heard you couldn't come to work for several days because you got sick.
상태는 어떻습니까. 병이 들어 몇 일간 출근을 못한다고 들었습니다.
Have a good rest until you feel completely well.
완전히 좋아 질때가지 충분히 휴양을 취하세요.
I'm really glad to hear you got promoted.
당신의 승진을 진심으로 축하드립니다.
Congratulations on your marriage!
결혼 축하합니다.
You deserve to get promoted.
당신의 승진은 당연합니다.

e-mail 주세요


E-mail me or call me collect, please.
전자메일이나 콜렉트콜로 연락 주세요.
Hope to here from you soon.
당신으로부터 빠른 답장을 기다리고 있습니다.
I'm looking forward to receiving your reply at your earliest convenience.
가능한 한 빨리 답장을 받을 수 있기를 학수 고대하고 있습니다.
Please send responses by the end of April.
4월말까지 답장을 주세요.

마지막 한마디


I'll tell you more about it in my next message.
다음 메일로 좀 더 이야기를 하겠습니다.
I'll keep in touch.
연락을 합시다.
Please give my best regards to your boss.
당신의 상사에게 안부 전해 주십시오.


아래는 e-mail에서 자주 나오는 약어의 예다. 네트워크를 이용하는 User들은 가능한 한 문장을 짧게 쓰기 위해서 이러한 특수한 약어를 낳았다. 익숙해질 때까지는 너무 자주 사용하는 것은 권장하지 않지만, 읽었을 때 어떠한 의미인지 정도를 이해할 수 있도록 알아두자. 그리고 한 두개 정도는 이메일에 사용해 보아도 좋을 것이다.


기본적인 약어


P. S. / Post Script 추신
BTW / By the way 그런데
ASAP / As soon as possible 가능한 한 빨리
co. / company 회사
et al. / (et alia 라틴어로부터) and others 그 외
i.e. / (id est 라틴어로부터) that is 즉
e.g. / (exempli garatia 라틴어로부터) for example 예를 들면

화재를 바꾼다.


OBTW / Oh, By The Way 그런데
OTOH / On The Other Hand 한편
AFAIC / As Far As I'm Concerned 나에 관해서 말하면
IOW / In Other Words 즉
IAC / In Any Case 어쨌든

마지막 인사


CIAO / Goodbye (이탈리아어) 안녕
CUL / See You Later 다시 또 보자
CWYL / Chat With You Later 또 이야기합시다
TTYL / Talk To You Later 또 이야기하네요
BFN / Bye for now 오늘은 이 근처로

컴퓨터 용어


HDD / Hard Disk Drive 하드 디스크
Msg / Message e-mail문장
Cc / carbon copy 참조(같은 것을 다른 사람에게도 보내는 기능)
Bcc / Blind carbon copy 숨은 참조(상대에게는 알리지 않고 같은 것을 다른 사람에게도 보내는 기능)
KBD / Keyboard 키보드
Snail Mail / The U.S. Postal Service 우편(우편은 전자 메일에 비해 달팽이처럼 늦기 때문에)

프로만 아는 생략어


IITYWTMWYKM / If I Tell You What This Means Will You Kiss Me?
HHO 1/2 K / Ha, Ha, Only Half Kidding 좀 농담을 했다니까!
ROFLASTC / Rolling On Floor Laughing And Scaring The Cat! 배꼽이 빠지게 웃는다
WYSIWYG / What You See Is What You Get 모니터에 보이는 대로 인쇄된다
IMHO / In My Humble Opinion 사견을 말하면
IMO / In My Opinion  생각건대
FYI / For Your Information 도움이 될꺼라고 생각해

상대를 어리석게 하는 것


KISS / Keep It Simple, Stupid 간단하게 못하니, 바보야!
IMNSHO / In My No So Humble Opinion 말하게 해주지만
LLTA / Lots and Lots of Thunderous (or Thundering) Applause 박수 갈채
RTFM / Read The F*cking Manual! / Read The Flaming Manual! 메뉴얼을 읽어라.

위트


HAK / Hugs And Kisses (꼭 껴안고 키스해줄 정도로) 훌륭하다!
ROFL/ROTFL / Rolling On Floor Laughing! 박장대소하다
HHOK / Ha, Ha, Only Kidding 농담이야.
ONNA / Oh No, Not Again 좀 기다려요.
OZ / Australia 오스트레일리아(사람)

감사


THANX / TNX
Thanks 고맙습니다
TIA / Thanks In Advance 잘 부탁드립니다

기 타
HTH / Hope this Helps! 이것이 도움이 될거야!
FYA / For Your amusement 이것으로 즐기세요
FYI / For your information 정보입니다
WT / Without Thinking 너무 생각하지 말고

2006년 10월 27일 금요일

읽고싶은책 - 나의 일부를 나누는 행복한 수고

오랜만에 포스팅하네요...^^
YES24에 가끔식 들어가는데 우연찮게 클릭해보니.. 좋은책같은 느낌이.
소제목만 보다도 많은 도움이 될꺼같다. ^^


나의 일부를 나누는 행복한 수고






온 마음으로 듣기·20
어려움에 처한 친구가 곁에 있다면, 다만 그들의 말에 귀를 기울여주어라.

마음에서 태어난 선물·28
당신보다는 그 사람에게 훨씬 더 큰 가치가 있을 물건을 찾았다면,
망설이지 말고 용기를 북돋아줄 수 있는 쪽지와 함께 선물하라.

흐린 날의 빛이 되어·36
경제적으로 어려워서 힘든 시간을 보내고 있는 사람을 도와라. 인생에서 흐린 날이 언제 나에게 올지 모른다.

세상에 단 하나뿐인 선물·44
창의력에 약간의 수고를 보태는 것만으로 훌륭한 선물을 직접 만들 수 있다.

내게 아이를 맡겨도 돼·50
이웃의 자녀를 사랑으로 돌보는 것은 값을 매길 수 없을 만큼 가치 있는 일이다.

멋진 하루의 시작·56
삶에 지친 친구의 운동 파트너가 되어주어라. 건강해진 몸이 서로의 영혼까지 밝게 만들어줄 것이다.

생필품 선물 꾸러미·62
치약이나 칫솔, 아스피린으로도 멋진 선물 꾸러미를 만들 수 있다. 친구에게 꼭 필요한 것은 당신의 세심한 마음이다.

기억 속의 멜로디·68
어려움에 처한 친구가 제일 좋아하는 가수의 CD를 선물해보라. 당신이 직접 부른 노래를 녹음해도 좋다.

소중한 삶을 이어주는 메신저·74
친구에게 전화를 걸어 “사랑한다”는 말을 하는 데는 채 1분도 걸리지 않는다.


베풀수록 더 많이 얻는 행복한 수고

맛있는 수고·88
어려운 가족을 위해 음식을 마련해주어라. 그 음식은 배를 채워줄 뿐만 아니라 마음에 안정을 가져다줄 것이다.

마음으로 보내는 격려·94
사람들을 유심히 관찰하라. 그리고 어떻게 하면 힘겨워 보이는 그의 얼굴에 미소가 떠오르게 할 수 있을까 생각하라.

차 한 잔의 즐거움·100
차 한 잔이 있는 대화의 시간을 지속적으로 마련하라. 당신의 친구가 당신에게 무엇이든 의논할 수 있도록 말이다.

달콤한 산책·106
친구와 잠깐 외출해서 맛있는 아이스크림을 사먹어라. 어쩌면 친구의 가슴속에 남아 있는 열을 식혀줄지도 모른다.

천 마디 말보다 사진 한 장·112
친구와 함께 한 순간을 사진에 담아두어라. 한 장의 사진은 함께 있을 수 없을 때 천 마디 말보다 더 큰 가치가 있다.

영감을 불어넣는 삶·118
친구에게 먼저 당신의 인생 이야기를 들려주어라.
친구가 자신의 인생에 주어진 고난을 의연하게 버틸 수 있도록 말이다.

꽃보다 아름다운 마음·124
햇살을 잔뜩 머금고 자라난 꽃 선물을 받으면, 마치 하나님의 품 안에 있는 것과 같은 따사로움을 느낄 것이다.

꼭 필요한 순간의 도움·130
간병하느라 지친 이들에게 당신이 언제 시간을 낼 수 있는지 알려주어라. 그렇게, 작은 휴가를 만들어주어라.

모두가 행복한 명절·136
환자가 있는 가족은 즐거운 명절 분위기에 젖어들기 어렵다.
이들이 명절 기분을 낼 수 있도록 맛있는 음식을 장만해 찾아가라.

잊지 못할 드라이브·144
비누와 스펀지를 두 손에 들어라. 그리고 세차도 못할 만큼
마음의 여유가 없는 친구를 찾아가 그의 차를 깨끗하게 닦아주어라.


나눌수록 커지는 행복한 수고

먼저 손 내밀기·152
이웃을 돕는 데는 세제, 양동이, 빗자루뿐 아니라 망치와 못도 필요하다.
집 안 청소나 집 수리를 해주는 것만큼 고마운 일도 없는 법이다.

조건 없는 나눔·160
모두가 함께 뜻을 모으면, 산도 움직일 수 있다.
하물며 많은 사람들이 아름다운 뜻을 모으면, 실로 놀라운 일이 일어난다.

한 권뿐인 책·168
고통받고 있는 누군가를 위해 모인 사람들의 따뜻한 마음속에서 ‘사랑의 책’이 태어난다.

살며시 잡아주는 손·176
친구가 나를 필요로 하는 순간에 그의 손을 잡아주는 것보다 큰 위로는 없다.

깜짝 선물의 기쁨·182
별다른 기대 없이 살아가는 사람을 위해 근사한 파티를 준비하라. 깜짝 선물을 마다 할 사람은 아무도 없다.

가장 빠른 때·188
세상엔 언제나 당신의 도움을 필요로 하는 이들이 있기 마련이다.
상처받은 이들을 돕기로 결심했다면 절대 포기하지 마라.

세상의 빛 나누기·192
크리스마스엔 반짝이는 전구를 장식해주거나 환한 빛이 나는 선물을 하여 친구의 마음을 밝게 만들어주어라.

2006년 10월 16일 월요일

단 5분으로 하루의 피로를 날린다! 집에서 쉽게 하는 셀프 발마사지

단 5분으로 하루의 피로를 날린다! 집에서 쉽게 하는 셀프 발마사지

저녁이 되면 온몸이 나른하고 여기저기 쑤신다. 뜨거운 욕조에 몸을 담근다든지 전신 마사지를 받으면 좋겠지만 날마다 하기는 부담스럽다. 이럴 때 쉽고 간단하게 피로를 푸는 방법은 바로 발마사지.   
하루 종일 갑갑한 구두 속에 갇혀 ‘찬밥’ 취급을 받는 발이지만, 발만 잘 관리해도 건강을 지킬 수 있다. 발은 심장에서 내려오는 혈액을 분배하고 소화하는 제2의 심장이다. 또한 섬세하게 퍼져 있는 신경조직이 온몸의 장기와 연결돼 있어 신체의 축소판이라고도 한다. 때문에 발에 모여 있는 수많은 혈을 자극하는 것만으로 각 기관의 기능을 촉진하고 긴장을 풀 수 있으며, 혈액순환을 돕고, 림프액의 순환을 원활하게 할 수 있다.

고대로부터 발마사지는 건강을 지키는 일종의 치료법으로 발전해왔다. 근래에 와서는 뛰어난 미용 효과를 지닌 에스테틱 프로그램으로도 인식되고 있다. 실제로 발마사지를 꾸준히 하면 체내 호르몬 분비가 촉진되어 노화를 방지하는 안티에이징 효과를 얻을 수 있다.

집에서 하는 발마사지, 이렇게 준비하세요!

하나, 발을 따뜻하게 한다
발을 마사지할 때에는 먼저 따뜻한 물로 발을 씻어 긴장을 풀고 피부를 유연하게 만든다. 이때 물에 소금을 약간 넣으면 소독과 함께 피로회복에도 도움이 된다. 발 전용 샴푸나 발 전용 소독제를 손발에 뿌려 세균을 막는 것도 좋다.

둘, 굳은살을 제거해 부드럽게
마른 수건으로 물기를 닦은 후 굳은살을 제거한다. 굳은살이 있으면 혈액순환이 제대로 되지 않고 혈을 자극해도 효과가 없다. 크래도라 부르는 일종의 면도칼과 버퍼를 이용해 제거한다. 하지만 날이 있는 크래도는 초보자가 사용하기에는 위험하고 세균 감염의 위험도 있다. 가능하면 버퍼만을 이용하여 각질을 제거하는 것이 좋다. 단, 발이 젖은 상태에서 굳은살을 제거하다 보면 속살까지 다칠 수 있으므로 주의한다.

셋, 전용 제품을 활용한다
발마사지 전용 마사지크림을 발에 골고루 바른 후 손이나 봉을 이용해 발의 피곤한 부위를 자극하며 마사지한다. 혈을 자극할 때 한 부위에 5분을 넘지 않는 것이 좋으며 3~4회 정도 반복해 자극한다. 발마사지 도구들은 주로 전용 숍에서 판매한다. 가정에서는 인터넷을 이용하여 주문하는 것이 편하다.



기초에서 응용까지~ 초보를 위한 Easy Lesson

발마사지 동작, 이렇게 누르세요!
누르기 혈자리를 찾아 호흡에 맞춰 2~3회 손이나 봉으로 지그시 누른다. 건강이 나쁠수록 통증이 심하다. 1분 이상 누르지 말 것. 좁은 면에 사용한다.
회전하기 혈자리를 찾아 양 엄지손가락으로 누르며 바깥쪽으로 작은 원을 그리듯 둥글게 자극을 준다. 좁은 면에 사용한다.
걷기 봉의 넓적한 면으로 특정 부위를 애벌레가 기어가듯 촘촘하게 누르며 자극하는 것. 넓은 면적에 사용한다.
밀기 손이나 봉의 넓적한 면을 이용하여 특정 부위를 지그시 누르면서 아래에서 위로 천천히 민다. 넓은 면적에 사용한다.













발마사지 실전! 손으로 마사지하기
엄지손가락을 이용해 발바닥의 혈을 자극하면 발등과 복사뼈의 혈액순환도 원활해진다. 부드럽고 자극이 적다. 전용 크림 등을 사용하면 더욱 효과적이다.

1 편안한 곳에 양반다리를 하고 앉은 다음 발바닥에서 용천혈을 찾아 양 엄지손가락으로 누른 뒤 천천히 밀어 올린다. 2~3회 반복한다.
2 용천혈에서 복사뼈 아래 성기음도까지 발의 움푹한 골(수뇨관 반사구)을 따라 민 후 성기음도를 누른다. 2~3회 반복한다.
3 양 엄지로 엄지발가락 아래서부터 끝까지 민다. 5회 반복한다.
4 다리를 세운 후 중지, 약지, 새끼손가락 등 세 손가락을 이용해 복사뼈 주변을 부드럽게 쓸듯 마사지한다.
5 엄지로 발등의 중간 부분에서 넷째, 다섯째 발가락 사이의 골 쪽으로 누르며 민다. 2~3회 반복 후 마무리한다. 다른 쪽 발로 바꿔서 ①부터 반복한다.

초보 과정에 익숙해졌다면~ 봉으로 마사지하기
봉을 이용하면 더 정확하고 분명하게 혈을 자극할 수 있어 효과가 빠르다. 초보자는 강도를 조절하기가 힘들어 피부에 자극을 줄 수 있으므로 어느 정도 손마사지를 숙지한 뒤 실시하는 것이 좋다.
1 뾰족한 봉 끝으로 용천혈을 지그시 누른다.
2 봉의 넓적한 쪽으로 바꿔 엄지발가락 뿌리부터 발끝까지 촘촘하게 걷는다. 측면도 마찬가지로 누른다. 다른 발가락도 같은 방법으로 지압한다.
3 발가락 아래의 단단한 발바닥을 봉의 넓적한 쪽으로 아래에서 위로 지그시 쓸 듯 마사지한다.
4 양 엄지손가락으로 복강신경총, 태양신경총을 지그시 누르며 둥글게 굴린다. 2~3회 반복한다.
5 뾰족한 봉 끝으로 뒤꿈치의 실면혈을 5~10회 가볍게 두드린 후 손으로 발 전체를 부드럽게 아래에서 위로 쓸어 올리며 마무리한다. 다른 쪽 발로 바꿔서 ①부터 반복한다.

전문가 어드바이스

하루 걸러 한 번! 식사 직후는 금물~

발마사지가 아무리 좋아도 무턱대고 오래, 자주 하는 것은 바람직하지 못하다. 발마사지는 1주일에 3회 정도 하는 게 적당하다. 또한 마사지를 할 때에는 너무 춥거나 더운 곳은 피한다. 혈액순환에 방해가 되기 때문이다. 같은 이유로 마사지 후 발은 수건을 감아 따뜻하게 보호한다. 마사지를 식사 직후에 하는 것도 좋지 않다. 적어도 식사한 지 1시간 이상 지나 위에 부담이 없을 때 한다. 발에 상처가 있는 경우, 임신부, 환자 등은 셀프 마사지보다는 전문가의 마사지를 받도록 한다. 심하게 피로할 때, 당뇨 환자도 전문가의 도움을 받는다. (델리케이트 부띠끄 한미경 실장)

느낌이 좋은 사람을 아는 99가지 비결

하나. 만나면 편안한 사람
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. <느낌좋은 사람>에게는 억지스러움이 없다
32. <느낌좋은 사람>은 애정에 둘러싸여 있다
33. 전체를 보고 그 장소의 흐름을 읽어라
34. 친한 사이라도 작은 마음 씀씀이, 상대의 기분을 살펴라
35. 섬세하게 느끼고 대범하게 임한다
36. '짐작'으로 사귀되 의심하는 지성도 잊지 마라
37. 너무 붙지 마라, 자신은 자신이고 타인은 타인이다
38. 우리집 헌법 제1조, 붙지도 떨어지지도 침입하지도 않는다
39. 우리집 헌법 제2조, 타인에게 의지하지 마라
40. 우리집 헌법 제3조, 어디 가? 묻는 것은 쓸데없는 참견
41. <느낌좋은 사람>은 기분좋은 거리를 유지한다

넷. 적응의 폭이 넓은 사람
42. <느낌없는 사람>은 타인에게 엄하고 자신에게는 무르다
43. 다른 사람의 험담을 해서 누가 득을 볼까!
44. 자신의 취미뿐만 아니라 다른 사람의 취미도 즐기자
45. <느낌좋은 사람>은 상당히 어설픈 감이 있다
46. <느낌좋은 사람>은 서비스의 달인
47. 뒤죽박죽 섞지 마라! 당신의 희망과 누군가의 희망을
48. 혼자 이겨서는 소용없다, 때로는 이기고 때로는 지자
49. 매일 조금씩 죽이면 더 오래 살 수 있다
50. 베스트드레서의 조건은 교제가 부담스럽지 않을 것
51. <느낌좋은 사람>은 적응 폭이 넓다

다섯. 지나치게 겸손하지 않은 사람
52. 선의나 선행도 적당한 것이 좋다
53. 아무리 좋아도 선물은 적당하게
54. 요란한 포지티브를 경계하라
55. 적당히 살아가는 것도 능력이다
56. 모르는 사이에 상대의 능력을 끌어낸다
57. <느낌없는 사람>은 약자를 좌절시키고 권위에 아첨한다
58. <느낌좋은 사람>은 시야가 넓고 편견이 없다
59. 호기심이 넘치는 사람일수록 겸허해진다
60. 당근과 채찍으로 조금씩 개선해 나간다
61. <느낌좋은 사람>은 타인에게 당근과 채찍을 휘두르지 않는다
여섯. 자신을 잘 드러낼 줄 아는 사람
62. <느낌좋은 사람>은 섣부른 충고는 하지 않는다
63. 평소에 시끄러운 사람일수록 무슨 일이 생겼을 때 도움이 되지 않는다
64. 어려운 이야기를 쉽게 말하기는 어렵다
65. 조용히 이야기하면 더 깊게 전달된다
66. 80%로 만족하로, 나머지 20%에는 둔감하라
67. 에고를 노골적으로 드러내서는안 된다! 에고를 숨기기만 해서도 안 된다!
68. 딱딱한 머리를 가진 사람에게는 두부 같은 부드러움이 없다
69. 이래야 한다 보다 현실을 즐겨라
70. <느낌좋은 사람>은 본심 배출법을 알고 있다
71. 강함의 비결은 유연함과 여유
72. <느낌좋은 사람>은 마음의 체조를 게을리 하지 않는다
73. <느낌좋은 사람>은 타인과의 차이를 은근히 즐긴다
74. 받아주는 사랑이 있는가 하면 내치는 사랑도 있다
75. <느낌좋은 사람>은 자신의 의견을 확실히 말할 수 있다
일곱. 스스로에게 만족하는 사람
76. 회사 이름만 번듯한 사람, 명함 없이도 멋있는 사람
77. 자신의 색과 자신의 맛을 살려라
78. 자유자재로 변신하는 가운데 일관된 자아가 있다
79. 경쟁이 있기 때문에 질 수도 있다
80. 자신을 과대광고하면 마음이 편하지 않다
81. 자신을 소중히 여기고 사랑하라
82. 조그만 룰이 큰 번거로움을 막는다
83. <느낌좋은 사람>은 좋아하는 일을 당당하게 한다
84. <느낌좋은 사람>은 자기 자신에게 만족하고 있다
85. 자신에게 긍지를 가질 수 있으면 타인도 존중할 수 있다
여덟. 잘 주고 잘 받는 사람
86. <느낌좋은 사람>은 링 밖에서는 싸우지 않는다
87. <느낌좋은 사람>은 가상의 아군을 만들지 않는다
88. <느낌좋은 사람>은 쉽게 상처받지 않는다
89. <느낌좋은 사람>은 정중히 사과하면서도 늠름하다
90. <느낌좋은 사람>은 자신의 기분을 솔직히 전달한다
91. <느낌좋은 사람>은 자유로운 어른이다
92. <느낌좋은 사람>은 주눅들거나 비뚤어지지 않는다

93. <느낌좋은 사람>은 열등감을 잘 극복한다
94. 튀어나온 말뚝이 얻어맞는 것은 당연하다
95. 남들과 다른 일을 하는 것이 개성은 아니다
96. <느낌좋은 사람>은 Give & Take가 가능하다
97. <느낌좋은 사람>은 헌신하는 것도 헌신을 받는 것도 싫어한다
98. <느낌좋은 사람>은 잘 주고 잘 받는 사람
99. <느낌좋은 사람>은 혼자 힘으로 강을 건넌다.

말 잘하는 사람들의 7가지 스킬

첫째, 다른 사람의 얘기를 잘 들어야 한다.


말 잘하는 사람치고 남의 말을 경청하지 않는 사람은 없다. 상대가 무슨 말을 하는지를 제대로 들어야, 자신도 그에 맞게 적절한 말을 할 수 있지 않겠는가. 그리고 이렇게 경청하는 매너는 상대로 하여금 호감을 주기에 충분하고, 자신의 말도 상대가 경청하게 하는데 효과적인 방법이다. 잘 듣는 것이 곧 잘 말하는 것의 시작인 것이다.



둘째, 시나리오 능력이 뛰어나야 한다.


머릿속에서 즉흥적으로 떠오른 말을 입으로 내뱉는데에는 한계가 있다. 말 잘하는 사람들은 대개 미리 시나리오를 그려보고 말을 한다. 프레젠테이션이나 회의를 앞두고 미리 머릿속으로 내가 어떻게 얘기하면, 상대는 어떻게 얘기할 것이고, 그럼 난 어떻게 얘기해야겠다는 등을 미리 그려보는 것이다. 그러면 훨씬 체계적이고 논리적인 말하기가 될 수 있을 것이다.

무조건 생각나는걸 입으로 내뱉기전에, 한번 머릿속에서 생각하고 판단해보라. 그러면 말이 너무 느려지지 않겠나고. 걱정마라. 연습을 통해 그렇게 말하는 것이 익숙해지면 1초 사이에도 머릿속에서 여러개의 문장을 되새김해볼 수 있게 될 것이다.



셋째, 자신감을 가져야 한다.


말하는 능력에서 자신감은 50% 이상을 차지한다. 그렇다고 틀리거나 부정확한 얘길 자신감있게 해서는 안된다. 정확한 얘기를 자신있게 하면 상대로 하여금 훨씬 더 높은 신뢰감을 얻게 된다. 아울러 설득도 쉽게 된다. 같은 말이라도 자신있게 하는 것과 그렇지 않은 것은 차이가 크다. 절대 끝말을 흐려서도 안되고, 부정확한 발음이어도 안된다. 또박또박하게 자신의 말을 정확하게 자신있게 전달하도록 노력해라. 어차피 말하는 것으로 먹고사는 사람이 아니지 않는가.

말하다 조금씩 실수한다고 뭐라고 할 사람도 없다. 자신감만 가지고 과감하게 말하는게 필요하다. 그렇다고 큰소리 뻥뻥치란 얘기는 아니다. 자신감은 소리가 크고 작고의 문제가 아닌, 명확하고 당당함의 문제인 것이다.



넷째, 신속한 정보수집력이 필요하다.


새로운 얘기는 듣는 사람으로서도 집중을 잘하게 한다. 다들 아는 식상한 얘기를 거론하는 것이나 했던 얘기 또하고 또하는 것은 곤란하다. 정보수집력은 말잘하는 사람의 필수자질이다.

특히 유행하는 트렌드나 이슈, 그리고 유머 등은 정보수집 능력에 비례해서 말잘하는 능력이 가늠되는 것이다. 자신만의 정보수집 경로를 만들어두고, 꾸준히 새로운 정보를 업데이트해 나가는 것이 필요하다.

매일 주요 신문을 보는 것은 기본이고, 전문분야 잡지는 꼭 구독해서 가치있는 정보를 확보해야 하며, 필요한 뉴스레터는 꼬박꼬박 챙겨서 받기도 해야한다. 특히 차를 타고 이동할 때 라디오의 시사프로그램이나 교양프로그램을 청취하는 것도 도움이 된다.



다섯째, 말 할때는 신중해야 한다.


말은 글과 다르게 한번 내뱉으면 주워담거나 고칠 수가 없다. 계속 줄줄 떠든다고 말잘하는게 아니다. 그런 말빨은 나이트클럽에서나 써먹을 수 있을뿐 그리 쓸만한데가 많지는 않다. 필요한 말을 신중하고 적절하게 잘하는 것도 중요하다. 말을 많이 하지 않더라도 충분히 말 잘하는 사람이 될 수 있다는 얘기다.



여섯째, 아는 것이 많아야 한다.


자신이 알고있는 분야의 얘기를 할 경우에는 말이 많아지게 되고, 말도 술술 자연스레 풀리게 된다. 누구나 공감하는 얘기일 것이다. 그렇다면 자신이 하는 일이나 전문분야에 대해서는 상대보다 더 많이 알도록 준비하는 것이 필요하다.

대개 말을 잘 못하는 사람이라 하더라도 특정 분야에 대해서는 상대적으로 말을 더 잘하는 경우를 보게된다. 대개 그 특정분야라고 하는게 자신의 관심사에 해당되는 분야이다. 연애나 술 얘기에는 침튀기며 얘기하다가도, 정작 필요하고 중요한 얘길 해야할 자리에선 말을 잘 못한다는 사람은 반성해야 한다. 그런 사람들은 자신의 관심사를 좀더 생산적이고 전문적인 분야로 옮겨보도록 노력해야 한다.



일곱째, 여유가 있어야 한다.


우선 앞에서 제시한 여섯가지 요소를 갖춘다면 여유를 가지고 말을 해야 한다. 조급해지면 말도 빨라지고, 해야할 말도 놓치게 된다. 여유를 가지고 말한다면 훨씬 더 조리있고 차분하게 상대를 설득시킬 수도 있을 것이며, 유머나 재치도 자연스레 나온다.

말하는 간간히 섞여나오는 유머는 상대를 집중시키는데 효과적이다. 절대 말 할때 흥분하지 않도록 스스로에게 여유를 가지도록 당부해야 하고, 말하는 템포도 스스로가 적절히 조절할 줄 알아야 한다.

말하는 것은 상대방과의 커뮤니케이션이다. 일방적으로 속사포처럼 떠들고 사라진다면 그건 말을 한 것이 아니라 소음을 만든 것이다. 최대한 밝은 미소와 여유로운 말이 훨씬 더 말 잘하는 사람으로 만들어줄 것이다.

2006년 10월 11일 수요일

포옹해드립니다.



포옹해드립니다. 한청년의 캠페인으로 모든사람에게 퍼져나갑니다.
경찰이 막았으나, 10,000명서명으로 다시 캠페인은 계속하네요.

Youtube 주소: http://www.youtube.com/watch?v=vr3x_RRJdd4

다음포스팅 주소
http://bbs4.worldn.media.daum.net/griffin/do/country/bbs/read?bbsId=N006&searchValue=&articleId=4404&pageIndex=1&searchKey=

2006년 10월 10일 화요일

입냄새 어떻게 할까...


내 애인에게서 입냄새 날때 여러분은 어떻게 대처하세요? ㅎㅎ

말해주기도 민망한 입냄새!  어떻게 없앨까~ 

입냄새가 심할때 효과적인 처치법 



⊙ 고단백 음식물을 섭취한 후에는 빨리 입안을 헹구자 우유, 달걀, 육류 등 고단백질 음식물을 먹은 후에는 구강청정제나 물 등으로 바로 입안을 헹구어내면 구취 예방에 효과적이다.


⊙ 혓솔질을 자주 하자 입냄새의 원인 중 60% 를 차지하는 것이 설태다. 칫솔질을 할 때 혀 안쪽을 닦아내는 혓솔질하는 것을 습관화하면 입냄새를 대폭 줄일 수 있다. 설태가 너무 많이 끼어 닦이지 않는 경우는 치과에 가서 혀 스케일링으로 제거할 수 있다.


⊙ 물을 많이 마신다 입안을 건조하게 하면 세균이 증식해 입냄새가 나기 쉽다. 물을 자주 마시거나 입안을 헹구어만 줘도 입냄새 예방에 효과적이다.


⊙ 섬유질이 많은 음식 섭취 섬유질이 많은 야채나 과일은 육질이 꺼끌꺼끌해서 치아 사이의 플라그나 설태를 닦아내는 역할을 한다. 또 껄끄러운 촉감이 혀의 타액선을 자극해 침의 분비를 촉진시키므로 입냄새 예방에 효과적이다.


⊙ 커피나 흡연을 삼간다 담배를 지속적으로 피우면 침이 마른다.또 흡연으로 인해 비타민 C 가 파괴되는 것도 입냄새의 원인이 된다. 커피의 성분 중 카페인은 구강 내 환경을 약산성으로 만드는 역할을 한다. 따라서 각종 세균이 번식하기 좋은 환경을 조성해주는 것이 되어 입냄새가 나기 쉽다.

입냄새를 스스로 체크할 수 있어요

입냄새가 나는지 그렇지 않은지, 남들에게 물어보기가 쉽지 않다. 가족 등 절친한 사이라도 꺼려지기는 마찬가지. 스스로 체크하는 좋은 방법이 있다.  입냄새가 나는 것 같으면 수시로 체크해 상대방에게 불쾌감을 주는 결례를 피할 수 있다. 입 다물고 있다가 후 불기 3분 동안 입을 다물고 있는다. 그 동안 입안의 휘발성 황화합물 등이 고이기때문. 3분 뒤에 두 손으로 입을 감싸듯 가리고, 후 바람을 불어 코로 냄새를 맡는다.


손등에 침 바르기 가장 손쉬운 입냄새 자가 점검법. 손등에 침을 바르고 즉시 냄새를 맡는다. 입냄새가 심하면 침에서 냄새가 난다. 침이 마른 뒤에는 누구나 냄새가 나기 때문에 정확하지 않으므로 침이 마르기 전에 바로 냄새를 맡아야 한다.


상대방에게 물어보기 부모, 형제 등 격의없는 사람에게 냄새 측정을 요구하는 것이 가장 정확하다. 입바람을 상대방 얼굴에 후 불어서 냄새가 나는지 물어본다.



구강청정제 집에서 만들 수 있어요 
최근 구강청정제의 사용이 증가하고 있는데, 시중에서 판매하는 구강청정제와 동일한 효과가 있는 구취제거, 충치예방용 구강청정제를 집에서 직접 만들 수 있다. 과산화수소수와 더운물을 반반씩 섞으면 훌륭한 구강청정제가 된다. 만들어두었다가 소량을 덜어 갖고 다니면 외출 중에도 사용할 수 있다.




▒ 입냄새가 날 때 효과적인 지압법 ▒


입안의 점막이 세균에 감염되어서 빨갛게 붓고 입술과 혀, 뺨의 내측 점막 등도 염증이 생겨서 따갑고 화끈거리고 쓰린 증상이 나타나는 구내염은 입냄새의 주요 원인 중 하나. A4,6,26점을중심으로 이쑤시개나 볼펜끝 등으로 압박한다.하루에 1 0 ∼3 0 분씩 해주면 효과가 있다.


냄새가 강한 음식을 먹었다면?

녹차를 마시자. 녹차의 플라보노이드 성분이 휘발성물질을 없애준다.

마늘 먹고 난 뒤에는?

우유를 마시자. 우유의 아미노산이 마늘의 냄새 성분과 결합해 냄새를 없애준다.

음식을 먹고 난 직후에는?

반듯이 이를 닦자. 치실 또는 치간칫솔을 사용해
치아 사이에 음식물 찌꺼기가 끼지 않도록 하는 것이 중요하다.

양치질이 여의치 않을 때는?

과일이나 양배추, 상추, 당근등 섬유질이 풍부한 야채를 먹자.
치아에 달라 붙은 음식 찌꺼기를 씻어내는 역할을 해준다.

입안이 마르면 냄새가?

수시로 물을 마셔 입을 헹궈주거나 무설탕 껌으로 침샘을 적절하게 자극하는 것이
도움이 된다.
<구강청정제를 이용하는 것도 일시적으로 도움 된다>

설태로 인해 냄새가 심해질 때?

물만 묻힌 칫솔로 혀 안쪽과 뒤쪽, 아래쪽을 꼼꼼히 닦아준다.
너무 빡빡 밀면 혀가 충혈되고 아프기 때문에 부드럽게 닦는 것이 중요.
혀 세정기를 이용하는 것도 좋은 방법.
혀의 뒷부분부터 앞 끝까지 부드럽고 가볍게 긁어주는 것이 사용요령이다.

자기 전에 이 닦기가 중요

자고 있는 동안 타액의 분비가 줄어들어 세균 증식이 빠르기 때문이다.

6~12개월에 한번씩 스켈링 받는 것도 좋다

스케일링은 일상적인 양치질만으로는 제거가 안 되는 치석을 없앨 수 있어
잇몸질환은물론 입냄새 예방에도 도움이 된다.


/다음에서 펌/

2006년 9월 28일 목요일

너~ 그거 알어 ?



너는 생각보다 괜찮아...좋은사람이야...^^
문스패밀리에서 퍼와봅니다...

개발링크 모음 [펌]

개발 부분
http://www.koders.com -> 각종 프로그램 소스를 검색
http://www.php.net -> php...
http://www.python.or.kr -> 파이썬 모임
http://www.javascript.com -> 자바스크립트
http://www.w3c.or.kr/ -> W3C
http://www.sourceforge.net -> 오픈 소스 프로젝트
http://expert.no-ip.org/ -> php 함수 및 클래스
http://planet-source-code.com -> planet source code
http://www.devpia.com/ -> 데브피아
http://www.bierkandt.org/beautify/index.php -> Beautify PHP
http://www.mojavi.org/ -> php 프레임워크
http://fckeditor.net/ -> FCK 에디터

디자인 부분
http://www.5day.co.kr/ -> 5데이
http://www.rpmfind.net/ -> RPM 검색
http://www.dll-files.com/ -> DLL 검색
http://www.nimiral.com/ ->욕검색
http://www.freebyte.com/ -> 프리웨어 등등 검색
http://database.sarang.net/ -> 데이타베이스 사랑넷
http://www.phpcs.com/ -> PHP Code Source
http://www.thefreecountry.com/php/index.shtml -> Free PHP Scripts
http://www.gnu.org/ -> The GNU Operating System
http://www.opensource.org/ -> Open Source
http://www.superuser.co.kr/home/ -> 리눅스 포털
http://www.1noooon.com/mystyle/ -> 엔젠드님의 개인블로그
http://qmail.org/ -> qmail mirror 
ftp://ftp.gnu.org/pub/gnu/ -> 각종 자료...(유닉스 계열)
http://www.naver21.com/ -> 새롭게 탄생한 naver21
http://people.kldp.org/~eunjea/qmail/ -> Qmail 임은재 메뉴얼
http://msdn.microsoft.com/ -> JS , CSS , 기타..
http://www.opensourcecms.com/ -> 오픈소스 CMS
http://www.phpbb.com/ -> php BB
http://www.opensourcescripts.com/ -> 오픈소스스크립트
http://mytechnic.com/ -> 마이테크닉
http://phpnuke.org/ -> php누크
http://www.needscripts.com/ -> 니드 스크립츠
http://www.flashkit.com -> 각종 플래시 소스 모음
http://www.php-editors.com/ -> php editors
http://www.php-editors.com/phpsearchtool.php -> php 부분 검색툴..
http://www.devshed.com/ -> Dev Shed
http://kldp.org/ -> KLDP
http://www.php.net/manual/kr/index.php ->php한글매뉴얼
http://www.tood.net ->투덜이
http://oops.org
http://www.webreference.com/ -> 웹레퍼런스
http://delmadang.com/
http://codeproject.com/
http://codeguru.com
http://feople.com 플래시
http://www.codelove.co.kr
http://kltp.kldp.org/ -> 리눅스 팁
http://www.delmadang.com <- 델마당
http://okjsp.pe.kr <- okjsp
http://phpschool.com <- PHP스쿨
http://database.sarang.net/php/doc/session/ <- Session Handling with PHP 4
http://www.phpclasses.org/ <- php class 모음
http://www.koreaphp.co.kr <- php 개발자 그룹
http://www.javaservice.net/ <- 자바 서비스
http://daisy.kwangwoon.ac.kr/~gslee/python/tutkr/ <- 파이썬
http://database.sarang.net/database/mssql/php/ <- MicroSoft SQL 2000 과 PHP 연동하기
한국펄사용자모임: http://www.perl.or.kr
[XHTML introduction]
http://www.w3schools.com/xhtml/xhtml_intro.asp
[How to study DESIGN PATTERS, REFACTORING, XP]
http://www.python.or.kr/pykug/HowToStudyDesignPatterns
[한글 Joel on S/W]
http://korean.joelonsoftware.com/
[unicode chart]
http://www.unicode.org/charts/
[javascript framework]
http://prototype.conio.net/
[리눅스 프로그래머를 위한 가이드]
http://users.unitel.co.kr/~sangeun5/linux/lpg.html
[Python 그리모아]
http://home.paran.com/johnsonj/grimoire/Python%20Grimoire.htm
[PHPs]
http://www.phppatterns.com/docs/start
http://www.zend.com/zend/art/index.php
http://www.phpdoc.org/
http://www.phpwact.org/ (Web Application Component Toolkit)
https://www.phrame.org/
http://www.lastcraft.com/simple_test.php (TDD)
pear.php.net
pecl.php.net
www.pcre.orgt
php.net
javascript framework 다큐먼트]
http://dev.conio.net/repos/prototype/doc/