ข้าม​ไป​ยัง​เนื้อหา

Dogfooding

“กิน​อาหาร​หมา​ของ​ตัวเอง” — ใช้​ผลิตภัณฑ์​ที่​คุณ​สร้าง​ขึ้น​เอง

Dogfooding ย่อ​มา​จาก​สำนวน “eating your own dog food” หมาย​ถึง​แนว​ปฏิบัติ​ที่​ทีม​หรือ​องค์กร ใช้​ผลิตภัณฑ์​ของ​ตัวเอง ใน​การ​ทำงาน​จริง​ประจำ​วัน แทนที่​จะ​ปล่อย​ให้​มี​แต่​ลูกค้า​ภายนอก​เป็น​ผู้​ทดสอบ สำหรับ​นัก​พัฒนา​ซอฟต์แวร์ นั่น​หมาย​ถึง​การ​ทำงาน​กับ application ที่​ตน​สร้าง​ใน​ฐานะ​ผู้​ใช้​จริง หรือ​อย่าง​น้อย​ก็​ทำงาน​ใกล้​ชิด​กับ​คน​ที่​ใช้​มัน​ทุก​วัน

ที่มา​ของ​สำนวน​นี้​ย้อน​ไป​ถึง​โฆษณา​อาหาร​สุนัข Alpo ใน​ยุค 1970 ที่​ผู้นำ​เสนอ​อย่าง Lorne Greene ยืนยัน​ความ​มั่นใจ​ใน​สินค้า​ด้วย​การนำ​ไป​เลี้ยง​สุนัข​ของ​ตัวเอง แต่​คำ​ที่​ทำให้​สำนวน​นี้​ติดปาก​วงการ​เทคโนโลยี​มา​จาก Microsoft — ปี 1988 ผู้จัดการ Paul Maritz ส่ง​อีเมล​หัวข้อ “Eating our own Dogfood” ถึง Brian Valentine (test manager ของ Microsoft LAN Manager) ท้าทาย​ให้​เพิ่ม​การ​ใช้งาน​ผลิตภัณฑ์​ของ​บริษัท​เอง​ภายใน​ทีม ต่อ​มา​ช่วง​พัฒนา Windows NT (1991 เป็นต้น​มา) Dave Cutler ยืนกราน​ให้​ทีม​กว่า 200 คน​พัฒนา NT บน​เครื่อง​ที่​รัน NT daily build เอง จน​กลาย​เป็น​วัฒนธรรม​ที่​ฝัง​ลึก​ใน Microsoft ถึง​ขั้น​ตั้ง​ชื่อ internal test environment ว่า “Dogfood” ใน​ช่วง​ย้าย​ระบบ​ปี 1993–1996

แนวคิด​นี้​มี​มา​ก่อน​คำ​ศัพท์​เสีย​อีก Donald Knuth เขียน​ไว้​ใน​ปี 1989 ถึง​บทเรียน​จาก​การ​พัฒนา TeX ว่า​ผู้​ออกแบบ​ระบบ​ไม่​ควร​เป็น​แค่​ผู้​สร้าง แต่​ต้อง​เป็น “ผู้​ใช้งาน​ขนาด​ใหญ่​คน​แรก” และ​เป็น​ผู้​เขียน​คู่มือ​คน​แรก​ด้วย — หาก​ไม่​ได้​ลงมือ​ทำ​ทั้ง​สาม​บทบาท​นี้ “การ​ปรับปรุง​นับ​ร้อย​ครั้ง​คง​ไม่มี​วัน​เกิด​ขึ้น”

