Skip to content
Tayakorn

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

LEVEL 4 · ระดับเทพ

ชุดเครื่องมือที่เอาไปใช้ต่อได้เอง

บทที่แล้วรื้อสไลด์หนึ่งใบด้วยกลไกทั้งเล่ม บทนี้ทำสิ่งเดียว — บีบวิธีนั้นให้เล็กพอที่จะพกติดตัวไปใช้กับสไลด์ใบต่อไปของคุณเอง

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

15.1 เจ็ดคำถาม ไม่ใช่เจ็ดกฎ

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

คำถามกลไกอยู่บทที่ถ้าตก ทำอะไรต่อ
ช่องว่างที่แคบที่สุดได้ส่วนแบ่งเท่าไหร่ของช่วงที่ช่องทางมีให้4 · 5ขึ้นบันไดหนึ่งขั้น · ถ้าขั้นบนสุดยังตก แปลว่าปัญหาไม่ใช่ชนิดกราฟ ให้เปลี่ยนสิ่งที่วัดหรือพิมพ์ตัวเลขไปเลย
ฐานแกนบิดสัดส่วนไปกี่เท่า6 · 9ความยาวต้องเริ่มจากศูนย์ · ตำแหน่งซูมได้แต่ต้องทำเครื่องหมายบอก
สีกำลังแบกอะไรอยู่8แบกปริมาณ ให้เหลือสีเดียวไล่ความสว่าง · แบกกลุ่ม ให้ย้ายเป็นป้ายติดชิ้น
คนอ่านต้องไล่ทีละชิ้นกี่ครั้ง2 · 11เรียงตามค่า · ติดป้าย · พิมพ์ค่า จนกว่าจะเหลือศูนย์
หมึกที่ไม่ตอบคำถามไหนเลยเหลือกี่ชิ้น7ถามทีละชิ้นว่าลบแล้วมีคำถามไหนที่ตอบไม่ได้อีกต่อไปหรือเปล่า
ชุดที่แสดงครบขอบเขตไหม ทับกันไหม12ทับกันแปลว่าใช้เกณฑ์แบ่งปนกัน ให้กลับไปแก้ที่เกณฑ์ อย่าย้ายรายการ
หัวข้อแบกข้อที่ภาพแบกไม่ไหวครบไหม13เขียนข้อที่ตกลงไปในหัวข้อ · เกลาถ้อยคำได้ ห้ามเติมข้อเท็จจริง

สังเกตว่าไม่มีคำว่า "อย่า" อยู่ในตารางเลยสักช่อง เพราะทุกช่องเป็นการวัดแล้วตัดสิน ไม่ใช่การห้ามล่วงหน้า

15.2 เช็กลิสต์ในรูปของโปรแกรม

ตารางข้างบนใช้ด้วยมือได้ แต่มันจะไม่ถูกใช้จริงถ้าต้องนั่งไล่เอง สคริปต์ข้างล่าง (audit.py) จึงเอาทั้งเจ็ดข้อมาไว้ในฟังก์ชันเดียว แล้วรับสไลด์เป็น dict หนึ่งก้อน

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

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

"""เช็กลิสต์เจ็ดข้อในรูปของโปรแกรม — คัดลอกไฟล์นี้ไปใช้กับสไลด์ของคุณเองได้เลย"""

K = 0.05
LADDER = {"ตำแหน่ง": 1, "ความยาว": 3, "ความชัน": 4, "มุม": 5, "พื้นที่": 6, "ความเข้ม": 7}

# คำถามเจ็ดข้อ กับบทที่กลไกของมันอยู่ — ลำดับนี้ตรงกับลำดับที่ audit() ตรวจ
CHECKS = [
    ("ช่องทางแบกช่องว่างที่แคบที่สุดไหวไหม", "4-5"),
    ("ฐานแกนบิดสัดส่วนหรือเปล่า", "6, 9"),
    ("สีกำลังแบกปริมาณอยู่ไหม", "8"),
    ("คนอ่านต้องไล่ทีละชิ้นกี่ครั้ง", "2, 11"),
    ("หมึกที่ไม่ตอบคำถามไหนเลยเหลือกี่ชิ้น", "7"),
    ("ชุดที่แสดงครบขอบเขตไหม", "12"),
    ("หัวข้อแบกข้อที่ภาพแบกไม่ไหวครบไหม", "13"),
]


