
코드를 작성할 줄 모르는 스크럼 마스터가 AI로 '성장의 풀(草)'을 키워내기까지
요약
코딩 지식이 부족한 스크럼 마스터가 Claude를 활용해 팀의 기술적 성장을 가시화하는 도구를 개발한 경험담입니다. 단순한 작업 속도(Velocity) 향상을 넘어, 팀원들이 실질적인 배움을 체감할 수 있도록 GitHub의 잔디(Commit) 개념을 도입한 성장 지표 구축 과정을 다룹니다.
핵심 포인트
- 단순한 작업 속도 향상은 지식의 소비일 뿐 진정한 성장이 아님
- 성장을 가시화하되 심리적 안전성을 해치는 평가 도구가 되지 않아야 함
- Claude와 같은 AI 도구를 활용하면 비개발자도 의도를 구현할 수 있음
- 팀의 성장을 GitHub 잔디처럼 긍정적인 피드백 수단으로 활용
월요일 아침 7시. 커피는 아직 뜨겁고, Slack의 미독 메시지는 식어가는 시간대. 이 글은 그런 시간에 읽을 수 있도록 놓아둔다. 출근길 전철 안에서 옆 사람의 어깨 너머로 훔쳐봐도 부끄럽지 않을 정도의, 현장의 이야기다.
먼저 고백하겠다. 나는 코드를 작성할 줄 모르는 스크럼 마스터(Scrum Master)였다. '였다'라고 과거형으로 말할 수 있게 된 것은, 지난 몇 주간의 일들 덕분에 그 직함이 아주 조금 거짓말이 되었기 때문이다.
지난 1년 동안 팀은 빨라졌다. AI에게 초안을 던지고, 테스트 설계의 밑그림을 그리게 하며, 리뷰 관점까지 미리 짚어보게 한다. 베로시티(Velocity) 그래프는 우상향한다. 경영진에게 보여주면 모두 만족스러운 듯 고개를 끄덕인다.
하지만, 문제는 따로 있었다. 스프린트 리뷰(Sprint Review)를 할 때마다 내 위장 밑바닥에는 작은 돌멩이가 하나씩 쌓여갔다. 빨라졌음에도 불구하고, 조직 서베이(Organization Survey)의 성장 지표는 좋아지기는커녕 좋지 않은 방향으로 직행하고 있었다. 태스크(Task)는 녹아내리듯 사라지는데, 사라진 뒤에 손에 잡히는 감각이 남지 않는다. 밭은 갈리고 있는데, 수확에 대한 이야기는 아무도 하지 않는다.
속도는 효과가 빠른 진통제다. 통증은 잠잠해지지만, 환부는 그대로 남아 있다. 효과가 지속되는 동안에는 아무도 병원에 가려 하지 않는다. 연구 개발이라는 밭에서 어느덧 나름의 나이테를 쌓아온 몸이다. 속도의 정체가 '배움의 부산물'에 불과하다는 것쯤은, 몇 번이나 뼈아픈 경험을 하면 싫어도 몸이 기억한다. 속도 그 자체를 목적으로 삼는 순간, 팀은 '소비'를 시작한다. 자신의 재고인 지식을 깎아 먹으며, 그것을 '해냈다'라고 부른다. 새로운 지식의 서랍은 단 하나도 늘어나지 않는다.
어느 스프린트 회고(Retrospective)에서 한 멤버가 툭 던지듯 말했다. "제 지식 안에서 태스크를 소화해 버려서, 성장을 별로 실감하지 못했어요." 목소리에는 진심으로 곤란해하는 기색이 서려 있었다. 그 목소리를 듣고 나는 결심했다. 성장을 눈에 보이는 곳으로 끌어내기로. 밭 안에서 무엇이 싹텄는지를 본인에게도, 옆자리 동료에게도, 경영진에게도 싫어도 보이게 만들겠다고.
가시화(Visualization)라고 말하기는 쉽다. 어려운 것은 그것이 '심판의 도구'로 변하지 않게 하는 것이다. 스킬 목록을 만들어 점수를 매기면, 그것은 조용히 인사 평가의 대리인이 된다. 누군가가 누군가와 비교되고, 낮은 점수를 받은 사람은 두 번 다시 본심을 쓰지 않게 된다. 심리적 안전성(Psychological Safety)이라는 단어는 이렇게 죽어간다.
내가 원했던 것은 성적표가 아니었다. GitHub의, 그 '풀(草)'이다. 커밋(Commit)을 쌓으면 초록색이 짙어지는, 그 죄 없는 격자무늬. 그것은 순위를 매기지 않는다. 옆 사람과 비교하게 하지도 않는다. 그저 "오늘 손을 움직였구나"라고 긍정해 줄 뿐인, 말 없는 파트너. 그 사상을 스프린트의 배움에 이식하고 싶었다.
세로축에는 스킬 카테고리, 가로축에는 스프린트. 그 스프린트에서 "성장했다"라고 손을 든 인원수만큼 칸이 초록색으로 물든다. 많으면 진한 초록색. 제로라면 회색인 채로 남지만, 비난하지 않는다. 숲이 자라나는 것을 모두가 같은 화면으로 바라본다. 그뿐이다.
문제는 그것을 만드는 사람이 나였다는 점에 있다.
솔직히 말하겠다. 나의 JavaScript 실력은 10년 전 복사 붙여넣기 수준에서 멈춰 있다. var와 let의 종파 갈등 사이에서 여전히 눈치를 본다. 하지만 지금은 옆에 대화 상대가 있다. Claude Copilot을 향해 나는 이렇게 던졌다. "카테고리별로 GitHub의 풀을 키우는 것처럼, 각 스프린트의 성장을 가시화하고 싶어."
돌아온 것은 훈계가 아니라 밑그림이었다. 이것이 AI와 함께하는 묘미다. 우리의 어휘가 미숙하더라도 상대는 '의도'를 포착해 온다. 사양서(Specification)를 쓰지 못하는 발주자의 머릿속 낙서를 움직이는 HTML로 번역해 준다. 타인이 쓴 원고지의 칸을 우리의 언어로 다시 채워주는 파트너라고 하면 될까.
풀의 농도를 결정하는 로직은 허무할 정도로 짧다.
// 그 스프린트에서 "성장했다"라고 손을 든 인원수를 센다
function grewCount(sprint, cat) {
return sprint.members.filter(m => (m.grew || []).includes(cat)).length;
...
단지 이것만으로 회색 땅에 초록빛이 돌기 시작한다. 데이터만 있다면 가시화의 본체는 놀라울 정도로 가볍다. 비대한 것은 데이터를 모으는 메커니즘과 사람의 말을 기계가 해석하는 부분이다. 후자에서 나는 한 번 크게 넘어지게 된다. 그것은 다음 장에서.
데이터의 입구는 회고 마지막에 90초 동안 답하는 Google Forms로 만들었다. 질문은 욕심내지 않았다. "성장을 느꼈는가", "배우는 시간을 가졌는가", "이 페이스를 유지할 수 있는가"를 5단계로. 그다음 성장한 카테고리에 체크. 마지막으로 자유 기술형으로 "다음에 키우고 싶은 한 가지"를 쓰게 한다. 이 '자유 기술'이 나중에 내 발을 크게 걸어 넘어뜨리게 된다. 눈치 빠른 독자라면 알아챌 것이다.
초보자가 반드시 밟게 될 지뢰의 위치는, 다행히 밟기 전에 보였다.
완성된 HTML 파일을 의기양양하게 팀원들에게 나눠주고 끝내지는 않았다. HTML을 배포하는 것만으로는 입력한 데이터가 각자의 브라우저(localStorage) 안에만 남게 된다. 다섯 명에게 배포하면, 내용이 서로 다른 다섯 개의 밭이 따로 만들어진다. 옆 사람이 무엇을 키웠는지는 누구의 화면에도 나타나지 않는다. 그렇게 되기 전에 설계를 한 단계 비틀어 두었다. 데이터는 한곳에 모이지 않으면 의미를 갖지 못한다.
여기서 Google Apps Script의 차례다. 폼(Form)의 응답을 읽어, 풀 맵(Grass Map)을 먹을 수 있는 형태의 JSON으로 변환하고, 화면 그 자체도 Apps Script를 통해 배포한다. 하나의 URL을 열면, 모두가 동일한 최신 밭을 본다. 서버 측에서 데이터를 화면에 흘려보내기 때문에, 누구의 브라우저에서도 결과는 같다.
function doGet(e) {
// 화면(HTML)을 반환한다. 데이터는 서버 측에서 삽입한다
const tmpl = HtmlService.createTemplateFromFile('grass');
...
URL 하나로, 모두가 같은 밭 앞에 선다. 다시 배포할 필요도, 번거로운 설치도 필요 없다. 여기까지는 꽤 순조로웠다. 진짜 함정은 좀 더 조용한 곳에서 입을 벌리고 있었다.
전에 뿌려둔 씨앗이 여기서 싹을 틔운다. 그것도 잡초의 얼굴을 하고서.
"다음에 성장시키고 싶은 한 가지"를 자유 기술하게 한 이상, 작성된 일본어를 기계가 카테고리로 분류해야만 한다. 나는 단순한 키워드 매칭(Keyword Matching) 방식을 작성했다. "테스트"라고 적혀 있으면 품질 카테고리, "설계"라고 적혀 있으면 설계 카테고리. 얼핏 보기에는 무해하다.
그런데, 한 멤버가 이렇게 적어 놓았다.
테스트 실행 중의 불명확한 점을 해결할 수 있도록 "A. 도메인/업무 지식"을 높이고 싶다.
본인은 명확하게 "A. 도메인/업무 지식"이라고 지칭했다. 그런데 내 코드는 문두의 "테스트"에 달려들어, 이것을 품질 카테고리로 판정했다. 다음 분기의 초점을 집계했더니 품질에 4표. 본인의 의사는 기계의 성급한 판단에 짓밟혀 어디에도 남지 않았다.
이것을 "단순한 버그"로 치부할 수는 없었다. 본인이 명확하게 입 밖으로 낸 소망을 시스템이 옆에서 멋대로 바꿔버린다. 하고 있는 짓은 검열과 크게 다르지 않다. 한 번이라도 이런 일이 발생하면 멤버들은 조용히 학습한다. 어차피 기계가 적당히 분류할 거라면, 정성껏 적어봤자 헛수고라고. 다음 스프린트부터 자유 기술란은 점점 메말라 갈 것이다. 목소리를 모아야 할 메커니즘이 목소리를 걸러내는 장치로 변한다. 키우고 싶었던 것은 풀이었고, 베어내려 했던 것은 사람의 본심이었다. 소름이 끼쳤다.
수정 방침은 인간의 명시를 최우선으로 하는 것으로 정했다. 문중에 "A."와 같이 카테고리가 지칭되어 있다면, 키워드 추측보다 그것을 반드시 우선시한다.
function guessCat_(text) {
const t = String(text || '').trim();
if (!t) return '';
...
수정한 뒤, 해당 멤버의 표는 원래 있어야 할 "A"의 밭으로 돌아갔다. 단 한 표. 하지만 그 한 표가 "너의 말은 제대로 전달되고 있어"라는 시스템으로부터의 대답이 된다. 측정 정밀도의 문제처럼 보이지만, 이것은 신뢰의 문제다.
덧붙여, 도저히 이상한 오독이 남았을 때를 대비해 설정 파일에 한 줄을 추가하는 것만으로 교정할 수 있는 퇴로도 마련했다. 기계의 추측을 인간이 언제든 덮어쓸 수 있게 했다. AI에게 맡긴 영역에 인간이 고삐를 남겨두는 것. 이 감각은 현장에서 AI와 함께 일할 때 아마 가장 중요한 파지법(Grip)일 것이다.
첫 번째 스프린트를 마치고, 다섯 명분의 풀이 지면에 돋아났다.
진하게 물든 곳은 품질과 테스트 열이었다. 세 명이 "이 부분이 성장했다"며 손을 들었다. 새로운 테스트 방식을 익힌 사람. 어디까지 검증해야 하는지 기준을 누군가의 지시 없이 스스로 정할 수 있게 된 사람. AI를 대화 상대(Wall-hitting partner)로 삼아 설계의 논리를 세운 사람. 방식은 제각각이었다. 공통된 점은 속도 이면에 제대로 된 경험치가 하나씩 늘어 있었다는 것이다. 안심했다.
성장 실감의 평균은 5점 만점에 2.6점. 배우는 시간은 3.0. 지속 가능성은 3.4. 가슴을 펴고 자랑할 만한 숫자는 아니다. 오히려 첫 시도로서는 솔직한 숫자다. 전원이 만점을 주는 설문은 설문이 아니라 눈치 보기용 저금통이니까. 낮은 숫자가 나온 것에 나는 오히려 안도했다. 본심을 적을 수 있는 토양은 아직 메마르지 않았다.
그리고 다음 분기에 성장시키고 싶은 요소 중 하나로 '품질'에 표가 모였다. 서두에서 "자신의 지식만으로 태스크(Task)를 소화해 버렸다"라고 털어놓았던 그 목소리의 주인공. 다음 밭을 품질로 정했다. 재고를 헐어 쓰던 손이 새로운 씨앗을 향해 뻗으려 하고 있다. 가시화(Visualization)가 효과가 있었는지는 아직 알 수 없다. 하지만 본인이 스스로 다음 한 걸음을 지목할 수 있었다는 것. 그 자체를 나는 회색이었던 칸에서 싹이 텄다는 증거로 받아들였다.
여기까지 읽고 "결국은 엔게이지먼트 서베이(Engagement Survey)의 재탕 아니냐"라며 냉소적으로 반응하는 독자도 있을 것이다. 그 의심은 옳다. 세상의 많은 가시화는 숫자를 쥐고 사람을 줄 세우기 위해 사용되었고, 현장의 입을 무겁게 만들어 왔다. 나는 그것을 수없이 보아왔다.
이 초 맵(Grass Map)이 단순한 대시보드(Dashboard)와 다르다고 주장할 수 있는 근거는 단 하나. 순위를 매기지 않는다는 것이다. 누가 몇 점인가가 아니라, 밭 전체에서 어디에 초록색이 늘어났는지를 본다. 개인을 심판하기 위한 돋보기가 아니라, 숲을 함께 바라보기 위한 창이다. 그래서 회고(Retrospective) 때 이 화면을 띄워도 아무도 경계하지 않는다. 범인을 찾는 대신, 싹이 나지 않은 줄을 보며 "다음에는 여기에 물을 줄까?"라고 상의한다. 숫자가 대화의 계기로 변모한다.
사람을 '비용(Cost)'으로 본다면 가시화는 감시가 된다. 사람을 '자본(Capital)'으로 본다면 가시화는 투자 진척 보고가 된다. 똑같은 초록색 칸이라도 보는 이의 마음가짐 하나에 채찍이 될 수도, 비료가 될 수도 있다. 나는 이 도구를 비료의 편에 두기로 결정했다.
속도의 시대에 굳이 배움의 여백을 지킨다. 급할수록 돌아가라. 진부한 격언을 AI라는 최신 도구로 뒷받침한다. 이 모순적인 조합이 아마도 앞으로 스크럼 마스터(Scrum Master)의 일이 될 것이다. AI에게 맡겨서 남은 손으로 무엇을 할 것인가. 나는 그 남은 손으로 밭에 물을 주기로 했다.
마지막으로, 이 글을 가장 읽게 하고 싶은 상대는 몇 주 전의 나 자신이다. "코드를 쓸 줄 모르니까 가시화 같은 건 무리다"라고 단정 지으며 위장에 돌덩이를 쌓아두고 있던 그때의 나.
전하고 싶은 것은 하나다. 발주자의 어휘가 미숙하더라도 의도만 날카롭다면, AI는 그것을 움직이는 것으로 번역해 준다. 필요한 것은 유창한 JavaScript가 아니라, "무엇을 위해, 누구의 무엇을 지키고 싶은가"라는 한 줄의 고집이었다. 도구는 이미 손 안에 있다. 남은 것은 밭으로 나가느냐 아니냐뿐이다.
월요일 아침, 커피가 다 식기 전에. 당신 팀의 회색 칸에 첫 번째 씨앗을 뿌려보는 것은 어떨까. 초록색이 피어나는 순간은 상상보다 훨씬 더 마음을 따뜻하게 해준다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기