금요일, 8월 30, 2013

[B급 프로그래머] (3) 소프트웨어 설계 "프로세스"가 항상 이상화된 형태인 이유는?

지난번에 [B급 프로그래머] (2) 소프트웨어 설계 "프로세스"가 항상 이상화된 형태인 이유는?을 올려드리며 잠깐 한숨을 돌렸다. 마지막으로 다룰 내용은 3부작의 핵심인 이상화된 설계 문서를 _쉽고 제대로_ '위조'하는 방법이다. 파나스 큰 형님이 쓰신 논문의 'II. FAKING THE IDEAL PROCESS"를 함께 읽어보자. (이하 스크롤 압박 주의!)

앞서 우리가 따르고 싶은 이상적인 프로세스와 이 프로세스를 따르는 동안 만들어야 하는 문서를 설명했습니다. 우리는 마치 이상적인 방식에 따라 뭔가를 작업했다는 듯이 문서를 작성하는 방식으로 이런 프로세스를 "위조"합니다. 앞서 설명한 순서에 따라 문서를 만들어내려 노력합니다. 정보의 일부가 존재하지 않는다면, 이런 사실을 해당 정보가 등장해야 마땅한 문서의 일부로 기술하며 마치 정보가 변경되리라는 사실을 기대하듯 설계를 계속 진행해야 합니다. 오류를 찾으면, 반드시 수정하고 문서에 관련된 변경을 가해야 합니다. 문서는 설계를 담은 매체이며, 문서에 통합되기 전까지는 해당 설계 결정이 내려지지 않은 것처럼 취급해야 합니다. 중간에 얼마나 발이 걸려 넘어졌는지 무관하게, 최종 문서는 이상적이면서 정확해야 합니다. 심지어 우리가 가장 이성적이라 여기는 수학 분야조차도 이런 절차를 따릅니다. 수학자들은 근면성실하게 증명을 다듬어, 처음과는 완전히 다른 증명을 내놓습니다. 첫 증명은 종종 지극히 고통스런 발견 프로세스의 결과입니다. 수학자들이 증명을 해나감에 따라 이해도가 높아지며 단순화할 방법을 찾아냅니다. 궁극적으로, 몇몇 수학자들은 이론의 진실을 좀더 명백하게 밝혀줄 더 단순한 증명을 찾아냅니다. 더 단순한 증명을 논문으로 출간하는 이유는 독자들은 이론의 진실에 관심이 있지, 이론을 찾아나서는 프로세스에 관심이 있지 않기 때문입니다. 소프트웨어에도 이와 유사한 추론을 적용할 수 있습니다. 소프트웨어 문서를 읽기를 원하는 독자들은 프로그램을 이해하기를 원하지, 프로그램 제작 과정을 다시 경험하기를 원하지는 않습니다. 이상적인 문서를 제공하는 방법으로, 실제 독자들이 필요한 내용을 제공할 수 있습니다. 우리가 만든 문서를 이상적인 문서와 비교하면 한 가지 중요한 차이점이 있습니다. 우리에게는 수용하고 거부했던 설계 대안을 모두 기록하는 정책이 있습니다. 각 대안에 대해 왜 수용했으며, 왜 마지막으로 거부했는지를 설명합니다. 여러 달, 여러 주, 심지어 여러 시간이 지난 다음 우리가 무엇을 어떻게 했는지 궁금하게 여길 때, 문서에서 찾을 수 있습니다. 지금부터 여러 해가 흘러, 유지 보수 인력이 동일한 질문에 부딪혔을 때, 대답을 문서에서 찾을 것입니다. 이런 프로세스가 성과를 거두는 실례는 이상적인 프로세스를 보여주는 일부로 몇 년 전에 작성된 소프트웨어 요구 사항 문서를 들 수 있습니다. 일반적으로 요구 사항 문서는 코딩을 시작하기 전에 만들어지며, 결코 다시 사용되지 않습니다. 해당 요구 사항 문서를 만족하는 현재 소프트웨어의 운영 버전은 여전히 변경이 가해지고 있습니다. 소프트웨어를 테스트해야 하는 조직은 테스트를 광범위하게 선택하기 위해 이런 요구 사항 문서를 활용합니다. 새로운 변경이 필요지면 어떤 변경이 가해져야 하며 어떤 변경이 가해지면 안 되는지 기술하는 문서를 참조해야 합니다. 여기서 우리는 이상적인 프로세스의 시작 시점에 만든 (위조된) 문서가 소프트웨어를 실제 환경에 투입하고 나서 여러 해가 지난 다음에도 여전히 사용되고 있음을 볼 수 있습니다. 메시지는 명확합니다. 만일 문서를 주의 깊게 작성한다면 오랜 기간 동안 유용할 것입니다. 그리고 반대로, 이렇게 만든 문서가 광범위하게 쓰인다면, 올바로 작성할 가치도 있을 것입니다.

원문이 한 문단으로 되어 있어 중간에 일부러 끊지 않았으므로, 한 번만 더 읽어보자. 두 번 읽었다면 지금부터는 실제로 이상적인 문서를 '위조'하는 방법에 대해 고민할 차례다. 본문을 읽다보면 밑줄을 그어야 하는 부분이 여러 곳 존재하는 데 그 중에서도 특히 "소프트웨어 문서를 읽기를 원하는 독자들은 프로그램을 이해하기를 원하지, 프로그램 제작 과정을 다시 경험하기를 원하지는 않습니다."라는 부분에 주목할 필요가 있다. 문서를 작성하는 과정에서 부딪히는 가장 큰 어려움은 바로 '우리가 앞으로 실제로 진행해야할 작업을 이상적인 형태가 아니라 전지적 관점에서 시시콜콜 기술하라'라는 말도 안 되는 요구다(말이 안 되는 이유는 시리즈 (1)번을 다시 읽어본다). 이런 말도 안 되는 요구에 따라 만든 문서로 최종 결과물을 검수하려니 여기저기서 삐걱거린다. 요구 사항을 낸 쪽에서는 미리 요구 사항을 제대로 수집하지 않았다고 난리며, 개발한 쪽에서는 애초부터 구현이 불가능한 설계 명세라고 난리다. 최종 사용자는 자신들의 의견이 반영되지 않았다고 난리며, 유지보수하는 인력들은 실제 개발 과정에서 일어난 변경 사항이 하나도 반영 안 된 죽은 문서라고 난리다. 어차피 책장 속에 들어가 다시는 꺼내보지 않을 운명에 처한 문서가 이 난리를 칠만큼 가치 있는지는 정말 잘 모르겠다.

그렇다면 문서를 어떻게 위조해야 할까? 개인적인 경험에 따르면, 미션 크리티컬한 프로젝트가 아니라면(음... 국방, 금융 말이지...) 처음 요구 사항 명세, 상위 아키텍처 설계, 상세 설계 문서 범위와 양을 최소로 줄이기를 권장한다. 그리고 문서를 작성할 경우 항상 타임머신을 타고 미래로 간 다음에 미래 시점에서 과거를 기술하는 방법으로 위조하는 방법을 권장한다. 이렇게 두 가지 기본 원칙을 제안한 이유를 조금 자세히 설명할 필요가 있겠다. 일단 범위와 양을 줄여야 하는 가장 큰 이유는 불확실성 때문이다. 어차피 문서 작업도 작업이므로 많은 시간이 들어가는데, 나중에 변경이 일어날 경우 문서를 작성하느라 날려버린 기회 비용을 상실하는 동시에 문서 수정 작업이라는 이중 난관에 부딪힌다. 어차피 처음부터 완벽한 문서를 만들지 못하는 상황에서 분량도 늘이고 완성도도 높이려 애를 써봐야 모든 사람이 괴로을 뿐이다. 게다가 내용 채워넣기 식으로 만든 문서는 본질을 흐리게 만들어 나중에 투입되거나 유지보수하는 인력에게 있어 혼란을 일으킨다. 로버트 C. 마틴 큰 형님께서 '가장 좋은 주석은 주석을 달지 않을 방법을 찾은 주석'이라고 표현했듯이, 어떻게 보면 소프트웨어 소스 코드와 최종 매뉴얼만으로 설명이 가능한 경우가 최선이다. 다음으로 미래 시점에서 과거를 기술하는 방법을 제안하는 이유는 사람의 사고 특성상 기한이 많이 남은 일일수록 추상적으로 생각하고 기한이 짧은 일일수록 구체적으로 생각하기 때문이다. 사람들은 사후분석에 능하다. 어떤 일이 터지고 나서 현실화된 다음에는 어떻게든 이를 합리화하고 이해하려는 노력을 기울이게 되므로, 미래 관점에서 과거를 서술하는 방식이 훨씬 쉽다. 하지만 프로젝트를 발주한 내/외부 '고객'에게 이런 요청을 할 경우에는 반드시 반대 급부를 제시해야 한다. 공동 설계 참여를 요청하거나(그렇게 되면 설계 문서가 이상화되어야 하는 이유에 대해 인정할 수 밖에 없는 상황에 놓이게 된다. 변경이 일상다반사인 상황에서 고정된 최종 형태를 고집할 수 있을까? 고집부린 사람이 나중에 다 뒤집어 쓰게 되는 판국인데?) 중간 검수 과정을 둬서 요구 사항 문서와 아키텍처/설계 문서를 깔끔하게 정리해(즉 위조해서!) 다시 제공하겠다는 (즉 처음 프로젝트 시작 시점에서 만든 문서는 큰 범위와 목표만 기술한다) 약속을 하는 방법이 대표적인 해법이다. 프로젝트가 중간 정도 지났으면 이미 상당한 밑그림과 세부 사항이 파악되었으므로 이상적인 최종 형태에 가까워지기에 작성하기도 읽기도 쉬운 문서 작성에 한 걸음 다가간 상태기 때문이다.

지금까지 일반적인 내용을 설명했는데, 위조된 문서의 구체적인 예가 없을까? 다행스럽게도 로버트 C. 마틴 큰 횽아가 작성한 '클린 코드'의 14장 '점진적인 개선'은 지금껏 B급 프로그래머가 봐 왔던 위조 문서 중에서 백미를 자랑한다. 일단 최종 형상을 보여준 다음에 원래 엉망인 코드로 돌아와 설계 관점에서 차근차근 개선하는 과정을 위조해서(!) 보여주는데, (앞서 피해야 한다고 말했던) '프로그램 제작 과정'을 따르면서도 (최종 목적인) '프로그램 이해를 도와주는' 놀라운 업적을 달성했다. 이렇게 된 이유를 생각해보니 설계 결정이 어떤 식으로 일어났고 그 결과 코드가 어떻게 변경되었는지를 유기적으로 설명하기 때문이다. 물론 일반적인 프로젝트 진행 과정에서 (감히?) 이런 파격적인 방식으로는 문서 작성이 힘들겠지만, 디자인 관련 결정을 이상적인 방식으로 기술하는 좋은 본보기가 되므로 꼭 읽어보기 바란다. 다음으로 소개할 예는 The Architecture of Open Source Applications Vol I, II(AOSA라 약칭하겠다)다. 오픈 소스 아키텍처를 설명하는 내용으로 이미 많은 분들께서 알고 계신 이 책은 프로젝트가 흘러온 역사, 아키텍처의 선택 이유, 프로젝트에서 변경을 결정한 이유, 진행 과정에서 배운 교훈을 비교적 이상적인 프로세스에 가깝게 기술한 훌륭한 사례 연구를 담고 있다. 물론 프로젝트가 어느 정도 진행된 다음 기술된 사후해석으로 취급해 가치를 인정하지 않는 분들도 계시겠지만, 소프트웨어 큰 그림을 이해하기 위해 필요한 구성 요소가 무엇인지를 잘 드러내고 있으므로 아키텍처 문서가 어떻게 되어야 하는지 궁금하신 분들께서는 반드시 읽어보시기 바란다(실제로 오픈소스 프로젝트 문서에서도 점점 AOSA의 해당 내용을 언급하는 경우가 많아지고 있다. 그만큼 도움이 된다는 말이다).

결론: 개발자들이 합심해 죄책감없이 _뻔뻔_하게 문서를 이상적인 형태로 위조(!)함으로써 우리 시대 가장 골치 아픈 문제 중 하나인 문서화 작업을 즐겁고 생산적으로 바꿔놓을 수 있다면 얼마나 좋을까? 이와 관련해 다른 좋은 방법이나 의견 있으면 언제든지 알려주시기 바란다. 정말 바라건데, 좋은 아이디어는 함께 공유합시다.

EOB

토요일, 8월 24, 2013

[독서광] 마이바티스 프로그래밍

지난번에 소개드린 [독서광] 데이터 접근 패턴과 같은 부류의 책 말고 실제 현장에 바로 적용 가능한 책을 원하는 독자분들이 분명히 존재한다. 오늘은 바로 이런 목적에 부합하는 마이바티스 관련 국내서(번역서가 아니다)인 '마이바티스 프로그래밍'을 소개해드리겠다.

먼저 마이바티스가 뭔지부터 잠깐 설명하고 넘어갈 필요가 있다. 마이바티스는 객체지향 애플리케이션을 작성할 때 관계형 데이터베이스를 손쉽게 사용하게 만드는 자료 매퍼 프레임워크라고 보면 된다. 하지만 프로그래밍에 앞서 관계형 테이블을 설계하고 SQL 구문을 작성한다는 측면에서 마이바티스는 단순히 하단 데이터베이스를 영속적인 객체 저장소로 보는 전통적인 ORM과 차이를 보인다. 실수를 유발하기 딱 좋은 엄청난 중복/반복 코딩으로 악명 높은 JDBC를 쉽게 사용하게 만들어주는 도구라 볼 수도 있겠다. 마이바티스는 SQL을 기반으로 출발하다보니 개발자들이 쉽고 빨리 기술을 배우고 적용할 수 있는 장점이 존재한다. 또한 관계형 자료를 객체로 인출하고 객체를 관계형 자료 형태로 저장할 수 있으므로, 도메인에 밀접한 프로그래밍 논리를 구현하기가 수월하다는 장점도 있다. 비즈니스 논리와 질의를 분리해서 얻는 장점은 여기서 다시 한번 설명하지는 않겠다.

자 이제 본격적으로 책 내용을 살펴보자. 이 책은 초중급자를 대상으로 필요한 개발 환경 구축부터 마이바티스의 기본 동작 방식과 활용법을 차근차근 단계적으로 설명한다. 실습이 가능하게 이클립스에서 바로 사용 가능한 예제 코드까지 홈 페이지에서 제공하고 있기에 테스트용 MySQL만 설정하면 바로 동작 과정을 확인할 수 있다. JDBC에 익숙한 개발자들이 마이바티스로 쉽게 넘어가게 CRUD 관련 코드를 JDBC 버전과 마이바티스 버전 양쪽으로 구현해놓았으므로 비교하면서 읽어보면 빠르게 부트스트래핑이 가능하다. 이렇게 감을 잡게 만든 다음, 웹 애플리케이션과 스프링 웹 애플리케이션 작성 방법을 설명해 마이바티스를 웹 애플리케이션 기반 프레임워크로 활용하도록 도와준다. 마지막으로 중급자를 위해 마이바티스 설정 파일, 매퍼 XML/인터페이스, 동적 SQL, 제네레이터를 참조 가능한 형태로 정리한다. 또한 (여러 가지 이유로) 기존 아이바티스에서 아직 벗어나지 못하는 개발자를 위해 아이바티스와 마이바티스의 차이점과 이주 방식에 대해 본문과 부록에서 설명하고 있으므로, 아직도 아이바티스를 사용하는 분들이 계시다면, 이 책을 읽고 마이바티스로 넘어가면 좋겠다는 생각을 해봤다. 마이바티스의 완성도가 상당히 높으므로 정말 불가피한 상황이 아닌 이상 굳이 레거시의 저주에 발목 잡힐 이유는 없다는 생각이다.

책을 읽다보니 아쉬운 점이 하나 있는데, 스프링 연동 설명이 생각보다 약했다. 물론 스프링이 워낙 복잡하니 정말 제대로 하려면 토비의 스프링과 같은 책을 읽어야 하는 상황이 정상이긴 하지만, 국내 개발자들이 스프링과 마이바티스를 하나로 묶어 개발을 진행하는 경우가 많으므로 혹시 후속 작품을 기획한다면 아예 제목부터 '마이바티스와 스프링 프로그래밍'으로 근사하게 하나 뽑은 다음에 핵심만 파고들면 더할 나위가 없겠다.

결론: 이미 눈치챘겠지만 책 목차와 전개 방식이 (늘 바쁘고, 핵심을 원하고, 바로 감을 잡게 만들어주는 뭔가를 요구하는...) 전형적인 한국 개발자를 위해 최적화되어 있으므로 국내서의 장점을 아주 잘 살렸다고 칭찬해주고 싶다. 마이바티스 책 한 권만 골라라고 하면 주저없이 이 책을 선택하겠다.

EOB

금요일, 8월 23, 2013

[B급 프로그래머] (2) 소프트웨어 설계 "프로세스"가 항상 이상화된 형태인 이유는?

지난번 올려드린 [B급 프로그래머] 소프트웨어 설계 "프로세스"가 항상 이상화된 형태인 이유는?라는 글에 많은 독자분들께서 관심을 보여주셨다. 따라서, 원래 2회로 예정했던 계획을 변경해 3회로 늘이기로 마음 먹었다(쪽대본 아니에요!). 오늘은 지난번 심각한 문제점에도 불구하고 이상적인 프로세스를 기술해야 하는 이유에 대해 파나스 형님께서 쓴 글의 III번 항목을 번역해봤다.

위에서 언급한 내용(이상적인 프로세스의 비현실성)은 아주 명백하며, 주의 깊은 사고가에게 잘 알려져 있으며, 정직한 사람들이라면 수긍할 것입니다. 그럼에도 불구하고 소프트웨어 설계 프로세스, 소프트웨어 설계 방법론을 다루는 워킹 그룹, 소프트웨어 설계를 논리적인 방법으로 기술하는 (이윤이 많이 남는) 각종 교육 과정에서는 늘 이상화된 프로세스를 주제로 삼습니다. 이런 사람들이 성취하려는 목표가 무엇일까요? 이상적이긴 하지만 완전히 달성할 수 없는 프로세스를 파악했다면, 최대한 비슷하게 이상적인 프로세스를 따를 수 있으며 그 결과 이상적인 프로세스를 따를 경우 만들 수 있어야 했던 문서를 작성할 수 있습니다. 이런 활동을 '이상적인 설계 프로세스를 위조(fake)하기'라 부릅니다. 이런 위조 기법이 필요한 이유를 정리하면 다음과 같습니다.
  1. 설계자들은 지침이 필요합니다. 큰 프로젝트를 맡았다면, 엄청난 작업 분량에 쉽게 압도 당합니다. 무엇을 먼저해야 할지 확실하지 않습니다. 이상적인 프로세스를 제대로 이해하면, 프로젝트 진행 방식을 알 수 있습니다.
  2. 주먹구구식 임시 변통 대신 프로세스를 따르려 노력할 경우 이상적인 설계에 좀더 가까이 다가갈 것입니다. 예를 들어, 심지어 이상적인 시스템을 설계하기에 필요한 모든 사실을 모를 경우에도, 코딩에 앞서 이런 사실을 찾으려는 노력은 설계를 더 좋게 만들고 재작업을 줄일 것입니다.
  3. 조직이 여러 소프트웨어 프로젝트를 수행할 때, 표준화된 절차는 큰 장점입니다. 여러 프로젝트 사이에서 좋은 설계 검토를 비롯해, 사람, 아이디어, 소프트웨어 공유를 원활하게 만듭니다. 표준화된 프로세스를 명세할 경우, 이상적이어야 한다는 사실은 합리적으로 보입니다.
  4. 이상적인 프로세스에 동의했다면, 프로젝트를 만들어가는 프로세스를 측정하기가 더 쉬워집니다. 이상적인 프로세스가 요청하는 내용과 비교해 프로세스의 산출물을 비교할 수 있습니다. 어느 부분에서 뒤쳐졌는지 앞섰는지 알 수 있습니다.
  5. 외부에서 프로젝트 진행을 주기적으로 검토하는 관례는 좋은 관리에 있어 핵심입니다. 프로젝트가 표준 프로세스를 따르려 시도한다면, 검토도 쉬워집니다.