def share_of_range(gap, vals, channel):
    """ช่องว่าง gap ได้ส่วนแบ่งเท่าไหร่ของช่วงที่ช่องทางมีให้ — None = เรขาคณิตตอบไม่ได้"""
    hi, total = max(vals), sum(vals)
    if channel in ("ตำแหน่ง", "ความยาว"):
        return gap / hi
    if channel == "มุม":
        return gap / total
    if channel == "พื้นที่":
        return (hi ** 0.5 - (hi - gap) ** 0.5) / hi ** 0.5
    return None


def lie_factor(a, b, floor):
    real = abs(a - b) / min(a, b)
    ha, hb = a - floor, b - floor
    return abs(ha - hb) / min(ha, hb) / real


def audit(name, s):
    """ตรวจสไลด์หนึ่งใบ — สถานะต่อข้อมีสามแบบ: True ผ่าน · False ตก · None ตอบไม่ได้"""
    vals = [v for _, v in s["data"]]
    rank = sorted(s["data"], key=lambda kv: -kv[1])
    steps = [(rank[i], rank[i + 1]) for i in range(len(rank) - 1)]
    tight = min(steps, key=lambda p: p[0][1] - p[1][1])
    big, small = tight[0][1], tight[1][1]
    gap = big - small
    rows = []

    # 1 · ช่องทาง (บทที่ 4-5)
    rung = LADDER[s["channel"]]
    share = share_of_range(gap, vals, s["channel"])
    if share is None:
        rows.append((None, f"ช่องทาง {s['channel']} = ขั้น {rung} ของบันได "
                           f"· เรขาคณิตให้ส่วนแบ่งของช่วงไม่ได้ ต้องตัดสินด้วยมือ"))
    else:
        rows.append((share >= K, f"ช่องว่างแคบสุด {gap} จุด ได้ {share * 100:.2f}% ของช่วง "
                                 f"(ช่องทาง {s['channel']} = ขั้น {rung} ของบันได)"))

    # 2 · ฐานแกน (บทที่ 6, 9) — เกี่ยวเฉพาะช่องทางที่อ่านค่าจากความยาว
    floor = s.get("axis_floor")
    if s["channel"] not in ("ความยาว", "พื้นที่"):
        rows.append((None, f"ช่องทาง {s['channel']} ไม่มีฐานแกนให้ตัด ข้อนี้ไม่เกี่ยว"))
    elif floor is None:
        rows.append((None, "ช่องทางนี้อ่านค่าจากความยาว แต่ spec ไม่ได้บอกฐานแกน จึงตัดสินไม่ได้"))
    elif floor >= small:
        rows.append((False, f"ฐานแกนที่ {floor} ตัดจนแท่งที่สั้นกว่าเหลือ {small - floor} "
                            f"· สัดส่วนหายไปทั้งหมด ตัวคูณคำนวณไม่ได้ด้วยซ้ำ"))
    else:
        lf = lie_factor(big, small, floor)
        rows.append((abs(lf - 1) < 0.01, f"ฐานแกนที่ {floor} -> ตัวคูณคำโกหก {lf:.2f}"))

    # 3 · สี (บทที่ 8) — ข้อนี้อ่านจาก spec ล้วน สคริปต์ไม่ได้เห็นสีจริง
    rows.append((s["color_carries"] != "ปริมาณ",
                 f"spec บอกว่าสีทำหน้าที่ {s['color_carries']} ด้วย {s['hues']} สี"))

    # 4 · งานโหมดไล่ทีละชิ้น (บทที่ 2, 11)
    n = len(s["data"])
    serial = (n if s["legend"] else 0) + (0 if s["sorted_by_value"] else n - 1) \
        + (0 if s["values_printed"] else n)
    rows.append((serial == 0, f"คนอ่านต้องไล่ทีละชิ้น {serial} ครั้ง"))

    # 5 · หมึกเปล่า (บทที่ 7) — อ่านจาก spec ล้วนเหมือนกัน ต้องนับจากภาพจริงมาก่อน
    ink = s["ink"]
    rows.append((ink["เปล่า"] == 0,
                 f"spec บอกว่าหมึกเปล่า {ink['เปล่า']} ชิ้น จาก {sum(ink.values())} "
                 f"· หมึกที่เป็นข้อมูล {ink['ข้อมูล'] / sum(ink.values()) * 100:.1f}%"))

    # 6 · ความครบของชุด (บทที่ 12)
    names = [k for k, _ in s["data"]]
    complete = sum(vals) == s["universe"] and len(set(names)) == len(names)
    rows.append((complete, f"{len(names)} กลุ่ม รวมได้ {sum(vals)} จากขอบเขต {s['universe']}"))

    # 7 · หัวข้อ (บทที่ 13) — เทียบรายการที่คำนวณได้ กับรายการที่ spec ประกาศว่าหัวข้อพูดถึง
    #     ช่องทางที่เรขาคณิตวัดไม่ได้ (or 0) ถือว่าภาพแบกไม่ไหวทุกข้อไว้ก่อน จนกว่าจะพิสูจน์ว่าไหว
    need = [(a[0], b[0], a[1] - b[1]) for a, b in steps + [(rank[0], rank[-1])]
            if (share_of_range(a[1] - b[1], vals, s["channel"]) or 0) < K]
    missing = [f for f in need if f not in s["headline_facts"]]
    rows.append((not missing,
                 f"ภาพแบกไม่ไหว {len(need)} ข้อ "
                 f"· spec บอกว่าหัวข้อพูดถึง {len(need) - len(missing)} ข้อ"))

    mark = {True: "ผ่าน", False: "ตก  ", None: "ข้าม"}
    tally = {v: sum(1 for ok, _ in rows if ok is v) for v in (True, False, None)}
    print(f"=== {name} — ตก {tally[False]} · ผ่าน {tally[True]} · ข้าม {tally[None]} "
          f"จาก {len(rows)} ข้อ ===")
    for i, ((ok, detail), (question, src)) in enumerate(zip(rows, CHECKS), start=1):
        print(f"  {i}. [{mark[ok]}] {question} (บทที่ {src})")
        print(f"        {detail}")
    print()
    return tally[False]


