Topic 46 ไขปริศนาที่ดูเหมือนแก้ไม่ได้

กษัตริย์กอร์เดียสแห่งฟรีเจีย (Gordius, King of Phrygia) เคยผูกปมเชือกที่ไม่มีใครแก้ออกได้ มีคำเล่าลือกันว่าใครก็ตามที่แก้ปมกอร์เดียน (Gordian Knot) นี้ได้สำเร็จ จะได้ปกครองทั่วทั้งเอเชีย แล้วอเล็กซานเดอร์มหาราชก็เดินเข้ามา แล้วฟันปมนั้นขาดกระจุยด้วยดาบของเขา แค่ตีความ requirement ต่างออกไปนิดเดียวเท่านั้นเอง… และสุดท้ายเขาก็ได้ปกครองเอเชียเกือบทั้งหมดจริงๆ

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

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

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

แน่นอนว่ามันไม่มี คำตอบอยู่ที่อื่น เคล็ดลับในการไขปริศนาคือการระบุ constraint ที่เป็นจริง (ไม่ใช่ที่คิดไปเอง) แล้วหาคำตอบจากตรงนั้น constraint บางอย่างเป็น สิ่งที่ต้องยึดถือแน่นอน (absolute) ส่วนบางอย่างก็แค่เป็น ความคิดที่เราเข้าใจไปเอง (preconceived notions) constraint ที่ absolute จริงๆ นั้น ต้อง ทำตามเสมอ ไม่ว่ามันจะดูน่ารำคาญหรือโง่เขลาแค่ไหนก็ตาม

ในทางกลับกัน อย่างที่อเล็กซานเดอร์พิสูจน์ให้เห็น constraint ที่ดูเหมือนมีอยู่บางอย่างอาจไม่ใช่ constraint จริงๆ เลยก็ได้ ปัญหา software จำนวนมากก็แอบแฝงมาในลักษณะเดียวกันนี้แหละครับ

Degrees of Freedom (ระดับขั้นแห่งอิสระ)

วลียอดฮิต “thinking outside the box” กระตุ้นให้เรามองหา constraint ที่อาจใช้ไม่ได้จริง แล้วเพิกเฉยต่อมัน แต่วลีนี้ไม่ได้ถูกต้องซะทีเดียว ถ้า “box” คือขอบเขตของ constraint และเงื่อนไขต่างๆ เคล็ดลับก็คือการ หา box นั้นให้เจอ ซึ่งมันอาจจะใหญ่กว่าที่คุณคิดไว้มากเลยก็ได้

กุญแจสำคัญในการไขปริศนาคือการมองเห็นทั้ง constraint ที่ถูกวางไว้กับคุณ และมองเห็นระดับขั้นแห่งอิสระ (degrees of freedom) ที่คุณ มี จริงๆ เพราะคำตอบของคุณจะซ่อนอยู่ตรงนั้นแหละ นี่คือเหตุผลที่ปริศนาบางอย่างถึงได้ผลนัก เพราะคุณอาจปัดตกคำตอบที่เป็นไปได้เร็วเกินไป

ยกตัวอย่างเช่น คุณสามารถลากเส้นเชื่อมจุดทั้งหมดในปริศนาต่อไปนี้ แล้ววกกลับมาจุดเริ่มต้นได้ด้วยเส้นตรงแค่สามเส้นไหม โดยห้ามยกปากกาออกจากกระดาษ และห้ามลากทับเส้นเดิม ( Math Puzzles & Games  [Hol92] )?

Four dots are shown.

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

มันไม่ได้อยู่ที่ว่าคุณคิดในกรอบหรือนอกกรอบ ปัญหาจริงๆ อยู่ที่การ หา กรอบนั้นให้เจอ นั่นคือการระบุ constraint ที่เป็นจริง

Tip 81 อย่าคิดนอกกรอบ— หากรอบ ให้เจอ

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

