여유가 왜 필요한가에 대한 이야기
03/05/2016
왜 우리는 집단에서 바보가 되었는가 : 조직의 모든 어리석음에 대한 고찰을 읽었다.

괴팅겐 오오 말로만 듣던 그 괴팅겐, 힐베르트가 세상을 지배하던 그 괴팅겐 수학과를 나와 독일 IBM CTO 을 역임한 저자가 조직 생활에서의 여러 불합리함을 정말 자세히 - 마치 한 말을 또 한다는 느낌이 들 정도로 서술한 책이다. 솔직히 이야기하면 이 책을 구매하면서 기대한 것은 똑똑한 개인의 집합인 집단이 어떠한 이유로 어리석은 결정을 내리는 조직이 되는가에 대한 대답이었는데, 그에 대한 대답은 같이 사서 지금 읽고 있는 진화심리학에 기대해봐야 하겠다.
책의 내용 중 기계의 가동율을 높이듯 구성원들이 여유를 없애는 것이 왜 문제인지에 대해 대기행렬이론을 기반으로 설명하는 점이 신선했다. 아드레날린 정키 라는 멋들어진 이름까지 있는 이 열심히만 일하는 것이 문제다는 점에서는 다들 인정하지만 왜 이것이 나쁜가에 대해서는 주로
상당히 그럴싸한 내용임에도 여유 시간과 대기열의 길이를 나타내는 분수 식 하나만 있고 어떻게 그러한 수치가 나왔는지는 설명이 없어서 한 번 시뮬레이션하는 코드를 만들어 보았다.

괴팅겐 오오 말로만 듣던 그 괴팅겐, 힐베르트가 세상을 지배하던 그 괴팅겐 수학과를 나와 독일 IBM CTO 을 역임한 저자가 조직 생활에서의 여러 불합리함을 정말 자세히 - 마치 한 말을 또 한다는 느낌이 들 정도로 서술한 책이다. 솔직히 이야기하면 이 책을 구매하면서 기대한 것은 똑똑한 개인의 집합인 집단이 어떠한 이유로 어리석은 결정을 내리는 조직이 되는가에 대한 대답이었는데, 그에 대한 대답은 같이 사서 지금 읽고 있는 진화심리학에 기대해봐야 하겠다.
책의 내용 중 기계의 가동율을 높이듯 구성원들이 여유를 없애는 것이 왜 문제인지에 대해 대기행렬이론을 기반으로 설명하는 점이 신선했다. 아드레날린 정키 라는 멋들어진 이름까지 있는 이 열심히만 일하는 것이 문제다는 점에서는 다들 인정하지만 왜 이것이 나쁜가에 대해서는 주로
- 번아웃이 되기 때문에 결과적으로는 성과가 낮아져서
- 여유가 없으면 창의적인 사고를 할 수 없기 때문에
상당히 그럴싸한 내용임에도 여유 시간과 대기열의 길이를 나타내는 분수 식 하나만 있고 어떻게 그러한 수치가 나왔는지는 설명이 없어서 한 번 시뮬레이션하는 코드를 만들어 보았다.
조건은 아래와 같다.
- 8시간 동안 1분 마다 손님이 방문할 수 있으며 최대 5명까지 올 수 있다.
- 손님이 오는 사건은 서로 독립이며 확률은 0.05 이다.
- 손님 1명당 처리 시간은 3분이다.
... 07:59 [ 0] 0명 대기 (신규 0명) 08:00 [ 0] 0명 대기 (신규 0명) working ratio 59.79 287/480, 평균 대기인 1.00
의 결과가 나오는데 대략 업무시간의 60%만 일하는 경우 한 명 정도의 대기인이 발생한다 가 되겠다.
그런데 여기서 업무시간 효율을 높이기 위해 창구 수를 절반으로 줄여 창구당 처리할 손님을 두 배로 만들어 보자.
이렇게 되면 손님의 방문 확률이 0.05에서 0.1로 두 배로 증가하게 된다.
이렇게 되면 결과가
그런데 여기서 업무시간 효율을 높이기 위해 창구 수를 절반으로 줄여 창구당 처리할 손님을 두 배로 만들어 보자.
이렇게 되면 손님의 방문 확률이 0.05에서 0.1로 두 배로 증가하게 된다.
이렇게 되면 결과가
... 07:57 [ 278] 93명 대기 (신규 1명) 07:58 [ 277] 93명 대기 (신규 0명) 07:59 [ 279] 93명 대기 (신규 1명) 08:00 [ 281] 94명 대기 (신규 1명) working ratio 99.58 478/480, 평균 대기인 48.25
대기인 수를 평균으로 잡아서 48명이 나왔지 점점 대기인 수가 증가하는 것을 볼 수 있다. 뭐 경영 합리화 화신의 눈으로 보면 저 working ratio 가 99.58% 인 것이 모든 것을 압도하겠지만.
실제 코드는 아래에서 확인할 수 있다.
queue.pl
queue.pl
#!/usr/bin/perl
use strict;
use warnings;
# 대기열의 평균 길이를 구해 보자.
# 창구는 1개, $n시간 동안 열려 있다.
my $n = 8;
# 손님이 방문할 확률은 $p 이고 동시에 $k명까지 방문한다.
# my $p = 0.05;
my $p = 0.1;
my $k = 5;
# 창구의 고객 처리 시간은 $d분 이다.
my $d = 3;
my $idle_tick = 0;
my $waiting = 0;
my @total_ticks = (1..$n*60);
my $total_waiting_customer = 0;
foreach my $tick ( @total_ticks ){
my $neo_customer = 0;
foreach ( (1..$k) ){
if( rand(1) <= $p){
$neo_customer ++;
}
}
$waiting += ($neo_customer * $d);
if($waiting > 0){
$waiting --;
}
my $waiting_customer = 0;
if($waiting > 0){
$waiting_customer = int(($waiting -1) / $d) + 1;
}
if($waiting == 0){
$idle_tick ++;
}
$total_waiting_customer += $waiting_customer;
my $hour = 0;
$hour = int($tick/60);
my $minute = $tick - $hour * 60;
printf "%02d:%02d [%4d] %3d명 대기 (신규 %d명)\n",
$hour, $minute, $waiting, $waiting_customer, $neo_customer;
}
my $total_tick = scalar(@total_ticks);
printf "working ratio %.2f %d/%d, 평균 대기인 %.2f\n",
100*($total_tick - $idle_tick)/$total_tick,
$total_tick - $idle_tick,
$total_tick,
$total_waiting_customer/$total_tick;