DATA = [("", 22), ("", 18), ("", 25), ("", 16), ("", 19)]

SLIDE_BEFORE = dict(
    data=DATA, universe=100, channel="มุม", axis_floor=None,
    legend=True, sorted_by_value=False, values_printed=False,
    hues=5, color_carries="ตัวตนของกลุ่ม",
    ink={"ข้อมูล": 5, "บริบท": 2, "เปล่า": 11},
    headline_facts=[],
)
SLIDE_AFTER = dict(
    data=DATA, universe=100, channel="ความยาว", axis_floor=0,
    legend=False, sorted_by_value=True, values_printed=True,
    hues=1, color_carries="เน้นข้อสรุป",
    ink={"ข้อมูล": 16, "บริบท": 2, "เปล่า": 0},
    headline_facts=[("", "", 1)],
)

before = audit("สไลด์ตั้งต้นของบทที่ 14", SLIDE_BEFORE)
after = audit("สไลด์ที่ประกอบใหม่ในบทที่ 14", SLIDE_AFTER)
print(f"ข้อที่ตก {before} -> {after} โดยตัวเลขต้นทางไม่ขยับเลยสักตัว")
print("ทุกข้อที่ตกมีชื่อบทกำกับ จึงย้อนกลับไปอ่านกลไกที่มันมาได้เสมอ")

# --- เคสที่เครื่องมือต้องไม่ตาย: ช่องทางที่เรขาคณิตวัดไม่ได้ กับฐานแกนที่ตัดเกิน ---
print("\n=== เอาไปใช้กับสไลด์แบบอื่นแล้วมันตอบว่าอะไร ===")
audit("ถ้าเข้ารหัสด้วยความเข้มบน heatmap", {**SLIDE_AFTER, "channel": "ความเข้ม"})
audit("ถ้าเผลอตัดฐานแกนไว้ที่ 18", {**SLIDE_AFTER, "axis_floor": 18})

print("=== แผนที่ของ FIG 15.1: บทไหนอยู่ตรงไหน ===")
for i, (question, src) in enumerate(CHECKS, start=1):
    print(f"  ข้อ {i} <- บทที่ {src}: {question}")
