“วิธีการเรียนรู้/การเริ่มต้นงาน”: Trick ง่ายๆ ที่หลายคนมองข้าม

“การเรียนรู้” มันเป็นเรื่องโลกแตกสำหรับใครต่อใครหลายๆ คน ที่มีปัญหามากมาย แล้วก็ไม่ว่าจะเรียนรู้อะไรเท่าไหร่ ก็เหมือนกับจะไม่รู้เรื่อง หรือทำไม่ได้สักที …. ไม่ว่าจะเป็นการเรียนรู้ภาษาโปรแกรมใหม่ๆ หรือการเขียนโปรแกรมบนอุปกรณ์ใหม่ๆ การเรียนภาษาอังกฤษ หรือการเรียนรู้เรื่องอื่นๆ อีกหลายๆ เรื่อง … แล้วในที่สุดก็ต้องพึ่งพาทางลัดทั้งหลายทั้งปวง เพื่อให้ได้ผลลัพธ์ที่ตัวเองต้องการอย่างเร่งด่วนฉาบฉวย

วันนี้ผมก็เลยขอเสนอวิธี “ง่าย” ที่ได้ผลอย่างไม่น่าเชื่อในการเรียนรู้เรื่องอะไรต่ออะไรหลายๆ เรื่อง แล้วเป็นการอธิบายด้วยว่าทำไมเราถึงเรียนอะไรต่ออะไรกันยากเย็นนัก (เช่นพวกภาษาอังกฤษ หรือการเขียนโปรแกรม) ก็เพราะว่าเราเรียนรู้มันแบบ “ผิดวิธี” น่ะแหละ … คือเราเรียนรู้ด้วยการ “พยายามใช้มันเร็วเกินไป” ยกตัวอย่างเช่น บางคนเริ่มเรียนรู้การเขียนโปรแกรม จากโจทย์ที่ตัวเองทำไม่ได้ ไม่เคยทำได้ บางคนเริ่มเรียนภาษาอังกฤษ จากเนื้อหาที่ตัวเองก็ไม่ได้คุ้นเคยมาก่อน …. หรือที่เรียกว่า Unseen อะไรพวกนี้ … มันไม่ค่อยช่วยการเรียนรู้อะไรเท่าไหร่หรอก จริงๆ มันทำให้การเรียนรู้แย่ลงด้วยซ้ำไป

ลองพิจารณากันดูสักเล็กน้อยจะพบว่า … ในการอ่านหนังสือนั้น เรามีปัจจัยอย่างน้อยสองเรื่อง คือ “ภาษา” และ “เนื้อหา” ในขณะที่การเขียนโปรแกรมสักตัวนั้น เราก็มีปัจจัยพื้นฐานอย่างน้อย 2 เรื่อง คือ “ภาษา” และ “โครงสร้าง” ส่วนการพัฒนาโปรแกรมเพื่อตอบโจทย์ทางอะไรก็ตาม (เช่นโจทย์ทางธุรกิจ) จริงๆ นั้น ก็มีปัจจัยพื้นฐาน 2 เรื่องเช่นกัน คือ “ความสามารถในการพัฒนาโปรแกรม” และ “ความเข้าใจเรื่องราวนั้นๆ (เช่นความเข้าใจธุรกิจ)

เพื่อที่จะอธิบายเรื่องนี้ง่ายๆ ผมต้องขอใช้ “คณิตศาสตร์พื้นฐาน” มาอธิบายสักเล็กน้อย ว่าด้วยเรื่อง “การแก้สมการ” และ “ระนาบ 2 มิติ” ที่ผมเชื่อว่าแทบทุกคนเคยผ่านๆ ตา หรือเคยเรียนมาบ้างแล้ว

เรามีปัจจัยพื้นฐาน 2 ปัจจัย หากว่าเรามองมันเป็น X และ Y ตามลำดับ แล้วเขียนมันลงในระนาบ 2 มิติแบบง่ายๆ ที่เราคุ้นเคย ตามรูป


xy_axis1.jpg

ทีนี้ ถ้าเรามองว่ามันคือ “ความรู้ของเราในด้านนั้นๆ” แล้วให้คะแนนมันง่ายๆ … ถ้าเราเข้าใจหรือทำมันได้ ก็เป็น + ถ้าเราทำไม่ได้หรือไม่เข้าใจ ก็เป็น – เอาแค่นี้แหละ ไม่ต้องใส่คะแนนเป็นตัวเลขให้ยุ่งยากกว่านี้ เราก็จะได้ว่า ความเป็นไปได้ทั้งหมดของความรู้ของเรามันอยู่ในรูปแบบแค่นี้แหละ … ถ้า Unknown ก็เป็น – ถ้า Known ก็เป็น +


