1. GOTO

4년~5년 쯤 전에 다익스트라의 "Goto Statement Considered Harmful"이라는 유명한 논문을 읽은 적이 있습니다. 선정적인 제목과 달리 제가 이해한 논문의 핵심은 "GOTO 문장이 나쁘니까 쓰지 말아야 한다"가 아니라 다음 문장이었습니다:
We should do (as wise programmers aware of our limitations) our utmost to shorten the conceptual gap beween the static program and the dynamic process, to make the correspondence between the program(spread out in text space) and the process(spread out in time) as trivial as possible.

우리는(자신의 한계를 잘 인식하고 있는 현명한 프로그래머로서) 정적인 프로그램과 동적인 프로세스 사이의 개념적 격차를 줄이기 위해 최선을 다해야 한다. 이를 통해 텍스트 공간 상에 펼쳐져 있는 프로그램과 시간 상에 펼쳐져 있는 프로세스 사이의 대응을 가능한 한 쉽게 만들 수 있다.
프로그래밍을 한다는 것은
  • 소스 코드를 읽으면서 이 코드의 실행 결과, 즉 프로세스를 그려내거나
  • 원하는 프로세스로부터 소스 코드를 만들어내는
것인데, 소스 코드라는 것은 2차원 평면(종이 혹은 편집기 화면)이라는 공간 상에 펼쳐진 문자열인 반면, 프로세스는 시간 상에 펼쳐진 개념입니다. 따라서 이 둘 사이의 차이가 적을 수록 프로그래밍이 (읽고/쓰기에) 쉬워진다는 것입니다.

예를 들어 제어문(조건문/반복문 등)이 전혀 없는 코드는 위에서 아래로 순서대로 실행되는데, 이러한 코드는 시간과 공간 사이의 대응이 아주 쉽습니다. 반면 GOTO가 들어가면 시간과 공간 사이의 대응이 어려워지기 때문에 GOTO가 나쁘다고 말하는 것입니다. (물론 while, for, function 등도 GOTO와 비슷하지만 이들은 나쁘다고 말하지 않습니다. GOTO와 이들 - 즉, Structured Programming을 위한 개념들 - 사이의 차이를 설명하기 위해 다익스트라는 Programmer Independent Coordinate System이라는 개념을 도입하는데, 이에 대한 설명은 생략하겠습니다)

2. Aspect Oriented Programming

예전에 하이텔 자바동(8년 쯤 전?)에서 AOP에 대한 글을 접한 후로 관심을 가지고 조금씩 살펴보고 있다가, 3년 쯤 전에 사내 세미나 주제로 AOP가 선정되는 바람에 Aspect Oriented Software Development 라는 책을 읽을 기회가 생겼습니다. 이 덕에 그마나 대략적인 개념탑재가 되었습니다.

이 책에서는 프로그래밍 언어의 발전 방향에 대해 다음과 같이 설명하고 있습니다:
The earliest computer machine-language programs had a strict correspondence between the program text and the execution pattern. Generally, each programming language statement was both unitary and local - unitary in that it ended up having effect in precisely one place in the elaborated program, and local in that it was almost always proximate to the statements executing around it.

The history (of this part) of programming languages has been about moving away from purely local and unitary languages and toward mechanisms that let the programmer separate concepts into pragmatic assemblages or modules, instead of being tied to saying things just where they happen. The first exceptions to locality were subprograms (i.e., procedures, subroutines, functions). Subprograms were a great invention, enabling abstracting out some behavior to someplace else. (...omitted...)

Inheritance (and related mechanisms like Delegation) in Object Oriented Programming was another important introduction of non-locality. Executing inherited behavior is non-local.

초창기의 기계어 프로그램에는 프로그램 텍스트와 실행 패턴 사이에 정확한 대응이 존재했었다. 일반적으로 각각의 문장은 일원적이면서 동시에 지역적이었다. 일원적이라는 것은 문장이 정확히 한 지점에만 영향을 미친다는 의미이고, 지역적이라는 것은 그 영향이 거의 항상 해당 문장의 주변 문장들로만 한정된다는 의미이다.