지난번 글을 읽고 나서 이번 글을 읽으면 갑자기 멘붕이 올 것이다. 분명히 이상화된 프로세스는 현실적이지 않다고 말했는데, 그래도 이상적인 프로세스를 추구해야 한다는 모순된 이야기가 나온다. 너무 고민하지 마시라. 여기서 핵심은 바로 '위조(fake)'니까. 위조를 사전에서 찾아보면 '어떤 물건을 속일 목적으로 꾸며 진짜처럼 만듦.'이라 나온다. 코드 작성 과정에서 초롱초롱한 눈망울로 모니터 속에 들어갈 기세로 집중하는 개발자들이 문서를 작성하기만 하면 동공이 풀리고 어깨가 축 늘어지고 줄담배를 피고 웹 서핑을 하며 머리카락을 쥐어 뜯는 이유는 늘 진실되게 대화하는 컴퓨터 프로그래밍 언어와 달리 능숙한 위조를 요구하는 사람 언어로 뭔가를 작성해야 하기 때문이다. 레지스터 값 하나에 목숨을 거는 개발자들에게 위조는 고문 그 자체다. T_T 하지만, 문서를 보는 주체는 컴퓨터가 아니라 사람이므로 당연히 사람에 맞춰야 하며(빌어먹을 인문학!!!!!), 이 과정에서 이상과 현실 사이에 심각한 괴리가 생기기 마련이다.

자 그렇다면 우리가 위조해야 하는 이상화된 형태의 소프트웨어 설계 "프로세스"가 무엇일까? 파나스 큰 형님이 초지 일관 주장하는 모듈화와 관련이 깊다. 요약하자면 요구 사항 명세, 모듈 구조 설계와 문서화, 모듈 인터페이스 설계와 문서화, 'uses' 계층 설계와 문서화, 모듈 내부 구조 설계와 문서화, 프로그램 작성, 유지 보수 순을 따른다. 세부 사항을 여기서 설명할 경우 큰 주제를 흐릴 가능성이 높으므로 다음에 기회가 닿으면 하나씩 소개하기로 하겠다.

여기까지 글을 적고 허무하게 끝내버리면 "사람 약 올리냐!"라고 민원이 빗발칠게 뻔하므로, 다음에 올려드릴 마지막 글에서는 불쌍한 개발자들을 위해 이상화된 설계 문서를 _쉽고 제대로_ '위조'하는 방법을 (지금까지 경험을 곁들여) 정리하겠다.

EOB

토요일, 8월 17, 2013

[일상다반사] 파워포인트 협업 도구인 Kivo

(이미지는 Kivo (YC S13) uses git to make collaborating on documents easier, starting with PowerPoint에서 가져왔습니다)

지난번 [일상다반사] Schemer: 소셜 TO-DO 리스트를 소개드리면서 아이디어를 떠올리기만 하고 실행에 옮기지 못했던 사례를 들었는데, 독자 여러분들께서 많은 관심을 보여주셨기에 오늘도 이야기 보따리를 하나 풀어놓으려 한다. 역시 작년 초에 회사에서 브레인스토밍을 하다 완전 엉뚱한 서비스를 하나 제안한 적이 있었다. 간략하게 소개하자면, 사람들이 만들어내는 문서의 유사도를 계산해 관련된 문서를 클러스터링하고 차이점 등을 보여주는 서비스였다. 예를 들어, 사내 컴퓨터 여러 대에 'Super프로젝트_제안서_2013_08_15.pptx", 'Super프로젝트_제안서_2013_08_16.pptx", 'Super프로젝트_제안서_2013_08_17.pptx"라는 문서가 흩어져 있으면 이를 자동으로 감지해 "Super프로젝트_제안서"라는 범주를 만들고 여기에 파일 세 개를 집어넣어 연관된 문서나 관련된 문서를 쉽게 찾고 버전을 추적하게 지원하는 도우미라 보면 되겠다. 여기서는 파일 이름의 첫부분이 모두 유사하므로 수동으로도 관리할 수 있다고 생각할지 모르겠지만, 그냥 "프로젝트_제안서.pptx"라고 이름을 붙이거나 앞에 작성자 명을 추가해 "jrogue_프로젝트_제안서_2013_08_15.pptx"라 붙일 경우에도 자동으로 파일들을 연관지을 수 있다면 대박이 아닐까 생각했다. 이번에는 진전이 있어 메타 정보를 뽑아내어 데이터베이스화하고, subversion을 사용해 버전 관리를 하는 아이디어까지 도출되었으나 역시... 상품화의 길은 멀고도 험난하다는 진리만 깨닫고 말았다.

그런데... Kivo라는 서비스를 보고 나서 '아차!'하는 생각이 들었다. 역시 내가 생각하면 남들은 서비스를 한다는 진리가 다시 한번 증명되는 순간이었다. Kivo는 파워포인트 플러그인 형태로 사용자가 특정 문서에 대해 변경한 내용을 git에 올린 다음 이를 남들과 공유하게 만드는 기능을 제공한다. 어차피 협업이 가능한 구글 docs가 있지 않느냐고 반문할지도 모르겠는데, 둘은 작업 흐름이 다르다. 솔직히 제안서 등을 작성할 때, 수십 명이 달라붙어 실시간으로 문서를 편집하지는 않는다(그랬다가는 지옥문이 열릴테니까). 특정 부분을 맡은 사람이 문서를 조각 내어 작성하고, 나중에 취합한 다음에는 일부 관련자들만 공동 작업을 번갈아가며 하게 된다. 하지만 우리가 소스 코드 관리 시스템에서 늘상 목격하는 편리한 작업 이력과 변경 내용 확인 기능을 사용할 수 없으므로 여기저기서 실수/재작업/일부 내용 누락과 같은 문제가 터져나오기 마련이다. Kivo는 파워포인트 페이지 단위로 변경된 이력을 git로 관리해 일목요연하게 보여주며 필요하다면 각 페이지 별로 다른 이력을 적용해(git의 cherry picking 기능이 떠올랐다) 문서를 꾸밀 수도 있다.

물론 아직 제한점이 많다. 현재 파워포인트만 지원하며, 오피스 2007/2010 버전에서만 동작한다(2013 버전에서는 제대로 동작하지 않음을 확인했다). 또한 아직 매킨토시 버전은 출시되지 않았다(조만간 베타 버전이 나올 것 같긴 하다). 워드 버전은 개발 중이라고 하는데, 페이지 단위로 명확하게 변경 내용을 확인할 수 있는 파워포인트와는 달리 목차를 기준으로 변경 내용을 보여줘야 하는 관계상(그렇지 않으면 폰트 크기만 아주 사알짝 변경해도 재앙이 벌어진다. T_T) 구현이 그렇게 쉽지는 않아 보인다. 엑셀 같은 경우에는 보여주는 내용 뿐만 아니라 매크로 등 변경 내용이 더욱 중요하므로 구현 자체가 불가능할지도 모르겠다는 생각도 든다. 하지만 이런 여러 가지 제약에도 불구하고 Kivo의 잠재력은 충분히 커 보인다. 지금까지 DMS(Document Management System)나 KMS(Knowledge Management System)에서는 문서를 다룰 때 문서 전체를 하나의 엔티티로 취급했기에 조밀도가 떨어지고, 위키와 같은 시스템에서는 문서 내부의 변경 내역을 확인하도록 이력 관리를 해주므로 조밀도는 높으나 외부로 공개할 경우 참으로 난감한 상황(Confluence와 같은 기업용 위키조차도 PDF나 doc/docx로 export하는 기능은 낙제에 가깝다)이 벌어지므로 뭔가 다른 획기적인 해법이 필요하다는 사실은 누구나 공감하고 있기 때문이다.

사업적인 측면에서 보면, github나 bitbucket등의 대성공과 마찬가지로 외부로 유출되면 곤란한 기업의 핵심 기밀 문서가 아닌 일반적인 문서인 경우 호스팅 서비스로도 충분한 위력을 발휘할 가능성이 아주 높다. 백업, 이력 관리, 협업, 클라우드 저장소와 같은 핫한 키워드가 모두 따라다니는 데다 마이크로소프트 오피스라는 현존하는 전세계에서 가장 막강한 문서 관리 기반 구조를 등에 업고 있기 때문이다. 오히려 어떤 면에서 오피스 365보다 더 희망적이라는 생각도 해본다. 마이크로소프트가 M&A를 할지도... ㅋㅋ 아직 무료로 서비스하는 상태라 혹시 오피스 2007이나 2010를 사용하는 분들께서 한번 실험해보시기 바란다.

EOB

금요일, 8월 16, 2013

[일상다반사] '해커스' 출간 소식

여러분들께서 기대하고 고대하던 블록버스터인 Hackers: Heroes of the Computer Revolution - 25th Anniversary Edition 번역서인 '해커스'가 곧 출간된다는 기쁜 소식을 전해드리겠다. 아시는 분은 다 아시겠지만, 한국에서도 1991년 '해커'(상/하), 1996년 '해커 그 광기와 비밀의 기록'이라는 이름으로 이미 두 차례 출간된 적이 있는 이 책은 25주년을 기념해 오라일리에서 새로 출간함으로써 한국에서도 복간의 기회를 얻게 되었다. 거의 500페이지에 달하는 분량(물론 본문에 코드는 단 한 줄도 없다 T_T) 때문에 번역과 편집 시간이 오래 걸린 점을 각별히 양해 부탁드리겠다.

몇 가지 뒷 이야기를 정리해 보겠다. 1970~80년대 캘리포니아를 배경으로 하니 너무나도 당연하겠지만, 19금 수준의 자유분방한 이야기(전사적으로 술판 벌이고, 약빨고, 감옥가고, 포르노 게임 만들고, ... T_T)가 제법 나오지만... 무삭제를 원칙으로 문장 하나 시 한 줄 빼먹지 않고 꼼꼼하게 번역했다. 또한 8비트 컴퓨터는 물론이고 플로피 디스크조차 주변에서 찾기 어려운 관계상, 새로 이 책을 접하는 독자 여러분의 이해를 돕기 위해 본문 곳곳에 편집팀의 도움을 받아 사진과 그림을 추가했다. 마지막으로 옛날 이야기가 너무 옛날 이야기처럼 느껴지지 않도록 역사성과 정확성을 희생하지 않는 범위 내에서 최대한 현대적인 감각으로 번역했으므로(이를 위해 20년전과 15년전에 출간된 기존 번역서는 참고 목적으로도 들여다보지 않았다), 신세대 개발자 여러분들도 무리 없이 읽을 수 있으리라 믿는다.

최근 한국에서 IT 관련해 여러 가지 담론들(인문학, 통섭, 창의력, 조기 교육)이 튀어나오고 있지만, 이 책을 읽는 순간 하나같이 부질없는 허상이라는 사실을 깨닫게 될 것이다. IT 인력을 양성(응?)해 경제 발전(!)에 기여하자는 거창한 구호를 듣고 있으려니, 컴퓨터 세상을 직접 지배하고, 자기 손으로 뭔가를 만들고, 너무나도 재미있어 몰입하고, 남과 함께 공유하는 _자발적인_ 해커 정신이 더더욱 귀중하게 느껴진다. 요즘 너무나도 자연스럽게 세상에 침투한 오픈 소스는 결코 공짜로 얻어진 것이 아니다. 바로 다음과 같은 구호를 부르짓은 선구자 해커들의 투쟁에 의해 얻어진 것이다.

프로그램은 최대한 노출되어야 한다. 왜냐하면 정보는 자유로워야 하며 가속화된 정보의 흐름은 세상을 개선하니까!

무더운 여름, 독자 여러분들도 잠시나마 시원한 해커 세상으로 몰입할 준비가 되었는지? 이미 온라인 서점에서는 예판에 돌입했으니 그동안 절판된 책을 찾아 다니느라 고생하신 분들께서는 지금 바로 뽐뿌질 당하시기 바란다. :)

보너스: 빈꿈님께서 그려주신 삽화

업데이트: 드디어 출간되었습니다. 따끈따끈한 인증샷 추가.

EOB

화요일, 8월 13, 2013

[B급 프로그래머] 소프트웨어 설계 "프로세스"가 항상 이상화된 형태인 이유는?

그 동안 불꽃튀는 논쟁이 벌어질만한 내용은 언급을 자제했으나... 무더운 여름을 날려버리기 위해 오늘은 조금 도발적인 주제를 다뤄보도록 하겠다. 파나스 큰 형님이 쓰신 논문인 A RATIONAL DESIGN PROCESS: HOW AND WHY TO FAKE IT 의 II번 항목을 번역해봤다.

우리는 "이성적인" 방식으로 전개되는 소프트웨어 프로젝트를 결코 보지 못할 것입니다. 몇 가지 이유를 정리하면 다음과 같습니다.

  1. 대부분 소프트웨어 시스템 제작을 의뢰하는 사람들은 정확히 무엇을 원하는지 모르며, 자신들이 알고 있는 내용을 우리에게 말해줄 능력이 부족합니다.
  2. 심지어 우리가 요구 사항을 알았다 하더라도, 소프트웨어 설계에 필요한 다른 사항이 존재합니다. 이런 세부 사항은 구현을 진행하는 과정에서만 알게 됩니다. 이렇게 알게된 몇몇 지식은 설계를 무효로 만들어버리므로 설계 단계로 거슬러 올라가야합니다. 잃어버린 작업량을 최소로 줄이려 시도하기에, 결과로 만들어진 설계는 이성적인 설계 프로세스에서 나온 결과와는 거리가 멉니다.
  3. 시작하기 전에 모든 관련 사항을 알고 있다하더라도, 경험에 따르면 우리 인간은 올바른 시스템을 설계하고 만들기 위해 반드시 고려해야 하는 엄청난 세부 사항을 완전히 이해할 수 없습니다. 소프트웨어 설계 프로세스는 고려 사항을 분리함으로써 관리 가능한 정보를 사용해 작업하는 과정입니다. 하지만 고려 사항을 분리할 때까지 우리는 필연적으로 오류를 만들어내기 마련입니다.
  4. 심지어 필요한 모든 세부 사항을 마스터할 수 있다하더라도 가장 하찮은 프로젝트조차도 외부 원인에 의해 변경될 운명에 처합니다. 몇몇 변경은 직전 설계 결정을 무효로 만듭니다. 이런 결과로 만들어진 설계는 이성적인 설계 프로세스가 생성한 설계와 거리가 멉니다.
  5. 사람의 오류는 사람이 개입되지 않아야 피할 수 있습니다. 심지어 고려 사항을 분리한 다음에도 오류가 발생합니다.
  6. 우리는 종종 사전에 형성된 설계 아이디어 때문에 부담을 느낍니다. 우리가 고안했던 아이디어, 관련된 프로젝트에서 얻은 아이디어, 수업 시간에 들은 아이디어 말입니다. 종종 좋아하는 아이디어를 사용하거나 시도하려 프로젝트를 맡기도 합니다. 이런 아이디어는 요구 사항에서 이성적인 설계 프로세스를 사용해 유도되지 않았을지도 모릅니다.
  7. 종종 경제적인 이유 때문에 다른 프로젝트를 위해 개발한 소프트웨어를 사용하도록 장려합니다. 어떤 상황에서는 진행 중인 다른 프로젝트와 소프트웨어를 공유하도록 장려하기도 합니다. 이런 결과로 만들어진 소프트웨어는 양쪽 프로젝트 어디를 봐도 이성적인 소프트웨어가 아닙니다. 즉, 요구 사항 자체를 기반으로 개발한 소프트웨어가 아니며, 노력을 줄일 목적으로 고만고만하게 만든 소프트웨어입니다.

이런 이유 때문에, 소프트웨어 설계자가 요구 사항으로부터 이성적이고 오류가 없는 방식으로 설계한 그림은 엄청나게 비현실적입니다. 어느 시스템도 이런 이성적인 방식으로 개발되지 않았으며, 아마도 앞으로도 이런 일은 생기지 않을 것입니다. 심지어 교과서나 논문에 나온 작은 프로그램 개발조차도 비현실적입니다. 교과서나 논문에 나온 프로그램은 개선되고 수정되는 과정을 거치면서 저자들이 바라는 바를 보여주지 실제 일어난 과정을 보여주지는 않습니다.

여러분이 진행 중인 소프트웨어 개발 과정을 잠시 상상해보자. 애자일 개발 방법을 논하지 않더라도 고객 요구 사항을 수집하고, 스펙을 만들고, 아키텍처 설계를 마치고, 세부 설계에 들어간 다음 불꽃 코딩을 거치면 위대한 결과물이 톡 튀어 나온다고 생각하는 개발자는 그렇게 많지 않을 것이다. 하지만 구현에 앞서 문서(스펙, 아키텍처, 세부 설계, 뭐든 좋다)를 열과 성을 다해 제대로 작성하지 않았기에 소프트웨어가 엉망진창으로 나온다는 희한한(응?) 주장에는 딱히 반박하지 못했을 것이다. 하지만 정말 그럴까? 우리는 소프트웨어 개발에 앞서 이성적이고 완벽한 문서가 짜잔하고 만들어질 수 있느냐를 놓고 고민할 필요가 있다. 이런 고민이 필요한 이유는 간단하다. 개발자들이 처음부터 완벽한(아니 이성적인) 문서를 만들지 못했다는 죄책감에서 벗어나야 하기 때문이다. 처음부터 완벽한 소프트웨어가 없듯이 처음부터 완벽한 문서도 없다. 그렇다면 이런 상황에서 어떻게 문서를 만들어야 할까? 다음 번에 파나스 큰 형님의 조언을 정리해드리겠다. 조금만 기다리시라. :)

주의: "용감한 프로그래머에게 설계 따윈 필요없으니 코딩으로 바로 뛰어들자!"라는 주장이 아님을 노파심에서 다시 한번 강조한다.

EOB

토요일, 8월 10, 2013

[독서광] 데이터 접근 패턴

요즘 워낙 많은 책(한국어판, 원서)을 동시에 읽고 있다보니 서평이 뜸했었다. 오늘은 간만에 설계 관련 책을 하나 소개해드리려고 하는데, "데이터베이스와 효율적으로 상호작용하는 25가지 소프트웨어 디자인 패턴"이라는 긴 부제가 붙은 '데이터 접근 패턴'이 주인공이다. 주의 사항을 몇 가지 짚고 넘어가자. 이 책은 2003년도에 원서가 출간되었고 번역서가 2013년에 출간되었기에 10년이라는 공백이 존재한다. 따라서 아주 새롭고 신기한 신기술은 다루지 않는다는 사실을 반드시 인지해야 한다. 또한 요즘 나오는 마이바티스 등 각종 데이터베이스 프레임워크와 ORM과 같은 기술을 소개하지도 않으며, 순수하게 JDBC만으로 모든 예제를 설명하기에 착오없으시기 바란다. 마지막으로 철저하게 관계형 데이터베이스를 중심으로 설명이 진행되므로(일례로 5부는 트랜잭션과 잠금에 대한 내용을 중심으로 구성되어 있다) 요즘 유행하는 NoSQL 관련 내용을 기대하면 안 된다. 이 책을 읽기 위해서는 자바와 JDBC 프로그래밍 기술, 관계형 데이터베이스에 대한 기초 지식, 그리고 (필수는 아니지만) 패턴에 대한 기본적인 이해가 필요하다.

이 책 목차를 보면 1부 '분리 패턴'에서는 데이터 접근 코드와 비즈니스 논리를 구분하는 방법을 소개한다. 2부 '리소스 패턴'에서는 데이터베이스 프로그램에서 사용하는 여러 가지 리소스를 격리하는 방법을 소개한다. 3부 '입출력 패턴'에서는 관계형 데이터의 물리 형태와 도메인 객체 표현을 분리하는 방법으로 데이터 입출력 연산을 단순화하는 방법을 소개한다. 4부 '캐시 패턴'에서는 물리적인 데이터베이스 접근을 최소화하는 다양한 캐시 전략과 구성 요소를 설명한다. 마지막으로 5부 '동시 실행 패턴'에서는 동시에 데이터에 접근이 일어날 경우 발생하는 문제점을 해결하기 위해 트랜잭션과 잠금을 설명한다. 목차를 보면 알겠지만 요즘 나오는 데이터베이스 프레임워크가 여러분을 위해 뒤에서 열심히 서비스하는 내용을 어떤 이론에 기반해 어떻게 설계하고 구현할지를 다룬다고 보면 틀림없겠다. 물론 어디까지나 설명을 위한 설계와 예제이므로 실전에서는 한계가 분명히 존재하며, 이 책에 나온 코드를 그대로 사용할 수 있으리라는 기대는 접기 바란다.

그렇다면 이 책은 어떤 독자를 대상으로 할까? 우선 기본 데이터베이스 프레임워크를 분석하거나 아예 필요에 딱 맞춰 새로 만들려는 개발자들이 참고할만하다. (어차피 이런 부류의 경쟁서가 아예 없으므로) 완벽하지는 않지만 출발점으로는 좋아보인다. 다음으로 데이터베이스를 많이 다루는 엔터프라이즈 애플리케이션 설계에 관심이 있는 설계자들이 참고할만하다. 특히 캐시 패턴과 동시 실행 패턴은 기초 이론에 대한 설명과 실제 예제가 함께 등장하므로 구체적인 기반 위에서 설계를 진행할 수 있게 도와준다. 마지막으로 (어떤 사정상) 어쩔 수 없이... JDBC 만으로 프로그램을 만드는 프로그래머에게 도움을 준다. "요즘 누가 JDBC로 날 코딩을 하지?"라고 의문이 생기는 분들도 계시겠지만... 뭐 사정상 필요한 경우가 있기 마련이다(예: B급 프로그래머. T_T).