print("  กรอบความคิด (ไม่ใช่ข้อตรวจ) <- บทที่ 1, 3, 10")

ผลรันจริง

=== สไลด์ตั้งต้นของบทที่ 14 — ตก 4 · ผ่าน 2 · ข้าม 1 จาก 7 ข้อ ===
  1. [ตก  ] ช่องทางแบกช่องว่างที่แคบที่สุดไหวไหม (บทที่ 4-5)
        ช่องว่างแคบสุด 1 จุด ได้ 1.00% ของช่วง (ช่องทาง มุม = ขั้น 5 ของบันได)
  2. [ข้าม] ฐานแกนบิดสัดส่วนหรือเปล่า (บทที่ 6, 9)
        ช่องทาง มุม ไม่มีฐานแกนให้ตัด ข้อนี้ไม่เกี่ยว
  3. [ผ่าน] สีกำลังแบกปริมาณอยู่ไหม (บทที่ 8)
        spec บอกว่าสีทำหน้าที่ ตัวตนของกลุ่ม ด้วย 5 สี
  4. [ตก  ] คนอ่านต้องไล่ทีละชิ้นกี่ครั้ง (บทที่ 2, 11)
        คนอ่านต้องไล่ทีละชิ้น 14 ครั้ง
  5. [ตก  ] หมึกที่ไม่ตอบคำถามไหนเลยเหลือกี่ชิ้น (บทที่ 7)
        spec บอกว่าหมึกเปล่า 11 ชิ้น จาก 18 · หมึกที่เป็นข้อมูล 27.8%
  6. [ผ่าน] ชุดที่แสดงครบขอบเขตไหม (บทที่ 12)
        5 กลุ่ม รวมได้ 100 จากขอบเขต 100
  7. [ตก  ] หัวข้อแบกข้อที่ภาพแบกไม่ไหวครบไหม (บทที่ 13)
        ภาพแบกไม่ไหว 4 ข้อ · spec บอกว่าหัวข้อพูดถึง 0 ข้อ

=== สไลด์ที่ประกอบใหม่ในบทที่ 14 — ตก 1 · ผ่าน 6 · ข้าม 0 จาก 7 ข้อ ===
  1. [ตก  ] ช่องทางแบกช่องว่างที่แคบที่สุดไหวไหม (บทที่ 4-5)
        ช่องว่างแคบสุด 1 จุด ได้ 4.00% ของช่วง (ช่องทาง ความยาว = ขั้น 3 ของบันได)
  2. [ผ่าน] ฐานแกนบิดสัดส่วนหรือเปล่า (บทที่ 6, 9)
        ฐานแกนที่ 0 -> ตัวคูณคำโกหก 1.00
  3. [ผ่าน] สีกำลังแบกปริมาณอยู่ไหม (บทที่ 8)
        spec บอกว่าสีทำหน้าที่ เน้นข้อสรุป ด้วย 1 สี
  4. [ผ่าน] คนอ่านต้องไล่ทีละชิ้นกี่ครั้ง (บทที่ 2, 11)
        คนอ่านต้องไล่ทีละชิ้น 0 ครั้ง
  5. [ผ่าน] หมึกที่ไม่ตอบคำถามไหนเลยเหลือกี่ชิ้น (บทที่ 7)
        spec บอกว่าหมึกเปล่า 0 ชิ้น จาก 18 · หมึกที่เป็นข้อมูล 88.9%
  6. [ผ่าน] ชุดที่แสดงครบขอบเขตไหม (บทที่ 12)
        5 กลุ่ม รวมได้ 100 จากขอบเขต 100
  7. [ผ่าน] หัวข้อแบกข้อที่ภาพแบกไม่ไหวครบไหม (บทที่ 13)
        ภาพแบกไม่ไหว 1 ข้อ · spec บอกว่าหัวข้อพูดถึง 1 ข้อ

ข้อที่ตก 4 -> 1 โดยตัวเลขต้นทางไม่ขยับเลยสักตัว
ทุกข้อที่ตกมีชื่อบทกำกับ จึงย้อนกลับไปอ่านกลไกที่มันมาได้เสมอ

