Photo by Andy Beales on Unsplash

พอโปรแกรมเมอร์มีประสบการณ์มากขึ้น ก็จะค้นพบว่าตัวเองมีสิ่งที่ยังไม่รู้มากขึ้น

ผมคิดว่าหลายๆคนก็คงคล้ายผม คือจะอยากอ่าน อยากรู้ และอยากลองไปซะทุกอย่าง

ในอดีต อาจจะทำแบบนี้ได้ เพราะเทคโนโลยีแต่ก่อนไม่ได้เติบโตเร็วแบบทุกวันนี้

ผมเองเป็นคนนึงที่พยายามตามเทคโนโลยีให้ได้มากที่สุด แต่พอถึงจุดนึงก็ต้องยอมรับ ว่าปัจจุบันเทคโนโลยีที่วิ่งเร็วกว่าเรามาก

ถ้าตามแบบไม่มีหลักอะไรเลย ตามยังไงก็ไม่ไหว

ปัญหาของการเรียนรู้ในปัจจุบัน

เพื่อให้เห็นภาพว่ามันไม่ไหวยังไง ผมขอยกหัวข้อที่ผมเคยศึกษาในช่วง 10 ปีที่ผ่านมา

UX Research, UI Design, HTML/CSS, JavaScript, TypeScript, Web Performance Optimization, System Design, DDD, Design Patterns, System Architecture, Cloud Technologies (AWS), Docker, Linux CLI, Vim, Chrome Dev Tool, Distributed Systems, Algorithm, Network (L4, L7), PHP, NodeJS, Java, Spring, RESTEasy + JAX-RS, SQL, NoSQL, Shardings, Interview (Soft Skill/Technical), Security (OWASP + Architecture), Agile (Scrum, XP practices), CMMI, ITIL, DevOps (CI/CD, Culture, Process), Python, Elastic Search, Chef, ML/AI, Serverless Architecture, React Native, …

นี่แค่เท่าที่นึกออกในหัว ซึ่งยังไม่รวมฝั่ง Business Domain กับหัวข้ออื่นๆที่ไม่ Technical

เหมือนจะเยอะ แต่ผมเรียนแบบเป็ดครับ จะลงลึกแค่ไม่กี่หัวข้อ (T-Shape) หลายหัวข้อผมไม่ได้ลงลึก แค่แตะกว้างๆ

แต่ถึงไม่ลึก ช่วงหลังๆนี้ก็ไล่ตามไม่ไหวแล้วครับ เลยมานั่งตกตะกอนเรื่องนี้

ผมมองว่าปัญหาของโปรแกรมเมอร์ปัจจุบันคือ “การจะเลือกว่าจะเรียนรู้อะไร”

หลังจากเลือกเสร็จ เราควรจะเรียนรู้ให้ได้ผลลัพธ์มากที่สุด ในเวลาที่จำกัด

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

มองอีกมุม การเรียนรู้ของโปรแกรมเมอร์เป็น Optimization Problem ชนิดนึง

บทความนี้จะมาแชร์แนวทางในการแก้ปัญหานี้ของผมครับ แน่นอนว่าคงไม่เหมาะกับทุกคน แต่น่าจะมีประโยชน์และนำไปปรับใช้ได้ครับ

1. ตอบได้ไหมว่าเรียนรู้เรื่องนี้ไปเพื่ออะไร

เรื่องแรกที่อยากให้คิดกันก่อนเริ่มเลยก็คือเราเรียนรู้หัวข้อหนึ่งๆไปเพื่ออะไร

แต่ละคนมีแรงขับที่ต่างกันในอาการเอาเวลาส่วนตัวมาใช้กับการเรียนรู้ ไม่มีใครผิดใครถูก ตัวอย่างเช่น

  1. ต้องใช้ในงานปัจจุบัน
  2. เพื่อพิจารณาดูว่าจะเอาไปใช้ในโปรเจ็คถัดไปดีรึเปล่า
  3. เพื่อความก้าวหน้าในอาชีพการงาน
  4. แค่รู้สึกว่าสนุก

สามข้อแรกเป็นอะไรที่ชัดเจน แต่ข้อสุดท้ายนี่มีความเจ๋งและอันตรายอยู่ในตัว

ผมสังเกตว่าโปรแกรมเมอร์ที่เก่งๆส่วนใหญ่ สาเหตุหลักในการเรียนรู้คือข้อ 4 คือได้ใช้รึเปล่าไม่รู้แหละ แต่มันดูสนุกดี เดี๋ยวเสาร์อาทิตย์นี้ลองไปเล่นดู

ส่วนตัว ผมคิดว่าคนอ่านก็คงมีข้อ 4 อยู่ในตัวเหมือนกัน ถึงมานั่งอ่านบทความนี้

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

