บทความนี้จะเปลี่ยน Mindset ในการเรียนเรียน coding หรือ programming ของคุณไปตลอดกาล จริงหรือเปล่า ? ต้องลองอ่านครับ
เคยสงสัยไหมครับว่าเวลาที่เราจะเรียนรู้การเขียนโปรแกรมมิ่งภาษาใหม่ ๆ แน่นอนว่าเราจำเป็นต้องเรียนรู้คำสั่ง ไวยากรณ์ หรือที่เรียกว่า Syntax กันก่อนใช่ไหมครับก่อนที่เราจะสามารถเขียนภาษานั้นได้และนำไปประยุกต์ใช้งาน
คำตอบคือ แน่นอนอยู่แล้วครับเราไม่ปฏิเสธว่าการเรียนรู้ Syntax คือสิ่งที่ต้องเรียนรู้ในการเรียนโปรแกรมมิ่งภาษาใหม่ แต่คำถามคือ เราจำเป็นต้องเรียนรู้ทั้งหมดหรือให้เยอะที่สุด มากเท่าที่จะทำได้เลยหรือเปล่า มีความจำเป็นต้องทำแบบนั้นจริง ๆ หรือ ?
ในบทความนี้ผมจะนำข้อมูลจากหลายแหล่งมาอ้างอิงและทำการวิเคราะห์
จากที่เกริ่นไปด้านบนเลยครับว่า Syntax นั้นไม่ใช่ส่วนสำคัญที่สุด แต่หนึ่งในส่วนที่สำคัญที่สุดคือสกิลในการแก้ปัญหาหรือที่เรียกว่า Problem Solving นั่นเองครับ ทำไมถึงเป็นเช่นนี้ ?
ลองเปรียบเทียบดูให้เห็นภาพง่าย ๆ เลยก็คือโปรแกรมเมอร์ที่มีประสบการณ์กับโปรแกรมเมอร์ที่ไม่มีประสบการณ์ อันนี้ไม่ได้ดูแคลนหรืออะไรคนที่ไม่มีประสบการณ์เพราะผมเอง(ผู้เขียน)ก็ไม่ได้มีประสบการณ์เยอะอะไรมากมายเหมือนกัน ถ้าลองสังเกตดี ๆ จะพบว่าสำหรับคนที่มีประสบการณ์หลาย ๆ คน จะสามารถเรียนรู้ภาษาหรือเฟรมเวิร์คใหม่ได้อย่างรวดเร็ว เพราะเขาตกผลึก ได้แนวคิดจากการเรียนภาษาหรือเฟรมเวิร์คก่อนหน้า ส่วนจะรวดเร็วแค่ไหนนั้นก็ขึ้นอยู่กับปัจจัยหลายอย่าง ไม่ว่าจะเป็นประสบการณ์ความรู้ความเข้าใจที่เคยสั่งสมมา ไหวพริบ และปัจจัยอีกหลาย ๆ อย่างซึ่งล้วนแล้วแต่แตกต่างกันไปตามความสามารถในการเรียนรู้ของแต่ละบุคคล และคนที่ไม่มีประสบการณ์ก็ใช่ว่าจะเรียนรู้ได้ช้าไปมากกว่าคนที่มีประสบการณ์เสมอไปก็ขึ้นอยู่กับวิธีการในการเรียนรู้ที่ถูกต้องและเหมาะสมอีกนั่นแหละ ซึ่งตรงนี้ก็จะไม่ได้เจาะลึกหรืออธิบายอะไรเพิ่มเติม
ลองดูคำพูดของซีเนียร์โปรแกรมเมอร์ท่านหนึ่งด้านล่าง ชื่อคุณ Umer Mansoor
“I wrote 255 lines of code that included a working server and a client. I queried google 23 times mostly landing on StackOverflow, Netty 4 website, GitHub, and JavaDocs. If you do the math, that averages out to 1 query every 10 lines of code! I had no idea”
“ผมเขียนโค้ด 255 บรรทัดโดยมีการทำงานร่วมกันทั้งฝั่ง Server และ Client ผมเปิดกูเกิ้ล 23 ครั้ง ส่วนใหญ่จะเป็น stackoverflow และยังมีเว็บไซต์ที่เกี่ยวข้องอื่น ๆ เช่น GitHub และ ก็ JavaDocs ที่คุณต้องใช้คณิตศาสตร์ในการหาค่าเฉลี่ย 1 การ Query ทุก ๆ 10 บรรทัดของโค้ด ซึ่งผมก็ไม่รู้ว่าจะทำยังไง ถ้าไม่ Google !!”
ทำไมถึงบอกแบบนี้ ก็เป็นผลจากเรามีสกิล Problem Solving ที่ดีครับ เราจะพยายามหาหนทางแก้ปัญหาให้ได้ในที่สุด ซึ่งสกิลการใช้ Google สำหรับผมสามารถพูดได้เต็มปากเลยว่า มันเป็นหนึ่งในสกิลที่สำคัญมาก ๆ สำหรับโปรแกรมเมอร์ หรือไม่ว่าจะเป็นในแทบจะทุกสายอาชีพ แต่ก่อนที่จะใช้สกิลนี้ได้อย่างเต็มที่แน่นอนว่าสิ่งหนึ่งที่เราต้องรู้ก็คือ Keyword แต่เราจะรุ้ Keyword ได้อย่างไร ?
ใช่ครับเราต้องมองภาพรวมให้ออก ในสิ่งที่เรากำลังจะแก้ปัญหาให้ออก รวมทั้งการมีทักษะภาษาอังกฤษที่ดีในระดับหนึ่งสามารถที่จะแปลงคำในหัวเราไปเป็นภาษาอังกฤษได้ อย่างเช่น สมมติว่ากำลังติดปัญหาไม่สามารถเข้าถึงข้อมูลใน Dictionary ของไพธอน ได้ เราจะสามารถค้นหาได้อย่างไร ? ถ้าคนที่ภาษาไม่แข็งก็อาจจะพิมพ์ภาษาไทย “วิธีการเข้าถึงข้อมูลใน Dictionary”
ซึ่งถ้ามีบทความหรือโพสต์ที่เป็นภาษาไทยของคนไทยเราเขียนไว้ก็ไม่มีปัญหาครับ แต่ถ้าไม่มี ก็อาจจะเริ่มลำบากล่ะ และยิ่งภาษาไม่แข็งจะสามารถใช้คีย์เวิร์ดที่ใกล้เคียงที่สุดในการค้นหาการแก้ไขปัญหานี้ได้อย่างไร ? อย่างที่ทราบครับว่าข้อมูลในอินเทอร์เน็ตส่วนใหญ่แหล่ง Resources ดี ๆ ต่าง ๆ ล้วนเป็นภาษาอังกฤษแทบทั้งสิ้น ภาษาไทยแทบจะน้อยมาก ๆ ซึ่งถ้าไม่พัฒนาทักษะด้านภาษา แทบจะเรียกได้ว่าคุณปิดประตูในการเปิดโลกการเรียนรู้ส่วนนี้ให้กับตัวเองอยู่
ตัดภาพมาที่ สำหรับคนที่ภาษาโอเคร คีย์เวิร์ดจะผุดขึ้นมาในหัวทันที “How to access dictionary values in Python” จบเลยครับ ข้อมูลขึ้นมาบานเลยใน Google แป็ปเดียวก็สามารถรู้ได้ทันทีว่าจะเข้าถึงได้อย่างไร หรือแม้แต่ใช้คีย์เวิร์ดสั้น ๆ accessing python dictionary, access python dictionary, บลา ๆ ๆ ก็ขึ้นมาแล้ว อันนี้คือแค่ยกตัวอย่างง่าย ๆ ครับในความเป็นจริง มันมีคีย์เวิร์ดยาก ๆ อยู่หลายตัว ซึ่งถ้าไม่สามารถใช้ทักษะที่มีในการค้นหาได้ เราก็จะไม่พบกับทางแก้ ถึงแม้ว่ามันจะอยู่ตรงหน้า อันนี้ในส่วนนี้ก็จะขอตัดบทและจบไว้เพียงเท่านี้ก่อนที่จะยืดยาวออกไปมากกว่านี้
ทีนี้กลับมาต่อที่คำถามเดิมเลยคือ เราต้องจำได้ทุก Syntax เลยหรือเปล่า อย่างที่บอกไปครับว่าไม่จำเป็น แน่นอนว่าการจำคำสั่งหรือ syntax ต่าง ๆ ได้เยอะ ๆ ย่อมเป็นสิ่งที่ได้เปรียบอยู่แล้ว แต่การที่จะไปจำได้แทบทุกตัวหรือมากสุดเกินความจำเป็นที่ต้องใช้จริง ๆ นั้นแทบจะเปล่าประโยชน์ เพราะแทนที่เราจะอาศัยทักษะการทำซ้ำ สม่ำเสมอให้คุ้นชิน กลับเป็นว่าเราไปจำซึ่งบางอย่างที่ไม่ได้ใช้ มันทำให้สมองเรา Input อะไรบางอย่างที่ยังไม่จำเป็นเข้ามามากเกินไป ซึ่งแบบนี้มันจะไม่เป็นไปตามธรรมชาติเท่าที่ควร
เคยสังเกตไหมครับ บางคนแทบจะไม่รู้ Syntax หรือคุ้นเคยกับภาษาหรือเฟรมเวิร์คบางตัวหรือไลบรารี่บางตัวมาก่อนเลย แต่พอมาเจอ Deadline หรือ Requirements ที่เข้ามากะทันหัน กลับสามารถทำงานให้สำเร็จได้เพียงแค่ไม่กี่ข้ามคืน ก็เพราะว่ามันมีอะไรบางอย่างใช่ไหมครับมากระตุ้นให้ต้องเรียนรู้ในตอนนั้น ซึ่งคราวนี้แหละสมองก็จะสั่งการบีบให้ต้องเรียนรู้ตรงนี้ให้ได้นะ เพราะมันต้องใช้งานแล้วจริง ๆ ซึ่งแน่นอนครับว่ามันมาพร้อมความกดดัน แต่เชื่อว่าหลาย ๆ คนก็สามารถผ่านจุดนี้ไปได้ แต่ในทางกลับกันถ้าเราเรียนรู้ Syntax ของตัวนี้ไว้ตั้งแต่แรก แต่ยังไม่มีความจำเป็นต้องใช้ มันก็อาจจะลืมได้ใช่ไหมครับ
ดังนั้นเราจะจำให้สิ้นเปลืองหน่วยความจำในสมองเราทำไมในตอนนั้น เพราะพื้นที่ความจำในสมองเราก็ไม่ได้ unlimited แค่จำแนวคิด ลอจิก การแก้ปัญหาต่าง ๆ ก็น่าจะเพียงพอแล้วหรือเปล่า ? ตรงจุดนี้ผมไม่ได้จะสื่อสารว่าการทำงานรอ Deadline เป็นเรื่องดี แต่กำลังจะบอกว่าถ้ามีสกิลในการแก้ปัญหาที่ดี สามารถปรับเปลี่ยนยืดหยุ่นได้ตามสถานการณ์ต่างหาก
ยกตัวอย่างคำสั่งที่ผมจะทำการเขียนเว็บและดึงข้อมูลออกมาจาก Database สมมติว่าผมจะดึงข้อมูลออกมาแสดงผลทั้งหมด ซึ่งสมมติว่าผมกำลังใช้ตัวเฟรมเวิร์คหนึ่งของภาษาไพธอนที่ใช้ในการทำเว็บก็คือ Django โดยสมมติว่าการดึงข้อมูลจะเป็นในรูปแบบของ ORM(Object Relational Mapper) ผมก็สามารถใช้คำสั่ง obj = ClassName.objects.all( ) แบบนี้ได้เลย หรือถ้าผมจะอยากไปเลือกใช้เฟรมเวิร์คอีกตัวคือ Flask อันนี้ก็ใช้ทำเว็บเหมือนกัน ผมก็เรียกใช้ obj = ClassName.query.all( ) ซึ่งจะเห็นว่าคอนเซ็ปต์แทบไม่แตกต่างกัน ถ้าวันหนึ่งมีความจำเป็นต้องไปใช้เฟรมเวิร์คตัวอื่น ก็แค่เปิด Google ดูใน Document ของเฟรมเวิร์คนั้น เพราะแนวคิดมันติดอยู่ในหัวเราเรียบร้อย
หรือไม่ว่าจะเป็นคำสั่งแสดงผลออกทางหน้าจอที่เราคุ้นเคย เวลาเริ่มเรียนภาษาโปรแกรมมิ่งใหม่ ๆ อย่างเช่นในภาษาไพธอนก็คือ print(“Hello, world”) ถ้าเป็น JavaScript ก็ console.log(“Hello, world”) ภาษา Dart ก็ main() { print('Hello World!'); }
จะเห็นได้ว่า syntax ของแต่ละภาษาแทบไม่หนีกันสักเท่าไหร่ คือมีฟังก์ชันอะไรสักอย่างอยู่ข้างหน้าแล้วก็ส่งค่าที่เป็นข้อความเข้าไป จบเลย มีแค่นี้เองครับ จะเห็นว่านอกจากภาษาหลักที่เริ่มเรียนรู้ในตอนแรกที่อาจจะต้องจำกันสักหน่อย แต่ภาษาอื่น ๆ นอกจากนั้น ไม่มีความจำเป็นต้องไปจำอะไรให้ยุ่งยากหรือเปลืองพื้นที่หน่วยความจำในสมองของเราให้ยุ่งยาก จำแค่คอนเซ็ปต์ ส่วนถึงเวลาจะต้องใช้ภาษานั้นจริง ๆ ก็แค่ค้นหาใน Google หรือเปิด Document ของภาษานั้นอ้างอิงดูได้เลย
ทีนี้เมื่ออ่านมาถึงตรงนี้แล้ว เราลองมาฟังความคิดเห็นของโปรแกรมเมอร์หลาย ๆ คนดูครับว่าเขาคิดยังไง โดยข้อมูลเหล่านี้มาจาก Twitter ของเหล่าซีเนียร์โปรแกรมเมอร์เหล่านี้
Tim Dierks
“Hello, my name is Tim. I'm a lead at Google with over 30 years coding experience and I need to look up how to get length of a python string.”
“สวัสดี ผมชื่อทิม เป็นหัวหน้าทีม(coding) ที่ Google ด้วยประสบการณ์ด้านการเขียนโค้ดของผมที่มากกว่า 30 ปี แต่ผมก็ยังคงต้องค้นหาวิธีการหาค่าความยาวของไพธอนสตริงอยู่เลย”
Localghost
“Hello, my name is JP. I put Node.js in a commercial flight airplane. I still don't know the difference between .substr() and .substring().”
“สวัสดีครับ ผมชื่อ JP ผมใช้ Node.js ในการสร้างโปรเจคท์ที่สำคัญมาก ๆ แต่ผมก็ยังคงไม่ทราบความแตกต่างระหว่าง substr() และ .substring()”
Jon f Handcock
“Hello my name is Jon, I'm the Android lead at Phunware. I can't read an input stream without copying and pasting code from stack overflow”
“สวัสดี ผมจอร์น เป็นหัวหน้าพัฒนาแอนดรอยด์ที่ Phunware ผมไม่สามารถเขียนโค้ดอ่านอินพุตที่รับเข้ามา โดยไร้ซึ่งการก็อปวาง ๆ จากเว็บ stackoverflow ได้เลย”
ดูเอาล่ะกันครับ ขนาดหัวหน้า Senior Dev ยังต้องก็อปโค้ดจาก stackoverflow อยู่เลย
Dominik Kundel
“Moin! My name is Dominik. I'm writing JS for 6 years and I still have to look up how to do AJAX requests without fetch or jQuery”
“สวัสดี ผมชื่อโดมินิค เขียน JavaScript มาเป็นเวลาติดต่อกันกว่า 6 ปีแล้ว และผมยังคงต้องค้นหาวิธีการเรียกใช้ AJAX โดยไม่ต้องทำการเรียกใช้การ fetch หรือ แบบ jQuery”
EricaJoy
“Hello, my name is Erica. If I told you what things I still have to Google, you'd try to use it as "evidence" that I'm not a "real" engineer”
สวัสดี ฉันชื่อ Erica ถ้าฉันจะบอกว่าสิ่งที่ฉันทำอยู่ ฉันยังคงต้องค้นหาใน Google อยู่เสมอ ซึ่งคุณอาจจะใช้มันเป็นหลักฐานยืนยันได้เลยว่าฉันไม่ใช่วิศวกรซอฟท์แวร์ตัวจริง
สิ่งเหล่านี้จากซีเนียร์โปรแกรมเมอร์ระดับบิ๊ก ๆ เหล่านี้ คงทำให้หลายคนมีพลังฮึดขึ้นมาในตอนนี้ แม้แต่ระดับนี้ยังไม่อายที่จะบอกว่า ยังคงต้องใช้ Google ในการค้นหาข้อมูล Syntax คำสั่งอะไรต่าง ๆ อยู่เลย ซึ่งมันไม่แปลกครับ ใครมันจะไปจำได้ทุกคำสั่ง ทุก Syntax
ซึ่งจากทีแรกถ้าเป็นโปรแกรมเมอร์มือใหม่อาจจะยังกังวลว่าตัวเองไม่รู้ Syntax มากเท่าที่ควร จึงอาจทำให้กังวลไปได้ ข้อเท็จจริงข้างบนล้วนพิสูจน์แล้วว่า คุณไม่จำเป็นต้องจำ Syntax ให้ได้ทุกตัวหรือมากเกินความจำเป็น
มาถึงข้อสรุปของผู้เขียนบทความ ซึ่งผมชอบสิ่งที่เขาสรุปมาไว้ ทำให้ได้มุมมองที่ดียิ่งขึ้น โดยเขาบอกว่า
“I may not need to spend months before I am able to work on it. I may only need a few hours to read its documentation and then learn more as needed along the journey without the need to memorize everything”
ผมไม่จำเป็นต้องใช้เวลาแรมเดือนก่อนที่จะสามารถทำงานนั้นได้ เพียงแค่ไม่กี่ชั่วโมงในการอ่าน document และเรียนรู้ให้มากตราบเท่าที่ต้องการ โดยที่ไม่จำเป็นต้องจดจำทุกสิ่งอย่าง
“You do not expect to have all green lights on when you start your journey to your destination”
คุณไม่จำเป็นต้องรอให้พร้อมทุกอย่าง ก่อนที่คุณจะเริ่มก้าวไปสู่ความสำเร็จหรือจุดหมายปลายทาง
ปัจจุบันนี้ มีภาษาโปรแกรมมิ่งหรือเฟรมเวิร์คใหม่ ๆ ออกมามากมาย เปลี่ยนแปลง ๆ ไปทุก ๆ ปี ดังนั้นการพยายามที่จะจำ syntax นั้นทั้งยากและก็ไม่มีความจำเป็น เรียนรู้วิธีการแก้ปัญหา และแก้ปัญหาอย่างชาญฉลาดต่างหากคือหัวใจหลัก
ส่วนอันนี้คือข้อสรุปของผมแบบกระชับสุด ๆ ครับ
"Don’t try to remember every syntax. Try to be a good problem solver instead."
หวังว่าบทความนี้จะเป็นประโยชน์ไม่มากก็น้อยนะครับ
ผิดพลาดประการใดขออภัย แชร์ หรือร่วมแสดงความคิดเห็นกันได้เลยครับ (ขอคนละ 1 ความคิดเห็นก็คือว่าเป็นการซัพพอร์ต่บทความนี้แล้วครับ)
Sonny STACKPYTHON
Follow us on
Medium: STACKPYTHON
Youtube: STACKPYTHON
Reference
If You Want to Be a Senior Developer, Stop Focusing on Syntax
https://medium.com/better-programming/if-you-want-to-be-a-senior-developer-stop-focusing-on-syntax-d77b081cb10b