เทคนิคการเรียน Programming ให้เร็วและมีประสิทธิภาพ

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

ถ้าใครอยู่ในวงการ Software Development น่าจะจำช่วงปี 2012-2016 กันได้ ช่วงนั้นเป็นช่วงที่มีเครื่องมือใหม่ๆ ออกมากันเพียบ ทั้ง Android, iOS ที่กำลังรุ่งเรือง แล้วที่ร้ายที่สุดวงการ Web Dev ที่มีทั้ง NodeJS, AngularJS, React, VueJS (ยังไม่นับฝั่ง CSS อีกนะ) ออกมากันให้พรึบ จากนั้นก็เป็นยุคของ Big Data ส่วนตั้งแต่ปี 2018 เป็นต้นมา วันๆ ได้ยินแต่ Hadoop กับ Spark มายุคนี้ก็ AI กับ Blockchain กันทั้งเมือง ซึ่งมันก็เป็นธรรมดาที่เวลามีเทคโนโลยีที่หวูหวาดูมีอนาคตออกมาในวงการ มีคนให้ความสนใจ ก็จะมีคนช่วยกันพัฒนาเทคโนโลยีขึ้นมาต่อยอด ส่วนโปรแกรมเมอร์น้อยประสบการณ์อย่างเราก็ต้องเลือกเส้นทางละว่าจะเลือกเรียนอะไรดีเพื่ออนาคต ผมไม่แน่ใจว่าเพื่อนๆ เลือกกันยังไง แต่สำหรับผม ผมเลือกเรียนแบบพื้นๆ มันทุกตัว เพื่อที่ว่าอย่างน้อยเราจะได้พอรู้ข้อดีข้อด้อยของแต่ละตัว เวลาเจองานเข้ามาจะได้เลือกใช้งานได้เหมาะสม แต่พอจะเลือกทุกตัว ก็มีข้อจำกัดเรื่องเวลาและพลังงาน ซึ่งการเรียนเทคโนโลยีเพื่อให้รู้จักและใช้เป็นนั้น ไม่ได้จำเป็นต้องไปรู้ลึกซะจนเป็น Guru ตอบได้ทุกเรื่อง แต่เราเลือกเรียนเพื่อให้ตอบว่าควรจะเลือกใช้อะไรในสถาการณ์ไหน แล้วจะต่อยอดยังไงก็พอ แล้วนานๆ ีก็เลือกมาสักตัวที่ถูกใจเอามาใช้เป็นคู่ชีวิตไว้ทำมาหากิน

The S-shaped Learning Curve

โดยทั่วไปนั้น การเรียนรู้สิ่งใหม่ๆ มักจะมีรูปแบบ Learning Curve ที่คล้ายกัน เราเรียกมันว่า S-shaped learning curve ซึ่งหน้าตาก็จะกราฟข้างล่างนี่

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

ดังนั้นถ้าสังเกตดูให้ดีก็จะเห็นว่า เราจะต้องทำยังไงก็ได้ให้เข้าสู่ช่วงของ Steep acceleration ให้เร็วที่สุด ซึ่งสำหรับผมมีเทคนิคการจัดการกับมันดังนี้


มองมุมกว้างให้ทั่วก่อนจึงตัดสินใจออกเดินทาง

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

