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

Conway’s Law

โครงสร้าง​ของ​ระบบ​สะท้อน​โครงสร้าง​การ​สื่อสาร​ของ​องค์กร​ที่​สร้าง​มัน

Conway’s Law มา​จาก​บทความ​ชื่อ “How Do Committees Invent?” ของ Melvin Conway วิศวกร​คอมพิวเตอร์​ชาว​อเมริกัน เขา​เขียน​บทความ​นี้​ใน​ปี 1967 และ​ส่ง​ให้ Harvard Business Review พิจารณา​ก่อน แต่​ถูก​ปฏิเสธ​เพราะ​บรรณาธิการ​เห็น​ว่า​เขา “ยัง​พิสูจน์​วิทยานิพนธ์​ของ​ตัวเอง​ไม่​ได้” Conway จึง​ส่ง​ให้​นิตยสาร Datamation ซึ่ง​ตี​พิมพ์​ใน​ฉบับ​เดือน​เมษายน 1968 แทน

ประโยค​ต้นฉบับ​ของ Conway คือ

“Organizations which design systems … are constrained to produce designs which are copies of the communication structures of these organizations.”

— Melvin Conway, How Do Committees Invent? (1968)

แปล​เป็น​ไทย​ได้​ประมาณ​ว่า “องค์กร​ที่​ออกแบบ​ระบบ (ใน​ความหมายกว้าง) ถูก​จำกัด​ให้​ผลิต design ที่​เป็น​สำเนา​ของ​โครงสร้าง​การ​สื่อสาร​ใน​องค์กร​นั้น” ตัว Conway เอง​ไม่​ได้​เรียก​ข้อสังเกต​นี้​ว่า “กฎ” (law) — ชื่อ “Conway’s Law” ถูก​ตั้ง​ขึ้น​ภายหลัง​โดย Fred Brooks ใน​หนังสือ The Mythical Man-Month ซึ่ง​ทำให้​แนวคิด​นี้​เป็น​ที่​รู้จัก​ใน​วง​กว้าง​กว่า​บทความ​ต้นฉบับ​เสีย​อีก

ใจความ​สำคัญ​ที่สุด​คือ สถาปัตยกรรม​ซอฟต์แวร์​กับ​โครงสร้าง​องค์กร​ไม่ใช่​เรื่อง​ที่​เป็น​อิสระ​จาก​กัน ทีม​สื่อสาร​กัน​อย่างไร module/บริการ/คอมโพเนนต์ใน​ระบบ​ก็​มัก​ถูก​แบ่ง​ไป​ตาม​รอย​ต่อ​การ​สื่อสาร​นั้น เพราะ​การ​ออกแบบ interface ระหว่าง​ส่วน​ต่าง ๆ ของ​ระบบ​ต้อง​อาศัย​การ​พูด​คุย​ตกลง​กัน​ระหว่าง​คน​ที่​รับผิดชอบ​แต่ละ​ส่วน — รอย​ต่อ​การ​สื่อสาร​ที่​ยาก​หรือ​มี​ต้นทุน​สูง (เช่น อยู่​คนละ​ทีม คน​ละ​ไทม์​โซน ต้อง​ผ่าน​หลาย​ชั้น​อนุมัติ) จะ​กลาย​เป็น​รอย​ต่อ (interface) ที่​หยาบ​และ​มี friction ใน code ตาม​ไป​ด้วย

ข้อสังเกต​นี้​บรรยาย ความ​สอดคล้อง (correspondence) ระหว่าง​องค์กร​กับ​ระบบ มากกว่า​จะ​ฟัน​ธง​ทิศทาง​เหตุ-ผล​เดียว นักวิชาการ​ยัง​ถก​กัน​ว่า​โครงสร้าง​องค์กร​เป็น​ตัว​กำหนด design ทาง​เทคนิค หรือ design ทาง​เทคนิค​เป็น​ตัว​กำหนด​โครงสร้าง​องค์กร หรือ​ทั้ง​สอง​ฝั่ง​กำหนด​กัน​ไป​มา (co-evolution) งาน​วิจัย​ของ MIT และ Harvard Business School พบ​ว่า​องค์กร​ที่​ทีม​เชื่อม​โยง​กัน​หลวม ๆ (loosely coupled) มัก​ผลิต​สินค้า​ที่ modular กว่า​องค์กร​ที่​ทีม​เชื่อม​โยง​กัน​แน่น และ​งาน​ศึกษา​ของ University of Maryland ร่วม​กับ Microsoft ก็​ยืนยัน​ความ​สัมพันธ์​นี้​ด้วย​การ​วิเคราะห์​คุณภาพ​ซอฟต์แวร์​เชิง​ประจักษ์

