The Birth and Death of JavaScript
JavaScript ทำงานในเบราว์เซอร์ด้วยสิทธิ์ที่จำกัดมาก แม้จะเป็นเช่นนั้น แต่มันกลับถูกนำมาใช้รันเซิร์ฟเวอร์, เครื่องมือ build และแม้กระทั่งฐานข้อมูล นี่ไม่ใช่แผนการที่วางไว้ แต่มันคือการแก้ปัญหาเฉพาะหน้า (patches) ที่เกิดขึ้นต่อเนื่องมาจากคำตัดสินใจในปี 1995
ในปี 2014 Gary Bernhardt ได้กล่าวสุนทรพจน์ในหัวข้อ "The Birth and Death of JavaScript" หลายคนมองว่ามันคือคำทำนายที่ผิดพลาด แต่ผมมองว่ามันคือเครื่องมือในการวินิจฉัยปัญหาความขัดแย้งทางสถาปัตยกรรม (architectural friction)
Bernhardt ได้อธิบายถึงเส้นทางที่น่าตลกขบขัน JavaScript เริ่มต้นจากการเป็นเพียงภาษาที่สร้างขึ้นมาเล่นๆ แต่มันอยู่รอดมาได้เพราะมันเป็นภาษาเดียวที่ทำงานบนเบราว์เซอร์ได้ การผูกขาดนี้ทำให้มันกลายเป็นภาษาที่มีการประมวลผลมากที่สุดในโลก แม้ว่ามันจะไม่ใช่ตัวเลือกทางเทคนิคที่ดีที่สุดก็ตาม
ความขัดแย้งหลักนั้นเรียบง่ายมาก เบราว์เซอร์จำเป็นต้องรันโค้ดอย่างปลอดภัยและรวดเร็ว ซึ่งเป้าหมายทั้งสองนี้มักจะขัดแย้งกันเอง
ในปี 2014 มีการคาดการณ์ว่า WebAssembly จะเข้ามาแทนที่ JavaScript แต่สิ่งนั้นไม่ได้เกิดขึ้น WebAssembly มีความเสถียรและมีประโยชน์สำหรับสิ่งต่างๆ เช่น Figma หรือ Google Earth อย่างไรก็ตาม มันไม่ได้เข้ามาแทนที่ JavaScript ในฐานะภาษาสำหรับเขียนแอปพลิเคชัน
ในทางกลับกัน JavaScript ได้เกิดการกลายพันธุ์ ทั้ง TypeScript, bundlers และ runtime ใหม่ๆ อย่าง Deno หรือ Bun ต่างก็เป็นความพยายามในการแก้ไขปัญหาความขัดแย้งที่ Bernhardt เคยระบุไว้
อย่าใช้การพูดครั้งนี้เป็นข้ออ้างในการหลีกเลี่ยงการเรียนรู้ JavaScript และอย่าใช้มันเพื่อสร้างความชอบธรรมในการย้ายไปใช้ WebAssembly ก่อนที่คุณจะเจอปัญหาด้านประสิทธิภาพจริงๆ
จงใช้มันเพื่อตั้งคำถามเหล่านี้กับ stack ของคุณ:
• ฉันใช้เครื่องมือนี้เพราะมันเป็นทางออกที่ดีที่สุดสำหรับปัญหานี้ใช่หรือไม่? • ฉันใช้มันเพราะมันเป็นสิ่งเดียวที่ทำงานได้ในบริบทนี้ใช่หรือไม่? • ความซับซ้อนของเครื่องมือที่ฉันใช้ช่วยแก้ปัญหาจริงๆ หรือแค่ย้ายปัญหาไปไว้ที่อื่น? • ถ้าฉันต้องเริ่มใหม่จากศูนย์ในวันนี้ ฉันจะยังเลือกสิ่งนี้อยู่ไหม?
หากคุณใช้ TypeScript บนเซิร์ฟเวอร์ คุณจะได้ความปลอดภัยด้าน Type (type safety) แต่ต้องแลกมาด้วยภาระในการ compile (compilation overhead) หากคุณใช้ Next.js คุณจะได้ฟีเจอร์ต่างๆ เพิ่มขึ้น แต่ก็ต้องแลกมาด้วยความซับซ้อนในการทำ caching สิ่งเหล่านี้คือการแลกเปลี่ยน (trade-offs) ที่เกิดขึ้นจริง
ความผิดพลาดที่พบบ่อยที่สุดคือการโทษตัวภาษา ทั้งที่จริงๆ แล้วปัญหาเกิดจากการใช้งานที่ไม่ดี หากคุณเขียนโค้ดแบบ synchronous ที่ทำงานหนักจนไปบล็อก event loop ปัญหาก็คือตัวคุณ ไม่ใช่ JavaScript
เลิกมองหาตัว