เราจึงมักจะเห็นโปรแกรมเมอร์บางคนที่แก้ปัญหา ดีบั้ก หรือเรียนรู้อะไรต่างๆได้ไวมาก

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

แต่ไม่ใช่ทุกคนที่มีเวลาเยอะขนาดนั้น

เราต้องมองในมุมของผลลัพธ์เทียบกับเวลา ว่าคุ้มกับเวลาที่เสียไปไหม (Return on Time Invested) ดังนั้น ก่อนจะเรียนรู้หรือใช้เวลากับอะไร ลองตั้งสติถามตัวเองดูก่อน ว่าเราจะเรียนรู้หัวข้อนี้ไปเพื่ออะไร

ถ้าตอบไม่ได้ก็ควรจะเอาเวลาไปทำ(หรือเรียนรู้)อย่างอื่นแทน

ลองทำอย่างแรกเลย คือคิดดูดีๆว่าควรจะอ่านบทความไปเพื่ออะไร ถ้าตอบไม่ได้ อาจจะต้องพิจารณาดูว่าอ่านต่อดีรึเปล่า

2. กรองเนื้อหาที่เรียนด้วยสองคำถาม

แต่ก่อน เวลาผมเจอบทความหรือคอร์สออนไลน์ ผมแค่ถามตัวเองว่าสนใจไหม แล้วก็ลุยเลย

ด้วยเวลาส่วนตัวที่น้อยลง ผมเริ่มต้องคิดก่อนอ่านว่าได้ประโยชน์แค่ไหน

ปัญหาที่ตามมาคือแล้วประโยชน์ที่ว่านี่จะวัดยังไง แล้วต้องมีประโยชน์แค่ไหนถึงจะอ่าน

ช่วงหลังๆ คำถามที่ใช้เลยเปลี่ยนเป็น:

  1. อ่านแล้วจะได้ใช้ใน 3 เดือนข้างหน้าไหม?
  2. อ่านแล้วอีก 3 ปี ความรู้นี้จะยังใช้งานได้ไหม?

ถ้าตอบ “ใช่” ทั้งสองข้อ ก็ไปต่อเลย ไม่ต้องคิดอะไรมาก

ถ้าคำตอบคือ”ไม่”ทั้งสองข้อ ก็ข้ามไปทำอย่างอื่นได้เลย

ถ้าตอบ “ใช่” แค่ในข้อที่ 2 ผมจะศึกษาแบบกว้าง ไม่ลงลึก เพราะถ้าเรียนรุ้ไปแล้วไม่ได้ใช้ ไม่กี่เดือนก็ลืมแล้ว

3. เช็คหัวข้อและคุณภาพก่อน

ยกตัวอย่างว่า เจอบทความน่าสนใจ คิดว่าใช้เวลาอ่านสัก 10 นาทีจบ

ก่อนอ่าน ผมจะใช้เวลานาทีแรกดูหัวข้อ (Header) ทั้งหมดก่อน เสร็จแล้วค่อยๆเลื่อนลงไปล่างสุดเพื่อดูบทสรุป (ถ้ามี) ระหว่างทางก็จะเห็นคร่าวๆว่างานเขียนดูโอเคไหม

เสร็จแล้วค่อยตัดสินใจ ว่าจะอ่านดีหรือเปล่า

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

กรณีหนังสือหรือคอร์สออนไลน์ก็จะเป็น Table of Content ก่อน เสร็จแล้วก็เปิดไปอ่านหัวข้อสุดท้ายของแต่ละบท เราก็จะได้ไอเดียคร่าวๆ ไว้ใช้ตัดสินใจ

4. เราต้องการรู้เรื่องนี้ลึกแค่ไหน

ผมอยู่ฝั่งการเรียนรู้แบบ T-Shape คือรู้ลึก 1-2 หัวข้อใหญ่ๆ ส่วนหัวข้ออื่นๆจะรู้ตื้นๆ แต่รู้พอที่จะคุยกับคนที่เชี่ยวชาญด้านนั้นๆได้โดยไม่เบื่อสักสิบนาที

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

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

ส่วนที่เหลือ ผมต้องตัดใจทิ้ง อย่างเรื่องรายละเอียดเช่นใช้การใช้ Library ต่างๆเพื่อ Clean Data หรือสร้างโมเดล พวกนั้นผมตัดสินใจว่าจะไม่ใช้เวลากับมันต่อ

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

อย่างผมเป็นติ่ง Andrew Ng (ผู้สอนด้าน Machine Learning ที่ดังมาก) พอเค้าเปิดเว็บใหม่ เขียนหนังสือ ผมก็อยากอ่าน แต่ก็รู้ว่าอ่านไปก็ไม่ได้ใช้ในเร็วๆนี้ อีกไม่กี่เดือนก็ลืม