xy_axis2.jpg

เช่น ถ้าเราจะอ่านหนังสือหรือบทความ ที่มีปัจจัยพื้นฐานเป็น (ภาษา, เนื้อหา) แล้วล่ะก็ มันก็มีแค่ เราเข้าใจภาษานั้น แต่เราไม่เข้าใจเนื้อหานั้นเป็นทุนเดิม เราเข้าใจเนื้อหานั้นเป็นทุนเดิม แต่เราไม่เข้าใจภาษานั้น เราไม่เข้าใจทั้งสองอย่าง หรือเราเข้าใจทั้งสอง ก็แค่นั้นแหละ


xy_axis3.jpg

เราจะเห็นว่า ถ้าเรากำลังอ่านเนื้อหาที่เราไม่รู้เรื่องเป็นทุนเดิม ในภาษาที่เราไม่รู้เรื่อง มันก็คือการแก้สมการ 2 ตัวแปร เพราะทั้ง X, Y ต่างก็เป็น Unknown หรือสิ่งที่เราไม่ทราบค่าทั้งคู่ ในขณะที่ถ้าเราอ่านเรื่องที่เราไม่รู้เรื่อง ในภาษาที่เรารู้เรื่อง (หรือกลับกัน) มันก็จะเป็นการแก้สมการตัวแปรเดียว เพราะมี Unknown ตัวเดียว ที่ปลายทางสุดท้ายแล้ว เราก็ต้องการที่จะเป็นมันทั้งคู่น่ะแหละ คือ ให้ไม่มี Unknown เลย

แต่ทีนี้ …. เรื่องใหญ่มันก็คือว่า ถ้าเราเริ่มจาก (-, -) แล้วจะไปยัง (+, +) “ในขั้นตอนเดียว” เลยเนี่ย มันยากมาก อยากจะบอกว่ามันเป็นไปไม่ได้เลยด้วยซ้ำไป


xy_axis4.jpg

ทีนี้ …​ เราจะทำยังไงดีล่ะ? ก็เหมือนกับการแก้สมการ 2 ตัวแปรน่ะแหละ ที่โดยพื้นฐานแล้ว ตอนแรกสุดจะต้องทำให้เหลือตัวแปรเดียวซะก่อน ก็คือ การเขียน Y ในรูปของ X หรือไม่ก็เขียน X ในรูปของ Y จากนั้นก็นำไปเขียนแทนที่ในอีกสมการหนึ่ง … เมื่อได้ค่าอะไรบางอย่างแล้วค่อยนำกลับมาแทนที่คืนแล้วแก้สมการต่อ พูดง่ายก็คือ มันต้องทำทีละตัวแปร แบบนี้


xy_axis5.jpg

เห็นปัญหาอะไรบางอย่างไหมล่ะครับ?

ถ้าเราทำแบบนี้ “เพื่อที่จะอ่านเนื้อหา ในภาษาที่เราไม่รู้เรื่อง” มันก็ไม่ผิดอะไรมากมายนัก เพราะมันแทบไม่มีทางอื่น แต่ถ้าเราจะทำแบบนี้ “เรียนภาษา” จะมีปัญหามากเลยทีเดียว เพราะในจังหวะที่เรา “แปลเนื้อหาเป็นภาษาที่เรารู้เรื่อง” เนี่ยแหละ เราไม่มีทางรู้เลยว่า “เนื้อหานั้นมันถูกหรือไม่” (เพราะแกน Content ยังเป็น Unknown อยู่เสมอ) หรือว่ามัน Make Sense หรือไม่ สุดท้าย เราก็มักจะอ่านมันไม่รู้เรื่อง อ่านไม่เข้าใจ แล้วก็ไม่ได้เรียนรู้อะไรเลยกับภาษาเลยด้วยซ้ำไป จะมีแต่ความรู้สึกว่าเราได้แปลแล้ว เราได้ศึกษาแล้ว อะไรแบบนี้ซะเยอะ

แล้วเราจะทำยังไงดี?

