ใช้ภาษาอะไรเขียนโปรแกรมดี? คำถามยอดฮิตกับ7ข้อบัญญัติในการเลือกภาษาโปรแกรม
เรื่องมันเกิดจากได้มีโอกาสคุยกับเพื่อนสองสามคนถึงภาษาต่างๆที่เกิดใหม่เป็นดอกเห็น หลายคนเริ่มเปลี่ยนไปใช้ภาษาใหม่ บางคนใช้แล้วกลับมาอวยให้ฟัง แต่อีกส่วนหนึ่งใช้ไปใช้มาแรกๆก็ฝากตัวเป็นสาวกสุดฤทธิ์ จากนั้นไม่นานกลายเป็นเผาพริกเผาเกลือแช่ง แถมด่าส่งท้ายว่าเป็นสุดยอดภาษาโคตรกากแห่งยุค สุดท้ายจึงนำไปสู่คำถามที่ว่า เราควรใช้ภาษาอะไรเขียนโปรแกรมดี?
1. อย่าเลือกภาษาเพียงเพราะมันเร็ว
เรียนมาด้วย Java ดันไปเจอว่า C++ เร็วกว่า จึงหันไปเขียน C++ พอเขียนไปเขียนมารู้สึกว่าคลาสใน C++ ทำให้ performance ไม่ดีเท่า C เลยเอา OOP ออกไปเขียน C ดีกว่า ต่อมาเจอภาษา D ดูแล้วบางผลทดสอบก็เร็วกว่า C นะ เปลี่ยนอีกรอบเป็นภาษา D ใช้ไปใช้มาซักพักเจอเพื่อนแนะนำว่าบางฟังก์ชัน Haskell ได้ผลลัพธ์ที่ดีกว่า เปลี่ยนภาษาอีกรอบเป็น Haskell ซักพักเริ่มทำงานกับตัวเลขมากขึ้น จึงเปลี่ยนเป็น Fortran ซะเลย ทำงานกับตัวเลขได้ดีกว่าชัวร์
ถ้าชีวิตคุณกำลังติดลูปแบบนี้ไม่วันใดก็วันนึงคุณคงได้กลับไปใช้ภาษา Assembly เป็นแน่
เชื่อไหมครับโปรแกรมเมอร์ส่วนใหญ่คิดว่าความเร็วในการประมวลผลนั้นมาจาก ภาษาโปรแกรม
คนส่วนใหญ่ชอบยกว่า C ไวกว่า Java นะ Python เนี่ยโคตรอืดเพราะเป็น Dynamic Language ต้องบอกเลยครับว่าในความเชื่อนี้ครึ่งนึงนั้นผิด
ไวยากรณ์ทางภาษาเป็นส่วนหนึ่งที่ทำให้ภาษานั้นเร็ว แต่สิ่งที่สำคัญที่สุดคือ compiler หรือ interpreter ต่างหาก คอมไพเลอร์ตัวไหนเจ๋งก็จะแปลงภาษานั้นให้เป็นภาษาเครื่องที่ใช้ชุดคำสั่งน้อยกว่าหรือซับซ้อนน้อยกว่า เป็นผลทำให้ทำงานได้เร็วกว่า แม้แต่ภาษาเดียวกันอย่าง C คอมไพเลอร์ของ GCC ยังให้ความเร็วไม่เหมือนกันกับคอมไพเลอร์ของ Intel เลยทั้งๆที่โปรแกรมต้นฉบับเดียวกันแท้ๆ ทางฝั่งภาษาไดนามิกอย่าง Python ก็เช่นกันแค่เปลี่ยนไปใช้ PyPy หรือ CPython ระดับความลื่นหัวแตกก็ดีขึ้นกว่าเดิม
ด้วยเหตุนี้ถ้างานของคุณไม่ได้ตั้งเป้าอยู่ที่ประสิทธิภาพระดับสูง การใช้ความเร็วของภาษาเป็นปัจจัยในการเลือกอาจไม่ตอบโจทย์มากนัก เพราะในภาษาเดียวกันเพียงคุณเปลี่ยนคอมไพเลอร์ ผลลัพธ์ที่ได้อาจเร็วกว่าเป็นสิบเท่าก็เป็นได้
2. อย่าเลือกภาษาเพียงเพราะมีฟีเจอร์เจ๋งกว่า
กาลครั้งหนึ่งไม่นานนัก Java ยังไม่มี Lambda Expression ผู้คนต่างถวิลหาฟีเจอร์นี้เพราะในภาษาสมัยใหม่นั้นมีแทบจะหมดแล้ว เมื่อ Java8 ถือกำเนิดขึ้น โลก Java ก็เบ่งบานไปด้วย Lambda Expression...
หลายคนเลือกภาษาเพราะมีฟีเจอร์ทางภาษาที่เจ๋งกว่าซึ่งมันก็เป็นหนึ่งในกลยุทธ์ที่ดีในการเลือกภาษา แต่สำหรับคนที่เขียนโปรเจคมาแล้วจะละทิ้งภาษานั้นเสียเพราะขาดฟีเจอร์ที่ภาษารุ่นใหม่มีอันนั้นอาจคิดผิดครับ ภาษาโปรแกรมสมัยใหม่มีแนวโน้มที่จะเขียนเหมือนกัน เราแลกไวยากรณ์และฟีเจอร์ทางภาษากันไปมาจนบางทีก็รู้สึกว่าจะก็อปปี้อะไรกันขนาดนั้น ยกตัวอย่างเช่น Python มี async/await ครับ และตอนนี้ ES2016 หรือ ES7 ทางฝั่ง JavaScript ก็ก็อบปี้แปะเรียบร้อย
1# async/await ใน Python2async def compute(x, y):3 print("Compute %s + %s ..." % (x, y))4 await asyncio.sleep(1.0)5 return x + y
และใน JavaScript
1async function fn() {2 return await Promise.resolve(1)3}
ไม่ใช่แค่ไวยากรณ์ทางภาษานะครับ เฟรมเวิร์คก็เช่นกัน กาลครั้งหนึ่งเมื่อ Ruby on Rails ถือกำเนิดขึ้นและเบ่งบานจนปฏิวัติเว็บเฟรมเวิร์คในเวลาถัดมา ตอนนี้เว็บเฟรมเวิร์คในภาษาอื่นๆได้นำแนวคิดของ Ruby on Rails ไปทำให้เป็นจริงในภาษาอื่นที่ไม่ใช่ Ruby เช่น Laravel (PHP), Groovy on Grails (Grails), Play Framework(Java, Scala), Spring Boot (Java), ASP.Net MVC (.Net), Phoenix (Elixir) และอื่นๆ
แม้ในขณะนี้ตัวภาษาที่คุณใช้อยู่จะไม่มีฟีเจอร์ที่ภาษาอื่นๆมี แต่เชื่อเถอะถ้าภาษานั้นดังพอ ก็จะมีคนทำไลบรารี่ที่ทำให้ฟีเจอร์นั้นๆเกิดขึ้นในภาษาคุณได้ เช่น สมัยที่ Android ที่เขียนด้วยภาษา Java ยังไม่รองรับ Java8 นักพัฒนาที่ต้องการใช้ Lambda จึงต้องกระทำผ่าน plugin ตัวนึงคือ gradle-retrolambda เป็นต้น
ดังนั้นอย่าย้ายไปภาษาอื่นเพียงเพราะภาษานั้นมีฟีเจอร์ที่เจ๋งกว่า โดยปราศจากการประเมินผลดีผลเสียและผลกระทบของการเปลี่ยนแปลง
3. อย่าเลือกภาษาเพียงเพราะคนอื่นแนะนำ
การที่ใครซักคนจะหลงรักภาษาโปรแกรมหนึ่งๆได้แสดงว่ามันต้องถูกจริตของเขา แต่รูปแบบการเขียนโปรแกรมของคุณและเขานั้นไม่เหมือนกัน คุณอาจจะชอบ OOP แต่เขาชอบ functional programming เมื่อรูปแบบการเขียนไม่ใช่แบบใจคุณรัก การเลือกภาษาโปรแกรมในครั้งนี้มันก็ไม่ต่างอะไรจากการแต่งงานกับคนที่คุณไม่ชอบ
4. จงเลือกภาษาโปรแกรมเพื่อปัจจุบัน ไม่ใช่เพื่ออนาคต
เราไม่มีเวลามากพอที่จะมองหาภาษาที่เจ๋งมาก ถ้าคุณเห็นภาษาเกิดใหม่มีฟีเจอร์ที่น่าสนใจหรือพลิกวงการ คุณต้องถามตัวเองก่อนว่าคุ้มไหมที่จะเริ่มต้นกับมัน ภาษาที่เกิดใหม่หมายความว่าพึ่งได้รับการพัฒนา แน่นอนว่ามันต้องมีข้อผิดพลาดอยู่ในตัวภาษาเป็นแน่ คุ้มไหมที่คุณจะเอาผลิตภัณฑ์ของคุณไปผูกกับภาษาใหม่เหล่านี้? คุณต้องตอบคำถามตนเองว่าพร้อมไหมที่จะเป็นหนูทดลองให้กับภาษาที่พึ่งถือกำเนิด?
Java เป็นภาษาและแพลตฟอร์มที่แม้จะมีข่าวเน่าจนบูด แต่ทำไมมันถึงไม่ตายและยังเติบโตไปพร้อมกับนักพัฒนาในทุกวันนี้? นั่นเป็นเพราะตัวภาษาได้รับการพิสูจน์มากว่า20ปี ผ่านการทดสอบแล้วทดสอบเล่า ผ่านการปรับปรุงประสิทธิภาพมานับไม่ถ้วน มันจึงเป็นหนึ่งในภาษาที่ได้รับความไว้วางใจ
ในโลกธุรกิจ time to market นั้นสำคัญ เมื่อคุณเจอข้อผิดพลาดของภาษา คุณจะรอคอยให้นักพัฒนาแก้ไขข้อผิดพลาดได้ไหม ในเมื่อกำหนดส่งงานของคุณคือพรุ่งนี้! นั่นละฮะเหตุผลเดียวกับที่เราไม่ยอมเป็นหนูทดลองให้กับซอฟต์แวร์ประเภท beta version ทั้งหลาย
5. จงเลือกภาษาโปรแกรมที่ดังและเป็นที่รู้จัก
ภาษาที่ดังและเป็นที่รู้จักหมายความว่า เมื่อคุณเจอปัญหาจะมีกลุ่มคนหรือ community คอยช่วยเหลือคุณ วิธีดูความเป็นภาษายอดนิยมที่เราใช้กันก็คือ
- ดูยอด star ของภาษานั้นๆใน Github ยิ่งมียอดสูงแสดงว่าคนยิ่งนิยม
- ดู pull requests ของภาษานั้นๆใน Github เพื่อดูความเคลื่อนไหวของภาษา
- ดูวันที่อัพเดทภาษาล่าสุด
- ดูยอดค้นหาเกี่ยวกับภาษานั้นๆผ่าน search engine เช่น Google
- แน่นอนว่าดูยอดคำถามจาก Stackoverflow ด้วย
- อื่นๆ
นอกจากนี้ภาษาที่ดังยังหมายถึงความสะดวกสบาย มีหลายๆคนที่เจอโจทย์แบบเดียวกันกับคุณ คุณกำลังมองหาไลบรารี่สำหรับทำแผนที่ อาจจะมีคนอื่นที่เจอกับความต้องการแบบคุณสร้างไลบรารี่นี้ไว้ให้แล้ว คุณแค่เป็นนักก็อบที่ดีหยิบมาใช้ได้เลย
มีอยู่ข้อนึงที่สำคัญมากคือ ภาษาโปรแกรมนั้นมีการพูดถึงกันในประเทศของคุณหรือไม่ คุณชอบภาษา Rust แต่ไม่มีตำแหน่งงานของภาษานี้ในประเทศของคุณมันก็เท่านั้น คุณเปิดบริษัทซอฟต์แวร์พัฒนาด้วยภาษา Julia แต่ไม่มีโปรแกรมเมอร์ที่เขียนภาษานี้เป็นในประเทศของคุณมันก็เท่านั้น
6. จงเลือกภาษาโปรแกรมโดยดูจากผู้สนับสนุน
Twitter เคยใช้ Ruby และ Ruby on Rails เป็นส่วนหลักๆของระบบ แต่ปัจจุบันหลายๆส่วนได้ย้ายจาก Ruby ไปเป็น Scala หมดแล้วด้วยปัญหาคลาสสิกคือช้าและขยายขนาดไม่ได้
Python เป็นภาษาตระกูลไดนามิกเหมือน Ruby แต่ไม่ค่อยเจอใครบ่นช้าหรือขยายขนาดไม่ได้เท่า Ruby แถมถ้าคุณ google ดูตอนนี้ยังแทบไม่ค่อยมีบทความว่าด้วยเรื่องการย้ายจาก Python ไปภาษาอื่น
ทำไมจึงเป็นเช่นนั้น? Ruby นั้นเกิดมาจากชาวญี่ปุ่นตัวเล็กคนนึงที่ไม่ได้มียักษ์ใหญ่หนุนหลัง ผิดกับ Python ที่มีพี่เบิ้มอย่าง Google คอยโอบแขนล้อมและประคองตัวภาษาเอาไว้ ถ้า Python ช้าพี่เบิ้มก็ต้องลงมาปรับปรุง ถ้า Python มีข้อผิดพลาดร้ายแรงพี่เบิ้มก็ต้องช่วยแก้ไข นั่นเป็นเพราะพี่เบิ้ม Google แกก็ใช้ภาษานี้เช่นกัน
เมื่อลองสังเกตไปที่ภาษาอมตะอื่นๆก็มักจะพบยักษ์ใหญ่หนุนหลังเสมอๆ เช่น Facebook กับ PHP หรือ Java กับ Oracle เป็นต้น
แล้วถ้าคุณใช้ภาษาที่ไม่มียักษ์ใหญ่ประคับประคองอยู่หละ? ปัญหาหลายๆอย่างในภาษาก็อาจขับเคลื่อนหรือแก้ไขช้า performance อาจไม่ค่อยได้รับการปรับปรุงมากมายนัก แต่ถ้าผู้พัฒนาภาษานั้นๆเจ๋งจริง ซักวันภาษาที่คุณเลือกอาจเป็นแจ็คผู้ฆ่ายักษ์ก็เป็นได้
7. จงเลือกภาษาโปรแกรมที่เหมาะสมกับงาน
เหนือกว่าทุกๆข้อ นี่คือข้อที่สำคัญที่สุดในบัญญัติทั้ง7ประการ ไม่ใช่เพียงเพราะง่าย ไม่ใช่เพียงเพราะฟีเจอร์ดี แต่เราต้องเลือกภาษาให้เหมาะกับงาน
ผมเจอหลายบทความใน Google บอกว่า นี่นะพวกเราย้ายจาก Node.js ไปใช้ Golang เรียบร้อยแล้วหละ ทำไมหนะหรือก็เพราะ callback มันช่างปวดหัวเสียนี่กระไร!
นั่นละฮะ ถ้าความถนัดของเราไม่ใช่การแบ่งหัวคิดแบบ async ก็อย่าไปจับมันเลย Node.js หนะ เราควรใช้ภาษาที่เหมาะกับงานและความถนัดส่วนตนหรือส่วนทีมมากกว่า ลองไปดูกันว่าเราจะมีวิธีเลือกภาษาให้เหมาะกับงานแบบไหนได้บ้างโดยยกตัวอย่างจากงานเขียนเว็บครับ
โจทย์ | ภาษาหรือเฟรมเวิร์คที่เลือก | เหตุผล |
---|---|---|
ต้องการทำ prototype ส่งให้ลูกค้าดูอย่างรวดเร็ว | Meteor.js | ง่าย / ใช้ JavaScript ภาษาเดียวในการพัฒนา / Real time / Reactive |
ต้องการทำ minimum viable product (MVP) | Ruby on Rails | ง่าย / พัฒนาเว็บแอพพลิเคชันได้เร็วมาก / โค๊ดเป็นระเบียบ ปรับเปลี่ยนได้ไว |
Blog/CMS | Wordpress | ผมรู้คุณก็ใช้! |
ระบบที่ต้องการความคงทนสูง รองรับผู้ใช้งานได้จำนวนมากและ realtime | Elixir / Erlang | Erlang เป็นภาษาที่ออกแบบมาเพื่อการขยายขนาด การทำ realtime และความคงทนสูงอยู่แล้ว |
บทความนี้อ้างอิงจากการสนทนากับหลายๆคนแต่ไม่อิงกับทฤษฎีใดๆ โปรดใช้วิจารณญาณในการรับชม เพื่อนๆที่มีความเห็นอื่นๆอย่าเก็บไว้ในใจครับ ร่วมแชร์ความคิดเห็นได้ข้างล่างนี้ฮะ
สารบัญ
- 1. อย่าเลือกภาษาเพียงเพราะมันเร็ว
- 2. อย่าเลือกภาษาเพียงเพราะมีฟีเจอร์เจ๋งกว่า
- 3. อย่าเลือกภาษาเพียงเพราะคนอื่นแนะนำ
- 4. จงเลือกภาษาโปรแกรมเพื่อปัจจุบัน ไม่ใช่เพื่ออนาคต
- 5. จงเลือกภาษาโปรแกรมที่ดังและเป็นที่รู้จัก
- 6. จงเลือกภาษาโปรแกรมโดยดูจากผู้สนับสนุน
- 7. จงเลือกภาษาโปรแกรมที่เหมาะสมกับงาน