Dogfooding ให้​ประโยชน์​ทั้ง​ด้าน​การ​ตลาด​และ​ด้าน​เทคนิค ใน​มุม​การ​ตลาด แน่นอน​ว่า​มัน​ดู​ดี​กว่า​ที่​คุณ​และ​องค์กร​จะ​ใช้​เครื่องมือ​ของ​ตัวเอง​แทน​ของ​คู่แข่ง แต่ dogfooding ที่แท้​จริง​ต้อง​รวม​ถึง​การ​รับ​มา​ใช้​ตั้งแต่​เนิ่น ๆ และ​อย่าง​หนักหน่วง เพื่อ​ให้​ได้ feedback ที่​มี​ค่า​และ​แสดง​ศักยภาพ​ของ​ผลิตภัณฑ์​ต่อ​ตลาด ใน​มุม​เทคนิค นัก​พัฒนา​ที่​ใช้​ซอฟต์แวร์​ของ​ตัวเอง​ถูก​บังคับ​ให้​เห็น​กับ​ตา​ว่า​ประสบการณ์​ผู้​ใช้​เป็น​อย่างไร บ่อย​ครั้ง​นี่​เป็น​ประสบการณ์​ที่​เปิด​หู​เปิด​ตา จน​อด​สงสัย​ไม่​ได้​ว่า “ทำไม​ซอฟต์แวร์​ถึง​ทำงาน​แบบ​นี้ ถ้า​คุณ​กำลัง​พยายาม​จะ​ทำ​สิ่ง​นั้น?” ใน​หนังสือ The Inmates Are Running the Asylum Alan Cooper เขียน​ถึง​ปัญหา​ที่​เกิด​เมื่อ​นัก​เทคโนโลยี​ผู้​ตัดสิน​ใจ​ว่า​จะ​สร้าง​ผลิตภัณฑ์​อย่างไร หลุด​จาก​ความ​เข้าใจ​ผู้​ใช้​ปลายทาง

การ​ใช้​ซอฟต์แวร์​ของ​ตัวเอง ทั้ง​ลำพัง​และ​ร่วม​กับ​ผู้​ใช้​ปลายทาง​คน​อื่น กลาย​เป็น​วิธี​ที่​ดี​เยี่ยม​ใน​การ​ตัดสิน​ไม่​เพียง​ว่า​คุณ สร้าง​ของ​ถูก​วิธี​หรือ​ไม่ แต่​ยัง​รวม​ถึงว่า​คุณ กำลัง​สร้าง​ของ​ที่​ถูกต้อง​หรือ​เปล่า Dogfooding ทุก​วัน​นี้​เป็น​รูปแบบ​หนึ่ง​ของ alpha testing ที่​ทำ​โดย​คน​ที่​มี​บริบท​ลึก​ที่สุด​เกี่ยว​กับ​ระบบ

“ใคร​ก็ตาม​ที่​ไม่​ทำ​สิ่ง​นี้​จะ​ถูก​ไล่ออก ขอบคุณ​ครับ ขอ​ให้​เป็น​วัน​ที่​ดี!” — บันทึก​สั่ง​การ​ของ Jeff Bezos ราว​ปี 2002 ที่​บังคับ​ให้​ทุก​ทีม​ของ Amazon เปิดเผย​ข้อมูล​และ function ผ่าน service interface เท่านั้น ผลลัพธ์​คือ AWS และ​การ​ที่​ร้าน​หนังสือ​ออนไลน์​กลาย​เป็น​ผู้นำ​ด้าน cloud

ประโยชน์​ข้อ​หนึ่ง​ของ dogfooding ที่​ทำ​อย่าง​ถูกต้อง​คือ หาก​คุณ​ตั้งใจ​จะ​เปิด API ภายใน​สู่​สาธารณะ มัน​จะ ใช้งาน​ได้​จริง เพราะ​ทีม​ของ​คุณ​ได้​ใช้​มัน​เอง​มา​ก่อน​แล้ว — เช่น​เดียว​กับ​ที่ Mike Bland เชื่อม​โยง​แนวคิด​นี้​เข้า​กับ unit testing culture ไว้​ใน​บทความ​บน martinfowler.com ว่า การ​เขียน code ที่​ต้อง ใช้ code ของ​ตัวเอง​ก่อน (เช่น​เขียน test ที่​เรียก API ที่​จะ​ออกแบบ) มัก​นำ​ไป​สู่ design ที่​อ่าน​ง่าย ดูแล​ง่าย และ debug ง่าย​กว่า

