Community

๐Ÿงช ์šฐ๋ฒ„์˜ ์ƒˆ๋กœ์šด ์‹คํ—˜ํ”Œ๋žซํผ ์šฐ๋ฒ„์—๋Š” ๋งŒ๋“ค์–ด์ง„์ง€ 7๋…„ ๋„˜์€ feature flagging๊ณผ A/B testing์„ ์ง€์›ํ•˜๋Š” Morpheus๋ผ๋Š” ์‹คํ—˜ ํ”Œ๋žซํผ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋งŒ๋“  ์ดํ›„๋กœ ์ง€๊ธˆ๊นŒ์ง€ ์šฐ

๐Ÿงช ์šฐ๋ฒ„์˜ ์ƒˆ๋กœ์šด ์‹คํ—˜ํ”Œ๋žซํผ ์šฐ๋ฒ„์—๋Š” ๋งŒ๋“ค์–ด์ง„์ง€ 7๋…„ ๋„˜์€ feature flagging๊ณผ A/B testing์„ ์ง€์›ํ•˜๋Š” Morpheus๋ผ๋Š” ์‹คํ—˜ ํ”Œ๋žซํผ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋งŒ๋“  ์ดํ›„๋กœ ์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฒ„๋Š” ํฌ๊ฒŒ ์„ฑ์žฅ์„ ํ–ˆ๊ณ , 2020๋…„ ์ดˆ์— ํ”Œ๋žซํผ์„ ๋‹ค์‹œ ์‚ดํŽด๋ณด๋‹ˆ ๋งŽ์€ ์‹คํ—˜๋“ค์ด ์‹คํ—˜์ค‘์— ๋ฌธ์ œ๋“ค์ด ์ƒ๊ฒจ์„œ ๋‹ค์‹œ ์ง„ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. Morpheus๊ฐ€ ๋” ์ด์ƒ ์šฐ๋ฒ„์˜ ๋‹ค์–‘ํ•œ ์œ ์ฆˆ ์ผ€์ด์Šค๋ฅผ ์ปค๋ฒ„ํ•˜์ง€ ๋ชปํ•˜๋‹ค๋ณด๋‹ˆ ์šฐ๋ฒ„๋Š” ์ƒˆ๋กœ์šด ์‹คํ—˜ํ”Œ๋žซํผ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋งŒ๋“ค๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฒ„๊ฐ€ ์ƒˆ๋กœ์šด ์‹คํ—˜ํ”Œ๋žซํผ์„ ์–ด๋–ค ๋ชฉํ‘œ๋กœ ๋งŒ๋“ค์—ˆ๊ณ , ์ฝ”์–ด ๊ธฐ๋Šฅ๋“ค์€ ๋ฌด์—‡์ธ์ง€ ๊ฐ„๋žตํ•˜๊ฒŒ ์š”์•ฝํ–ˆ์Šต๋‹ˆ๋‹ค. ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์›๋ฌธ์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”. โญ๏ธ ์ƒˆ๋กœ์šด ์‹คํ—˜ํ”Œ๋žซํผ์˜ ๋ชฉํ‘œ ์ƒˆ๋กœ์šด ์‹คํ—˜ํ”Œ๋žซํผ์€ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์‹คํ—˜๋“ค์„ ๋†’์€ ํ€„๋ฆฌํ‹ฐ๋กœ ๋น ๋ฅด๊ฒŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. - ๋†’์€ ํ€„๋ฆฌํ‹ฐ ์–ด๋–ค ์‹คํ—˜์„ ์„ค๊ณ„๋ฅผ ํ•˜๋˜, ์‹คํ—˜ ๊ฒฐ๊ณผ๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. - ๋†’์€ ์ƒ์‚ฐ์„ฑ ๋นŒ๋“œ/๋ฆด๋ฆฌ์ฆˆ ์‚ฌ์ดํด๊ณผ ์‹คํ—˜์„ decouplingํ•ด์„œ ๋ชจ๋ฐ”์ผ์˜ ๋ณต์žก์„ฑ์„ ์ค„์—ฌ์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ client์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์‹คํ—˜ํ”Œ๋žซํผ ๊ด€๋ จ interface๋ฅผ ๋” ๊ฐ„์†Œํ™” ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋ฐ”์ผ/๋ฐฑ์—”๋“œ์— ํŒŒํŽธํ™”๋˜์–ด์žˆ๋˜ configuration ํ”Œ๋žซํผ๋“ค๋„ ํ†ตํ•ฉํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ, ๊ธฐ์กด์—๋Š” ์‹คํ—˜์˜ ๋Œ€์ƒ์„ ์œ ์ €๋กœ๋งŒ ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ  ์ง€ํ‘œ๊ฐ€ ํ‘œ์ค€ํ™” ๋˜์–ด์žˆ์ง€ ์•Š์•„์„œ ์กฐ์ง๋“ค๋งˆ๋‹ค ๋‹ค๋ฅธ ์ง€ํ‘œ๋ฅผ ๋ด์„œ ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ ๋“ค์„ ํ•ด๊ฒฐํ•ด์„œ ์ƒ์‚ฐ์„ฑ์„ ๋†’ํ˜€์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. - ๋‹ค์–‘์„ฑ ์šฐ๋ฒ„์˜ ๋‹ค์–‘ํ•œ ์œ ์ฆˆ ์ผ€์ด์Šค๋ฅผ ์ปค๋ฒ„ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ, ๋ชจ๋ฐ”์ผ, ์›น ๋“ฑ ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์—์„œ ์‹คํ—˜์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ–ˆ๊ณ , holdout์ด๋‚˜ ๋‹ค๋ฅธ ์‹คํ—˜์˜ ์˜์กด์ ์ธ ์‹คํ—˜๋“ฑ ๊ณ„์ธต์ ์ธ ์‹คํ—˜๋„ ์ง€์›์ด ๋˜์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. โš™๏ธ ์•„ํ‚คํ…์ฒ˜ 1. ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ™œ์šฉํ•ด์„œ ์‹คํ—˜๊ณผ decoupling์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’๋งŒ overrideํ•˜๋ฉด ์ƒˆ๋กœ์šด ์‹คํ—˜๋„ ์‰ฝ๊ฒŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ์— ์ถ”๊ฐ€์ ์ธ ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ํ•„์š” ์—†์–ด์กŒ์Šต๋‹ˆ๋‹ค. 2. Flipr๋ผ๋Š” backend configuration ์‹œ์Šคํ…œ ์œ„์— ์‹คํ—˜ํ”Œ๋žซํผ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์„ ๋‘ฌ์„œ, ์‹คํ—˜ํ”Œ๋žซํผ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์ด ๋” ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ–์œผ๋ฉด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด backend ํ”Œ๋žซํผ ์œ„์— ์‹คํ—˜ํ”Œ๋žซํผ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ธฐ๋Šฅ์„ ๋’€๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ์‹œ์Šคํ…œ์„ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 3. randomization์ด๋‚˜, treatment plan์„ ๊ฐœ์„ ํ•ด์„œ ์—ฌ๋Ÿฌ ์‹คํ—˜๋“ค์ด ํ•˜๋‚˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ง„ํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. 4. ํŒŒ๋ผ๋ฏธํ„ฐ๋งˆ๋‹ค ์ œ์•ฝ์กฐ๊ฑด๋“ค์„ ๋‘ฌ์„œ ๋” ๋ณต์žกํ•œ ์‹คํ—˜๋“ค์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค (ex. ํŠน์ • ์‹คํ—˜์— ์˜์กด์ ์ธ ์‹คํ—˜, ์šฐ๋ฒ„ ์ „์‚ฌ ๋‹จ์œ„์˜ holdout์ด๋‚˜ ์กฐ์ง ๋‹จ์œ„์˜ holdout). 5. ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋” generalizeํ•ด์„œ randomization unit์ด ๋ฐ”๋€Œ์–ด๋„ ์ถ”๊ฐ€์ž‘์—… ์—†์ด ํŒŒ์ดํ”„๋ผ์ธ์ด ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. 6. UI์—์„œ๋‚˜ DS๋ถ„๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” jupyter notebook์—์„œ ๊ฐ™์€ Python ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ง€ํ‘œ ํ†ต์ผํ™”๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค. 7. fallback ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•ด์„œ๋„ ์ž˜ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๊ณ  ๊ทธ ์™ธ์˜ SDK ์•ˆ์ •์„ฑ์„ ์ฑ™๊ฒผ์Šต๋‹ˆ๋‹ค (ex. default value๋ฅผ ํ•ญ์ƒ ๊ฐ–๊ณ  ์žˆ์–ด์„œ ๋„คํŠธ์›Œํฌ fail์—๋„ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ, ์‹คํ—˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉ ์ „์— ์ž๋™์œผ๋กœ ๋กœ๊น…ํ•ด์„œ ์ˆ˜๋™ ๋กœ๊น…์œผ๋กœ ์ธํ•œ ๋ฒ„๊ทธ๋“ค ์—†์•ฐ, ๋“ฑ) ์„œ๋น„์Šค๊ฐ€ ์„ฑ์žฅํ• ์ˆ˜๋ก ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค์ด ์ƒ๊ธฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์‹คํ—˜ํ”Œ๋žซํผ๋„ ์„œ๋น„์Šค๊ฐ€ ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ๊ทธ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์‹คํ—˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณ„์† ๊ณ ๋„ํ™”๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์•Œ๋ฆผ

์•Œ๋ฆผ์ด ์—†์Šต๋‹ˆ๋‹ค