"'실시간 시세 추가' 는 백로그 항목이 아니라 거절된 기능이다."
옆집에서 온 제약
시장 데이터 플랜은 자산군당 실시간 스트리밍 연결 하나만 허용하고, 포트폴리오 형제의 서빙 프로세스가 이미 그걸 쥐고 있어. 그 앱은 프로덕션에서 돌아가는 중이고, 그 연결로 자기 일을 하고 있고.
그래서 Touchstone 은 그 제공자한테 REST 로만 붙어. 영구적으로. "플랜 업그레이드할 때까지" 도 아니고 "공용 연결 브로커 만들 때까지" 도 아니야. 아키텍처 문서가 그 결과를 쓸 수 있는 제일 센 표현으로 못 박았고, 그 표현 자체가 배울 점이야. 백로그 항목이 아니라 거절된 기능.
차이가 말투에 있는 게 아니야
백로그 항목은 날짜만 비워둔 약속이야. 목록에 앉아 있고, 재추정되고, 몇 달마다 누가 지금이 그때냐고 물어. 설계도 바꿔. 사람들이 거기 이음매를 남기고, "나중에 갈아끼우게" 추상을 쓰고, 그 이음매를 아무것도 안 쓰고 있다고 정확히 지적하는 사람한테서 리뷰에서 방어해.
거절된 기능은 닫힌 질문이야. 뭘 짓냐가 바뀌어. 스트리밍 이음매 없음, 구현 하나짜리 어댑터 인터페이스 없음, 그날을 위해 예약해둔 설정 플래그 없음. 그리고 결정적으로, 누가 그걸 제안했을 때 벌어지는 일이 바뀌어. 답이 "좋은 생각이야, 백로그에 있어" 가 아니라 "저건 왜 남의 연결인지" 가 되거든.
형제 앱들 사이의 자원 소유권
일반 패턴은 뽑아둘 값어치가 있어. 작은 애플리케이션 여럿이 외부 할당량 하나를 공유하는 데면 어디든 나오거든. 유료 좌석 하나, API 요청 한도 하나, 웹훅 등록 하나, OAuth 앱 하나, 허용 목록에 오른 아웃바운드 IP 하나.
실패 모드는 조용하고 구체적이야. 아무도 소유자를 안 적어놨고, 앱 둘이 쓰고, 두 번째 게 돌아가는 것처럼 보여. 새 세션이 슬롯을 가져가서 제공자가 첫 번째 연결을 끊기 전까지는. 증상은 아무 잘못도 안 한 앱한테 떨어져. 증상이 떨어질 수 있는 최악의 자리야. 거기가 바로 아무도 원인을 안 찾아볼 유일한 자리거든.
수선은 싸고 일찍 해야 해. 양쪽 앱 아키텍처 문서에 소유자 이름을 적고, 비소유자한테 뭐가 따라오는지 적어. 여기서 비소유자 문장은 모호하지 않아. 그 제공자에 대해 REST 만, 영구히.