Dogfooding ที่​ได้​ผล​ไม่ใช่​แค่ “สั่ง​ให้​พนักงาน​ใช้​ของ​บริษัท” แล้ว​จบ — Microsoft.com Engineering เคย​อธิบาย​ไว้​ว่า​กระบวนการ​นี้​ต้อง​มี​การ​วางแผน​เป็น​เฟส ไม่ใช่​โยน​ของ​ออก​ไป​แล้ว​ดู​ว่า​จะ​เกิด​อะไร​ขึ้น:

  1. Technical Planning — ระบุ gap ใน​เครื่องมือ/workflow ปัจจุบัน แล้ว​ดู​ว่า feature ใหม่​ของ build ที่​กำลัง​พัฒนา​ช่วย​ปิด gap นั้น​ได้​หรือ​ไม่ ตั้ง​เป้าหมาย​ร่วม​กัน​ระหว่าง​ทีม​ผลิตภัณฑ์​กับ​ทีม​ที่​จะ dogfood
  2. Incubation — ทดลอง feature ใหม่​ใน lab environment ที่​ควบคุม​ได้​ก่อน เพื่อ​ประเมิน​ศักยภาพ​และ​ความ​เสี่ยง​เบื้องต้น
  3. Evaluation — deploy บน production infrastructure จริง​ของ​ทีม​ที่ dogfood เอง ทำงาน​ร่วม​กับ​ทีม​ผลิตภัณฑ์​เพื่อ​เคลียร์ blocking bug พร้อม​เก็บ feedback ระหว่าง​ที่​ยัง​ใช้งาน​อยู่
  4. Deployment — ขยาย​ไป​สู่​ทุก production scenario ที่​เกี่ยวข้อง โดย​ไม่​กระทบ​ความ​พร้อม​ใช้งาน​ของ​ระบบ​ที่​พึ่งพา​อยู่

ควบคู่​กับ​เฟส​ข้าง​ต้น มี​แนวทาง​ปฏิบัติ​ที่​ทีม​ส่วน​ใหญ่​ใช้​ร่วม​กัน:

  • แจก build ล่าสุด/prototype ให้​พนักงาน​ก่อน​ลูกค้า — หลาย​บริษัท​เปิด internal “ring” หรือ “channel” (เช่น Dogfood ring, Insider ring, Broad release) ให้​พนักงาน​อาสา​สมัคร​ใช้ build ที่​ใหม่​กว่า​ที่​ลูกค้า​เห็น
  • สร้าง​ช่อง​ทาง feedback ที่​ตรง​ถึง​ทีม​ผลิตภัณฑ์ — bug หรือ​ความ​หงุดหงิด​ที่​พบ​ระหว่าง​ใช้งาน​จริง​ต้อง​ถูก log และ​ส่ง​กลับ​ไป​ยัง​ทีม​ที่​สร้าง feature นั้น​อย่าง​รวดเร็ว ไม่ใช่​หาย​ไป​ใน​กอง​งาน
  • ใช้​ใน​สภาพ​งาน​จริง ไม่ใช่ scenario สังเคราะห์ — ประโยชน์​หลัก​ของ dogfooding คือ​มัน​สร้าง​เงื่อนไข load และ use-case ที่ lab แยก​ต่างหาก​สร้าง​ไม่​ได้ ดังนั้น​ต้อง​ปล่อย​ให้​ระบบ​เจอ workload จริง​ของ​ทีม​เอง
  • วัดผล​การ​รับ​มา​ใช้ (adoption) — ติดตาม​ว่า​ทีม​ใช้ feature ใหม่​มาก​แค่​ไหน เพื่อ​รู้​ว่า dogfooding เกิด​ขึ้น​จริง​หรือ​เป็น​แค่นโยบาย​บน​กระดาษ
  • อย่า​ใช้​แทนที่ beta testing หรือ user research ทั้งหมด — dogfooding ควร​เป็น​ชั้น​หนึ่ง​ของ​การ​ทดสอบ ไม่ใช่​ชั้น​เดียว เพราะ​พนักงาน​ภายใน​มัก​ไม่​ได้​เป็น​ตัวแทน​ความ​หลากหลาย​ของ​ผู้​ใช้​จริง
