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

Pair Programming

สอง​คน​ทำงาน​ร่วม​กัน​บน​งาน​เขียน​โปรแกรม​ชิ้น​เดียว

Pair Programming หมาย​ถึง​แนว​ปฏิบัติ​ที่​มี​คน​สอง​คน​ทำงาน​ร่วม​กัน​บน​งาน​เขียน​โปรแกรม​ชิ้น​เดียว บน​เครื่อง​เดียว จอ (หรือ keyboard) เดียวกัน มัน​เป็น​แนว​ปฏิบัติ​ของ Extreme Programming (XP) และ​ถูก​ใช้​โดย​ทีม​พัฒนา​ซอฟต์แวร์​แบบ agile (และ​ไม่ agile) จำนวน​มาก แม้​ใน​สภาพ​แวดล้อม​ดั้งเดิม​ที่​การ pair ไม่ใช่​กิจวัตร​ประจำ​วัน มัน​ก็​ยัง​เป็น​วิธี​ที่​หยิบ​มา​ใช้​เสมอ​เมื่อ​ใคร​สัก​คน​เผชิญ​กับ bug ปัญหา หรือ​การ​ตัดสิน​ใจ​ด้าน design ที่​ยาก​หรือ​น่า​หงุดหงิด ทุก​ครั้ง​ที่​โปรแกรมเมอร์​คน​หนึ่ง​เรียก​อีก​คน​มา​ช่วย​ดู​สิ่ง​ที่​ตน​กำลัง​ทำ นั่น​คือ​การ​ทำ pair programming ใน​รูปแบบ​ย่อ ๆ อยู่​แล้ว

Wikipedia อธิบาย​กลไก​พื้นฐาน​ไว้​ชัดเจน คือ​มี​บทบาท​สอง​บทบาท​ที่​สลับ​กัน​บ่อย ๆ ได้แก่ driver ผู้​ถือ keyboard และ​พิมพ์ code กับ navigator (บาง​แหล่ง​เรียก observer) ผู้​อ่าน code ทุก​บรรทัด​ที่​ถูก​พิมพ์ พร้อม​มอง​ภาพ​รวม​เชิงกลยุทธ์ — คิด​ล่วงหน้า​ถึง​ปัญหา​ที่​จะ​ตาม​มา แนวทางการ​ออกแบบ และ​จุด​ที่​ควร​ปรับปรุง เพื่อ​ให้ driver มี​สมาธิ​เต็ม​ที่​กับ​รายละเอียด​ทาง​ยุทธวิธี​ตรง​หน้า โดย​มี navigator เป็น​ตาข่าย​นิรภัย​และ​เข็มทิศ Martin Fowler อธิบาย​เหตุผล​เชิง​องค์​ความ​รู้​ว่า การ​เขียน​โปรแกรม​คือ​การ​สร้าง​ความ​เข้าใจ​ใน code อย่าง​ต่อ​เนื่อง​แล้ว​ตัดสิน​ใจ​ว่า​จะ​เปลี่ยน​มัน​อย่างไร และ​คน​สอง​คน​ที่​ทำงาน​ร่วม​กัน​มัก​คืบ​หน้า​กับ​ปัญหา​เช่น​นี้​ได้​เร็ว​กว่า​ต่าง​คน​ต่าง​ทำ เพราะ “สมอง​ที่​สอง” ที่​อยู่​ใกล้ ๆ ช่วย​ลด​โอกาส​ที่​จะ​หลง​เข้า analytical rat-hole เสีย​เวลา​ไป​หลาย​ชั่วโมง