ก่อนจะเริ่มศึกษาอะไรทั้งปวง ผมจะเริ่มจากการศึกษาว่า เทคโนโลยีทุกวันนี้มีตัวไหนน่าสนใจบ้าง ซึ่งก็สามารถดูได้จากเว็บข่าว หรือ Community ของเหล่านักพัฒนาว่าเขากำลังพูดถึงอะไรกัน ติดตามอ่านข่าวสารให้เป็นเรื่องเป็นราว สำหรับเด็กๆ อย่างน้อยที่สุดก็ควรอ่าน https://www.blognone.com อย่างสม่ำเสมอ พอโตขึ้นมาหน่อยค่อยเข้าเว็บ Community ต่างชาติบ้าง พอเห็นเขาเริ่มพูดถึงอะไรกันระดับหนึ่ง ก็ควรเริ่มไปเปิดดูว่า มันคืออะไร ใช้ทำอะไร มีดีอะไรคนถึงหันมาใช้กัน อ่านรีวิว อ่านบทวิจารณ์ เปรียบเทียบกับเทคโนโลยีใกล้เคียงกันให้เยอะ ดูการเปรียบเทียบกับตัวอื่นๆ เพื่อให้เข้าใจพื้นฐานของเทคโนโลยีดังกล่าว ให้พอจินตนาการภาพของการเอามันไปประยุกต์ใช้งานได้ สำหรับขั้นตอนนี้ผมอยากให้ทุกคนทำให้ได้กับทุกอย่างที่ผ่านเข้ามา เห็นอะไรโผล่เข้ามาไม่รู้จัก เปิด Google เลย ค่อยๆ ศึกษาไปวันละเล็กวันละน้อย แล้วเราจะได้รู้ว่ามีสิ่งนี้ให้เลือกนะในเวลาที่จำเป็นต้องใช้


เริ่มเรียนรู้จากสื่อที่ถูกจริตกับเรา

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

เมื่อได้เห็นว่าสิ่งใดกำลังจะมาแน่ๆ ต้องลงทุนแล้ว ก็ต้องลงมือศึกษาอย่างจริงจัง โชคดีที่ยุคนี้โลกของเราเชื่อมถึงกันหมด และมีคุณครูเก่งๆ อยู่บนโลกออนไลน์เยอะมาก สำหรับผม ผมชอบเรียนรู้ผ่านทาง Video มากกว่าอ่านหนังสือ ในช่วงนี้ที่ยังไม่รู้อะไรมาก ผมจะเปิด  YouTube นั่งฟังคนที่อธิบายเก่งเล่าให้ฟัง ซึ่งเป็นธรรมดาที่จะเห็นคนสอนเรื่องเดียวกันอยู่หลายคน ก็ต้องเลือกก่อนว่าจะเรียนรู้จากอาจารย์คนไหนดี โดยเข้าไปฟังสำเนียง เข้าไปฟังวิธีการอธิบายแบบข้ามๆ ก่อน เมื่อเจอคนที่ถูกใจ (พยายามเลือกคนที่ลง Code ให้เราเห็นด้วย) ก็เปิดนั่งดูไปเลยยาวๆ ในตอนนี้ยังไม่ต้อง Code ใดๆ ทั้งสิ้น เราจะได้เห็นภาพว่าเวลาเราจะใช้งานจริงมันจะออกมาเป็นแบบไหน นี่เป็นเทคนิคที่ย่นเวลาการเรียนรู้ในตอนต้นไปได้อย่างมหาศาล เพราะถ้าเจอคนที่สอนดี ก็เหมือนโดนเกาตรงจุดที่คัน เราจะเข้าใจ Concept พื้นฐานได้อย่างไว ไปจนถึงได้จินตนาการเห็นตัวเองกำลังนั่งเขียน Code แล้วบ้างในบางส่วน


ลงมือทำตามที่เพิ่งได้เรียนรู้มาตามอาจารย์

แค่ดูอย่างเดียวย่อมไม่พอ ต้องลงมือทำด้วย มันต้องเจ็บ ถึงจะจำได้

