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

ทำไมตาถึงอ่านกราฟนี้ได้เร็วกว่า

LEVEL 3 · ระดับสูง

โครงเรื่องคือลำดับที่ตาเดิน

บทที่แล้วจบด้วยคำถามที่ยังไม่ได้ตอบ — ถ้าสายตาจัดกลุ่มตามที่เราวาง แล้ว เราควรวางให้มันเห็นเป็นกลุ่มอะไร

คำตอบคือสองเครื่องมือที่คุณน่าจะเคยได้ยินชื่อมาแล้ว และน่าจะเคยถูกสอนในฐานะกฎที่ต้องท่อง บทนี้จะไม่สอนแบบนั้น เพราะพอมาถึงตรงนี้ ทั้งสองอย่างอธิบายได้ด้วยกลไกที่คุณมีอยู่แล้วทั้งหมด

12.1 Pyramid — ข้อสรุปขึ้นก่อน เพราะความสนใจมีจำกัด

หลักการพีระมิดบอกว่า ให้ขึ้นต้นด้วยข้อสรุป แล้วค่อยตามด้วยเหตุผลที่รองรับมัน ตรงข้ามกับลำดับที่เราคิดจริง ๆ ซึ่งมักเป็นการไล่หลักฐานก่อนแล้วค่อยสรุป

เหตุผลไม่ได้อยู่ที่ธรรมเนียมการเขียน แต่อยู่ที่บทที่ 2 — ความสนใจเป็นทรัพยากรจำกัดและมันถูกใช้ไปเรื่อย ๆ คนอ่านที่ยังไม่รู้ว่ากำลังจะไปไหน ต้องแบกหลักฐานทุกชิ้นไว้ในหัวเผื่อว่ามันจะสำคัญ พอถึงข้อสรุปก็เหนื่อยเกินกว่าจะประเมินมันแล้ว

พูดด้วยภาษาของเล่มนี้คือ ข้อสรุปที่มาทีหลังบังคับให้คนอ่านทำงานโหมดไล่ทีละชิ้นกับทุกย่อหน้า ส่วนข้อสรุปที่มาก่อนเปลี่ยนงานที่เหลือเป็นการตรวจสอบ ซึ่งเบากว่ามาก

นี่คือเรื่องเดียวกับหัวสไลด์ที่บอกข้อสรุปใน FIG 1.1 เป๊ะ ๆ — แค่ขยายจากหนึ่งสไลด์เป็นทั้งเอกสาร

12.2 MECE — การปูกระเบื้อง ไม่ใช่คำศัพท์ที่ปรึกษา

ร่างแรก — จัดตามสัญชาตญาณขอบเขตทั้งหมด 12 รายการค่าคนค่าพัฒนาบุคลากรค่าอาคารไม่มีกลุ่มไหนรับค่าอบรม ถูกนับสองครั้งครอบคลุม 9 จาก 12 · ทับกัน 1 · ตกหล่น 3ร่างสอง — ถามว่าเงินออกไปหาใครจ่ายให้คนของเราจ่ายให้คนนอกจ่ายให้อาคารและระบบของใช้สิ้นเปลืองปูเต็มพอดี 12 จาก 12 · ไม่ทับกัน ไม่เหลือรู · เกณฑ์แบ่งอันเดียวตลอด
FIG 12.1 MECE ไม่ใช่คำศัพท์ที่ปรึกษา มันคือการปูกระเบื้อง — ขอบเขตทั้งหมดต้องถูกปิดพอดี ไม่ทับกัน ไม่เหลือรู · ร่างแรกทับกัน 1 รายการและตกหล่น 3 รายการ เพราะใช้เกณฑ์แบ่งสองอันปนกัน · ร่างสองใช้เกณฑ์เดียวคือ "เงินก้อนนี้ออกไปหาใคร" แล้วมันปูเต็มพอดีเอง