Chris Ford เพื่อน​ร่วม​งาน​ของ Martin Fowler สรุป​กลไก​เบื้องหลัง​ไว้​กระชับ​ว่า “software coupling is enabled and encouraged by human communication” — เมื่อ​คน​สื่อสาร​กัน​ง่าย code ของ​พวก​เขา​ก็​มัก​พัน​กัน​ง่าย​ตาม​ไป​ด้วย และ​ใน​ทาง​กลับ​กัน ถ้า​ออกแบบ​สถาปัตยกรรม​ขัด​กับ​โครงสร้าง​องค์กร​ที่​มี​อยู่​จริง (เช่น อยาก​ได้​ระบบ modular แต่​ทีม​ยัง​รวม​ศูนย์​การ​ตัดสิน​ใจ) ความ​ตึงเครียด​จะ​ปรากฏ​ใน code — จุด​เชื่อม​ต่อ​ที่​ควร​ง่าย​กลับ​ซับซ้อน​ขึ้น​เรื่อย ๆ เพราะ​ทีม​ไม่​ได้​ถูก​จัด​ให้​สื่อสาร​กัน​ตาม​แนว​สถาปัตยกรรม​ที่​ต้องการ

Martin Fowler สรุป​ว่า​องค์กร​มี​ทาง​เลือก​อยู่​สาม​แบบ​เมื่อ​เจอ​กับ Conway’s Law:

  1. เพิกเฉย — แสร้ง​ทำ​เป็น​ว่า​กฎ​นี้​ไม่มี​ผล ทั้ง​ที่​มัน​มี​ผล​เสมอ
  2. ยอมรับ — ออกแบบ​สถาปัตยกรรม​ให้​สอดคล้อง​กับ​รูปแบบ​การ​สื่อสาร​ของ​ทีม​ที่​มี​อยู่
  3. Inverse Conway Maneuver — จัด​โครงสร้าง​ทีม​ใหม่​โดย​ตั้งใจ เพื่อ “บังคับ” ให้​สถาปัตยกรรม​ที่​ต้องการ​เกิด​ขึ้น​ตาม​มา

Inverse Conway Maneuver คือ​การ​พลิก​ทิศทาง​ของ​กฎ: แทนที่​จะ​ปล่อย​ให้​องค์กร​ที่​มี​อยู่​กำหนด​สถาปัตยกรรม​โดย​ไม่​ตั้งใจ ก็​ออกแบบ​ทีม (ขอบเขต​ความ​รับผิดชอบ ช่อง​ทาง​สื่อสาร รูปแบบ ownership) ให้​ตรง​กับ​สถาปัตยกรรม​เป้าหมาย​ตั้งแต่​แรก คำ​นี้​มี​ร่องรอย​การ​ใช้​ตั้งแต่​บทความ​ของ Jonny LeRoy และ Matt Simons ใน Cutter IT Journal ปี 2010 และ​ถูก​ทำให้​เป็น​ที่​รู้จัก​กว้าง​ขึ้น​มาก​ผ่าน​บทความ Microservices (2014) ของ James Lewis กับ Martin Fowler ต่อ​มา​หนังสือ Team Topologies ของ Matthew Skelton และ Manuel Pais (2019) ได้​ขยาย​แนวคิด​นี้​เป็นกรอบ​ปฏิบัติ​เต็ม​รูปแบบ — นิยาม​รูปแบบ​ทีม 4 แบบ (stream-aligned, enabling, complicated-subsystem, platform) และ​รูปแบบ​ปฏิสัมพันธ์​ระหว่าง​ทีม เพื่อ​ออกแบบ​องค์กร​ให้ “ไหล” ไป​สู่​สถาปัตยกรรม​ที่​ต้องการ​โดย​ธรรมชาติ

การ​ทดลอง​ดั้งเดิม​ของ Conway (compiler COBOL/ALGOL) — Conway เล่า​ถึง​องค์กร​วิจัย​ตาม​สัญญา​แห่ง​หนึ่ง​ที่​มี​คน 8 คน ได้​รับ​มอบหมาย​ให้​สร้าง compiler COBOL และ ALGOL หลัง​ประเมิน​ความ​ยาก​แล้ว มีคน 5 คน​ถูก​จัด​ไป​ทำ COBOL และ 3 คน​ไป​ทำ ALGOL ผลลัพธ์​คือ compiler COBOL ทำงาน​แบบ 5-phase (5 รอบ​ผ่าน) ส่วน compiler ALGOL ทำงาน​แบบ 3-phase — จำนวน phase ใน​ตัว compiler สะท้อน​จำนวน​คนใน​แต่ละ​ทีม​ย่อย​พอดี เรื่อง​นี้​ภายหลัง​ถูก​ทำให้​ติด​หู​ง่าย​ขึ้น​เป็น​มุกตลก​ใน​วงการ​ที่ Eric S. Raymond บันทึก​ไว้​ใน The New Hacker’s Dictionary ว่า “ถ้า​ให้​สี่​ทีม​ออกแบบ compiler คุณ​จะ​ได้ compiler แบบ 4-pass”

