검색창의 글자를 모두 지워도 결과 목록이 그대로 남는 버그를 찾았다. 이슈에 "기대 결과: 사용자가 검색창을 비울 경우 결과 목록이 초기화된다"라고 쓰려 한다. 사용자가 비우는 것은 앞으로 일어날 일이니 영어로는 will을 넣어야 할 것 같다.
| 용어 | 뜻 |
|---|---|
| 절(clause) | 동사를 중심으로 한 말 덩어리. 대개 주어(subject, 동작의 주인)와 동사(verb)를 함께 갖고, 한 문장에 절이 둘 이상 들어가기도 한다. 예: The build failed because the cache was full.(절 두 개: The build failed / because the cache was full) |
| 조건문(conditional) | 조건을 말하는 절(if …)과, 그 조건에서 일어나는 일을 말하는 절로 이루어진 문장. 예: If <조건>, <결과>. |
| 현재형(present simple) | 동사 원형(base form, 사전에 실린 꼴) 그대로, 또는 주어가 he·she·it이나 단수 명사일 때 끝에 -s를 붙인 꼴. 예: The job runs every night. |
| 과거형(past simple) | 지난 일을 말하는 동사 꼴. 대개 끝에 -ed가 붙는다. 예: The job failed last night. |
| 명령형(imperative) | 주어 없이 동사 원형으로 시작해 무엇을 하라고 말하는 문장. 예: Open the settings page. |
이슈의 기대 결과(Expected) 항목으로 문법이 맞는 것은?
"If the user ___ the search field, the result list resets."
규칙: 조건 쪽은 현재형, 결과 쪽은 늘 그런지에 따라
A. if·when 절 안은 미래라도 현재형으로 쓴다. if, unless 같은 조건 절(if clause)과 when, after, until 같은 시간 절(time clause)에서는 미래를 말할 때도 현재형을 쓰고, will은 보통 쓰지 않는다(British Council: Verbs in time clauses and if clauses).
If the input is empty, the submit button stays disabled.(If the input will be empty가 아니다)If the request times out, the client retries once.(time out: 정해진 시간 안에 응답이 없어 실패하다)When the upload finishes, we'll send you a link.
B. 조건이 맞으면 늘 그렇게 되는 동작은 양쪽 다 현재형으로 쓴다. 조건문(conditional) 가운데 이른바 zero conditional로, 늘 참인 일이나 규칙을 말할 때 쓴다(British Council: Conditionals: zero, first and second). 프로그램의 동작은 정해진 규칙이라서 버그 리포트의 기대 결과, API 문서, 엣지 케이스 설명이 대개 이 형태가 된다.
If the token expires, the user is logged out.(log out: 로그아웃시키다.is logged out은 '로그아웃된다')When the cache is full, the oldest entry is evicted.Returns null if no user matches the given ID.
C. 앞으로 한 번 일어날 수 있는 일과 그때 할 일은 결과 쪽에 will을 쓴다. first conditional이다. 같은 문서가 앞으로 일어날 수 있다고 보는 상황에 쓴다고 설명한다. 조건 쪽은 A대로 현재형이다. 배포 계획이나 장애 대응처럼 이번 한 번의 일을 말할 때 쓴다.
If this fails, we'll roll back.(roll back: 이전 버전으로 되돌리다)If the migration takes more than ten minutes, I'll pause the deploy.
D. if와 when, unless와 as long as는 뜻으로 고른다. if는 일어날 수도 있고 아닐 수도 있는 일에, when은 일어날 것이 확실한 일에 쓴다. 다만 늘 되풀이되거나 예측되는 일에는 if와 when을 둘 다 쓸 수 있다(Cambridge Dictionary: If or when?). unless는 '~하지 않으면', as long as는 '~하는 한, ~이기만 하면'이다. 규칙 B의 British Council 문서는 이 둘도 if 자리에 쓸 수 있다고 하니, 그 절 안도 A대로 현재형이다.
If the payment fails, the order stays pending.(실패할 수도 있다)When the deploy finishes, the old pods are removed.(배포는 끝나게 되어 있다)The job is skipped unless the flag is set.(플래그가 없으면 건너뛴다)The cached result is reused as long as the key doesn't change.
콜백·훅 문서처럼 되풀이되는 동작은 when이 흔하다(Unit 6의 onError is called when the request fails).
표현: 버그 리포트와 엣지 케이스
버그 리포트는 재현 단계, 기대 결과, 실제 결과로 나눠 쓴다. Mozilla의 버그 작성 안내는 재현 단계를 버그 리포트에서 가장 중요한 부분으로 꼽고, 단계 뒤에 실제 결과와 기대 결과를 정확히 쓰라고 한다. 예시 단계는 번호를 붙인 명령형(imperative)이다(Mozilla: Bug Writing Guidelines). 명령형은 Unit 1에서 본 그 형태다.
| 표현 | 언제 | 예 |
|---|---|---|
Steps to reproduce | 버그를 다시 일으키는 단계. 번호를 붙이고 명령형으로 쓴다 | 1. Open the settings page. 2. Clear the name field. |
Expected | 버그가 없다면 일어나야 할 일. 규칙이라 현재형 | The form shows a validation error. |
Actual | 실제로 일어난 일. 재현될 때마다 그렇다면 현재형 | The form is submitted with an empty name. |
If …, … | 일어날 수도 있는 경우의 동작(엣지 케이스) | If the list has more than 100 items, only the first 100 are rendered. |
When …, … | 반드시 오는 시점의 동작 | When the session expires, the user is redirected to the login page. |
unless … | 조건이 없으면 일어나는 일 | The banner is hidden unless the feature flag is on. |
as long as … | 조건이 지켜지는 동안 계속되는 일 | The link works as long as the token is valid. |
재현 단계를 줄여서 버그가 나는 가장 작은 조건을 찾는 방법은 최소 재현 노트에 있다.
if, 반드시 오면 when으로 나눕니다. 어느 쪽이든 절 안은 현재형입니다.If the field will be empty처럼 will을 넣기 쉽습니다. 또 '-면' 하나로 쓰던 습관 때문에 확실히 오는 일(배포가 끝나면)에도 if를 써서, 끝나지 않을 수도 있는 일처럼 읽히게 만들기도 합니다.함정 찾기: AI가 쓴 버그 리포트
회원가입 폼에서 이메일을 비워도 제출되는 버그를 영어 이슈로 써 줘.
- 재현 단계, 기대 결과, 실제 결과로 나누기
의심스러운 줄을 모두 눌러 표시한 뒤 “검토 끝”을 누르세요. 함정은 2개입니다.
연습
1. API 문서에 limit 파라미터를 빼면 기본값 20개를 돌려준다고 쓸 때:
"If you ___ the limit parameter, the API returns 20 items."
2. 오늘 배포를 앞두고 슬랙에 예고한다(헬스 체크가 실패할 수도 있고, 실패하면 그때 되돌릴 계획):
"If the health check fails, we ___ back to the previous version."
3. 토큰이 유효하지 않은 요청은 모두 거절된다는 규칙을 쓸 때:
"Requests are rejected ___ the token is valid."
4. 결제 도중 탭을 닫는 사용자도 있고 아닌 사용자도 있다. 그런 경우의 동작을 엣지 케이스로 쓸 때: "___ the user closes the tab during checkout, the order stays pending."