»
S
I
D
E
B
A
R
«
Bad Team Culture – 변화의 시작.. 상향식? 하향식?
Feb 1st, 2010 by Wegra Lee

조직의 변화에 대해 이야기할 때, 상향식(bottom-up), 하향식(top-down) 운운하면서 서로 책임을 회피하는 경향이 심하다는 느낌이다.

상향식은 조직의 아랫사람들부터 변화의 물결이 일어 결국 윗사람들까지 동참시키는 경우이고, 하향식은 반대로 윗사람의 의지에 의해 아래까지 변화를 일으키는 방식이다.  어느 방식이 더 나은 선택이 될 것인가? 만약 어느 한쪽을 운운하는 사람은 변화도입에 대한 전문성이 부족하거나(하향식 변화 도입에 대한 환상[1] – 김창준), 혹은 자신의 책임을 회피해보려는 시도를 하고 있다고 볼 수 있을 것이다.

하향식 변화 도입에 대해선 위 김창준씨의 글을, 상향식 변화 도입에 대해서는 일전에 내가 작성해둔 글 – Show Me The Magic[2]을 참고하면 좋을 것이다. 그리고 그 둘의 결론 역시 Show Me The Magic 에 잘 나타나 있다.

그럼에도 이 글을 적는 목적은, 조직에서 자신의 위치, 자신의 역할에 대한 자각의 필요성을 느껴서이다.

내가 변화시켜보려 했던 팀에서 가장 큰 문제들은 바로 하급 관리자가 조직의 머리에 해당하는 사람들의 논리를 대변한다는 것이었다. 대략 8 단계로 이루어진 조직 피라미드의 밑에서 3번째에 위치한 사람들에 해당하는 이야기이다.

아래에서 3번째이면 말단 관리자, 즉 아래에서부터 올라가 최초로 ‘관리자’라는 타이들을 달아볼 수 있는 직급이다. 이 계층의 구성원들이 ‘먼저 다른 사람들을 다 설득시키고 나한테 오라’, ‘정말 좋으면 내가 참여 안해도 다들 하겠지’ 라는 말을 하고, 뒷짐진채 ‘자! 재주껏 나를 설득해봐!’ 라는 자세를 취한다. 그러면서 ‘역시 상향식 변화는 안되’라고 말하는 모습을 보며 ‘당신이 현 조직에서 윗사람에 해당한다고 생각합니까?’라는 말이 목구멍까지 올라왔지만 참은 적도 몇 번 있다. ^^

그 계층에서부터 공감대를 형성하고 의지를 다져 변화를 이야기해야 비로서 ‘상향식 변화의 첫 발을 내딛었다’ 라고 할 수 있다. 아랫 사람들의 목소리를 전파해줄 수 가장 낮은 위치의 사람들이 그 위치에 올라서자마자 이런 마음자세로 돌변한다면, 그 조직은 절대 변화할 수 없다. 그렇다면 하향식 변화를 기대해야 할까? 그것 역시 환상이다[1].

이 글을 읽는 분들은 자신이 조직에서 어느 위치에 있는지, 그 위치에서 어떤 역할을 해주어야 더 나은 조직으로 변화할 수 있을지 찬찬히 생각해보았으면 한다.


References

  1. 하향식 변화 도입에 대한 환상 (애자일 이야기, 김창준)
  2. Bad Team Culture – Show Me The Magic (wegra.org)
Regarding Incremental Delay Policy (Bad Team Culture)
Jan 16th, 2010 by Wegra Lee

어제는 오랫만에 깨어 있는 SE 전공자를 만났다. 여러 화두들 중 일전에 포스팅한 Bad Team Culture – Incremental Delay [1] 에 관한 이야기가 나왔고, 그분은 재미난 해결책 하나를 말씀해 주셨다.

먼저.. Incremental Delay 란 현상적으로 보면 주요 마일스톤 일정을 막바지에 조금씩’만’ 뒤로 미루며 결국 긴 기간동안 지연되는 것이다. 어쩔 수 없이 나타나는 현상이라면, 그리고 이를 문제로 인식하고 해결하려고 하는 조직이라면 미래가 있다. 하지만 내가 보아온 많은 조직에서는 관리자들이 의도적으로 이런 정책을 편다.

그들은 ‘9월에 끝날 거 같은 과제라면 6월에 끝내라고 해야 그나마 9월에 끝이 난다’라고 말한다. 그들 믿음의 기반은 ‘개발자는 일정으로 쪼지 않으면 일을 열심히 하지 않는 게으른 존재’ 라는 것이다. 그러면서 이게 노하우이고 자신이 팀을 잘 이끌고 있다고 믿는다.

노동 집약적 산업 시대의 잔재인 듯한 이런 시도는 신입사원처럼 아직 조직에 적응하지 못한 사람이나 선천적인 워커홀릭 정도에게나 효과를 보인다. 워커홀릭은 몸이 부서지거나 삶의 전환이 될만한 계기가 찾아오지 않는한 열심히 일하지만, 신입사원들은 기껏해야 한 두 해면 유효기간 만료이다. 결국 9월이 지나고 10월, 11월이 지나도 끝나지 않는다.

왜 그럴까? 관리자들은 종종 ‘내가 6월이라고 말했지만 사실 난 9월로 예상하고 있어’라는 것을 자신만 알고 있다고 ‘착각’하기 때문이다. ‘당신만 아냐? 나도 안다.’ – 개발자들의 마음속이다. 물론 9월이라고 똑같이 예측하는 사람은 일부, 대부분은 자기 나름의 예상치를 잡거나 아예 관심 없어 한다. 즉, 명목상 한 팀임에도 불구하고 멤버들이 목표에 관심이 없거나 제각각의 기준으로 일에 임하는 것이다. 이런 콩가루 팀과 원래부터 9월을 목표로 하여 멤버들 대다수가 ‘어! 잘하면 될 거 같은데, 한 번 해보자!’라고 뭉쳐진 팀, 둘 중 어느 팀이 빠른 시간 안에 높은 품질의 제품을 내놓을 수 있을까?

해결책?

스스로 제시한 목표치에 훨씬 못미치는 관리자 한 두 명만 본보기로 잘라 버리는 것이다. 마음대로 자를 수 없다면 다른 팀에 전배를 보내거나, 다른 일로 전형시켜버리면 된다. 위화감을 느낀 관리자들은 현실적인 목표를 잡기 위해 혈안이 될 것이다.

배우려는 마음과 변화해보겠다는 의지 없어서 그렇지, 현실적인 목표를 잡는 것은 그리 어려운 일도 아니고, 관리자 혼자 머리 싸매고 미래를 예측해야 하는 일도 아니다. 위의 충격요법은 절박함을 심어주어 마음과 의지를 북돋아줄 것이다. ^^

그럴 일은 없겠지만, 현 팀에서도 한 번쯤 이런 일이 일어났으면 좋겠다. 모두에게 공감대가 형성되고 내게 그만한 권한만 주어진다면 크나큰 변화를 이끌 자신이 있는데 말이다. ^^

참고로, 연구 성격의 과제라 누구도 앞을 예측하기 어려운 경우에는 짧은 iteration 을 돌며 그때 그때의 성취를 공유하는 방법이 가장 좋다.

글을 적으면 생각이 나서 Leader vs. Manager [2] 도 업데이트 하였다.


References

  1. Bad Team Culture – Incremental Delay (wegra.org)
  2. Leader vs. Manager (wegra.org)
Bad Team Culture – As Many Tasks As Possible in Parallel (Part II)
Jan 15th, 2010 by Wegra Lee

2009년 10월에 같은 제목으로 포스팅 한 글[1]의 연장선에서 몇 마디 더 적어보고자 한다.

제목만으로도 충분히 짐작할 수 있듯, 우리 팀의 일하는 방식은 가능한 많은 일들을 가능한 한꺼번에 진행하는 것이다. 그런데 최근 상황을 보면 문제가 더욱 심각해지고 있는 것 같다.

어딘가에서 요청이 들어오면, 차후 뒷감당에 대해 충분히 고려하지 않고 일을 진행시키는 경향이 엿보인다. 얼핏 생각해도, 그리고 경험상으로도 그 일 하나의 파급는 너무 막대하여, 추후 기능 개선이나 유지보수에 심각한 영향을 미친다. 하나만 예로 들면, 지금껏 별로 신경쓰지 않았던 내부 모듈들을 우리 통제권 밖의 팀에서 사용하라고 공개하는 것이다. 앞으로는 내부 모듈에 대해서도 하위 호환성을 고려해야 한다. 이런 우려들을 이야기해도 마땅한 안은 제시지 못한다. 요즘은 과제 진행에 집요하게 관여하지 않아서이기도 하겠지만, 상대방이 원한다는 정도의 답변 정도만 받았던 것 같다.

