Deep dive โ 60๋ถ ๋ฐ๋ถ
Opendoor 2๋ผ์ด๋: ๊ณผ๊ฑฐ ํ๋ก์ ํธ ํ๋๋ฅผ 60๋ถ ๊น๊ฒ. ์คํ์ธ์ ERP-MES ํ๋ โ ๋ถ ๋จ์๋ก ํ๋ฆ์ ๋ชธ์ ๋ถ์ฌ๋ผ.
- 0-5๋ถOpening & Context
30์ด ์ธ์ฌ ํ ๋ฐ๋ก ์์คํ ํ ์ค ์ ์: ์์ ์๊ฐ ๊ณต์ ์๋ฃ๋ฅผ ์ ์ฅํ๋ฉด MES๊ฐ ๊ธฐ๋กํ๊ณ , MES๊ฐ ERP์ ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๊ตฌ์กฐ(์์ ์ โ MES โ ERP). ๋ด ์ญํ ๋ช ์: ์ด ํธ๋์ญ์ ๊ฒฝ๊ณ๋ฅผ ๋ด๊ฐ ์ฌ์ค๊ณํ๋ค. ๋ง์ง๋ง์ ๋ฉด์ ๊ด์๊ฒ ์ ํ๊ถ: ๋ฌธ์ ๋ฐ๊ฒฌ ๊ณผ์ ๋ถํฐ ๊ฐ์ง, ์ํคํ ์ฒ๋ถํฐ ๊ฐ์ง.
์ฑ์ : ์ปค๋ฎค๋์ผ์ด์ โ ํ์ฌ/๋๋ฉ์ธ ๋ฐฐ๊ฒฝ ์์ด๋ ๋ฉด์ ๊ด์ด 1๋ถ ์์ ๋ฐ๋ผ์ฌ ์ ์๊ฒ ๋งฅ๋ฝ์ ์ก์์ฃผ๋ ๋ฅ๋ ฅ. ๊ฐ์ด ์ผํ ๋ ์ค๋ช ์ด ํธํ ์ฌ๋์ธ์ง.
- ํ์ฌ ์๊ฐ ๋ง๊ณ ์์คํ ์ ์๋ถํฐ: '์์ ์ ์ ์ฅ โ MES ๊ธฐ๋ก โ ERP ์ ๋ฌ' ์ธ ๋ฐ์ค
- 'I owned' โ ํ์ด ์๋๋ผ ๋ด๊ฐ ์ฌ์ค๊ณํ๋ค๊ณ ์ฒซ ๋ฌธ์ฅ์์ ๋ฐ๊ธฐ
- 5๋ถ ์ ๋ ๋๊ธฐ์ง ๋ง ๊ฒ. ๋ฐฐ๊ฒฝ์ด ๊ธธ๋ฉด ๋ค์ ํธ๋ ์ด๋์คํ ์๊ฐ์ด ์ฃฝ๋๋ค
- ๋ง์ง๋ง์ 'Where would you like me to start?'๋ก ๋ฉด์ ๊ด์ ๋์ด๋ค์ด๊ธฐ
๐ฃ ์ด ์คํ ์ด์ง ์ฌ๋ ๋ฌธ์ฅโI'd like to walk through a production issue I owned end to end โ our MES talking to ERP.โ
checking microphoneโฆ
- 5-14๋ถProblem & Stakes
์ฆ์์ ์์ ์ ๋ง ๊ทธ๋๋ก ์ธ์ฉ: ๋ฏธ๊ตญ ์์ ์๋ค์ด '๋ผ์ธ์ ๋ ๋ ์ ํ์ด ์์ง ์์ฐ ์ค์ผ๋ก ๋ณด์ธ๋ค'๊ณ ๋ฆฌํฌํธ. ์ถ์ ๊ณผ์ ์์ : ERP ํ์์์ โ @Transactional ์ ์ฒด ๋กค๋ฐฑ โ ์ฐ๋ฆฌ ๋ก์ปฌ ๊ธฐ๋ก๊น์ง ๊ฐ์ด ์ฆ๋ฐ. '๊ณต์ ์ ์์ผ๋ก ๊ฐ๋๋ฐ ์์คํ ์ ์๋ฌด๊ฒ๋ ์๋ค.' stakes๋ฅผ ์ซ์๋ก: ์ 20๊ฑด ์ฌ์ฒ๋ฆฌ, ์ด์์ ์ ๋ขฐ ํ๋ฝ, ์๊ฐ ๋ฐ์ดํฐ ์ ํฉ์ฑ.
์ฑ์ : ์ค๋์ญ + ๊ทผ๋ณธ์์ธ ์ถ์ โ ์ฆ์์์ ํธ๋์ญ์ ๊ฒฝ๊ณ๊น์ง ๋จ ํ ์์ด ์ค์ค๋ก ํ๊ณ ๋ค์๋์ง. 'ERP ํ ์๋ชป' ํ๋ ์์ด ํ ๋ฒ์ด๋ผ๋ ๋์ค๋ฉด ๊ฐ์ .
- ์์ธ์ ํ ๋ฌธ์ฅ์ผ๋ก: 'Two writes were in one transaction โ ours and theirs'
- ์ 20๊ฑด ์ฌ์ฒ๋ฆฌ๋ผ๋ ์ซ์๋ก stakes๋ฅผ ๊ตฌ์ฒดํ
- ERP๋ฅผ ๋น๋ํ์ง ๋ง ๊ฒ โ ์๋ชป๋ ๊ฑด ์ธ๋ถ ํธ์ถ์ ํธ๋์ญ์ ์์ ๋ ์ฐ๋ฆฌ ๊ฒฝ๊ณ ์ค๊ณ
๐ฃ ์ด ์คํ ์ด์ง ์ฌ๋ ๋ฌธ์ฅโUS operators reported products that left the line still showing in production โ and we had recorded nothing.โ
checking microphoneโฆ
- 14-28๋ถArchitecture Walk (draw the boxes)
Before/After ๋ ์ค ๊ทธ๋ฆผ. Before: ์์ ์ โ MES @Transactional[๋ก์ปฌ ์ ์ฅ + ERP ๋๊ธฐ ํธ์ถ] โ ERP ์คํจ ์ ์ ๋ถ ๋กค๋ฐฑ. After: ์์ ์ โ MES @Transactional[๋ก์ปฌ ์ ์ฅ + staging row, postDate๋ฅผ ์ง๊ธ ์คํฌํ] โ ์ฆ์ ์ปค๋ฐยท๋ฆฌํด, ๋ณ๋ ์์ปค๊ฐ 1๋ถ๋ง๋ค staging์ drainํด์ ERP ํธ์ถ ํ status ๊ฐฑ์ (pending/success/failed). ์ฝ๋ ๋ ๋ฒจ๋ก ํ ๋ฒ: saveProductionState + stagingRepo.save๊ฐ ํ ํธ๋์ญ์ , @Scheduled drain์ด ๋ฐ๊นฅ.
์ฑ์ : ๊ธฐ์ ๋ช ๋ฃ์ฑ โ ๋ฐ์ค ์๋ ๊ฐ๋ก ์์คํ ์ ๊ทธ๋ฆด ์ ์๋์ง, ํธ๋์ญ์ ๊ฒฝ๊ณ๊ฐ ์ ํํ ์ด๋์ธ์ง ์์ผ๋ก ์ง๋์ง. ์ค๊ณ๋ฅผ ๋ง์ด ์๋๋ผ ๊ทธ๋ฆผ์ผ๋ก ๊ณต์ ํ๋ ํ์ ๋ฅ๋ ฅ.
- ๋ฐ์ค๋ AโBโC๋ก ๋จ์ํ๊ฒ. ํ์ดํ์ 'sync'/'async' ๋ผ๋ฒจ๋ง ์ถ๊ฐ
- 'no external call in this tx' โ ๊ฒฝ๊ณ์ ์ ์์ผ๋ก ์ง์ผ๋ฉฐ ๋งํ๊ธฐ
- postDate๋ฅผ ์ ์ฅ ์์ ์ ์ฐ๋ ์ด์ (์์ ์ผ ๋ณด์กด)๋ฅผ ๊ทธ๋ฆผ์ ๋ฏธ๋ฆฌ ํ์ โ ๋ค์ ์ง๋ฌธ ๋ฐฉ์ด
- ์ค๊ฐ์ 'Does this picture make sense so far?'๋ก ๋ผ์ด๋ค ํ ์ฃผ๊ธฐ
๐ฃ ์ด ์คํ ์ด์ง ์ฌ๋ ๋ฌธ์ฅโLet me draw the before and after โ two writes were in one transaction, ours and theirs.โ
checking microphoneโฆ
- 28-40๋ถThe Hard Decisions & Trade-offs
๊ฒฐ์ 1: ํธ๋์ญ์ ๋ถ๋ฆฌ(1์ฐจ ์์ )์์ ์ ๋ฉ์ถ์ง ์์๋ โ ๋กค๋ฐฑ์ ์ฌ๋ผ์ก์ง๋ง ๋๊ธฐ ERP ํธ์ถ์ด ํผํฌ ์๊ฐ UI ํ์ ์ ๋ฐํด์ ํธ์ถ ์์ฒด๋ฅผ ์ ์ฅ ๊ฒฝ๋ก์์ ๋นผ๋(2์ฐจ). ๊ฒฐ์ 2: eventual consistency ์์ฉ โ ํ๊ณ ์ชฝ postDate ์ฐ๋ ค๋ฅผ 'ERP ์ฒ๋ฆฌ ์์ ์ด ์๋๋ผ MES ์ ์ฅ ์์ ์ ์คํฌํ'๋ก ํด๊ฒฐ. ERP ํ ๋งค๋์ ์ 30๋ถ ๋ํ๋ก ํฉ์, ๋จ๋ ๊ฒฐ์ ์๋. ํธ๋ ์ด๋์คํ 4๊ฐ๋ฅผ ๋ฌป๊ธฐ ์ ์ ๋จผ์ : ์ต๋ 1๋ถ ์ง์ฐ, ๋น ํด๋ง ๋น์ฉ, ์คํจ ํ ์๋ ์ฌ์๋, ์์ ๋๊ธฐ๋ฉด postDate drift.
์ฑ์ : ํธ๋ ์ด๋์คํ ์ ์ง์ฑ + ์ฒซ ์๋ฆฌ ์ฌ๊ณ โ Opendoor๊ฐ ๊ฐ์ฅ ๊น๊ฒ ๋ณด๋ ๊ตฌ๊ฐ. ๋จ์ ์ ์ค์ค๋ก ๋จผ์ ๋งํ๋์ง, ๊ฒฐ์ ๊ทผ๊ฑฐ๊ฐ ํจํด ์ด๋ฆ์ด ์๋๋ผ ์๋ฆฌ(๊ฒฝ๊ณ, ์ผ๊ด์ฑ ๋ชจ๋ธ)์ธ์ง.
- ํธ๋ ์ด๋์คํ๋ ์ง๋ฌธ ๋ฐ๊ธฐ ์ ์ ๋จผ์ ๊น๋ค: 'ERP now lags the floor by up to a minute'
- 'I went to the ERP team manager first, CC'd my manager' โ ๋จ๋ ํ๋ ์ด ์๋์ ๋ช ์
- ๋ฒ์ฆ์๋ ๊ธ์ง: 'outbox pattern'์ด๋ ๋จ์ด๋ณด๋ค ๋์ ์ค๋ช ์ด ๋จผ์ . ์ด๋ฆ์ ๋งจ ๋ง์ง๋ง์
- ์ 2๋จ๊ณ๋ก ๊ฐ๋์ง ์์งํ๊ฒ โ ์ฒ์๋ถํฐ ์๋ฒฝํ์ง ์์๋ค๋ ๊ฒ ์คํ๋ ค ์ ๋ขฐ ์ ํธ
๐ฃ ์ด ์คํ ์ด์ง ์ฌ๋ ๋ฌธ์ฅโThe hard part wasn't the code โ it was accepting eventual consistency on financial data.โ
checking microphoneโฆ
- 40-46๋ถWhat I'd Do Differently
๋ฉด์ ๊ด์ด ๋ฌป๊ธฐ ์ ์ ํ๊ณ ๋ฅผ ๋จผ์ : ์ฒ์๋ถํฐ ๋น๋๊ธฐ๋ก ์ค๊ณํ์ด์ผ ํ๋ค โ 'don't keep one foot in the synchronous world.' ์ง๊ธ์ด๋ผ๋ฉด ๋ ๊ฐ์ง๋ฅผ ๊น๊ฒ: 1๋ถ ํด๋ง ๋์ CDC(Debezium)๋ก staging ํ ์ด๋ธ tail, ERP ํธ์ถ์ dedup key๋ก ๋ฉฑ๋ฑ์ฑ ๋ณด์ฅ(์ฌ์๋๊ฐ ์ด์ค ์ ๊ธฐ ๋ชป ๋ด๊ฒ). ๋๋จธ์ง(์ง์ ๋ฐฑ์คํ + dead-letter, ํํฐ์ ๋)๋ ํ ์ค์ฉ๋ง. ๋ง์ง๋ง์ Opendoor ๋๋ฉ์ธ ์ฐ๊ฒฐ: offer ์๋ฝ ์ offer + outbox row๋ฅผ ํ ํธ๋์ญ์ ์, ๊ฒฐ์ ํ์์์์ด ์๋ฝ์ ๋กค๋ฐฑํ๋ฉด ์ ๋๋ค.
์ฑ์ : ์๊ธฐ๋นํ + ์ฑ์ฅ ๊ฐ๋ฅ์ฑ โ ๋ณธ์ธ ์ค๊ณ์ ํ๊ณ๋ฅผ ์ค์ค๋ก ๋งํ๋์ง, ๊ฐ์ ์์ด ๋์ด์ด ์๋๋ผ ๊ตฌ์ฒด์ ์ธ์ง. ๊ฐ์ด ์ผํ๋ฉด ํผ๋๋ฐฑ์ ๋ฐ๋ ์ฌ๋์ธ์ง.
- ๊ฐ์ ์ 4๊ฐ ์ค 2๊ฐ๋ง ๊น๊ฒ(CDC, ๋ฉฑ๋ฑ์ฑ) โ 4๊ฐ ๋์ด์ ์ธ์ด ํฐ๊ฐ ๋๋ค
- Opendoor ์ฐ๊ฒฐ์ ํ ๋ฌธ์ฅ๋ง: 'same shape as an offer accept plus a payment worker'
- ํ๊ณ ๋ ๋ณ๋ช ์์ด: 'I'd do X' ํํ๋ก, 'we couldn't because...'๊ฐ ์๋๋ผ
๐ฃ ์ด ์คํ ์ด์ง ์ฌ๋ ๋ฌธ์ฅโLooking back, I'd ship the asynchronous design from day one, not as a second iteration.โ
checking microphoneโฆ
- 46-51๋ถResults & Metrics
์ซ์ ์ธ ๊ฐ๋ฅผ ์ ํํ ๋จ์๋ก: ํด๋น ์ด์ ํฐ์ผ ๊ฑฐ์ 0, SOP ์๋ฌ ์นดํ ๊ณ ๋ฆฌ ์ฝ 90% ๊ฐ์, ์ฒ๋ฆฌ ์๊ฐ 60% ๋จ์ถ. ์ถ์ฒ๋ฅผ ๋ฐ๋ก ๋ถ์ด๊ธฐ: Jira์ SOP ์๋ฌ ์นดํ ๊ณ ๋ฆฌ ์ ํ ํธ๋ ๋, 90%๋ ์นดํ ๊ณ ๋ฆฌ ์ ์ฒด ๊ธฐ์ค์ด๊ณ ํน์ ์ด์๋ ๊ฑฐ์ 0. ์ธก์ ๋ชป ํ ๊ฑด ๋ชป ํ๋ค๊ณ : ์ ํํ ์ง์ฐ ๋ถํฌ ๊ฐ์ ๊ฑด ์ ์๋ค.
์ฑ์ : ์ ์ง์ฑ โ ์ซ์๋ฅผ ์ด๋ป๊ฒ ์๋์ง ์ค๋ช ๊ฐ๋ฅํ์ง. ๋ถํ๋ฆฌ์ง ์๋์ง. ์ธก์ ์ ํ๊ณ๋ฅผ ์ค์ค๋ก ๋งํ๋ ์ฌ๋์ธ์ง.
- 'about ninety percent' โ ์ ํํ ์ฒ ํ์ง ๋ง๊ณ 'about' ์ ์ง, ์ถ์ฒ(Jira ํธ๋ ๋)๋ ํ ๋ฌธ์ฅ
- ์ซ์ ๋งํ๊ณ ๋ฉ์ถ๊ธฐ. ๋ถํ๋ฆฌ๋ ๋ถ์ฐ ์ค๋ช ์ด ์ ๋ขฐ๋ฅผ ๊น๋๋ค
- 90%์ 0์ ์ฐจ์ด๋ฅผ ์ค์ค๋ก ๊ตฌ๋ถํด์ ๋งํ๋ฉด(ํน์ ์ด์ vs ์นดํ ๊ณ ๋ฆฌ) ์ ์ง์ฑ ๊ฐ์ฐ์
๐ฃ ์ด ์คํ ์ด์ง ์ฌ๋ ๋ฌธ์ฅโSpecific-issue tickets dropped to near zero โ about ninety percent off the whole category.โ
checking microphoneโฆ
- 51-60๋ถTheir Digging Questions
์์ 8๋ฌธ์ ์ด๋ฏธ ์ค๋น๋จ(followUps): ์๋ ํธ๋์ญ์ ๊ตฌ์กฐ / ๋ฐ๊ฒฌ ๊ฒฝ์ / ์ 1์ฐจ์์ ์ ๋ฉ์ท๋ / eventual consistency ๋ฐ๋ / 90% ์ธก์ ๋ฐฉ๋ฒ / ๋ฐฐ์น ์คํจ ์ ๋กค๋ฐฑ ํ๋ / ERP ๊ณ์ฝ์ ๋จ๋ ์ผ๋ก ๋ฐ๊ฟจ๋ / ํ๊ณ . ๋ชจ๋ฅด๋ฉด 'I didn't measure that, but here's how I'd find out.' ๋ฒ์๊ฐ ๋์ด์ง๋ฉด ๋ณด์กฐ ์คํ ๋ฆฌ๋ก ํผ๋ฒ: ์ฃ์ง ์ค๊ณ โ gateway, ๋ง์ผ๋ณ ๊ท์น โ multi-plant, ์ค๋ณต ๊ฒ์ฆ โ validation. ๋์ ์ญ์ง๋ฌธ 1๊ฐ.
์ฑ์ : ์๋ฐ ์ ์ผ๊ด์ฑ โ ํ๊ณ ๋ค์๋ก ๋ํ ์ผ์ด ๊น์ด์ง๋์ง ํ๋ค๋ฆฌ๋์ง. ๋ชจ๋ฅด๋ ๊ฒ์ ์์งํ์ง. ์ฆ์์์ ๊ฐ์ด ์ฌ๊ณ ํ ์ ์๋ ๋๋ฃ์ธ์ง.
- ๋ต์ ์ธ์ฐ์ง ๋ง๊ณ ๊ตฌ์กฐ๋ก: ์ฆ์โ๊ฒฝ๊ณโ๋ถ๋ฆฌโ๋น๋๊ธฐโpostDateโ์ซ์ ์์๋ง ๊ธฐ์ต
- ๋ชจ๋ฅด๋ ์ซ์๋ ์ฆ์ ์ถ์ ๊ธ์ง โ '์ด๋ป๊ฒ ์ธก์ ํ ์ง'๋ก ๋ตํ๊ธฐ
- ๋ฒ์ ๋ํ๋ฉด ํ ์ค ํฐ์ ๋ก ํผ๋ฒ: 'I hit a similar boundary problem in our gateway...'
- ์ญ์ง๋ฌธ ์ค๋น: 'How does Opendoor handle the offer-accept-to-payment boundary today?'
๐ฃ ์ด ์คํ ์ด์ง ์ฌ๋ ๋ฌธ์ฅโThat's the core of it โ happy to go deeper anywhere you'd like.โ
checking microphoneโฆ
๐ Practice run โ ๋งํ๊ณ , ์ฑ์ ๋ฐ์๋ผ
์ ๋ฐ๋ถ๋๋ก (์ ์ฒด 60๋ถ์ด๋ , ํ ์คํ ์ด์ง๋ ) ์์ด๋ก ๋ด๋ ์ด์ โ ์ ์งํ๋ฉด ์๋ ์ ์ฌ โ ์ฑ์ . ์ฌ๋ฌ ๋ฒ ๋์ด์ ๋ น์ํด๋ ์ด์ด๋ถ๋๋ค. ์ ์ฌ๊ฐ ์ข ํ๋ ค๋ ๊ด์ฐฎ์ โ ๋ด์ฉ์ผ๋ก ์ฑ์ ํ๋ค.
์ต์ 1๋ถ์ฏค์ ๋งํด์ผ ์ฑ์ ํ ์ ์์ด
์์ฌ ๋ณด๊ฐ: ERP-MES ์คํ ๋ฆฌ ยท STAR (impact) ยท ํผ๋ฒ ์นด๋: gateway, multi-plant, validation