ميلاد وموت JavaScript
تعمل JavaScript في المتصفح بصلاحيات محدودة للغاية. ورغم ذلك، فهي تشغل الخوادم، وأدوات البناء، وحتى قواعد البيانات. لم يكن هذا مخططاً مدروساً، بل كان سلسلة من الحلول المؤقتة المبنية على قرار اتُخذ في عام 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)، وبيئات التشغيل الجديدة مثل Deno أو Bun، كلها محاولات لمعالجة نقاط الاحتكاك التي حددها Bernhardt.
لا تستخدم هذا العرض لتجنب تعلم JavaScript، ولا تستخدمه لتبرير الانتقال إلى WebAssembly قبل أن تواجه مشكلة حقيقية في الأداء.
استخدمه لطرح هذه الأسئلة حول بنيتك التقنية (stack):
• هل أستخدم هذه الأداة لأنها الحل الأفضل لهذه المشكلة؟ • هل أستخدمها لأنها الشيء الوحيد الذي يعمل في هذا السياق؟ • هل تعقيد أدواتي يحل مشكلة حقيقية أم ينقلها فقط إلى مكان آخر؟ • لو بدأت من الصفر اليوم، هل كنت سأختار هذا؟
إذا كنت تستخدم TypeScript على الخادم، فستحصل على أمان الأنواع (type safety) ولكنك ستضيف عبئاً في عملية التجميع (compilation overhead). وإذا كنت تستخدم Next.js، فستحصل على ميزات إضافية ولكنك ستضيف تعقيداً في التخزين المؤقت (caching). هذه هي المقايضات الحقيقية.
الخطأ الأكثر شيوعاً هو إلقاء اللوم على اللغة بينما تكمن المشكلة في الواقع في سوء الاستخدام. إذا كتبت كوداً متزامناً (synchronous) ثقيلاً يعطل حلقة الأحداث (event loop)، فالمشكلة فيك أنت، وليس في JavaScript.
توقف عن البحث عن بديل سحري، وابدأ في قياس نقاط الاختناق (bottlenecks) الحقيقية لديك.