랜덤런치?

전 회사에서 경험한 좋은 개발 문화 중 랜덤 런치(Random lunch)라는 것이 있었다. 공식 명칭은 아니지만 나는 대충 저런 이름으로 부른다.

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

다른 팀 동료들은 물론이고, 좀처럼 만나볼 수 없는 직군의 전문가들을 만날 수 있어 무척 흥미로운 시간을 보낼 수 있었다. 궁금한 것들을 물어보기도 하고 예상 외로 마음이 잘 맞는 사람을 만나 친구가 될 수도 있었다.

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

이번 회사에서도 랜덤 런치를 적용해 보자

이번 회사에서도 랜덤 런치가 있으면 좋을 것 같아서 매주 1회의 랜덤 런치를 제안했더니 괜찮을 것 같다는 반응을 얻었다.

바로 다음주부터 시작한다.

그리고 랜덤 조 편성은 내가 해야 한다.

작은 스타트업이니 제안한 사람이 하는 게 당연한 일이긴 하다.

랜덤 조 편성 도구 만들기

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

구글 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라는 숫자는 대충 로 계산해서 나온 것이므로 이것도 그냥 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  보로미르