지금껏 관련 기능을 전혀 사용해보지 않은 사람에게 단독으로 그 기능을 제공하는 모듈을 개발하게 시키기도 한다. 더 정통한 사람이 있어도 다른 일로 바쁘므로(여유가 있는 사람은 찾을 수 없다. 팀원 중 누군가가 여유가 생기면 메니저가 관리를 제대로 못하는 것이란 강박관념이 있는 것 같다. [2] – ‘쉬어가기.. 혁신을 이끌어내는 방법’ 참조) 함께 하지 못한다. 물론 둘이 하나의 태스크를 공유하는 것은 ‘가능한 많이 한꺼번에’ 정책에 위배된다. 궁금하면 물어보면 된다는 입장인데, 알아야 제대로 된 질문을 할 수 있다. 질문을 받은 측도 질문자가 어느 방향으로 가다가 어떤 관점에서 이런 질문을 하는지 그 문맥을 알지 못하면 제대로된 답변을 줄 수 없다. 우문현답을 기대하지 말자. 질문하는 측도 이 모든 걸 상대가 한 번에 이해할 수 있게 설명할 수 없다. 충분한 이해를 위해 이런저런 사족을 다 얘기하다보면 상대는 오히려 짜증을 낼 수도 있다. 자신도 다른 일로 정신 없는 입장이기 때문이고, 질문한 사람의 일이 잘 안되는 건 자신과 큰 상관이 없기 때문이기도 하다.

혼자 하느라 갑갑하고 진도도 더딘데, 주어진 시간은 항상 촉박하다. 결국 유사한 기능의 타 제품을 몇개 참고해서 비슷하게 흉내내는 수준의 작품이 나올 수 밖에 없다. 제품 전체 중 일부는 어쩔 수 없이 그럴 수 있다 치지만, 내가 보기엔 그 정도가 심하다.

우선.. 아무리 흉내를 낸다 해도, 이해할 수 있는 만큼만 구현할 수 있다. 문외한이었던 사람이 혼자 짧은 시간동안 이해할 수 있는 범위는 가장 기초적이고 정석적인 부분뿐일 것이다. 고급 기능이나 색다른 (경험이 많은 사람이라면 ‘아! 이런 방법도 있었군!’ 이라 생각할만한, 때로는 혁신적인) 형태는 쉽게 이해할 수 없다.

뿐만 아니라, 우리 제품에 가장 적합한 방식이 무엇인지도 판단하기 힘들다. 특정 기능에 대해 이견이 있을 때 우리 팀에서 가장 힘있는 근거는 ‘제네도 이렇게 해요’ 이다. 정통한 노하우나 깊은 고민 없이 이곳 저곳 유사 플랫폼, 유사 기능의 제품을을 흉내내고 있음을 잘 보여주는 대목이다. 이것마저 각 모듈마다 별다른 커뮤니케이션 없이 독자적으로 진행하니, 제품 전체를 꽤뚫는 우리만의 색깔과 혼을 찾을 수 없다. 타 제품에서의 멋진 디자인도 우리 제품에 가져오면 효과가 반감된다. 특정 모듈에서만 효과가 있을 뿐, 다른 모듈에서는 그 특성을 십분 활용하도록 고민되지 않았기 때문이다. 전혀 필요 없는 기능을 멋모르고 집어 넣는 경우도 종종 있다. 플랑켄슈타인 같다고 해야할까. 동작은 하지만 조화롭지 못하고 보기 흉한 제품. 영화에서처럼 힘이라도 세지면 좋겠으나, 현실에선 과연 어찌될지……

p.s. 요즘은 포스팅 의욕이 많이 저하되었다. 대충 쓰고 올린다. ;;;


References

  1. Bad Team Culture – As Many Tasks As Possible in Parallel (wegra.org)
  2. 쉬어가기.. 혁신을 이끌어내는 방법 (wegra.org)
Bad Team Culture – Anti-transparency
Jan 7th, 2010 by Wegra Lee

몇달 전에 프로젝트 투명성(Project Transparency)에 대한 글[1]을 올린 적이 있다. 당시에는 프로젝트에 투명성을 부여함으로써 얻을 수 있는 장점을 중심으로 설명하면서, 이를 읽은 프로젝트 팀들에서 투명성 확보를 위해 노력해주길 바라며 글을 적었다. 하지만 최근에 들어서는 관리자들이 일부러 과제를 불투명하게 만들고 있는 것이 아닌가 하는 의구심이 들기 시작했다. 아니! 감시 받는게 아니냐는 느낌을 떨치기 어려운 실무자들도 아니고, 오히려 현 상황을 정확히 알고 싶어할 듯한 관리자들이 도대체 왜? 지금부터 천천히 이야기 해보기로 하자.

나는 Rational Team Concert (RTC) [2] 라는 Application Lifecycle Management 시스템은 팀 내에 소개/교육/운영하고, 몇 차례에 걸처 그 결과를 공유한 적이 있다. 당시 (지금까지도) 우리 팀은  과제 시작 후 크고 작은 릴리스 중 단 한 번도 목표일을 지켜본 적이 없었고, 지연 기간도 들쑥날쑥 예측이 어려웠다.  릴리스가 끝나고 나서야 비로서 ‘아! 이번엔 이만큼 지연됐구나’를 알 정도였다[3].

수 개월 동안 몇 차례의 릴리스 기간을 거치면서 RTC 가 보여주는 정보는 항시 일관적이고 명확했다. ‘현 상태로는 일정을 맞출  확률은 0% 이다.’ ‘당신의 팀은 task를 끝내기도 전에 끊임없이 새로운 task들을 더 추가한다.’ ‘당신 팀의 업무 수행 능력은 이 정도이다.’ ‘따라서 목표를 다 이루려면 x 일 정도 지연될 것이다.’ ‘일정에 맞추려면 a, b, c 등의 task 를 뒤로 미뤄야 한다.’ 이런 정보들을 한 눈에 확인할 수 있는 실시간으로 그래프를 제시해준다. 대표적인 그래프인 burndown chart 의 예[4]는 아래와 같다.그림과 같이 프로젝트의 현 상황과 진행 추이, 예상 완료 시점 등을 바로 확인할 수 있는 그래프를 전체 팀은 물론 서브팀별로 만들어주고, 누구나 보고 싶으면 언제든 웹을 통해 접근할 수 있다.

(Note: 위 그림은 우리 과제에서 얻은 실제 데이터 도, RTC 가 생성한 그래프도 아니다. 이해를 돕기 위한 단순 참고용이다. 또한 burndown chart 의 개념은 RTC 라는 특정 툴에 종속적이지 않다. Agile/Scrum 쪽에서 널리 활용하는 프로젝트 관리 기법으로 툴 없이도 쉽게 만들어 활용할 수 있다. RTC는 단지 이를 지원할 뿐..)

자! 어떤 결과가 예상되는가? 실무자들 중에는 사용해보고 싶다는 사람들이 조금씩 늘어났다. 반면 관리자들 중에서 관심을 가지는 사람은  거의 전무했다(그나마 계정만 만들고 실제 사용은 안함). RTC 라는 새로운 환경에 적응하기 위해 가장 많은 변화와 노력을 기울여야 하는 실무자들이 관심을 더 보이는 이유는 무엇일까? 역으로, 프로젝트의 목표와 일정을 세우고, 우선 순위를 조정하고, 업무 부하를 관리해야 하는 관리자들은 도데체 무엇 때문에 관심 자체를 보이지 않았던 것일까?

실무자들이 쓰는 이유는 주로 이러했다.

  • 자신에게 할당된 task 들을 효율적으로 관리/진행/보고하기 위해
  • 상사의 말도 안되는 업무 요청에 대한 방어/협상 자료로 활용키 위해
    • 내가 놀고 있나요? 그 일을 하길 원한다면, 여기 쌓여 있는 현 일들 중 어떤 것을 미룰까요?

관리자들이 쓰는 이유는 알 수 없다. 쓰는 사람이 없으니 -_-a

그렇다면 관리자들이 외면하는 이유는? 물론 수많은 요인들이 복합적으로 작용했고, 사람들마나 차이도 많다. (Note: 설문조사를 한 것은 아니고.. 대부분은 이런저런 주변 정황과 평소의 대화들을 토대로 유추해본 것 뿐이다.)

  • 현 상태에 만족해서 (여러 사람과 이야기해보았는데, 우리팀에는 해당되지 않는다. 모두가 불만이다.)
  • 단지, 새로운 것을 익힐 심적/시간적 여유가 없어서 (제법 많다. 위에서 시키지 않은 일에 에너지를 할애하길 꺼려한다.)
  • 다년간 체득한 ‘나서서 좋을 것 없다’ 는 경험 때문에 (조금 있다. 정말 좋으면 남들이 써보고 전파해주겠지 하는 생각.)
  • 귀찮아서 (역시 제법 되어 보인다. 새로운 것은 익히기 보단 다소 불편하더라도 익숙한 것에 머무르려 한다. 시도조차 안해본다.)
  • 투명해지면 안된다고 생각한다. (조금 있어 보인다. 이 글의 주제이므로 바로 뒤에 별도로 설명하겠다.)
  • 기타.. (여러가지 더 떠오르지만 주제와 큰 관련이 없으므로 생략)

