화요일, 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년 안에 정말로 불타는 플랫폼(응?)이 될지도 모르기 때문이다. 이제 주변을 돌아보자. 여러분 책상에는 스마트폰과 태블릿이 몇 개 놓여 있는가?