Amazon และ “two-pizza teams” — Jeff Bezos วาง​กฎ​ง่าย ๆ ว่า​ทีม​หนึ่ง​ควร​เล็ก​พอที่​พิซซ่า​สอง​ถาด​เลี้ยง​ได้ (ราว 7-8 คน) แต่ละ​ทีม​เป็น​เจ้าของ​บริการ​ของ​ตัวเอง​แบบ end-to-end พร้อม API contract ที่​ชัดเจน​ระหว่าง​ทีม ผลลัพธ์​ที่​ตาม​มา​คือ​สถาปัตยกรรม​ของ Amazon กลาย​เป็น service-oriented / microservices ที่​ประกอบ​ด้วย​บริการ​เล็ก ๆ จำนวน​มาก ซึ่ง​สอดคล้อง​พอดี​กับ​โครงสร้าง​ทีม​อิสระ​ขนาด​เล็ก​ที่​วาง​ไว้ — เป็น​ตัวอย่าง​ของ Inverse Conway Maneuver ที่​ใช้งาน​จริง​และ​ได้​ผล

เว็บไซต์​องค์กร​ที่​สะท้อน​แผนก​ภายใน​แทนที่​จะ​สะท้อน​ผู้​ใช้ — นัก​วิจัย​ด้าน usability อย่าง Nigel Bevan เคย​บันทึก​ไว้​ว่า​เว็บไซต์​องค์กร​จำนวน​มาก​ถูก​จัด​โครงสร้าง​เมนู​ตาม​ผัง​แผนก​ภายใน​บริษัท (เช่น “ฝ่าย​ขาย” “ฝ่าย​บริการ​หลัง​การ​ขาย” “ฝ่าย IT”) แทนที่​จะ​จัด​ตาม​งาน​ที่​ผู้​ใช้​ต้องการ​ทำ​จริง เป็น​ตัวอย่าง​ของ Conway’s Law ที่​ไม่​ได้​จำกัด​อยู่​แค่​ซอฟต์แวร์ แต่​ลาม​ไป​ถึง​โครงสร้าง​ข้อมูล (information architecture) ใด ๆ ที่​หลาย​ทีม​ช่วย​กัน​สร้าง

  • ถ้า​อยาก​ได้​สถาปัตยกรรม​แบบ​ไหน ให้​ตั้ง​ทีม​แบบ​นั้น​ก่อน — การ​พยายาม​บังคับ​ให้​สถาปัตยกรรม modular เกิด​ขึ้น​ใน​องค์กร​ที่​ยัง​รวม​ศูนย์​การ​ตัดสิน​ใจ มัก​จบ​ด้วย​ระบบ​ที่ “ดู​เป็น microservices” แต่​ยัง tightly coupled กัน​ภายใน เพราะ​ทีม​ยัง​ต้อง​ประสาน​งาน​กัน​แน่น​เหมือน​เดิม
  • มอง​รอย​ต่อ​การ​สื่อสาร​เป็น​สัญญาณ​ล่วงหน้า​ของ​รอย​ต่อ​สถาปัตยกรรม — จุด​ไหน​ที่​ทีม​สอง​ทีม​ต้อง​ประชุม​นัด​พิเศษ ขอ sign-off ข้าม​ทีม​บ่อย ๆ หรือ​สื่อสาร​ผ่าน​ตั๋ว/อีเมล​แทน​การ​คุย​ตรง จุด​นั้น​มัก​กลาย​เป็น interface ที่​หยาบ​และ​เปราะ​ใน code
  • ใช้ Common Architectural Vision เป็น​เครื่องมือ​คู่​กับ​กฎ​นี้ — ทีม​ที่ share ความ​เข้าใจ​สถาปัตยกรรม​ร่วม​กัน (ดู Common Architectural Vision) จะ​ลด​โอกาส​ที่​รอย​ต่อ​องค์กร​กับ​รอย​ต่อ​ระบบ​จะ​ขัด​กัน
  • Bounded Context ควร​เดิน​ตาม​ทีม ไม่ใช่​ทีม​เดิน​ตาม Bounded Context โดย​บังเอิญ — ใน DDD การ​กำหนด Bounded Context และ Context Map อย่าง​ตั้งใจ คือ​การ​ใช้ Inverse Conway Maneuver ใน​ระดับ domain: ให้​ทีม​เป็น​เจ้าของ context เดียว​ชัดเจน แทนที่​จะ​ปล่อย​ให้​เขตแดน model เลื่อน​ไหล​ไป​ตาม​ใคร​สื่อสาร​กับ​ใคร​ใน​แต่ละ​วัน
  • ระวัง class/module ที่ “ทุก​ทีม​แตะ” — code ร่วม​ที่​หลาย​ทีม​ต้อง​แก้ไข​พร้อม​กัน​มัก​ไม่​ได้​เกิด​จาก design ที่​แย่​เพียง​อย่าง​เดียว แต่​สะท้อน​ว่า​ไม่มี​ทีม​ไหน​เป็น​เจ้าของ​ขอบเขต​นั้น​จริง ๆ ตัวอย่าง​สมมติ:
