Namespaces & Holdouts
ทำไม experiment overlap ถึงอันตราย
หัวข้อที่มีชื่อว่า “ทำไม experiment overlap ถึงอันตราย”เมื่อคุณรัน experiment สองอันพร้อมกันที่กระทบหน้าหรือ user journey เดียวกัน ผู้ใช้อาจถูกกำหนดให้อยู่ในทั้งสองอัน ทำให้เกิด interaction effects — ผลของ experiment B ปนเปื้อนจาก treatment ของ experiment A ข้อมูลดูเหมือนสะอาดแต่ข้อสรุปผิด
GrowthBook แก้ปัญหานี้ด้วย namespaces
Namespaces
หัวข้อที่มีชื่อว่า “Namespaces”namespace คือ bucketing pool ที่ใช้ร่วมกัน ทุก experiment ที่กำหนดให้กับ namespace จะตัดแบ่ง traffic range 0–1 ออกเป็นส่วนที่ไม่ซ้อนทับกัน user ที่ตกที่ตำแหน่ง 0.42 ใน namespace จะอยู่ได้เพียง experiment ที่เป็นเจ้าของ slice นั้น — ไม่มีวันอยู่สองอันพร้อมกัน
การสร้าง namespace
หัวข้อที่มีชื่อว่า “การสร้าง namespace”- ใน GrowthBook sidebar ไปที่ Settings → Namespaces
- คลิก Add Namespace
- ตั้งชื่อที่มีความหมาย เช่น
checkout-flow - คลิก Save
การกำหนด experiment ให้กับ namespace
หัวข้อที่มีชื่อว่า “การกำหนด experiment ให้กับ namespace”- เปิด experiment ที่ต้องการกำหนด
- คลิก Edit ในส่วน targeting ของ experiment
- ใต้ Namespace เลือก namespace จาก dropdown
- ตั้ง Range — slider สองอันที่กำหนดจุดเริ่มต้นและจุดสิ้นสุดของ traffic slice ที่ experiment นี้เป็นเจ้าของ (เช่น 0.00–0.50)
- คลิก Save
เคล็ดลับ: experiment สองอันใน namespace เดียวกันที่มี range ไม่ซ้อนทับกันจะไม่มีวัน share user กัน experiment ใน namespace ต่างกัน คือ bucketing pool อิสระและสามารถซ้อนทับกันได้อย่างเสรี
Holdout groups
หัวข้อที่มีชื่อว่า “Holdout groups”holdout คือกลุ่ม user ที่ถูกแยกออกจาก experiment ทั้งหมดใน namespace โดยตั้งใจ ในช่วงเวลาที่กำหนด เมื่อ holdout สิ้นสุด คุณเปรียบเทียบ metrics ของกลุ่ม holdout กับประชากรส่วนที่เหลือ เพื่อวัด ผลกระทบสะสมระยะยาว ของ experiment ทั้งหมดที่พวกเขาพลาดไป
หากไม่มี holdout ผลลัพธ์ของ experiment สะท้อนแค่ผลกระทบระยะสั้น แต่ด้วย holdout คุณตอบได้ว่า “ฟีเจอร์ทั้งหมดที่เรา ship ในช่วงนี้ส่งผลต่อ metrics จริงหรือเปล่า?”
การสร้าง holdout experiment
หัวข้อที่มีชื่อว่า “การสร้าง holdout experiment”GrowthBook จำลอง holdout เป็น experiment ปกติที่กลุ่ม control ไม่ได้รับ treatment และถูกแยกออกจาก experiment อื่นๆ ทั้งหมดใน namespace
- ไปที่ Experiments → Add Experiment และเลือก Holdout
- กำหนดให้กับ namespace และให้ range ที่กว้าง เช่น 0.90–1.00 (10% บนสุดของ traffic กลายเป็น holdout)
- ตั้งระยะเวลา (เช่น 90 วัน)
- คลิก Start Experiment
experiment ใดๆ ใน namespace เดียวกันที่ ไม่ ซ้อนทับกับ 0.90–1.00 จะไม่มีวันถึง holdout users
// SDK-side: namespaces are transparent.
// You configure them in the GrowthBook UI;
// the SDK assignment hash already respects namespace ranges.
const gb = new GrowthBook({
apiHost: 'https://cdn.growthbook.io',
clientKey: 'sdk-YOUR_DEV_KEY',
attributes: { id: 'user-123' },
});
await gb.init({ timeout: 2000 });
// This assignment will NEVER conflict with another
// experiment in the same namespace that owns a
// non-overlapping range.
const result = gb.runInlineExperiment({
key: 'checkout-cta',
variations: [0, 1],
});
console.log('Variation:', result.value);ข้อแลกเปลี่ยน
หัวข้อที่มีชื่อว่า “ข้อแลกเปลี่ยน”| ตัวเลือก | Benefit | Cost |
|---|---|---|
| ใช้ Namespace แยก experiment | ป้องกัน user เจอหลาย experiment ที่ conflict กัน | ลด traffic ที่ใช้ได้ต่อ experiment |
| ไม่ใช้ Namespace | ได้ traffic เต็มต่อ experiment | เสี่ยง experiment ปนกันโดยไม่รู้ตัว |
ข้อผิดพลาดที่พบบ่อย
หัวข้อที่มีชื่อว่า “ข้อผิดพลาดที่พบบ่อย”- รัน experiment ที่แก้ layout เดียวกันในสอง experiment คนละ namespace โดยไม่ตั้งใจ ทำให้ผลปนกัน
- ไม่ตั้ง holdout group ทำให้วัด long-term impact ของ feature ทั้งหมดไม่ได้
- ลืมว่า namespace แบ่ง traffic แบบ fixed — เปลี่ยนกลาง experiment ทำให้ sample เพี้ยน
💡 ตัวอย่างจากของจริง
Facebook ใช้ namespace/layer system ที่แนวคิดคล้ายกันเพื่อรันหลายพัน experiment พร้อมกันโดยไม่ให้ผลกระทบกัน