=== เอาไปใช้กับสไลด์แบบอื่นแล้วมันตอบว่าอะไร ===
=== ถ้าเข้ารหัสด้วยความเข้มบน heatmap — ตก 1 · ผ่าน 4 · ข้าม 2 จาก 7 ข้อ ===
  1. [ข้าม] ช่องทางแบกช่องว่างที่แคบที่สุดไหวไหม (บทที่ 4-5)
        ช่องทาง ความเข้ม = ขั้น 7 ของบันได · เรขาคณิตให้ส่วนแบ่งของช่วงไม่ได้ ต้องตัดสินด้วยมือ
  2. [ข้าม] ฐานแกนบิดสัดส่วนหรือเปล่า (บทที่ 6, 9)
        ช่องทาง ความเข้ม ไม่มีฐานแกนให้ตัด ข้อนี้ไม่เกี่ยว
  3. [ผ่าน] สีกำลังแบกปริมาณอยู่ไหม (บทที่ 8)
        spec บอกว่าสีทำหน้าที่ เน้นข้อสรุป ด้วย 1 สี
  4. [ผ่าน] คนอ่านต้องไล่ทีละชิ้นกี่ครั้ง (บทที่ 2, 11)
        คนอ่านต้องไล่ทีละชิ้น 0 ครั้ง
  5. [ผ่าน] หมึกที่ไม่ตอบคำถามไหนเลยเหลือกี่ชิ้น (บทที่ 7)
        spec บอกว่าหมึกเปล่า 0 ชิ้น จาก 18 · หมึกที่เป็นข้อมูล 88.9%
  6. [ผ่าน] ชุดที่แสดงครบขอบเขตไหม (บทที่ 12)
        5 กลุ่ม รวมได้ 100 จากขอบเขต 100
  7. [ตก  ] หัวข้อแบกข้อที่ภาพแบกไม่ไหวครบไหม (บทที่ 13)
        ภาพแบกไม่ไหว 5 ข้อ · spec บอกว่าหัวข้อพูดถึง 1 ข้อ

=== ถ้าเผลอตัดฐานแกนไว้ที่ 18 — ตก 2 · ผ่าน 5 · ข้าม 0 จาก 7 ข้อ ===
  1. [ตก  ] ช่องทางแบกช่องว่างที่แคบที่สุดไหวไหม (บทที่ 4-5)
        ช่องว่างแคบสุด 1 จุด ได้ 4.00% ของช่วง (ช่องทาง ความยาว = ขั้น 3 ของบันได)
  2. [ตก  ] ฐานแกนบิดสัดส่วนหรือเปล่า (บทที่ 6, 9)
        ฐานแกนที่ 18 ตัดจนแท่งที่สั้นกว่าเหลือ 0 · สัดส่วนหายไปทั้งหมด ตัวคูณคำนวณไม่ได้ด้วยซ้ำ
  3. [ผ่าน] สีกำลังแบกปริมาณอยู่ไหม (บทที่ 8)
        spec บอกว่าสีทำหน้าที่ เน้นข้อสรุป ด้วย 1 สี
  4. [ผ่าน] คนอ่านต้องไล่ทีละชิ้นกี่ครั้ง (บทที่ 2, 11)
        คนอ่านต้องไล่ทีละชิ้น 0 ครั้ง
  5. [ผ่าน] หมึกที่ไม่ตอบคำถามไหนเลยเหลือกี่ชิ้น (บทที่ 7)
        spec บอกว่าหมึกเปล่า 0 ชิ้น จาก 18 · หมึกที่เป็นข้อมูล 88.9%
  6. [ผ่าน] ชุดที่แสดงครบขอบเขตไหม (บทที่ 12)
        5 กลุ่ม รวมได้ 100 จากขอบเขต 100
  7. [ผ่าน] หัวข้อแบกข้อที่ภาพแบกไม่ไหวครบไหม (บทที่ 13)
        ภาพแบกไม่ไหว 1 ข้อ · spec บอกว่าหัวข้อพูดถึง 1 ข้อ

