열두 유닛의 예문을 말하는 장면별 대화로 다시 짰다. 유닛에서는 문법 순서로 읽었지만, 영어를 실제로 꺼내는 순간은 스탠드업에서 내 차례가 왔을 때, 장애 채널에 알릴 때, 리뷰에 답할 때다. 그래서 상대의 말과 내 말이 오가는 2~4턴 대화로 묶었다. 상대 말은 읽기만 하고, 내 말을 연습한다.
쓰는 법은 이렇다. 대화 블록의 '내 말 가리기'를 켜면 상대 말은 그대로 보이고 내 차례만 가려진다. 상대 말을 읽고 상황 줄을 본 뒤 소리 내어 영어로 말해 보고, 줄을 눌러 확인한다. 줄 옆의 ▶를 누르면 그 문장을 읽어 준다. 줄 끝의 유닛 표시를 누르면 그 문장을 다룬 유닛의 문법으로 돌아간다. 마지막 절의 읽어 두기는 말로 하지 않는 글이라 대화 없이 눈으로만 훑는다.
스탠드업·팀 채널: 하는 일, 막힌 것, 일정
끝난 일은 현재완료, 하는 중인 일과 팀과 맞춰 둔 일정은 진행형이다(Unit 2, Unit 3). 브랜치 위는 on, 저장소 안은 in, 하루 중 때는 in the morning이다(Unit 12).
- 리드어제 끝낸 일을 물을 때Morning. What did you get done yesterday?
- 나원인을 찾아냈고 지금은 고치는 중이라고 보고할 때Unit 3I've found the cause. I'm working on the fix.끝난 일은 현재완료, 하는 중인 일은 진행형. 한 보고 안에서 섞여도 자연스러움
- 리드언제 나가는지 물을 때Nice. When does it go out?
- 나팀과 맞춰 둔 오후 3시 배포를 알릴 때Unit 3I'm deploying at 3 p.m.이미 맞춰 둔 가까운 예정은 will 대신 진행형. 시각은 at
장애 채널: 알리기, 맡기, 되돌리기와 배포 보고
팀이 같이 쓰는 그 페이지는 the, 사용자 일반은 관사 없는 복수다(Unit 7). 맡는 말은 진행형, 지금 상태 보고는 현재완료와 yet이다(Unit 3, Unit 2). 이번 한 번의 계획은 조건 쪽 현재형, 결과 쪽 will이고(Unit 9), 함수 안은 in, 줄 위는 on, 환경 안은 in이다(Unit 12).
- 온콜핫픽스가 안 되면 어떻게 할지 물을 때What's the plan if the hotfix doesn't work?
- 나이번 배포가 실패하면 되돌리겠다고 예고할 때Unit 9If this fails, we'll roll back.조건 쪽은 현재형, 결과 쪽은 will. roll back: 이전 버전으로 되돌리다
- 온콜마이그레이션이 길어지면 어떻게 할지 물을 때And if the migration runs long?
- 나10분을 넘기면 배포를 멈추겠다고 할 때Unit 9If the migration takes more than ten minutes, I'll pause the deploy.if 절 안에는 will을 넣지 않음
PR 올리기와 리뷰 답장: 부탁, 반영 보고, 머지
어느 PR인지 뒤의 말이 정해 주면 the가 붙는다(Unit 7). 반영했다고 알릴 때는 결과가 지금 남아 있으니 현재완료, 때를 말하면 과거형이다(Unit 2). feedback은 세지 않고, 세고 싶으면 comments로 바꾼다(Unit 8).
- 나오늘 아침 올린 PR을 봐 달라고 부탁할 때Unit 7Can you review the PR I opened this morning?뒤의 I opened this morning이 어느 PR인지 정해 주니 the
- 리뷰어리뷰할 준비가 됐는지 물을 때Sure. Is it ready for review?
- 나아직 에러 케이스 테스트를 쓰는 중인 초안이라고 할 때Unit 3This is a draft. I'm still adding tests for the error cases.남은 일은 still + 진행형
- 리뷰어주요 흐름부터 보겠다고 할 때No problem. I'll start with the main flow.
- 리뷰어코멘트를 두 개 남겼다고 알릴 때Unit 8I left two comments on the migration.
- 나피드백 고맙다고 할 때Unit 8Thanks for the feedback!feedback은 셀 수 없는 명사라 a도 -s도 없음
- 리뷰어구성 환경을 더 알려 달라고 할 때Unit 8Could you share more information about the setup?
- 나설정 내용을 PR 설명에 적어 두었다고 할 때Sure. I've added it to the PR description.적어 둔 결과가 지금 남아 있으니 현재완료. 글이 담긴 곳은 in
리뷰 코멘트 주고받기: 제안과 질문, 그 답
꼭 고칠 것은 needs to와 must, 제안은 could와 might want to, 함께 정하자는 말과 의도 확인은 질문이다. 사람이 아니라 코드를 주어로 둔다(Unit 4). feedback의 양은 some으로 말한다(Unit 8).
- 나목록을 메모이즈하지 않은 이유가 있는지, 탓하지 않고 물을 때Unit 4Is there a reason this list isn't memoized?Why did you …?는 사람을 따지는 말로 읽힘. 코드를 주어로
- 작성자항목이 적어 건너뛰었다고 답할 때It's only ten items, so I skipped it.
- 나훅으로 빼면 좋겠다고 판단을 작성자에게 맡기며 제안할 때Unit 4You might want to extract this into a hook.might want to: 판단을 작성자에게 넘기는 부드러운 제안
- 작성자후속 PR에서 하겠다고 할 때Makes sense. I'll do that in a follow-up.
- 나빈 배열 처리가 빠져 반드시 고치라고, 이유와 함께 말할 때Unit 4This needs to handle an empty array. It crashes on an empty cart.머지 전 필수는 needs to·must. 이유를 같이
- 작성자잘 잡았다며 고쳐 올렸다고 할 때Good catch. I've pushed a fix.
- 나이 경우의 테스트를 하나 더해 달라고 할 때Unit 7Can you add a test for this case?처음 꺼내는 테스트 하나라 a
- 작성자같은 커밋에 넣었다고 할 때Done. It's in the same commit.
버그 알리기와 재현 설명: 처음 알림, 단계, 기대와 실제
처음 꺼내는 버그에는 a, 다시 가리킬 때는 the가 붙는다(Unit 7). 재현 단계는 명령형, 기대 결과와 실제 결과는 현재형, 조건은 if 절 안까지 현재형이다(Unit 9). 환경과 로그 안은 in이다(Unit 12).
- 나날짜 선택기에서 버그를 하나 찾았다고 처음 알릴 때Unit 7I found a bug in the date picker.처음 꺼내는 버그라 a. 컴포넌트 안은 in
- 동료데스크톱에서는 안 보인다며 어디서 나는지 물을 때Where does it happen? I can't see it on desktop.
- 나그 버그가 모바일에서만 난다고 이어 말할 때Unit 7The bug only happens on mobile.앞에서 꺼낸 버그를 다시 가리키니 the
- 동료재현 단계를 알려 달라고 할 때OK. Can you walk me through the steps?
환경 세팅 도와주기: README를 말로 안내
할 일은 명령형으로, 동사 자리의 set up·back up·sign in은 두 단어, 명사 setup·backup은 한 단어다(Unit 11). 필수는 소문자 must다(Unit 5). 늘 그렇게 동작한다는 설명은 현재형이고, 누가 하는지 중요하면 능동태다(Unit 3, Unit 6).
- 새 팀원시작 전에 뭐가 필요한지 물을 때What do I need before I start?
- 나Node.js 22 이상이 꼭 있어야 한다고 할 때Unit 5You must have Node.js 22 or later installed.README의 필수는 소문자 must. 대문자 MUST는 명세에서만
- 새 팀원그다음을 물을 때Got it. Then what?
- 나로컬 환경을 준비하라고 하며 걸리는 시간을 말할 때Unit 11Set up the local environment. The setup script takes about five minutes.동사는 set up 두 단어, 명사는 setup 한 단어
- 새 팀원설정 파일을 어디서 읽는지 물을 때Where does the CLI get its config?
- 나프로젝트 루트에서 설정 파일을 읽는다고 설명할 때Unit 6The CLI reads the config file from the project root.누가 읽는지 중요하니 능동태. 늘 그런 동작은 현재형
- 새 팀원로그아웃 상태면 훅이 뭘 돌려주는지 물을 때And what does the hook return when I'm signed out?
- 나훅이 현재 사용자를, 없으면 null을 돌려준다고 설명할 때Unit 3This hook returns the current user, or null if no one is signed in.늘 그런 동작은 현재형. is returning이 아님
포스트모템 회의: 타임라인과 "~했더라면"
타임라인과 원인은 때가 붙은 사실이라 과거형이다(Unit 2). 일어나지 않은 과거를 가정하면 If … had …, … would have …, 하지 않아 아쉬운 일은 should have, 사람 대신 시스템과 절차를 주어로 쓴다(Unit 10).
- 진행자타임라인부터 시작하자고 할 때Let's start with the timeline. What happened first?
- 나14:02에 에러율이 치솟았고 14:10에 되돌렸다고 말할 때Unit 2At 14:02, error rates spiked. At 14:10, we rolled back the deploy.때가 붙은 사실은 과거형. 팀의 조치는 we를 주어로
- 진행자근본 원인을 물을 때And the root cause?
- 나캐시 키에 로케일이 빠져 있었다고 말할 때Unit 2The cache key didn't include the locale.원인 설명도 과거형
- 동료테스트가 있었으면 잡혔을지 물을 때Would a test have caught this?
- 나빈 필터 테스트가 있었다면 잡았을 것이라고 말할 때Unit 10If we had had a test for the empty filter, it would have caught this bug.if 절은 had + 과거분사, 결과는 would have + 과거분사. had had는 맞는 꼴
- 동료알림은 어땠을지 물을 때And the alert?
- 나알림이 울렸다면 몇 분 안에 되돌렸을 것이라고 말할 때Unit 10If the alert had fired, we would have rolled back within minutes.if 절에는 would have를 넣지 않음
- 진행자무엇을 다르게 했어야 했는지 물을 때What should we have done differently?
- 나큐 크기 알림을 넣었어야 했다고 말할 때Unit 10We should have added an alert for queue size.should have + 과거분사: 하지 않아 아쉬운 일. had to는 실제로 했다는 뜻
- 동료운이 좋았던 점이 있는지 물을 때Anything we got lucky on?
- 나피크 시간이었다면 훨씬 많은 사용자가 영향을 받았을 것이라고 말할 때Unit 10If it had happened at peak time, far more users would have been affected.결과 쪽 수동태는 would have been + 과거분사
읽어 두기: 커밋 제목, 명세, 메시지
말로 하지 않고 쓰기만 하는 글이다. 커밋 제목은 동사 원형으로 시작하는 명령형이고 동사 set up·clean up은 두 단어다(Unit 1, Unit 11). 명세의 대문자 MUST·SHOULD·MAY는 정해진 요구 수준이다(Unit 5). 에러·안내 메시지와 콜백 설명은 대상을 주어로 세운 수동태다(Unit 6). 대화 없이 눈으로 훑고, 필요하면 '영어 가리기'로 떠올려 본다.
- 결제 요청에 재시도를 넣은 커밋의 제목을 쓸 때Unit 1Add retry to the payment request주어도 시제도 없이 동사 원형. Added가 아님
- 토큰 갱신의 경쟁 조건을 고친 커밋의 제목을 쓸 때Unit 1Fix race condition in token refreshFixed도 Fixes도 아님. 끝에 마침표 없음
- 날짜 포맷 코드를 유틸로 옮기기만 한 커밋의 제목을 쓸 때Unit 1Extract date formatting into a utilUpdate보다 무엇을 했는지 드러나는 동사
- 문서 사이트에 CI를 새로 구성한 커밋의 제목을 쓸 때Unit 11Set up CI for the docs site동사 자리라 set up 두 단어
- 안 쓰는 기능 플래그를 치운 커밋의 제목을 쓸 때Unit 11Clean up unused feature flags동사 clean up은 두 단어. 명사 cleanup은 목적어 자리에
- 수신자가 본문을 처리하기 전에 서명을 반드시 검증해야 한다고 명세에 쓸 때Unit 5Receivers MUST verify the signature before processing the payload.절대 요구는 대문자 MUST
- 서버가 에러 응답에 액세스 토큰을 절대 넣으면 안 된다고 쓸 때Unit 5Servers MUST NOT include the access token in error responses.절대 금지는 MUST NOT. SHOULD NOT은 이유가 있으면 해도 된다는 뜻
- 클라이언트가 지수 백오프로 재시도하기를 강하게 권고할 때Unit 5Clients SHOULD retry with exponential backoff.SHOULD는 기본으로 따르되 이유가 있으면 벗어날 수 있는 권고
- 서버가 응답에 재시도 대기 헤더를 넣어도 되고 안 넣어도 된다고 쓸 때Unit 5Servers MAY include a Retry-After header in the response.MAY는 정말로 선택
- 설정 파일이 없을 때 보여 줄 에러 메시지를 쓸 때Unit 6The config file was not found.대상을 주어로 세운 수동태. 줄이면 File not found
- 토큰 플래그가 빠졌을 때 보여 줄 에러 메시지를 쓸 때Unit 6The --token flag is required.be + 과거분사. 플래그 이름이 flag를 꾸밈
- 지원 중단된 옵션 대신 다른 옵션을 쓰라고 경고할 때Unit 6This option is deprecated. Use --output instead.is deprecated 수동태 뒤에 명령형 안내
- 변경 사항이 저장됐다고 안내할 때Unit 6Your changes have been saved.처리된 상태는 have been + 과거분사
- 요청이 실패할 때 콜백이 불린다고 문서에 쓸 때Unit 6onError is called when the request fails.콜백은 불리는 쪽이라 is called. when 절 안은 현재형