flowchart LR
    Plan[Technical Planning ระบุ gap] --> Incubate[Incubation ทดลองใน lab]
    Incubate --> Eval[Evaluation ใช้จริงบน production internal]
    Eval --> Feedback[Feedback กลับทีมผลิตภัณฑ์]
    Feedback -->|แก้ไข| Eval
    Feedback -->|พร้อมแล้ว| Deploy[Deployment ขยายสู่ทุกทีม]
    Deploy --> Beta[Beta ภายนอกและผู้ใช้จริง]

สมมติ​ทีม​กำลัง​สร้าง NotificationApi ที่​ตั้งใจ​จะ​เปิด​ให้​ลูกค้า​ภายนอก​เรียก​ใช้​ใน​อนาคต วิธี dogfood ที่​ตรง​ไป​ตรง​มา​ที่สุด​คือ​บังคับ​ให้​ระบบ​ภายใน​ของ​บริษัท​เอง เช่น status-page service ที่​ต้อง​แจ้ง​เตือน​ทีม on-call ใช้ client library ตัว​เดียวกัน​กับ​ที่​จะ​ส่ง​มอบ​ให้​ลูกค้า แทนที่​จะ​เขียน integration เฉพาะ​กิจ​แยก​ไว้

// NotificationApiClient.cs — library เดียวกับที่จะเปิดให้ลูกค้าภายนอกใช้
public interface INotificationApiClient
{
Task SendAlertAsync(string channel, string message, CancellationToken ct);
}
public sealed class NotificationApiClient : INotificationApiClient
{
private readonly HttpClient _http;
public NotificationApiClient(HttpClient http) => _http = http;
public async Task SendAlertAsync(string channel, string message, CancellationToken ct)
{
var payload = new { channel, message };
var response = await _http.PostAsJsonAsync("/v1/alerts", payload, ct);
response.EnsureSuccessStatusCode();
}
}
// StatusPageAlertSender.cs — ทีม status-page ภายในบริษัท "dogfood" API ตัวเดียวกับลูกค้า
// แทนที่จะเขียน integration ลัด ๆ เฉพาะกิจแยกไว้
public sealed class StatusPageAlertSender
{
private readonly INotificationApiClient _notifications;
public StatusPageAlertSender(INotificationApiClient notifications) => _notifications = notifications;
public Task NotifyOnCallAsync(string incidentSummary, CancellationToken ct) =>
// ใช้ endpoint และ DTO เดียวกับที่เอกสารสาธารณะอ้างถึง
// ถ้า API ใช้งานยากหรือ error message ไม่ชัด ทีมภายในจะเจอปัญหานี้ก่อนลูกค้า
_notifications.SendAlertAsync("on-call", incidentSummary, ct);
}

ผลลัพธ์​คือ หาก SendAlertAsync ออกแบบ error handling แย่ ทีม status-page ที่ on-call กลาง​ดึก​จะ​เจอ​ปัญหา​นั้น​เอง​ก่อน​ใคร และ​รายงาน​กลับ​ทีม API ทันที — คนละ​แบบ​กับ​การ​ปล่อย​ให้​ลูกค้า​ราย​แรก​ที่ integrate เป็น​คน​เจอ

การ dogfood ยัง​ใช้ได้​กับ​การ rollout เชิง infrastructure เช่น​การ​จัด “ring” ของ​การ​เปิด​ใช้ feature ก่อน​กระจาย​สู่​ลูกค้า​ทั้งหมด:

# feature-flags.yaml — เปิด feature ใหม่ให้พนักงานภายใน (dogfood ring) ก่อนลูกค้า
features:
new-checkout-flow:
rings:
- name: dogfood # พนักงานทั้งหมด ใช้ทุกวันในงานจริง
rollout: 100
- name: insiders # ลูกค้าที่สมัครใจทดลองก่อนใคร
rollout: 25
- name: general # ลูกค้าทั่วไป เปิดหลังผ่าน dogfood + insiders แล้ว
rollout: 0