투명해지면 안된다고 생각하는 사람들은 상위 지배층과 외부 사람들(stakeholder, customer 등)을 대하는 사람들일 경우가 많다. 이들에게 투명한 과제가 장점을 발휘하려면, 그 과제가 정말 잘 진행되고 있어야 한다는 전제가 깔린다. 이러저러한 문제들이 산적한 상태에서 잘못 공개되면 지원이 줄어들고 대기 수요가 빠져나간다. 이들에게는 안좋은 것을 숨기고 희망찬 메시지만 전달해주어야 한다. 단번에 ‘3달쯤 지연될 겁니다’라고 얘기하면 ‘그렇게까지는 못 기다립니다’라고 하지만, ‘1주일만 더 기다려주세요’를 여러차례 반복하면 ‘이왕 기다린 거, 이번엔 꼭 된다니깐 조금만 더 기다려보지.  등 돌리기도 늦은 것 같고..’ 하는 반응을 이끌어낼 수 있다.

위와 같은 이유로 의도적으로 투명성을 제한하려는 사람들이 있다고 믿는 근거는.. ‘팀 리더로써 가장 중요한 것은 프로젝트를 부러뜨리지 않는 것’ 이라거나, ‘이런 건 누구누구가 알면 안되는데’ 라며 정보 공개를 불편해하는 발언 등을 하는 윗 사람들을 종종 보았기 때문이다. 프로젝트를 계속 유지하는 것은 물론 중요하다. 하지만 외부에 알려진 것 대비 심각하게 안좋은 상황에서도 무리하게 정보를 숨기는 것은 과연 어떨까? 상황을 만회하기 위해 뒤에서 열심히 고생하는 개발자들과 이를 믿고 투자하는 사람, 제품을 기다리는 고객 모두에게 악영향을 미치게 된다. 투자자가 개발팀이 속한 회사 자체라면(내부 프로젝트), 그 팀은 프로젝트를 유지할 수록 회사의 경쟁력을 떨어뜨리게 된다.

다른 관점에서도 불투명한 과제가 (부정적인 의미에서) 도움이 될 때가 있다. 우리 팀의 모습을 앞서의 그림에 맞춰 비유해보면, 윗사람은 day 10 에 ‘자! 내일이 드디어 릴리스 날입니다. 오늘 저녁까지 남은 일들을 모두 완료해 주시고, 검증이 완료될 때까지 자리를 지켜주세요.’ 라고 당당히 요구하고, 또 그것이 개발자들에게 먹힌다. ‘얼마나 걸릴까요?’ 라는 질문은 없다. ‘반드시 끝내세요.’ 라는 요청이 전부이다. 실무자들은 불만이 있어도 드러내놓고 표출하지도 못하고, 밤 늦게나 자정을 넘어서까지 일을 한다. 당연히 기적은 일어나지 않는다. 만약 위와 같은 정보가 다 공개되어 있다면? 윗사람이 앞서와 같은 요구 자체도 할 수 없겠지만, 만약 그런 요구를 한다면 ‘당신은 눈이 없소?’ 라고 반박해도 할 말이 없을 것이다. 즉 과제가 투명해지면 지금까지와 같은 무리한 명령을 내릴 수 없다.

이상의 이유들로, 수단 방법을 가리지 않고 과제를 살리려 한다거나 전통적(?) 지배체제를 유지하고자 한다면, 프로젝트가 투명해지는 것은 커다란 위험요소가 될 수 있다. 이에 해당하는 사람들은 의도적으로 진행상태를 숨길 수 있다.

만약 이런 현상이 정말로 의도적으로 이루어진 것이라면 개선하기란 정말 쉽지 않다. 앞서 언급했듯, 팀을 이렇게 만든 사람들은 대부분 프로젝트 방향을 좌지우지할 수 있는 힘있는 사람들이기 때문이다. 자료를 아무리 제시해도, 개선의 움직임이 보이긴 커녕 거들떠도 보지 않는다면 실무자들도 제풀에 지쳐 변화를 포기한다. 힘있는 자들의 마인드가 바뀌지 않으면 조직의 문화를 바꾸는 것은 거의 불가능하다.

정리: 관리자들 대부분이 이와 같다는 의미는 절대 아니지만, 그 중 일부가 이런 생각을 어느 정도 가지고 있는 것은 분명한 것 같다. 따지고 보면 비단 특정 팀이나 회사, 소프트웨어 개발에만 국한된 현상도 아니다. 정보를 통제하는 언론, 기업의 홍보 부서, 조직의 대변인, 심지어 모든 사람 개개인이 외부로부터 자신을 지키기 위해 어느 정도는 이런 성향을 가지고 있다. 하지만 숨기는 대상에 외부 경쟁자들뿐 아니라 자신들을 믿고 따르는 조직원들까지 포함시켜 그들에게까지 희생을 강요하는 상황에 이른다면 문제는 심각하다. 이런 조직에서 과연 얼마나 많은 사람들이 진심으로 자신의 역량을 모두 쏟아 부어줄까? 하나의 팀이라고 말하기조차 부끄럽다.


References

  1. Project transparency (프로젝트 투명성) (wegra.org)
  2. Rational Team Concert (IBM Rational)
  3. Bad Team Culture – Incremental Delay (wegra.org)
  4. Burndown chart (wikipedia)
Bad Team Culture – You Don’t Need a Head. One is Enough.
Dec 11th, 2009 by Wegra Lee

내가 최근 과제를 진행하면서 가장 불만이 많았던 문화 중 하나로, 간단히 이야기하면 소수의 누군가가 생각해서 가이드를 만들고 다수의 사람들에게 기계적으로 적용하는 문화이다. 얼핏 생각에 괜찮은 어프로치로 생각될 수 있고, 심지어 권장되는 상황도 많다. 하지만 잘못 남발하면 부작용이 큼을 몸소 느꼈기에 주의하자는 차원에서 정리해보았다.

시작..

우리 팀은 ‘아키텍트(Architect)’라는 멋진 이름의 조직을 갖추고 있다. 이름에 걸맞게 팀내 주요 아키텍쳐적 이슈들을 논의하고 해결안을 찾아 지침을 내려준다. 팀원들도 나름 팀내에서 선별된 사람들로 구성되어 있다. 여기까지만 보면 문제가 있기는 커녕 모범적이라 할 수 있다.

하지만 아키텍트 그룹이 내놓은 가이드의 상당수가 많은 헛점을 보여왔다. 지침대로 적용을 하려던 개발자들로부터 많은 공격을 받아 갈팡질팡하고 번복되기 일쑤였다. 아키텍트들의 결정에 대한 신뢰가 점점 떨어졌고, 개발자들 사이에서는 ‘최대한 늦게 적용하는게 좋다’ 라는 말까지 공공연히 오고가기도 했다.

무엇이 문제였을까? 단순히 아키텍트들의 실력이 부족해서는 아니었다. 이런 현상이 발생할 수 밖에 없었던 상황을 나름 조명해보았다.

팀 환경/문화

팀의 아키텍트 그룹이 제 역할을 하지 못하게 된 데에는 수많은 문제들이 복합적으로 작용한 것으로 보인다. 팀의 전반적인 상황은 지금까지 기술되었던 (그리고 앞으로 더 추가될) 모든 Bad Team Culture 시리즈[1]의 종합 선물세트라 보면 된다. 빠른 진행을 위해 간략히 요점을 정리해보았다.

우리 팀은 거의 항상 무리한 일정에 맞추기 위해 과속 주행을 해왔다. 산적한 모든 일들이 최상의 시나리오대로 완료되어야만 한다. 그 시나리오도 실무자가 아닌 윗선에서 정한 deadline 에 기반한다. 팀 창설 이래 단 한 번도 deadline 에 맞춰본 역사가 없음에도 항시 같은 패턴이다.

거의 모든 아키텍트들의 주 업무는 사실 관리다. 이들은 대부분 서브팀의 리더들로, 자신의 서브팀 업무 처리로도 이미 숨이 벅차다. 더구나 이들은 개발 실무를 담당할 여력도 없다. 큰 그림의 아키텍처나 팀원들이 제기한 구현 상의 이슈에 대해 의사 결정은 참여하지만 직접 구현에 참여하거나 팀원들이 작성한 소스를 살펴보진 못한다.

