Skip to content
This page is a draft. It may be incomplete or contain inaccuracies. If you have any comment, please feel free to leave some feedback!

ความสำคัญของชั่วโมงบิน

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

“Quantity Always Trumps Quality”

  • ในบทความชื่อ “Quantity Always Trumps Quality” ของ Jeff Atwood[1] เจ้าของบทความเล่าเรื่องนึงจากหนังสือ Art & Fear:

    ครูสอนวิชาเซรามิกส์ ประกาศในวันเปิดเรียนว่า ครูจะแบ่งชั้นเรียนออกเป็นสองกลุ่ม คนที่อยู่ฝั่งซ้าย จะให้เกรดตามปริมาณชิ้นงานที่พวกเขาผลิตได้ ส่วนคนที่อยู่ฝั่งขวา จะให้เกรดตามคุณภาพของชิ้นงาน วิธีที่เขาจะให้เกรดนักเรียนในวิชานี้คือ: ในวันสุดท้ายของชั้นเรียน ครูจะนำตาชั่งมาชั่งน้ำหนักงานของนักเรียนในกลุ่ม “ปริมาณ” ถ้าน้ำหนักรวมกันเกิน 50 ปอนด์ จะได้เกรด A, สี่สิบปอนด์ได้เกรด B ฯลฯ ส่วนนักเรียนในกลุ่ม “คุณภาพ” จำเป็นต้องสร้างงานแค่ชิ้นเดียว แต้ต้องเป็นหม้อเซรามิกที่สมบูรณ์แบบและไร้ที่ติ ถึงจะได้เกรด A …พอวันสุดท้ายของชั้นเรียนมาถึง ความจริงก็ปรากฏขึ้น — ผลงานชั้นเยี่ยมทั้งหมด ถูกสร้างโดยกลุ่มที่ให้เกรดตาม “ปริมาณ” ดูเหมือนว่าระหว่างที่กลุ่ม “ปริมาณ” กำลังง่วนอยู่กับการปั่นผลงานกองโต (และเรียนรู้จากข้อผิดพลาดไปด้วยระหว่างทาง) กลุ่ม “คุณภาพ” กลับมัวแต่คิดทฤษฎีต่าง เกี่ยวกับความสมบูรณ์แบบ แต่ไม่ลงมือทำซะที จนท้ายที่สุด ก็ไม่เหลืออะไรมาพิสูจน์ความพยายามของพวกเขาได้ มากไปกว่าทฤษฎีอันสุดอลังกับ กองดินที่ใช้งานไม่ได้

  • และในบทความก็ทิ้งท้ายไว้ว่า:

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

Chris DeLeon กับเกม 219 เกม

  • ทำให้ผมนึกถึงวิดีโอนี้ครับ: InteractionArtist 219 Daily Experimental Gameplay Projects

  • ในวิดีโอนี้ Chris DeLeon เจ้าของคลิป เล่าประสบการณ์จากปี 2007–2008 ว่า ในทุก เย็น เขาจะสร้างเกมง่าย 1 เกม แล้วก็อัพโหลดผลงานขึ้นไปบนเว็บไซต์ของเขา… เขาทำแบบนี้อยู่ 219 วัน ในคลิปเขาก็เล่าว่าได้อะไรบ้างจากประสบการณ์นี้

  • ผมชอบคำพูดนึงมาก:

    The best way to improve design given 10x the design time is to make 10 versions and keep the best.

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

  • ในบรรดาเกม 219 เกมที่เขาทำ มีอยู่เพียง 5 เกมที่เขาได้เอาไปต่อยอด พัฒนาต่อ จนกลายเป็นแอปที่ขายบน App Store ได้ เขาเล่าว่า ถ้าเขาไม่ได้ทำเกมเยอะขนาดนี้ ก็คงหาไอเดียที่มันเวิร์คไม่เจอ และที่เขามาทำคลิปนี้ขึ้นมา เพราะเขาอยากจะโชว์ให้เห็นว่าอีก 214 เกมที่เหลือมันเป็นยังไง