번역 상태를 보자. 이런 부류의 서적에서 필연적으로 다가오는 '용어' 문제는 누가 번역하더라도 풀지 못할 난제이므로 책의 가장 뒷편에 나오는 용어 정리 항목을 먼저 읽어 머리 속에 한글단어-영어단어-개념이라는 해시맵을 만들고 나서 시작해야 할 것이다. 만일 이런 indirection 과정을 참지 못하거나 용어에 민감해 신경질이 나는 독자라면 번역서 대신 원서를 강력하게 추천한다. 비문이 조금씩 눈에 띄고 직역이 많긴 하지만 다행스럽게도 이해하는 과정에서 큰 어려움은 없었다. 코드에 잘못된 문자가 들어가거나 띄어쓰기가 이상하거나 하는 경우가 있긴 했지만, 실시간으로 고쳐서 읽을 수 있는 수준이었다. 시간 절약을 위해 원서 대신 번역서를 읽어도 무방하다는 생각이다.

결론: 아주 새로운 내용은 없지만 기초를 잘 설명하고 있으므로 데이터베이스 애플리케이션과 관련해 설계와 구현에 관심이 있는 독자분께 추천드린다.

EOB

화요일, 8월 06, 2013

[일상다반사] Schemer: 소셜 TO-DO 리스트

작년 초인가 회사에서 브레인스토밍을 하다 완전 엉뚱한 서비스를 하나 제안한 적이 있었다. 간략하게 소개하자면, 일정표에 내가 뭔가를 기록하면 이에 따라 영감을 주는 다른 활동들이나 제안을 해주는 서비스였다. 예를 들어, '생일'이라 입력하면 선물 목록을 제시한다거나 '휴가'라 입력하면 가볼만한 곳을 알려주는 등 나름 인공 지능적인 특성으로 사용자의 의사 결정에 도움을 주는 비서라고 보면 되겠다. 하지만 늘 그렇듯 너무나도 막연한 아이디어라 현실로 옮기지는 못했다. 그리고는 바쁜 일상에 파묻혀 아이디어를 완전 잊어버리고 있었다.

그런데... 스키머라는 서비스를 보고 나서 '아차!'하는 생각이 들었다. 내가 생각한 내용을 이미 다른 사람이 만들고 있다고 생각하면 틀림없는데, 이번에도 이 법칙이 정확하게 맞아떨어진 순간이었다. 영어 사전에서 scheme을 찾아보면 '계획, 제도'라는 뜻이 있다. 딱 한 문장으로 요약하자면 스키머는 소셜 할 일 목록 정리기라고 보면 되는데, 기존의 다른 할 일 목록 서비스와 차별화하기 위해 구글 플러스와 연계해 남들이 하는 작업을 공유(응?)할 수 있게 만들어 놓았다. '소셜'과 '할 일 목록'이라는 어울리지 않는 두 단어를 보며 사생활 침해와 관련해 걱정이 들지도 모르겠는데, 이미 우리는 포스퀘어로 동선을 인터넷에 남기고 페북에 사진을 남기고 태깅을 하고 트위터로 별 시시콜콜한 이야기를 다 올리는 세상에 살고 있다. T_T

요렇게 설명하고 보니 도대체 무슨 서비스인지 감이 잘 오지 않을 것이다. 따라서 실제 예를 드는 편이 좋을 것 같다. 스킴은 크게 두 가지 방식으로 사용자의 할 일을 넛지해준다. 하나는 미리 정의된 태그로 식당, 영화, 책, 패션, TV, 요리, 휴가 등의 활동에 대해 다른 사람들이 무엇을 하는지 훔쳐(!)볼 수 있다. 다른 하나는 검색어를 입력해 다른 사람들이 많이 계획한 활동을 훔쳐볼 수 있다. 예를 들어, 영화를 보기 위해 'movie'라고 입력한 순간 다른 사람들이 입력한 내용이 목록으로 나온다. 여기서 선택하면 몇 명이 이 계획을 시작했는지, 몇 명이 성공리에 이 계획을 마무리했는지 숫자로 된 통계를 볼 수 있다. 해당 목록을 선택하면 시작한 무리에 속하게 되며, 계획을 마무리하고 나서 'done' 버튼을 콕 찍어주면 완료한 무리에 속하게 된다. 해당 계획이 얼마나 난이도가 높은지를 직접 확인할 수 있는 셈이다.

할 일 정하기와 검색 이외 나머지 다른 기능은 딱히 없다(아직까지는 나의 계획을 확인하고 남들이 성취한 업적을 보는 정도가 끝이다). 기능만 놓고 보면 별 거 아닌 서비스처럼 느껴질지도 모르겠지만 잠재력은 충분히 있어 보인다. 특히 사업 모델로 확장 가능한 플랫폼 형태라는 사실이 중요하다. 스키머에 처음 가입할 때 지역을 입력하라고 나오는데, 지역 기반 서비스와 연계하기 위한 기초 자료 수집으로 보인다. 이 정보를 이용해 'Pizza'라 입력했을 때 서비스 제휴를 맺은 가맹점의 전화나 위치가 할 일 목록에 나오거나 'Movie'라 입력했을 때 서비스 제휴를 맺은 근처 영화관 상영 시간표와 남은 좌석 수가 나오면 대박이 아닐 수 없다. 물론 아직 한국어 서비스는 지원하지 않으므로(지금은 한글로 계획을 입력할 경우 아무런 힌트도 주지 않는다) 적어도 한국에서는 머나먼 미래지만 미국에서는 현실이라고 보면 되겠다. 물론 장애물도 존재한다. 매번 상업 광고만 나올 경우 쉽게 식상해지므로 꾸준히 우연을 맛볼 수 있는 사용자의 집단 지성 풀이 구축되어야 하는데, 사용자가 많아야 광고(?)주가 붙으며, 광고주가 붙어야 체리피커들도 많아질테니 닭이 먼저냐 달걀이 먼저냐 하는 문제에 바로 부딪힐 것 같다.

스키머가 그저 그런 또 하나의 할 일 목록 서비스로 조용히 묻힐지 아니면 구글의 각종 서비스를 등에 업고 무럭무럭 커나갈지는 사용자의 참여 수준에 달린 것 같다. 하지만 기존 구글의 지나온 발자취를 보면 성공할 가능성이 아주 높아 보이지는 않는다.

EOB

토요일, 8월 03, 2013

[B급 프로그래머] hg/git 클라이언트인 SourceTree

예전에는 DVCS(분산 버전 관리 시스템)이 없는 세상에서 어떻게 개발을 진행했는지 모를 정도로 급속도로 git와 hg(mercurial)이 개발자들 사이에서 일반화되는 추세다. 물론 여전히 CVS나 subversion을 사용하시는 분들을 위해 얼른 DVCS의 세상을 접할 수 있도록 오늘은 SourceTree라는 무료(라이선스를 받기 위한 등록은 필요하다) 클라이언트를 하나 소개해드리겠다.

SourceTree는 기업용 위키인 Confluence와 기업용 이슈 추적 시스템인 JIRA로 유명한 Atlassian이 자사의 DVCS 호스팅 서비스인 Bitbucket과 자연스럽게 연동할 목적으로 배포한 git/hg 클라이언트다. 원래 맥OS X용만 있었는데, 윈도우로 이식되었기에 기존에 유명한 거북이(Tortoise) 시리즈를 사용하던 분들이라면 대체품으로 고려할만하다. Bitbucket을 사용하시는 분들이라면 clone할 때 다음 윈도우가 뜨는데 아래쪽 버튼(Clone in SourceTree)을 콕 누르면 바로 SourceTree를 사용해 클론 작업을 수행한다. 또한 git와 hg를 동시에 지원하기 때문에 git와 hg를 혼합해서 산출물을 관리해야 하는 프로젝트에서 특히 위력을 발휘한다.

원래 소스코드 관리 client는 개발자의 호불호가 확실히 갈리는 특성이 있어 사람마다 평가는 다르겠지만, 개인적으로는 만족하는 편이다. 기존 Tortoise의 셸 확장 방식을 선호하는 분들이라면 단독형으로 동작하는 SourceTree가 조금 불편하게 느껴질지도 모르겠다. 변경되었거나 새로 추가한 파일에 대한 관리는 큰 문제 없지만 전체 파일을 보면서 뭔가를 할 경우에는 답답할지도 모르겠다. 그리고 hg와 git를 사용자 인터페이스 변경 없이 함께 사용하려다보니 아무래도 기능이 적은 hg보다는 git 쪽이 완성도가 떨어지는 느낌이다(git에서는 복잡한 기능이 필요할 때 Terminal 버튼을 눌러 명령행에 의존해야 한다). 하지만 점차 개선되리라 믿는다.

SourceTree에서 개발자를 위해 마련한 선물 중에 가장 푸짐한 항목은 바로 git flow 지원이다(세부 설명은 A successful Git branching model한국어 번역을 참조하기 바란다). DVCS를 사용하다보면 브랜치 전략에 대해 고민을 하지 않을 수 없는데, 매번 바퀴를 발명하기가 곤란하니 개발자들이 아예 고정된 형태의 우수 사례를 수립하기 시작했고, 기능에 따른 브랜치와는 달리 개발/배포에 주안점을 둔 상위 단계의 브랜치 전략이 업계 표준으로 받아들여지기 시작했다. git flow는 브랜치마다 특정 역할을 할당하고 상호 작용하는 방식과 시점을 정의하며, 배포를 준비하고 관리하고 기록할 목적으로 개별 브랜치를 활용한다. 수작업으로 이런 정책을 따라가도 좋지만 반복적인 작업에 시간도 낭비되고 실수할 가능성도 높기 때문에 SourceTree에서는 아예 상단에 큼지막한 'Git Flow'라는 아이콘을 제공해 개발자가 손쉽게 git flow를 쫓아가도록 지원한다. 물론 SourceTree는 git flow의 자매품인 hg flow 기능도 제공하므로 git에 비해 상대적으로 브랜치 우수 사례가 정립되지 못한 hg 세상의 개발자들에게도 도움을 줄 것이다.

하지만 어디까지나 도구는 도구이므로, SourceTree를 사용한다고 해서 저절로 git나 hg의 복잡성이 해결되지는 않는다. 심지어 SourceTree와 hg에 익숙한 개발자들도 도구는 그대로 DVCS만 바뀐 git 세상에서는 매트릭트에서 기차역을 해매는 네오처럼 멘붕에 빠질 수 있으므로 기반 git 철학에 대해 파고들 필요가 있다. hg는 이미 [독서광] Mercurial: The Definitive Guide에서 소개를 드렸기에, 후속편으로 8월 중에는 git 서적 한 권을 소개해드리도록 하겠다.

결론: 지금까지 익숙했던 SVN는 잊어버리시고 hg가 되었든 git가 되었든 DVCS라는 신세계로 오시기 바랍니다. 지금까지 hg에 조금 익숙해질만 하니 다시 git로 넘어가느라 좌충우돌하고 있는 B급 프로그래머였습니다. ;)

EOB

화요일, 7월 30, 2013

[B급 프로그래머] "‘한국의 저커버그’가 양성되기 위한 조건"에 대한 불만

C|net Korea에 올라온 ‘한국의 저커버그’가 양성되기 위한 조건을 읽다보니 글쓴이는 소프트웨어 개발자를 은근슬쩍 이류 시민으로 디스하는 듯하다. 뭐 다른 내용은 그렇다치더라도 다음 내용은 전산학과 컴퓨터 공학에 대한 한국 사회의 인식을 대변한다고 볼 수 있겠다.

3. 커뮤니케이션 능력
일반 코더에게는 그렇게 높은 수준이 커뮤니케이션 능력이 요구되지 않지만 뛰어난 아키텍트가 되려면 상당히 중요한 능력이다. 대화능력, 듣기능력, 토론기술, 대인기술, 설득능력, 인내력 등이 필요하다. 이런 능력은 암기식 교육환경에서는 키워지기 어렵다. 어렸을 때부터 토론식 교육 환경이 필요하며 능력을 키우기 위해서 시간이 매우 오래 걸린다.

4. 문서 작성 능력
가독성이 뛰어난 문서를 작성하는 기술이다. 일반적인 쓰기 능력, 정보 조직화 기술 등이 필요하며 일반 코더들이 가장 부족한 능력 중 하나이다. 십 수년의 학교 교육을 통해서 기초를 다져야 하며 실전 개발을 통해서도 오랫동안 단련해야 향상되는 능력이다.

5. 컴퓨터, 소프트웨어 지식
소프트웨어 동작원리, 자료구조, 알고리즘, 개발언어 등 개발의 기초 지식이다. 대학의 소프트웨어 관련학과에서 주로 가르치는 것이고 단시간에 기초를 닦을 수 있고 독학도 가능하며 실전 개발을 통해서 꾸준히 습득하는 지식이다. 단기적이고 집중적인 학습이 가능하다.

6. 코딩 능력
누구나 아는 코딩 파워다. 일반 코더의 능력을 구분하는 기준이며 그 능력차이는 코더마다 천지차이다. 단기적인 교육이 가능하다. 우리나라 프로그래머들이 별로 떨어지지(지 않는) 능력이다.

7. 소프트웨어 공학 경험
소프트웨어를 빠르게 개발하기 위한 공학적인 지식과 경험이다. 소프트웨어 분석, 설계, 소스코드관리, 이슈관리, 테스트, 프로세스, 툴, 개발문화 등 광범위한 영역의 경험이 필요하다. 학교에서는 배우기가 거의 불가능하며 제대로 된 개발환경에서 실전 개발을 통해 배워야 하며 매우 오랜 시간이 걸린다.

위 내용에 따르면 커뮤니케이션 능력, 문서 작성 능력, 소프트웨어 공학 경험은 배우는 데 오랜 시간이 걸리고, 컴퓨터/소프트웨어 지식, 코딩 능력은 단기간에 학습이 가능하다고 했는데, 본인 생각 말고 객관적인 증거를 제시하면 어떨까 싶다. 3개월만 학습하면 아키텍처/운영체제/알고리즘 전문가가 되고 다시 3개월만 더 학습하면 C/Java 프로그램을 발로도 짤 수 있다면, 4년 동안 대학교에 다니며 학기말마다 밤새가며 프로젝트 끝낸다고 고생한 사람들은 도대체 어떻게 된거지? 열심히 일하는 프로그래머를 코더로 격하한 다음 부족한 능력을 '커뮤니케이션, 문서, 소프트웨어 공학 경험'으로 싸잡아 매도한다고 해서 과연 근본적인 문제가 해결될까? "넌(개발자) 불치병(커뮤니케이션, 문서 작성, 소프트웨어 공학 능력 부재)에 걸렸으니 이제 큰 일 났네?"라고 약올리는 경우랑 뭐가 다르지? 제발 바라건데, 메타 개발만 하지 말고 직접 훌륭한 소프트웨어 공학 도구를 개발해 오픈소스로 공개하거나 필요한 지식을 공유할 수 있게 알맹이 있는 책을 출간해 제발 불쌍한 우리 코더들 좀 구원해주시기 바란다.

다시 한번 러멜트 교수의 말을 인용하겠다. 실제 손에 쥘 수 있는 결과물을 만드는 개발자의 능력을 과소평가하지 마라. 그리고 코딩이 우습게 보일지도 모르겠는데 제대로 동작하는 깨끗한 코드를 작성하려면 엄청난 연습과 노력이 필요하다는 사실을 기억하라.

"당신이 멋진 자동차를 설계할 능력이 있다면, 내게서 전략을 배우는 데 며칠이면 충분하다. 하지만 아무리 전략으로 박사 논문을 쓴 사람이라도 자동차를 설계하려면 몇 년을 공부해도 어림 없을 것이다." - 리처드 러멜트(UCLA 전략학 교수)
EOB

토요일, 7월 27, 2013

[독서광] The Clean Coder

3년 전에 클린 코드: 애자일 소프트웨어 장인 정신이라는 아주 놀라운 책을 번역해서 선을 보였으나... 흥행에 참패한 기억이 아직도 새롭다. 오늘은 클린 코드 저자인 로버트 C. 마틴 큰 형님께서 자신을 재물로 삼아 후배들에게 큰 가르침을 주려 집필한 'The Clean Coder'를 소개해 올리겠다. 현재 한국어 판이 번역 중이라는 소식이 있는데, 더 이상 기다리지 못하고 그냥 영어로 읽어버렸다.

책 제목만 놓고 보면 클린 코드의 후속작처럼 보이는 이 책은 깨끗한 코드를 작성하는 _사람_에 초점을 맞춘다. 솔직히 클린 코드를 읽으며 "뭐 이렇게 독단적이고 자기 중심적인 똥고집이 있나!"라고 버럭했을 독자분들도 있을텐데, 여기에 대한 이유가 바로 'The Clean Coder'에 잘 설명되어 있다. 클린 코드를 집필한 다음 제작 과정과 배경 사상을 설명하는 감독판 보충 책으로 보면 틀림없다. '클린 코드'와는 달리 코드가 전혀 나오지 않기에 프로그래밍 관련 서적으로 착각하고 구입하면 바로 멘붕이 온다는 사실도 미리 알면 좋겠다.

아주 특이하게, 이 책은 목차에 'Pre-Requisite Introduction'라는 제목이 붙은 장이 존재한다. 로버트 C. 마틴 큰 형님이 지금까지 산전수전 공중전에 잠수함전까지 겪은 과정에서 망가진 경험을 초반부터 그야말로 격하게 풀어쓰기 때문에 마음이 여리신 분이라면 읽다가 덮어버릴지도 모르겠다. 하지만 이 부분은 뒤에 나오는 내용의 맥락을 제공하기 때문에 절대로 건너뛰어서는 안 된다. 일단 이렇게 철저하게 망가진 다음에 여기서 얻은 교훈을 소프트웨어 프로페셔널 관점에서 하나씩 풀어쓴 내용이 바로 본문이 된다. 서문에도 나오지만 이 책은 크게 다음과 같은 내용을 다루고 있다.

  • 소프트웨어 프로페셔널이란?
  • 프로페셔널은 어떻게 행동해야 할까?
  • 프로페셔널은 충돌, 빠듯한 일정, 비이성적인 관리자를 어떻게 다룰까?
  • 언제, 어떻게 프로페셔널은 '아니오'라고 단호하게 거절해야 하나?
  • 프로페셔널은 압력을 어떻게 다룰까?

그렇다. 이 책은 그냥 단순 샐러리맨이 아니라 자기 소신이 뚜렸하고 전문 지식을 갖춘 프로페셔널 소프트웨어 개발자의 행동강령을 정의한 책이다. 상사의 압력이나 주변의 동료 압력에 굴하지 않고 '아니오'라고 말할 때와 '예'라고 말할 때를 구분하고, 깔끔한 솜씨로 설계하고 코드를 작성하고, 업무가 아닌 자기 계발 관점에서 별도 시간을 확보해 기량을 갈고 닦고, 확실한 일 마무리 시점을 정하기 위한 수락 테스트를 진행하고, 습관처럼 테스트 주도 개발을 진행하고, 시간을 잘 관리하고, 예측을 확률로 다루고, 압력을 이겨내며, 동료 사이에 짝 프로그래밍 등 협업을 장려하면서도 자기 맡은 몫은 멋지게 해내는 '프로페셔널' 개발자가 될 수 있도록 마틴 횽아는 실용적인 조언을 아끼지 않는다.

안타깝게도 한국에서는 이 책이 흥행하기 어려워 보인다. 아파야 청춘이 된다는 둥 개인의 희생을 미화하고 약을 파는 힐링 서적이 판치는 상황에서 상사에게 감히 '아니오'라는 말을 누가 함부로 할 수 있을까? 특히 개발자의 프로페서녈한 특성을 인정해주지 않는 사회에서 이 책은 금서(자세한 이유는 직접 읽어보면 알게 된다)가 될 가능성이 아주 높다는 생각에 고개를 들어 하늘을 보니 먹구름이 가득하다. T_T 그럼에도 불구하고, 프로페셔널을 향한 집념으로 불타오르는 개발자라면 이 책에서 다양한 교훈을 얻을 것이다. 특히 개발자로서 어떻게 올바르게 살지 고민하는 분들께 강력 추천한다.

