โปรแกรมเมอร์มือใหม่ เรียนรู้อะไรดี (ภาค 2)
ในภาคแรกเราคุยกันในเรื่องของ Technical Skills ทีเป็นพื้นฐานไว้ใช้ในระยะยาว
สำหรับภาคนี้ เราจะมาโฟกัสในส่วนของ Non-technical กันบ้าง ซึ่งเป็นครอบคลุมค่อนข้างหลากหลายเรื่อง โดยผมคัดเฉพาะหัวข้อที่ผมคิดว่าสำคัญๆ เพื่อไม่ให้ยาวเกินไป
บทความนี้มีความคิดเห็นส่วนตัวเยอะมาก ผมเลยแยกออกมาจากภาคแรก
ใครที่มีความเห็นแตกต่าง หรืออ่านแล้วรู้สึกจี้ด ไม่เห็นด้วยมากๆ ลองมาแลกเปลี่ยนความเห็นกันในเฟสบุ้คเพจได้ครับ เผื่อบทความนี้อาจจะมีภาค3 ผมเองก็อยากเก็บรายละเอียด ให้ได้มากที่สุด เพราะบล็อคนี้ตั้งใจจะเขียนทิ้งไว้นาน
สำหรับโปรแกรมเมอร์มือใหม่ที่ยังไม่มีความคิดเห็น อ่านแล้วก็ฟังหูไว้หู ใช้เป็นแนวทางแต่อย่ายึดมั่นกับมันมาก ยังมีคนที่เก่งกว่าผมอีกมากที่ใช้แนวทางอื่นในการพัฒนาตนเอง
Growth Mindset ในการเรียนรู้
ถ้าให้ผมเลือกคุณสมบัติที่สำคัญที่สุดของโปรแกรมเมอร์เก่งๆ ผมมองว่า Mindset ในการเรียนรู้เป็นเรื่องสำคัญที่สุด
คำว่า Mindset ผมหาคำแปลตรงตัวไม่ได้ แต่คำที่ใกล้เคียงที่สุดน่าจะเป็น"ทัศนคติ"
ส่วน Growth Mindset นั้น เป็นทัศนคติที่เชื่อว่าทุกอย่างเปลี่ยนแปลง และพัฒนาได้ ตัวอย่างเช่น ผมไปสัมภาษณ์งานแล้วไม่ผ่าน ถ้าคนที่ไม่มี Growth Mindset ก็อาจจะคิดว่าเรามันไม่มีความสามารถ ชาตินี้ทำไงก็คงไม่ผ่านหรอก
ในทางกลับกันคนที่มี Growth Mindset จะมองว่า รอบนี้เราคงทำได้ไม่ดี มาทบทวนดูว่าทำตรงไหนได้ไม่ดีบ้างแล้วลองพัฒนาตัวเองดู คราวหน้าจะได้ทำได้ดีกว่านี้
โปรแกรมเมอร์เก่งๆที่ผมรู้จักทุกคนเชื่อมั่นในศักยภาพของตัวเอง ว่าเค้าเก่งกว่านี้ได้ และเรื่องไหนที่ไม่เก่ง ถ้าให้เวลาฝึกหรือลองเรียนรู้ ก็สามารถเก่งได้
ในทางตรงกันข้าม มีคนจำนวนมากที่พูดอยู่ตลอดว่าตัวเองโง่เรื่องนั้น ไม่มีพรสวรรค์เรื่องนี้ ยังไงก็ทำไม่่ได้ ไม่ต้องลองพยายามหรอก กรณีนี้เรียกว่า Fixed Mindset คือปักใจเชื่อและแปะป้ายให้ตัวเองเรียบร้อยแล้ว
ซึ่งผมการันตีได้เลย ว่าถ้าคุณมี Fixed Mindset ว่า “ฉันเป็นโปรแกรมเมอร์ที่ไม่เก่ง ไม่มีทางเก่งได้หรอก” ยังไงก็ไม่มีทางเก่ง เพราะตัวคุณเองจะพยายามทำตัวให้ไม่เก่ง เพื่อที่จะได้ยืนยันว่าตัวเองคิดถูก ทำลายความสามารถตัวเองทางอ้อม
ดังนั้น สำหรับโปรแกรมเมอร์มือใหม่ ผมยกเรื่องนี้ให้เป็นเรื่องแรก ทุกคนมีศักยภาพเยอะมาก คุณอาจจะทำอะไรผิดพลาดบ้าง อาจเคยเป็นที่โหล่ในชั้นเรียน แต่ไมไ่ด้หมายความว่าคุณจะเป็นเช่นนั้นไปตลอด เชื่อมั่นในตัวเองหน่อย
และผมการันตีได้ว่า ไม่มีใครที่เขียนโปรแกรมได้ดีโดยเคยไม่ทำเรื่องผิดพลาด(แบบโง่บัดซบ)มาก่อน ทุกคนต้องเรียนรู้กันทั้งนั้น คุณแค่ไม่เห็นตอนเค้าทำอะไรโง่ๆเท่านั้นแหละ
จริงๆแล้วเรื่อง Growth Mindset นั้นมีรายละเอียดเยอะกว่านี้ (เช่น ถ้าผมมี Fixed Mindset ว่าตัวเองเป็นอัจฉริยะด้านการเขียนโปรแกรมล่ะ? จะมีปัญหาอะไรรึเปล่า) ใครอยากอ่านเรื่องนี้ต่อ ผมแนะนำ:
- Mindset: The New Psychology of Success เป็นหนังสือต้นฉบับของคนที่เผยแพร่เรื่องนี้ หนังสือจะพูดในมุมที่กว้างกว่า โดยยกตัวอย่างของการใช้ Growth Mindset ในด้านอื่นๆของชีวิตนอกเหนือจากการทำงานด้วย
- บล็อคพี่เนย อธิบายเรื่องนี้ไว้ในภาษาไทยได้ดีมาก
ภาษาอังกฤษ
จริงๆโปรแกรมเมอร์คนไทยมีศักยภาพพอไปยืนอยู่ในระดับโลกเยอะมาก แต่ไม่สามารถไปได้ไกลเพราะภาษาอังกฤษไม่ดีพอ
ภาษาอังกฤษมีผลกระทบต่อชีวิตของโปรแกรมเมอร์มาก หลักๆคือ
- เนื้อหาที่ต้องเรียนรู้ เทคโนโลยีไปไวมาก ถ้าจะรอให้ทุกอย่างเป็นภาษาไทย เราต้องทำใจว่าจะตามหลังโลก 1-3 ปีเป็นอย่างน้อย (เฟรมเวิร์คหรือไลบรารี่อาจจะแค่ไม่กี่เดือน แต่เรื่อง Software Engineering Practices, Machine Learning, etc. เนื้อหาในไทยจะช้ากว่ามาก) ถ้าคุณสามารถอ่านภาษาอังกฤษได้ คุณจะสามารถเข้าถึงเนื้อหาอีก 99% ในปัจจุบันได้ทันที
- ความเร็วในการเรียนรู้ จริงๆหลายๆคนฟัง/อ่านภาษาอังกฤษได้ แต่ไม่คล่อง บางคนคิดว่าความเร็วนี้เหมือนจะไม่ใช่เรื่องใหญ่ แค่อ่านได้ก็พอแล้ว แต่ลองนึกภาพคนที่อ่านภาษาอังกฤษได้แค่ 200 คำต่อนาที กับคนที่อ่านได้ด้วยความเร็ว 400 คำต่อนาที ต่างกันเท่าตัว ถ้าสองคนนี้ใช้เวลาอ่านหนังสือเท่าๆกัน หลังจาก 5 ปี สองคนนี้จะเก่งต่างกันแค่ไหน?
- การโตในหน้าที่การงาน ประเทศไทยมีบริษัทที่ทำไอทีจริงๆน้อยมาก ลองนับบริษัทไอทีจริงๆในตลาดหุ้นไทยดู แล้วเทียบกับตลาดหุ้นสหรัฐ TOP 5 บริษัทที่ใหญ่ที่สุดดู การพูดภาษาอังกฤษได้ ทำให้เรามีตัวเลือกมากกว่า มีโอกาสอยู่ในบริษัทที่แข็งแกร่งกว่า ที่มีสิ่งแวดล้อมและคนเก่งมากกว่า และแน่นอน ค่าตอบแทนดีกว่า
ภาษาอังกฤษเหมือนตัวคูณครับ คนที่มีความสามารถกับความสนใจทางด้านนี้ หากภาษาอังกฤษดีด้วย จะเหมือนคูณ 1.5 แต่หากติดข้อจำกัดทางภาษา อาจจะโดนคูณ 0.5 แทน
ถ้าคิดว่าตัวเองภาษาอังกฤษไม่แข็งแรงพอ เริ่มใช้เวลากับมันวันละนิดวันละหน่อยดู ฝึกทั้งการฟัง พูด อ่าน เขียน ให้ครบ
และถ้าใครบอกว่า “ผมโง่ภาษาอังกฤษ พูดไม่ได้หรอก” ให้กลับไปอ่านเรื่อง Growth Mindset ข้างบนซ้ำอีกครั้งครับ
อย่าเน้นที่ปริมาณภาษา เน้นที่วิธีการเขียนโปรแกรม
เวลาผมคุยกับโปรแกรมเมอร์ช่วงสองปีแรก น้องๆมักจะถามว่า
- เขียน Java ดีเปล่า
- ลอง Go ดีไหม
- Elixir จะเป็นไง
- Elm เทพมากเลย
คำตอบแบบซื่อๆคือ ผมก็ไม่มีลูกแก้ววิเศษครับ ไม่รู้เหมือนกัน ทุกวันนี้ก็อยากจะลองใช้ Elm ดู แต่มันอยู่ล่างสุดในรายการที่กะเรียนรู้
ในอดีตผมใช้เวลาผิด ศึกษาหลายเทคโนโลยีที่ปัจจุบันไม่มีที่ให้ใช้แล้ว เรียกได้ว่าเสียเวลาไปเยอะพอควร
ดังนั้น ผมแนะนำว่าสองปีแรก ให้เลือกภาษา"ยอดนิยม" ที่ทำ OOP ได้หนึ่งภาษา (C++, C#, Java) เอาภาษาเดียวก็พอ แต่เอาให้ลึกกว่า ถ้าทำเว็บที่ต้องแตะ Frontend ก็เพิ่ม JavaScript เข้าไปอีกหนึ่งภาษา
แค่นั้นพอ…
เสร็จแล้วแทนที่จะไปลองภาษาใหม่ๆ เอาเวลาไปศึกษาหัวข้อพวกนี้ครับ
- Code readability & maintainability (ex. OOP, Refactoring, Design Pattern)
- Operation (ex. Metric monitoring & alerting system, Linux, Bash scripting, CLI, Web server etc. )
- Software Development Practices and Process (ex. Agile, CI, TDD, A/B Testing, etc.)
- System Design (ex. API design, CAP Theorem, Security, Reliability, Scalability, etc.)
หัวข้อพวกนี้จะเป็นสิ่งที่ทำให้เราใช้ภาษาได้แตกฉาน และเอาไปประยุกต์ใช้กับภาษาอื่นได้
ทั้งนี้ทั้งนั้น ไม่ได้แปลว่าไม่แนะนำให้เรียนภาษาใหม่นะครับ แต่อย่าให้น้ำหนักกับมันมาก ไม่ใช่เขียนเป็นทั้ง C/C++/Java/Go/Elixer/Elm/JavaScript/ES6/Python/PHP/Closure/Haskell/Cobol แต่เขียนได้แค่ Todo Application แต่เขียนให้ดีไม่ได้สักภาษาเลย
ถ้าจะเรียนภาษาเพิ่ม เอาเป็นงานอดิเรกพอ ยึดเรื่องข้างบนพวกนี้เป็นหลักครับ
นี่อาจจะเป็นคำแนะนำที่อาจจะขัดต่อความคิดของหลายๆคน ซึ่งผมอาจจะผิดก็ได้ แต่ผมขอให้เหตุผลแนบไว้ดังนี้ครับ
- หลังเลยช่วง Junior ไปแล้ว ความรู้ในหัวข้อพวกนี้สำคัญมากในการขยับไปยัง Mid-Level หรือ Senior ครับ
- ภาษาใหม่ๆอาจจะตาย หรือเสียความนิยมไปได้ แต่หัวข้อข้างบนยังไงก็อยู่ไม่ต่ำกว่าสิบปีครับ
- เนื้อหาพวกนี้ เราสามารถเอาไปประยุกต์ในงานจริง โปรเจ็คจริงได้ ไม่ว่าจะใช้ภาษาหรือเฟรมเวิร์คอะไรอยู่ การประยุกต์ใช้เป็นวิธีการเรียนรู้ที่ดีที่สุด เมื่อเทียบกับการเรียนภาษาใหม่ที่เรียนไปแต่ไม่ได้ใช้เป็นประจำ ความรู้จะอยู่คงทนกว่า
ชี้แจงอีกอย่าง คือหัวข้อพวกนี้ แต่ละหัวข้อใช้เวลาเป็นปีๆยังไม่แน่เลยว่าจะเชี่ยวชาญ ตัวผมเองก็เชี่ยวชาญได้แค่ไม่กี่หัวข้อ ดังนั้น สำหรับโปรแกรมเมอร์มือใหม่ ไม่ต้องลงลึกครับ แต่อย่างน้อย ถ้ามีคนถาม ก็ควรอธิบายได้ว่าหัวข้อนั้นๆหมายถึงอะไร มีความสำคัญในการพัฒนาซอฟท์แวร์ยังไง
เรียนรู้สาขาต่างๆแบบตัว T
สืบเนื่องจากหัวข้อที่แล้ว ผมเชียร์ให้คนเรียนรู้สิ่งต่างๆแบบตัว T
การเรียนรู้แบบตัว T หมายถึง ให้ลงลึกในสาขาหนึ่ง (เหมือนแกนของตัว T) ส่วนสาขาอื่นๆรอบข้าง ไม่ต้องลงลึกมาก แต่ต้องพอรู้ (เหมือนหัวตัว T ที่กว้างแต่บาง)
สาเหตุที่แนะนำแบบนี้เพราะ
- หลังผ่านช่วง 2-3 ปีแรก เราจะหลุดพ้นจากการเป็น Junior หากไม่มีสาขาที่เราเชี่ยวชาญลึกพอ จะทำให้ต่อรองเงินเดือนในตลาดงานได้ยาก
- การศึกษาสาขาอื่นๆ เผื่อเราค้นพบว่านี่ไม่ใช่สาขาที่ใช่ เราจะรู้ว่ามีสาขาอะไรให้เราไปได้บ้าง
- การศึกษาสาขาอื่นๆ แม้จะเพียงตื้นๆ จะช่วยให้เราค้นพบว่า “เรายังไม่รู้อะไรบ้าง” การรู้ว่าตัวเองไม่รู้อะไรบ้้างนี่สำคัญมากในการพัฒนาตนเองครับ
- การศึกษาสาขาอื่นๆ ทำให้เราทำงานร่วมกับคนสาขาอื่นได้ดีขึ้น
สังเกตว่าผมเน้นคำว่า “สาขา” ไม่ใช่ “ภาษา”
สาขาในที่นี้เป็นนิยามที่หลวมมาก ตัวอย่างเช่น Frontend อาจจะถือเป็นสาขาหนึ่ง ซึ่งครอบคลุมทั้งตัวภาษา (JavaScript, ES6, HTML5, CSS), เทคโนโลยี (Webpack, SCSS/LESS, Chrome Dev Tool), และเฟรมเวิร์คต่างๆ (jQuery, React, Vue, Angular, Jasmine/Mocha/Jest)
บางคนอาจจะมองว่า Java เป็นสาขาหนึ่งก็ได้ เพราะรายละเอียดของภาษามีเยอะอยู่แล้ว และถ้าจะเขียนให้ดีจริงๆก็ต้องเข้าใจ JVM ว่าทำงานยังไง, ใช้ Framework อย่าง Spring เป็น, สามารถทำ Performance optimization ได้, เขียน Multi-thread ได้, เข้าใจว่า API แต่ละตัวมีอาการอะไรแปลกๆซ่อนอยู่บ้าง
บางคนอาจจะมองว่า Operation เป็นสาขาหนึ่ง ซึ่งต้องรู้ทั้ง Linux, VM, Network, Containerization, Shell Script/Python, CI/CD, Monitoring tool อันนี้ก็แล้วแต่นิยาม DevOps ของแต่ละคน
การทำงานร่วมกับผู้อื่น
ถ้าให้เลือกระหว่างโปรแกรมเมอร์ที่เก่งกลางๆ แต่ทำงานร่วมกับคนอื่นได้ดี กับโปรแกรมเมอร์ที่เก่งมาก เทพสุดๆ แต่ทำงานร่วมกับคนอื่นไม่ได้ ผมเลือกคนแรกเข้าทีมครับ ไม่ต้องคิดมากเลย
เพราะการเขียนโปรแกรมในปัจจุบัน ส่วนใหญ่ทำคนเดียวไม่ได้ ต้องทำกันเป็นทีม คนที่ทำงานร่วมกับคนอื่นไม่ได้นี่อันตรายมาก หากเอามาไว้ในทีม ดีไม่ดีจะทำให้คนอื่นลาออกกันหมดอีก
นี่เป็นหัวข้อที่ยากมากในการเรียนรู้ แต่อย่างตามคอนเซ็บของ Growth Mindset ครับ ทุกอย่างเรียนรู้ได้
เทคนิคที่ผมทำคือ
- พยายามทบทวนในช่วงท้ายวัน ว่าวันนี้เราสื่อสารอะไรกับใครบ้าง สื่อสารอย่างไร ได้ผลหรือไม่ได้ผลยังไง จะทำยังไงให้ได้ดีกว่านี้
- ขอ Feedback จากคนที่ทำงานด้วยว่าเราทำงานเป็นยังไง เพราะบางครั้งเราทำ หรือพูดอะไรที่รบกวนจิตใจคนอื่นโดยไม่รู้ตัว ครึ่งปีก็ขอคุยด้วยเป็นส่วนตัวสักครึ่งช.ม. ไล่เช็คดูว่าเค้ารู้สึกยังไงในการทำงานกับเรา อย่างผมเองเคยโดน Feedback ว่าเป็นคนที่รุนแรงเกินไป พูดอะไรไม่คิดถึงจิตใจคนอื่น พอผ่านไปหลายปี กลับมาโดน Feedback ว่าใครพูดอะไรก็ไม่ขัด เออออไปหมด ทุกวันนี้ก็ต้องพยายามปรับและเช็คตลอดเวลา
- ฝึกทักษะด้านการพูดต่อหน้าคนอื่นเอาไว้ บังคับตัวเองให้ต้องพูดต่อหน้าคนเยอะๆเป็นประจำ
การดูแลสุขภาพ
ครับ ผรู้ว่าเรื่องนี้โคตรไม่ตรงคอนเซ็บบล็อคเลย
แต่เรื่องแบบนี้ไม่เห็นโลงศพไม่หลั่งน้ำตา ตอนอายุ 20 ก็ไม่ค่อยแคร์กันหรอก (ผมนี่แหละคนนึง) แต่ผมการันตีได้เลยว่าพอเลย 30 แล้ว โปรแกรมเมอร์ป่วยกันเยอะมาก ป่วยแบบเรื้อรังรักษาไม่หายขาดด้วย เพราะพฤติกรรมเรื้อรังที่สะสมมาเป็นสิบปี
หลักๆเลยก็พวก Office Syndrome พวกเจ็บข้อมือ ปวดหลัง ปวดเอว ปวดคอ นิ้วล็อค
ผมคิดว่าโปรแกรมเมอร์ (หรือคนทำงานนั่งโต๊ะ) ควรจะรู้เรื่อง:
- Ergonomic (การจัดโต้ะทำงาน, ท่านั่ง/ยืนใช้คอมพิวเตอร์)
- โภชนาการ (เรื่องอาหารห้าหมู่นี่แหละ, โปรตีนควรกินวันละเท่าไร ไขมันชนิดไหนกินมากไม่ดี, ควรกินผักผลไม้กี่กรัมต่อวัน)
- การออกกำลังกาย (เข้าใจว่า Cardio/Strength Training ต่างกันยังไง, มีวินัยในการออกกำลังกายสม่ำเสมอ)
- การพักผ่อน (จัดห้องนอนให้ดี นอนให้สนิทตลอดคืน, เข้าใจ Cycle ในการหลับ, เลี่ยง Blue light ก่อนนอน, นอนและตื่นให้เป็นเวลา, ไม่กด Snooze, ไม่พึ่งคาเฟอีนในการทำงาน)
ใครยังรู้สึกว่าไม่ใช่เรื่อง ลองไปถามพี่ๆในทีมดูว่าสุขภาพเป็นไงบ้าง เอาพวกที่เก่งๆ ใช้เวลากับคอมนานๆแบบลืมเวลา ปั่นโปรเจ็คกันแบบหามรุ่งหามค่ำ ส่วนใหญ่อาการน่าจะออกกันแล้ว
นั่นล่ะ อนาคตเราเลย
นี่เลยเป็นเรื่องที่อยากบอกโปรแกรมเมอร์มือใหม่ไว้ รักษาสภาพร่างกายตัวเองไว้ให้ดีตั้งแต่เนิ่นๆนะครับ ยังต้องอยู่กับมันไปอีกยาว
ใครทีชอบอ่าน ผมแนะนำหนังสือเล่มนี้ครับ จริงๆเค้าก็เขียนเรื่องเบสิคทั้งหมดแหละ แต่เขียนเฉพาะเจาะจงกับกรณีของโปรแกรมเมอร์
- [The Healthy Programmer] (https://www.goodreads.com/book/show/17229509-the-healthy-programmer)
สรุป
ผมว่าทักษะการเรียนรู้เป็นสิ่งที่สำคัญที่สุดสำหรับโปรแกรมเมอร์ครับ
ส่วนใหญ่ พอพูดถึงเรื่องการเรียนรู้ของโปรแกรมเมอร์ เรามักจะคิดถึงเรื่องเทคโนโลยีหรือภาษาโปรแกรมต่างๆ ในบทความนี้ ผมเลยอยากชี้ให้เห็นว่าการเป็นโปรแกรมเมอร์ที่ดีนั้น ต้องเรียนรู้ทักษะอย่างอื่นด้วย
อย่างที่บอกตอนต้นครับ บทความนี้เป็นความเห็นส่วนตัวเสียเยอะ ฟังหูไว้หู แต่อย่างน้อยก็เอาไปพิจารณากันนะครับ
สำหรับคนที่เลยจุดที่เป็นโปรแกรมเมอร์มือใหม่ไปแล้ว ถ้าเห็นด้วยกับบทความ เริ่มต้นตอนนี้ก็ไม่สายครับ อย่าใช้อายุงานเป็นข้ออ้างสำหรับ Fixed Mindset