=== แผนที่ของ FIG 15.1: บทไหนอยู่ตรงไหน ===
  ข้อ 1 <- บทที่ 4-5: ช่องทางแบกช่องว่างที่แคบที่สุดไหวไหม
  ข้อ 2 <- บทที่ 6, 9: ฐานแกนบิดสัดส่วนหรือเปล่า
  ข้อ 3 <- บทที่ 8: สีกำลังแบกปริมาณอยู่ไหม
  ข้อ 4 <- บทที่ 2, 11: คนอ่านต้องไล่ทีละชิ้นกี่ครั้ง
  ข้อ 5 <- บทที่ 7: หมึกที่ไม่ตอบคำถามไหนเลยเหลือกี่ชิ้น
  ข้อ 6 <- บทที่ 12: ชุดที่แสดงครบขอบเขตไหม
  ข้อ 7 <- บทที่ 13: หัวข้อแบกข้อที่ภาพแบกไม่ไหวครบไหม
  กรอบความคิด (ไม่ใช่ข้อตรวจ) <- บทที่ 1, 3, 10

ผลรันนี้มีสามจุดที่ควรอ่านช้า ๆ

จุดแรก สไลด์ที่ประกอบใหม่ ยังตกข้อที่หนึ่งอยู่ ช่องว่าง 1 จุดได้ 4.00% ซึ่งยังไม่ถึงเกณฑ์ นี่ไม่ใช่ความล้มเหลวของบทที่ 14 แต่มันคือสิ่งที่หัวข้อ 5.4 บอกไว้ตั้งแต่แรกว่า บางชุดข้อมูลไม่มีช่องทางไหนแสดงได้ และทางออกไม่ใช่การไล่เปลี่ยนชนิดกราฟ · ข้อที่เจ็ดจึงผ่าน เพราะข้อที่ตกถูกย้ายไปอยู่ในหัวข้อเรียบร้อยแล้ว เช็กลิสต์ที่ดีไม่ได้บังคับให้ทุกข้อผ่าน มันบังคับให้ทุกข้อที่ตกมีที่ไป

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

จุดที่สาม สองบล็อกท้ายคือการเอาเครื่องมือไปใช้กับสไลด์ที่ไม่ใช่สองใบนี้ — heatmap ที่เข้ารหัสด้วยความเข้ม กับสไลด์ที่เผลอตัดฐานแกนไว้ที่ 18 · ทั้งสองเคสมันตอบ ไม่ได้ตาย และคำตอบก็ใช้ได้จริง: เคสแรกบอกว่าเรขาคณิตวัดไม่ได้ ต้องตัดสินด้วยมือ · เคสที่สองบอกว่าแท่งที่สั้นกว่าเหลือศูนย์ ซึ่งพังยิ่งกว่าตัวคูณคำโกหกสูง ๆ เสียอีก · เครื่องมือที่ตายเมื่อเจอของนอกตัวอย่าง คือเครื่องมือที่ใช้ได้แค่กับตัวอย่าง

15.3 สี่อย่างที่สคริปต์นี้ตรวจไม่ได้

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

ศูนย์ มันไม่เคยเห็นสไลด์ของคุณ ข้อนี้ต้องมาก่อนทุกข้อ เพราะมันเปลี่ยนวิธีอ่านผลรันทั้งหมด — audit() อ่าน dict ที่คุณพิมพ์เอง ไม่ได้อ่านภาพ · ข้อที่สามกับข้อที่ห้าตัดสินจาก color_carries กับ ink ล้วน ๆ และข้อที่เจ็ดก็เทียบกับ headline_facts ที่คุณประกาศ ไม่ได้อ่านสตริงหัวข้อจริง (สังเกตคำว่า "spec บอกว่า" ในผลรัน — มันเตือนตรงนั้น) · ถ้าคุณกรอกว่าหมึกเปล่าเป็น 0 มันก็เชื่อ · ด่านเดียวคือต้องนับจากภาพจริงก่อนกรอก ซึ่งเป็นงานของคุณ ไม่ใช่ของสคริปต์

⚠️ นี่คือกลไกเดียวกับตัวคูณคำโกหกของหัวข้อในบทที่ 13.4 เป๊ะ ๆ — ตัวเลขที่ดูน่าเชื่อที่สุด คือตัวเลขที่คนอ่านตรวจย้อนไม่ได้ และคราวนี้คนอ่านคือคุณเอง

