랜덤 런치?

랜덤으로 3~5인 규모의 그룹을 구성해 함께 점심 식사를 하는 것을 말한다.

조직 내에 다양한 비공식적 소통 채널이 자연스럽게 생성된다.

작은 그룹 보다는 큰 그룹에서 시행할 때 효과가 좋다.

사례

우아한형제들

전 회사인 우아한형제들에서 경험한 좋은 개발 문화 중 랜덤 런치(Random lunch)라는 것이 있었다.

공식 명칭은 잘 모르겠고 다들 대충 저런 이름으로 불렀다.

매주 금요일마다 회사 동료들과 랜덤으로 3~4명씩 짝을 지어 점심을 먹는 제도인데 한 달에 한 번은 전사 직원을 대상으로 랜덤 조를 편성했다.

다음과 같은 장점이 있었다.

  • 다른 팀 동료들은 물론이고, 좀처럼 만나볼 수 없는 직군의 전문가들을 만날 수 있었다.
    • 궁금한 것들을 물어볼 좋은 기회가 되었다.
    • 예상 외로 마음이 잘 맞는 사람을 만나 친구가 될 수도 있었다.

식사비는 1인당 만원~만오천원 선에서 법인카드로 결제했다.

베링거 인겔하임의 런치 룰렛

하버드 비즈니스 리뷰 2013년 1월 8일, A New Way to Network Inside Your Company by Sylvia Ann Hewlett.

베링거 인겔하임의 런치 룰렛은 다음과 같이 사용한다.

  • 참가자는 런치 룰렛 앱에서 점심을 먹을 날짜를 고른다.
  • 식사를 할 회사 식당 중 하나를 고른다.
  • "Match Me" 버튼을 누르면 날짜가 캘린더에 등록되고 알림이 이메일로 전송된다.
  • 해당 날짜가 되면 열린 마음과 네트워킹에 대한 의지를 갖고 약속 장소로 간다.

위의 링크된 기사를 읽어 보면 다음과 같은 긍정적인 효과가 있음을 알 수 있다.

  • 위, 아래 직급이 서로에게 무언가를 배울 수 있는 기회가 생긴다.
  • 누구도 예상하지 못했던 조합의 대화가 탄생한다.
    • 예) 법무팀과 연구개발 조직의 조합
  • 다른 업무를 하는 직원들끼리 만나 서로를 이해할 수 있는 계기가 된다.
  • 특정한 방향의 커리어에 관심이 있는 사람이 있다면, 해당 업무를 수행하는 사람과 만나 계속 관계를 이어가는 첫 단추가 된다.
  • 회사 문화에 대한 자신감을 보여줄 수 있게 된다.
  • 조직 전체에 브레인 스토밍을 하는 셈이 된다.
  • 조직 전체에 보이지 않는 링크를 생성한다.
  • 조직원들을 다양한 관점과 아이디어에 노출되게 한다.

Wooga의 Mystery Lunchtime

박성국님이 재직중인 독일의 게임 회사 Wooga에는 Mystery Lunchtime 라는 식사 제도가 있다.

Wooga에서는 다음과 같이 Mystery Lunchtime을 시행하고 있다.

  • 몇 주에 한 번씩 점심식사 전에 몇 백명의 직원들이 사무실에 모여 발표를 기다린다.
  • CEO 부터 신규 입사자까지 랜덤으로 4인 그룹으로 구성된 조에 배정된다.
  • 같은 조원이 누구인지 파악한 다음, 사무실을 나가 식사하러 간다.
  • 점심 식사 비용은 무료이다.

다음과 같은 효과가 있다고 한다.

  • 회사의 특별한 문화를 유지하는 데에 도움을 준다.
  • 구성원들 사이의 어색함을 줄이고, 서로 친근하게 대화하게 된다.
  • 매번 새로운 세 사람을 알게 된다.

bash 명령어로 랜덤 조 편성 도구 만들기

전 회사에서는 랜덤 조 편성은 구글 스프레드 시트를 사용하고 있었다.

구글 apps script로 적당히 랜덤으로 4명 정도씩 조 편성을 해주는 코드를 매주 돌리고 있었던 것.

썩 괜찮은 방법이었겠지만 나는 좀 다른 방법을 사용하기로 했다.

동료들 이름을 텍스트 파일로 만들어 두면 그냥 bash 명령어 한 줄이면 끝날 것 같다는 생각이 들었기 때문이다.