ขั้นต่อมาเป็นช่วงของการลงมือทำ หลังจากดู Video ไปจนถึงจุดที่คันไม้คันมือ ทนไม่ไหวอยากจะลงมือแล้ว ก็หยุด ไม่ต้องดูต่อแล้ว ให้เริ่มทำโปรเจกต์เดียวกับที่เขาสอน ทำโดยที่ไม่เปิด Video ไปทำไป แต่ให้ทำคู่ไปกับ Official Document จะได้ศึกษาการอ่าน Doc ไปในตัวด้วย ถ้าตั้งใจดู Video มาดี ควรจะพอจำได้ว่าเขาเริ่มต้นยังไง แล้วพอเห็น Doc ก็จะนึกออกว่า อ่อ เราจะต้องทำตรงนี้นะ ก็ค่อยๆ วางโครงแบบงูๆ ปลาๆ เท่าที่จำได้ไป ถ้าตรงไหนติดจริงๆ ก็ไป Seek ดู Video เอาเฉพาะตรงที่ติด แล้วระหว่างดูอย่าไป Code ตาม ให้จำให้ได้ว่าเขามีวิธีคิดยังไงในการทำตรงที่เราติดอยู่ จนเข้าใจแล้วก็กลับมาลงมือทำของตัวเอง จนกระทั่งเริ่มคุ้นมือกับสิ่งที่กำลังเรียนอยู่ สามารถขึ้นโปรเจกต์ใหม่ เขียนอะไรพื้นฐานขึ้นมาเองได้ ก็พอแล้วสำหรับเฟสนี้


สร้างชิ้นงานของตัวเองขึ้นมาใหม่จากศูนย์

การลงมือทำของจริง จะช่วยให้เราได้เจอปัญหาที่ไม่เคยเจอในตำรา ให้ได้คิด ได้แก้ เพื่อพัฒนาทักษะความรู้ที่ยั่งยืน

ต่อมาเป็นช่วงของการสร้างชิ้นงานชิ้นแรกของตัวเองตั้งแต่ต้น ผมมีความเชื่อว่า อย่าเพิ่งคุยว่าเราเขียนภาษาอะไร หรือใช้เฟรมเวิร์คตัวไหนเป็น จนกว่าจะได้เริ่มทำกับโปรเจกต์จริงๆ ให้สำเร็จสักชิ้นเสียก่อน ซึ่งแต่ละสิ่งที่เราเรียนนั้นก็ต้องทำโปรเจกต์ที่แตกต่างกันไป ตัวอย่างเช่น ถ้าเรียนสิ่งที่เป็น Backend ก็อาจจะทำโปรเจกต์อะไรที่เกี่ยวกับฝั่งติดต่อ DB เช่น ทำ Webboard แต่ถ้ากำลังเรียนฝั่ง Frontend ก็อาจจะลองทำเครื่องคิดเลข หรือศึกษาอะไรที่มัน Real-time Interactive หน่อย เช่น Web socket ก็อาจจะลองทำห้องแชทง่อยๆ ดู ซึ่งก็ต้องลองเลือกดูครับว่าสิ่งที่เรียนนั้นเหมาะกับโปรเจกต์แนวไหน ผมมองว่าถ้าเกิดได้ศึกษามาดีตั้งแต่ขั้นตอนแรก จะเห็นภาพแน่นอนว่าควรทำโปรเจกต์อะไรดี จากนั้นก็ลงมือเลยครับ อาจารย์คนสำคัญสำหรับเฟสนี้ก็จะเป็น Google และ StackOverflow ซึ่งเราจำเป็นจะต้องเลือก Keyword ในการค้นหาสิ่งที่ติดอยู่ต่างๆ ให้ถูกต้อง เวลาที่เรากำลังทดลองทำโปรเจกต์กับเครื่องมือที่เพิ่งเรียนรู้ใหม่ครั้งแรกเนี่ย มันจะมีคำถามเยอะแยะไปหมดว่า จะทำอย่างนี้ บนเจ้านี่ จะต้องทำอย่างไร ไม่ว่าจะเป็น การ substring การหา index ของ element ที่ต้องการใน array การบันทึกการอ่านข้อมูลจาก DB ซึ่งก็จะได้คำตอบจากการไปค้นใน Google เนี่ยแหละ ก็ค่อยๆ ทำ ค่อยแคะกันไป จนกระทั้งสำเร็จได้โปรเจกต์เล็กๆ ออกมาพอใช้งานได้ชิ้นแรก ก็น่าจะพอมีความมั่นใจในการทำโปรเจกต์ต่อไปแล้วแหละ ถ้าให้เทียบกับกราฟแล้ว ตอนนี้ก็จะมาอยู่ประมาณช่วง Steep acceleration แล้ว ที่รู้แล้วว่า เครื่องมือที่ศึกษามานั้นมีอะไรให้ใช้งานบ้าง และยิ่งเปิดโปรเจกต์เพิ่ม ก็จะยิ่งได้เรียนรู้และมีความมั่นใจเพิ่มขึ้นอย่างรวดเร็ว


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