Pair programming ต้อง​มี​ผู้​ร่วม​ที่ active ทั้ง​สอง​คน ไม่ใช่​โปรแกรมเมอร์​ที่​ทำงาน​หนึ่ง​คน​กับ​ผู้​สังเกตการณ์​ที่​เฉื่อยชา​อีก​หนึ่ง​คน หนึ่ง​ใน​เงื่อนไข​แรก ๆ ของ​การ pair ที่​มี​ประสิทธิภาพ​คือ​การ​ออกแบบ​พื้นที่​ทำงาน​เอง โต๊ะ​แบบ L หรือ U หรือ​ที่​วาง keyboard และ​จอ​ไว้​ตรง​มุม​โต๊ะ ไม่​เหมาะ​กับ​การ pair (หรือ​การ​ทำงาน​ร่วม​กัน​ใด ๆ) การ​จัด​วาง​ที่​ดี​ที่สุด​คือ​โต๊ะ​ตรง​ที่​รองรับ​เก้าอี้​สอง​ตัว​เคียง​ข้าง​กัน พร้อม​จอ​คู่ keyboard คู่ และ​เมาส์​คู่ เพื่อ​ให้​โปรแกรมเมอร์​คน​ใด​ก็ได้​ทำงาน​กับ​ปัญหา​ตรง​หน้า​ได้​ทุกเมื่อ โดย​ไม่​ต้อง​ขยับ​ที่นั่ง​หรือ​ส่ง keyboard/เมาส์​ไป​มา แน่นอน​ว่าการ pair ทำได้​แม้​ไม่มี​สิ่ง​อำนวย​ความ​สะดวก​เหล่า​นี้​ครบ (เช่น​ใน​การ​ทำงาน​ทาง​ไกล​ผ่าน​เครื่องมือ​อย่าง VS Code Live Share) แต่​สภาพ​แวดล้อม​เช่น​นี้​คือ​อุดมคติ​ที่​ขจัด​แรง​เสียด​ทาน​ใน​กระบวนการ​ไป​ได้​เกือบ​หมด

การ​เริ่ม pair programming ใน​ทีม​ทำได้​หลาย​รูปแบบ ขึ้น​กับ​เป้าหมาย​และ​ระดับ​ประสบการณ์​ของ​คู่:

  1. จัด​ที่นั่ง​ให้​เอื้อ​ต่อ​การ pair จริง ๆ — โต๊ะ​ตรง จอ​คู่ (หรือ​จอ​ใหญ่ share กัน) keyboard/เมาส์​สำรอง เพื่อ​สลับ driver ได้​ทันที​โดย​ไม่มี​แรง​เสียด​ทาน
  2. เลือก​บทบาท driver/navigator แล้ว​สลับ​บ่อย — driver พิมพ์ code และ​โฟกัส​รายละเอียด​ยุทธวิธี ส่วน navigator มอง​ภาพ​รวม จับ​ข้อ​ผิดพลาด และ​คิด​ล่วงหน้า สลับ​บทบาท​ทุก 15-30 นาที หรือ​ทุก​ครั้ง​ที่​มี pull request/commit ย่อย
  3. เลือก​สไตล์​การ pair ให้​เหมาะ​กับ​สถานการณ์
    • Ping-Pong pairing (นิยม​คู่​กับ TDD): คน​หนึ่ง​เขียน unit test ที่​ล้มเหลว (red) แล้ว​ส่ง​ต่อ​ให้​อีก​คน​เขียน code ให้​ผ่าน (green) จาก​นั้น​สลับ​กัน​เขียน test ถัด​ไป
    • Strong-style pairing: “ความคิด​ใด ๆ ที่​จะ​เข้าไป​ใน​คอมพิวเตอร์​ต้อง​ผ่าน​มือ​ของ​อีก​คน​ก่อน” — คน​ที่ navigate (มัก​เป็น​ผู้​มี​ประสบการณ์​มากกว่า​หรือ​รู้​บริบท​มากกว่า) จะ​บอก​แนวทาง ส่วน driver เป็น​คน​พิมพ์​ตาม เหมาะ​กับ​การ​ถ่ายทอด​ความ​รู้​ให้ novice หรือ​คน​ที่​เพิ่ง​เข้า project
    • Unstructured/organic pairing: สลับ​บทบาท​ตาม​ธรรมชาติ​ของ​การ​สนทนา เหมาะ​กับ​คู่​ที่​เชี่ยวชาญ​ใกล้​เคียง​กัน​และ​คุ้น​เคย​กัน​ดี
  4. สื่อสาร​เจตนา​ตลอด​เวลา — driver พูด​สิ่ง​ที่​กำลัง​คิด​ออก​มา​ดัง ๆ (think aloud) navigator ถาม​คำถาม​หรือ​เสนอ​ทาง​เลือก​แทนที่​จะ​เงียบ​แล้ว​รอ​วิจารณ์​ทีหลัง
  5. จำกัด​ช่วง​เวลา pair และ​พัก​เป็น​ระยะ — session ยาว 2-4 ชั่วโมง​พร้อม​พัก​สั้น ๆ ช่วย​รักษา​สมาธิ​และ​ลด​ความ​เหนื่อย​ล้า​ทาง​ความคิด (cognitive fatigue) ซึ่ง​เป็น​ข้อ​จำกัด​จริง​ของ​การ pair ต่อ​เนื่อง​ทั้ง​วัน
  6. จับ​คู่​ให้​เหมาะสม​กับ​เป้าหมาย — ต้องการ​ถ่ายทอด​ความ​รู้ ให้​จับ senior คู่ junior; ต้องการ​คุณภาพ code สูงสุด​สำหรับ​ส่วน​ที่​ซับซ้อน/เสี่ยง ให้​จับ expert คู่ expert; ต้องการ​กระจาย​ความ​เข้าใจ domain ให้​สลับ​คู่​หมุนเวียน (pair rotation) เป็น​ระยะ ไม่​ตรึง​คู่​เดิม​ตลอด​ไป
