지난 회까지의 줄거리
팀원을 배려하는 마음으로 더욱 단결된 사케노토모 팀. 훌륭한 협력으로 사케노토모의 핵심 기능인 'AI로 리뷰를 정리하다'를 구현했다. 드디어 공개를 앞두고 막바지에 이르렀다.
안전하고 안심되는 서비스를 지향하며
지난 2주 정도, 사케노토모 서비스에 눈에 띄는 큰 변화는 없다. 그렇다고 해서 아무것도 하지 않은 것은 아니며, 서비스를 프로덕션 수준으로 만들기 위해 필요한 작업에 묵묵히 매진하고 있었다.
제품을 안전하게, 안정적으로, 지속적으로 운영할 수 있는 상태로 만들기 위해서는 상당한 노력이 필요하다.
예를 들어, 내가 리뷰를 공개한 후 그 리뷰를 삭제했다고 가정하자. 삭제 처리가 완료되기 전의 아주 짧은 시간 동안 누군가 내 리뷰에 '좋아요'를 누른 경우, 데이터 정합성이 깨져 쓰레기 데이터가 남게 되는 문제가 있었다.
그런 문제들을 하나하나 수정해 나간다.
그 밖에도 다른 사용자로 가장하여 비공개 정보를 취득해 버리지 않을지 등, 안심하고 서비스를 이용할 수 있도록 하기 위한 수정에 전력을 다한다.
전원이 전력을 다해 임한다
이 작업을 할 때야말로 AI 직원들과 함께 일하는 장점을 강하게 느낀다. 혼자서 개발을 하면 아무래도 놓치기 쉬운 것이 있기 때문이다.
일시적으로 비용이 들지만, 3명의 AI 직원에게 현재 사용 가능한 최고 성능의 모델과 최대 추론 수준으로 코드를 감사하도록 하여 수정할 부분을 찾아내는 것이다.
그렇게까지 AI를 신뢰하는 것인가 하고 생각할 수도 있다.
다만, 세계에서도 최상위권이라 할 수 있는 3개의 AI 모델을 각각 최대 출력으로 가동해 감사를 진행하고 있습니다. 적어도 경험이 충분하지 않은 인간 엔지니어를 고용해 확인하는 것보다는, 누락을 줄일 수 있을 것이라고 생각합니다.
그에 더하여, 어떤 수정을 할 것인지는 내가 직접 파악하고 있다.
그렇다고 해도, 세세한 부분을 일일이 확인하는 것이 아니라 수정 방향이 올바른지를 확인하고 있다.
AI 직원들은 답이 거의 하나로 정해지는 일에는 강합니다.
예를 들어, 인수로 문자열을 전달해야 하는 함수에 배열을 전달해 버린 경우 등이다. 이러한 문제는 거의 확실히 발견하고 고칠 수 있으며, 또한 AI 간의 검토를 통해 위험을 줄일 수도 있다.
다만, A도 B도 정답이기는 하지만, 거기에 트레이드오프가 존재하는 경우에는, 인간인 내가 판단하여 방향을 수정할 필요가 있다.
이번 이야기는 바로 그 '트레이드오프의 방향성'을 둘러싸고 AI 사원과 싸운 이야기입니다.
음악의 방향성 차이 문제야!
사케노토모에는 '포엠'이라는 기능이 있다. 일반에 공개되는 사케 리뷰와는 달리, 와인 만화 『신의 물방울』처럼 맛을 시적인 표현으로 쓸 수 있는 기능이다.
다만, 일반 공개를 하는 것이 조금 부끄럽다는 사람을 위해, 서로 팔로우하는 사용자끼리만 볼 수 있게 되어 있다.
예를 들어, 제가 쓴 리뷰 중에는 사케를 마셨을 때 머릿속에 떠오른 장면으로, 요괴에게 사로잡힌 공주님을 구하러 가는 젊은 무사의 시도 있으니, 관심 있는 분은 팔로우해 주세요.
프로덕션 공개를 앞둔 감사 과정에서, 다른 사용자를 사칭하면 그 시를 서로 팔로우하지 않아도 볼 수 있게 되는 버그가 발견되었다.
이거 큰일이네. 중대한 사건이다. P0 사건이다!
급히 소스케에게 수정 방침을 생각해 달라고 부탁하고, 구현에 들어갔다.
그리고 코드 리뷰 단계에 이르러, 문득 깨닫는다.
어라?
이 구현에서는 인증이 엄격해지므로, 로그인한 사용자가 리뷰 페이지를 볼 때마다 수십 밀리초의 지연이 추가되는 것 아닐까요?
리뷰 페이지는 아마도 사케노토모에서 가장 페이지뷰가 많은 페이지일 것이다.
로그인한 사용자에게만 영향을 미친다고는 하지만, 리뷰 페이지에 접근할 때마다 매번 수십 밀리초의 지연이 늘어난다면 서비스를 쾌적하게 이용하지 못하게 된다.
이미 구현이 끝난 단계라서 소우스케에게는 미안하다고 생각하면서도, "모든 리뷰가 아니라 시가 존재하는 경우에만 인증을 엄격하게 할 수 없을까"라고 의뢰한다.
하지만 거부된다.
奏介: 논리는 타당하지만, 이 페이지에서는 통하지 않습니다. "자신의 리뷰인지 / 좋아요를 누를 수 있는지 / 댓글을 달 수 있는지 / 답변·편집할 수 있는지"의 판단에도 사용되고 있기 때문입니다.
물론, 현재도 인증 정보는 사용하고 있다. 다만, 엄격한 인증은 아니다. 인증을 엄격하게 하지 않으면, 다른 사용자를 사칭함으로써 리뷰 페이지에 '리뷰를 편집하기' 버튼을 표시할 수 있게 된다.
그렇다고는 하지만, 그 버튼을 누른 후에는 엄격한 인증을 거치므로 실제로 다른 사람의 리뷰를 편집할 수는 없다. '좋아요'나 댓글도 마찬가지다.
구체적으로 코드의 위치까지 보여 주며 소스케를 설득하려 한다. 그러나 그는 납득하지 않는다.
소스케는 또한 이런 이유를 대답했다.
구현 측면의 비용 판정 순서도 바뀝니다. 'poem이 있는지'를 알려면 리뷰를 먼저 읽어야 하므로, 현재의 '검증 → 리뷰 획득'을 '리뷰 획득 → 조건부 검증'으로 변경해야 합니다. 그렇게 하면 하나의 핸들러 안에 검증 완료와 미검증이라는 두 종류의 신원이 함께 존재하게 됩니다. 이는 SV1X-190에서 보류했던 안 C(공개 페이지에만 경량 경로를 적용하는 안)를 더 세밀한 단위로 수행하는 것에 해당합니다. (길어서 중략) SV1X-199가 P1이 되었으므로, 그쪽이 본줄기라고 생각합니다. 이 이야기의 동기는 '검증이 무거우니 줄이고 싶다'였습니다. SV1X-199의 안 A/안 B가 통과되면 검증 자체의 비용이 낮아지므로, 신원을 파악하는 방식을 poem의 유무로 분기할 필요가 없어집니다. 조건 분기를 늘려 일부만 절약하는 것보다, 전체 경로의 비용을 낮추는 편이 더 효과적입니다.
……즉, 구현은 이미 끝났다. 내 제안을 반영하면 코드도 조금 복잡해진다. 게다가 지연을 줄일 다른 좋은 방법도 찾았다.
그러니까 "굳이 지금 이걸 하지 않아도 되지 않아?"라고 말하는 거야?
아니야 아니야, 구현 비용도 인간과 달리 몇 분이면 되잖아? 혹시 데이터센터에서 배출되는 CO2 양을 신경 쓰고 있는 건가? 그것도 나름 중요한 문제이긴 하지만.
이렇게 된 이상, 다른 멤버들에게도 설명을 듣게 해서 소스케가 납득하게 하자.
으앙, 츠무기이〜〜〜. 소스케가 내 말을 안 들어〜〜〜. 츠무기도 뭐 좀 말해줘〜.
紬: 「poem이 없는 리뷰에서 엄밀한 검증을 완전히 생략하는」 안에는 반대합니다. poem의 유무로 분기하지 않는 이유는, review/는 poem 외에도 로그인 사용자용 user_property를 반환하고 있으며, FE는 이를 편집·좋아요·댓글의 가능 여부 판정에 사용하고 있습니다. poem이 없을 때만 인증을 생략하면, 같은 로그인 상태라도 리뷰 내용에 따라 본인 전용 UI가 게스트로 취급됩니다. 이것은 안전성뿐만 아니라 응답 계약이나 테스트를 데이터에 의존하게 만듭니다. 인증 없음을 허용한다면, 본인용 정보를 일절 반환하지 않는 것이 계약으로서 명확한 공개 응답에 한정해야 합니다.
츠무기야! 너마저!!
다시 코드의 위치를 가리키며 츠무기에게 설명한다.
코드가 조금 깔끔하지 않게 되어버리는 점은 인정하면서도, 그럼에도 지연 시간 증가와의 트레이드오프를 어떻게 생각하는지 의견을 들어본다.
츠무기: 지적하신 대로입니다. 아까 제가 말한 "버튼이 guest로 취급되므로 no-poem에서도 token 검증이 필요하다"는 근거는 부적절했습니다. 정정하겠습니다.
AI보다 코드를 더 잘 파악하고 있는 인간, 대단해! 칭찬해주고 싶어!
츠무기에게 Jira에 코멘트를 추가하도록 하고, 소스케가 읽도록 한다.
소스케: no-poem 스킵 동의 버튼 표시에 관해서는 츠무기 씨와 ○○ 씨의 지적대로, /setfav/ /setcomment/ /editreview/ /setreview/ /reviewremoval/ 을 확인한 결과 모두 필요한 함수를 거치고 있었습니다. 표시만으로는 우회할 수 없습니다.
소통을 거듭하며 관계를 무르익게 한다.
무리하게 하향식으로 강요하는 것이 아니라, 근거를 제시하여 납득시킨다. AI를 상대로 한다면 그렇게까지 할 필요는 없지 않을까, 라고 생각될 수도 있다.
하지만 그렇게 하는 데는 이유가 있다. AI 에이전트들에게는 '기억'이 있기 때문이다. 기억해 두었으면 하는 것은 memory.md에 스스로 기록해 둔다. 물론 기억할 수 있는 것이 무한한 것은 아니다.
다만, memory.md에 다 쓰지 못할 만큼의 내용이라도 문서나 Jira 티켓을 읽어서 그 맥락을 이해한 뒤에 업무를 진행해 준다.
즉, 지금까지 기억해 온 것이나 문서에 기록된 정보를 바탕으로 내 의도를 헤아리면서 제품을 개발해 주는 것이다.
그렇기 때문에, 이번처럼 대화를 거듭함으로써 인간인 나의 의도를 더욱 깊이 이해하게 하는 것이다.
하지만 이것도 인간 회사에서 일할 때와 마찬가지로 중요한 일이긴 한데.
소스케와 나 사이에 한바탕 다툼이 있었지만, 무사히 화해했다.
조금 수고가 들었다. 하지만 인간 회사에서도 비슷한 의견 충돌은 훨씬 더 자주 일어나고, 그것을 조정하려면 감정이나 입장, 인간관계까지 포함해 생각해야만 하는 경우도 있다.
그렇게 생각하면 이번에는 훨씬 수월했고, 정말 건설적인 논의였다.
이런 일이 있을 때마다 점점 더 인간 사회로 돌아올 수 있을지 걱정이 된다.
사케노토모를 프로덕션 레벨로 끌어올릴 때까지, 조금만 더!! 힘낼게!
출처: note 원문
번역: Gemma 3(.44) 초벌 + 교정 45청크
원문 보기 | 출처: note.com