[목 차]
프롤로그: 기획자와 개발자의 원활한 소통을 위해
1부: 화성에서 온 기획자, 금성에서 온 개발자
1장. 나는 ‘누구’와 일하고 있나
개발자는 어떤 사람일까?
개발자가 말하는 ‘일 잘하는 개발자’
개발자는 문제 해결을 즐긴다
개발자가 말하는 ‘완성’의 의미
AI 시대, 개발자는 대체될까?
2장. 개발자와의 협업은 왜 힘들까?
개발자도 기획자가 어렵다
개발자가 기획자를 불신하게 되는 과정
개발자가 쉬운 수정도 안 된다고 하는 이유
확정 짓고 싶은 개발자, 감히 최종이라 말 못 하는 기획자
개발자가 좋아하는 기획자
대화할수록 왜 더 멀어질까?
[별면] 외주 개발과 가내수공업 개발의 차이
2부: 개발자와의 흔한 갈등 사례
1장. 시간 없어요! 좀 빨리빨리 안 될까요?
저기, 버튼 하나 바꾸는 건데, 다음 주까지 기다리라고요?
말씀하신 거랑 다르잖아요, 왜 갑자기 일정이 늘어나요?
리소스가 부족한 거면, 개발자 한 분 더 투입하면 안 돼요?
제가 책임질 테니까 운영 DB 데이터 직접 수정합시다!
기획서 나왔다고 치고, 얼마나 걸려요?
2장. 일단 이렇게 좀 해주세요, 제발요
하드코딩이 뭔지는 모르겠는데, 되는 거면 일단 하고 나중에 수정하면 안 될까요?
문구 조금만 바꾸고 버튼 위치 살짝만 왼쪽으로 옮겨주세요!
전에 썼던 페이지 있죠, 똑같이 복붙만 해주세요!
테스트는 저희가 알아서 할 테니, 일단 개발부터 쭉쭉 해주세요!
3장. 좀 알아듣게 설명해 주시겠어요?
제 자리에선 안 되던데요, 되는 거 맞아요?
기술적인 문제가 정확히 뭐죠? vs 설명하면 알아들으세요?
다 말씀드렸는데 무슨 스펙을 더 정해달라는 거예요?
[별면] 장애가 발생하면 개발자들은 뭘 하나요?
3부: 협업을 위한 개발 기초 지식
1장. 내 서비스는 어떻게 움직이는 걸까?
클라이언트와 서버 그리고 과부하
데이터는 어디에, 어떻게 저장되는 걸까?
DB와 성능
2장. 개발자들은 일할 때 어떤 도구를 쓸까?
너무 많은 프로그래밍 언어, 다 배워야 하나요?
JSON으로 주세요
라이브러리와 프레임워크 그리고 의존성
‘최종.pptx’, ‘최최종.pptx’ 대신 Git
[별면] 개발 도구의 진화로 개발자는 편해졌을까?
4부: 개발자와 함께 완벽한 기획자로 성장하는 법
1장. 일 잘하는 기획자는 무엇이 다를까?
기획자가 갖춰야 할 필수 역량
개발자가 좋아하는 기획 문서 작성법
기획자의 치트키, API 검토
우선순위 조정과 타협점 찾기
변경 요청에 대처하는 생존 기술
2장. 개발자와 웃으며 일하는 협업 센스
개발자의 몰입을 지켜주는 회의 시간 관리
야근 없는 프로젝트 일정 만들기
마음 상하지 않게 의견 전하는 방법
일정 지연에 대응하는 위기관리 전략
3장. 기술의 벽을 뛰어넘는 기획자의 소통법
어려운 개발 용어를 대하는 자세
기술 회의에서 기획자가 해야 하는 일
질문만 바꿔도 일의 결과가 달라진다
기술 결정 시 고려해야 할 요소
4장. 협업의 완성, 최상의 시너지 만들기
협업을 유지하게 하는 회고의 힘
오늘의 실수가 내일의 성공이 되도록
개발자에게 기획과 비즈니스를 알려주는 방법
[별면] 기획자와 개발자가 친해지면 발생하는 일
에필로그: 개발자와 기획자가 서로 이해할 때
[본 문]
개발자들에게 ‘된다’는 ‘모든 사항이 100% 작동함’을 의미한다. 따라서 이들은 업무 가능 여부에 관한 질문을 받으면 대부분 이 일이 수행 가능한 일인지, 또 불가능한지에 대해 답변해야 하고, 또 수행 가능하다면 언제까지 할 수 있는지, 어느 정도의 시간이 소요되는지도 이야기해야 한다. 그래서 질문을 듣는 동안 요청 내용이 실현 가능한지, 불가능한 요청은 없는지 꼼꼼히 따진다. 마치 조금이라도 끊어지면 열차가 달릴 수 없는 기찻길처럼, 중간에 무언가 하나라도 구현이 불가하다면 전체 개발이 불가능해진다. 그러다 보니 불가능한 부분을 찾는 그들의 태도는 종종 공격적이라고 오해를 사기도 한다. 이럴 때는 최대 속도로 달리고 있어 주변을 보지 못하는 경주마처럼 그저 목표 지점(실행 가능 여부)을 향해 전력 질주하고 있을 뿐이라고 이해하면 좋다. (65쪽)
기획자가 개발자에게 기능 구현 가능 여부를 물을 때, 자연스럽게 “언제까지 가능한가요?”라는 질문을 함께 던지곤 한다. 빠듯한 일정과 성과에 대한 압박 속에서, 어떻게든 빠르게 결과를 만들어 내고 싶은 마음은 기획자나 개발자나 마찬가지일 것이다. 그런데 종종 개발자로부터 이런 답변을 듣게 된다. “이거 지금 당장 하려면 하드코딩 해야 해요” 얼핏 들으면 ‘하드코딩’이라는 낯선 단어 뒤에 ‘된다’라는 긍정의 메시지가 숨어 있는 것처럼 느껴질 수 있다. ‘아, 뭔가 어려운 방법이긴 하지만 어쨌든 된다는 거구나! 그럼 일단 그렇게 하고, 나중에 시간 될 때 제대로 고치면 되지 않을까?’ 하는 안도감이 들 수도 있다. (중략) 하드코딩이란 특정 값이나 로직을 코드 안에 ‘직접 박아 넣어서’ 변경이나 확장이 어렵게 만드는 것을 말한다. 우스갯소리로 “고수들은 귀찮게 머리 쓰며 로직을 짜지 않고 그냥 돌아가게만 한다”라고도 표현하지만, 사실 하드코딩은 결코 ‘고수’의 방식이 아니다. 오히려 당장의 편의를 위해 미래의 불편함을 예약하는 것에 가깝다. 이렇게 하드코딩이 된 부분은 종종 잊히며 잠재적인 위협이 된다. 유연성이 없어 매번 수정 때마다 영향이 있는지 직접 챙겨야 하는 대상이 되기도 한다. (115-116쪽)
예쁘게 디자인된 버튼, 잘 정리된 텍스트, 사용자를 편리하게 이끄는 인터페이스. 눈에 보이는 화면은 말 그대로 ‘빙산의 일각’이다. 그 화면 뒤에는 수많은 코드와 로직, DB와의 복잡한 상호작용 그리고 알 수 없는 외부 시스템과의 연동까지 거대한 시스템이 있다. 마치 거실에 조명 하나 위치를 바꾸려고 봤더니, 그 전기선을 통해 다른 조명들이 릴레이처럼 엮여 있어서 전체 배선을 건드려야 수정이 가능한 상황과 같다. 겉으로 보기엔 간단한 수정 요청 같아도, 개발자에게는 이 거대한 시스템의 어느 부분을 건드려야 할지, 그 파장이 어디까지 미칠지 가늠해야 하는 복잡한 문제로 다가온다. 특히 골치 아픈 건, 내가 직접 짜지 않은 ‘남의 코드’를 수정해야 할 때다. 운 좋게 잘 짜이고 문서화까지 완벽한 코드를 만난다면 정말 큰 짐을 던 기분이 들지만, 현실은 시궁창일 때가 더 많다. 주석 하나 없이 수수께끼처럼 꼬여 있는 스파게티 코드, 왜 이렇게 만들었는지 도무지 이해할 수 없는 로직, 심지어 작성자는 이미 퇴사하고 없어서 물어볼 사람조차 없는 상황이라면? 개발자는 그야말로 맨땅에 헤딩하는 심정으로 코드 해독 작업에 들어가야 한다. (중략) 더 큰 문제는, 이런 복잡하게 얽힌 시스템과 해독 불가능한 코드 속에 ‘사이드 이펙트’라는 언제 어디서 터질지 모르는 시한폭탄이 숨어 있다는 것이다. 분명 버튼 A의 문구만 살짝 바꿨는데, 갑자기 관련 없는 페이지 B에서 데이터가 꼬이거나, 잘되던 결제 시스템에서 오류가 뿜어져 나올 수도 있다. (124-125쪽)
데이터 규격은 컴퓨터와 개발자들 사이에서, 혹은 시스템끼리 데이터를 주고받기 위해 만든 것이다. 즉 복잡한 데이터(정보)를 누구나 이해할 수 있도록 ‘규칙에 맞게’ 정리하기로 ‘약속’한 것으로 개발자들에겐 없어서는 안 될 중요한 매개체다. 서로 다른 시스템, 다양한 플랫폼이 공존하는 인터넷과 앱 서비스 환경(웹서버, 모바일앱, DB 외부 API 등)에서 데이터를 주고받는 데 표준화된 규격이 필요하다. 표준화된 규격이 없으면 데이터를 주고받을 때마다 데이터 구분을 콤마로 할지, 탭으로 할지, 어떤 값들을 보낼지 등을 매번 정해야 한다. 또 규격 없이 데이터를 주고받으면 서로 보낸 데이터를 해석하지 못하거나 오작동이 발생할 수 있고, 복잡한 서비스에서는 이런 문제로 큰 장애가 발생하기도 한다. 대표적으로 가장 많이 사용하는 데이터 규격이 JSON과 XML이다. (214쪽)
개발 과정에서는 큰 아키텍처 결정 외에도 수많은 작은 기술적 결정들이 이루어진다. 이러한 일상적인 결정들이 모여 프로젝트의 성공 여부를 결정한다. 예를 들어 서비스에서 간헐적으로 에러가 발생한다는 유저들의 민원이 어젯밤부터 리포팅 된 상황을 생각해 보자. 개발팀에 문의해 보니 “CPU가 피크를 찍어서 증설이 필요하다”라는 기술자로서의 의견을 냈다면, 기획자는 이 결정이 추가 비용이 발생할 수 있고, 상황에 따라 서비스 중단 시간이 발생할 수 있다는 점을 이해해야 한다. 왜 CPU가 피크를 찍었는지, 다른 해결책은 없는지 파악하고 의사결정에 고려하는 것 역시 중요하다. 또 다른 상황으로, “요청이 있을 때마다 처리하면 될 거라고 예상했던 개발 방향을 배치 작업을 만들어서 커버하겠다”라는 개발자의 제안을 들었다고 가정해 보자. 기획자는 이 결정이 왜 필요한지 이해해야 한다. 배치 처리는 시스템 부하를 분산시키고 효율성을 높일 수 있지만, 실시간성이 떨어질 수 있다. 이러한 트레이드오프를 이해하고 비즈니스 요구 사항과 맞는지 판단해야 한다. (351쪽)