(이러한 관점에서) 프로그래밍 언어의 역사란 순수하게 지역적이고 일원적인 언어에서 벗어나, 실행이 되는 해당 지점에 모든 사항을 써내려가는 것이 아닌 실용적 묶음 혹은 모듈 단위로 개념을 분리할 수 있도록 변해가는 과정이었다. 지역성에 대한 첫 번째 예외는 서브 프로그램(프로시저, 서브루틴, 함수)이었다. 서브 프로그램은 특정 행위에 대한 상세한 기술을 다른 위치에 적을 수 있게 하여 추상화를 가능케 해준 위대한 발명이었다. (...중략...)

객체지향 프로그래밍의 상속(및 델리게이션 등의 유사한 메커니즘)은 또다른 주요한 비-지역성의 하나이다. 상속된 행위를 실행하는 것은 비-지역적이기 때문이다.
통찰력 있는 글입니다.

하지만 이 글을 읽자마자, 전에 읽었던 다익스트라의 글이 떠오르면서 "뭔가 충돌이 있다"는 생각이 들었습니다. 다익스트라는 정적 프로그램과 동적 프로세스 사이의 차이를 최소화 하는 것에 대해 말하고 있고, AOP는 프로그램 텍스트와 실행 패턴 사이의 결속으로부터 벗어나는 것에 대해 말하고 있기 때문이죠.

2005년에 쓰인 Carl Zetie의 AOP Considered Harmful? 이라는 글에서는 AOP가 다익스트라가 지적한 문제점을 가지고 있기 때문에 해롭다고 말하고 있습니다(비싸서 요약만 읽었습니다만 ㅎㅎ)만, 별로 동의할 수는 없었습니다. 둘 사이에 충돌이 있는 것은 맞지만 그렇다고 해서 둘 중 하나가 잘못된 것이라고 생각해버릴 수는 없었던거죠.

3. Subtext

별 다른 결론을 얻지 못하고 몇 년이 지났는데, 어제 38분짜리 Subtext2의 동영상을 보고서야 답을 찾았다는 느낌이 들었습니다. (아래 글은 위 동영상을 보신 후에 읽으면 좋습니다)

다익스트라가 강조한 것은 소스 코드와 프로세스 사이의 간극을 최소화해야 한다는 것이고, AOSD에서 강조한 것은 모듈화와 추상화입니다. 문제는 모듈화/추상화의 결과로 인하여 소스 코드와 프로세스 사이의 간극이 벌어질 수 밖에 없다는 점입니다. 결국 둘 중 하나를 포기하거나 적당히 타협을 해야하는데, 이 부분이 찝찝한 것이죠.

하지만, Subtext는 다른 방식으로 이 충돌을 해결합니다. 소스 코드가 2차원 평면 상에 펼쳐진 문자열이어야 할 필요가 없다는 것이죠. Subtext에서는 프로그램과 프로세스가 "동일"합니다. 소스 코드는 코드인 동시에 실행 결과이기도 합니다. 코드를 수정하면 결과도 수정됩니다. 코드 내에 다섯 가지 분기가 존재하면 화면 상에 다섯 가지 흐름이 나타납니다.

그 결과 모듈화/추상화를 하면서도 여전히 지역성을 유지할 수 있게 됩니다. 뿐만 아니라 OOP의 핵심적인 개념에 대해서도 매우 직관적으로 익힐 수 있는데, 이를테면 기존 언어의 조건문(if/else 혹은 switch)과 OOP의 다형성(polymorphism)이 결국은 같은 것이라는 사실이 Subtext에서는 시각적으로 명확하게 표현됩니다.

몇 년 동안 찜찜하게 남아있던 고민 하나를 해결하고나서 괜히 혼자 들 뜬 마음에 주절거려봤습니다.

PS) 요즘 관심 있게 보고 있는 것 중 하나가 Xanadu Project 인데(완전 뒷북이죠 ㅎㅎ), 이게 또 Subtext와 재미있는 유사성을 가지고 있는 것 같습니다. 인간은 언제 쯤 "네모난/평평한 종이"에 대한 강박에서 완전히 해방될 수 있을까요?