뱀다리: 본문 중 마틴 횽아가 기운이 빠지고 힘이 없을 때 짝 프로그래밍을 하면 힘이 샘솟는다는 재미있는 이야기가 나온다. 심지어 협업 장에서는 "Programming is all about working with people."이라는 결론을 내리기까지 한다. 이성 친구가 없어 혼자 '퍼시픽 림'을 본 개발자들이라도 컴퓨터 세상에서는 동료 프로그래머와 드리프트 신공을 펼쳐 짝 프로그래밍으로 4등급 하이젠버그를 때려 잡을 수 있으니(응?) 모두 기운냅시다! (T_T)

따끈한 새소식: 기존 출판사에서 절판 예정인 '클린 코드'를 인사이트 출판사에서 복간하기로 결정이 났다. 'The Clean Coder'를 읽고 나서 어떻게(how)가 궁금한 분들께서 편한 마음으로 읽어보실 수 있게, 현재 전반적인 검토 작업을 진행하는 중이다. 많은 성원 부탁드리겠다!

EOB

화요일, 7월 23, 2013

[독서광] 게임 독립 만세

원래 책을 다 읽기 전에는 서평을 올리지 않지만 아주 흥미로워보이는 책이 나와서 간략하게라도 소개하지 않을 수 없다. 오늘 주인공은 게임 독립 만세라는 제목이 붙은 '인디 게임 개발자 삽질 방지서'라는 부제가 붙으면 더욱 좋았을 책이다(실제 부제는 '그 전에 알아둬야 할 아주 많은 것들'이다).

맛보기로 3장까지 포함된 샘플을 내려받을 수 있는데, 큰 기대를 하지 않고 내려받아 읽어본 결과 3장까지만 봐도 아주 좋은 내용이 많이 나오므로 인디 게임 개발자가 되고 싶은 분들은 3만원을 투자해 삽질을 줄이면 정말 좋겠다는 생각이 들었다. 전자책은 DRM-free로 제공되므로 '(게임 세상과 마찬가지로) 불법 복제라는 강력한 적'으로 인해 살짝 걱정이 되긴 하지만 독립 출판이라는 측면과 더불어 새로운 지식 공유 채널을 정립한다는 시도 자체를 높이 평가할만하다.

저자의 주의 사항인 '내용의 신빙성은 거의 정확하지만, 그 방향성에 대해 편항적이거나 과격하다고 여기실 수 있습니다.'라는 문구는 이 책의 성격을 가장 잘 드러낸다고 볼 수 있다. 샘플을 읽어보니 바로 이런 주의 사항 때문에 책이 오히려 더 살아 있다는 느낌이 들었으니까 말이다. 피랴나가 득실거리는 현실에서 고리타분하게 추상적인 이야기나 말도 안 되는 이론 전개보다는 차라리 그냥 진흙탕을 그대로 보여주는 방식이 훨씬 더 가슴에 와닿기 때문이리라. 시작부터 '자영업은 항상 망한다'라는 주제를 다루니 뭐 이어지는 내용이 얼마나 현실을 잘 반영했는지는 굳이 여기서 중언부언할 필요가 없겠다. 그렇다고 암울한 현실만 나열하지는 않는다. 궁극의 해결책인 '뜨면 다 해결된다'를 읽으며 한참 웃었다. 하지만 "유명해지려면 유명하면 된다"는 유명한 교훈을 떠올리게 만드는 제목과는 달리 '뜨기 위해 장기간 퇴적물이 필요하다'는 정확한 지적에 뜨끔하긴 했지만 말이다.

인디 게임 개발자가 되고 싶은가? 그렇다면 아무런 장비 없이 정글에 바로 뛰어들지 말고 일단 이 책에서도 소개한 '자영업자 2명 중 1명 3년 내 망한다' 표를 100번 되새겨보고 오늘 소개한 이 책을 비롯해 지난번 소개드린 여러 좋은 책(예: 위대한 게임의 탄생)을 읽으며 철저한 준비와 함께 마음가짐을 다잡은 다음에 한 번 더 생각해보고 시작하기 바란다.

개인적인 바람 한 가지: 여러 가지 의미에서 이 책이 대박까지는 아니더라도 중박이 났으면 좋겠다.

EOB

토요일, 7월 20, 2013

[일상다반사] 3333 이벤트 당첨자 발표

기대하시고 고대하시던 3333 이벤트 당첨자를 발표해드리겠다. 아날로그 제비뽑기 방식으로 진행했으므로, 컴퓨터를 사용한 부정이 개입되었을리는 만무하고... 여튼 블로그 주인장을 믿어주시라!

응모하신 분은 총 24분이며, 그 중에서 영광의 당첨자 명단은 다음과 같다.

  • yon*msh@gm*.com님
  • book*kr@gm*.com님
  • chan*@gm*.com님
  • *aru@gm*.com님
  • jun*jin@gm*.com님

그리고 특별 격려상(블로그 주인장에 대한 _격려_ 내용이 우수해서 특별히 드리는 상)을 하나 만들어 보았다(이벤트 공지에 그런 이야기 전혀 없었다구? 주인장 마음이다. :P) 당첨자는 maf*@na*.com 님이며, 본문 내용 잠시 소개해드리겠다. 격려 말씀에 기운차려 더욱 열심히 블로그를 운영하리라 다짐한다.

책을 좋아하는 프로그래머.. 스스로를 'B급'이라 과감히 말할 수 있는 용기 & 당당함... 그런면이 좋아서 평소에 RSS를 통해 좋은 글을 접하고 있습니다. 이 자리를 빌어 감사의 말씀을 드립니다.

책 배송은 늦어도 7월 24일까지는 완료할 계획이므로 조금만 참고 기다려주시라.

이벤트 참가하신 모든 분들께 감사 말씀드리며, 앞으로도 계속해서 블로그 응원을 부탁드리겠다.

EOB

[독서광] Make Vol 6

Make Vol 6권이 나왔는데, 이런저런 정신 없는 상황으로 인해 깜빡 잊어먹고 있었다. T_T Vol 6은 '장난감과 게임'이라는 특별 주제를 중심으로 여러 가지 흥미로운 물건/실험을 소개하고 있다. 그 중에서 유달리 눈에 띈 제목은 바로 '딱딱 증기선'! 딱딱거리며 가는 증기선의 원리와 조립 방법을 보고 있으려니 어릴 때 촛불로 가는 보트를 보고 엄청나게 신기했던 기억에 새록새록 나기 시작했다. 그래서... 국내 토종 메이커들도 혹시 취미삼아 증기선을 만들어보지 않았을까 구글로 검색한 결과 대박 사이트를 하나 찾았기에 여기에 공유하지 않을 수 없다. ㅎㅎㅎ

(1)번부터 (3)번까지 읽어보시면 알겠지만, 셀토님의 엄청난 필력과 꼼꼼한 디테일에 화들짝 놀라고 말았다. Make 애독자 여러분들도 꼭 한번 읽어보시기 바란다.

다음으로 흥미로웠던 내용은 지난번 블로그에서도 소개한 [독서광] 마우스드라이버 크로니클을 연상하게 만드는 내용을 담은 '좋아하는 일로 먹고살기' 기사였다. 꺼저라 TV 범용 리모컨이라는 물건을 구상해서 제조하고 판매까지 한 경험을 딱 여섯 페이지로 압축했는데, 너무 재미있어서 여러 번 읽었다. 역시 구글로 관련 내용을 검색해보니 아예 DIY 킷 디자인 설명까지 있었다. 이 물건 들고 여기저기 돌아다니며 온갖 TV를 다 끄며 장난치는 상상을 해보니 잠시 즐거웠다(물론 잽싸게 도망치도록 평상시 달리기 연습을 해야겠지만...). 이 프로젝트를 기획한 미치 알트만의 말을 잠시 인용해본다.

좋아하는 일을 한다고 해서 반드시 돈을 벌 수 있는 것도, 그걸로 먹고 살 수 있는 것도 아닙니다. 하지만 좋아하는 일을 하지 않으면 아이디어는 꿈으로 남아 있을 수 밖에 없고, 그 꿈은 서서히 사라질지도 모릅니다.

이번 호를 보고 있으려니 어릴 때 과학 잡지 부록으로 딸려오던 여러 가지 재미있는 실험 키트(바람개비로 가는 자동차부터 비닐주머니에 담긴 물을 뿌리던 스프링쿨러까지...)가 불현듯 생각났다. 그런 의미에서 올 하반기(정확하게 말하자면 8월 1일)에 출시될 강력한 뽐뿌 장난감인 레고 마인드스톰 EV3를 하나 지를까 싶다. 임베디드 개발 보드보다 훨씬 재미있을 듯... :P

EOB

화요일, 7월 16, 2013

[일상다반사] RSS 구독자 3333명 돌파 기념 이벤트

'컴퓨터 vs 책' 애독자 여러분들께서 꾸준히 RSS 구독을 해주신 덕분에 (RSS 특성상 정확한 통계는 파악하기 어렵지만) 어느 순간 구독자 수가 3333명이 넘어섰다. 올해부터 정신차리고 주 2회(현재는 화-토) 재미있고 흥미로운 소식을 전하려 노력하고 있으며, 다양한 소재 발굴에도 신경을 쓸 계획이다. 한동안 여러 가지 사정으로 인해 이벤트를 전혀 열지 못했는데, 오늘 기습적(?)으로 이벤트를 기획해봤다. 선물은 지난번 [일상다반사] MongoDB NoSQL로 구축하는 PHP 웹 애플리케이션 번역서 출간이라는 글에서 소개드렸던 MongoDB NoSQL 번역서다. 이 책 성격은 어느 독자분이 올려주신 서평을 보면 확실하게 알 수 있을 것이고, 특히 PHP와 MongoDB에 관심이 많은 분에게 적합하다.

독자 여러분을 위해 총 다섯 권을 준비했고, 응모 방법과 공지 사항을 간략하게 정리한다.

  1. 응모 기한: 7월 18일(목) 23시 50분까지다.
  2. 이벤트 응모 대상: RSS로 구독한 블로그 애독자(라고 썼지만... RSS 구독 여부는 확인할 방법이 없다. ㅋㅋ)
  3. 이벤트 당첨 방식: 이번에는 아날로그 식으로 제비를 뽑아볼 생각이다.
  4. 우편물 배송 방식: 이번에도 역시 기존과 마찬가지로 일반 우편 발송을 따른다. 등기나 택배를 이용할 경우 너무 많은 비용이 들어가기 때문이다.
  5. 신청 방식: jrogue@쥐메일(gmail이라는 사실을 다들 아실거다).com로 편지를 보내주시라. 전자편지 작성 방식: 전자편지 제목은 '[3333] 이벤트 신청'으로 적어주시면 감사하겠다. 본문 내용에는 신청인 이름, 주소, 우편번호(!)를 적으면 된다.
  6. 당첨자 발표: 7월 20일(토) 오전에 간단하게 블로그 글로 결과를 올려드리겠다. 스팸 편지로부터 보호하기 위해 email 앞부분 일부 주소만 공지할 생각이다.

일일이 답장이나 댓글을 드리지 못하더라도 애독자 여러분들의 열렬한 성원(댓글, 트위터 멘션, 기타 등등)은 맘 속으로 늘 고맙게 생각하고 있다. RSS 구독자가 5000명이 넘으면(이런 날이 오기는 올까?) 화끈한 오프라인 이벤트를 선보일 예정이므로 기대하시기 바란다. :)

EOB

토요일, 7월 13, 2013

[독서광] 관찰의 힘

거의 한 달 동안 경제/경영 블로그(?)답지 않게 컴퓨터 관련 내용만 올리고 있었다. 반성하면서 오늘은 '평범한 일상 속에서 미래를 보다'라는 부제가 붙은 '관찰의 힘'을 여러분들께 소개해드리겠다. 이 책은 근래 읽은 책 중에서 표지 날개가 가장 눈길을 끄는 내용으로 꾸며져 있었다. 잠깐 살펴볼까?

  • 세계인의 가방에 공통으로 들어있는 세가지 물건은?
  • 배가 한껏 부른데도 왜 더 먹게 될까?
  • 공원에 있는 '잔디에 들어가지 마시오' 표지판을 누구를 위한 것일까?
  • 태국의 십대 소녀들이 가짜 명품백보다 가짜 치아교정기를 사는 이유는?
  • 인터넷 검색이 기억력을 쇠퇴시킬까? 그렇다면 앞으로 무엇을 기억하게 될까?
  • 누군가 연락처를 묻는다면 어떤 정보를 주겠는가? 이메일 주소? 휴대전화 번호? 페이스북 주소?
  • 안면 인식 기능의 발달로 익명성이 완전히 사라진다면, 세상은 더 좋아질까? 나빠질까?
  • 스마트폰을 택시에 두고 내렸는데 위치 수신이 된다면 그것을 잃어버렸다고 할 수 있을까?
  • 물건의 소유와 공유 중 어느 쪽이 더 편리할까?
  • 낯선 사람이 천 원만 빌려달라고 한다면, 줄 것인가 말 것인가?
  • 중국에서 글로벌 대기업 이베이가 내수 업체 타오바오에게 완패한 이유는?
  • 고속도로 휴게소의 본질은 주유일까 휴게일까?
  • 휴대 전화의 기능 중 딱 한가지만 선택할 수 있다면?

BUT... 표지 날개 내용만 보면 정말 끝내줄지 몰라도 본문에 나오는 정답은 뻔하다(최소한 '컴퓨터 vs 책' 블로그의 애독자분들 수준이면 본문에서 아주 색다르고 신기한 내용이 펼쳐지지 않으리라 믿는다). 아쉽게도 이 책은 저자가 속한 프로그 디자인에서 업무를 수행하는 동안 얻은 경험과 뒷이야기를 정리한 수준에서 흐지부지 막을 내려버린다. 다양한 방식으로 세상이 돌아가는 방식을 파악하는 방법을 일본, 한국, 중국을 포함한 여러 아시아 국가와 개발도상국을 돌아보며 일반 관광객이 느끼지 못한 여러 경험담을 곁들여 재미있게 풀어쓰려 노력했지만, 거기서 얻은 경험을 어떻게 제품에 연결시킬지에 대한 고리는 (최소한 이 블로그 주인장에게는) 보이지 않았다. 따라서, 부제에서 강조한 '일상에서 미래를 찾는 방법'이라는 상투적인 선전 문구 따위는 잊어먹고 눈 높이를 한 단계 낮춰 (조금 색다른) '디자인 연구에 대한 방법'을 본문에서 기대하는 편이 정신 건강에 이롭다는 생각이다.

결론: 디자인 연구 방법을 찾는 분들에게는 살짝 추천, 이 책으로 뭔가 세상에서 통찰을 얻어 현재 만들고 있는 제품/상품/서비스에 직접 적용하려 마음먹은 분들께는 강력하게 비추천.

뱀다리: 국내에서 이 책이 인기를 끄는 이유는 '여행서'(응?) 형태를 따르기 때문일 듯이 보이는데... (여기서 경고 하나!) 멋지게 보인다고 해서 이 책에서 나오는 일련의 엉뚱한 행동을 그대로 따라하다가는 진짜 큰 코 다친다.

EOB

화요일, 7월 09, 2013

[일상다반사] 생산성의 비밀

A Harvard Economist's Surprisingly Simple Productivity Secret이라는 글을 읽으면서 전문직 종사자들이 '시간 없어요'라고 불평을 터트리는 이유에 대해 다시 한번 생각하게 되었다. 간단하게 기사 내용을 정리해보겠다.

전문가 세상에서 가장 흔한 불평은 바로 '너무 시간이 없어요'다.

주당 60시간 이상 일하는 근로자들은 창의적인 방법으로 큰 프로젝트를 해결한 생각은 고사하고.심지어 받은 편지함을 정리할 시간조차 없다고 투덜거린다.

하지만 시간이 문제가 아니라고 하버드 경제학자인 센드힐 물라이나단은 말한다. 성공을 막는 궁극적인 장애물은 정싱적인 '대역폭' 부족이다. 과업에 순간적으로 집중하는 능력 말이다.

물라이나단의 연구는 결핍과 사람들이 뭔가(예: 돈, 음식, 시간) 부족할 때 어떻게 반응하는지에 초점을 맞춘다.

결핍은 사람들로 하여금 잘못된 결정을 이끈다는 사실을 발견했다. 두뇌가 결핍에 대해 너무 많이 고민하기 때문이다.

결핍이라는 문제는 소득 수준을 가로질러 퍼져 나간다. 마치 소득이 적은 사람들이 약탈적인 부채 관리에 실패하듯, 바쁜 전문가들은 시간을 효율적으로 관리하는 데 실패한다. 사람들은 집중하지 못한다.

실제 예를 들어보자. 목이 마르다면 간절히 물을 원하게 된다. 다른 것에는 신경쓸 여력이 없다. 돈이 부족하면 재정 문제가 사고를 지배한다.

전문가 세상 역시 마찬가지다. 시간 부족이 문제가 아니라 집중력 부족이 문제다.

초과 근무를 하는 사람들은 "열심히 일할 능력뿐만 아니라 문제에 대해 심각하게 생각할 능력"이 부족하다.

전문가를 위한 교훈은 다음과 같다. 황금같은 시간이 부족하다는 사실은 문제가 되지 않는다. 어떻게 양질의 시간을 보내느냐가 문제다.

시간이 없다고? 그렇다면 시간을 최대로 활용하게 머리를 써야 하는데, 그럴 시간도 없다는 사실이 함정이네? T_T 자 그렇다면 개발자 여러분들은 이런 모순을 해결하기 위해 어떤 전략을 사용하고 계신지? 좋은 해법이 있으면 다 함께 나눠봅시다.

EOB

토요일, 7월 06, 2013

[독서광] 미래를 바꾼 아홉 가지 알고리즘

집에 있는 책꽂이를 보면 수학, 물리, 생명공학, 화학 등 여러 분야에 걸친 대중서가 보인다. 그런데 흥미롭게도 컴퓨터 관련 대중서는 손에 꼽을 정도다. 일부러 대중서를 구입하지 않았는지 아니면 대중서가 없어서 구입하지 못했는지는 모르겠지만, 온라인 서점에서 찾아보기 힘든 것도 사실이다. 오늘은 에이콘 출판사에서 일반인을 위한 컴퓨터 대중 서적을 표방한 '미래를 바꾼 아홉 가지 알고리즘'이라는 책을 소개하겠다.

이 책의 부제인 '컴퓨터 세상을 만든 기발한 아이디어들'은 이 책의 성격을 아주 잘 나타내고 있다. 저자는 컴퓨터 과학의 기발한 아이디어를 표현하는 알고리즘 중에서 1. 일반 컴퓨터 사용자가 날마다 사용하며 2. 구체적이고 실질적인 문제를 다뤄야 하며 3. 컴퓨터 하드웨어나 인프라가 아닌 컴퓨터 과학 이론에 초점을 맞추는 세 가지 특성이 있는 알고리즘을 뽑아내어 소개한다. 하지만 여느 알고리즘이나 자료 구조 책과는 달리 코드는 없으며 적절한 비유와 알기 쉬운 사례로 트릭(다른 방식으로는 어렵거나 불가능했을 목표를 달성하는 기발한 기법)을 설명하고 있다. 이 책에서 소개하는 알고리즘과 간단한 설명은 다음과 같다.

  • 검색 엔진 인덱싱: 검색 엔진이 빠르게 특정 단어나 문구를 받아 원하는 결과를 제공하는 방법이 무엇일까?
  • 페이지랭크: 결과 우선 순위를 어떻게 매길 것인가?
  • 공개 키 암호화: 남이 뻔히 보고 있는 상황에서 어떻게 비밀스럽게 키를 교환할까?
  • 오류 정정 코드: 네트워크로 통신하고 디스크에 저장할 때 발생하는 오류를 어떻게 스스로 고칠까?
  • 패턴 인식과 인공지능: 철자를 자동으로 교정하고, 얼굴을 인식하고 카메라에 찍힌 내용이나 스캔한 내용을 글자로 바꾸는 마법은?
  • 데이터 압축: 엄청나게 큰 동영상이나 자료를 손쉽게 교환하려면 무엇이 필요할까?
  • 데이터베이스: 관계형 데이터베이스에 대한 기본 이론
  • 디지털 서명: 전자 세상에서 인감이나 서명은 무엇을 의미할까?
  • 계산 가능성과 결정 불가능성: 튜링이여 영원하라!

딱 한 문장으로 예를 들자면... 여러분이 구글에서 내용을 검색한 다음(인덱싱, 페이지랭크, 공개키 암호화), 특정 사이트에 계정과 암호로 접속해(데이터베이스) 캡차로 여러분이 사람임을 증명한 다음(패턴 인식과 인공지능, 계산 가능성과 결정 불가능성) 큰 파일을 다운로드 받아(데이터 압축, 오류 정정 코드), 진위를 확인하기 위해 검사하는(디지털 서명) 과정에서 이 모든 마법이 동원된다. 여러분이 컴퓨터를 켜서 어떤 작업을 할 때 매일 위에서 설명하는 알고리즘 덕을 보는 셈이다.

