Rath World » 2009 » November

Archive

Archive for November, 2009

착한 사람이 조직을 망치는 방법

November 17th, 2009 16 comments

착한 사람들은 시스템의 문제나 조직의 문제를 보고, 그것을 지적하고 프로세스를 개선하는 길을 선택하는 대신, 책임감 중독에 빠져 스스로를 희생하여 조직의 문제를 자신이 커버해야 된다고 생각한 뒤, 이 생각을 행동으로 옮긴다.

초반에는 스스로가 많은 일들을 처리하고 있기 때문에 가치있는 존재가 되었다는 기분에 우쭐해 하기도 하고, 기존 문제점을 아는 사람들로부터 중요한 사람으로 평가되기도 한다.

이들은 머지 않아 곧 지치게 되고, 시스템이 가지고 있던 많은 문제점들이 다시 드러나게 된다. 하지만 때는 이미 늦었다. 왜냐하면 이들이 자꾸 문제점들을 숨겼기 때문에 (좋게 말하면,  스스로 처리해버렸기 때문에) 누구도 프로세스에 문제가 있다는 생각을 할 수 없게 만들었기 때문이다. 시간이 흘러감에 따라 일의 복잡도가 늘어나는 것이 보통이기 때문에, 이들이 업무에 착수할 때보다 문제점들은 더욱 더 커져있게 마련이다. 결국 또 한 명의 착한 사람이 필요하게 되고, 악순환은 깊어지게 된다.

물론 나는 이런 사람을 착한 사람이라고 생각하지 않는다. 이기적인 사람일 뿐이다. 혹은 현재의 후진 시스템을 개선하는 작업에 두려움을 느끼고 한 발 뒤로 물러선 회피성 성격의 사람일 뿐이다.

문제점들은 공유되고 까발려져야만 한다. 임원들은 이런 사람들의 사탕발림에 넘어가지 않도록 각별히 신경을 써야할 것이다.

Categories: Life Tags:

Google이 발표한 새로운 시스템 프로그래밍 언어 Go 써보기

November 13th, 2009 7 comments

구글이 새로운 시스템 프로그래밍 언어인 Go를 발표했습니다.

이것이 무엇인가.. 에 대한 글은 인터넷에 마구마구 퍼져있으니 찾아보시면 되고요, 어제 Google Go를 보고 제가 미투데이에 남겼던 기록들은 여기에서 볼 수 있습니다.

안타깝게도 release revision의 json 모듈에 버그가 있어서 2시간정도 삽질을 했습니다. 그것이 버그인지 감별하는데 대부분의 시간을 보냈고, 실제로 버그를 고치는데는 30분 정도가 걸린 듯 하네요.

$GOROOT/src/pkg/json/parse.go 에서 유니코드 문자열 처리를 위해 \u를 만났을때 다음 4바이트를 읽어 int로 변환하는 _UnHex 펑션에서 start, end offset을 받게 해놓고, caller는 start, length를 불러서 생긴 어처구니 없는 버그였습니다. 영광스럽게 패치를 보내려고 하니.. current revision에는 이미 고쳐있지 뭐에요. 별 수 있나요. 울었습니다.

문법에 익숙해지는데 꽤 시간이 걸렸지만, 깔끔합니다.

시험삼아 미투데이에서 내게 달린 최근 댓글을 확인하는 콘솔 프로그램을 만들어보며 학습을 했는데, make 파일과 me2comment.go 파일을 한 번 둘러보시지요.

* Makefile

1 include $(GOROOT)/src/Make.$(GOARCH)
2
3 TARG=me2comment
4 GOFILES=\
5     me2comment.go\
6
7 include $(GOROOT)/src/Make.cmd