💡 MECE — ย่อจาก Mutually Exclusive, Collectively Exhaustive · แปลว่ากลุ่มที่คุณแบ่ง ต้องไม่ทับกัน และ ต้องครอบคลุมทุกอย่างในขอบเขต · แนวคิดนี้ผูกกับหลักพีระมิดมาตั้งแต่ต้น เพราะเหตุผลที่รองรับข้อสรุปจะเชื่อถือได้ก็ต่อเมื่อมันไม่นับซ้ำและไม่ตกหล่น

ทำไมมันถึงสำคัญกับสายตา ไม่ใช่แค่กับตรรกะ — เพราะบทที่ 11 บอกแล้วว่าตาจับกลุ่มเสร็จก่อนคุณพูด ถ้ารายการหนึ่งอยู่ได้สองกลุ่ม สายตาจะต้องเลือกให้มันกลุ่มเดียว แล้วมันจะเลือกโดยที่คุณไม่รู้ว่าเลือกอันไหน

ที่แย่กว่านั้นคือของที่ตกหล่น มันไม่ได้ขึ้นมาบอกว่าหายไป ช่องว่างไม่มีรูปร่าง ตาจึงมองไม่เห็นมัน — คนอ่านจะเชื่อว่าภาพครบ ทั้งที่ขาดไปหนึ่งในสี่

12.3 ตรวจ MECE ด้วยเครื่อง แทนที่จะเพ่งเอา

ข่าวดีคือทั้งสองเงื่อนไขเป็นคำถามที่โปรแกรมตอบได้ ไม่ต้องใช้วิจารณญาณเลย

"""ตรวจ MECE ด้วยเครื่อง — ซ้ำกันไหม และตกหล่นไหม เป็นคำถามที่โปรแกรมตอบได้"""

ALL = ["ค่าจ้าง", "ค่าล่วงเวลา", "ค่าไฟ", "ค่าน้ำ", "ค่าอินเทอร์เน็ต",
       "ค่าซ่อมลิฟต์", "ค่าซ่อมแอร์", "กระดาษ", "หมึกพิมพ์",
       "ค่าอบรม", "ค่าเดินทางไปอบรม", "ค่าที่ปรึกษา"]

DRAFT = {
    "ค่าคน": ["ค่าจ้าง", "ค่าล่วงเวลา", "ค่าอบรม", "ค่าที่ปรึกษา"],
    "ค่าอาคาร": ["ค่าไฟ", "ค่าน้ำ", "ค่าซ่อมลิฟต์", "ค่าซ่อมแอร์"],
    "ค่าพัฒนาบุคลากร": ["ค่าอบรม", "ค่าเดินทางไปอบรม"],
}

FIXED = {
    "จ่ายให้คนของเรา": ["ค่าจ้าง", "ค่าล่วงเวลา", "ค่าอบรม", "ค่าเดินทางไปอบรม"],
    "จ่ายให้คนนอก": ["ค่าที่ปรึกษา"],
    "จ่ายให้อาคารและระบบ": ["ค่าไฟ", "ค่าน้ำ", "ค่าอินเทอร์เน็ต",
                            "ค่าซ่อมลิฟต์", "ค่าซ่อมแอร์"],
    "ของใช้สิ้นเปลือง": ["กระดาษ", "หมึกพิมพ์"],
}

def check(name, groups, universe):
    print(f"=== {name} ===")
    seen = {}
    for g, items in groups.items():
        for it in items:
            seen.setdefault(it, []).append(g)

    overlap = {k: v for k, v in seen.items() if len(v) > 1}
    missing = [it for it in universe if it not in seen]
    stray = [it for it in seen if it not in universe]

    print(f"  กลุ่ม {len(groups)} กลุ่ม · ครอบคลุม {len(seen)} จาก {len(universe)} รายการ")
    if overlap:
        print("  ไม่ Mutually Exclusive — รายการที่อยู่หลายกลุ่ม:")
        for it, gs in overlap.items():
            print(f"    {it} อยู่ใน {' + '.join(gs)}")
    else:
        print("  Mutually Exclusive: ผ่าน ไม่มีรายการไหนอยู่สองกลุ่ม")
    if missing:
        print(f"  ไม่ Collectively Exhaustive — ตกหล่น {len(missing)} รายการ: {', '.join(missing)}")
    else:
        print("  Collectively Exhaustive: ผ่าน ไม่มีรายการตกหล่น")
    if stray:
        print(f"  มีรายการนอกขอบเขต: {', '.join(stray)}")
    ok = not overlap and not missing and not stray
    print(f"  สรุป: {'MECE' if ok else 'ยังไม่ MECE'}\n")
    return ok

