Babel Coder

ใช้ภาษาอะไรเขียนโปรแกรมดี? คำถามยอดฮิตกับ7ข้อบัญญัติในการเลือกภาษาโปรแกรม

beginner

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

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 ก็ก็อบปี้แปะเรียบร้อย

# async/await ใน Python
async def compute(x, y):
    print("Compute %s + %s ..." % (x, y))
    await asyncio.sleep(1.0)
    return x + y

และใน JavaScript

async function fn () {
  return await Promise
    .resolve(1)
}

ไม่ใช่แค่ไวยากรณ์ทางภาษานะครับ เฟรมเวิร์คก็เช่นกัน กาลครั้งหนึ่งเมื่อ 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 และความคงทนสูงอยู่แล้ว

บทความนี้อ้างอิงจากการสนทนากับหลายๆคนแต่ไม่อิงกับทฤษฎีใดๆ โปรดใช้วิจารณญาณในการรับชม เพื่อนๆที่มีความเห็นอื่นๆอย่าเก็บไว้ในใจครับ ร่วมแชร์ความคิดเห็นได้ข้างล่างนี้ฮะ


แสดงความคิดเห็นของคุณ


Sarawoot Manmor2 ปีที่แล้ว

ผมก็เป็นคนหนึ่งที่เลือก ruby on rails เพราะ ง่าย / พัฒนาเว็บแอพพลิเคชันได้เร็วมาก / โค๊ดเป็นระเบียบ ปรับเปลี่ยนได้ไว