* me2comment.go

 1 package main
 2
 3 import (
 4     "io";
 5     "http";
 6     "json";
 7     "fmt";
 8     "regexp";
 9     "flag";
10 )
11
12
13 func filter_html(str string) string {
14     remove_anchor := regexp.MustCompile("<[^>]+>");
15     var s string = remove_anchor.ReplaceAllString(str, "");
16     s = regexp.MustCompile("&lt;").ReplaceAllString(s, "<");
17     s = regexp.MustCompile("&gt;").ReplaceAllString(s, ">");
18     return s;
19 }
20
21 func main() {
22     var username string;
23     flag.StringVar(&username, "username", "rath", "Your ID of the me2DAY.");
24     flag.Parse();
25
26     url := fmt.Sprintf("http://me2day.net/api/track_comments/%s.json", username);
27     r, _, err := http.Get(url);
28     if err!=nil {
29         fmt.Printf("Error: %v\n", err);
30         return;
31     }
32
33     buf, err := io.ReadAll(r.Body);
34     ret, ok, errtok := json.StringToJson(string(buf));  
35     if !ok {
36         fmt.Printf("Error: %v\n", errtok);
37     } else {
38         to_me := ret.Get("comment_to_mes");
39         var last_post string = "";
40         for i:=0; i<to_me.Len(); i++ {
41             e := to_me.Elem(i);
42
43             nickname := json.Walk(e, "comment/author/nickname");
44             body := filter_html(json.Walk(e, "comment/body").String());
45             post_body := filter_html(json.Walk(e, "post/body").String());
46
47             if post_body!=last_post {
48                 var to_print string = post_body;
49                 if len(post_body)>50 {
50                     to_print = post_body[0:50]
51                 }
52                 fmt.Printf("* %s\n", to_print);
53             }
54             fmt.Printf("   ㄴ%s: %s\n", nickname, body);
55             last_post = post_body;
56         }
57     }
58
59     r.Body.Close();
60 }

실행시키면 ..


Jang-Ho-Hwangs-iMac:tmp rath$ ./me2comment
* 그녀의 요리 실력은 나날이 업그레이?
   ㄴ2Z[이지]: 영국이라는 게 믿기지 않아요! @.@
   ㄴJB♥: 와웅 보쌈코기 같이생겼어용ㅋㅋ뭔가맛나보이는 덮밥입니다ㅋㅋ
   ㄴ바람달: 하앍
   ㄴK-Dog: 크아!!
   ㄴtomato: 소스는 없이 먹는건가요?
* $GOROOT/src/pkg/json/parse.go 에서 \u를 만났?
   ㄴ솥아: 난 왜 최신 언어들에는 관심이 없는걸까 -.-  [글보러가기]
* 그녀의 요리 실력은 나날이 업그레이?
   ㄴ_wonhui: 맛있어 보입니다 -ㅁ-
* $GOROOT/src/pkg/json/parse.go 에서 \u를 만났?
   ㄴK-Dog: 꺅 더 좋은 세상을 위해 애쓰시는군요
   ㄴ다즐링: 이 님하 고고씽 삼매경.. ㅠㅠ 이러지마셈 흑흑..
* 버그 찾았다 >_< 2글자만 더 입력하면 ?
   ㄴgyedo: 역시 고수 ^^b
* $GOROOT/src/pkg/json/parse.go 에서 \u를 만났?
   ㄴgyedo: 보통 버그들이 ^^ 어처구니 없죠, 근데 current에는 고쳤다니 기특한걸요
* 밤에 집중이 잘 되는 나. 런던은 요새
   ㄴ늘보: 헉 ㅋㅋ 전 생산성이 떨어져요. 해가 지고나면 졸려서 ㅋㅋ
   ㄴ루치아: 컨디션 안 좋으면 쉬면서 해야죠 ㅎㅎ

이렇게 최근 내게 달린 댓글을 출력해주는 간단한 프로그램입니다.

go가 의존성을 모두 날려버리고 하나의 binary로 만들어주는 기특한 녀석이기 때문에, 이런 간단한 프로그램의 바이너리가 1.2MB나 된답니다. (darwin/amd64 빌드임)

만만한게 미투데이라 ^_^ 시스템 프로그래밍과 전혀 무관한 미투데이 클라이언트를 만들어보았는데요, 다음에 기회가 되면 go의 자랑 기능인 동시성 지원부분을 써보고 싶네요.

Categories: Daily, Development Tags: , ,

멀티태스킹이 어떻게 당신을 위험에 빠트리는가

November 12th, 2009 3 comments

나는 멀티 태스킹을 좋아한다. 왜 좋아하는지는 명확히 기술하기는 어렵다.

아무튼 자원이 낭비되고 있지 않다는 사실에서 오는 어떤 안도감을 좇는 것이 분명하다. 이것은 효율성을 좇는 것과는 또 다른 이야기이다.