개발자들 역시 발등에 떨어진 업무들로 다른 논의에 참여할 마음의 여유를 갖지 못한다. 구현 하나만으로도 일정이 빠듯한데, 각종 요청들이 ‘가능한 빨리’ 라는 수식어와 함께 동시 다발적으로 날아온다. 코드 리뷰나 리펙토링 같은 사치스런 용어는 책속에서나 볼 수 있을 뿐이다.

다수 모듈에 적용되는 공통 가이드에 대해서도 깊이 있는 논의와 충분한 공유 대신, ‘일주일 내로 모두 적용해!’ 와 같은 명령이 떨어진다. 가이드 자체도 결함 없는 완벽한 것이라는 이상적 결과를 기준으로 한다. 보완책으로 일부 모듈을 대표로 적용해보기도 하지만 서브팀 내에서의 커뮤니케이션도 부족한 상황에서 도메인이 다른 특정 모듈이 전체를 대표하리란 기대는 품지 않는 것이 좋다.

부작용과 악영향

결과는 아주 부정적이다.

‘아키텍트 = 관리자’ 이므로 논의가 계속 산으로 간다. 한국적 정서상의 문제도 있겠지만, 회의의 비효율성을 불평하면서도 둘을 분리하지 못한다. 어떤 회의에서건 두 이슈가 마구 섞여 논의되므로, 소수의 전담 아키텍트(non-관리자)는 진행 상황조차 파악하기 어려울 때도 많다. 예를 들어, 잠시 묻혀 있던 이슈를 결론짓기 위해 꺼내놓으면 ‘아! 그거 지난번 관리회의에서 x로 결정해서 a, b, c 가 진행중이야.’ 라는 이야기를 아무렇지도 않게 들려준다. 그러면서 전담 아키텍트이니 아크 이슈들을 추적 조율하라는 모순적인 요구를 한다.

팀 전체의 상황을 고루 파악하고 있는 아키텍트가 없다. 다른 서브팀의 상황까지 신경쓸 여유가 없으므로, 아키텍트 회의가 소집되어도 자신의 팀과 직접적으로 관련되어있지 않다면 잘 참석하지 않는다. 충분한 사전 조사와 깊은 논의 없이, 모인 사람만으로 쉽게쉽게 결론을 내는 경향이 생겨 추후 번복의 여지가 많다. 일부 모듈을 대표로 선정해 해결책을 검증해 보더라도, 다른 모듈에는 대대적 칼질을 요하는 경우가 많았고, 가끔은 적용 과정에서 지침을 수정해야만 하는 counter example 이 나오기도 한다.

General 아키텍트의 고뇌.. 에피소드

이러한 상황에서도 어쩔 수 없이 아키텍트로써의 일을 수행하며 개인적으로 많은 고충들을 겪었다. 다른 아키텍트들 대부분은 자신의 분야에 대해서만 직접적인 책임을 지는데 반해, 나는 어지간한 이슈들에는 다 끼어 들어가야 했다. 즉 general 아키텍트였고.. 팀에 단 한 명 뿐이었다.

그러는 와중, 여러 모듈에 걸친 가이드를 만들어야 하는 업무들이 자주 떨어졌다. 나름 최선의 안을 내보려 노력하지만, 결정 과정에서는 언제나 trade off 가 발생한다. 특히나 논의 단계에서의 실무자 참여를 배제하는 상황에서는 수많은 추측과 가정들 위에서 이리저리 저울질을 하게된다. 중간중간 상황을 공지하지만 관심을 주는 사람은 거의 없다. 관심 좀 가져달라고 애원을 해야 한 두 명 답변을 준다. 실무자들을 참여시켜달라는 요청에는 그들은 시급한 다른 일로 시간이 없다는 답변만이 메아리칠 뿐이다.

어찌저찌 가이드를 만들어 공지하지만, 본격적인 일은 이 때부터다. 가이드를 만들면 매니저는 N 일 내로 가이드를 적용하라고 공지한다. 그제서야 드디어 실무자들의 피드백들이 쏟아지기 시작한다. 질문이 터져나오고, 문제점을 지적하고, 나아가 대안을 제시하기도 한다. 개발자들의 성향과 경험이 다양한 만큼 다양한 안들이 나올 수 있다. 대부분은 사전 고려된 안들이기어, 그들들에게 trade off 와 이러저런 상황 요소를 열심히 설명한다. 결국 논리와 양해로 설득을 한다 치더라도 가이드와는 다른 이야기들이 오고가기 시작하면 개발자들은 우왕좌왕 하기 시작하고, 정리된 하나의 안으로 재공지될 때까지 자신의 모듈에 적용하는 것을 미루려 한다. 정리되는듯 싶다가도, 늦게서야 적용하는 모듈 때문에 또 한바탕 소란이 벌어지기도 한다.

묵묵히 가이드를 잘 따르는 것 역시 그리 좋지 않다. 대부분의 가이드는 이상 추구보다는 현실 수용적이다. 과제 초기라면 누가봐도 깔끔한 가이드를 제시하며 떳떳해할 수 있겠지만 현실은 너무도 다르다. 수년에 걸쳐 이미 수십만 라인의 코드를 만들어놨고, 개발자들을 릴리즈 일정에 쫓기고, 다수의 레거시 모듈들을 버무려야 하는 상황인 것이다. 그렇다면 변경량이 적고 에러 유발 가능성이 적으면서 그럭저럭 봐줄만한 절충안을 내놓을 수 밖에 없다. (싹 뜯어 고치자 하면 기획팀/매니저들이 동의하지 않는다.) 내가 봐도 부끄러운 가이드를 던져주면서 사람들이 뭐라고 생각할 지 걱정한 적도 있다. 실력있는 사람들은 보자마자 훨씬 좋은 방법들이 머릿속에 떠올릴 수 있었을 것이고, 그렇지 않은 사람들에겐 그닥 좋지 않은 가이드를 익히게 만든 것이다. 결과로 만들어진 가이드 자체는 부족하더라도, 그 결론까지의 여러 대안들을 연구/분석하고 장단점을 저울질하는 과정을 함께 한다면 모두의 역량 향상에 큰 도움이 됐을 것이지만, 안타깝게도 그럴 시간은 주어지지 않았다.

그나마 현 상황을 함께 겪고 있는 지금의 동료들은 부족함을 이해해 주겠지만, 나중에 합류한 사람들은 어떨까? 결과물만 보고 전임자의 무능함을 욕해도 딱히 비난할 수도 없다. 그리고 그 제품이 세상에 공개된다면? 이력에 적어 넣기도 부끄럽고, 공백기로 둘 수도 없는 계륵 경력이 되어버린다.

가정 자체가 틀어질 때도 있다. 한 번은 개발자들이 도메인에 익숙하지 않고 영향 범위가 제법 크다는 가정으로 2~3주에 걸쳐 좀 억지스러운 가이드를 만들었다. 첫 설명회에서 모두들 ‘우린 그런 문제 없어.’, ‘해당 사항이 거의 없으니 조금만 신경쓰면 충분히 할 수 있을 거 같아.’ 라는 반응들이 것이다. 그 자리에서 바로 정석적인 방식으로 진행키로 결정하고 그에 맞게 약간의 보강 설명을 해주는 것으로 설명회를 마무리했다. 2~3주의 시간을 쓸데 없이 허비한 꼴이 되었다. ‘사전 조사해서 상황을 파악해달라’ 는 초창기 요청에는 한 두 모듈만 피드백을 주었고, 그래서  ’모듈별로 실무자들을 한 명씩만 배정해달라’는 몇 차례의 요청 역시 묵살되었던 케이스였다.

아키텍트 시절 초기에는 의욕을 불태워봤지만, 나의 개선 요구들이 매번 거절당하면서 점차 회의를 느끼게 되었다.

다시 돌아가..

이런 현상의 더 근본적인 원인은 지도층의 마인드 때문이 아닐까 싶다. 리더가 아닌 매니저(관리자) 중심[2]의 팀이라, 중장기 비전을 위한 팀원들의 역량 향상보다는 눈앞의 단기 목표 달성을 최우선시한다. 심지어 팀원 역량 개발은 관리자의 롤에서 배제시키기도 한다. 같은 맥락에서, 소수의 핵심 멤버가 의사를 결정하고 그 외의 다수는 기계적으로 구현만 하면 된다고 얘기하는 것도 가끔 들을 수 있었다.

물론 윗사람들 모두가 이렇지는 않다. 어쩌면 대부분은 단지 정신없는 일정 압박에 어쩔 수 없이 끌려가고 있을 수도 있다. 하지만 일부는 분명 위와 같이 생각하고 있고, 그들의 힘이 강하게 작용하고 있다.