Node.js, Python 다 좋은 도구들이지만 이런 작업들은 그냥 bash 명령어 조합이 편하다.

sort -R

sort 명령어에 -R 옵션을 붙이면 랜덤 정렬을 해준다.

일단 다음과 같은 파일을 만들고 rps.txt 라는 이름으로 저장해보자.

가위
바위
보

그리고 sort -R rps.txt 명령을 실행해 보면 다음과 같이 랜덤으로 정렬된 결과를 볼 수 있다.

$ sort rps.txt -R
보
가위
바위

$ sort rps.txt -R
가위
바위
보

$ sort rps.txt -R
보
가위
바위

여기에 파이핑을 해서 head -1를 붙여준다면 아주 짧은 가위바위보 프로그램을 만들 수 있다.

$ sort rps.txt -R | head -1$ sort rps.txt -R | head -1
바위

cat -n

cat 명령어에 -n 옵션을 붙이면 줄 번호를 붙여준다.

$ cat -n rps.txt
     1	가위
     2	바위
     3	보

sort -R 과 조합하면 다음과 같은 결과를 볼 수 있다.

$ sort rps.txt -R | cat -n
     1	보
     2	가위
     3	바위

modular를 써서 조를 편성하자

조를 편성하는 방법은 여러 가지가 있겠지만…

사람의 수가 결정되어 있고, 한 조에 대충 몇 명이 들어가면 되는지도 3~4 명으로 정해져 있으므로 그냥 간단하게 modular를 쓰기로 했다.

이제부터는 가위바위보로 하지 않고 반지의 제왕 등장인물들을 사용해보자.

다음과 같은 내용의 members.txt 파일을 먼저 작성했다.

간달프
갈라드리엘
골룸
김리
나즈굴
레골라스
메리
보로미르
빌보
사루만
사우론
샘
세오덴
엘론드
파라미르
프로도
피핀

랜덤으로 정렬하고 줄 번호를 붙이면 다음과 같이 된다.

$ sort -R members.txt | cat -n
     1	프로도
     2	피핀
     3	세오덴
     4	김리
     5	사우론
     6	파라미르
     7	나즈굴
     8	간달프
     9	메리
    10	샘
    11	엘론드
    12	갈라드리엘
    13	보로미르
    14	레골라스
    15	골룸
    16	사루만
    17	빌보

이제 줄 번호를 생성해야 하는 조의 숫자로 나눈 나머지로 치환하면 된다. 나머지 연산은 쉽게 쉽게 그냥 awk를 썼다.

$ sort -R members.txt | cat -n | awk '{print $1 % 4 "  " $2}'
1  피핀
2  사루만
3  갈라드리엘
0  샘
1  엘론드
2  사우론
3  골룸
0  간달프
1  메리
2  김리
3  나즈굴
0  프로도
1  빌보
2  세오덴
3  레골라스
0  보로미르
1  파라미르

이렇게 하면 왼쪽에 나온 숫자가 조 번호가 된다. 이제 조별로 모아서 보기 쉽게 정렬만 해주면 된다. sortsort -n을 쓰면 된다.

$ sort -R members.txt | cat -n | awk '{print $1 % 4 "  " $2}' | sort -n
0  빌보
0  피핀
0  보로미르
0  파라미르
1  골룸
1  사루만
1  사우론
1  세오덴
1  레골라스
2  샘
2  나즈굴
2  엘론드
2  갈라드리엘
3  김리
3  메리
3  간달프
3  프로도

1조가 5명이 되었다는 점에 주목하자. 앞에서부터 4명씩 칼같이 조를 쪼갰다면 레골라스는 혼자 4조가 되어 혼밥을 해야 했을 것이다. 4로 나누는 나머지 연산을 한다는 것은 0, 1, 2, 3 조를 결정해놓고 인원을 분배하는 것이기 때문에 이런 1조 1인 문제를 해결할 수 있다.

만약 나머지 연산을 하지 않고 그냥 나누기를 했다면 어떻게 됐을까?

$ sort -R members.txt | cat -n | awk '{print int($1 / 4) "  " $2}' | sort -n
0  보로미르
0  파라미르
0  갈라드리엘
1  골룸
1  김리
1  메리
1  간달프
2  샘
2  나즈굴
2  세오덴
2  엘론드
3  빌보
3  피핀
3  프로도
3  레골라스
4  사루만
4  사우론