อย่าเพิ่งหยุดเรียนจนกว่าจะพ้น Mt. Stupid

Dunning-kruger effect

การหยุดเรียนระหว่าง Steep Acceleration มักจะปล่อยเราไว้ที่ The peak of Mt. Stupid ทำให้ผู้เรียนรู้สึกฮึกเหิม เพราะก่อนหน้านี้ตอนต้นจะรู้สึกว่ายังทำอะไรไม่ค่อยได้เท่าไหร่ แต่พอเรียนไปเรื่อยๆ ทำโปรเจกต์แรกสำเร็จ ก็จะเริ่มมีความมั่นใจ ทำอันต่อๆ ไปได้อีก ก็จะยิ่งมั่นใจเข้าไปอีก ทำให้อยากออกไปคุยว่าฉันทำไอ้นี่เป็นแล้วนะ แต่มันจะเป็นไปได้ไงที่เราที่เพิ่งทำเสร็จมาไม่กี่โปรเจกต์ ชั่วโมงการทำงานแค่ไม่กี่สิบชั่วโมง มันจะไปรู้เท่าคนที่ใช้งานสิ่งนี้มาเป็นปีได้ สิ่งนี้เรียกว่า Dunning-kruger effect ที่อธิบายว่า คนที่เพิ่งเรียนรู้อะไรไปสักพักจนได้ผลอะไรบางอย่างแล้ว จะมีความรู้สึกว่าฉันรู้ฉันเข้าใจแล้วอย่างจริงจัง แต่ความจริงนั้นยังมีอีกหลายเรื่องที่ยังต้องศึกษาเพิ่มเติมอีก ดังนั้นถ้ารู้สึกตัวว่าอยู่บนยอดเขา (อารมณ์คือรู้สึกมีความมั่นใจว่าทำได้แล้วแหละในครั้งแรก) ก็จงรีบลงมาซะ มาดูว่าจะไปศึกษาให้ลึกลงไปอีกได้จากที่ไหนได้บ้าง ทางหนึ่งที่จะช่วยให้ลงจากเขาได้เร็วที่สุดคือการออกไปคุยกับผู้รู้จริง ให้เขายิง Jargon ใส่ หรือยิงคำถามยากๆ ใส่ หรือไม่ก็ไปอ่าน Code ของคนอื่น โดยเฉพาะตามโปรเจกต์ Open Source ที่ใหญ่ๆ ให้ได้เห็นว่าเทพเขาทำงานกันยังไง ทีเดียวได้ลงจากเขาสมใจอยาก แล้วหลังจากนั้นเราจะได้รู้ว่า จะต้องศึกษาอะไรต่อไปเพื่อให้เป็นผู้รู้จริงในเรื่องนั้นๆ แล้วเราก็จะสามารถเติบโตได้อย่างยั่งยืน


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

สุดท้ายอยากบอกว่า DO IT NOW OR NEVER (จำไม่ได้คำพูดจากใคร) ถ้ามีไอเดีย อยากทดลองอะไร อย่ามัวแต่คิด นับ 1 2 3 แล้วลงมือทำเลย ตั้งโปรเจกต์เปล่าๆ ขึ้นมาก่อนก็ยังดี ไม่อย่างนั้นไอเดียเหล่านั้นก็จะหายไปกับเวลา พลาดโอกาสได้พัฒนาฝีมือ

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