100% 틀렸다고 얘기하는 것도 역시 아니다. 상황에 따라선 이런 어프로치가 도움이 될 때도 있다. 단발성 프로젝트라던가, 초단기로 1차 결과물을 내놓아야 한다던가, 너무나도 자기 주장이 강한 독불장군들이 모인 팀이라던가, 명확한 스팩/설계의 외주 과제라던가, 누구나 인정하는 천제 아키텍트가 이끌고 있다던가 등 다양한 상황들이 떠오른다. 심지어 커뮤니케이션만 잘 이루어진다면 보통의 팀에서도 크게 문제될 것이 없다. 하지만 어설프게 머리를 정하고 권한을 주기에 앞서 팀의 모습을 세심히 살펴보도록 하자.

그리고 앞으로 몇 년 몇 십년을 이 분야에 종사해야 할 지 모르는데 나의 미래에는 아무런 관심도 없는 상사를 만났다고 생각해보자. 변화의 여지가 보이지 않는다면, 오래 함께하고픈 타입은 아닐 것이다. 소프트웨어는 사람이 머리로 만드는 것임을 잊지 않기를 바란다. 지금의 아주 일부만이라도 미래를 위해 투자하자. 팀원을 키우라는 이야기다.

p.s. 이 주제는 정말 오랫동안 수정에 수정을 거듭했다. 아무리 고치고 고쳐봐도 내가 진정 하고픈 말을 정확하고 효과적으로 표현하지 못하겠다. 여전히 맘에 들지 않는 상태이지만.. 언제까지고 고치고만 있는 것도 지겨워서 포스팅한다.


References

  1. Series of Bad Team Cultures (wegra.org)
  2. Leader vs. Manager (wegra.org)
Bad Team Culture – Lessons Learned as a Last Will
Nov 20th, 2009 by Wegra Lee

Lessons Learned

그간 이 팀 저 팀에서 발간(?)한 수많은 소위 Lessons Learned 라는 것을 봐온바 있다. 과제를 진행하면서 느끼고 배운 것을 정리하여 다음 과제 진행시 참고하거나 진행중인 다른 과제에서 참고할 만한 좋은 정보들이 적혀 있다. 자신이 걸어온 길을 되돌아보는 것은 좋은 경험이고, 그 결과를 정리해 놓는 것 역시 권장할 만한 일이다.

문제는 그 시점이 항상 과제가 뿌러지는 등 완전히 종료되는 시점에 일어난다는 것이다. 많은 경우 팀 자체가 뿔뿔이 흩어지거나 축소된다. 다음에 진행할 과제도 이전 과제와 성격이 달라지기 쉽다. 얻은 것이 있어도 그것을 적용해볼 상황이 못되는 것이다.

과연 이전 과제에서 깨우친 것들이 새로운 과제 새로운 팀에서 제대로 먹혀들 수 있을까? 시행착오를 거쳐보지 않은 새 팀 멤버들이 가슴 깊이 공감하고 따라줄 것인가? 배경이 다른 사람들에게도 똑같은 처방이 여전히 유효할까? 내가 얻은 결론은 정말 더 나은 개선책인가? 아니면 단지 ‘다음엔 이렇게 해봐야지’ 정도인가? 검증되지 않았고 경험해보지도 못한 방법을 새 팀 새 과제에서 시험해볼 용기는 있는가?

위와 같은 고민들도 어느 정도 영향력이 있는 윗사람들에게 해당하는 것이지, 중간 이하의 힘없는 관리자나 실무자들은 새로운 리더가 시키는데로 그냥 따를 수 밖에 없는 것이 또 현실이다.

결국 이런 식의 Lessons Learned 는 읽을 거리나 유언장 이상의 실질적 가치를 갖지 못한다.

Retrospective

Retrospective 는 Lessons Learned 의 Agile 식 표현 정도로 생각하면 좋을 것이다. 하지만 많은 차이를 안고 있음을 잊어서는 안된다. Agile 이 강조하는 iterative, responsive, incremental 같은 속성을 Lessons Learned 에 부여해보자. 짧은 간격으로 주기적으로 회고하며(iterative), 현 시점에 필요한 이슈에 대한 개선안 만들어 다음 개발 주기에 적용해보아 좋은 것을 취하고 잘못된 것은 버리거나 다른 안을 찾아본다(responsive). 팀은 과제가 진행될 수록 조금씩 조금씩 더 나은 방향으로 발전해 간다(incremental).

이미 끝나버린 과거에 대한 무책임한 회상록이 아닌, 지금 살아서 꿈틀대는 과제에 대한 진중한 고민을 경험해볼 수 있다. 바로 그 시점에 팀원들 스스로가 개선이 필요하다고 느끼는 이슈들이 다뤄지고 합의된 개선책을 시행한다는 점에서 참여율이 높아지고, 높은 성공 확률은 덤으로 얻게된다. 혹 실패한다면 바로 다음 회고 때 그 원인과 또 다른 개선안을 찾게될 것이다. 시행착오를 통해 더 많은 경험을 얻게되고, 미처 고려하지 못했던 요소들이 있음을 깨닫게 된다. 넓고 세심해진 시야는 다른 문제에 직면했을 때도 좀 더 빠르게 더 효과적인 개선안을 찾게 도와준다. 반면 Lessons Learned 방식에서는 실패한 처음 안만이 남겨질 가능성이 농후하다. 회고가 거듭될 수록 팀의 생산성이 향상됨을 느낄 수 있을 것이다.

Barriers and Ways to Overcome

다 좋고 완벽해 보이는 회고도 무턱대고 적용하려 하면 말처럼 쉽지 않음을 깨닫게 된다. 내가 지금까지 발견한 중요 요인은 3 가지 이다.

첫째, 일정에 쫓겨서 회고에 할애할 시간적 여유가 없다.

이런 답변을 많이 들었는데, 시간적 여유가 없는 것이 아니라 회고의 효과에 대한 믿음이 부족하거나 새로운 것을 시도하는 것을 꺼리는 보수적 마인드의 팀일 가능성이 높다. 이런 경우엔 분위기 조성을 위한 물밑 작업부터 시작해야 한다. 말이 통하고 깨어있는 사람들이라면 직접적인 대화로 돌파할 수 있겠다. 뜻이 맞는 팀원이 소수라도 존재한다면 솔선수범해서 더 나아지는 모습을 직접 보여줄 수도 있을 것이다. 상황이 다양한 만큼 방법도 다양할 터이니 숙고해서 도전해보자. 단, 상대를 공격하는 것은 확실한 실패 방법이니 절대 피하길 바란다.

참고로 회고에 필요한 시간은 보통 2~4주에 1시간 정도면 충분하다. 물론 처음 시작할 때는 좀 더 많은 시간이 필요할 것이지만 두세번만 해보면 익숙해지고 소요 시간도 줄어든다.

둘째, 팀원들의 참여가 저조하다.

기껏 회고를 해보자는 허락을 받았는데, 정작 모인 사람들이 꿀먹은 벙어리 마냥 침묵으로 일관한다. 회고를 처음 시도하는 조직에서는 대부분 겪게 되는 인기 코스일 것이다. 그들이 침묵하는데에는 여러 가지 이유가 있을 것이다. 무슨 얘길 하면 되는거지? 예제 같은 거 없나? 얘기한다고 정말 개선해 주나? 말 꺼내면 나보고 꺼낸 사람이 하라고 하겠지? 불평하면 괜시리 밉보일 거야.. 등등.

이런 우려를 해소하고 적극적인 참여를 유도하려면 맛을 보여줘야 한다. 사소한 것부터라도 정말 개선되는 모습을 보여주는 것이다. 첫 회의에서 아무런 아이디어가 없을 것을 대비해 문제점과 개선안까지 몇 가지를 준비해둔다. 뜻이 맞는 사람이 한 명이라도 있다면 역할극을 해보는 것도 좋다. 혼자 북치고 장구치는 것보다 훨씬 효과적으로 분위기를 이끌어 갈 수 있을 것이다. 그리고 개선안이 없더라도 불편한 사항을 자유롭게 이야기하도록 하고, 그에 대해 반박을 하거나 방어적인 모습을 보여서는 안된다. Brain storming 방식으로  문제들을 나열하고 중요도와 시급성, 파급 효과 등을 생각해 이슈를 선별해서 개선안을 모색해보자.

셋째, 팀에 부여된 권한이 너무 작다.