책 내용 중에 가장 마음에 들었던 부분은 공개 키 암호화를 설명하면서 페인트 혼합 트릭을 예로 든 내용이다. 공개 키에 대한 개념을 설명한 내용 중에서 가장 이해하기 쉬우면서도 정확한 예가 아닐까 하는 생각이 들었다. 다음으로 디지털 서명을 설명하면서 서명 은행이라는 개념을 예로 든 내용도 마음에 들었다(한국에서는 인감 제도가 있기 때문에 특히 이해가 더 쉬웠을지도 모르겠다). 물리 키가 아닌 논리 키를 어떻게 관리하고 교환하고 인증하는지 아주 쉽게 이해할 수 있을 것이다. 마지막으로 계산 가능성과 결정 불가능성을 설명하면서 예를 든 '다른 프로그램에서 충돌이 일어날지 알 수 있는 프로그램'은 아주 유쾌했다. 조금 어렵긴 하지만 "사람과 컴퓨터가 다를까? 아니면 기저까지 내려가면 같을까?"를 놓고 철학적인 고민을 해보기 바란다.

보너스로 이 책을 읽다가 발견한 보물 하나를 소개하겠다. 이 책 추천사를 쓴 크리스 비숍이 2008년 영국 왕립 연구소에서 강연한 내용인 Roayl Institution Christmas Lecture는 컴퓨터 과학 지식이 없는 사람을 대상으로 멋진 볼거리를 제공한다(비디오에 나오는 청중을 보면 ... 호기심 많은 아이들이다). 한글 자막이 없어 조금 아쉽기는 하지만 어려운 영어가 아닌 쉬운 영어를 사용하며 실제 예를 많이 들기 때문에 컴퓨터에 대한 대중적인 이해도를 높이기 위한 훌륭한 출발점으로 보인다. 비숍이 쓴 추천사에서 일부를 가져온다.

게다가 '컴퓨팅' 또는 '정보통신기술'이라는 과목명으로 학교에서 가르치는 내용은 대개 소프트웨어 패키지 사용법을 훈련하는 기술 정도에 불과하다. 그다지 놀라울 것도 없이, 학생들은 따분해 하고, 컴퓨터과학에는 지적 깊이가 결여됐다고 느끼게 되면서, 놀이와 소통에 컴퓨터 기술을 활용하려는 열정도 금세 사그라진다. 지난 십여 년간 컴퓨터과학을 전공하는 대학생 수가 50%나 감소한 현상의 핵심은 이와 같은 문제에서 기인한다.

한국의 현실도 이와 다르지 않다는 생각이다. 이 책을 읽고나서 컴퓨터에 대한 관심이 생기는 분들이 많아지면 더할 나위 없겠다.

EOB

화요일, 7월 02, 2013

[B급 프로그래머] JNI 함정과 우수 사례

지난번에 올려드린 [독서광] The Java Native Interface: Programmer's Guide and Specification이 대박은 아니지만 중박을 치면서 부족한 부분을 다시 한번 정리해드려야 겠다는 생각이 들었다. 그래서 오늘은 Best practices for using the Java Native Interface: Techniques and tools for averting the 10 most common JNI programming mistakes에서 개발자들이 JNI 프로그래밍 도중 흔히 저지르는 10가지 실수를 정리해봤다.

  1. Not caching method IDs, field IDs, and classes(캐시하지 않음): 메소드 ID, 필드 ID, 클래스를 캐시하지 않고 자주 native 쪽에서 참조할 경우 JVM이 클래스 계층을 오르락내리락하느라 무척 바빠진다. 그 결과 성능 저하가 생긴다.
  2. Triggering array copies(배열 복사 유도): JNI에서 배열은 값비싼 자원이다. 따라서 전체 배열에 접근하지 않고 반드시 필요한 부분만 접근하는 절약 정신이 요구된다. 예를 들어, long 담긴 배열에 접근할 경우 전체를 복사하는 GetLongArrayElements 대신 일부만 복사하는 GetLongArrayRegion을 사용할 수는 없는지 유심히 살펴볼 필요가 있다.
  3. Reaching back instead of passing parameters(매개변수 전달 대신 역참조): 사람들은 정보 은닉 관점에서 구조체나 클래스 객체에 여러 자료를 담아 전달하는 방식을 선호한다. 하지만 JNI에서 객체를 전달한 다음 객체에서 값을 얻기 위해 JNI 호출을 여러 번 하게 되면 굼벵이로 변한다. 따라서 처음부터 자료를 풀어헤쳐 개별 매개변수 형태로 전달하는 편이 훨씬 유리하다.
  4. Choosing the wrong boundary between native and Java code(잘못된 경계): 자바와 natvie 쪽 코드를 잘 분리해 자바에서 native로 native에서 자바로 호출이 최소로 일어나도록 만들어야 한다. 설계와도 관련이 있기 때문에 의외로 이 부분에 대해 실수하기 쉽다.
  5. Using many local references without informing the JVM(너무 많은 지역 참조): 지역 참조를 많이 할 경우 JVM 입장에서 무척 부담스럽다. 따라서 지역 참조를 될 수 있으면 적게 하고, 불필요한 지역 참조는 명시적으로 제거하는 편이 JVM 메모리 관리에 유리하다. 16개 이상 지역 참조가 필요할 경우 명시적으로 JVM에 이를 알려서 최적화가 가능하게 하자.
  6. Using the wrong JNIEnv(JNIEnv 오류): JNIEnv는 스레드 단위로 존재해야 한다. 스레드끼리 공유하거나 넘기면 절대 안 된다.
  7. Not checking for exceptions(예외 점검 미비): 예외를 일으킬 수 있는 JNI 함수 호출 다음에는 반드시 예외를 점검해야 한다. 이를 망각하면 나중에 (거꾸로) 대박 날지도...
  8. Not checking return values(반환값 점검 미비): JNI 함수 중에 결과를 반환하는 경우에 예외와 마찬가지로 제대로 검사해서 문제가 생겼을 경우 적절히 처리해야 한다.
  9. Using array methods incorrectly(배열 메소드 오용): 배열 메소드 쌍이 맞지 않으면 메모리 누수나 메모리 부족 현상이 생긴다.
  10. Using global references incorrectly(전역 참조 오용): 지역 참조만큼이나 전역 참조도 적절한 시점에서 잊어버리지 말고 해제해야 한다. JVM에서 메모리 누수 문제는 예상 외로 심각한 사태를 불러일으킬지도 모른다.

지난번과 중복되는 내용도 있고 새로 나온 내용도 있을 것이다. 얼마나 이런 실수가 많았으면, 아티클에서 문제 회피를 위한 표까지 정리해주었겠는가? T_T 다음 표를 참조해서 JNI 프로그래밍을 할 때마다 각성하면 좋겠다.

캐시하지 않음배열 복사 유도잘못된 경계너무 많은 역참조너무 많은 지역 참조JNIEnv 오류예외 점검 미비반환값 점검 미비배열 메소드 오용전역 참조 오용
JNI 명세 확인XXX
메소드 추적XXXXXXX
verbose:jniX
코드 검토XXXXXXXXXX
EOB

토요일, 6월 29, 2013

[독서광] The Java Native Interface: Programmer's Guide and Specification

어쩌다보니 JNI를 사용해 자바와 C 세상을 연결하게 되었는데, 출발부터 삐걱거리다 몇 번 혼이 난 다음에야 가까스로 정신을 차렸다. 자바 대가인 dynaxis 군에 따르면 JNI 표준을 정확하게 이해하지 못하고 감으로 프로그램을 만들면 나중에(나중에 - 이 얼마나 무서운 단어인가!) 심각한 문제를 초래한다고 하는데, 그게 무슨 말인지 이해하려면 바로 이 책을 읽어보면 된다. 아주 어려운 로켓 과학은 아니지만 무척 꼼꼼하게 '이러면 안 되고 저러면 큰일나고 요러면 망가진다'는 설명 앞에서 무심코 저지른 실수가 생각나며 몇 번을 화들짝 놀라게 될 책으로 보면 틀림 없겠다. 온라인 시대에 책 말고 인터넷에 올라온 아티클만으로 어떻게 안 될까? 유감스럽지만, 선 마이크로시스템오라클에서 제공하는 공식 문서인 Java™ Native Interface(JNI 6.0 기준)만으로는 미묘한 뉘앙스를 파악하기에 부족한 점이 많다는 사실도 짚고 넘어가겠다. 하지만 너무 겁먹지 마시라. 이 책은 분량이 300페이지 정도지만 후반부는 참조 매뉴얼 형태라 정신 바짝차려 읽으면 며칠 내 독파가 가능하니까.

이 책을 처음부터 끝까지 읽으면 가장 바람직하지만, 시간/여건 상 완독이 힘드신 분들이라면 11장 "Overview of the JNI Design"(11장을 읽다보면 왜 JNI가 이렇게 요상(응?)하게 만들어졌는지 이해가 갈 것이다)과 10장 'Traps and Pitfalls' 만이라도 꼭 읽어보기 바란다. 그래도 시간이 없는 분들을 위해 10장에서 나오는 몇 가지 함정에 대해 요약 정리해드리겠다.

  1. 오류 점검: native 메소드(C로 만든)를 작성할 때 가장 잊어버리기 쉬운 실수는 오류 조건이 발생했는지 점검하는 루틴 누락이다. 자바 프로그래밍 언어와는 달리 C에서는 표준 예외 처리를 제공하지 않는다. JNI는 C++ 예외와 같은 전형적인 예외 처리 매커니즘에 의존하지 않는다. 따라서, 예외를 일으킬 가능성이 있는 모든(!) JNI 함수 호출 직후 명시적으로 예외를 점검해야 한다(이 부분 밑줄 좌악). 예외 점검은 따분하지만 튼튼한 애플리케이션 제작을 위해 필수다.
  2. JNI 함수로 유효하지 않은 인수 전달: JNI 함수는 유효하지 않은 인수를 감지하거나 회복하려 들지 않는다. 참조값을 기대하는 JNI 함수에 NULL이나 (jobject) 0xFFFFFFFF를 넘기면, 이후 결과는 미정의(!)다. 현실에서 이런 미정의는 잘못된 결과나 가상 기계 충돌을 의미한다. -Xcheck:jni 명령행 옵션을 붙이면, 가상 기계에서 JNI 함수에 유효하지 않은 인수를 넘길 경우 (비록 전부는 아니지만) 상당수 잘못된 용례를 잡아낸다. 이 옵션은 부하를 유발하므로 기본적으로 꺼놓아야 한다.
  3. jboolean 인수 주의: jboolean은 8비트 부호없는 C 타입으로 0부터 255까지 저장 가능하다. 0은 JNI_FALSE이며, 나머지 1부터 255는 JNI_TRUE에 대응한다. 하지만 255보다 큰 16비트나 32비트인 경우 문제가 발생한다. 이런 점에 유의해서 프로그램을 작성해야 한다.
  4. 자바 애플리케이션과 native 코드 사이의 경계: JNI를 사용하는 자바 애플리케이션을 설계할 때, "무엇을, 얼마나 많이 native 코드에서 처리해야 하나?"라는 질문이 나온다. native 코드와 나머지 자바 애플리케이션 사이의 경계는 애플리케이션에 밀접하지만 몇 가지 원칙이 존재한다.
    • 경계를 단순하게 유지하자: JVM과 native 코드 사이에서 복잡한 제어 흐름이 왔다갔다 하면 디버그와 유지보수가 어렵고 고성능 자바 가상 기계가 수행하는 최적화에도 방해가 된다.
    • native 코드를 최소로 유지하자: natvie 코드는 이식성도 낮고 타입 안전성도 떨어진다. 되도록 최소로 줄이는 편이 좋다.
    • native 코드를 격리하자: 모든 native 메소드는 동일 패키지나 동일 클래스에 둬서 나머지 애플리케이션 코드로부터 격리시킨다. 이런 패키지나 클래스는 애플리케이션을 위한 "이식 계층"이 되어야 한다.
  5. ID와 참조를 혼동: JNI는 객체를 참조로 외부에 노출한다. 클래스, 문자열, 배열은 참조의 특수한 타입이다. JNI는 메소드와 필드를 ID로 노출한다. ID는 참조가 아니다!
  6. 필드와 메소드 ID 캐시하기: native 코드는 필드나 메소드의 이름과 타입 기술자를 문자열로 지정해 가상 기계로부터 필드나 메소드 ID를 얻는다. 이름을 사용한 필드와 메소드 탐색은 느리다. 종종 ID를 캐시하는 편이 비용을 줄인다. 캐시 필드나 메소드 ID에 대한 캐시를 사용하지 않을 경우 native 코드에서 성능 문제가 생길지도 모른다. 하지만 상속 관계에 주의해서 필드와 메소드 ID를 캐시해야 한다. 잘못하면 엉뚱한 내용을 캐시할지도 모르니까.
  7. 유니코드 문자열: GetSTringChars나 GetStringCritical에서 얻은 유니코드 문자열은 NULL로 끝나지 않는다. GetStringLength 함수를 호출해 16비트 유니코드 글자 수를 세야 한다.
  8. 가상 기계 자원 획득하기: native 메소드에서 흔히 저지르는 실수는 가상 기계 자원을 해제하는 루틴 누락이다. 프로그래머는 오류가 발생할 때 수행할 코드 경로에 대해 특히 주의해야 한다. 오류 발생 시점에서 자원을 해제하지 않고 return하는 경우가 많은데, 이럴 경우 해당 자원은 JVM에서 pinned 상태로 영원히 남게 되어 메모리 단편화를 일으키거나 메모리 누수 현상을 일으킨다. GetStringChars의 isCopy 매개변수를 JNI_FALSE로 지정했을 때조차 ReleaseStringChars를 호출해야 한다. 그렇지 않으면 jstring이 pinned 상태로 남게 된다.
  9. 과도한 지역 참조 생성: 과도한 지역 참조 생성은 불필요하게 메모리를 많이 소비한다. 불필요한 지역 참조는 참조된 객체 뿐만 아니라 참조 자체에도 메모리를 소비한다. native 메소드 실행 시간이 길어지거나 루프 내에서 지역 참조를 만들거나 유틸리티 함수에서 지역 참조를 만들 경우 특히 주의해야 한다. Push/PopLocalFrame 함수를 잘 활용한다.
  10. 유효하지 않은 지역 참조: 지역 참조는 지역 메소드의 단일 호출 내에서만 유효하다. native 메소드에서 생성한 지역 참조는 해당 메소드를 구현한 native 함수가 return될 때 자동으로 해제된다. native 코드는 전역 변수에 지역 참조를 저장해 나중에 native 메소드에서 사용해서는 안 된다. 지역 참조는 생성한 스레드 내에서만 유효하다. 지역 참조를 특정 스레드에서 다른 스레드로 전달해서는 안 된다. 스레드 사에에 참조를 전달하려면 전역 참조를 생성하자.
  11. 스레드 사이에서 JNIEnv 사용하기: JNIEnv 포인터는 연관된 스레드 내부에서만 사용해야 한다. 특정 스레드에서 얻은 JNIEnv 인터페이스 포인터를 캐시해 해당 포인터를 다른 스레드에서 사용하면 안 된다.

지금까지 설명한 내용은 공통적으로 가장 흔히 저지르는 실수이며, 개발자에 따라 다른 유형의 실수를 저지를 가능성도 있으므로 깨알같이 꼼꼼하게 프로그램을 작성해야 한다. 딱 세 가지로 요약하자면, JNI 함수 호출 다음에는 오류 점검이 따라 와야 하고, 코드 경로를 주의 깊게 살펴 자원 해제를 빠뜨리는 경우가 없는지 점검해야 하며, 지역 참조 관련해 한계를 확실하게 이해하고 있어야 한다.

결론: JNI로 뭔가를 하려면 반드시 이 책을 정독하기 바란다.

EOB

화요일, 6월 25, 2013

[독서광] 위대한 게임의 탄생 3

작년 여름 소개드린 위대한 게임의 탄생위대한 게임의 탄생 2에 이어 오늘은 위대한 게임의 탄생 3편을 소개해드리겠다. 박 일님께서 지난 주 보내주셨는데, 생각보다 내용 압박이 강해 읽는 과정에서 제법 시간이 오래 걸렸다.

영화도 그렇지만 책이 시리즈로 출간될 경우 사람들은 전편과 유사하면서도 다른 뭔가를 바라기 마련이다. 전편과 너무 동떨어져도 문제고 전편과 너무 흡사해도 문제다. 사람들의 눈높이가 이미 높아질 대로 높아져 새로운 것을 갈구하면서도 기존 좋았던 틀에서 벗어날 경우 연속성이 없다고 비판한다. '위대한 게임의 탄생'의 1편은 해외 사례, 2편은 국내 사례로 나뉘어져 있으므로 이런 어려움이 없었는데, 3편은 예상했던 바와 같이 국내 사례를 중심으로 전개되면서 2편과 차별성을 가져가야 하는 어려운 상황에 부딪혔을 것이다. 그렇다면 2편과 어떤 차이점이 있을까? 일단 게임 분야만으로 범위를 좁혔다는 점이 가장 먼저 눈에 들어왔다. 2편은 게임 이외에 3부에서 여러 분야를 다루다보니 주제가 산만해지는 문제점이 있었는데, 3편은 처음부터 끝까지 게임만 다루고 있으므로 통일성이 높아졌다. 다음으로 직군별 인터뷰가 빠져버린 대신 본문을 강화하는 방법을 사용한 점이 눈에 들어왔다. 1편과 2편은 직군별 인터뷰가 있어 중간 중간 한숨 돌릴 수도 있고, 다양한 각도에서 현장감을 느낄 수 있는 장점이 있었는데, 직군별 인터뷰가 빠져버리니 책을 읽는 과정에서 피로도가 높아지는 느낌이다. 2편에 비해 개별 사례에 대한 깊이가 깊어져서 호흡이 길어졌을지도 모르겠는데, 만일 인기를 끌어 4편이 나오면 직군별 인터뷰 형식이 아니더라도 다양한 스튜디오 소속 또는 독립 개발자와 자유로운 인터뷰 형식으로 중간 중간 변화를 주면 어떨까 하는 생각이 들었다. 본문 사례 전개 방식은 1편과 2편과 유사하게 전개되고 있으므로 기존 책의 서술 방식에 만족하는 독자들이라면 부담없이 읽을 수 있다. 개인적인 평가는 (형만한 아우 없다고) 1편 > 3편 > 2편 순이지만, 국내 게임 상황을 파악하기 위해서라면 3편이 가장 좋다는 생각이다.

각 게임별 포스트모르템 수준과 재미는 천차만별이다. 독자들에 따라 호불호가 갈리겠지만, 의외로 작은 게임을 소개하는 내용이 알차고 재미있었다. 큰 게임은 (어쩔 수 없는 환경상) 기술적인 측면이나 조직적인 측면을 많이 강조하다보니 실제 게임의 아기자기한 개발 재미와 고통을 제대로 전달하기 어려웠기 때문이 아닐까 싶다. 1편에서 소개하는 해외 게임의 경우에는 게임 규모와 무관하게 좋은 점과 나쁜 점을 독창적으로 모스트모르템 형식으로 기술하는 반면 국내 게임의 경우에는 회사/프로젝트 규모에 따라 (심지어) 어느 정도 규격화된 포스트모르템이 존재한다는 느낌도 들었는데, 만일 4편이 나오면 예상 가능한 시나리오를 전달하는 수준을 벗어나서 차별화 포인트를 정확히 공략해 들어갈 필요가 있어 보인다(그렇지 않으면 동일한 이야기가 중언부언될 가능성이 매우 높다!). 또한 기술적인 내용이 많은 포스트모르템의 경우 "우리는 이런 훌륭한 기술을 써서 게임을 만들었습니다"라고 서술하는 대신, 특정 기술을 사용하자고 결정한 역사적인 이유나 예상하거나 예상치 못한 파급 효과를 게임의 재미와 기획 의도와 관련지어 전지적인 작가 시점에서 서술해야 독자들이 납득할 것이다. 솔직히 말해 초당 프레임이 어떻고 컬러가 어떻고 폴리곤이 어떻고 모두 게임이 재미있고 난 다음에야 중요한 내용이고, 책 읽는 독자들은 그다지 관심없을 가능성이 높다(열심히 만든 프로그래머 입장에서는 무척 괴씸한 태글인지도 모르겠는데, 비유를 들어 설명하자면 영화가 재미없을 경우 IMAX, 3D, HFR, Dolby Atmos 이런 기술이 아무 소용없다는 사실을 기억해야 한다!)