ก็ต้องถามล่ะครับ ว่าเราต้องการเรียน “เนื้อหา” หรือ “ภาษา” กันแน่? ถ้าจะเรียนภาษาเป็นหลัก ตัวภาษาต้องเป็น Unknown เดียว แล้วแก้สมการตัวแปรเดียวจะง่ายกว่า เพราะว่าเราจะรู้เนื้อหาอยู่แล้วว่าอะไรมันเป็นอะไร … นั่นคือ ถ้าเราต้องการ “เรียนภาษา” (ภาษาเป็น Unknown) เราควรจะใช้เนื้อหาที่เรารู้เรื่องอยู่แล้ว มาเป็นเครื่องมือในการเรียนรู้ … แทนที่จะเดินตามเส้นประสีเทาในภาพต่อไปนี้ ก็เดินตามเส้นทึบสีม่วงแทน ว่างั้น

และเมื่อเราเรียนภาษาจนชินกับมันไปแล้ว จนมันไม่ใช่ Unknown สำหรับเราอีกต่อไปแล้ว ก็ค่อยเอามันไปเรียนรู้เนื้อหาอื่นๆ ต่อ


xy_axis6.jpg

เล่าเรื่องส่วนตัวให้ฟังเล็กน้อย สมัยที่ผมไปเรียนที่ญี่ปุ่นใหม่ๆ ผมเรียนภาษาญี่ปุ่นด้วยการเดินเข้าร้านการ์ตูน แล้วซื้อการ์ตูน Slam Dunk ยกชุดมาอ่าน เพราะมันเป็นเนื้อหาที่ผมรู้เรื่องอยู่แล้ว (ชอบมาก) ผมต้องการเรียนภาษา ไม่ใช่เนื้อหา ผมจะรู้อยู่แล้วว่าเนื้อเรื่องเดินยังไง ช่องไหนใครพูดอะไร พอเริ่มคุ้นกับภาษาญี่ปุ่นมากขึ้น ก็ไปซื้อหนังสือเรียนคณิตศาสตร์ ม.ปลายของญี่ปุ่นมาอ่าน เพราะว่าเรารู้เรื่องอยู่แล้วว่าอะไรมันเป็นยังไง …. ทั้งหมดนี้เกิดขึ้นโดยที่ “แทบไม่ต้องเปิด Dictionary แต่อย่างใด” และมันทำให้เราค่อยๆ เข้าใจและซึมซับภาษาได้เอง โดยที่ “ไม่ต้องแปล” คือ เข้าใจมันเป็นภาษาญี่ปุ่น และรูปแบบในการใช้งานภาษาญี่ปุ่น ไปเลย จนกระทั่งอ่านหนังสือภาษาญี่ปุ่นออก เรียนในมหาวิทยาลัยได้

เวลาหัดเขียนโปรแกรมภาษาใหม่ๆ จึงต้องหัดโดยใช้โจทย์ที่ตัวเองคุ้นเคยอยู่แล้ว เช่น เขียน Data Structures พื้นฐานเล่นสักชุด เพราะเราต้องการเรียนรู้ภาษา ไม่ใช่เนื้อหาของ Data Structure เป็นต้น (แต่ถ้าจะเรียนรู้ Data Structure ใหม่ ผมก็ต้องใช้ภาษาที่ผมคุ้นเคยไว้ก่อน)