ประโยชน์

  • พบ bug และ​ปัญหา UX ก่อน​ลูกค้า — ทีม​ที่​ใช้งาน​จริง​ทุก​วัน​เจอ edge case ที่ synthetic test มอง​ข้าม
  • สร้าง feedback loop ที่​ตรง​และ​เร็ว — คน​ที่​พบ​ปัญหา​อยู่​ใกล้​คน​ที่​แก้​ได้ ไม่​ต้อง​ผ่าน​ชั้น support หลาย​ชั้น
  • พิสูจน์​ว่า API/ผลิตภัณฑ์​ใช้งาน​ได้​จริง​ก่อน​เปิด​สู่​สาธารณะ — ดัง​กรณี Amazon ที่​บังคับ​ให้​ทุก​ทีม​สื่อสาร​ผ่าน service interface จน​กลาย​เป็น​รากฐาน​ของ AWS
  • ทดสอบ​ภาย​ใต้ load และ​เงื่อนไข​จริง​ที่ lab จำลอง​ไม่​ได้ — Oracle รัน internal infrastructure กว่า 42,000 server บน Oracle Linux เป็น​สนาม​ทดสอบ​จริง​ของ​ตัวเอง
  • เสริมสร้าง​ความ​น่า​เชื่อถือ​ทั้ง​ภายใน​และ​ภายนอก​องค์กร — พนักงาน​ที่​เชื่อ​มั่น​ใน​สินค้า​ตัวเอง​สื่อสาร​สิ่ง​นั้น​ออก​ไป​สู่​ตลาด​ได้​เป็น​ธรรมชาติ

ข้อ​ควร​ระวัง

  • พนักงาน​ภายใน​ไม่ใช่​ตัวแทน​ของ​ผู้​ใช้​จริง​เสมอ​ไป — พวก​เขา​มี​บริบท ความ​รู้ และ​ความ​อดทน​ต่อ friction ที่​สูง​กว่า​ลูกค้า​ทั่วไป จึง​อาจมอง​ข้าม​ปัญหา​การ​ใช้งาน​ที่​ผู้​ใช้​ทั่วไป​เจอ
  • build ที่​ยัง​ไม่​เสถียร​อาจ​สร้าง productivity loss จริง — การ​บังคับ​ใช้ pre-release build ใน​งาน​สำคัญ​มี​ความ​เสี่ยง ต้อง​มี​สมดุล​ระหว่าง​คุณค่า​ที่​ได้​กับ​ความ​เจ็บ​ปวด​ที่​เกิด (ดัง​ที่ Microsoft.com Engineering อธิบาย​ไว้​ว่า​ความ​เจ็บ​ปวด​นี้​ควร​ลด​ลง​เมื่อ build ขยับ​จาก beta ไป​สู่ RC)
  • ไม่​ควร​ใช้​แทนที่ beta testing หรือ user research กับ​ผู้​ใช้​จริง​ทั้งหมด — เพราะ combination การ​ใช้งาน​จริง​ของ​ลูกค้า​มี​ความ​หลากหลาย​เกิน​กว่า​ที่ dogfooding ภายใน​จะ​ครอบคลุม​ได้
  • อาจ​กลาย​เป็น​ข้อ​อ้าง​ของ Not Invented Here syndrome — หาก​ทีม​ยึด​ติด​กับ​การ​ใช้​เครื่องมือ​ของ​ตัวเอง​จน​ปฏิเสธ​โซลูชัน​ภายนอก​ที่​ดี​กว่า​โดย​ไม่มี​เหตุผล​เชิง​เทคนิค​รองรับ
  • การ​บังคับ​ด้วย​วัฒนธรรม​กดดัน​มาก​เกิน​ไป​อาจ​สร้าง​ผล​ข้าง​เคียง — คำ​สั่ง​แบบ “ใคร​ไม่​ทำ​จะ​ถูก​ไล่ออก” ได้​ผล​ใน​บริบท​หนึ่ง แต่​ก็​เสี่ยง​สร้าง​วัฒนธรรม​ที่​พนักงาน​รายงาน feedback ไม่​ตรง​ความ​จริง​เพราะ​กลัว​ถูก​มอง​ว่า​ไม่​ทำตามนโยบาย