Trackback 1 | Comments 2

Tag Clouds의 문제들.

태그를 시각화(visualization)하기 위한 수단으로 태그 구름(Tag Cloud)을 사용하는 사이트들이 많습니다.
사용자 삽입 이미지
하지만 저는 태그 구름은 그리 좋은 정보 시각화 사례가 아니라고 생각합니다(제 블로그에도 나오고 있죠. 조만간 바꿔버릴 생각입니다). 이유는 다음과 같습니다:

1. 단어의 크기로 태그의 사용도(popularity)를 표시하는 것의 문제

두 태그가 동일한 크기로 표현되어 있을 경우 "단어의 길이가 더 길면" 더 크게 보이는 문제를 피하기 힘듭니다. 단어의 길이가 같다고 하더라도 "M"과 "i"와 같이 타이포 자체에 차이가 있는 경우(가변폭이건 고정폭이건) 크기가 다르게 인식될 수 밖에 없습니다.

2. Long-tail의 Head 부분 밖에 보여주지 못하는 문제

한 연구(PDF)에 의하면 태그의 분포는 Long-tail을 따른다고 합니다. 태그 구름은 롱테일의 머리(head) 부분만을 효과적으로 보여줄 수 있죠. 하지만 태그를 기반으로 정보를 찾고자 할 때 정작 중요한 것은 머리가 아니라 꼬리(tail)에 해당하는 태그입니다.

3. 원하는 태그를 쉽게 찾지 못하는 문제

예전부터 많이 써 온 일부 태그는 비교적 금방 찾을 수 있겠지만(태그 구름에서 크게 나오니까), 최근에 바뀐 관심사와 관련이 있어서 아직은 해당 태그를 달고 있는 글이 많지 않은 경우라면 태그 구름에서 해당 태그를 찾기가 쉽지 않습니다.

물론 대부분의 태그 구름은 알파벳순(+가나다순)으로 태그를 정렬하여 보여주지만 그 형태상(크고 작은 글자들이 섞여 있는 구름) 일반적인 알파벳순 목록에 비해 훨씬 찾기가 힘들어집니다. 한 실험에 의하면 보통 사용자들은 태그 구름의 태그들이 알파벳순으로 정렬되어 있었다는 사실조차 기억하지 못한다고 합니다.

4. 비효율적인 공간 활용

여기에서 공간이란 단순히 화면 상에서의 크기만을 말하는 것은 아닙니다. 예를 들어 위에 나오는 태그 구름의 경우 글자의 크기 뿐 아니라 색상 까지도 동일한 정보를 나타내기 위해 사용하고 있는데, 이는 소중한 공간의 낭비입니다.

효과적인 시각화라면 꼭 고려해야 할 요소 중 하나는 Preattentive Processing 입니다. Preattentive Processing이란 "하나씩 천천히 살펴보지 않고도 딱 보는 순간 정보가 튀어나오는(pop-out)" 것을 말합니다. 이러한 효과를 주기에 적절한 시각적 차원들은 2차원 공간 상의 위치, 색상의 차이, 움직임 등이 있는데, 이 중 "2차원 공간 상의 위치"와 "색상"이 별 의미 없이 낭비되고 있는 것이죠.

5. 제한된 인터렉션

좋은 시각화는 한 번 감상하고 끝나는 단방향의 "그림"이 아닙니다. 사용자 인터페이스(UI)의 중요한 요소로 융합되어 있어야 하고, 효과적인 상호작용이 일어날 수 있어야 합니다. 하지만 현재의 태그 구름들은 보통 "한 번 보고 클릭하면 끝"입니다. 그러면서도 화면의 중요한 위치를 차지하고 있으니 이 또한 낭비입니다.

태그 구름이 적절한 시각화인가에 대해서는 제 결론 대신, 위에서 인용했던 실험이 언급되어 있는 논문의 결론을 소개하겠습니다:
We have concluded that tag clouds are primarily a visualization used to signal the existence of tags and collaborative human activity, as opposed to a visualization used for data analysis.