결론: 전작과 마찬가지로 다양한 플랫폼, 다양한 장르의 게임(22개?)을 다루고 있기에 여러 각도에서 게임 개발에 관련된 희노애락을 느낄 수 있다. 게임 업계에 종사하거나 향후 종사하고 싶은 분들이 제일 궁금하게 생각하는 '과연 남들은 어떻게 개발하고 있을까?'라는 질문에 100%는 아니더라도 나름 도움이 되는 대답이 나오므로 책을 읽으며 스스로를 한번 돌아보는 기회를 만들면 좋겠다.

EOB

토요일, 6월 22, 2013

[독서광] 카산드라 따라잡기

1년 반 전에 [독서광] 카산드라 완벽 가이드라는 제목으로 카산드라 관련 서적 하나를 독자 여러분들께 소개드렸었다. 오늘은 에이콘 출판사에서 보내온 행운의 상자에서 꺼내 읽은 카산드라 책을 하나 소개하려 한다. 정말 간만에 전문서를 리뷰하니 낯설기까지 하구나. T_T

'150가지 예제로 배우는 NoSQL 카산드라 설계와 성능 최적화'라는 부제가 붙은 팩트 '카산드라 따라잡기'는 오라일리 카산드라 완벽 가이드와는 완전히 반대 방향에서 출발한다. 오라일리 버전이 카산드라의 이론, 아키텍처, 개념, 구조를 집중적으로 공략했다면, 팩트 버전(오늘 소개하는 책)은 일단 예제부터 보고 동작 원리를 파악하는 방식을 따른다. 따라서 책 내용 자체에 접근은 수월하지만 어느 정도 카산드라의 개념과 용어에 익숙해야 이해가 가능하므로 미리 선행 학습이 필요하다. 그리고 조각난 예제가 아니라 완전한 예제를 제공하며, 처음 카산드라를 만져보는 개발자를 위해 실습 환경 구축까지도 스크립트와 구체적인 예를 제공한다는 측면에서 직접 해보고 배우는 유형의 개발자에게 적합하다는 생각이다. 카산드라와 함께 동작하는 다양한 유틸리티, 프레임워크, 결합 가능한 오픈 소스 소프트웨어까지 소개하므로 카산드라를 중심으로 동작하는 에코 시스템을 이해할 수 있다.

목차를 보면, 우선 카산드라 인스턴스 실행 방법(단독, 다중)을 설명하고, CLI 인터페이스를 소개한다. 그리고 쓰리프트 API를 사용해 CLI로 수행한 작업을 다시 한번 프로그램으로 반복해보고 하드웨어, 운영체제, JVM과 관련된 성능 튜닝으로 들어간다. 여기까지 해보면 카산드라 맛보기가 끝날 것이다. 그리고 나서 일관성/가용성/파티션 허용, 스키마 디자인, 관리, 데이터 센터 사용과 같은 고급 주제로 넘어간다. 마지막으로 하둡을 사용한 맵리듀스를 설명하며, 성능 통계 수집/분석, 서버 모니터링으로 마무리한다. 거의 모든 부분을 실제 예를 들어 설명하고 있으므로 전반적인 카산드라 따라잡기에 많은 도움을 준다. 팩트 출판사 홈페이지에서 코드와 정오표를 제공하므로 관심있는 분들께서는 코드를 내려받아 살펴보기 바란다.

동전에 양면이 있듯이 이 책에도 빛(넓은 범위, 알기 쉬운 설명, 예제)과 그림자(얕은 깊이, 이론 부제, 예를 위한 예)가 공존한다. 현재 카산드라 버전이 1.2.5까지 나왔지만, 이 책은 여전히 0.7과 0.8대에 머물기 때문에 이후 새롭게 추가된 부분에 대해서는 직접 찾아봐야 한다. 또한 설명의 편의를 위해 책에서 다루는 내용이 'hello, world' 수준을 크게 넘어서지 못하므로 이 책에 나온 예를 그대로 상용 코드에 적용하기에는 무리가 있어 보인다. 일단 책에서 제공하는 샘플 코드를 사용해 개념을 잡은 다음에 추가로 다른 책과 웹 사이트를 살펴보자. 이 책과 함께 볼만한 자료로 카산드라 홈 페이지에서 제공하는 공식 위키는 다소 오래되었고 구성이 체계적이지 않으므로 DataStax Document에서 필요한 자료를 찾아보는 편이 정신 건강에 이롭다.

결론: 카산드라를 처음 시작하는 분이라면 감을 잡기 위해 이 책을 읽어보면 좋겠다.

EOB

화요일, 6월 18, 2013

[일상다반사] 사람들이 일반적으로 말해주지 않는 충고

What are important things and advice to know that people generally aren't told about?라는 글을 Quora에서 읽었는데, 의외로 좋은 내용이 많아 스스로 정리할 겸 독자 여러분에게도 소개하기 위해 편집기를 열었다.

  • 가장 친한 친구와 결혼하라: 가장 편안하게 지낼 수 있는 사람이 배우자가 아니라면, 만들어라! (이 사람은 가족이 아니라고 가정한다)
  • 어른인채 하지 마라: 항상 즐겁게 살자. 나이에 무관하게 진흙탕에서 뒹굴고, 노래부르고, 배개 싸움하자.
  • 학습을 중단하지 마라: 인생을 타성으로 살기 시작하면, 패배자가 된다. 항상 지식을 넓혀라.
  • 실패하고 있지 않다면 뭔가 잘못하고 있는 거다. (실수를 해도 문제 없다)
  • 생각없고 비이성적인 사람들과 이성적으로 논쟁하려 들지 마라.
  • 새로운 소식과 정보를 받아들이느라 너무 스트레스 받지 마라.
  • 돈이 안 되는 뭔가를 해보자.
  • 행복은 뭔가를 만들어내는 데 있지 뭔가를 얻는 데 있지 않다.
  • 시간은 생각보다 빨리 지나간다. 나이가 들수록 이런 효과는 더 가속화된다.
  • 부는 상대적으로 덜 중요하다.
  • 어떤 일은 배울 수 없다. 단지 경험할 뿐이다.
  • 당신이 누구인지 알고, 그 사람을 받아들이고, 그 사람이 되어라.
  • 허가를 얻으려 기다리지 마라. 스스로에게 오케이 사인을 보내라.
  • 자신에게 거짓말하지 마라.
  • 최대한 용서하라. 원한을 품어봐야 얻는 게 없다.
  • 겸손하라(특히 "약자"에게)
  • 자신에게 허용하는 만큼 행복이 따라온다.
  • 멘토를 찾고 멘토가 되자.
  • 좋아하는 뭔가를 찾아 끝까지 하자.
  • 접시에 담긴 모든 음식을 먹을 필요는 없다.
  • 전화 벨이 울린다고 꼭 받아야 할 필요는 없다.
  • 항상 행동하자. 사람들은 행동한 것보다 행동하지 않은 것을 후회한다.
  • 과거는 교훈을 얻을 곳이지 살 곳은 아니다.
  • 희망이 없다고 결정하는 곳은 마음이지 주변 환경은 아니다.

개인적으로 '자신의 실수를 인정하라'라는 충고 아닌 충고를 덧붙이고 싶다. 누구나 살면서 실수를 하기 마련인데 알량한 자존심(응?) 때문에 이걸 인정하지 않으려 든다. 하지만 내 잘못 네 잘못 내 실수 네 실수를 가리다 본질을 놓친다면 모두가 손해다.

EOB

토요일, 6월 15, 2013

[독서광] 습관의 힘

오늘은 2013년 상반기를 정리하는 김에 가장 좋았던 책을 하나 소개하겠다. 오늘의 주인공은 '반복되는 행동이 만드는 극적인 변화'라는 부제가 붙은 '습관의 힘'이다. 직전에 소개한 'REPETABILITY: 최고의 전략은 무엇인가'에서도 계속 강조한 이야기지만 단순한 원칙을 지속적으로 반복하는 방법은 큰 변화를 추구하는 가장 기본적인 방식이며, 이 책 역시 바로 이런 기본을 어떻게 실천할지 구체적인 방법을 제시한다.

이 책은 지난번 소개한 [독서광] 디멘드처럼 풍부한 자료, 흥미로운 소재, 다양한 각도에서 사건 조망하기라는 동일한 특징을 보이지만 한 가지 중요한 차이점이 있다. 디멘드를 읽다보면 (잘 아는 회사에 대한 내용임에도 불구하고) 딴 나라 이야기처럼 느껴지는 반면, 이 책은 마치 자기 자신의 이야기처럼 느껴진다. 이런 사소한 차이가 책에 대한 몰입도를 완전 다른 수준으로 바꿔놓는다. 물론 이렇게 말하고 나니까 개인에 국한된 내용(즉 자기 계발서)에 가깝다는 생각이 들지 모르겠는데, 놀랍게도 이 책 중반 이후부터는 습관이 기업, 조직, 사회에 미치는 영향으로 확장되면서 경영쪽에도 응용할 수 있는 여러 가지 좋은 이야기가 등장한다.

이 책은 "습관은 우리(개인, 기업, 조직)의 삶을 지배하므로 습관을 바꾸는 방법으로 나와 세상을 바꿀 수 있다"라는 한 문장으로 요약 가능한데, 아주 복잡한 방식이 아니라 상당히 단순한 방식(물론 단순하다는 말이 쉽다는 말과 동격은 아니며, 이 책 곳곳에서 여기에 대해 여러 차례 주의를 주고 있다)으로 습관을 공략해나가기 때문에 더욱 현실성이 높지 않나 싶다. 다음 그림에 소개하는 신호(que), 반복 행동(routine), 보상(reward)이라는 세 가지 단계를 놓고 각각에 대한 연결고리를 파악해 습관을 바꾸는 방법을 따라가다보면 어느 순간 습관이라는 녀석이 반드시 물리쳐야 할 최강의 악당이 아니라 더불어 살아가는 동료라는 사실을 깨닫게 될 것이다.

습관을 바꾸는 일이 정말 가능하다고? 성질 급하신 분을 위해 한 페이지짜리 요약 설명서(아쉽게도 영문 버전)를 붙여봤다. 물론 이 책을 읽어봐야 가슴에 와닿겠지만, 전체 개괄로는 충분해 보인다. 책상에 붙여놓고 바라보기만 해도 나쁜 습관이 도망갈 것 같지 않은가?

여러분들이 기대하고 계신... 본문 중 나오는 좋은 문구를 정리해보겠다.

과학자들의 연구에 따르면 습관이 형성되는 이유는 우리 뇌가 활동을 절약할 방법을 끊임없이 찾기 때문이다.
습관은 우리 뇌를 상식적인 판단을 비롯해 모든 것을 무시하고 오직 그 습관에만 매달리게 만든다는 점에서 무척 강력하다.
한 그룹에서는 92퍼센트가 운동을 하고 나면 '기분이 좋아지기' 때문에 습관적으로 운동한다고 대답했다.
사람들은 (양치질 후) 시원하고 얼얼한 느낌을 열망하게 되었고 그런 느낌을 청결과 동일시하면서 양치질이 습관으로 자리잡았던 것이었다.
습관 변화를 위한 황금률: 나쁜 습관은 완전히 사라지지 않는다. 다만 다른 행동으로 바뀔 뿐이다.
습관을 바꾸는 방법: 같은 신호를 사용하라. 같은 보상을 제공하라. 반복 행동을 바꿔라.
알코올은 현실 도피, 긴장 완화와 동료애, 번민의 망각 등 감정적 억압을 떨쳐 낼 기회를 주기 때문에 중독자들은 알코올을 열망한다. 걱정을 떨쳐내기 위해 칵테일을 열망한다. 그러나 술에 취한 기분을 열망하는 경우는 극히 드물다. 다시 말하면, 알코올이 우리 신체에 미치는 영향은 중독자들이 술에서 거의 기대하지 않는 보상 중 하나다.
"개인에게 습관이 있다면 조직에는 반복 행동이 있다" "반복 행동은 조직의 습관과 유사한 것이다."
운동은 삶의 다른 부분에 영향을 준다. 운동이 다른 긍정적인 습관을 쉽게 받아들이게 해주기 때문이다.
"의지력이 필요한 일, 이를테면 퇴근 후에 달리기를 하고 싶다면 낮에 의지력 근육을 아껴 둬야 합니다. 이메일을 쓴다거나 복잡하고 따분한 지출 결의서를 작성하면서 일치감치 의지력을 소진해버리면 퇴근할 즈믐에는 의지력이 완전히 사라지고 말 겁니다."
"자제력이 필요한 일을 하라는 요구를 받을 때 그 일을 개인적인 이유로 한다고 생각하면, 다시 말해서 그 일을 즐긴다고 생각하거나 그 일로 누군가를 돕기 때문에 선택받은 사람이란 기분이 들면 그 일이 훨씬 덜 힘듭니다.
직원들에게 조직의 대리인이란 의식, 즉 뭔가를 통제하고 진정한 결정권을 갖고 있다는 의식을 심어주는 것만으로도 업무에의 열의와 집중력을 크게 높일 수 있다.
"대다수의 기업 행태는 의사 결정 나무의 외진 잔가지들을 조사한 결과로는 제대로 이해할 수 없으며 각 기업의 과거에 뿌리를 둔 일반적인 습관과 전략적인 경향의 반영으로 보아야 한다"
기업은 구성원 모두가 오순도순 화합하며 지내는 행복한 대가족이 아니다.
조직을 성공의 길로 끌어가기 위해서는 권한의 균형만으로는 부족하다. 조직이 원활하게 굴러가기 위해서는 리더들이 균형 잡힌 진정한 평화를 구축할 수 있는 습관, 역설적이지만 누가 책임자인지 명확하게 인식하는 습관을 심어줘야 한다.
혼란이 닥쳤을 때야말로 책임을 부여하고 한층 공평한 세력 균형을 조성하는 방향으로 조직의 습관을 바꿀 수 있는 적기이다. 위기에 직면하면 조직의 습관이 유연해지기 때문이다.
(고객들이) 쇼핑 목록을 미리 준비했음에도 불구하고 구매 결정의 50퍼센트 이상이 선반에서 상품을 본 순간에 이뤄졌다.
"때때로 소비자는 습관의 동물처럼 행동하며, 현재의 목적에 관계없이 과거의 행동을 기계적으로 되풀이한다."
지난 수십 년 동안 슬롯머신은 '거의 성공'의 확률을 꾸준히 높이는 방식으로 재프로그래밍되었다. '거의 성공'을 맛본 후에 계속 배팅하는 사람들이 카지노와 경마장 및 복권 회사의 배를 불려준다.
습관을 바꾸기 위해서는 습관을 바꾸겠다는 결심이 먼저 있어야 한다.
"내 자유 의지에 따른 첫 행동은 자유 의지를 믿는 것이어야 한다."
우리에게 어떤 습관을 자극하는 신호를 찾아내기 힘든 이유는, 우리가 습관과 관련된 행동을 시작할 때 우리에게 쏟아지는 정보가 너무 많기 때문이다.

결론: 2013년 상반기 #1 도서로 이 책을 선정한다.

EOB

화요일, 6월 11, 2013

[일상다반사] OODA 루프와 F-16 전투기 설계 사상

오늘은 지난 번에 독후감을 올려드렸던 REPETABILITY: 최고의 전략은 무엇인가에 나오는 내용 중에서 흥미로운 이야기를 별도로 분리해서 소개하겠다. 오늘 소개할 내용은 경영학을 공부하신 분이라면 들어봤을지도 모르는 OODA 루프다. OODA는 observe(관찰), orient(방위 확인), decide(결정), act(행동)의 첫글자를 따서 만든 용어로 전장에서 전술적인 결정을 내려야할 때 사용하는 프레임워크다. OODA의 탄생은 한국전쟁으로 거슬러 올라가 밀덕 사이에서 유명한 떡밥으로 남은 F-86과 Mig-15의 공중전에서 비롯된다. 분명히 스펙(응?) 상으로는 열세인 F-86이 Mig-15와 맞서 우월한 성적표를 받은 이유를 설명하는 과정에서 등장한 이론이다.

(F-86의 캐노피를 보면 시야 확보를 위해 상부로 돌출되어 있다)

한국전에서 잠시 F-86을 몰고 전투에 참가했던 경험이 있던 존 보이드는 개인이든 조직이든 어떤 사건에 부딪혀 반응하는 과정을 이론으로 정립했다. 이론 자체는 간단하다. 공중전(또는 경쟁)에서 승리하기 위한 핵심은 상대편보다 더 빠르게 적절한 결정을 내릴 수 있는 상황을 유지하는 능력에 있으며, 이를 수행하는 과정을 관찰, 방위 확인, 결정, 행동으로 나눈다. 각 과정은 관찰로 피드백을 주는 연결고리를 생성하며, 이를 반복하는 방식으로 일종의 리듬을 타게 된다. 이 때, 더 빠른 템포를 이용해 상대편이 사용하는 OODA 연결 고리를 단절하거나 부셔버리면 승리를 거두게 된다. 구체적으로 말해, 시야각이 넓은 버블 캐노피와 중간 고도에서 기동성이 뛰어난 장점을 활용해 관찰/방위 확인에서 우위를 차지하고(시야가 넓으므로 먼저 적기를 발견할 수 있으므로), 행동을 빨리 가져가는(주로 전투가 벌어지는 중간 고도에서 기동성이 뛰어나므로) 방법으로 Mig-15에 비교해 속력과 화력 부족이라는 열세를 F-86이 극복했다는 설명이다.

OODA 루프는 미 국방성이 추진했던 (F-4에서 F-15로 이어지는) 대형 전투기 사업과 반대로 가는 경량급 전투기 개발의 이론적인 초석이 된다. 베트남 전을 거치며 천하무적인 듯이 보였던 F-4의 한계가 드러나면서 기동성이 높고 가벼운 전투기의 필요성이 대두되었고 가벼운 기체, 넓은 시야각, 놀라운 기동성을 특징으로 내세운 F-16이 탄생하게 된다.

(F-16의 캐노피 역시 시야 확보를 위해 상부로 돌출되어 있다)

OODA 루프를 이해하기 전까지는 F-16 전투기의 설계 사상에 대해 전혀 눈치를 채지 못하고 있었는데(비용을 줄이기 위한 목적으로 만든 전투기인가?), 위키피디아에서 설명하는 다음과 같은 내용이 바로 이해가 되어버렸다.

  • 넓은 가시성을 위한 프레임이 없는 버블 캐노피(관찰, 방위 확인)
  • 조종 과정에서 손쉬운 제어를 위한 옆에 달린 조종간(행동)
  • 30도로 기울어져 조종사에게 가해지는 관성력을 줄이는 좌석(행동)
  • 민첩한 동작을 위한 전기 신호식 비행 조종 제어 장치(Fly-By-Wire)와 미션 컴퓨터(행동)

F-16은 1976년 이후 4천 5백대가 넘게 만들어졌으며 대한민국 공군을 비롯해 전세계에서 사랑받는 베스트셀러 모델로 자리잡았고, 아직도 생산 중에 있다.

뱀다리: 역사/경영학적으로 OODA 루프에 접근하고 싶다면, 패스트컴퍼니에 실린 The Strategy of The Fighter Pilot를 읽어보시기 바란다.

EOB

토요일, 6월 08, 2013

[독서광] REPETABILITY: 최고의 전략은 무엇인가

경제/경영 블로그로 아름다운 명성(응? 정말?)을 떨치다보니, 청림출판사에서 책을 한 권 보내주셨다. 잽싸게 다 읽은 기념으로 오늘은 '반복 가능한 성공 공식을 찾아라'는 부제가 붙은 '최고의 전략은 무엇인가'를 소개해드리겠다.

우리가 익히 잘 아는 톰 피터스의 '초우량 기업의 조건'부터 짐 콜린스의 '좋은 기업을 넘어 위대한 기업으로'와 김찬위의 '블루오션 전략'에 이어 '히든 챔피언'이 나오면서 좋은 기업이 가져야 하는 특성이 무엇인지에 대해 엄청난 연구가 이뤄졌지만 아무리 좋은 특성을 갖춰 날고 기는 기업이라도 한 방에 침몰할 수 있다는 엄연한 사실 앞에서는 좋은 기업과 최고의 전략을 뽑아봐야 개별 사례 연구와 사후해석 수준에 머물 수 밖게 없는 빚바랜 노력임이 밝혀졌다. 물론 짐 콜린스는 그 와중에서도 '위대한 기업은 다 어디로 갔을까'라는 책을 내어 다시 한번 노익장을 과시하기는 했지만 이 책에서 주장하는 내용 역시 실패한 기업에 대한 변명거리 수준을 넘어서지 못했다. 이런 혼란스런 상황에서 유명한 컨설팅 회사인 베인&컴퍼니에 근무하는 두 저자는 성공한(성공에 대한 명확한 기준은 책 본문에 잘 나온다) 회사 목록을 뽑아보고서 공통점이라고는 찾기 어려운 여러 회사가 성공한 이유가 무엇인지에 대해 무척 궁금했음이 틀림없다.