check("ร่างแรก จัดตามสัญชาตญาณ", DRAFT, ALL)
check("ร่างสอง ถามว่าเงินออกไปหาใคร", FIXED, ALL)

print("ร่างแรกไม่ได้ขี้เกียจ มันแค่ใช้เกณฑ์แบ่งสองอันปนกัน")
print("คือ 'ประเภทของต้นทุน' กับ 'วัตถุประสงค์' ซึ่งซ้อนทับกันโดยธรรมชาติ")
print("ร่างสองใช้เกณฑ์เดียวตลอด: เงินก้อนนี้ออกไปหาใคร")

# --- เรขาคณิตของ FIG 12.1: ขอบเขตทั้งหมด = 560 px ---
W = 560.0
unit = W / len(ALL)
print(f"\n=== เรขาคณิตของ FIG 12.1 (1 รายการ = {unit:.2f} px จาก {len(ALL)} รายการ) ===")

print("ร่างแรก — วางให้เห็นการทับซ้อนกับช่องโหว่")
# วางกลุ่มที่ใช้รายการร่วมกันให้ติดกัน ไม่งั้นภาพจะโชว์การทับซ้อนผิดคู่
LAYOUT = ["ค่าคน", "ค่าพัฒนาบุคลากร", "ค่าอาคาร"]
covered = set()
x = 0.0
for g in LAYOUT:
    items = DRAFT[g]
    dup = [it for it in items if it in covered]
    start = x - len(dup) * unit          # ถอยหลังเท่าจำนวนรายการที่ซ้ำ เพื่อให้บล็อกทับกันจริง
    w = len(items) * unit
    print(f"  {g:<16} x={start:6.2f} w={w:6.2f} (ซ้ำ {len(dup)} รายการ)")
    covered.update(items)
    x = start + w
gap_items = len(ALL) - len(covered)
print(f"  ช่องโหว่ท้ายแถบ x={x:.2f} w={gap_items * unit:.2f} ({gap_items} รายการที่ไม่มีกลุ่มไหนรับ)")

print("ร่างสอง — ปูเรียงกันไปโดยไม่ทับ")
x = 0.0
for g, items in FIXED.items():
    w = len(items) * unit
    print(f"  {g:<22} x={x:6.2f} w={w:6.2f}")
    x += w
print(f"  ปลายแถบอยู่ที่ {x:.2f} px = เต็มขอบเขต {W:.0f} px พอดี")

ผลรันจริง

=== ร่างแรก จัดตามสัญชาตญาณ ===
  กลุ่ม 3 กลุ่ม · ครอบคลุม 9 จาก 12 รายการ
  ไม่ Mutually Exclusive — รายการที่อยู่หลายกลุ่ม:
    ค่าอบรม อยู่ใน ค่าคน + ค่าพัฒนาบุคลากร
  ไม่ Collectively Exhaustive — ตกหล่น 3 รายการ: ค่าอินเทอร์เน็ต, กระดาษ, หมึกพิมพ์
  สรุป: ยังไม่ MECE

=== ร่างสอง ถามว่าเงินออกไปหาใคร ===
  กลุ่ม 4 กลุ่ม · ครอบคลุม 12 จาก 12 รายการ
  Mutually Exclusive: ผ่าน ไม่มีรายการไหนอยู่สองกลุ่ม
  Collectively Exhaustive: ผ่าน ไม่มีรายการตกหล่น
  สรุป: MECE