(우리는 태그 구름이 데이터 분석을 위한 시각화라기 보다는, 사이트에서 태그와 협업을 지원한다는 것을 알려주기 위한 시각화일 뿐이라는 결론을 내렸다)
정보의 시각화(information visualization)라는 것은 눈요기(eye-candy) 용도가 아닙니다. 아무 목적도 없이 3차원으로 빙빙 돌고, 스프링처럼 쫀득쫀득 움직이는 그래프가 나오고, "Loading..." 때문에 기다려야 하거나, 처음 볼 때나 잠깐 신기한 특수 효과와 애니메이션을 보느라 몇 초씩 기다리고 있어야 하는 것은 잘못된 시각화의 사례들입니다.

예를 들어, 윈도 비스타에서 중요한 대화 상자가 뜰 때 애니메이션 효과를 주는 것은 심미적인 이유도 있겠지만, 넓은 모니터 상에서 시선을 효과적으로 끌어오기 위한 장치이기도 합니다(한 곳을 응시하고 있는 경우 인간의 눈은 다른 곳의 변화를 잘 인식하지 못합니다. 단, 다른 곳의 변화가 "움직임"인 경우 예외적으로 잘 인식할 수 있습니다 - UFOV and Motion).

이런 여러가지 이유로 저는 태그 구름을 별로 좋아하지 않습니다.

PS: 태그 구름을 싫어한다는 것과 태그를 싫어한다는 것은 다른 얘기인데(전자는 시각화, 후자는 모델), 공교롭게도 저는 태그 구름 뿐만 아니라 태그도 별로 좋아하지 않습니다. 이에 대해서는 이후에 다시 글을 써 볼 생각입니다.

Trackback 0 | Comments 4

감성적인 디자인에서 도널드 노먼은 "예쁜 물건이 쓰기도 좋다"고 말합니다:
심리학자인 Alice Isen과 동료들은 사람들이 행복한 상태로 있을 때 사고의 폭이 넓어지며 창조적인 사고가 촉진된다는 것을 입증하였다. (...omitted...) 사람들은 걱정으로 인해 불안해할 때 그 문제와 직접적으로 관련된 부분에만 집중하면서 사고의 폭을 좁히는 경향이 있다. 이는 위험한 상황에서 벗어나는 데는 좋은 전략이지만, 문제 해결에서 새로운 창의적 접근 방법을 생각해 내는 데는 좋은 전략이라 할 수 없다. Alice Isen의 결론을 보면, 사람들은 편안하고 행복한 상태일 때 사고의 진행이 넓어지고 창의적으로 되며 상상력이 풍부해진다.

이 연구를 비롯한 관련된 연구들의 결과에서 제품 디자인의 미학적 역할이 제기된다. 예쁜 물건은 사람들의 기분을 좋게 하고, 그 결과 더욱 창조적인 생각을 할 수 있게 한다. 제품이 사용하기 쉬워지는 이유는 무엇일까? 대답은 간단하다. 사람들이 직면한 문제의 해결책을 찾기 쉽도록 하기 때문이다. --p33~34, The Emotional Design
맞는 말입니다(이런 관점에서 생각하다보면 실용성과 아름다움을 구분하여 생각하지 않았던 고대 그리스인들의 미 관념(kalon)이 현대인들의 미 관념보다 더 적절하지 않았나 하는 생각도 듭니다).

그런데 "예쁜 물건"은 어떻게 만들 수 있을까요?

도널드 노먼은 "예쁜 물건"에 대한 인지가 "자동적이며 태어날 때부터 미리 프로그래밍된 본능적 단계(visceral level)"에서 일어난다고 말하고 있습니다. 이러한 단계(감정, 본능)에 대한 설명으로는 진화심리학, 미적 선호에 대한 이야기로 특화하자면 진화미학(Evolutionary Aesthetics)이 특히나 적절한 틀을 제공한다고 생각합니다.