สถิติจากคนเล่นเกม Tetr.io

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

  • ในเกมนี้จะมีโหมดนึง เรียกว่าโหมด 40 Lines เป้าหมายของโหมดนี้คือ ให้ต่อบล็อคให้ครบ 40 แถว ให้เร็วที่สุด ตอนที่เขียน สถิติของผมอยู่ที่ 1 นาที 12 วินาที และผมเล่นเกมนี้ไปแล้ว 160 ชั่วโมง ถือว่าติดเกมใช้ได้

  • ผมเลยอยากรู้ว่า มีความสัมพันธ์ระหว่าง “Play time” (จำนวนชั่วโมงที่ลงไปเก็บเกมนี้) กับ “เวลาที่ใช้ในการเคลียร์ 40 Lines” ไหม

  • ผมจึงสุ่มคนมาจำนวน 20,000 คน แล้วลองถามแต่ละคนว่า (1.) Play time ของคุณกี่ชั่วโมง และ (2.) สถิติในการเคลียร์ 40 Lines ของคุณอยู่ที่กี่วินาที

  • แน่นอน งานเยอะขนาดนี้ ผมไม่มีทางทำเองด้วยมือหรอก ผมจึงเขียนโค้ดมาเพื่อ automate การเก็บข้อมูลนี้

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

  • หลังจากที่รอเสร็จแล้ว ผมก็เอาข้อมูลที่ได้มาวิเคราะห์ครับ

  • ผมลองสร้างแผนภาพ Scatterplot ขึ้นมา โดยให้แกนแนวนอน แทน Game time (จำนวนชั่วโมงที่เล่นเกม) ส่วนแกนแนวตั้ง แทนเวลาที่ใช้ในการเคลียร์ 40 Lines

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

  • ลองเอาข้อมูลจากผู้เล่น 20,000 คนมาพล็อตใส่ในรูปดู

  • ถึงจะพอเห็นแนวโน้ม แต่มันก็ดูยากครับ… ผมจึงเอาผู้เล่นทั้งหมดมาเรียงกัน เริ่มจากคนที่มี Play time น้อยสุด ไปยังคนที่มี Play time เยอะสุด เสร็จแล้วก็แบ่งเป็น 20 กลุ่ม กลุ่มละ 1,000 คน

  • คราวนี้ในแต่ละกลุ่ม ผมเอาคนที่ทำเวลาเร็วที่สุด และช้าที่สุด ออกไปฝั่งละ 10% ครับ (ก็จะเหลือ 80% ตรงกลาง)[2] ก็จะเห็นแนวโน้มได้อย่างชัดเจนขึ้นครับ

  • ผมเอามาทำเป็นแผนภาพเส้น ได้เป็นรูปออกมาแบบนี้ครับ

    แผนภาพนี้แสดง ​(1) เวลาของคนที่เร็วที่สุด 10% แรก (top 10%), (2) เวลามัธยฐาน หรือเวลาของคนที่อยู่ตรงกลาง และ (3) เวลาของคนที่ช้าที่สุด 10% แรก (bottom 10%)

  • มาลองดูกลุ่มที่ 10 กันเป็นตัวอย่าง จากภาพจะสามารถตีความได้ว่า 80% ของคนที่มี Play time ตั้ง 50–60 ชั่วโมง จะสามารถเคลียร์ 40 Lines ได้ภายในเวลาระหว่าง 60–136 วินาทีครับ

  • คราวนี้เรามีแผนภาพนี้แล้วยังไง

  • ข้อสังเกตอย่างแรกคือ แต่ละคนมีต้นทุนและปัจจัยต่าง ไม่เท่ากัน อย่างในกลุ่มแรก คนที่เพิ่งเล่นเกมนี้บางคน ใช้เวลาแค่นาทีกว่า เท่านั้น ในขณะที่บางคนต้องใช้เวลากว่า 3 นาทีในการเคลียร์ 40 แถว ถือว่าเวลาที่ใช้ต่างกันเกือบ 3 เท่า

  • ข้อสังเกตต่อไปก็คือ ในบรรดาคนที่เพิ่งเริ่มเล่น เกินกว่า 90% ไม่สามารถทำเวลาให้เร็วกว่า 1 นาทีได้เลย ในขณะที่ถ้าเล่นไปสัก 600 ชั่วโมง จะเห็นว่ากว่า 90% ทำเวลาได้เร็วกว่า 1 นาทีทั้งนั้น ดังนั้น เวลาที่ใช้ในการฝึกฝน มีความสัมพันธ์กับความเชียวชาญแน่นอน สัมพันธ์พอที่จะทำให้จากที่อยู่ 10% ล่างสุด ขยับมาอยู่ที่ 10% บนสุดได้ แต่ใช้เวลามากหรือน้อยก็อีกเรื่อง บางคนที่เทพ หน่อย เล่นแค่ 60 ชั่วโมง ก็ทำเวลาเร็วกว่าหนึ่งนาทีได้แล้ว ส่วนกลุ่มคนที่เล่นประมาณ 200 ชั่วโมง ก็จะมีอยู่ประมาณครึ่งนึงที่ทำเวลาเร็วกว่า 1 นาทีได้

  • แต่จากรูปเดียวกันก็จะเห็นว่า ถึงแม้เวลาเป็นปัจจัยนึงที่สัมพันธ์กับเวลาในการเคลียร์ 40 Lines แต่มันไม่ใช่ปัจจัยเดียว บางคนฝึกซ้อมแบบเดิม ซ้ำ แต่เวลาที่ลงเพิ่มไป ก็ไม่ได้ทำให้ต่อบล็อกได้เร็วขึ้นมากเท่าไหร่ ผมเชื่อว่า วิธีฝึกฝนที่เหมาะสม ก็เป็นอีกปัจจัยนึงที่จะทำให้ชำนาญขึ้นได้เร็ว ตัวอย่างเช่น ก็จะมีเว็บแบบ four.lol ที่สอนวิธีการวางบล็อกแต่ละชิ้นให้เร็วที่สุด หรือวิดีโอสอนเทคนิคการต่อบล็อกแบบ 6-3 เพื่อให้ต่อบล็อกเป็นแถวได้ง่ายขึ้น

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

  • คำถามที่เหลือก็คือ ทำยังไงด่ี เราถึงจะลงเวลาเยอะขนาดนั้นได้ คนรู้จักผมคนนึง เวลาผมเล่นเกมนี้กับเขาแล้ว ผมแพ้เขาอย่างราบคาบทุกทีเลย ผมเลยลองไปเช็คเวลาที่เขาเล่น เขาเล่นเกมนี้ไปแล้วกว่า 1,200 ชั่วโมง (ชั่วโมงบินเยอะกว่าผม 7.5 เท่า!) ผมเลยถามเขาว่า เขาทำยังไงถึงเอาเวลามาเล่นได้เยอะขนาดนั้น เขาตอบผมสั้น ว่าเขา ติดเกมมากเกินไป เลยเป็นแบบนี้

  • ผมก็เชื่อว่าการเขียนโปรแกรมให้ชำนาญ ก็จำเป็นต้องอาศัยชั่วโมงบินไม่แพ้การเล่นเกมครับ…