열심히 분위기 잡고 멋진 개선안들도 마련했다. 그런데 그 개선안들이 우리힘으로 할 수 있는 일들이 아니라면? 운영부서는 돈 들어가는 일은 절대 허락을 안해주고, 보안 부서는 개발자 편의성은 절대악으로 규정짓고, 프로세스 팀은 표준 프로세스에 어긋난 어떠한 시도도 용납하지 않고, 기획/마케팅 부서는 자신들이 바라는 모든 기능을 역시 자신들이 정한 시한까지 완수해야 한다고 못박고, 책상 앞에 앉아 있는 시간과 개발진도는 정비례한다고 철석같이 믿고 있는 임원이 군림하고 있다면?

회고는 불평불만을 토로하고 남들 뒷담화가 남무하는 장이 되던가, 소꼽장난하듯 사소한 문제들만 다뤄지는 비중없는 시간으로 전락할 것이다. 물론 작은 개선들이 차곡히 쌓여 큰 도움을 줄 수도 있을 것이고, 공동의 적을 향한 불평불만과 뒷담화는 팀원들을 단합시켜주는 효과도 있기는 하다. ^^

모든 것을 통틀어 가장 큰 장벽으로, 딱히 뾰족한 해결책도 없다. 때마침 임원 인사가 단행되어 깨어 있는 사람으로 교체되던가, 무슨 바람이 불어서 아주 권위 있는 컨설턴트의 도움을 받을 수 있다면 큰 힘이 될 것이다. 하지만 모두 다 운에 기대는 것이고.. 리더나 팀원들이 몸소 나서서 설득하고 싸우는 적극적 쟁취 방법도 물론 있다. 하지만 생태계에서 식물 급으로 취급되는 힘없는 개발팀이 얻어낼 수 있는 것은 많지 않을 것이다.


References

  1. Retrospectives by RTC dev. teams
  2. Agile Retrospective – Lessons Learned
Bad Team Culture – Incremental Delay
Nov 19th, 2009 by Wegra Lee

Incremental Delay 란 아주 짧은 간격으로 릴리스 날짜를 조금씩 미루는 행태를 뜻한다. 일단 릴리스를 시도해보고, 안되면 조금  (보통 1~3일) 미룬 후 다시 시도한다. 역시 잘 안되면 또 다시 미룬 후 시도한다. 이렇게 릴리스가 될 때까지 무한 반복하는 릴리스 관리 방식이다.

사례

내가 경험해본 최악의 상황은 이러했다. 원래의 릴리스 목표일은 금요일이다. 금요일이 되어서 시도를 해보았으나, 도저히 릴리스할 만큼의 품질이 나오지 않는다. 그래서 월요일로 목표를 바꾼다. 월요일에도 역시 원하는 품질에 도달하지 못했다. 다음날 다시 한 번 시도해보기로 한다. 마찬가지로 실패했다. 이와 늦은거 금요일로 다시 미룬다. 금요일도 여전히 실패.. 토요일.. 월요일.. 수요일.. 금요일.. 월요일.. 화요일.. 토요일.. ..

이런 식으로 가장 길게는 6주간 계속 릴리스만 한 경우도 있었다. 릴리스가 이렇게 한달 가량 지연되면 당연히 다음 릴리스에 일정에 지장을 주게 된다. 새로운 기능을 추가하는데 필요한 최소 시간이 있으므로 차례차례로 전체 일정이 연기된다. 하지만 다음 릴리스 시점에 와서도 크게 다르지 않다. 역시 또 몇 주의 지연이 발생한다. 그래서 ‘릴리스가 끝나면 (다음) 릴리스 일정이 바뀐다’, ‘릴리스가 되는 날이 릴리스 날이다 (역: 릴리스 날에 릴리스를 한다)’ 라는 말까지 하게 되었다.

위의 경우는 continuous integration (CI) 도 도입되지 않은 열악한 환경에서의 상황이었고(도입을 요구했지만 관심 갖는 사람이 없었음), 그 후 CI 가 도입되면서 상황은 많이 호전되었다. 하지만 여전히 제 때 릴리스 되는 경우는 전무했고.. 심한 경우 3주가 밀리기도 했다. 금요일 릴리스를 (주말을 열심히 일해서) 그 다음주 월요일 저녁에 할 수 있다면 대단히 이례적인 성공이 케이스가 될 정도였다.

악효과

Incremental Delay 가 팀 문화처럼 정착되면서 다음과 같은 부작용들이 나타나기 시작했다.

팀원들은 윗선에서 정한 릴리스 날짜(deadline)에 큰 의미를 부여하지 않게 되었다. 한 차례도 성공적으로 릴리스한 경험이 없으며, 릴리스가 연기되어도 아무 일도 발생하지 않음이 학습되었기 때문이다. 꼭 지켜져야하는 중요한 릴리스라 강조해도 마음속으론 ‘어짜피 안될걸..’이란 생각을 자연스레 하게된다.

서브팀별 개발 일정이 꼬이기 시작한다. 팀별로 이터레이션(iteration) 주어진 일의 양이나 생산성, 예측 정확성 등의 차이가 생겨 발생하는 현상으로.. 일부 팀은 일정에 맞춰 일을 끝내놓고 다음 릴리스를 위해 할 일을 준비하고 있다. 하지만 곧 될 듯 말 듯 하면서 릴리스는 기약없이 지연된다. 처음엔 2~3일 후면 될 거라 기대하고 잠시 쉬던 것이 하루 이틀씩 밀리면서 결국 이 주 삼 주 동안 제대로 진행할 수 없게 된다. 이런 경험이 잦아지면서 일부에선 중간중간에 변경된 코드를 밀어 넣는다. 다음 릴리스를 위한 개발 코드 브랜치와 (지연중인) 릴리스 브랜치 간에 코드 격차가 심해져, 개발 브랜치에서 해결된 문제를 릴리스 브랜치에 반영하는데 한참을 씨름하기도 한다.

윗선도 계속되는 릴리스 관련회의로 시간을 낭비하기는 마찬가지다. 현황을 파악하고, 얼마나 더 지연시킬 지 정하고, 지연이 미치는 영향을 분석하고, 이왕 지연된 것 미리 구현된 간단한 기능을 포함시킬 지 논의하고.. 자료를 준비해 더 윗선이나 마케팅, 기획, 운영(예산) 팀 등과도 계속 조율을 해야 한다.
야근과 주말 근무가 늘어난다. 일주일 단위로만 지연시켜도 호흡 조절과 재충전이 가능하겠으나, 지연 단위가 보통 1~3일 정도이고, 특히나 금요일 일정은 반드시 토/일/월로 지연된다.

고찰

무엇하나 좋을 게 없는 이런 비합리적 문화가 왜 개선되지 않는 것일까?

이런 현상이 반복되고 있음은 윗선에서 과제가 어떻게 돌아가고 있는지 전혀 파악하지 못하고 있다는 확실한 반증이다. 릴리스를 하기 위해 해야할 일이 얼마만큼 남아 있는지 도통 감이 없다. 개발자들의 생산성과 문제 해결능력에 대한 어떠한 정량적/경험적 데이터도 갖춰져 있지 못하다. 개발자 각각이 지금 무슨 일들로 얼만큼의 로드가 걸려있는지도 잘 파악이 안되고 있다. 해결해야할 문제들이 얼마만큼의 노력이 들어가야 하는지도 역시 감이 없다. 아직 드러나지 않은 문제들은 또 얼마나 될 지 역시 예상하기 어렵다. 결국 위에서 할 수 있는 말은 보통 ‘언제까지 이 문제들을 해결해라’ 정도에서 그친다.

제품의 설계나 코드의 품질이 크게 떨어지거나, 다뤄야할 대상을 개발자들의 완벽하게 이해하지 못하고 있을 경우 사태는 더 심각해진다. 분석하고 수정하는데 필요한 시간을 예측하기 힘들고, 수정시 부작용(side-effect)이 따를 가능성이 높다. 동작 여부만이 아니라 코드의 품질을 챙기는 개발 문화를 조성해야 하고, 서로 간의 잦은 리뷰를 통해 다른 팀원들과 개발 패턴, 노하우 등을 공유해야 한다.

관련 개발팀간 커뮤니케이션 효율성도 큰 영향을 미친다. 심한 경우는 핵심 모듈을 전혀 다른 팀에서 관리하고 있고, 우리 과제를 지원하는 것은 그 팀의 최우선 역할이 아닐 때이다(실제로 자주 접해보았다). 유관 팀들이 지리적으로 멀리 떨어져 있고, 원격지에선 문제를 재현하기 어려울 때도 마찬가지.. 어떠한 경우건 커뮤니케이션 지연은 일의 진행 속도를 현저히 떨어뜨리는 주요 원인이 된다. 과제를 기획하고 팀을 조직할 때 그 과제와 팀이 적시에 충분한 지원을 받을 수 있도록 고려해야 한다. 필요하다면 조직 구성을 바꿔 같은 명령 계통 내로 흡수할 필요도 있다.