// ก่อน: OrderProcessor ถูกแก้โดยทีม Checkout, ทีม Inventory และทีม Billing พร้อมกัน
// เพราะไม่มีขอบเขตความรับผิดชอบที่ชัดเจน -> merge conflict และ deploy ติดกันบ่อย
public class OrderProcessor
{
public void PlaceOrder(Order order) { /* checkout logic */ }
public void ReserveStock(Order order) { /* inventory logic */ }
public void ChargeCustomer(Order order) { /* billing logic */ }
}
// หลัง: แยกตามขอบเขตทีม แต่ละทีมเป็นเจ้าของ service ของตัวเอง
// สื่อสารกันผ่าน contract ที่ชัดเจน สะท้อน Inverse Conway Maneuver
public interface ICheckoutService { void PlaceOrder(Order order); }
public interface IInventoryService { void ReserveStock(Order order); }
public interface IBillingService { void ChargeCustomer(Order order); }
  • กฎ​นี้​ใช้ได้​กับ​สิ่ง​ที่​ไม่ใช่ code ด้วย — เอกสาร ฐาน​ความ​รู้ เว็บไซต์ หรือ​แม้แต่ API สาธารณะ ล้วน​มี​แนวโน้ม​สะท้อน​โครงสร้าง​องค์กร​ผู้​สร้าง​เช่น​กัน จึง​ควร​ตรวจสอบ​ว่า​โครงสร้าง​ที่​ผู้​ใช้​ปลายทาง​เห็น​ถูก​ออกแบบ​เพื่อ​ผู้​ใช้ ไม่ใช่​เพื่อ​ความ​สะดวก​ของ​แผนก​ภายใน
flowchart LR
  TeamA[Team A] --> ModuleA[Module A]
  TeamB[Team B] --> ModuleB[Module B]
  TeamC[Team C] --> ModuleC[Module C]
  ModuleA --> ModuleB
  ModuleB --> ModuleC
  TeamA --> TeamB
  TeamB --> TeamC
  • Brooks’s Law — อีก​หนึ่ง​กฎ​คลาสสิก​เรื่อง​องค์กร​และ​ซอฟต์แวร์ จาก​หนังสือ​เล่ม​เดียวกัน​ที่​ตั้ง​ชื่อ Conway’s Law
  • Bounded Context — การ​กำหนด​ขอบเขต model อย่าง​ตั้งใจ คือ​การ​ใช้ Inverse Conway Maneuver ใน​ระดับ domain
  • Context Map — เครื่องมือ​มอง​ความ​สัมพันธ์​ระหว่าง Bounded Context ซึ่ง​มัก​สะท้อน​ความ​สัมพันธ์​ระหว่าง​ทีม
  • Common Architectural Vision — แนว​ปฏิบัติ​ที่​ช่วย​ให้​ทีม​หลาย​ทีม​สื่อสาร​บน​ความ​เข้าใจ​สถาปัตยกรรม​ร่วม​กัน
  • Whole Team — โครงสร้าง​ทีม​ที่​ครบ​องค์​ประกอบ​ส่ง​ผล​ต่อ​รูปแบบ​การ​สื่อสาร​และ​ระบบ​ที่​ผลิต​ออก​มา
  • Separation of Concerns — หลักการ​แบ่ง​ความ​รับผิดชอบ​ใน code ที่​ควร​สอดคล้อง​กับ​การ​แบ่ง​ความ​รับผิดชอบ​ของ​ทีม