100 days of code และอื่น

  • บางคนเป็นคนขยัน มีวินัย หรืออยากจะฝึกวินัยตัวเอง — ใน community ของนักพัฒนา จะมีแคมเปญนึงที่ชื่อว่า #100DaysOfCode เป็นโครงการที่เชียร์ให้คนที่อยากฝึกเขียนโปรแกรมแบบจริง จัง ได้ใช้เวลาอย่างน้อย 1 ชั่วโมงต่อวัน ในการฝึกฝน โดยไม่จำกัดว่าจะต้องทำอะไร — จะลองแก้โจทย์ปัญหาอัลกอริธึมก็ได้ หรือจะทำโปรเจกต์ของตัวเองที่อยากทำก็ได้ — ขอแค่ให้อย่างน้อยมีพัฒนาการในทุก วัน หลังจากที่ทำแล้ว ก็แชร์ในโซเชียลมีเดีย ติดแฮชแท็ก #100DaysOfCode บางทีก็อาจจะมีเพื่อนร่วมทางมาคอยให้กำลังใจ

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

  • บางคนที่อยากฝึกทำโจทย์เยอะ เว็บ Grind75 ก็มีการคัดเลือกโจทย์จากเว็บ LeetCode มาบางส่วนให้เราได้ฝึกโจทย์หลาย รูปแบบ โดยเราสามารถตั้งค่าแผนการเรียนรู้ของเราได้ว่าอยากฝึกกี่สัปดาห์ สัปดาห์ละกี่ชั่วโมง เว็บนี้ก็จะคัดเลือกโจทย์ตามที่ตั้งค่าไว้มาให้ทำครับ

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

  • ดังนั้นก็หวังว่าทุก ท่าน จะหาเส้นทางของตัวเองเจอครับ

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


  1. Jeff Atwood เป็นผู้ร่วมก่อตั้งเว็บไซต์ถามและตอบการเขียนโปรแกรมคอมพิวเตอร์ Stack Overflow ↩︎

  2. เนื่องจากข้อมูลค่อนข้างมีความ noisy จึงทำการตัด outlier ออก เพื่อให้ได้ข้อมูลที่เป็น 80% confidence interval ↩︎