ทีนี้ลองมาดูกันว่า เราจะเอา Concept เรื่องนี้ไปใช้อย่างไรได้บ้าง … จะพบว่ามันใช้ได้่หลายที่หลายทางเลยล่ะ เช่น

  • เอาเรื่องภาษาก่อนก็แล้วกัน อันนี้ง่ายหน่อย ถ้าอยากจะเรียนภาษา ก็เริ่มต้นด้วยเนื้อหาที่ตัวเองรู้อยู่แล้วน่ะแหละ นิยายที่เคยอ่านฉบับแปลไปแล้ว ไปหาต้นฉบับมาอ่านอีกรอบ หนังที่เคยดูซับไทยไปแล้ว ลองเปลี่ยนไปดูซับอังกฤษ หนังที่สร้างจากหนังสือ ที่เคยดูไปแล้ว ลองไปหาหนังสือต้นฉบับอ่านดู ฯลฯ
  • สำหรับพวกโปรแกรมเมอร์ ที่มีปัญหาภาษาอังกฤษ ทำให้เรียนรู้อะไรใหม่ๆ ช้ามาก (เพราะว่า Content ใหม่ๆ เกี่ยวกับอะไรใหม่ๆ มักจะออกมาเป็นภาษาอังกฤษก่อนเสมอ) ผมแนะนำว่า ควรลงทุนด้วยการอ่านเนื้อหาเดิมๆ ที่รู้ดีอยู่แล้วเนี่ยแหละ จากหนังสือภาษาอังกฤษจริงๆ สักครั้ง ไม่ใช่เพราะศึกษาเนื้อหานั้นๆ แต่เพื่อทำความคุ้นเคยกับการใช้ภาษาอังกฤษในการอธิบายเนื้อหานั้นๆ แล้วชีวิตต่อไปมันจะง่ายขึ้นเยอะ
  • นักศึกษาที่เรียนเขียนโปรแกรม แล้วทำไม่ได้สักที ก็ลองแยกปัจจัยดูนะ จะพบว่าจริงๆ แล้วมันมีปัจจัยพื้นฐานอยู่แค่ 2 อย่างเท่านั้น ในการเขียนโปรแกรมเบื้องต้น นั่นก็คือ เราคิดเป็น และ เราโค้ดได้ … ทีนี้หลายคนจะเอาแค่โค้ด จะลอกแค่โค้ด แต่ไม่เคยหัดคิดเลย ก็ลองดูละกันว่ามันขาดอะไรไป จะหัดด้านไหนก่อนก็ได้ทั้งนั้น ถ้าจะหัดโค้ดโดยไม่คิด ก็ไม่ผิด แต่ก็ต้องกลับมาหัดคิด ถ้าจะหัดคิด โดยไม่โค้ด ก็ไม่ผิด แต่ต้องกลับมาหัดโค้ด เป็นต้น

    xy_axis7.jpg

  • มาดูวงการ Startup Business บ้าง … เป็นที่รู้กันเลยว่า เราต้องมีทีมที่เก่งด้าน Business และ Capable เรื่อง Tech แต่ปัญหาที่ผมเห็นจากหลายต่อหลายทีม ก็คือ “เป็น Tech จ๋า แต่คิด Business ไม่เป็น” ไม่ก็กลับตาลปัตรเลย คือ “เป็น Business/Sale จ๋า แต่ไม่มี Tech” … พวกนี้ก็ไม่ยากเท่าไหร่ ก็แก้สมการตัวแปรเดียวของตัวเองไป คือ หา Co-Founder ในด้านที่ตัวเองขาดไปซะ … แต่ถ้ายังไม่เก่งอะไรเลย แล้วคิดว่าจะออกมาทำ Startup Business เลยล่ะก็ บอกได้เลยว่า You’ve Problems แล้วล่ะ (Problems เติม s เลยนะ เพราะมันอย่างน้อยๆ ก็ 2 แกน)

    xy_axis8.jpg

ขอเขียนเรื่องหนึ่งเอาไว้นอก List สักหน่อย เป็น Message สำคัญจากผม ไปยังบรรดาน้องๆ ที่กำลังจะเริ่มหัดทำระบบ/ทำแอพ เพื่อโน่นเพื่อนี่ ฯลฯ ลองดูนะครับ ว่าปัจจัยของเรานั้น มันมีอะไรบ้าง ผมคิดคร่าวๆ ก็คือ เรามี Skill ในการสร้างแอพ/ระบบหรือไม่ กับเราเข้าใจเรื่องหนึ่งๆ ดีพอที่จะทำอะไรไปแก้มันหรือไม่ …. ซึ่งข้อหลังนี้ ไม่ใช่แค่ว่าเราอยากได้อะไร หรือเรามีความคิดที่จะทำอะไร เพราะปัจจัยภายในมันมากมายพอสมควร และจากประสบการณ์ตรง น้อยคนนักที่จะเข้าใจสิ่งที่ตัวเองกำลังสร้างระบบหรือทำแอพไปแก้ปัญหานั้นๆ จริงจัง ซึ่งเมื่อทำไป มันก็ได้เรียนรู้ไปเรื่อยๆ และเข้าใจมากขึ้นเรื่อยๆ เป็นเรื่องปกติ (แม้แต่ผมเอง ระบบที่ผมทำเอง ยิ่งทำไป ยิ่งเข้าใจมันมากขึ้นเรื่อยๆ)

นั่นคือ เรามักจะเริ่มต้นด้วยภาพนี้เสมอๆ


xy_axis9.jpg

ประเด็นคือ เราอยู่จุดสีส้ม หรือจุดสีแดง?