이 책은 회사가 '지속적'으로 성장하기 위해 필요한 자질이 무엇인지에 대해 설명한다. 답은 이미 표제에 나와있다. 바로 'Repeatability'(반복성)이다. 독자 여러분을 위해 요약하자면, 업종, 지역, 경쟁사, 고객 구성에 무관하게 '과거의 성공을 반복적으로 실행하고 적용하기 위한 구체적이며 단순한 공식을 보유하고 있으며, 중요한 전략적 선택에 있어 이런 공식을 지속적이고 반복적으로 적용한다'라는 모델이 바로 이 책에서 설명하는 성공의 열쇠다. 이런 공식이 과연 유효할까? 어떻게 보면 이 책은 '건강하게 살려면 어떻게 해야 합니까?'라는 고전적인 질문과 '좋은 습관을 들여 규칙적이고 지속적으로 운동하고 건강한 식단을 유지하면 됩니다'라는 고전적인 대답을 경영에 적용한 듯이 보인다. 하지만 이런 다소 따분한 내용은 '만병통치약을 먹으면 무병장수할 수 있다'는 성공한 기업의 비밀을 폭로해버리는 눈이 핑핑 돌아가는 화끈한 내용에 비해 시대를 역행한다는 생각이 들지 모르겠지만 겉멋만 추구하다 정말 중요한 뭔가를 놓치고 있지 않은지 곰곰히 생각하게 만드는 장점이 분명히 존재한다.

호기심이 생기기 시작하는가? 그렇다면 동명의 웹 사이트인 repeatability(영어)를 방문해 여러 가지 소개 자료, 기본 원리/전략을 찾아보거나 repeatable model diagnostic을 방문해 여러분 회사의 반복 가능성 수준에 대해 평가해보기 바란다. 그리고 나서 이 책을 읽어보면 통찰력이 생길 것이다.

백문이 불여일견이라고 여러분께서 기다리고 계신 본문에 나오는 좋은 문구를 함께 살펴보자.

우리가 수집한 데이터에 따르면 단순성, 집중, 지속적으로 변화의 기술을 숙달한 기업이 급격한 변화나 끊임없는 혁신 전략을 구사하는 기업보다 대부분 더 좋은 성과를 낸 것으로 나타났다.
우리는 연구를 통해 지속적인 성공은 어떤 시장을 선택하느냐의 문제가 아니라 훨씬 통제 가능한 변수인 기업을 어떻게 설계하느냐에 따라 좌우된다는 것을 알게 되었다.
우리는 유망 시장을 선택하는 것보다 전략적 방법론과 목표, 그리고 이를 실행하기 위한 비즈니스 모델이 수익성 있는 성장의 핵심이라는 사실을 발견했다.
세 가지 실마리: 1) 시장이 아니라 기업이 핵심이다. 2) 새로운 성장 프로젝트는 대부분 실패한다. 3) 핵심 사업을 재정의 하는 경우, 그 성공 확률은 매우 낮다.
반복 가능한 위대한 모델의 설계 원칙: 1) 성공적인 핵심 사업의 차별화 2) 타협할 수 없는 가치 3) 선순환 학습 시스템
한 때 천하무적의 비즈니스 모델로 여겨졌던 기업들이 모멘텀을 잃어버리게 되는 이유는 핵심 사업에 대한 집중력 상실과 발 빠른 적응에 실패하기 때문이다. 비즈니스 모델 자체의 유효성이나 근본적인 고객 니즈가 사라져서 침체가 온 경우는 전무했다.
성공적이던 반복 가능한 모델이 벽에 부딪치는 두 번째 이유는 기업이 환경 변화에 대한 발 빠른 적응에 실패하면서 시장과 기술 변화가 기업의 경쟁우위의 원천을 약화시켰기 때문이다.
반복 가능한 위대한 모델의 기업들이 앞선 경쟁력을 유지할 수 있는 이유: 1) 경영진과 일선 조직 간의 좁혀진 거리 2) 더 빠르고 현명한 의사 결정 3) 지속적인 개선 기술 숙달
차별화는 모든 사람들이 사용하기는 하나 어느 누구도 제대로 이해하지 못하는 그런 단어가 되어버렸다.
반복 가능한 비즈니스 모델이 지속적인 성장을 하려면 1단계 개별 시장, 2단계 인접 시장, 3단계 복수의 핵심 시장이라는 3단계 복제 방식이 핵심적인 역할을 수행한다.
차별화된 핵심에서 너무 멀리 이동했거나 적절하지 않은 방식으로 성장을 추진했다가 곤경에 처한 기업에게 본래의 공식으로 돌아가는 것이 해법인 경우가 많다.
많은 기업들이 자사의 핵심 사업과 차별성이 가진 잠재력을 온전히 인식하지 못한다. 이런 현상은 다음과 같은 부정적인 효과를 낳는다. 1) 핵심 사업과 인접한 기회를 포착할 수 있는 능력을 크게 저하시킨다. 2) 핵심 사업의 차별화를 위한 투자를 결정함에 있어 판단력을 흐린다. 3) 잘못된 자신감을 심어주어 그 기업과 맞지 않는 사업 분야로 진출하는 오류를 범하게 한다.
경험을 돌이켜볼 때, 자사가 가진 측정 가능한 진정한 차별화 원천을 잘 관리하는 기업은 매우 드물다.
일선 직원의 행동에 있어 잘 정의된 공통의 핵심 원칙과 신념이 기업 성과와 가장 큰 상관 관계가 있음을 발견한 것이다.
자기 조직화 행동이 지속적으로 이뤄지면 업무 속도가 가속화된다. 일 처리 속도가 빨라지면 경쟁업체보다 더 많은 새로운 성장 기회를 포착하게 되고, 단위 시간당 더 많은 새로운 성장 기회를 포착하게 되고, 단위 시간당 더 많은 성과를 올리게 되어 궁극적으로 성장을 가속화한다. 식물의 세포 복제 속도가 빨라지면 성장 속도가 빨라지듯이 비즈니스에 있어서도 동일한 원칙이 적용된다.
카메라와 같은 제품에 딸려오는 사용자 매뉴얼을 본 적이 있을 것이다. 하지만 매뉴얼에는 이 기계가 어떻게 작동하는지, 어떻게 사용하는 것이 가장 좋은 전략인지, 기계가 가진 최대 잠재력은 무엇인지에 대한 개요는 찾아볼 수가 없다.
기업 침체의 근본 원인에 관한 증거를 파악한 바, 실패의 원인은 대개 내부에 있었으며, 대부분 핵심 사업의 잠재력을 최대치로 달성하지 못한 데 기인한다고 결론내렸다.
기업은 전략을 조직원들이 공유할 수 있는 일련의 원칙으로 쳬계화함으로써 직원들의 자기 조직화 행동과 일선에서의 의사결정을 촉진할 수 있다. 이를 '일정한 틀안에서의 자유'라 명명한다.
관행은 조직의 습관에 비유할 수 있다. 하지만 사람의 경우와 마찬가지로 한 번 들인 습관을 바꾸기란 여간 어렵지 않다.
기업이 조직의 체질 개선을 위해 추진한 이니셔티브의 70퍼센트 이상이 실패하는 것은 전혀 놀라운 일이 아니다.
성공이 지속되는 상황이라면 장기적으로 가장 위험하지 않은 길이 단기적으로 가장 위험해보일 수 있다.
근본적으로 적응에 탁월한 기업은 없다.
기업의 실패는 환경이 아닌 잘못된 판단의 결과이다. 그리고 대부분의 잘못된 결정들은 피할 수 있는 조직 내부의 인지적/심리적 역학에 원인을 두고 있다.
다양한 분야에서 최고의 성과를 거둔 사람들의 경우 보통 사람들보다 훨씬 체계적이고 통합적인 지식체계를 가지고 있다. ... 일반적으로 최고의 실력자들이 가진 지식은 상위 원칙으로 통합되고 연결되어 있었다.
인간이 만든 시스템은 자연계보다 훨씬 빠른 속도로 무질서로 치닫는다. 학생들이 빼곡히 앉아있는 교실에서 선생님이 나간지 10분 뒤에 펼쳐질 장면을 생각해보라.
복잡한 조직에서 이뤄지는 일상 업무에서 엔트로피는 대개 집중력 낭비와 손실로 이어진다.
엔트로피는 반복 가능한 모델의 적으로서, 강력한 관리체계가 없다면 질서에서 무질서로 쉽게 떨어질 수 있다.
연구에 따르면, 자연계 시스템과는 달리 비즈니스에서의 엔트로피는 기회의 부재나 노후화로 인해 발생하는 경우는 드물다.
CEO는 타협할 수 없는 가치들이 일선 직원의 역량을 강화하는 방향이 되어야지 제한하도록 만들어서는 안 된다.
제대로 된 리더십이 없다면 언제나 엔트로피가 승리하기 마련이다.
테니스 공을 정확하게 치는 법을 학습하기 위해, 비록 목표가 테니스의 황제로 불리는 로저 페더러의 수준에 도달하는 것은 아닐지라도 그의 발 동작, 훈련 방식, 준비 동작, 테크닉을 연구하는 것은 큰 도움이 된다.

결론: 기업 전략에 대한 이해도를 높이는 목적 뿐만 아니라 본문 곳곳에 나오는 적절한 비유, 은유, 유머를 즐기기 위해서라도 이 책을 꼭 읽어보기 바란다. 강력 추천!

뱀다리: 본문에 나오는 사례 중에 기억해야 하는 사항을 짚고 넘어가겠다. 타이거 우즈의 2009년과 2010년 통계 자료가 나오는데 시사하는 바가 컸다.

20092010
그린적중률68.5%64.1%
10피트 내 피팅 수90.4%87.3%
페어웨이 드라이빙64.3%57.2%
쓰리퍼트 적중률2.0%2.6%
평균 타수68.170.3

통계 자료를 보면 뭐 이 정도야 충분히 용납 가능한 수치가 아닌지 생각들지도 모르겠는데, 우즈는 2009년에 20경기 중 8개를 우승한 반면, 2010년에 17개 경기 중 하나도 우승하지 못했다. '대충하면 어때? 아무도 모를테니.'하지만 현실에서 작은 차이가 큰 결과 차이로 나타난다는 사실을 알고 있다면, 매순간 최선을 다해 역량을 집중하지 않을 수 없을 것이다.

EOB

화요일, 6월 04, 2013

[일상다반사] 모바일의 위력

최근 회사에서 업무용(응?)으로 아이패드를 지급받는 바람에 졸지에 2G폰(삼성), 3G스마트폰(아이폰 4s), LTE태블릿(레티나 아이패드)를 들고다니고 있다. 물론 덕분에 3G 통신이 가능한 킨들은 찬밥 신세가 되었지만 말이다. 2G폰은 제쳐두고서라도 이동 중 네트워크에 접속 가능한 장비가 무려 세 개나 되니 사실상 어디를 가더라도 연결(connected)되어있다고 봐야 한다. 그렇다면 일부 덕스러운 사용자에게만 이런 명제가 성립할까? 아니다. 이번에 "Mobile is eating the world"라는 발표 자료를 보고 나니 전 세계에 공통으로 성립하는 명제라는 사실을 깨닫게 되었다.

발표 자료 중에서 생각해볼만한 몇 가지 내용을 정리해보겠다.

  • 2009년 가정용 PC 대수가 업무용 PC 대수를 앞질렀다고 생각하자 마자 다시 업무용 PC에게 추월당할 상황. 이유는 바로 급격하게 치고 올라오는 태블릿!
  • 2011년부터 스마트폰의 성장률은 넘사벽이 되었고, 조만간 태블릿이 업무용 PC/가정용 PC를 추월할 기세.
  • 인구 성장률과 비교해 스마트폰의 성장률이 가장 높고 다음으로 태블릿이 높음. 순수 성장률 자체만 놓고 보면 태블릿이 가장 높고 다음으로 스마트폰
  • PC는 교체 주기가 4~5년. 스마트폰은 2년. (가정에서) PC는 공유하지만, 스마트폰은 개인마다 보유하는 특성.
  • 모바일 부문에서 마이크로소프트의 매출이 지속적으로 하강하는 추세.
  • 수익은 애플, 매출은 삼성, 숫자는 구글/안드로이드
  • 2012년 전세계 매출을 보면 책, 온라인 광고보다 애플이 앞서는 추세.
  • (넷북을 멸종시켰듯이) 태블릿이 랩탑 시장을 급격하게 대채하는 추세. 태블릿 출하 대수가 이미 데스크탑 대수를 추월.
  • 2012년 여전히 아이패드가 태블릿 중 절반을 차지.
  • 전자책은 상대적으로 관심이 줄어들고 있는 상황. 2011년도 말에 정점을 찍고 줄어드는 추세.
  • 태블릿 웹 트래픽은 아이패드가 전세계적으로 75% 이상 차지.
  • 활동 사용자 수는 페북 모바일 > 구글 안드로이드 > 애플 iOS > 아마존 차례

앞으로는 어떤 사업을 하더라도 돈이 되고 안 되고를 떠나서 반드시 모바일을 생각해야 하는 상황이 왔다는 생각이다. 전통적인 PC/웹 기반이 아직은 버티고 있지만 10년 안에 정말로 불타는 플랫폼(응?)이 될지도 모르기 때문이다. 이제 주변을 돌아보자. 여러분 책상에는 스마트폰과 태블릿이 몇 개 놓여 있는가?

토요일, 6월 01, 2013

[독서광] 보이지 않는 고릴라

본론에 들어가기 전에 잠시 15년도 훨씬 지난 이야기를 하나 꺼내봐야겠다. 택시를 타고 가다 우연히 다른 택시와 충돌하는 바람에 경찰서에 증인으로 조서를 작성할 기회가 있었는데, 사람의 기억력에 대해 놀랄만한 사실을 깨닫게 되었다. 조서를 꾸며보신 분이라면 다들 아실텐데, 사고 순간에 대한 진술만 받지 않는다. 사고 전후 1시간 동안 어디서 뭘 했는지에 대해 최대한 자세히 진술해야 한다. 그 날 나를 맡은 담당자가 마음이 좋았는지, 증인 조서를 다 작성한 다음에 자기가 직접 차를 몰고 나를 데리고 다니면서 내가 진술한 내용이 얼마나 엉터리인지 하나둘씩 짚어주기 시작했다. 그 중에서 가장 기억나는 부분이 강북에 사는 분들이라면 누구나 알고 있는 종로구 소재 사직 터널이다. "사직 터널의 상행선과 하행선 차선이 각각 몇 개일까요?" 이게 바로 담당자의 질문이었고, 나는 완전 엉터리로 대답하고 만 것이다(차선이 문제가 아니라 아예 터널 개수부터 틀렸다). 그 날 이후부터 의식적으로 (나를 포함한) 사람의 기억력에 대해 신뢰하지 않게 되었다.

여기까지 읽고 나면 블로그 주인장의 망가진 기억력에 대해 다들 즐거워하고 있을텐데, 오늘 소개하는 책은 바로 우리 모두의 인지능력에 심각한 문제(아니 제약)가 있다는 사실을 적나라하게 밝히는 '보이지 않는 고릴라'다. 동명의 심리학 실험으로 더욱 유명해진 이 책은 우리의 기억력은 물론이고 신념과 직관에 결함이 있다는 사실 자체를 인정하지 않는(아니 못하는) 분위기에 찬물을 확 끼얹어 정신이 번쩍 들게 해준다. 우선 고릴라 실험부터 한번 보자. 주의 깊게 흰팀이 패스하는 숫자를 세보기 바란다.

자, 실험 과정에서 뭔가 특이한 사항을 눈치채었는가? 눈치 채지 못하더라도 너무 실망하지 말자. 사람들은 원래 두 가지 이상 작업을 할 경우 주의력이 분산되니까 말이다. 이 책은 보이지 않는 고릴라 실험을 필두로 주의력 착각, 기억력 착각, 자신감 착각, 지식 착각, 원인 착각, 잠재력 착각이라는 여섯 가지 착각에 대해 설명하고 있다. 직전에 소개한 [독서광] 우리는 왜 실수를 하는가가 사람의 한계로 인해 벌어지는 다양한 실수를 소개한다면, 이 책은 이런 실수와 행동 이면에 숨겨진 '착각'에 대해 소개하므로 같이 읽어보면 사람에 대한 이해의 폭이 더 넓어지리라 생각한다.

일상에서 착각이 위험한 이유는 매일 우리의 행동에 영향을 미치지만 사실상 본인이 착각하고 있다는 사실을 자각하지 못하기 때문이다. 하지만 착각을 막거나 줄이기 위해 고안한 여러 가지 도구와 기술이 주의를 분산시켜 오히려 더 큰 위험을 초래할지도 모르며, 착각을 막기 위한 인간 능력 계발은 특정 분야를 벗어나 일반적인 분야까지 효과를 보이기는 지극히 힘들기에 늘 열린 마음으로 자신의 한계를 깨닫고 착각을 줄이기 위해 심사숙고하는 방법 밖에 없는 듯이 보인다. 이 책은 여러 사례와 실험 결과를 토대로 자신과 다른 사람들의 정신이 동작하는 원리를 설명하므로 인간으로서 우리 자신이 겸손해지도록 유도하는 긍정적인 효과를 제공한다.

이 책은 일상뿐만 아니라 전문 지식이 필요한 분야에서도 좋은 힌트를 제공한다. 도움이 될만한 부분을 정리해보겠다.

우리 대부분은 지식의 깊이가 얕기 때문에 첫 번째 질문에 대답하면서 알고 있던 내용을 전부 소진한다. 우리는 질문마다 답이 있으며 그 답도 잘 알거라 생각하지만, 이를 설명해보라는 질문을 받기 전까지는 자신의 지식에 결함이 있었다는 사실을 잘 깨닫지 못한다.
2008년 '탑코드 오픈(TopCoder Open)'이라는 컴퓨터 프로그래밍 토너먼트 대회에서 우승해 25,000달러의 상금을 탄 팀 로버츠는 지식 착각에서 벗어나는 일이 얼마나 중요한지 잘 알았다. 요구조건을 충족하는 프로그램 개발에 주어진 시간은 단 6시간이었다. 그는 다른 경쟁자들과 달리 처음 한 시간은 요구되는 사양을 연구하고 담당자에게 질문(적어도 30개)하느라 소모했다. 도전 과제를 완전히 이해한 후에 코딩을 시작한 로버츠는, 더도 말고 덜도 말고 요구된 사항만 정확하게 구현된 프로그램을 완성했다. 프로그램은 제대로 작동했고 작업도 제 시간에 끝났다.
"나는 부주의하고, 기억력이 나쁘고, 지능이 낮고, 멍청하다'와 같은 착각은 일어나지 않는다. 반대로 일상의 착각은 우리가 실제보다 더 많은 것을 알고 기억하고 있다고 믿게 만들며, 자신이 평균보다 우위에 있고, 세상과 미래에 대해 더 많은 것을 안다고 생각하게끔 속인다.
지식 착각에서 벗어나려면, 낯선 프로젝트에 대해 당신이 추정한 소요 기간과 비용 예상이 틀릴 수도 있다는 사실부터 인정해야 한다.
우리는 흔히 지식의 한계를 무시한 채 주장을 펼치는 사람을 선호한다. 자기계발서 저자들 중에서도 무엇을 해야할지 정확하게 말해주는("저거 말고 이거 먹어")식의 작가들이, 합리적인 메뉴 선택권을 주면서 독자 스스로 가장 효과적인 방법을 찾게 하는 작가들보다 인기가 많다.

결론: 이 책을 읽고 나면 최소한 SATA 케이블 음질 테스트 결과, "헉! 말도 안 돼"에 나오는 소위 전문가들의 자신감에 넘치는 설명(“SATA 케이블을 통해 전송·저장한 음원 데이터라면 차이를 못 느낄 수 있지만 SATA 케이블을 통해 실시간 재생을 할 경우엔 데이터 보정이 안 되어 노이즈에 따른 음질 차이가 보다 크게 느껴질 수 있다” 으으으으으으으응?) 정도는 가볍게 무시하고 지나갈 수 있을 것이다.

뱀다리: 이 책 중간 중간에 은근슬쩍 말콤 그래드웰을 디스하는 내용이 나오는데 의외로 꼼꼼하다. 그리고 구글 안경 쓰면 거리에 고릴라 지나가도 못 봐?라는 관련 기사도 떴네?

토요일, 5월 25, 2013

[독서광] 호감이 전략을 이긴다(likeonomics)