미흡한 인프라에 의한 불확실성도 크다. 기본적인 테스트 자동화 시스템도 갖추지 못해 매번 개발자들이 수동으로 테스트하는 것도 많이 보아왔다. 나름 도입한 continuous integration 이 기껏 빌드만 해주고 기본적인 unit test 도 수행하지 못한는 경우를 상상해보자. 내가 경험한 어떤 팀은 unit test 를 CI 에 통합해달라는 요청을 한 지 1년이 넘도록 반영하지 못했다. 다른 자동화는 물론 말할 것도 없었다. 과제 규모가 커질 수록 그에 걸맞게 인프라 효율성에도 투자를 해야한다. 발등에 떨어진 일정에만 쫒겨 제때 투자를 못하면 일을 해야할 정작 개발자들의 시간을 어먼 곳에 낭비하게 만든다.

개발 문화와 생산성 향상, 효율성, 팀웍에 대한 인식이 부족하다. 위에서 가장 중요시 하는 것은 언제 릴리스 되는가이다. 어떤 때는 그것 외에는 전혀 관심이 없는 것 같다는 인상을 받곤 한다. 일벌레인 사람들이 지배하는 조직에서 더 심한 경향이 있는 것 같다. 종종 일찍 퇴근하고 싶어하는 사람을 이해하지 못하는 듯한 발언을 듣기도 한다. 아무래도 사람은 자신의 기준에서 남을 이해하는 성향이 있으니, 어찌보면 당연한 것일 수 있다. 하지만 사람(뿐 아니라 모든 생물)은 기계와 달리 충분한 휴식 없이는 높은 집중력과 생산성을 유지할 수 없음을 주지시켜야 한다.

Bad Team Culture – Show Me The Magic
Nov 5th, 2009 by Wegra Lee

Bad Team Culture 시리즈를 더 진행하기 앞서 이 주제를 짚고 넘어가야 할 것 같다. ‘너라고 뾰족한 수 있어?’, ‘그게 말처럼 쉽냐?’ 와 같은 공격에 대한 내 나름의 답변이 될 것이다.

팀의 문제점을 지적하고 개선안을 제시했을 때 우리가 기대할 수 있는 가장 흔한 반응들은 이렇다.

  • 그게 아니라 말이지.. (뜨끔하여 방어적 태도를 보임.)
  • 이런 경우엔 그 개선안도 단점이 있잖아? (꼬투리 잡기.)
  • 미안하지만 상황이 어쩔 수 없네. (내 권한 밖 & 나도 피해자.)
  • 좋은 의견이지만 더 급한 이슈들이 많아. 나중에 생각해보자. (과제가 종료되기 전에는 절대 시간이 나지 않음.)
  • 괜찮은 거 같군. 자네가 인프라 세팅부터 이것저것 시도해본 후 가이드를 주게. (난 아무것도 하지 않겠네.) 단, 하던 일에 지장을 주면 안되겠지? (야근을 하건 밤을 새건, 자네 개인 시간을 활용해서 하게나.)
  • 그래도 xxx 보다는 낫잖아(혹은, 남들도 다 그렇게 해). 긍적적으로 생각해. (자기 위안. 현실 안주.)
  • 우리만 바꾼다고 되는게 아니야. 남들도 다 한다고 하면 나도 동참하자. (내가 총대 멜 필요는 없겠지.)
  • 무관심. (신경쓸 겨를 없음. Or 제 또 저러네. 일이나 열심히 해라.)

너무 자주, 그리고 공격적인 어투로 문제를 제기하면 이런 반응도 얻을 수 있다.

  • 자넨 매사에 너무 부정적이야.
  • 팀내 위화감 조성하지 말자. 팀웍을 깨는 짓이야.

위 답변들의 공통점은 무엇일까? 그렇다!! 하나하나 나름의 일리가 있다는 것이다. 이렇게 갖가지 저마다의 견고한 방어책들로 무장한 사람들 모두를 단숨에 사로잡을 수 있는 화려하고 강력한 마법을 부리지 못하는한 팀은 복지부동.. 똑같은 불합리함과 불만들을 그대로 간직한 체 그냥저냥 또 시간이 흘러간다.

종종 제안이 받아들여지는 경우가 있다. 대부분 아래와 같은 케이스들이다.

  • 해결하려는 문제가 국지적이다. (일부 사람만 적응하면 되고, 변경량이 적다.)
  • 기존의 형태를 그대로 유지한 체 효율성만 높인다. (여전히 기존 틀 안에 있다.)
  • 일부 프로세스를 자동화한다. (난 가만히 있고, 할 일은 줄어든다.)
  • 정말 개인 시간 희생해서 인프라부터 친절한 가이드까지 다 해주었다. (난 가만히 있어도 된다.)

종합해보면, 수동적이고 변화를 싫어하는 사람들도 쉽게 받아들일 수 있는 개선들이다. 이나마도 개선되는 것이 다행이긴 한데.. 문제는 이렇게 해결할 수 있는 이슈들은 제한적이며, 개선 속도도 느리고, 무엇보다 근본적이고 혁신적인 변화는 이끌어낼 수 없다. 그리고 근본적인 변화가 수반되지 않은 지협적 개선은 오히려 비효율을 증가시킬 수 있다. 예를 들어, 갱신된 문서 내용이 잘 공유되지 않는 문제를 해결하기 위해 Wiki 를 도입하면서 기존의 문서 관리 체제는 그대로 유지하고 있다면, 팀원들은 이중으로 정보를 업데이트하고 또 싱크를 맞춰줘야 한다. 개선의 효과를 잘 보지 못하고, 그런 경험이 쌓여갈 수록 사람들은 개선에 대한 신뢰를 잃고, 변화를 거부하게 된다.

서론이 길었는데.. 그럼 말하고자 하는 바는 무엇인가? 팀 문화를 개선하고 팀웍을 향상시키고 생산성을 높이는.. 하루 아침에 짠! 하고 모든 걸 바꿔줄 수 있는 마법 같은 것은 없다는 것이다. 긴 기간에 걸쳐 희생을 감내하고 열심히 노력해서 이겨내야 한다.

팀은 항시 더 나은 내일을 만들기 위해 공부하고 주변을 살피고 서로 논의해야 한다.

물론 리더의 역할이 가장 중요하다. 오픈된 마인드를 가지고 팀원들의 의견을 경청하고, 스스로 솔선수범해야 한다. 변화가 요구되면 장기간에 걸쳐 분위기를 조성하고, 필요하면 컨설팅이나 교육을 병행한다. 팀원들이 눈앞의 업무에만 목매에 시야가 갖혀 있지 않은지 살피자. 그리고 서로 간의 지식과 정보를 공유할 수 있는 문화를 만들고 새로운 것을 배우는 즐거움을 잃지 않도록 힘써야 한다. 업무적으로도 협력하여 개발하는 문화를 조성하자. 코드 리뷰, 페어 프로그래밍, 일일 스크럼, 서로의 테스트 케이스 제작.. 방법은 수없이 많다. 또한 잘하고 있는 것과 개선이 필요한 것은 무엇이 있는지 주기적으로 되돌아보자.

이런 일련의 작업들은 팀을 ‘주변의 자극에 능동적으로 반응하는 유기체‘로 만들어준다. 변화의 필요성이 감지되면 전체가 똘똘 뭉쳐서 함께 헤쳐나간다. 누군가 변화의 방향이 잘못되었음을 감지하면 즉시 공유되어 괘도를 바로 잡는다. 모두가 서로의 상황을 잘 파악하고 있으므로, 상대적으로 더 많은 노력과 희생이 요구되는 사람들을 충분히 배려해주고 그 결과를 보상해준다. 팀은 어떠한 환경에서도 적응하고 진화해나갈 수 있는 생명체가 된 것이다.

마법을 보여달라면, 난 이것을 마법이라 얘기하겠다. 너 따로 나 따로.. 울타리만 둘러둔 콩가루 팀에서는 상상조차 할 수 없던 변화와 활기를 몸소 체험할 수 있을 것이다.

Bad Team Culture – As Many Tasks As Possible in Parallel
Oct 30th, 2009 by Wegra Lee

Bad Team Culture 시리즈.. 두 번째..

As Many Tasks As Possible in Parallel (AMTAPP) 는 문장 그대로 가능한 많은 태스크들을 동시에 진행시키는 프로젝트 관리 방식을 말한다. 훌륭한 프로젝트 관리 가이드와는 전면으로 배치되는 정책으로, 특히 Kanban [1][2] 에서는 철저히 경계하고 있다.