1, 2, 3 조는 4명씩 잘 만들어지지만, 0조와 4조가 인원수가 애매하게 나온다.

조의 수를 자동으로 결정하게 하자

위에서는 조의 수를 4로 정해놓고 계산했지만 이걸 수동으로 정할 필요는 없을 것이다.

4라는 숫자는 대충 \(\lfloor { \text{전체 인원수} \over \text{한 조의 인원수}} \rfloor\)로 계산해서 나온 것이므로 이것도 그냥 members.txt의 행 수를 통해 자동으로 계산되게 하면 된다.

$ PARTY_COUNT=`wc -l members.txt | awk '{print int($1 / 4)}'`

$ echo $PARTY_COUNT
4

이제 $PARTY_COUNT 변수를 사용하기만 하면 된다.

$ sort -R members.txt | cat -n | awk '{print $1 % '$PARTY_COUNT' "  " $2}' | sort -n

굳이 변수를 쓸 필요가 없다면 다음과 같이 긴 명령어로 만들어 써도 된다.

$ sort -R members.txt \
> | cat -n \
> | awk '{print $1 % '`wc -l members.txt | awk '{print int($1 / 4)}'`' "  " $2}' \
> | sort -n
0  샘
0  메리
0  간달프
0  프로도
1  골룸
1  사루만
1  사우론
1  세오덴
1  파라미르
2  김리
2  빌보
2  엘론드
2  레골라스
3  피핀
3  나즈굴
3  보로미르
3  갈라드리엘

grep -v 로 부재자를 처리하자

지금까지의 방식을 사용하면 동료들의 이름이 나열된 텍스트 파일 하나만 유지보수하면 충분하다.

그런데 가끔 휴가나 재택근무, 외근 등의 이유로 자리를 비우는 동료가 있을 수 있다.

이런 경우엔 어떻게 할까?

members.txt 파일에서 해당 동료의 이름을 삭제하고 랜덤 명령어를 실행하면 되긴 되는데… 만약 지운 동료의 이름을 복구하는 걸 깜빡하면 그 다음주에 동료의 이름이 빠진 채로 조가 편성될 수 있다.

조직의 크기가 커진다면 이걸 파악하는 것도 골치아픈 일이 될 수 있다.

그러므로 다음과 같이 members.txt에 부재자를 표시하고 이를 활용하는 방법을 생각해 보자.

다음은 # 기호를 써서 세오덴과 파라미르가 부재한 상황을 표현한 것이다.

$ cat members.txt 
간달프
갈라드리엘
골룸
김리
나즈굴
레골라스
메리
보로미르
빌보
사루만
사우론
샘
#세오덴
엘론드
#파라미르
프로도
피핀

다음과 같이 grep -v 를 사용하면 #기호로 표시한 멤버를 제외할 수 있다.

$ grep -v '#'  members.txt 
간달프
갈라드리엘
골룸
김리
나즈굴
레골라스
메리
보로미르
빌보
사루만
사우론
샘
엘론드
프로도
피핀

이제 전체 명령어의 앞부분을 다음과 같이 수정해주면 된다.

$ grep -v '#' members.txt | sort -R \
> | cat -n \
> | awk '{print $1 % '`wc -l members.txt | awk '{print int($1 / 4)}'`' "  " $2}' \
> | sort -n
0  골룸
0  피핀
0  프로도
1  김리
1  메리
1  사루만
1  사우론
2  샘
2  나즈굴
2  엘론드
2  갈라드리엘
3  빌보
3  간달프
3  레골라스
3  보로미르

이제 이 명령어를 셸 스크립트로 저장해서 쓰면 된다.

나는 적당히 randomlunch.sh라는 이름으로 저장했다.

#! /usr/bin/env bash
grep -v '#' members.txt | sort -R | cat -n | awk '{print $1 % '`wc -l members.txt | awk '{print int($1 / 4)}'`' "  " $2}' | sort -n

잘 돌아간다. 이제 매주 실행 결과만 슬랙에 복붙하면 된다.

$ bash randomlunch.sh
0  간달프
0  나즈굴
0  갈라드리엘
1  샘
1  골룸
1  빌보
1  피핀
2  김리
2  사루만
2  사우론
2  레골라스
3  메리
3  엘론드
3  프로도
3  보로미르