살다보면 재미있고 흥미로운 책을 많이 접하기도 하지만 종종 괴작(?)에 화들짝 놀라기도 한다. 오늘은 이런 괴작에 속하는 책 하나를 소개해드리겠다. 독자 여러분을 위해 괴작에 대해 잠깐 짚고 넘어가면 책을 구성하는 단위 내용은 나름 재미있고 그럴싸해보이는데, 전체를 합쳐놓고 나면 각 단위 내용이 서로 모순되거나 책이 의도하는 목적을 달성하지 못하거나 책이 주장하는 내용과 반대로 내용을 전개하는(응?) 문제가 있는 작품이라 보면 되겠다.

자 그렇다면 이 책이 괴작으로 선정된 이유를 살펴보자. 제목만 보면 사고 싶어지는 '호감이 전략을 이긴다(likeonomics)'는 원서 제목 'Likeonomics: The Unexpected Truth Behind Earning Trust, Influencing Behavior, and Inspiring Action'으로 상당히 길다. 신뢰, 영향력, 행동 유도, 호감이라는 멋진 단어를 동원한 제목만 딱 보고 이 책이 어떤 범주에 속하는지 한번 맞춰보기 바란다. 경제학? 자기 계발? 심리학? 사회학? 아니다. 놀랍게도 이 책은 '마케팅' 분류에 속해야 마땅하다. 이 책은 "물건을 많이 팔고 이미지를 높이고 정치에서 승리하기 위해서는 신뢰가 필요하다"로 요약 가능하며 다른 특별한 내용은 없다. 참으로 쉬운 이야기를 하기 위해 저자는 여러 가지 일화, 사례, TRUST로 불리는 다섯 가지 호감 경제학의 기본 원리를 소개하지만 너무나 졸립고 따분하고 지루해서 1부는 꾹 참고 읽으려 노력했지만 도저히 못 참고 2부부터는 건성으로 페이지를 넘기기에 급급했다. 본문에 나오는 좋은 문구? 미안하지만 이 책에서 그런 건 없다. T_T

국내와 해외 온라인 서점에서 독자들의 평은 그리 나쁘지 않았기에 B급 주인장의 편향된 의견일지도 모른다는 걱정이 살짝 들어 구글에서 검색해보니 국내외 블로그에 이 책이 언급되는 경우가 많지 않았다(일반적인 내용뿐이다). 왜 그럴까? 간단하다. 이 책은 알기 쉽고 평이하게 마케팅 이론을 설명하려는 전략을 세웠지만 책에서 그렇게 열심히 침 튀기며 주장하는 호감을 독자들에게 주지 못했기 때문이다. 설상가상으로 본문에 나오는 내용이나 근거도 상당히 자의적으로 해석하는 경우가 많아 타인 계발서의 특성까지 고루 겸비하고 있다. 재미도 없고 통찰력은 고사하고 호감을 불러일으키지 못하는 내용에 누가 시간을 투자해 열심히 읽고 블로그로 정리하겠는가?(예외: 독자 여러분을 위한 이 블로그)

결론: 신뢰에 대해 궁금하다면 [독서광] 위대한 기업의 조건을 읽어보자. 호감에 대해 궁금하면 로버트 치알디니의 '설득의 심리학'을 읽어보자. 괴작이 뭔지 궁금하면 likeonomics를 읽어보자.

주의 사항: 이 블로그 내용은 개인의 생각을 정리하고 있으므로 사실과 다를 수 있다. 따라서 어디까지나 참고 자료로만 활용해야 하며, 반드시 직접 온오프라인으로 목차와 본문 내용을 검토한 다음 본인의 판단에 따라 책을 구매하기 바란다.

화요일, 5월 21, 2013

[일상다반사] 20대 알았으면 좋았을 26가지 시간 관리 기법

20대에 알았으면 좋았을 26가지 시간 관리 기법(20 Time Management Hacks I Wish I'd Known at 20)이라는 슬라이드를 보니 여러 가지 좋은 이야기가 있어 독자 여러분들께 소개한다. 슬라이드 내용 중에 눈에 띄는 부분을 정리하면 다음과 같다.

  • 하루에 실제 작업 시간으로 4~5시간만 잡아라. --> 욕심내봐야 소용없다는 사실을 알면서도 하루가 마치 24시간인 듯이 계획을 짜곤 한다. 물론 밤샘을 하면 되긴 하지만... 대부분 역효과다.
  • 몰입했을 때 일을 더하고, 그렇지 않을 경우 쉬어라. --> 일하는 상태도 아니고 노는 상태도 아닌 어중간한 상태로 하루를 날리지 말자.
  • 시간은 황금이며, 여기에 걸맞게 대우하라. --> 말이 아니라 행동으로.
  • 멀티태스킹을 중단하라. 초점을 흐릴 뿐이다.
  • 마감 효과(마감이 닥쳤을 경우 열심히 하는 효과)를 잘 활용하자.
  • 일을 하려면 실제 일을 해야 한다. 짧은 작업을 여러 개 완료하는 식으로 눈을 굴려 커다란 눈사람을 만들자.
  • "Doing better than perfect." --> 페이스북 모토. 점진적으로 개선하자.
  • 더 많은 작업 시간이 높은 생산성을 담보하지는 않는다. 제약을 적극적으로 활용하자.
  • 단순 작업과 집중력이 필요한 작업을 분리하자. --> 또한 생각과 실행을 분리하자.
  • 우선 순위가 같은 작업이 존재해서는 안 된다. --> to-do에 기록된 우선 순위에는 동점이 없도록 한다.
  • 긴 작업은 여러 개로 나눠 성취감을 느끼도록 하자.
  • 작업을 적절히 남에게 위임하자.
  • 어제 친 홈런이 오늘 홈런을 보장하지는 않는다. 어제가 아니라 오늘과 내일에 초점을 맞추자.
  • 모든 작업에 마감일을 두자. 마감일이 없는 작업은 끝나지 않는다.
  • 항상 메모하자. --> 자신의 기억력을 믿지 마라.
  • 좋은 생각이 떠올랐을 때 메모하고 잊어버려야 현재 작업에 집중할 수 있다. --> 사람 머리는 컴퓨터처럼 정밀한 기억 용도로 만들어지지 않았다.
  • 종종 휴식을 취하자.

관리 기법은 알겠지만 어떻게 시작해야 할지 잘 모르겠다면, 직전에 소개한 [독서광] 라이프 해커에 나오는 여러 도구의 도움을 받아 지금 당장 작은 일이라도 실천에 옮기면 좋겠다. 자기 계발은 '자기'가 해야한다는 사실을 다시 한번 기억하기 바란다. 말보다 실천!

EOB

토요일, 5월 18, 2013

[독서광] 우리는 왜 실수를 하는가

사람들은 누구나 실수를 한다. 그리고 자기에게 불리한 내용은 기가 막힐 정도로 정말 잘 잊어먹는다(참고로 여기서 주어는 없다). 자신이 정말 대단한 존재라고 생각하면서 세상을 자기만의 시각으로 보고 싶은 것만 본다(역시 주어는 없다). 하지만 과유불급이라 도가 지나치면 자신뿐만 아니라 남들에게도 큰 민폐를 끼치기 마련이다. 오늘 소개드리는 '우리는 왜 실수를 하는가'는 사람들이 실수를 하는 이유와 이를 최대한 줄이기 위한 방법을 설명하고 있다. 물론 실수는 이성적으로 제어할 수 있는 성질이 아니므로 완벽하게 방지하지는 못하지만 어찌되었거나 최대한 인간의 내면에 숨겨진 실수 유발 인자를 억제해야 한 방에 훅 가는 상황을 피할 수 있을 것이다. 우선 서문에서 나오는 실수의 정의를 같이 살펴보자.

실수(mistake) 명사: 1: 무언가의 의미나 숨은 뜻을 잘못 이해하는 것. 2: 그릇된 판단, 부적절한 지식 또는 무관심 등으로 인한 그릇된 행동이나 진술.

이 책은 지금까지 심리학과 경제/경영학에서 연구된 결과를 토대로 사람들이 정의의 2번 항목을 저지르는 이유를 다양한 각도에서 설명한다. 물론 컴퓨터 vs 책 블로그를 애독하신 독자분들께서는 이 책에서 소개하는 상당수 주제와 사례들에 대해 이미 파악하고 계실 가능성이 높지만, 이 책은 '실수'라는 관점에서 특화된 주제를 다양한 각도에서 다루고 있기에 생각 정리에 도움을 준다. 각 장의 제목만 봐도 흥미진진한 목차를 간단한 설명과 함께 정리해볼까?

  • 평상시 보는 것의 일부만 인식하고 그 일부마저도 엉터리라는 내용을 소개하는 '인간은 보면서도 때로는 제대로 보지 못한다'
  • 세부 요소가 아니라 의미를 중요시하며 전부가 아니라 부분을 기억한다는 '인간은 의미를 추구한다'
  • 두뇌는 순간적 판단과 대상의 지엽적인 특징을 더 중요하게 생각한다는 '인간은 부분을 보고 전체를 파악한다'
  • 사후해석의 천재며 자기중심적이며 편향에 가득찬 인간을 그리는 '인간은 장밋빛 안경을 쓰고 있다'
  • 멀티태스킹이 독이라는 사실을 다양한 사례로 밝히는 '인간은 걸으며 껌을 씹을 수 있지만 더 이상은 어렵다'
  • 행동 경제학에서 많이 보던 내용을 다루는 '인간의 사고방식에는 문제가 많다'
  • 단어를 구성하는 철자의 앞부분과 정황을 파악해 자동으로 의미를 유추하한다는 '인간은 대충 훑어본다'
  • 지리적인 위치나 이야기를 외우기 위해 큰 줄기만 가져가고 세부 내용은 나중에 채워넣는다는 '인간은 정돈된 것을 좋아한다'
  • 과신, 위험과 보상을 다루는 '인간은 일단 저지르고 본다'
  • 자신의 외모, 지식, 능력에 대해 평균 이상으로 믿는 이유를 설명하는 '인간은 자신이 평균 이상이라고 생각한다'
  • 창의력과 연습, 틀에 박힌 사고를 다루는 '인간은 틀에서 벗어나지 못한다'
  • 대안들을 제안함으로써 정도를 유지하게 만드는 여러 기법을 소개하는 '인간은 스스로를 제약하지 못한다'
  • 행복에 대해 정리하는 '초원은 생각만큼 푸르지 않다'
  • 마지막으로 본문에 나오는 여러 가지 실수에 대한 대비책을 총정리하는 '맺음말_ 작게 생각하라!'

자 그러면 목차에 이어 독자 여러분들께서 기대하시던, 본문에 나오는 재미있는 구절을 같이 살펴보자.

상점이나 은행 같은 곳에서 줄을 설 때 조금이라도 짧은 줄을 찾고 싶다면 왼쪽부터 살펴봐야 합니다.
사람들은 표적을 손에 넣기 어려울 것으로 판단될 때는 서둘러 중단하는 경향이 있다. 그러고서도 아무런 문제도 없는 것처럼 말한다.
사람들의 얼굴을 기억할 때 머리카락이나 눈 같은 신체 부분이 아니라 성실함과 호감도 같은 감성적 특징을 바탕으로 인식한다.
직관으로 처음 선택한 답을 고수해야 한다고 지금도 많은 사람들은 생각합니다. 충분한 근거도 없이 말이죠.
사람들은 자신의 행동을 상기할 때 장밋빛 안경을 쓰는 경향이 있다. 의도적으로 왜곡하려는 뜻은 없지만, 과거의 말과 행동을 자연스럽게 미화하려고 하는 것이다.
사건의 결말을 충분히 알고 나면 과거의 그 사건을 인지하고 기억하는 방식도 달라진다는 것이 사후해석 편향의 핵심이다.
미국 전역의 국민을 대상으로 한 조사에서 남자들이 말한 평생의 섹스 파트너 수치는 일반적으로 여자들에 비해 최대 네 배나 많았다. 한 남자의 새로운 파트너는 결국 한 여자의 새로운 파트너와 수적으로 동일함에도 이런 결과가 나타났다.
자신은 부정(不正)하지 않다고 확신하는 사람들일수록 이후의 잇따른 상황에서 부정한 행위를 반복하는 것으로 나타났다.
결정의 결과가 모호할 때 사람들은 더 큰 도박을 하는 경향이 있다. 반대로 결과가 분명할수록 사람들은 보수적으로 변한다.
투자자들은 주초에 배포된 소식에는 각별한 관심을 보이면서 금요일처럼 주 후반에 나오는 소식은 대충 훑어보곤 한다.
특히 사람들은 익숙한 것일수록 대충 훑어보는 경향이 있다.
대화의 목적은 사실 전달이 아니라 이미지(인상)을 창조하는 데 있다. 대화에서 정확성은 이미지 관리보다 후순위라는 뜻이다.
남성은 자신의 매력에 대해서도 실제보다 호의적으로 평가한다.
여성보다 남성이 더 적극적으로 소프트웨어 오류를 수정하는 이유를 능력 차이라기보다는 자신감의 차이에서 비롯된다. 자신에게 회의적인 사람은 잘못된 전략을 과감히 버리지 못하고 대안도 받아들이려 하지 않는다. 그저 지금껏 해오던 대로 고수할 뿐이다.
남자들은 (길찾기 도중) 경로에서 벗어났다고 해서 반드시 방향을 상실했다고 생각지는 않는다.
경험과 전문성이 반드시 비례하지는 않는다. 즉 동일한 행위를 반복한다고 해서 반드시 더 나은 존재가 되는 것은 아니다. 연습이란 그 행위에 대한 기억력을 향상시키는 방향으로 진행되어야 한다. 장기간에 걸친 정확하고 신중한 연습만이 특별한 지식의 보고, 즉 머릿속에 소중한 지식의 도서관을 만들 수 있다. 머리속에 도서관을 보유한 전문가는 다른 이들이 인식하지 못하는 패턴을 재빨리 포착할 수 있다.
각 분야 전문가들의 머릿속에는 커다란 도서관들이 하나씩 있기 때문에 이들은 상황을 빠르게 이해하고 문제점도 재빨리 파악할 수 있다.
사람들은 설명서를 제대로 읽지 않을뿐더러 읽어도 무시하거나 잘못 이해하는 경우가 많다고 한다.
무척이나 생소한 상황에서도 사람들은 깊이 생각하기보다 행동을 먼저 시작하려고 한다.
사람들은 뭔가를 처리하는 방법을 배우고 나서는 그 방식 하나에만 집착하는 경향을 보인다.
인간은 당면한 문제를 해결할 때 그리 창의적인 편은 아닌 것 같다. 특히 현재와 비슷한 상황을 과거에 겪으면서 그 해결책을 이미 학습한 상황에서는 더더욱 그러하다.
인간의 행동이 반드시 자기 의지대로 이뤄지는 것은 아니다. 때로는 자신의 이익에 반하는 방향으로 행동할 수도 있다.
여러 사람이 동일한 실수를 반복한다면, 그 실수의 원인부터 파악해야 한다. 그 원인은 개인이 아닌 조직에 있을 가능성이 높다. 따라서 이런 조직적인 실수의 원인을 찾을 때는 개인보다 그 위, 다시 말해 '아래'가 아닌 '위'를 바라보아야 한다.
복잡한 뭔가를 판단할 때 사람들은 쉽게 지나칠 수 있는 것에 필요 이상으로 집착하곤 한다.
상황의 작은 변화가 사람의 행동에는 매우 큰 영향을 미칠 수 있다.
주식 투자를 한다면, 선택한 종목 이외 선택하려 했지만 결국 포기한 다른 종목들의 주가 변화를 살펴보자. 이 때 그 종목을 선택한 이유 또는 포기한 이유를 기록해둬야 한다. 선택한 종목과 포기한 종목의 상대적 실적은 어떤가?
행복하다고 생각하는 사람일수록 특정 과제에 대한 창의적인 해법을 많이 내놓았다. 흥미로운 사실은 사람들을 행복하게 만드는 데 많은 시간이 필요하지 않다는 점이다. (사탕이나 초콜릿만으로도 효과가 있다)

결론: 사람들이(아니 내가) 일상에서 저지르는 '실수'에 대해 일목 요연하게 정리한 이 책은 평상시 크고 작은 실수를 많이 하시는 분이라면 꼭 한번 읽어보면 좋겠다. 그런데 자신이 실수를 많이 한다고 생각하시는 분들은 실수를 전혀 안 한다고 생각하시는 분들에 비해 오히려 실수를 덜 하니 이게 치명적인 함정이다. T_T

EOB

화요일, 5월 14, 2013

[B급 프로그래머] quora, stackoverflow, serverfault 활용 팁

소프트웨어 개발자라면 누구나 한번 정도 quora, stack overflow, server fault에 들어가서 필요한 자료를 찾아봤을 것이다(주의: N에서 제공하는 지식*을 사용하는 분들도 계실지 모르겠지만... 소프트웨어 개발 관련 내용 검색은 지식*을 믿으면 난감한 상황에 빠질 가능성이 높다). 예전에는 MSDN이나 OTN이 가장 정리가 잘 된 개발자 문서를 제공한다고 알려졌지만, 오픈 소스 열풍이 불면서 점차 무게 중심이 이동하고 있다. 그렇다면 이런 질문/대답 사이트를 제대로 활용하는 방법은 무엇일까?

크게 다음과 같은 두 부류로 나눠질 것 같다. 1) 적극적으로 질문을 올리고 대답하는 방법 2) 필요할 때마다 정보를 검색하고 피드백을 주는 방법. B급 프로그래머는 개인 블로그를 운영하는 관계상 1)번까지 하기에는 시간이 많이 부족하므로 주로 2)번에 초점을 맞추고 있는데, 오늘 독자 여러분을 위해 몇 가지 활용 팁을 소개하려 한다. 뭐 다들 이미 충분히 알고 계시리라 믿어 의심치 않지만, 정리 차원에서 이야기를 풀어보겠다. ;)

  • 질문과 대답이 올라온 시각이 중요하다. 기술 관련 내용은 시간에 따라 빠르게 바뀔지도 모르므로 주의 깊게 읽고 최신 자료가 없는지 확인해야 한다. 물론 역사적인 이유 때문에 과거 사례를 알고 싶은 경우나 거의 고정 불변의 사실로 알려진 내용에 대해서는 시간이 지남에 따라 신뢰도가 높아지므로 고의로 과거 자료를 찾기도 한다.
  • 가장 인기 높은 대답부터 읽지만 경우에 따라서는 전체 답을 뒤져야 할지도 모른다. 아주 특이한 환경이나 특이한 요구 사항으로 인해 절대 다수가 인정한 대답 이외에 소수가 인정한 대답이 당신에게 딱 맞는 정답일 수도 있다.
  • 검색 결과 모순되거나 상충하는 여러 대답이 나올 경우 추가 조사가 필요하다. 구글에서 두 가지 입장을 모두 검색해본다.
  • 검색 결과가 없는 경우에는 두 가지를 의심해 봐야 한다. 1) 모든 사람이 다 알고 있는데 나만 모른다(즉 문제가 아니다). 2) 아무도 이 문제에 대해 관심이 없다(즉 문제가 아니거나, 다른 각도로 문제를 바라 봐야 한다) 문제가 아님에도 불구하고 문제라고 생각하면 여기에 대해서는 해법이 없으므로 정말 조심해야 한다.
  • 댓글을 유심히 살펴보자. 질문에 대한 대답에 댓글이 달릴 경우가 있는데, 의외로 유용한 정보를 담고 있는 경우가 많았다(예: 틀린 부분 지적, 보충 설명, 추가 자료).
  • 답변 내용을 100% 믿지 마라. 어디까지나 질문한 사람과 답변한 사람 사이에만 유효할지도 모르는(!) 대답이며, 100% 당신에게 유효하다는 보증은 그 어느 곳에도 없다.
  • quora 같은 경우에는 뉴스레터를 구독하면 사람들 관심을 많이 끄는 글을 접할 수 있다. 남들이 많이 읽은 글은 대화의 주제나 소재거리로 활용하기에 적합하므로, 평상시에 이런 글을 틈틈이 읽어두면 무척 유용하다.
  • 유익한 대답일 경우 시스템에서 제공하는 기능에 맞춰 피드백(예: 별점, 좋아요)을 해준다.
  • 좋은 질문과 답변 등은 북마크, 트위터, 개인 위키, 블로그를 사용해 정리하는 습관을 들이면 남들에게도 도움이 되며 자신의 정리력/기억력도 높일 수 있다.

자, 지금까지 몇 가지 팁을 소개했는데, 여러분만의 좋은 팁이 있으면 댓글로 알려주시면 감사하겠다. 정보는 공유될 때 가치가 더욱 올라가는 법이니...

EOB