이 방식은 현재 내가 속한 팀뿐 아니라 우리 회사의 전형적인 프로젝트 관리 방식이다. 프로젝트가 이렇게 진행될 수 밖에 없는 원인을 몇 년간의 경험을 토대로 유추해 보았다.

  1. 프로젝트는 거의 완벽히 블랙 박스에 가려진체 진행된다. 외부인이 실시간으로 과제의 정확한 진행 상태를 확인할 길이 없다. 물론 내부 팀원들에게도 마찬가지다. 프로젝트 투명성에 대한 글은 [3] 를 참조하기 바란다.
  2. 프로젝트 생존을 위한 사내 경쟁이 심하다.
    1. 따라서 더 적은 자원으로 더 많은 것을 할 수 있다고 해야지만 프로젝트가 생존할 수 있다. 다른 팀 역시 마찬가지 상황이므로, 서로 자신의 역량 이상으로 최대한 부풀려 홍보한다. 1번 – 프로젝트 투명성 부족 문제로, 과제가 마무리 되거나 팀에서 알아서 중간 결과를 보여주기 전에는 꾸며진 보고 자료만이 프로젝트 평가를 위한 근거의 전부이다. 중간 결과 발표 시에도 잘 되는 시나리오 중심으로만 보여주므로 역시 정확한 상황은 알 수 없다.
    2. ‘나중에 할 것이다’ 보다는 ‘이미 진행 중이다’ 가 더 그럴싸하게 들린다.
  3. Big bang 릴리즈 방식을 취한다. Incremental release (iterative development) 에 대한 경험과 인식이 부족하다. 충분히 안정화된 제품은 릴리즈 이전에는 결코 접해볼 수 없다. 오히려 패치 없이도 쓸만한 릴리즈를 하는 것 자체가 희귀한 경험에 해당한다.
  4. 소프트웨어 프로젝트의 납기 지연은 당연한 것이라 받아들이다. 2-1 역량 이상으로 부풀려 이야기하기의 좋은 방어책이 된다. 납기를 중요시 하지만 납기에 늦었다 해서 프로젝트가 당장 부러지는 일은 드물다. 그간 투자한 것도 있으니 계속해서 가능성을 보여주기만 하면 프로젝트는 생존할 수 있다.
  5. 메니저들은 보통 개발 실무를 하지 않는다. 실제 일할 사람 수가 줄어드는 효과를 내는데.. 우리팀의 경우 약 1/5 정도가 개발 실무를 하지 않고 있는 것으로 보인다.

그 외에도 나열하면 끝이 없겠으나.. 간략히 두 가지로 요약해보면.. 역량 이상의 일을 따냈고, 그래도 다 하고 있음을 강조해야 해야 한다. 결과적으로, 일할 사람 수보다 당장 해야할 태스크 수가 더 많은 상황에 처한다. 하나의 태스크에 둘 이상이 달라붙는 것은 사치스러운 짓이다.

그럼 AMTAPP 방식의 폐단은 무엇일까?

가장 큰 문제로 개발자 간의 의사소통이 단절을 뽑겠다. 내가 하는 일과 옆의 팀원이 하는 일은 관계가 거의 없다. 풀어야할 문제가 다르고 서로 코드를 봐줄 일도 없다. 어려움에 봉착해도 상의할 사람도 없고, 일부러건 몰라서건 대충 만들어 놓아도 당작 동작만 하면 아무도 알지 못한다. 겉으로 잘 드러나지 않는 품질이야 어떻든, 동작만 하면 관리자는 만족해한다. 또한 노하우가 공유되지 않아, 못하는 사람은 계속 못하고, 잘하는 사람의 발전도 더디다.

다음으로는 집중력 저하를 들겠다. 소프트웨어는 순전히 개발자의 사고에 의해 만들어지는지라, 소프트웨어 개발직은 다른 무엇과 비교해서도 고도의 집중력을 가장 요하는  직업 중 하나이다. 불행히도 신은 사람의 두뇌를 멀티 태스킹용으로 설계하지 않았다. 동시에 두 가지 이상을 생각하는 것은 어림도 없고, 심지어 하나 하나 번갈아 처리하는 능력 역시 상당히 떨어진다. 일을 바꿔 집중력 끌어 올리기까지는 수분에서 십수분 이상이 필요하다 – 정확한 수치를 Peopleware [4] 에서 본 듯 하나, 지금은찾아보기  귀찮다 :-)

하이라이트는 다른 사람들의 태스크를 만들어내는 태스크를 할당받은 사람들이다. 이들이 일을 열심히 할 수록 다른 팀원들 수십명의 일거리가 눈더미 처럼 불어나 버린다. 코딩하고 결함 잡기도 벅찬 와중에, 문서 고쳐라, 새로운 툴체인 적용해라, 디렉토리 구조 바꿔라, 여기 새 이디엄이 있으니 적용해라, 방금 나온 따끈따끈한 바이너리 당장 테스트해서 보고해라, 보고용 자료 좀 준비해와라, 이것 보고 커맨트 좀 달라 등등 수많은 요청이 쏟아진다. 프로젝트를 이런 식으로 이끌면서 품질은 개발자의 자존심이니 하는 이야기가 나오면 울컥하지 않을 수 없다.


References

  1. Kanban (wikipedia)
  2. One day in Kanban land
  3. Project Transparency (프로젝트 투명성)
  4. Peopleware by Tom DeMarco and Timothy Lister
Bad Team Culture – Deadline-Driven Development
Oct 29th, 2009 by Wegra Lee

꾀 오래 전부터 재미삼아 정리해보던 주제인데.. 오늘은 실사례를 하나 들어보려 한다.

최근 팀 내에 돌아다니는 메일을 보면 모든 일정이 deadline 부터 역으로 만들어진다.

위로부터 하달되는 메일들의 전형적인 흐름은 ‘릴리즈 날짜가 언제이고, A/B/C 를 포함시키기로 하였는데, B 를 하려면 최소 n 일은 필요하니 오늘중으로 x, y, z 를 꼭!!! 끝내라’ 이다. ‘할 수 있겠나?’ 라는 질문은 한 마디도 없다. 무조건 하지 않으면 deadline 을 맞출 수 없게되고.. 그건은 절대 용납할 수 없기 때문이다. 지금까지 단 한 번도 deadline 을 제대로 지켜본 적은 없다는 사실은 철저히 무시되고 있다.

물론 이것이 팀의 생산성과 개발자들의 현재 업무 부하량이 잘 반영된 합리적인 요청이라면 아무 문제가 없다. 이런 요청이 한 사람으로부터 일괄되게 하달된다면 역시 양호한 편이라 생각한다. 지금 자판을 두드리는 이유는? 당연히 우리 팀은 이와 거리가 멀음을 의미한다. 멀어도 너무 멀다.

정량적인 생산성 측정은 전혀 시도조차 해본 적 없고, 개발자들의 현 업무량도 전혀 알 수 없다. 요청도 여러 사람에 의해 산발적으로 하달된다. 최우선으로 처리해달라는 요청이 심할 땐 하루에도 몇 번씩 날아오니, 개발자들은 자신의 하루 일과를 스케줄링하는 것 조차 쉽지 않다.

또한 ‘이번 릴리즈는 목표는 토요일 저녁이다’, ’릴리즈가 저녁 x 시쯤 될 예정이니 개발자들은 퇴근하지 말고 대기하라’와 같은 메일도 자주 접하고 있다. ‘늦은 저녁(혹은 주말)까지 일을 시켜서 미안하다’ 라는 사과의 말은 전혀 없다. 야근과 주말 근무를 당연하게 생각하는 것인지, 모두 똑같이 일하고 있으니 미안할 게 없다는 뜻인지, 프로젝트 성공을 위해선 개인 생활을 희생하는 것이 프로답다고 생각하는 것인지.. 이심전심으로 다 통할 거라고 생각하는지.. 도통 알 수가 없다.

그간 여러 차례에 걸쳐 검증된 프로세스와 툴 등을 소개하고 마인드 변화를 촉구해보기도 하였으나 이러저런 이유들도 팀의 이런 개발 문화는 꿈쩍도 안하고 있다. 새로운 것을 시도하기엔 deadline 이 너무 촉박해서일지.. 단순히 게을러서인지.. 배우는 재미를 잊어버렸을 만큼 심신이 지쳐버린 것인지.. 개개인의 속내야 알 수 없지만, 이들이 모여 실패를 거듭하면서도 뒤는 커녕 옆도 돌아보지 않고 코앞의 목표만 향해 달리는 보수적인 집단을 만들어 냈다.

Deadline-Driven Development (DDD) 의 전형적인 모습을 내가 속한 팀에서 보고 있으니 답답한 마음이 이루 말할 수 없다.


References

  1. Origin of DDD
  2. More refined (but still in draft) version of DDD
»  Substance: WordPress   »  Style: Ahren Ahimsa