flowchart LR
  Start[เริ่มงาน] --> Choose{เลือกสไตล์}
  Choose --> PingPong[Ping Pong กับ TDD]
  Choose --> Strong[Strong Style]
  Choose --> Organic[Organic Pairing]
  PingPong --> Driver[Driver พิมพ์ code]
  Strong --> Driver
  Organic --> Driver
  Driver --> Navigator[Navigator ทบทวนและคิดล่วงหน้า]
  Navigator --> Switch{ถึงเวลาสลับ}
  Switch -->|ใช่| Driver
  Switch -->|ยังไม่ถึง| Navigator
  Navigator --> Review[Commit หรือ PR ย่อย]

สมมติ​สอง​คน​กำลัง pair แบบ ping-pong เพื่อ​พัฒนา method คำนวณ​ส่วนลด​ใน domain คำ​สั่ง​ซื้อ คน​แรก​เป็น driver เขียน test ที่​ล้มเหลว​ก่อน:

// รอบที่ 1 - Alice (driver) เขียน test ก่อน (red)
public class DiscountCalculatorTests
{
[Fact]
public void Should_apply_ten_percent_discount_for_vip_customer()
{
var calculator = new DiscountCalculator();
var result = calculator.CalculateDiscount(amount: 1000m, isVip: true);
Assert.Equal(900m, result);
}
}

จาก​นั้น​สลับ keyboard ให้ Bob (ตอน​นี้​กลาย​เป็น driver) เขียน code ขั้น​ต่ำ​ให้ test ผ่าน (green) โดย​มี Alice ทำ​หน้าที่ navigator คอย​ตั้ง​คำถาม​เรื่อง​เคส edge case:

// รอบที่ 1 - Bob (driver) ทำให้ test ผ่าน
public class DiscountCalculator
{
public decimal CalculateDiscount(decimal amount, bool isVip)
{
// Navigator (Alice) ถาม: "แล้วถ้า amount ติดลบล่ะ" -> บันทึกไว้เป็น test รอบถัดไป
return isVip ? amount * 0.9m : amount;
}
}

หลัง​จาก​นั้น​สลับ​บทบาท​อีก​ครั้ง Bob เขียน test ถัด​ไป​สำหรับ edge case ที่ Alice เพิ่ง​เสนอ วน​ซ้ำ​แบบ​นี้​ไป​เรื่อย ๆ ทุกรอบ​ทั้ง​สอง​คน​ได้​ทั้ง​เขียน code และ​ทบทวน code ไม่มี​ใคร​เป็น​แค่​ผู้​ดู​เฉย ๆ