หนึ่ง ข้อมูลถูกหรือเปล่า สคริปต์รับ DATA มาแล้วเชื่อทันที ถ้าตัวเลขผิดตั้งแต่ต้น มันจะให้กราฟที่ผ่านครบเจ็ดข้อและบอกเรื่องที่ไม่จริงได้อย่างสวยงาม · ด่านเดียวที่มีคือนิสัยจากบทที่ 10 — วาดให้ตัวเองดูก่อนสรุปเสมอ ซึ่งเป็นนิสัย ไม่ใช่ข้อตรวจ จึงไม่ได้อยู่ในรายการเจ็ดข้อ

สอง คำถามใช่หรือเปล่า ทุกข้อในเช็กลิสต์วัดว่าภาพตอบคำถามที่ตั้งไว้ได้ดีแค่ไหน แต่ไม่มีข้อไหนถามว่าคำถามนั้นถูกต้องไหม · นี่คือบทเรียนของหัวข้อ 14.5 ที่ขยายออกไป — จุดบนแกนร่วมแพ้แท่งเพราะคำถามของสไลด์ ไม่ใช่เพราะอันดับบนบันได ถ้าตั้งคำถามผิด กราฟที่ผ่านเจ็ดข้อก็ยังตอบผิดอยู่ดี

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

เครื่องมือที่ดีคือเครื่องมือที่บอกได้ว่าตัวเองไม่รู้อะไร

15.4 ทั้งเล่มในภาพเดียว

สายพานของบทที่ 3 กับบททั้งหมดที่แขวนอยู่บนมันตัวเลขจริงสิ่งที่คุณมีในมือ10 ค่าสรุปปิดบังเข้ารหัสขั้นเดียวที่คุณคุมได้4 ช่องทาง7 หมึก8 สี9 ฐานแกน11 ระยะห่าง12 การแบ่งกลุ่ม13 หัวข้อถอดรหัสตาของคนอ่าน2 สองโหมด5 บันไดความแม่น6 กฎของเวเบอร์ข้อสรุปสิ่งที่เขาเอาไปตัดสินใจ1 อาการที่มองเห็นบทที่ 3 คือตัวสายพานเอง · บทที่ 14 ประกอบทั้งสายพานลงบนสไลด์เดียว · บทที่ 15 คือเช็กลิสต์ที่เดินตามสายพาน
FIG 15.1 สายพานเดียวกับ FIG 3.1 แค่แขวนทุกบทลงไปตรงขั้นที่มันทำงานอยู่จริง · เจ็ดจากสิบสองบทที่แขวนอยู่ กองที่ขั้นเข้ารหัส เพราะนั่นคือขั้นเดียวที่คุณคุมได้ · สามบทที่อยู่ตรงขั้นถอดรหัสไม่ได้สอนให้ทำอะไร มันบอกว่าคุณกำลังส่งของเข้าเครื่องแบบไหน

ภาพนี้คือสายพานของบทที่ 3 ที่คุณเห็นตั้งแต่ต้นเล่ม แค่แขวนทุกบทลงไปตรงขั้นที่มันทำงานอยู่จริง

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

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

และมีสามบทที่ไม่ได้แขวนอยู่บนสายพานเลย คือบทที่ 3 ซึ่งเป็นตัวสายพานเอง บทที่ 14 ที่ประกอบทั้งสายพานลงบนสไลด์เดียว และบทที่ 15 ที่คุณกำลังอ่านอยู่ ซึ่งเป็นเช็กลิสต์ที่เดินตามสายพานทีละขั้น

15.5 คุณกลายเป็นใคร

หน้าแรกของเล่มนี้สัญญาไว้ว่าอ่านจบแล้วคุณจะ มองกราฟตรงหน้าออกเองว่ามันจะถูกอ่านผิดตรงไหน และแก้ได้โดยไม่ต้องถามใคร

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

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

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

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

กฎบอกคุณว่าต้องทำอะไร กลไกบอกคุณว่าทำไม และมีแค่อย่างหลังที่ตามคุณไปได้ในวันที่โจทย์เปลี่ยน

อ่านต่อ: ราคา vs มูลค่า#

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

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

คู่มือหุ้น — ราคา vs มูลค่า — อ่านงบการเงินเป็นด้วยตัวเอง และแยกออกว่าตัวเลขตรงหน้าคือราคาที่ตลาดตกลงกัน หรือมูลค่าที่กิจการสร้างจริง

If this was useful —buy me a coffee

Read the full book