린 스타트업(The Lean Startup) – 소개

February 26th, 2013

요즘 이것저것 많은 생각들 속에 갑자기 읽고 싶어진 책, 린 스타트업(The Lean Startup). 이전부터 읽고 싶은 책 리스트에 있었지만, 다른 일들 때문에 우선순위에서 밀렸는데, 요즘 갑자기 스타트업, 창업에 대한 생각들이 마구 마구 머릿속을 헤집고 다니면서 갑자기 읽고 싶은 책 우선 순위에 올라갔다.

싱가포르에서 서점을 두 군데나 가 봤는데 없어서, 마지막으로 오프라인 매장이 가장 큰 키노쿠니야라는 서점에서 구할 수 있었다. 온라인 서점에서 주문할 수도 있었지만, 싱가포르는 빠른 배송이 4~7일 정도 걸린다는 얘기에 포기하고, 오프라인 매장에서 구입했다. 책 값은 33불, 약 3만원 정도 줬지만, 구할 수 있어서 다행이라는 마음이었다.

TheLeanStartup

원본 이미지: 아마존 (http://www.amazon.com/Lean-Startup-Entrepreneurs-Continuous-Innovation/dp/0307887898)

구입하자마다 Introduction을 읽었는데 여러가지로 참 마음에 와 닿는 부분들이 많이 있다. 사실 개발자라면 조금은 익숙한 린(Lean)이라는 단어와, 이제는 혁신의 아이콘이 되어 버린 단어 스타트업(Startup), 이 두 단어로도 참 끌리는 책이지 않을 수 없다.

앞으로 읽으면서 정리할 수 있으면 정리하겠지만, 우선은 소개하는 부분에서 정리하고 싶은 것들을 먼저 정리하자.

모든 학문은 연결되고 있다.

사실 이전부터 정말 공감하고 있는 사실인데, 이제 모든 학문은 연결되는 것 같다. 하나의 학문만을 파고 든다고 해서 전문가가 되는 시대는 지난 것 같다. 하나의 학문에 대해서 깊게 이해하면서 그 학문이 어떻게 다른 학문들과 연결되는지, 어떤 영향을 미치면서 서로 발전해 나아가는지를 고심해야 할때이다.

예를 들어, 소프트웨어 설계 패턴(Software Design Pattern)이 있다. 패턴이라는 개념은 컴퓨터 과학에서 처음 나온 생각이 아니다. 건축학에서 이미 오래전부터 사용되어지고 있는 개념이었다. 이 개념을 소프트웨어 설계에서 가져다 사용하면서, 이제는 컴퓨터 과학, 소프트웨어 개발에 관련된 일을 하고 있다면 무조건 알아야 하는 개념이 된 것이다.

또한 이 글에서 말하는 린(Lean) 방법론도 마찬가지다. 린 방법론은 토요타에서 자동차를 생산하면서 어떻게 하면 품질이 좋은 자동차를 빠른 시간안에 생산할 수 있을까 라는 고민의 결과로 얻어진, 눈으로 보여지는 제품을 생산하는 방법과 관련된 것이었다. 하지만, 이 방법론이 눈으로 보이지 않는 소프트웨어의 개발에 영향을 미치고, 소프트웨어 개발에서 아주 많이 사용되어지는 린 소프트웨어 개발방법론(Lean Software Development Methodology)으로 발전된 것이다.

이 정도만 보아도 모든 학문이 연결되고 있고, 이미 많은 부분 공통분모들을 가지고 있다는 사실을 느낄 수 있을 것이다. 10년, 20년 전만 해도 건축학이나 제품 생산 관리 방법론 같은 것들은 컴퓨터 과학에서 다루는 소프트웨어 개발 방법론과는 아무런 상관이 없어 보였다. 하지만, 이제는 건축학과 제품 생산 관리 방법론에서 사용되던 개념과 실제 행동 지침들이 소프트웨어 개발 방법론은 아주 크게 변화시키고 발전시킨 장본인이 되었다.

그렇다면 이 책에서는 또 어떻게 더 연결해 나가고 있을까? 그렇다. 새로운 아이디어를 가지고 회사를 설립하고 회사를 키워나가는 일련의 과정들에 린에서 나오는 내용들을 연결한 것이다. 그리고 저자의 경험대로 이 방법은 아주 성공적이었고, 현재는 전 세계의 많은 스타트업 회사들이 이 방법에서 많은 도움과 조언을 받고 있다.

I began to search outside entrepreneurship for ideas that could help me make sense of my experience. I began to study other industries, especially manufacturing, from which most modern theories of management derive. I studied lean manufacturing, a process that originated in Japan with the Toyota Production System, a completely new way of thinking about the manufacturing of physical goods. I found that by applying ideas from lean manufacturing to my own entrepreneurial challenges - with a few tweaks and changes - I had the beginnings of a framework for making sense of them. - page 6

혁신의 대명사 스타트업(Startup)은 기존의 매니지먼트(Management)와는 거리가 멀다?

우리가 쉽게 오해하는 것중 하나가 스타트업이라고 하면 웬지 아주 큰 혁신이 있을 것 같고, 기존의 매니지먼트라는 개념에서는 혁신을 가지는 스타트업이 나올 수 없을 것 같은 생각이 든다. 하지만, 이 책의 저자에 의하면 스타트업도 매니지먼트의 한 종류에 속할 수 있다는 것이다. 기존의 매니지먼트를 무조건 버리지 말고, 잘 활용해야 한다는 이야기로 받아들일 수 있다. 기존의 생각과 개념을 무너뜨리고 새로운 발상의 전환을 가져오는 것이 혁신(Innovation)이다. 우리가 어떠한 상황에서도 지키고 있는 그것이 무엇인지 잘 찾아내어서 그것에 대한 발상의 전환을 가져보는 시간이 큰 도움이 될 것 같다.

Entrepreneurship is a kind of management. No, you didn't read that wrong. We have wildly divergent associations with these two words, entrepreneurship and management. Lately, it seems that one is cool, innovative, and exciting and the other is dull, serious, and bland. It is time to look past these preconceptions. - page 3

아직 소개부분밖에는 읽지 못했지만, 참 마음에 드는 책이다. 요즘 내가 고민하는 것들에 대한 정답을 주지는 못하겠지만, 큰 도움이 될것같다. 300페이지에 달하는 영어 원서인데, 최대한 빨리 읽고 좀 정리를 해야겠다.

이 책은 스타트업에 관심이 있는 사람에게라면, 큰 도움이 될 것 같고, 비록 스타트업에 관심이 없다 할지라도 조직을 관리하며 무엇인가 혁식적인 것들을 시도해보려는 관리자에게도 도움이 될 것이다.

우리의 생각은 많은 버그를 가지고 있다!

January 24th, 2013

오늘 Pragmatic Thinking & Learning 이라는 책의 Chapter 5. Debug Your Mind 를 읽으며, 사람의 생각과 사고(Thinking)가 얼마나 불완전한지 다시 한번 느낄 수 있었다. 거기에다가 우연히 황순삼님의 소프트웨어 프로세스 이야기 블로그에서 멘사 천재들의 주식투자 : 예측력과 과신 이라는 글에서 버그가 많은 우리의 머리에서 나오는 결과들을 과신했을 때, 어떤 결과가 나오는지도 공감할 수 있는 기회가 되었다.

우선은 멘사 천재들의 주식투자…대박? 이라는 글을 먼저 읽어보자.

20130123_6016203

 

Source: http://cn.moneta.co.kr/Service/paxnet/ShellView.asp?ArticleID=2013012314592302897

이 글에서는 세상에서 가장 똑똑하다는, 지능지수(IQ) 상위 2%안에 들어가 가입이 가능하다는 멘사(Mensa) 회원들의 주식투자에 대해서 이야기 하고 있다. 이런 사람들이 모여서 과학적인 사고들을 모아서 주식투자를 한다면 당연히 큰 수익이 나지 않을까? 라는 생각이 들게 마련이다. 하지만 결과는 참담했다고 한다.

그러나 실제 사례를 보면 이러한 선입관이 여지없이 무너지고 만다. 미국 ‘스마트 머니’ (Smart Money) 잡지 (2001년 6월호)는 멘사회원들이 만든 투자클럽 (Mensa Investment Club)의 15년간의 주식투자 성과를 검토한 후 깜짝 놀랄만한 결과를 발표했다. 1986년부터 2001년까지 대형주 중심의 S&P 500 지수는 연 15.3%씩 올랐는데 반해, 멘사 천재들의 주식투자 수익률은 연 2.5%로 형편없었다. 천재들만 모여 있는 멘사 투자클럽의 수익률이 보통사람들이 대다수인 전체시장 보다 무려 13% 포인트나 낮은 성과를 기록했다니 정말 믿기지 않는 일이다.

이 기사에서는 가장 큰 이유중에 하나를 과신(overconfidence)이라고 이야기한다. 즉, 주식투자를 하면서 "에이, 이 일은 결코 일어나지 않을거야."라고 믿으며 투자를 했는데, 그 일이 일어난 것이다. 그래서 손해를 보게 되었을 것이다. Pragmatic Thinking & Learning 책에서도 "Never say never."라는 이야기로 "결코 일어나지 않을거야라는 말을 결코 하지 마라."라고 이야기 하고 있다.

Never say never.
결코 일어나지 않을거야라는 말을 결코 하지 마라.

환순삼님의 글에서도 2008년 미국 대선 결과를 정확하게 예측한 네이트 실버(Nate Silver)의 책을 다음과 같이 인용하면서 실패의 이유를 과도한 자신감(과신)이라고 소개하고 있다.

현실 세계는 비선형적이라서 조건이나 경계값에 따라 결과는 크게 달라지며, 수학적 모델 자체에 편향오류(biases)가 포함되게 마련이다. 사람들은 소요시간 추정시 낙관하거나 최선의 상황을 가정하여 추정하는 경향이 높다.(Newby-Clark, I. R., et al, People focus on optimistic and disregard pessimistic scenarios while predicting their task completion times, 2000).

Pragmatic Thinking & Learning 의 저자는 이러한 사고(Thinking)의 문제를 다음과 같은 4가지 카테고리로 나누고 있다.

  • Cognitive biases: How your thinking can be led astray
  • Generational affinity: How your peers influence you
  • Personality tendencies: How your personality influences your thoughts
  • Hardware bugs: How older portions of your brain can override the smarter portions

이 중에서 첫번째로 나오는 것이 바로 인지적 편향(Cognitive biases)이다. 즉, 사람의 "어떤한 사실을 분명하게 인식하여 앎(인지: Cognition)"이라는 것이 얼마나 한 쪽으로 치우쳐(편향: bias) 있는지에 대한 이야기이다. 사람의 사고(Thinking)는 언제든지 제 길에서 벗어나 길을 잃고 헤맬수 있다는 사실을 알아야 한다.

이 책에서는 확률에 관한 이야기도 하고 있다. 2004년 통계에 따르면, 미국에서 번개에 맞아 사망할 확률은 6,383,844:1 이라고 한다. 6백만대 1이기 때문에 내가 번개에 맞아 죽게 되는 일은 없을 것 같다고 생각할 수도 있다. 그런데, 그런 생각을 가진 사람들 중에 1년에 46명에 실제로 번개에 맞아서 죽음을 맞이하게 된다. 그래서 "Never say never."를 꼭 기억하라고 한다.

그렇다고 너무 의식하는 것(내가 46명 중 하나가 되어서 번개에 맞아 죽을지도 모르니 밖에 나가지를 않는다든지...)은 당연히 더 안 좋은 결과를 가져오겠지만, 무슨일을 하든지 간에 항상 최악의 상황(예를 들어 "설마 그런일이 있어나겠어?" 라면서 드는 생각들...)도 염두에 두는 것이 현명하지 않을까 싶다.

[번역] 함수형 프로그래밍(Functional Programming) 기초

January 21st, 2013

함수형 프로그래밍(Functional Programming) 기초

 

원문: Functional Programming Basics | PragPub, January 2013
저자: Robert C. Martin (Uncle Bob) (Blog: http://cleancoder.posterous.com/)
번역: 오광신 (Email: kwangshin (at) gmail.com)

 

함수형 프로그래밍이 복잡하고 어려워보이나요? "Uncle Bob(엉클 밥)"으로 불리는 Martin(마틴)이 함수형 프로그래밍 패러다임에서 반드시 알아야하는 기본적인 것들을 파헤쳐 주고, 왜 지금 함수형 프로그래밍을 꼭 이해해야만 하는지 그 이유를 설명해줍니다!

 

functional_programming

Source: http://wadler.blogspot.sg/2008/04/functional-programming-is-beautiful.html

아마도 지금쯤이라면 대부분의 소프트웨어 개발자들이 함수형 프로그래밍에 대해서 한번쯤은 들어보았을 것이다. 다시 말하면 수많은 개발자들이 주위에서 함수형 프로그래밍에 대해서 이야기하는데, 귀를 막고 있는 것이 아니라면 어떻게 한번도 들어보지 못할 수 있는가? 요즘 새롭게 뜨고 있는 Scala(스칼라), F#(에프샵), Clojure(클로저)와 같은 언어들이 함수형 프로그래밍 언어들이다. 또한 꽤 오래전에 발표된 함수형 프로그래밍 언어인 Erlang(얼랑), Haskell(해스켈), ML(엠엘)과 같은 언어들에 대한 이야기들도 심심치 않게 들리고 있다.

그렇다면, 이 함수형 프로그래밍 언어란 무엇일까? 왜 함수형 프로그래밍이 앞으로 다가올 획기적인 변화중에 하나일까? 함수형 프로그래밍 안에는 과연 무엇이 있는 것일까?

먼저, 함수형 프로그래밍이 앞으로 다가올 획기적인 변화중에 하나라는 것은 거의 틀림없는 사실이다. 왜 틀림없는 사실인지 대해서는 이해할 수 있고, 신뢰할 수 있는 이유들과 함께 이 글 후반부에서 이야기하도록 하겠다. 왜 그러한 이유들을 지금 당장 이야기 하지 않고, 이 글 후반부에서 설명하는 까닭은, 그러한 이유들을 이해하기 위해서는 함수형 프로그래밍이 무엇인지 먼저 알아야 하기 때문이다.

내가 지금 소개하려는 다음 문장이 수 많은 사람들을 당황하게 만들지도 모르겠다. 왜냐하면, 나는 지금 가장 단순한 방법으로 함수형 프로그래밍을 정의하려고 하기 때문이다. 나는 지금 함수형 프로그래밍을 줄이고 줄여서 가장 핵심이 되는 부분만 남겨놓으려고 한다. 사실 함수형 프로그래밍이라는 주제가 아주 방대하고, 아주 훌륭한 개념들로 가득 차 있기 때문에, 어떤면에서는 이렇게 단순하게 정의하는 것이 올바른 방법이 아니라는 사실도 알고 있다. 그리고 이 글에서 그런 훌륭한 개념들을 더욱 잘 이해할 수 있는 힌트를 얻게될 수도 있다. 하지만 지금 당장은 함수형 프로그래밍을 다음과 같이 단순하게 정의하려고 한다:

함수형 프로그래밍은 대입문(assignment statements) 없이 프로그래밍을 하는 것이다.

이런, 드디어 이 말을 해 버리고 말았군! 함수형 프로그래밍 언어를 사용하는 프로그래머들이 쇠스랑과 횃불을 들고 쫓아올지도 모르겠다.  너무 극단적인 정의를 사용해서 원래의 의미가 너무 많이 사라져버렸다고 나에게 항의를 할 것임이 분명하다. 반면, 함수형 프로그래밍이 진짜 무엇인지 배우기를 원하는 수많은 사람들은, 위에서 내가 말한 가장 단순한 정의는 말 자체가 안된다며 이 글을 그만 읽으려고 할지도 모른다. 즉, "세상에 어떻게 대입문을 사용하지 않고 프로그래밍을 할 수가 있어?"라고 생각하며 계속 이 글을 읽는것은 시간낭비라고 생각할 것이다.

아무래도 설명하기 가장 좋은 방법은 예를 보여주며 설명하는 것 같다. 다음에 나오는 자바 프로그래밍 언어로 작성된 정수의 제곱을 구하는 매우 간단한 프로그램을 보도록 하자.

public class Squint {
	public static void main(String args[]) {
		for (int i=1; i<=25; i++)
			System.out.println(i*i);
	}
}

아마도 위와 같은 간단한 프로그램이나 아니면 이와 비슷한 프로그램은 모두들 한번씩은 작성해 보았을 것이다. 나도 이런 종류의 프로그램을 백번도 넘게 만들어보았다. 보통 내가 새로운 언어를 배울때 두번째로 만들어보는 프로그램이고, 프로그래머들에게 새로운 언어를 가르칠 때 두번째나 세번째로 작성하도록 하는 프로그램이다. 모든 프로그래머들이 오래전부터 사용되어진 정수의 제곱을 구하는 이 프로그램을 분명하게 알고 있다!

하지만, 이제 이 프로그램을 조금 더 자세하게 들여다보도록 하자. 이 프로그램은 간단한 반복문을 가지고 있고, 그 반복문 안에서는 i 라는 이름의 변수가 1부터 25까지의 값을 가지고 계산되고 있다. 반복문이 실행될 때마다, 변수 i 는 새로운 값을 가지게 된다. 이것이 바로 대입(assignment)이다. 반복문 안에서 반복이 될때마다 변수 i 에는 새로운 값이 들어가게 된다. 컴퓨터의 메모리 구조 안으로 들어가서, 메모리에서 i 라는 변수의 값이 저장되어 있는 위치를 살펴본다면, 그 위치에 있는 메모리가 가지고 있는 값이 반복문이 반복될때마다 변하는 것을 볼 수 있다. functional-programming-joke

Source: http://public.arnau-sanchez.com/ruby-functional/

바로 위에서 설명하고 있는 한 문단이 아주 당연한 것을 내가 길게 늘어놓고 쓴 것처럼 보일수도 있겠지만, 필요하다면 이 주제만으로 작성된 여러 논문들을 소개해 줄수도 있다. 다시 말해서, 동일성(identity), 값(value), 상태(state)와 같은 개념들이 우리에게 매우 직관적으로 보일지도 모르겠지만,  하지만 사실 이 개념들 하나 하나 그리고 그 개념들 사이에 있는 주제는 아주 방대한 분량이다. 이 이야기는 이쯤에서 그만하고 다시 이 글의 원래 주제인 함수형 프로그래밍으로 돌아가보자.

이번에는 위에서와 동일한 내용인 정수의 제곱을 구하는 것을 함수형 프로그램으로 작성한 예제를 살펴보도록 하자. 우리가 살펴보고자 하는 내용들은 모든 함수형 프로그래밍 언어에서 동일하게 적용되겠지만, 이 글에서는 함수형 언어인 Clojure(클로저)를 사용하도록 하겠다.

(take 25 (squares-of (integers)))

무엇인가 이상하다는 듯이 고개를 갸우뚱거릴 수도 있겠지만, 지금 보고 있는 한줄짜리 프로그램이 내가 보여주려고 하는 것이다. 물론 이 한줄짜리 프로그램은 실제 결과를 얻을 수 있는 실제 프로그램이라는 것도 확실하다. 결과를 봐야만 믿겠다고 한다면, 결과는 다음과 같다:

(1 4 9 16 25 36 49 64 ... 576 625)

이 프로그램은 단지 3개의 단어만을 가지고 있다: take, squares-of, 그리고 integers. 각각의 단어들은 특정 함수임을 의미한다. 각각의 단어들 앞에 있는 여는 괄호는 "여는 괄호 다음에 나오는 함수를 호출하는데, 함수 이름 이후부터 닫는 괄호가 나오기 전까지의 모든 것을 이 함수의 인수(arguments)로 사용해라."라는 의미이다.

처음에 나오는 take 함수는 정수 n 과 리스트 l , 이렇게 2개의 인수를 필요로 하고, 이 함수는 리스트 l 에서 처음부터 n 개의 항목을 반환한다. 그 다음에 나오는 squares-of 함수는 인수로 integers 라는 리스트를 받아서 이 리스트에 있는 모든 항목의 제곱으로 만들어지는 리스트를 반환한다. 마지막으로 나오는 integers 라는 함수는 1부터 시작해서 순차적으로 1씩 커지는 정수들의 리스트를 반환한다.

이게 전부이다. 이 프로그램을 통해서 1부터 시작해서 순차적으로 1씩 커지는 정수들의 제곱을 가지고 있는 리스트에서 처음 25개의 값들을 얻을 수 있다.

바로 위에서 언급한 마지막 문장은 매우 중요하므로 다시한번 읽어보자. 그 이전 단락에서 이 프로그램에서 사용된 서로 다른 3개의 함수에 대해서 정의했고, 이 정의들을 모아서 하나의 문장으로 만든것이 이전 단락에 나오는 마지막 문장이다. 새로운 전문용어(buzzword)를 받아들일 준비(팡파르가 울리고 있고, 반짝이 옷을 입고 있고, 창문에서는 오색 종이 테이프가 휘날리고 있고, 수많은 인파가 환호하는 그런 분위기?)가 되어있는지 모르겠지만, 우리는 이것을 "참조 투명성(Referential Transparency)"이라고 부른다.

참조 투명성(REFERENTIAL TRANSPARENCY)

간단하게 말하자면, 참조 투명성은 위에서와 같이 정의를 가지고 있는 문장의 어디에서나 동일한 단어라면 그 단어를 서로 맞바꾸어 놓아도 그 문장이 가지고 있는 원래 의미가 절대 변하지 않는 것을 의미한다. 이 글의 문맥에 맞게 다시 바꾸어 말하자면, 함수를 호출하는 부분을 그 함수가 반환하는 값과 맞바꾸어 놓아도 이 프로그램은 동일한 작업을 수행한다는 의미이다. 이 이야기를 실제 상황과 함께 좀 더 자세하게 살펴보자.

위에서 나왔던 (integers) 라는 함수를 호출하면 (1 2 3 4 5 6 ...) 라는 값을 반환한다. 아마도 이 문장에 대해서 여러 독자들이 의문을 제기할 것이 분명하다. 다시 말해서 이 리스트의 크기가 얼마나 큰가 하는 문제가 머릿속에서 맴돌것이다. 실제 정답은 "이 리스트는 내가 필요로 하는 만큼 크다."이다. 하지만 지금 상황에서는 이 리스트의 크기가 얼마나 큰가에 대해서는 너무 깊게 생각하지 말자. 실제로도 그렇게 동작하므로, 지금 당장은 (integers) 라는 함수는 (1 2 3 4 5 6 ...) 라는 값을 반환한다고 이해하고 받아들이도록 하자!

이제 위에서 작성했던 프로그램에서 (integers) 라는 함수 호출 부분을 이 함수가 반환하는 값으로 바꾸어보도록 하자. 즉, 프로그램이 다음과 같이 바뀌게 된다.

(take 25 (squares-of (1 2 3 4 5 6 ...)))

물론 복사와 붙여넣기 기능을 이용했다. 이것 또한 또 하나의 중요한 포인트이다. 참조 투명성은 함수가 반환하는 값을 복사해서, 그 함수를 호출하는 부분에 그대로 붙여넣기를 하는 것과 동일하다.

자 이제 다음 단계로 넘어가 보자. 그 다음에 나오는 함수 (squares-of (1 2 3 4 5 6 ...)) 는 인수로 받는 리스트에 있는 숫자들의 제곱을 가지는 리스트를 반환한다. 즉, 이 함수는 (1 4 9 16 25 36 49 64 ...) 라는 값을 반환한다. 이 함수의 호출 부분을 이 함수가 반환하는 값으로 바꾸면, 프로그램은 간단하게 다음과 같이 바뀐다:

(take 25 (1 4 9 16 25 36 49 64 ...))

자 마지막 남은 함수의 반환값은 당연히 다음과 같다:

(1 4 9 16 25 36 49 64 ... 576 625)

여기에서 위에서 작성한 프로그램을 다시한번 살펴보자:

(take 25 (squares-of (integers)))

자세히 보면 이 프로그램에는 변수가 없다는 사실을 알 수 있다. 결국 이 프로그램은 3개의 함수와 하나의 상수(constant)가 전부이다. 자바 프로그래밍 언어를 사용해서 변수를 사용하지 않고 정수의 제곱을 구하는 프로그램을 한번 작성해보아라. 물론 아마도 변수를 사용하지 않고도 프로그램을 작성할 수 있는 방법이 있을수도 있지만, 결코 자연스럽지도 않고 가독성이라는 측면에서도 위에서 작성한 프로그램처럼 높은 가독성을 가지기는 힘들 것이다.

하지만 더 중요한 것은, 컴퓨터의 메모리 안으로 들어가서 프로그램이 사용하는 메모리의 위치를 살펴보면, 프로그램이 사용하는 메모리들은 맨 처음 사용되어질 때 초기값으로 설정되고, 그 이후로 프로그램이 실행되는 동안에는 처음 값들이 변하지 않고 계속 유지된다는 사실이다. 다시 말해서, 한번 값이 할당된 메모리 위치에는 새로운 값이 다시 할당되지 않는다.

결국은 한번 값이 할당된 메모리 위치에는 새로운 값을 다시 할당하지 않는 것이 참조 투명성의 필수 조건이 된다. 이러한 필수 조건이 만족된다면,  어떤 함수를 수없이 호출하더라도, 항상 동일한 결과값을 얻게 된다. 프로그램이 사용하는 컴퓨터 메모리의 값이 프로그램이 실행되는 동안에는 절대 변하지 않는다는 사실은, (f 1) 이라는 함수를 호출할 때 몇 백번을 호출하든지에 관계없이 항상 동일한 결과값을 얻게된다는 이야기이다. 이 말은 결국 (f 1) 이라는 함수 호출 부분이 어디에 있든지, 몇번을 호출하든지 상관없이, 이 함수의 결과값으로 대체할 수 있다는 것을 의미한다.

또 다른 방법으로 설명하자면, 참조 투명성은 함수가 내가 의도하지 않은 값을 반환하는 경우(side effect: 부작용)가 발생하지 않는다는 의미이다. 즉, 한번 초기화된 변수에는 다른 값을 다시 대입할 수가 없으므로, 하나의 변수가 대입문의 사용으로 내가 기대하는 값이 아닌 다른 값을 가지고 있게 되는 전형적인 부작용의 발생을 원천봉쇄할 수 있다.

그렇다면 왜 함수형 프로그래밍의 이러한 특성이 중요할까? 참조 투명성이 왜 대단하다고 하는 걸까? 대입문 없이 프로그램 작성이 가능하다는 사실이 왜 중요할까?

대부분의 독자들이 지금 컴퓨터의 화면에서 이 글을 읽고 있을 것이다. 아니라 하더라도 아마 주위를 둘러보면 컴퓨터가 한 대 정도는 있을 것이다. 지금 사용하고 있는 컴퓨터나 주위에 있는 컴퓨터의 사양을 한번 보자. 몇 개의 코어(Core)를 가지고 있는가?

나는 지금 이 글을 4개의 실제 코어를 가지고 있는 맥북 프로에서 작성하고 있다. (맥북 프로의 사양을 보면 8개의 코어를 가지고 있다고 이야기하지만, "하이퍼쓰레딩(hyperthreading)"이라고 불리는 기술을 난 인정하고 싶지 않기 때문에, 4개의 코어를 가지고 있는 것으로 간주한다.) 내가 이전에 쓰던 노트북은 2개의 코어를 가지고 있었다. 그 이전에 사용하던 컴퓨터는 1개의 코어만을 가지고 있었다. 내가 다음 노트북을 사게 된다면 그 노트북은 하이퍼쓰레딩을 사용하지 않고, 실제로 8개의 코어를 가지고 있을 것이고, 그 이후에 구매하는 컴퓨터는 아마도 16개의 코어를 가지고 있을 것이다.

지난 40년간 불철주야로 수고한 하드웨어 엔지니어들의 노고로 컴퓨터의 속도가 이제 거의 빛의 속도 수준까지 도달했다. 이제 컴퓨터의 클럭(clock) 속도가 눈부시게 빨리 발전하기에는 무리가 있을 것이다. 지금까지 컴퓨터 클럭의 속도는 (나를 제외한) 대부분의 프로그래머들이 태어나서 살아왔던 시간동안, 매 18개월마다 두배씩 빨라졌다. 이런 눈부신 컴퓨터 속도의 향상은 한계의 부딪혀서 거의 멈춰있는 상황이고, 그런 눈부신 속도의 향상은 다시는 없을 것 같다.

컴퓨터의 초당 사이클수를 더 늘리려고 그렇게 고민해오던 하드웨어 엔지니어들이 이제는 하나의 칩(chip)에 더 많은 프로세서(processor)를 넣으려고 고민하면서 노력하고 있고, 끝없는 연구를 통해 더 많은 프로세서들이 하나의 칩에 들어가고 있고, 아직은 그 한계가 보이지 않을 정도로 계속 발전하고 있는 상황이다.

multi_cpu_core

Source: http://itcprosolutions.com/skyrimguides/tweak_guide.htm

그렇다면 여기에서 이 글을 읽고 있는 유능하고 경험이 많은 프로그래머들에게 한 가지 질문을 해 보자: 만약 지금 사용하는 컴퓨터가 4096개의 코어들을 가지고 있다면, 어떻게 하면 컴퓨터의 모든 사이클(cycle)을 사용하면서 최대한의 이득을 얻을 수 있을까? 만약 동일한 메모리 시스템을 서로 먼저 사용하려고 다투고 있는 16384개의 프로세서들이 있는 컴퓨터에서 내 함수를 실행해야 하는 상황이라면, 어떻게 해야 함수의 실행 속도가 빨라질까? 모델(models), 뷰(views), 컨트롤러(controllers)가 65536개의 프로세서를 공유해야만 하는 상황에서, 응답 시간이 짧으면서도 유연한 구조를 가지는 웹 사이트를 어떻게 구축할 수 있을까?

사실 우리 프로그래머들은 2개 이상의 자바 쓰레드를 사용하는 경우에도 어떻게 해서든지 문제를 해결할 수도 있다. 그리고 실제 프로세서를 고기나 감자와 같은 음식으로 비유하면, 우리가 사용하는 쓰레드는 이유식 정도밖에는 되지 않는다. 지난 반세기(50년) 동안 우리 프로그래머들이 사용한 컴퓨터에서 실행되는 프로세스들은 실제로 동시에 실행되는 것이 아니라, 마치 실제로 동시에 실행되는 것처럼 느껴지게 만들어진 것이라는 사실을 이미 알고 있다.

자, 이제 진정한 동시성(simultaneity)의 놀라운 세계에 온 것을 환영한다! 그렇다면 어떻게 하면 이 놀라운 동시성의 세계를 누려볼 수 있을까?

대답은 의외로 간단한다. "모든 대입문의 사용을 포기해라! 그러면 놀라운 동시성의 세계로 들어갈 수 있다."

의심할 여지없이, 만약 메모리의 어떤 위치에 맨 처음 한번만 값을 할당하고 프로그램이 실행되는 동안 이 값을 변경하지 않는다면, 131072개의 프로세서들이 서로 먼저 이 메모리 값을 사용하려고 한다 할지라도 우리는 더이상 신경쓸 필요가 없다. 이전에는 두 개 이상의 프로세스가 동시에 하나의 메모리 값을 변경하는 경우를 방지하기 위해서 세마포어(semaphores)라는 기술을 사용해야만 했지만, 이제는 그럴 필요가 없다. 왜냐하면, 이제는 더 이상 메모리 값이 변경되는 일이 발생하지 않기 때문이다.

그래서 이것이 함수형 프로그래밍 언어가 가지고 있는 장점들 중에 하나이고, 가장 큰 장점이라고 볼 수 있다. 지금 우리 프로그래머들에게 빠른 속도로 다가오는 있는 기술들 중에 하나가 다중 코어(multi-core)이다. 더 늦기 전에 다중 코어에 대한 준비를 해 두는 것이 좋을것이다.

Robert Martin (Uncle Bob)

Source: http://www.hanselman.com/blog/HanselminutesPodcast171TheReturnOfUncleBob.aspx

로버트 마틴, Robert Martin (Uncle Bob) (@unclebobmartin),은 1970년부터 프로그래머로 일했다. 그는 현재 8th Light inc 라는 회사에서 Master Craftsman 이라는 직함으로 일하고 있으며, 전세계에서 열리는 수많은 컨퍼런스에서 인기를 누리는 발표자이며, 다음과 같은 수많은 책들을 쓰기도 했다: The Clean Coder, Clean Code, Agile Software Development: Principles, Patterns, and Practices, UML for Java Programmers. 그는 수많은 기사들을 쓰고, 논문들을 발표하면서도, 블로그 활동도 활발하게 하고 있다. 그는 C++ Report의 편집장(Editor-in-chief)으로 활동했고, Agile Alliance의 초대 의장으로도 활동했다.

로버트 마틴의 블로그를 방문하면, 이 글의 약간 다른 버전도 볼 수 있고, 함수형 프로그래밍에 대한 더 많은 이야기들을 접할 수 있다. 이 글에 대한 피드백이 있다면, 로버트 마틴에게 직접 보내도 되고, PragPub Magazine 포럼에 올려서 전 세계에 있는 수 많은 프로그래머들과 토론할 수도 있다.

[책] 꿈을 설계하는 힘 – 김현유 Mickey Kim 지음

January 10th, 2013

꿈을 설계하는 힘

 

* 결론: 강력추천합니다! 꼭 읽어보세요! 현재 IT 분야로 첫걸음을 옮기려고 꿈꾸는 대학생이거나 IT에서 일하고 있는 사회 초년생이라는 필독서! 

사실 나는 자기계발 서적이나 좀 뜬구름 잡는 스타일의 책들을 그렇게 좋아하는 편은 아니다. 하지만, 블로그 글들을 통해서 정말 많은 것들을 느끼게 해주는 구글의 김현유님(http://www.mickeykim.com/)께서 책을 출판하셨다고 하셔서 싱가폴에서 해외배송비까지 지불하며 구매했다. 그리고, 짜투리시간에 3일만에 정말 후다닥 읽었다. 책보다 비싼 해외배송비가 전혀 아깝지 않았다. 책의 구성, 흐름, 짜임새 정말 뭐하나 나무랄 것이 없었다. 정말 오랜시간 공 들이셔서 뼈대를 만들고, 거기에 하나하나 글을 쓰시고 다듬으시는데 얼마나 많은 시간과 노력을 부으셨는지 짐작할 수 있었다. 글도 정말 읽기 쉽고, 흥미진진하게 잘 쓰시는 것 같다.

우선 어쩌다(?) 책을 쓰시게 되었는지는 다음 글에서 더 자세하게 알 수 있다.

책을 쓴 이야기 "꿈을 설계하는 힘"

내가 조금 더 어렸을 때, 이 책을 읽었더라면 더 큰 도움이 되었을텐데 아쉬운 생각이 든다. 현재 대학생으로 앞으로의 진로를 고민하는 학생들이 있다면 강추! 하고 싶다.

책을 큰 흐름으로 보자면, "(1) 대학과 인턴 시절, (2) 삼성에서의 5년, (3) MBA에서의 생활들, (4) 꿈의 회사라 불리는 구글에서의 일, 그리고 마지막으로 (5) 실리콘밸리와 창업"에 관해 절말 일목요연하게 이야기(Story)를 풀어나가고 있다. 중간 중간 맥락이 끊기거나 막힘이 없어서 한번에 다 읽기에도 전혀 부담이 없다.

개인적으로 이제 IT분야에서 일을 시작한지 12년이 되어가는데, (1)과 (2)는 진로를 고민하던 대학생때나, 사회 초년생때 읽었으면 아주 큰 도움이 되었으리라 생각한다. 지금 읽어도 큰 도움이 되었지만 말이다. 우리가 대학교를 졸업하고 사회 초년생이었을때는 이렇게 전 세계적인 회사에서 리더로 일하시는 분들이 그렇게 많지 않아서 이런 글이나 책을 접하기가 쉽지 않았는데, 지금 세대는 어떻게 보면 복 받은 것같다. 이런 분들의 아이디어와 생각들을 블로그를 통해서 접할 수 있고, 직접 소통!도 할 수 있으니 말이다. 진로를 고민하는 대학생들이 좋은 글들과 책들을 더 많이보는 계기가 되었으면 좋겠다. 

싱가포르 국립대(National University of Singapore)에서 컴퓨터 과학을 전공으로 석사 과정을 준비할 때, MBA에 대한 고민도 많이 해서 그런지 (3)에 나오는 MBA에 대한 이야기들도 참 흥미롭게 읽을 수 있었다. 그 때 석사 과정대신 MBA를 선택했더라면 내 삶이 어떻게 달라졌을까라는 생각도 들고... 내가 못 가본 길에 대한 아쉬움은 있지만 후회는 없다.

요즘 수 많은 기사들과 글들을 보면서 구글이라는 회사 그리고 창업의 본 고장 실리콘 밸리에 관해서 항상 흥미롭게 바라보고 있었는데, (4)와 (5)에서 이런 궁금증에 대해서 어느 정도 생각들을 정리해 주셔서 큰 도움이 되었다. 요즘 새로운 커리어에 대해서 고민하고 있었는데, 도움이 많이 되었다. 한 분야에서 10년 정도 일을 하고 커리어에 고민이 있으신 분들에게는 (4)와 (5)가 조금이라도 도움이 되리라 믿는다.

마지막으로 역시 성공은 준비하는 사람들에게 열려있다는 생각이 다시 한번 확고해졌다. 나름 나도 미리 미리 미래를 준비한다고 준비하지만, 때로는 실행능력이 부족하고 여러 가지 삶에 치이다 보니 계획과는 다른 길로 가는 경우가 많기는 한데, 김현유님께서 MBA를 목표로 두고 GMAT의 유효기간이 5년이므로 4년전 시간이 있을 때, GMAT 점수를 확보해 놓으셨다는 이야기를 듣고는 정말 존경하지 않을 수 없었다. 나 같은 경우도 석사과정에 가기로 마음을 굳히고 GRE 시험을 준비했고, 여러가지 사정과 짧은 준비시간으로 인해서 만족할 만한 점수를 얻지 못했었는데, 역시나 미리 미리 확고한 신념과 계획을 가지고 준비하시는 분들을 쫓아갈 수가 없구나라는 생각을 했다. 아직 늦지 않았으니 새로운 커리어를 시작하려는 이 순간에 미래에 대한 확고한 신념과 계획을 가지고 준비를 해야겠다.

참고로 책의 목차를 보면 다음과 같다.

추천의 글
prologue | 꿈을 꾸는 사람 VS. 꿈을 이루는 사람

Chapter 1 나만의 꿈의 설계도를 그려라

01 대학 시절이 중요한 이유
02 시작은 항상 바닥부터다
03 중요하지 않은 경험이란 없다
04 꿈의 설계도를 그리다
05 인턴생활이 내게 가르쳐준 것들

[Mickey’s Advice] 커리어 디자인의 8가지 원칙

Chapter 2 기회는 보려는 사람에게만 보인다

06 목표가 분명해야 정확한 지도를 그릴 수 있다
07 첫 단추가 중요한 이유
08 뭐 이스라엘로 가라고요?
09 내가 삼성전자 대표입니다
10 유대인에게 배운 협상의 기술

[Mickey’s Advice] 미키의 해외 출장 노하우

Chapter 3 우물 안 개구리, 세계로 점프하다

11 다시 리그에 서다
12 MBA, 이것만은 꼭!
13 세상은 넓고 잘난 사람은 많다
14 미키, 버클리 MBA 하스 테크 클럽 회장이 되다
15 큰물에서 제대로 놀아보자
16 실리콘밸리 취업 스토리
17 성공의 지름길, 네트워킹

[Mickey’s Advice] 성공하는 실리콘밸리식 인터뷰법

Chapter 4 꿈의 직장, 구글에서 일한다는 것 - Life at Google

18 꿈의 회사, 구글에 입성하다
19 구글러들의 캠퍼스 ‘구글플렉스’
20 이것이 구글 파워다
21 불확실하기에 더욱 빛이 날 수 있는 일들
22 미국에서 바라보는 아시아 기업
23 신규 사업을 할 때 기억해야 할 것들
24 글로벌 기업의 사업 제휴 노하우

[Mickey’s Advice] 성공하는 직장인의 회사생활 6가지 원칙

Chapter 5 실리콘밸리 스타일 ? Bring your A game

25 자유와 창조, 혁신이 흐르는 땅
26 진짜 중요한 일에 집중하라
27 마음껏 일하고 끝까지 책임져라
28 널리 자랑하고 반드시 칭찬하라
29 모든 것의 중심은 ‘나’
30 나이는 묻지 마세요
31 파워풀한 실리콘밸리의 여성들
32 전 세계 인재들의 집합소 실리콘밸리의 지구인들

Chapter 6 창업의 메카, 실리콘밸리

33 그들은 왜 실리콘밸리로 오는가
34 가치에 주목하는 투자 문화
35 창업가들이 존경받는 사회
36 창업의 빛과 그늘

epilogue | 인생의 정답은 결국 내가 만든다

Windows Phone 8 키보드의 비밀, 그리고 패턴 분석과 Big Data

December 13th, 2012

오늘은 The secrets of the Windows Phone 8 keyboard (Windows Phone 8 키보드의 비밀)라는 블로그를 보고난 후에, 떠오르는 생각을 공유해 보고 싶다. 얼마전에 Windows 8이 발표되고, Windows Phone 8도 발표되었지만, 생각보다 반응이 없는 것이 사실이다. 여러가지 이유들이 있을 수 있겠지만, Windows Phone 8의 경우 맘 놓고 사용할 수 있도록 시장에 풀리지 않고 있는 이유도 그 중에 하나일 거라 생각한다. 빨리 Windows Phone 8도 제자리를 찾아가서 사용자가 원할 때 Windows Phone 8을 사용할 수 있는 환경이 되었으면 좋겠다.

그래서 가끔씩 Windows Phone Blog를 들어가서 보는데, 아주 흥미로는 글이 있어서 함께 공유하고 싶다. 제목은 "Windows Phone 8 키보드의 비밀"이고 예상하는 것과 같이 Windows Phone 8에서 키보드 입력을 할 때 사용되는 기술에 관한 이야기이다. 사실 이러한 기술들이 이미 iPhone의 iOS와 Android에서도 적용되어 있다고는 하는데 이렇게 공식적으로 발표하는 건 Windows Phone 8이 아닐까 싶다. 좀 더 자세하게 알아보자.

어디에서든지 미디어 "소비" 뿐만 아니라, 미디어 "생산"도 할 수 있게 해 주는 스마트 폰

이제는 더 이상 스마트 폰으로 미디어를 "소비"한다는 측면의 뉴스를 읽거나 동영상을 보기만 하는 것이 아니라, 미디어를 "생산"한다는 측면의 일들도 많이 하고 있다. 즉, 읽고 있는 블로그 글에 댓글을 단다는지, 아니면 내 블로그에 새 글을 쓴다던지, 트위터에 내 생각을 올린다던지, 페이스북에서 내 상태를 친구들에게 공유하는 등의 미디어를 "생산"하는 일들을 스마트 폰을 이용해서 하는 경우가 점점 더 많아지고 있다. 이 경우 가장 문제가 되는 부분이 아마도 키보드를 이용해서 글을 쓰는게 아닐까 싶다. 아무래도 제한적인 스마트 폰의 공간에 키보드를 올리다보니 키보드의 키들이 작아져서 오타가 많이 발생하는 것이 사실이다. 스마트 폰에서 좀 더 효율적으로 키보드를 사용하라고 iOS에서 자동 변환과 같은 도구를 지원하지만, 장점도 있지만 내가 원하지 않는 단어로 자동 변환을 해서 문장의 의미가 이상해져서 진땀을 빼는 경우도 많이 발생한다.

효율적인 미디어 "생산"을 도와주는 Word Flow

이런 노력의 일환으로 Windows Phone 8에서는 Windows Phone 7.5에서는 Quick Correct라고 사용되던 기술을 더욱 더 향상시켜서 Word Flow라는 새로운 이름으로 소개하였다. Word Flow를 위해서 25억(2.5 billion) 개의 단어를 사전과 인터넷에서 찾아서 리뷰를 했고, 스마트 폰이라는 저장 용량의 한계가 있으므로, 그 중 가장 빈번하게 사용되는 60만개의 단어와 관용구를 선정했다. 이렇게 선정된 60만개의 단어와 관용구는 Word Flow의 자동 변환과 자동 추천 기능을 위해서 사용되어지고 있다.

예를 들어, 다음과 같이 문자 메시지를 작성할 때, "do you want to go for"라고 입력하면, 자동 추천 기능이 "that", "lunch", "dinner" 등과 같은 단어를 추천해 주는 것이다.

Messaging_autoSuggestion_thumb_10DDD73D

Word에서도 "Please change the"라고 입력을 하면, "name", "subject", "fact"등과 같은 관련있는 단어를 추천해 준다.

Word_Autosuggest_16x9_thumb_491EDF06

이러한 기능들은 키보드 타이핑 에러를 줄이고, 원하는 내용을 빠르고 정확하게 입력하는 데 큰 도움이 될 것이다.

이런 추천단어는 문자를 입력할때마다 업데이트된다. 따라서 "Happ"를 입력하게 되면 추천단어로 "Happy", "Happened", "Happens"를 추천해 준다. 사실 사전에 있는 단어만을 가지고 있다면, "Happy"보다는 "Happen"을 추천해주는게 더 나은 선택일 수도 있다. 하지만 지난 20년간 Outlook과 Word에서 사용되었던 단어들도 가지고 있기 때문에, 사용자들이 일상 생활에서 더 많이 사용하는 "Happy"가 첫 추천 단어가 되었다는 이야기를 해 준다.

wp_ss_20121206_0001_thumb_25F17454

그렇다면, "b"라는 문자는 어떨까? 당연히 가장 많이 사용되는 단어 "be"가 첫번째 추천 문자가 될 것이다. 하지만, 이 "b"가 "Happy" 다음에 "Happy b"와 같이 나온다면 어떨까? Word Flow는 단어뿐만 아니라 상용구도 정보로 가지고 있기 때문에 그냥 "be" 보다는 상황에 맞는 "birthday"가 첫번째 추천 단어로 나온다.

wp_ss_20121206_0002_thumb_7EB9BBCF

모바일 폰 키보드 입력의 정확성을 높여주는 동적인 문자 터치 영역(hit target) 변경

그리고 마지막으로 정말 고개를 끄덕이게 만드는  기술 하나를 소개해 주고 있다. 자동 변환과 자동 추천외에 키보드 입력 에러를 줄이기 위한 노력이 무엇이 있을까? 그래서 생각해 낸 것이 바로 키보드 터치 영역을 동적으로 변경해 주는 것이다. 그렇다고 키보드에 한자 한자 입력할 때마다 키보드 키의 크기가 바뀌면 더 이상할것이다. 그래서 보여지는 키보드는 그대로지만, 보이지 않더라도 동적으로 상황에 맞게 "문자 터치 영역(hit target)"을 변경해 주는 것이다. 이걸 말로 설명하는 것 보다는 다음과 같은 이미지를 보자.

The quic

아래에서 이 동영상을 소개하겠지만, 위와 같은 이미지를 보자. 키보드의 각각의 자판은 일정하게 나누어져 있지만, 동적으로 문자 터치 영역을 변화시켜 주는 화면이다. 즉, "The quic"까지 입력을 했다면 다음에는 어떤 문자가 나올 확률이 높을까? 당연히 99% 이상의 경우에는 다음에 "k"라는 문자를 입력하려고 할 것이다. 그래서 "k"의 문자 터치 영역을 동적으로 양옆과 위 아래로 더 넓혀 주는 것이다. 즉, 이 경우 내가 "k"를 입력하고 싶은데 실수로 애매하게 "j"와 "k" 경계부분이나 "k"와 "i" 경계 부분을 터치해도 똑똑하게 그냥 "k"로 알아듣겠다는 것이다. 아이디어 자체도 훌륭하고 매번 입력할때마다 데이터베이스를 기반으로 문자 터치 영역을 동적으로 변경하는 기술도 정말 훌륭해 보인다. 사실 이 글을 쓰게 된 것도 이 동영상을 보고 감동을 받았기 때문이다. 다음의 동영상을 보면 동일한 감동을 받을 수 있지 않을까 생각한다.

Word Flow를 통한 패턴 분석(Pattern Analysis)과 빅 데이터(Big Data)의 이해

그리고 이 동영상과 Word Flow라는 기술에 대한 설명을 읽으면서 떠 오른 것이 패턴 분석(Pattern Analysis)과 요즘 가장 핫한 IT 용어 중 하나인 빅 데이터(Big Data)이다.  사실 빅 데이터를 기술로 이해하려면 참 어렵고 그 뒤에 따라오는 또 다른 기술들이 더 어렵게 느껴지지만, 빅 데이터가 필요한 이유 중 하나가 바로 오늘 살펴본 Word Flow와 같은 기술 때문이라고 생각한다. 빅 데이터가 왜 필요할까? 바로 그 빅 데이터를 이용해서 패턴을 분석해서 상황에 맞는 서비스를 제공하기 위해서이다. "자주 사용되는 단어"라는 빅 데이터가 있기 때문에 어떤 상황에서 동적으로 그 상황에 맞는 단어를 추천해주는 서비스를 제공해 줄 수 있는 것이다.

하지만 20억개의 단어 리뷰와 60만개의 단어로 이루어져 있는 데이터베이스는 빅 데이터에 명함도 못 내미는 상황이 되었다. 개인적으로는 그 이유 중 하나가 모바일 시대의 도래라고 생각한다. 사실 모바일 이전의 시대에는 컴퓨터가 움직인다는 생각이 희박했기 때문에, 데이터의 개념이 시간이라는 한 축을 기반으로 늘어났다. 하지만 모바일 시대로 도래로 거의 모든 사람들이 이제 하나 이상의 컴퓨터(스타트 폰, 타블릿 등등)를 들고 사용하면서 이동한다. 즉 시간이라는 축에 위치라는 또 다른 축이 추가되면서 데이터의 양이 기하급수적으로 늘어났다. 또한 컴퓨터를 사용하는 시간의 제약이 없어진 것도 한 몫 했다고 생각한다. 이미 오래전부터 컴퓨터는 더 이상 퇴근하고 나서 집에 가야 사용할 수 있는 세상이 아닌 것이다.

이렇게 모여진 빅 데이터에서 패턴을 분석해서 지금 내 상황에 딱 필요한 정보나 서비스를 동적으로 제공해 줄 수 있는 아이디어들이 많이 나와서 더 스마트한 시대를 열어가는데 대한민국이 앞장 서기를 바라며...

(덧글) 사실 한글의 경우에는 이러한 기술들이 적용되어 있는지 모르겠다. Windows Phone 8을 사용해 보고 싶지만 사용할 기회가 흔치 않아서 확인을 못하겠다. 그래도 Windows Phone 8을 구하기가 한국보다는 싱가폴이 더 수월할 것 같으니, 사용하게 되면 한글에는 Word Flow가 어느 정도 적용되어 있는지 확인해 보는 것도 재미있을 것 같다.

ThoughtWorks에서 주최한 Quarterly Briefing에 다녀왔습니다.

December 11th, 2012

한달 전 쯤에 우연히 ThoughtWorks에서 Quarterly Briefing을 "Technology Radar: What's hot and what's not"라는 주제로 Singapore에서 가진다고 해서 미리 신청을 해 놓고 오늘 다녀왔습니다. 자세한 소개 및 발표자와 발표내용은 다음의 신청 페이지에서 보실 수 있습니다.

http://www.thoughtworks.com/events/singapore-quarterly-briefing-december-2012

사실 한 2년정도 기술보다는 교육에 관련된 연구(Education Research) 프로젝트에 참여하다보니 아무래도 실제로 최신기술들을 살펴보고 사용할 수 있는 기회가 적었던 건 사실이었는데, 오늘 얼마나 뒤쳐져 있었는지 느낄 수 있는 시간이 되어서 참 좋았습니다.

ThoughtWorks라는 회사는 Refactoring으로 유명하신 Martin Fowler님이 Chief Scientist로 계시는 회사로 더 유명합니다. 소프트웨어 개발 그리고 애자일(Agile)과 관련된 최신 기술 및 소식을 접하고 싶으시다면 ThoughtWorks 홈페이지를 자주 찾아가시고, 홈페이지에 있는 자료들만 잘 읽어도 큰 도움이 되리라 생각합니다. 그 중에서도 1년에 두번 정도 발표하는 Technology Radar는 소프트웨어 개발과 관련된 최신의 트렌드를 이해하는데 정말 큰 도움이 됩니다.

http://www.thoughtworks.com/

 

1. Registration, refreshments and networking [6:00 p.m.]

오후 6시부터 등록을 시작하고 간단한게 먹을거리를 제공했습니다. 그래도 싱가포르에서 가장 시내인 Raffles에 있는 Convention Center라서 그런지 간단한 먹을거리는 생각보다 잘 나오더군요. 그리고 한국 사람, 아니 저에게 가장 힘든 그냥 무작정 네트워킹(networking) 하라는 시간이었는데, 역시나 6시 15분 정도에 도착해서 등록하고 그냥 먹기만 했습니다. 아는 사람이 한 명도 없는데 그냥 네트워킹 하라고 던져 놓는 시간은 정말이지 적응이 안될려나 봅니다.

 2. Welcome & Introduction [6:30 p.m.]

약간의 환영사와 소개 인사를 NUS ISS에서 Director/CEO를 맡고 있는 Lim Swee Cheang 님께서 하셨는데, 요즘 뜨고 있는 이슈로 Green Computing과 지난번 미국에 가서 발표했던 e-Government에 대해서 이야기를 했습니다. 예전 몇 개의 포스트에서 언급했다시피 싱가포르 e-Government는 대부분의 조사와 지수에서 1위를 자주 차지할 정도로 e-Government가 잘 되어있습니다.

그리고 나서 ThoughtWorks Singapore에서 Managing Director를 맡고 있는 Karin Verloop 님께서 나오셔서 간단한 환영사와 전체적인 진행 순서, 그리고 ThoughtWorks에 대한 소개를 하고 나서 바로 본 세션으로 들어갔습니다.

3. Service Transformation and Innovation [6:45 p.m.]

첫번째 세션으로 NUS ISS, Service Innovation Practice에서 Deputy Chief를 맡고 있는 Stuart Smith 님께서 Service Transformation and Innovation에 대해서 발표를 했습니다. 전체적인 내용보다는 몇 가지 기억에 남는 부분들만 언급하도록 하겠습니다.

Complexity

소프트웨어에서 복잡하고 어려운 현실의 문제들을 어떻게 해결해 나가야 하는지에 대해서 설명하면서, Complicated System은 괜찮지만, Complex System은 피해야 한다고 했던 것이 기억에 남습니다. 두개가 크게 달라보이지 않지만, complicated는 영영사전에서 찾아보면 difficult to analyze and understand라고 나옵니다. 즉, 분석하거나 이해하기 어려운 시스템일지라도 구조적으로 잘 설계되어 있다면 해결해야하는 문제 자체가 어렵기 때문에 어느 정도 허용해 줄 수 있다라는 의미였습니다. 하지만 complex는 영영사전에서 complicated in structure라고 나옵니다. 즉, 구조적으로 이미 분석하기 어렵고 이해하기도 어려운 complex system은 피해야 한다는 이야기입니다. 어떻게 보면 말장난 같아 보이지만, 이해하고 나면 정말 동의할 수 밖에 없는 이야기입니다. 즉, complex system에서 complicated system으로 그리고 궁극적으로는 simple system을 추구해야 한다는 이야기를 했습니다.

Customization

현재 우리는 스마트(smart) 시대, 즉 customization(고객 맞춤) 시대에 살고 있다는 얘기와 함께, 스마트한 기기들과 customization이 기술과 서비스에 미치는 영향에 대해서 설명하면서 콜 센터(call center or contact center)를 예로 들었습니다. 스마트폰이라 불리는 기기들이 나오기 전에는 피처폰, 즉 기본적인 기능들만을 지원하는 폰이 전부였습니다. 노키아에서 Nokia E70라는 모델의 피처폰을 2만대를 팔아도 콜 센터에서는 모든 상담원들이 Nokia E70라는 모델에 대한 지원과 관련된 부분만 숙지하면 되었습니다. 하지만, 아이폰이나 안드로이드폰과 같은 스마트폰이 출현하면서 동일한 아이폰이 2만대 팔리더라도, 각각의 아이폰들은 개개의 사용자가 원하는 앱들이 설치되면서 개별화(customized)가 되어 더 이상 하나의 아이폰으로 지원 가능하지 않다는 이야기입니다. 즉 아이폰 2만대가 팔리면 2만개의 각각 다른 폰들에 대해서 지원해야 하는 거랑 마찬가지라는 이야기입니다. 일리가 있고 애플리케이션을 개발하거나 서비스를 준비할 때 미리 미리 고민해 보아야 할 것 같습니다.

Human Mind

마지막으로 소프트웨어 개발에서 사람의 마음을 꼭 고려해야 한다고 이야기 하면서 언급한 논문이 있습니다. 바로 J.C.R. Licklider의 "Man-Computer Symbiosis"입니다. Licklider에 관해서는 http://memex.org/licklider.html 에서 확인하실 수 있고, 논문 "Man-Computer Symbiosis"는 http://memex.org/licklider.pdf 에서 PDF 버전으로 다운 받으실 수 있습니다. 제목부터가 정말 대단해 보이기는 한데, 더 대단한 것은 이 논문이 1960년도 쓰여졌다는 것입니다. 꼭 한번씩 읽어보시기를 추천합니다. 이 논문의 Summary에 있는 글로 논문 소개를 대신합니다. 이 논문의 개인용 컴퓨터나 인터넷과 같은 네트워크의 개념은 고사하고, 집채만한 컴퓨터가 유명한 대학교에 가야 한 대씩만 존재하는, 그리고 간단한 프로그램을 컴퓨터로 실행하기 위해서는 몇일 기다려야 했던 1960년에대 쓰여졌다는 사실을 다시한번 생각하면서 읽으시기를 바랍니다.

In the anticipated symbiotic partnership, men will set the goals, formulate the hypotheses, determine the criteria, and perform the evaluations. Computing machines will do the routinizable work that must be done to prepare the way for insights and decisions in technical and scientific thinking.

사람과 컴퓨터가 함께 살아가며 연합하는 시대가 올 것이고, 이런 시대에 사람은 어떤 값이 필요한지를 정하고, 가설을 공식화하고, 여러가지 기준들을 고려하여 만들기만 하면 원하는 값을 얻을 수 있을 것이다. 기술적이고 과학적인 생각과 사고를 하기 위해서 필요한 통찰력과 판단 기준들을 준비하기 위해서 꼭 필요한 반복적인 작업들은 컴퓨터에 의해 수행되어질 것이다.

4. Technology Radar: what’s hot and what’s not [7:15 p.m.]

마지막으로  ThoughtWorks에서 Global Head of Technology를 맡고 있는 Erik Dörnenburg 님께서 나오셔서 Technology Radar에 대해서 설명을 해 주셨다. 사실 이 문서 자체를 짧은 시간에 다 설명하기에는 시간적인 제약이 있어서 몇 가지 중요한 포인트만 언급하셨지만, 그것만으로도 참 대단해 보였다. Technology Radar 문서에 대한 정보는 http://www.thoughtworks.com/radar 에서 확인하실 수 있다. 기술의 발전이 정말 빠르구나 라는 걸 다시한번 느꼈고, 이제는 "IT 인력 10만 양병설"과 같은 교육으로는 진정한 IT 인력을 기르는 것이 아주 힘들것이라는 확신이 생겼다. 이 많은 기술들을 따라가기 위해서 기본이 되는 기술들에 대한 이해와 시대의 흐름을 쫓아갈 수 있는 통찰력이 필요한데, 제대로 된 교육과정에 대한 심사숙고함이 없이는 힘들지 않을까 싶다.

Technology Radar에서는 소프트웨어 개발에 필요한 것들을 우선 (1) Techniques (2) Tools (3) Platforms (4) Languages & Frameworks로 나눈다음에 현재 어느정도 영향력을 미치고 사용되어지고 있는지에 따라 다시 (1) Adopt (2) Trial (3) Assess (4) Hold로 나누고 있다. 또한 새로나온 기술인지 지난번 Technology Radar에서도 언급된 기술인지에 따라 세모와 동그라미로 구분해준다.

Technology Radar 문서를 다운 받아서 보시고 각각의 기술들에 대해서는 따로 따로 공부를 해야 하지만, 여기서는 어떤 기술들이 언급되고 있는지만 보여드리도록 하겠다.

(1) Techniques

(2) Tools

(3) Platforms

(4) Languages & Frameworks

예전에는 항상 공부할 수 있게 만들어주기 때문에 소프트웨어 개발자로서 삶이 좋다고 자신있게 말했었는데, 이렇게 나오는 기술들을 보니 좀 더 신중하게 대답해야 하지 않을까 하고 생각해 보지만, 그래도 아직까지는 무언가 더 공부하고 알아가야할 것들이 있다는게 참 좋은 것 같다. :)

HCI(Human Computer Interaction)란 무엇인가?

November 19th, 2012

요즘 화두가 되고 있는 이슈중 하나가 UI/UX라는 단어이다. User Interface(사용자 인터페이스) 그리고 User eXperience(사용자 경험), 그리고 거기에 User Interaction(사용자 상호작용)까지 구분을 잘 하지 못하고 사용되는 경우도 많은 것 같다.

요즘에 HCI, 그리고 UX에 관심을 가지고 보고 있는데, 우연히 본 김진우 교수님(연세대학교 HCI Lab)의 동영상 강의가 인터넷 유튜브에 올라와 있어서 보기 시작했는데, 내용도 좋고 보충 자료도 적절하게 잘 사용하시고, 전달도 깔끔하게 강의도 잘 하시는 것 같다. 얼핏 보니 연세대학교 학부 강의 같은데, HCI를 이미 알고 계신 분들에게는 큰 도움이 안될 수도 있지만, HCI란 무엇인가에 대해서 기본을 다시 정립하고 싶다거나 HCI가 무엇인지 공부해보고 싶으신 분들께는 아주 좋은 것 같다.

첫번째 강의에서 보여주는 다음과 같은 다이어그램이, HCI가 무엇이고, UI/UX의 개념을 어떻게 잡을 수 있는지 가장 잘 설명한 것인 것 같다. HCI가 사람(Human)과 컴퓨터(Computer)의 상호작용(Interaction)이라는 의미이니 사용자와 디지털 시스템 중간에 있는 무엇인가일테고, 디지털 시스템쪽에 있는 개념이 User Interface이고, 사람쪽에 있는 개념이 User eXperience이고 그 사이에 Interaction이 있다.

다음은 첫번째 강의인 HCI 개론에 대한 부분이다. 보시고 관심 있으신 분들은 계속 보시면 참 좋을 것 같다.