ร่างแรกไม่ได้ขี้เกียจ มันแค่ใช้เกณฑ์แบ่งสองอันปนกัน
คือ 'ประเภทของต้นทุน' กับ 'วัตถุประสงค์' ซึ่งซ้อนทับกันโดยธรรมชาติ
ร่างสองใช้เกณฑ์เดียวตลอด: เงินก้อนนี้ออกไปหาใคร

=== เรขาคณิตของ FIG 12.1 (1 รายการ = 46.67 px จาก 12 รายการ) ===
ร่างแรก — วางให้เห็นการทับซ้อนกับช่องโหว่
  ค่าคน            x=  0.00 w=186.67 (ซ้ำ 0 รายการ)
  ค่าพัฒนาบุคลากร  x=140.00 w= 93.33 (ซ้ำ 1 รายการ)
  ค่าอาคาร         x=233.33 w=186.67 (ซ้ำ 0 รายการ)
  ช่องโหว่ท้ายแถบ x=420.00 w=140.00 (3 รายการที่ไม่มีกลุ่มไหนรับ)
ร่างสอง — ปูเรียงกันไปโดยไม่ทับ
  จ่ายให้คนของเรา        x=  0.00 w=186.67
  จ่ายให้คนนอก           x=186.67 w= 46.67
  จ่ายให้อาคารและระบบ    x=233.33 w=233.33
  ของใช้สิ้นเปลือง       x=466.67 w= 93.33
  ปลายแถบอยู่ที่ 560.00 px = เต็มขอบเขต 560 px พอดี

12.4 บทเรียนที่ตัวสคริปต์สอน แต่กฎไม่เคยสอน

ร่างแรกไม่ได้เกิดจากความมักง่าย มันเกิดจากการใช้เกณฑ์แบ่งสองอันปนกันในชั้นเดียว — "ประเภทของต้นทุน" กับ "วัตถุประสงค์" ซึ่งซ้อนทับกันโดยธรรมชาติ ค่าอบรมเป็นทั้งค่าคนและค่าพัฒนาบุคลากรพร้อมกัน มันจึงไปโผล่สองที่

พอเปลี่ยนเป็นเกณฑ์เดียวคือ "เงินก้อนนี้ออกไปหาใคร" ทุกอย่างเข้าที่เอง โดยไม่ต้องนั่งไล่ตรวจทีละรายการ

ถ้าจัดกลุ่มแล้วมีของอยู่ได้สองที่ อย่าไปเถียงว่ามันควรอยู่ที่ไหน — ให้กลับไปดูว่าคุณใช้เกณฑ์แบ่งกี่อัน

นี่คือสิ่งที่การท่องคำว่า MECE ให้ไม่ได้ ถ้าคุณจำแค่ "ห้ามทับกัน ห้ามตกหล่น" คุณจะพยายามซ่อมด้วยการย้ายรายการไปมา ซึ่งไม่มีวันจบ แต่ถ้าคุณรู้ว่าการทับกันคืออาการของเกณฑ์ที่ปนกัน คุณจะรู้ว่าต้องกลับไปแก้ที่ชั้นบน

12.5 สองอย่างนี้ประกอบกันเป็นอะไร

พีระมิดบอกลำดับแนวตั้ง — อะไรมาก่อนอะไร · MECE บอกการแบ่งแนวนอน — อะไรอยู่พวกเดียวกัน

พอเอามารวมกัน คุณจะได้สิ่งที่บทที่ 11 ต้องการพอดี คือ แผนที่ว่าตาควรเดินยังไงบนหน้านี้ ข้อสรุปอยู่บนสุดเพราะตาไปถึงก่อน กลุ่มที่ไม่ทับกันเรียงอยู่ใต้มันเพราะตาจับกลุ่มด้วยความใกล้ และไม่มีช่องว่างให้ตาตกหล่น

บทถัดไปจะบีบทั้งหมดนี้ลงเหลือประโยคเดียว

อ่านแบบเต็มเล่ม