← ทำไมตาถึงอ่านกราฟนี้ได้เร็วกว่า
LEVEL 3 · ระดับสูง
โครงเรื่องคือลำดับที่ตาเดิน
บทที่แล้วจบด้วยคำถามที่ยังไม่ได้ตอบ — ถ้าสายตาจัดกลุ่มตามที่เราวาง แล้ว เราควรวางให้มันเห็นเป็นกลุ่มอะไร
คำตอบคือสองเครื่องมือที่คุณน่าจะเคยได้ยินชื่อมาแล้ว และน่าจะเคยถูกสอนในฐานะกฎที่ต้องท่อง บทนี้จะไม่สอนแบบนั้น เพราะพอมาถึงตรงนี้ ทั้งสองอย่างอธิบายได้ด้วยกลไกที่คุณมีอยู่แล้วทั้งหมด
12.1 Pyramid — ข้อสรุปขึ้นก่อน เพราะความสนใจมีจำกัด
หลักการพีระมิดบอกว่า ให้ขึ้นต้นด้วยข้อสรุป แล้วค่อยตามด้วยเหตุผลที่รองรับมัน ตรงข้ามกับลำดับที่เราคิดจริง ๆ ซึ่งมักเป็นการไล่หลักฐานก่อนแล้วค่อยสรุป
เหตุผลไม่ได้อยู่ที่ธรรมเนียมการเขียน แต่อยู่ที่บทที่ 2 — ความสนใจเป็นทรัพยากรจำกัดและมันถูกใช้ไปเรื่อย ๆ คนอ่านที่ยังไม่รู้ว่ากำลังจะไปไหน ต้องแบกหลักฐานทุกชิ้นไว้ในหัวเผื่อว่ามันจะสำคัญ พอถึงข้อสรุปก็เหนื่อยเกินกว่าจะประเมินมันแล้ว
พูดด้วยภาษาของเล่มนี้คือ ข้อสรุปที่มาทีหลังบังคับให้คนอ่านทำงานโหมดไล่ทีละชิ้นกับทุกย่อหน้า ส่วนข้อสรุปที่มาก่อนเปลี่ยนงานที่เหลือเป็นการตรวจสอบ ซึ่งเบากว่ามาก
นี่คือเรื่องเดียวกับหัวสไลด์ที่บอกข้อสรุปใน FIG 1.1 เป๊ะ ๆ — แค่ขยายจากหนึ่งสไลด์เป็นทั้งเอกสาร
12.2 MECE — การปูกระเบื้อง ไม่ใช่คำศัพท์ที่ปรึกษา
💡 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 ต้องการพอดี คือ แผนที่ว่าตาควรเดินยังไงบนหน้านี้ ข้อสรุปอยู่บนสุดเพราะตาไปถึงก่อน กลุ่มที่ไม่ทับกันเรียงอยู่ใต้มันเพราะตาจับกลุ่มด้วยความใกล้ และไม่มีช่องว่างให้ตาตกหล่น
บทถัดไปจะบีบทั้งหมดนี้ลงเหลือประโยคเดียว