ลองนึกถึงม้าโทรจัน (Trojan horse) ดูสิ เป็นทางออกที่แปลกใหม่สำหรับปัญหาที่ดูแก้ไม่ตก จะพาทหารเข้าเมืองที่มีกำแพงล้อมรอบโดยไม่ถูกจับได้ยังไง? เดาได้เลยว่า “เดินเข้าประตูหน้าตรงๆ” ต้องถูกตัดทิ้งไปตั้งแต่แรกเพราะดูเหมือนการฆ่าตัวตายชัดๆ

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

แถมให้อีกนิด คำตอบของปริศนา Four Posts นั้นแสดงไว้ ท้ายเล่ม ครับ

Get Out of Your Own Way! (ก้าวออกจากทางของตัวเองซะ!)

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

นี่แหละคือเวลาที่เหมาะจะไปทำอย่างอื่นสักพัก ไปทำอะไรที่ต่างออกไป ไปเดินเล่นกับหมา หรือนอนคิดดูก่อน

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

ถ้าฟังดูเหมือนเรื่องลี้ลับเกินไปสำหรับคุณ ขอบอกว่ามันไม่ใช่เลย Psychology Today [72] รายงานไว้ว่า:

พูดง่ายๆ ก็คือ คนที่ถูกทำให้วอกแวกกลับทำงานแก้ปัญหาที่ซับซ้อนได้ดีกว่าคนที่ทุ่มความพยายามแบบรู้ตัวเต็มที่

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

ลองให้พวกเขาถามคำถามแบบนี้ดู:

  • ทำไมคุณถึงต้องแก้ปัญหานี้?

  • การแก้ปัญหานี้ได้ประโยชน์อะไรบ้าง?

  • ปัญหาที่คุณเจอเกี่ยวข้องกับ edge case หรือเปล่า? คุณตัดมันทิ้งได้ไหม?

  • มีปัญหาที่เกี่ยวข้องกันแต่ง่ายกว่าที่คุณแก้ได้ไหม?

นี่คืออีกตัวอย่างหนึ่งของการทำ Rubber Ducking ในทางปฏิบัติ

Fortune Favors the Prepared Mind (โชคชะตาเข้าข้างจิตใจที่เตรียมพร้อม)

มีรายงานว่า Louis Pasteur เคยกล่าวไว้ว่า:

Dans les champs de l'observation le hasard ne favorise que les esprits préparés.
(แปลว่า: ยามที่เป็นเรื่องของการสังเกต โชคชะตาจะเข้าข้างแต่จิตใจที่เตรียมพร้อมไว้แล้วเท่านั้น)

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

วิธีที่ดีในการป้อนอาหารให้สมองคือการให้ feedback กับมันว่าอะไรได้ผลและอะไรไม่ได้ผลระหว่างที่คุณทำงานประจำวัน และเราได้อธิบายวิธีที่ดีในการทำแบบนั้นด้วย Engineering Daybook ไว้แล้ว (Topic 22, ​ Engineering Daybooks ​ )

และอย่าลืมจดจำคำแนะนำบนปกหนังสือ The Hitchhiker's Guide to the Galaxy ไว้เสมอ: อย่าตื่นตระหนก (DON'T PANIC)

Related Sections Include (หัวข้อที่เกี่ยวข้อง)

  • Topic 5, ​ Good-Enough Software ​
  • Topic 37, ​ Listen to Your Lizard Brain ​
  • Topic 45, ​ The Requirements Pit ​
  • Andy เขียนหนังสือทั้งเล่มเกี่ยวกับเรื่องแบบนี้โดยเฉพาะ: Pragmatic Thinking and Learning: Refactor Your Wetware  [Hun08] .

Challenges (ความท้าทาย)

  • ลองมองปัญหายากๆ ที่คุณกำลังเจออยู่ตอนนี้อย่างจริงจังดูสิ คุณฟันปมกอร์เดียนได้ไหม? คุณจำเป็นต้องทำแบบนี้จริงๆ หรือเปล่า? หรือจำเป็นต้องทำมันเลยหรือเปล่า?

  • ตอนที่คุณเข้าร่วมโปรเจกต์ปัจจุบัน คุณได้รับชุด constraint มาด้วยหรือเปล่า? มันยังใช้ได้อยู่ทั้งหมดไหม แล้วการตีความ constraint พวกนั้นยังถูกต้องอยู่หรือเปล่า?