진화미학에서는 인류 보편적인 미적 선호의 일부가 적응 문제(생존 혹은 번식)와 관련이 있을 것이라고 추측합니다. 오랜 자연선택(과 성선택) 과정을 통해 생존 및 번식에 도움이 될만한 환경이나 생물 등에 대한 선호가 생겼고, 이것이 인류 보편적이고 본능적인 미적 선호들과 관련이 있을 것이라는 것이죠. 그뿐만 아니라, 이러한 환경/생물과 유사한 외형을 가지는 인공물에 대해서도 여전히 미적 선호를 보일 것이라고 볼 수 있습니다.

진화미학의 관점은 "예쁜 물건은 사람들의 기분을 좋게 하고, 그 결과 더욱 창조적인 생각을 할 수 있게 한다"라는 연구 결과와도 통하는 면이 있습니다. 예를 들어 뱀이나 독거미 등이 있을지 모르는 "생존에 적절치 못한 환경"에 놓인 인간은 이러한 위험 요소들에 대해 의식적/무의식적으로 경계하게 됩니다. 반면 생존에 적절한 환경에서는 이러한 의식적/무의식적 노력의 분산이 필요 없어집니다. 이는 현대 사회에 적합한 단어로 치자면 "창조적인 생각"을 하기에 좋은 모드인 것이죠.

진화미학의 관점으로 한정 지어보면 "예쁜 물건"을 만드는 한가지 방법은 "자연을 닮은 인공물"을 만든다는 것입니다. 물론 "자연을 닮은 인공물"이라는 접근은 이미 여러 가지가 있습니다. 예를 들어:
등이 그렇죠.

하지만 단순히 "자연을 닮은 인공물"이라는 수준이 아니라 더 구체적인 제약을 가할 수 있습니다(제약이란 때때로 아주 좋은 것입니다). "과거 인류의 생존 및 번식에 도움이 되었을 환경 혹은 생물을 닮은 인공물"이라고 하는 것이죠.

이렇게 놓고 보면 Natural Metaphor for Information Visualization의 접근은 개선될 여지가 있습니다:

사용자 삽입 이미지

Natural Metaphor를 적용한 IV


작고 꾸물거리고 털 많은 벌레는 사실 "인류 보편적 혐오물"의 하나이니까요. 또, Organic Information Visualization 에서는 "불필요한 움직임을 줄여야 한다"는 가이드라인을 제시하고 있는데, 이 가이드라인은 도널드 노만의 본능적 단계(visceral level)에 대한 이야기라기 보다는 행동적 단계(behavioral level)에 해당하는 얘기라서 약간 쌩뚱 맞습니다. 본능적 단계에서의 가이드라인이라면 최적(optimal)이나 간결(simple)이 아닌 다른 축의 설명이 있어야 할 것 같습니다. 이를테면 "단순한 물리법칙에 따른 움직임 보다는 목적성을 가진 주체로 보이는 움직임이 좋다", "쥐처럼 움직이기 보다는 개처럼 움직이는 것이 좋다" 같은 설명 말이죠.

약간 벗어난 이야기일 수도 있지만 웹사이트 등의 "지역화" 문제 또한 진화미학 혹은 진화심리학적인 관점에서 생각해보면 조금 다른 시각으로 바라보게 됩니다. "지역화"란 각 지역의 문화나 관습에 맞게 제품을 커스터마이징하는 것을 말하는데, 어쩌면 "지역화"보다 ROI가 높은 작업은 "성별에 따른 커스터마이징" 혹은 "연령대에 따른 커스터마이징" 등일 수 있다고 생각해볼 수 있습니다.

인터페이스 디자인처럼 답이 무수히 많은 문제를 풀 때에는 제약이 많을수록 좋다는 생각을 해왔었는데(그래야 시행착오가 줄어드니까), 진화미학이 본능적 단계의 디자인 문제에 대한 하나의 제약이 될 수 있지 않을까 싶습니다.

요즘 하고 있는 재미있는 생각거리입니다.

Trackback 0 | Comments 4

< Newer     Older >