ถ้าเราอยู่จุดสีส้ม นั่นคือ Development Skill ไม่ใช่ปัญหาสำหรับเรา ไม่ใช่ Unknown สำหรับเรา สิ่งที่เราต้องทำคือ ใช้มันในการสร้าง Solution จริงๆ ขึ้นมา ซึ่งเราจะต้องเข้าใจเรื่องอะไรต่ออะไรอีกเยอะ (ต่อให้เรารู้ปัญหา ก็ใช่ว่าเรารู้ Solution ต่อให้เราพอจะนึกออก ว่าอยากได้ระบบอะไร มาแก้อะไร ก็ใช่ว่าเราจะเข้าใจ Solution … เราเพียงแต่มีสมมติฐานเท่านั้น ว่าสิ่งนี้อาจเป็นส่วนหนึ่งของ Solution ได้ … เราไม่เข้าใจหรอก จนกระทั่งเราสร้างมันขึ้นมาจริงๆ)

ถ้าเราอยู่จุดสีแดง … เรามีปัญหาใหญ่มากๆ ล่ะ

เพราะอะไร? เพราะว่าเราจะต้องเรียนรู้ตัวแปร 2 ตัว ที่เป็น Unknown ของเราแทบจะพร้อมๆ กัน … หลายคนคิดว่ามันเป็นไปได้ ที่เราจะรู้ Solution หมดก่อน แล้วศึกษา Development Skills เพิ่ม ซึ่งสิ่งนี้มันจะเป็นไปได้ก็ต่อเมื่อ “มันเป็น Solution เก่าที่เราเคยแก้มาแล้วเท่านั้น” ถ้าเป็นโจทย์ใหม่ (ไม่ว่าจะเป็นโปรเจ็คจบ งานที่อยากทำ ฯลฯ อะไรก็แล้วแต่) ตรงนี้จะเป็น Unknown สำหรับเราเสมอ ไม่มีทางออกแบบ Solution ทั้งหมดล่วงหน้าได้บนกระดาษหรอก (ถึงจะทำได้ มันก็การันตีไม่ได้ว่าเป็น Solution ที่ถูก แล้วก็ต้องมีการเปลี่ยนแปลงอะไรต่ออะไรอีกเยอะ ซึ่งตรงนี้พอ Development Skills ไม่พอ ก็จะมีปัญหา)

แล้วสิ่งที่จะเกิดตามมา ก็คือ “การลัดการเรียนรู้เรื่อง Development Skills” ด้วยการพึ่งตัวช่วยทั้งหมดที่จะมีได้ ก็คือ ค้นหาบทความ Tutorial ต่างๆ บน Google หรือหาส่วนของโค้ดจาก Stackoverflow แล้วก็เอามาประกอบร่างกันแบบปะผุไปเรื่อยๆ แบบไม่มีโครงสร้าง แล้วก็ไม่มีประโยชน์อะไรกับงานต่อๆ ไป …. ไม่ต่างอะไรเลยกับ “การอ่านหนังสือที่ถูกเขียนในภาษาที่เราไม่รู้เรื่อง แล้วเราแปลเป็นคำๆ” .. ที่สุดท้ายเราก็ไม่ได้เข้าใจภาษานั้นๆ มากขึ้น จนอ่านเล่มต่อๆ ไปได้อย่างไม่มีปัญหา

ต้องใจเย็นๆ ครับ เริ่มทำลาย Unknown ไปทีละตัวๆ อย่าเร่งรีบด้วยความใจร้อน เพราะมันจะไม่ได้อะไรในระยะยาว … ถ้าอยากเรียนภาษา ก็ศึกษาภาษา ทุกอย่างนอกจากภาษาควรจะเป็น Known ให้หมด ไม่มี Unknown เรื่องอื่น ถ้าจะลองสร้าง Solution ก็ต้องเป็น Unknown เรื่อง Solution ไม่มี Unknown เรื่องอื่น …

สำหรับน้องๆ หลายคนที่กำลังจะเริ่มทำระบบ/แอพเป็นงานจบ หรือสำหรับหลายต่อหลายคนที่กำลังจะเริ่มศึกษาเพื่อสร้างงานชิ้นแรก ลองตั้งต้นให้ถูกนะครับ เริ่มจากการฝึกและศึกษา Software Development Skills จากงานที่รู้อยู่แล้ว (จาก Project ต่างๆ ในหนังสือที่เขียนไว้ดีแล้ว) อย่างจริงจัง อย่าเพิ่งเร่งรัดทำงานตัวเอง เพราะ Unknown มันจะเยอะเกินไป จนเกิดอาการลัดขึ้นมาได้

หวังว่าบทความนี้จะเป็นประโยชน์กับหลายๆ คนครับ