ผมเลยใช้วิธีเก็บพวกนี้ไว้ในรายการ To read in the future เพื่อความสบายใจ เหมือนหลอกตัวเองนิดนึงว่าเดี๋ยวก็ได้อ่าน

5. เซ็ตเป้าหมายเป็นโปรเจ็คแทนที่จะเซ็ตเนื้อหา

หนึ่งในปัญหาที่ผมเจอบ่อยๆ คืออ่าน Tutorial จบ ทำ Tutorial เป็น แต่เอาไปประยุกต์ทำอย่างอื่นไม่ได้

อันนี้เห็นได้บ่อยมาก โดยเฉพาะฝั่ง Frontend ทำได้แต่ Todo List

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

ช่วงหลังๆนี้เลยเปลี่ยนวิธีหน่อย อย่างแต่ก่อน จะตั้งเป้าหมายว่าจะอ่านหนังสือเกี่ยวกับ React ให้จบในหนึ่งเดือน

เดี๋ยวนี้ก็จะใช้วิธีว่า จะพยายามเขียน CRUD WebApp ง่ายๆด้วย React ส่วน API ก็ใช้วิธี Mock เอา

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

6. สร้างนิสัยพร้อมกับเป้าหมายในการเรียนรู้

เคยสังเกตกันไหมครับ ว่าไอ้ New Year Resolution ที่เคยตั้งเป้าไว้ ผ่านมากี่ปีก็ยังไม่เคยสำเร็จสักที

บางคนก็จะมีทริค ใช้วิธีให้ประกาศให้โลกรู้ จะได้มี Commitment อันนี้ก็ไม่เวิร์คครับ ผมมีหลักฐานทิ้งไว้ทุกปีเลย

ตัวอย่างเช่น ผมตั้งใจจะสอบ Cert A ให้ได้ ภายในระยะเวลา 3 เดือน

เป้าหมายดี แต่ส่วนพอผ่านไปสองสัปดาห์ก็จะลืม

ผมพบเทคนิคนึงที่ช่วยลดปัญหานี้ได้ คือให้สร้างนิสัยใหม่พร้อมกับเป้าหมาย

โดยผูกนิสัยผูกเข้ากับกิจกรรมประจำวัน อย่างผมเอง พอเข้าออฟฟิซปุ๊บ ผมจะใช้เวลา 25 นาทีแรกนั่งอ่านเตรียมสอบเซอร์

หรือสมัยที่ผมต้องสอบ GRE ผมก็จะนั่งท่องศัพท์เวลาเข้าห้องน้ำ ทำอยู่หกเดือน

ตอนสอบเสร็จใหม่ๆ เวลาเข้าห้องน้ำนี่เวิ้งว้างมาก ไม่รู้จะทำอะไร

ผมค้นพบว่ามันเวิร์คสำหรับผม เพราะมันใช้พลังใจน้อย ช่วงแรกๆอาจจะต้องกลั้นใจทำ แต่พอทำทุกวันสักสองสามสัปดาห์ มันจะเริ่มติดเป็นนิสัย แล้วมันจะง่ายเอง

ที่สำคัญ พยายามผูกนิสัยเข้ากับจังหวะที่เปลี่ยนสถานที่ เพราะสมองเรามักจะผูกสิ่งต่างๆเข้ากับสถานที่ได้ดี

ตัวอย่างเช่น ผมเคยพยายามอ่าน 25 นาทีก่อนเลิกงานกลับบ้าน ปรากฏว่าไม่เวิร์ค ต้องเปลี่ยนมาอ่านก่อนเริ่มงาน พอเดินเข้าออฟฟิซ นั่งหน้าคอมปุ๊บ มันจะลอยขึ้นมาบนหัวเลย

ลางเนื้อชอบลางยา

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

ยิ่งสังคม Open Source และโลก IT โตขึ้นเรื่อยๆ เทคโนโลยีก็จะก้าวเร็วขึ้นเรื่อยๆ ผมเชื่อว่าปัญหานี้จะชัดเจนมากขึ้นเรื่อยๆ เดี๋ยวนี้ตลาดงานก็มีความต้องการสูง อยากได้แต่ Full-stack กัน บางที่ขอเป็น Full-stack ทำ DevOps ได้ด้วย (แต่เรตเงินเดือนเท่ากัน…)

บางที่นี่ขอวางสายแลนเป็นด้วย

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

เวลาเราทาแยมบนขนมปัง ยิ่งขนมปังแผ่นใหญ่ เราก็ยิ่งต้องเกลี่ยแยมให้บางขึ้น ถ้าแยมเราไม่พอ เราก็ต้องเลือกว่าจะทาตรงไหน เพราะถ้าทาหมดแผ่น แยมอาจจะบางจนไม่ต่างอะไรกับกินขนมปังเปล่าๆ