ความสำคัญของชั่วโมงบิน
เขาว่ากันว่าถ้าอยากจะเขียนโค้ดให้เก่ง ให้เขียนโค้ดเยอะๆ บทนี้จะพูดถึงความสำคัญของการเขียนโปรแกรมเยอะๆ และแนะนำวิธีต่างๆ ที่อาจจะช่วยกระตุ้นให้เราได้นำการเขียนโปรแกรมมาใช้ได้เยอะขึ้น
“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 มาบางส่วนให้เราได้ฝึกโจทย์หลายๆ รูปแบบ โดยเราสามารถตั้งค่าแผนการเรียนรู้ของเราได้ว่าอยากฝึกกี่สัปดาห์ สัปดาห์ละกี่ชั่วโมง เว็บนี้ก็จะคัดเลือกโจทย์ตามที่ตั้งค่าไว้มาให้ทำครับ
บางคนอาจจะเจอสิ่งที่ทำให้ตัวเองเสพติดการเขียนโค้ด หรือเสพติดการแก้ปัญหาด้วยโค้ด จนแทบไม่ต้องใช้วินัยหรือใช้เครื่องมือต่างๆ ที่ว่ามาเลยก็ได้ อาศัยความอยากรู้อยากลอง ความตื่นเต้นที่ได้เรียนสิ่งใหม่ๆ ความร้อนวิชา ความหาทำ มาฝึกฝนจนถึงจุดที่เชี่ยวชาญได้
ดังนั้นก็หวังว่าทุกๆ ท่าน จะหาเส้นทางของตัวเองเจอครับ
สรุปสุดท้ายคือ การจะเขียนโปรแกรมให้ชำนาญน่าจะต้องใช้ชั่วโมงบินเข้าสู้ ไม่มากก็น้อยครับ