자동화 파이프라인8 분 읽기

프랑스어 페이월이 없는 기능을 팔고 있었습니다. 영어만 고쳤기 때문에

앱 여러 개를 다른 플랫폼으로 포팅하면서 원본 플랫폼 이름을 새 것으로 바꿨다고 생각했습니다. 전수 검사를 돌리니 127건이 남아 있었고, 그중 코드가 실제로 참조하는 46건 안에 결제 직전 화면이 있었습니다.

#android#i18n#audit#porting#gotchas
결제 화면 카드 두 장. 왼쪽 기본 언어 카드는 기능 목록에 현재 플랫폼 이름이 들어가 고쳐진 상태. 오른쪽 다른 언어 카드는 같은 목록인데 한 줄만 원본 플랫폼 서비스 이름 그대로이고 빨간 밑줄이 그어져 있음.
영어를 고칠 때 번역 로케일을 같이 확인하지 않으면, 고쳤다는 기억만 남습니다.

문자열을 고쳤을 때, 번역 로케일까지 같이 열어 보십니까?

저는 기본 언어만 고치고 "했다"고 기억했습니다. 그래서 네 개 로케일의 결제 화면이 이 앱에 없는 기능을 팔고 있었습니다.

하려던 일

앱 여러 개를 다른 플랫폼으로 포팅했습니다. 원본에는 그 플랫폼 고유의 기능 이름과 결제 안내가 문자열로 들어 있는데, 포팅하면서 그걸 새 플랫폼 것으로 바꿔야 합니다.

바꿨다고 생각했습니다. 확인차 전체 앱의 문자열 리소스를 훑었습니다.

127건이 남아 있었습니다. 그런데 이 숫자가 함정입니다

정규식으로 세면 127건입니다. 그런데 그중 코드에서 실제로 참조되는 건 46건이었습니다.

나머지 81건은 포팅 잔재로 남은 죽은 문자열이라 화면에 안 나옵니다. 지우는 건 17개 로케일 대량 수정이라 이득 없이 위험만 있어서 그대로 뒀습니다.

이게 이 감사의 핵심 판단입니다. 총 건수는 행동을 안 알려줍니다. "화면에 나오는가"로 거르고 나서야 목록이 46건으로 줄고, 그때부터 순서가 보입니다.

살아 있던 46건

가장 나쁜 건 한 앱의 결제 화면이었습니다.

기본 언어와 한국어는 새 플랫폼 이름으로 고쳐져 있었습니다. 프랑스어·일본어·중국어 간체·번체 네 로케일만 원본 플랫폼의 건강 서비스 이름 그대로였습니다.

그 문자열은 결제 직전 화면에서 렌더링됩니다. 즉 그 언어 사용자는 이 앱에 없는 기능을 보고 구매 결정을 합니다.

다른 앱은 결제 화면의 "클라우드 동기화" 자리에 원본 플랫폼의 클라우드 서비스 이름이 있었고, 게다가 다섯 로케일이 그 영어 원문을 번역도 없이 쓰고 있었습니다.

그리고 두 앱은 결제 고지에서 "다른 플랫폼 계정으로 청구된다" 고 적혀 있었습니다. 이건 사실과 다를 뿐 아니라 스토어 정책 위반 소지가 있습니다 — 실제로 그 앱들이 거부된 사유와 같은 계열입니다.

판정은 두 단계입니다

# 1단계 — 후보 (공백 없는 표기까지 잡는다)
패턴 = r"브랜드\s*[^\s,.。、·]{0,12}|기기이름|클라우드이름"
 
# 2단계 — 실제로 쓰이는가
if re.search(rf"R\.string\.{}\b", 코드전체):
    진짜_결함.append(키)

2단계가 없으면 127건짜리 목록을 들고 앉게 됩니다. 그 목록으로는 우선순위가 안 나옵니다.

제외 목록도 필요합니다. 개발자 이메일 도메인, 법적 문서 URL, 그리고 낱말 게임에서 예시로 쓰는 일반 명사.

당신이라면 죽은 문자열 81건을 지우시겠습니까

저는 안 지웠습니다.

  • 화면에 안 나옵니다.
  • 17개 로케일을 건드리는 대량 수정입니다.
  • 회귀 위험만 늘고 얻는 게 없습니다.

이건 배포 스크립트가 하루치 작업을 되돌릴 뻔한 것에서 배운 것과 같습니다. 대량 수정은 그 자체가 위험 자산입니다. 값이 없으면 안 하는 게 맞습니다.

자가진단 3줄

  1. 문자열 하나를 고칠 때 values-* 전체를 grep 합니까? 기본 언어만 고치면 "고쳤다는 기억"만 남습니다.
  2. 당신의 검사 결과가 "몇 건"입니까, "몇 건이 렌더링됩니까"입니까? 참조 여부로 거르지 않으면 목록이 행동으로 안 바뀝니다.
  3. 결제 화면 문구를 로케일별로 마지막에 읽어 본 게 언제입니까? 거기가 오차 비용이 제일 비싼 화면입니다.

솔직한 부분

처음 훑을 때 정규식이 공백 없는 표기를 놓쳤습니다. 중국어 문자열에서는 브랜드 이름과 그다음 글자가 붙어 있는데, 공백을 가정한 패턴으로는 안 걸립니다. 두 번째 검사에서야 나왔습니다. 즉 제 첫 번째 "전수 검사"는 전수가 아니었습니다.

오탐도 있었습니다. 한 앱의 문자열에 원본 플랫폼 기기 이름이 들어 있는데, 그건 정확한 표현이었습니다 — 그 플랫폼용 앱이 실제로 있고 파일을 주고받을 수 있으니까요. 브랜드 이름이 나온다고 전부 결함이 아닙니다. 개발자 이메일 주소에 클라우드 서비스 도메인이 들어 있어서 그것도 걸렸습니다.

그리고 이 감사는 문자열만 봤습니다. 아이콘·스크린샷·스토어 리스팅에 원본 플랫폼 흔적이 남아 있는지는 이번에 안 봤습니다. 같은 주에 스토어 설명 안에 이 앱에 없는 기능이 적혀 있는 것도 나왔으니, 그 방향은 아직 열려 있습니다.

포팅한 앱이 있으시면, grep -r "옛플랫폼이름" res/ 하고 그중 코드가 참조하는 것만 세어 보세요. 두 숫자 차이가 당신의 우선순위입니다.

관련 글