큰 파일을 다운로드 받으려면 오랜 시간이 걸린다. 그런데 신기하게도, 큰 파일을 다운로드 받고 있다는 점을 내가 인식하고 있으면, 일에 잘 집중이 안된다. 다운로드 하는 작업이 날 비트적으로 정신적으로 직접적인 방해를 주는 것이 아니라, 해야 할 일에 내가 잘 집중하지 않는 것이다.

그래서 생각했다.

나는 자원이 낭비되지 않고 있다는 사실을 알면, 즉 직접적으로 내 정신력을 소비하지 않더라도 효과적이라고 생각하는 무엇이 진행되고 있다는 점을 인식하면, 더이상 열심히 일해야 할 필요가 없다고 느껴서 자연적으로 게을러지는 게 아닐까?

예를 들어 비지니스 관계에서, 이메일로 의사소통을 하고 있다고 치자. 나는 상대방으로부터 메일을 받았고, 적절한 피드백을 담아 회신 메일을 작성한다. 그리고 회신 메일 마지막에는 상대방에게 또 다른 피드백을 요구했다. 그리고 이 메일을 발송하고 나면 상대방으로부터 회신 메일이 도착하기전까지 나는 잠시 자유로워졌다는 착각에 빠지고는 한다. 상대방이 메일 회신을 위해 일하고 있다는 것을 추측했기 때문이다. 이메일을 통한 의사소통 섹션에서는 자유로워졌을지 몰라도, 다른 일들이 당신을 기다리고 있다는 사실은 조금도 변하지 않았다.

요즘 나는 페이스북 게임을 몇 개 하고 있다. 그 중 중독성이 가장 심한 것은 얼마전 Facebook Connect 버전도 출시한 Bejeweled Blitz와 Rockyou가 만든 Zoo World 이다. 비주얼드 블리츠는 게임을 하지 않는 동안에는 결코 날 괴롭히지 않는다. 대신 게임을 하는 그 1분동안 엄청난 집중력을 필요로 한다. 반면, Zoo World는 많은 집중력을 필요로 하지 않는다. 하지만, 계속 띄워놓고, 관심을 가져줄 것을 요구한다. 지금 Zoo World 레벨이 20인데, 중간 사이즈의 동물 4마리를 Breed 해야하는 미션이 활성화 되어있다. 동물 한마리를 새끼치려면 동물에 따라 다르지만 현실세계의 물리적인 시간 24시간 또는 72시간을 필요로 한다. 그 시간동안에는 게임에 접속하지 않아도 된다.

이것은 큰 파일을 다운로드 받는 것과 동일한 점이 있다. 파일을 다운로드 받겠다는 의사표시는 내가 주도적으로 한 것이며, 그 이후에는 나의 노력 여하와 무관하게 몇시간을 기다려야 한다는 것이다.  그럼 그 몇시간동안 나는 심리적으로 자유로워진다. 나의 주도적인 지시에 기반하여 어떤 일들이 열심히 벌어지고 있기 때문이다.

그래서 나는 뭔가 바쁘게 계속 하고 있다는 기분을 느낀다. 이것을 게임에 대입해서 문제지 -_- 실제 업무 환경에서도 크게 다르지 않기 때문에 이해를 돕기 위해 게임을 예로 들었다. 계속 바쁘게 뭔가를 하고 있다는 기분이 들면, 그것들이 내 성취욕의 많은 부분을 채워주었고 책임감도 덜어주었으므로, 다른 일에 몰두해야할 심리적 동기를 빼앗는 결과를 초래한다.

그래서 나는 엄청나게 바빠야 될랑말랑한 와중에도, 이렇게 딩가 딩가 시간을 보내고 있는 것이다.

이 함정에 빠지지 않으려면, 정신줄을 꽉 붙들어 메고 끊임없이 사고해야 한다. 일시적인 해결책으로 다운로드를 중단하고, 게임을 하지 않기로 선언할 수도 있다. 하지만 살다보면 이런 일들은 부지기수로 일어나게 마련이다. 지금 발등에 떨어진 불을 끄기 위해 이 일들을 없애버려본들 수주내로 이런 일들은 다시 생긴다. 도망치지 말고 싸워이겨내야 한다.

나폴레옹은 그가 신봉하는 전쟁의 원칙이 무엇이냐는 질문에 대해 자신은 어떤 원칙도 신봉하지 않는다고 답했다. 주어진 상황에 대해 매번 끊임없이 사고하고 무엇이 최적일지 생각하는 자세를 유지하는 것만이 이 올바른 길이다.

자, 달리자.