ประโยชน์

  • คุณภาพ code ดี​ขึ้น — งาน​วิจัย​และ​ประสบการณ์​ภาค​ปฏิบัติ​ชี้​ว่า code ที่​ผ่าน​การ pair มี​ข้อ​บกพร่อง​น้อย​กว่า เพราะ​มี code review เกิด​ขึ้น​แบบ​เรียลไทม์ ไม่ใช่​หลัง​เขียน​เสร็จ
  • กระจาย​ความ​รู้​และ​ลด bus factor — ความ​รู้​เกี่ยว​กับ code ไม่​ได้​ติด​อยู่​กับ​คน​เดียว ช่วย​หนุน Collective Code Ownership
  • ออนบอร์ด​คน​ใหม่​ได้​เร็ว​ขึ้น — strong-style pairing กับ​สมาชิก​ที่​มี​ประสบการณ์​ช่วย​ให้​คน​ใหม่​เข้าใจ codebase และ​มาตรฐาน​ทีม​ได้​เร็ว
  • โฟกัส​และ​มี accountability สูง​ขึ้น — มี​คน​อยู่​ข้าง ๆ ตลอด ลด​การ​หลง​ประเด็น​หรือ​เสีย​เวลา​ไป​กับ​ทาง​ตัน
  • การ​ตัดสิน​ใจ​ออกแบบ​ดี​ขึ้น — การ​ถกเถียง​สด ๆ ระหว่าง driver/navigator มัก​นำ​ไป​สู่​ทางออก​ที่​มอง​ครบ​มุม​กว่า​คน​เดียว​คิด

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

  • ต้นทุน​แรงงาน-ชั่วโมง​สูง​ขึ้น — Wikipedia และ​งาน​วิจัย​หลาย​ชิ้น​ระบุ​ว่า pair programming ใช้ human-hours ต่อ​งาน​มากกว่า​การ​เขียน​คน​เดียว แม้​คุณภาพ​จะ​ดี​กว่า จึง​ควร​ใช้​อย่าง​เลือกสรร ไม่ใช่​บังคับ​ทุก​บรรทัด
  • ความ​เหนื่อย​ล้า​และ intensity — การ​จดจ่อ​ร่วม​กัน​ต่อ​เนื่อง​ต้อง​ใช้​พลังงาน​สูง session ที่​ยาว​เกิน​ไป​โดย​ไม่​พัก​จะ​ลด​ประสิทธิผล​ลง
  • ความ​เข้า​กัน​ได้​ของ​คู่​และ​พลวัต​อำนาจ — ถ้า​คน1 dominate การ​สนทนา​หรือ keyboard ตลอด อีก​คน​จะ​กลาย​เป็น​ผู้​สังเกตการณ์​เฉื่อยชา ซึ่ง​ขัด​กับ​หลักการ​ที่​ต้อง active ทั้ง​คู่ ต้อง​อาศัย psychological safety และ​วัฒนธรรม​ทีม​ที่​ดี
  • ไม่ใช่​ทุก​งาน​ที่​เหมาะ — Martin Fowler เตือน​ว่า​ไม่มี​เทคนิค​ใด​เหมาะ​กับ​ทุก​คน​หรือ​ทุก​สถานการณ์ งาน​สำรวจ/prototype เร็ว ๆ หรือ​งาน​ที่​ต้อง​คิด​คน​เดียว​ลึก ๆ อาจ​ไม่​เหมาะ​กับ​การ pair ตลอด​เวลา
  • ผู้​บริหาร​บาง​คน​ยัง​ไม่​เชื่อ — เพราะ​เห็น​แค่ “สอง​คน​ทำงาน​เดียวกัน” โดย​ไม่​เห็น​คุณภาพ​และ​ความ​รู้​ที่​กระจาย​ออก​ไป การ​อธิบาย​ด้วย​ตัวเลข​ข้อ​บกพร่อง​ที่​ลด​ลง​มัก​ช่วย​โน้มน้าว​ได้​ดี​กว่า​การ​อ้าง​ความ​รู้สึก