ملف App.js فارغ ومؤشر وامض يشعرانك بإمكانيات لا حدود لها. لا قيود. لا أكواد جاهزة (boilerplate) تخبرك بما يجب فعله. لكن تلك اللوحة البيضاء ليست حرية؛ بل هي دعوة مفتوحة لإعادة بناء الكون من الصفر.
ضريبة الشاشة الفارغة
ابدأ مشروعًا لا تملك فيه سوى مترجم (compiler) ومحرر نصوص. تشعر في اليوم الأول بالحماس والإثارة. تختار هيكل المجلدات، واتفاقية التسمية، والدرجة الدقيقة للون الرمادي للأزرار غير المفعلة. وبحلول اليوم الثالث، يتلاشى هذا الحماس ويظهر العمل الحقيقي.
تدرك حينها أن بناء قائمة بسيطة لا يقتصر على كتابة دالة map. عليك أن تقرر كيف سيبدو الهيكل أثناء تحميل البيانات، هل ينبض أم ينزلق، وكم يجب أن تكون مدة التأخير قبل ظهورها تمامًا. عليك أن تقرر ماذا يحدث عندما يفشل الاتصال بالشبكة أثناء التمرير. هل يجب إعادة المحاولة تلقائيًا؟ أم إظهار زر؟ أم تخزين الصفحة السابقة في الذاكرة المؤقتة (cache) للأبد؟ عليك أن تقرر كيف يتفاعل مرشحان (filters) نشطان، وكيف سيبدو "الحالة الفارغة" (empty state) عندما لا تعيد تلك التوليفة أي نتائج. بل عليك حتى أن تقرر ماذا تعني "النتائج الصفرية" لمستخدمك.
هذه هي مشكلات "التقنين" (formalization). إن تحويل مفهوم غامض إلى سلوك محدد ومتسق وقابل للتكرار هو الجزء الأصعب في بناء البرمجيات. الكود نفسه ليس سوى تدوين لتلك الخيارات. لهذا السبب، فإن التخصيص اللانهائي ليس ميزة، بل هو ضريبة، وتصل الفاتورة في شكل قرارات صغيرة تتراكم أسرع مما تتوقع.
قرارات لا تتوقف عن الاستنزاف
تعامل مع كل خيار معماري وكأنه اشتراك. تدفع القسط الأول عندما تكتب التنفيذ الأولي، ثم تستمر في الدفع، شهرًا بعد شهر.
تدفع الثمن عندما ينضم مهندس جديد ويسأل لماذا اخترت منطق إعادة محاولة مخصص (custom retry logic) بدلاً من مكتبة قياسية، ولا أحد يتذكر السبب. تدفع عندما يؤدي تحديث للمتصفح إلى تعطل معالج لمسات (touch handler) قمت ببرمجته يدويًا لأن أحدًا لم يوثق سبب ضبط ذلك الحد عند ثمانية وأربعين بكسل. تدفع عندما يجبرك تحديث أمني على إعادة هيكلة (refactor) تدفق المصادقة الخاص بك لأنه لم يتوقع أبدًا تدوير رمز التحديث (refresh token rotation).
إذا لم يتم اتخاذ أي قرار نيابة عنك، فسيصبح كل شيء مشكلتك. إن الحرية في بناء ما تريده تمامًا لا تنفصل عن عبء امتلاكه للأبد. ستصبح السلطة الوحيدة في أنماط (patterns) حلها قطاع الصناعة منذ سنوات. ستقضي ساعاتك في صيانة الأساسات بدلاً من بناء المنزل.
الذكاء الاصطناعي: فخ السرعة
يجعل الذكاء الاصطناعي هذه الديناميكية أكثر خطورة، لا أقل. يمكن لنموذج لغوي كبير (LLM) إنشاء وحدة مصادقة كاملة في ثلاثين ثانية. يمكنه بناء هيكل لطبقة الحالة (state layer)، وصياغة استراتيجية تخزين مؤقت، وكتابة حواجز التنقل (navigation guards) قبل أن تبرد قهوتك.
ولكن هنا تكمن الخدعة. يخفض الذكاء الاصطناعي تكلفة اتخاذ القرارات، بينما يبقي تكلفة امتلاكها عالية كما كانت دائمًا. يمكنك الآن إنشاء ديون تقنية (technical debt) أسرع من أي فريق في التاريخ. يعمل الكود في يوم العرض التجريبي، ويجتاز اختبار التشغيل الأولي (smoke test). ولكن بعد ستة أشهر، عندما يقوم مزود OAuth بإيقاف أحد نقاط النهاية (endpoints) أو عندما يتسبب منطق إبطال التخزين المؤقت (cache invalidation) في سباق بيانات (race condition) أثناء اتصال بطيء، ستجد نفسك تقوم بتصحيح أخطاء (debugging) قرارات استعنت فيها بآلة.
الفاتورة الخفية تأتي دائمًا في موعد استحقاقها. وتُدفع من ساعات العمل الهندسي، والتنقل بين المهام (context switching)، والتآكل البطيء لسرعة الإنجاز.
اشترِ "الممل" لعقود من الزمن
الإطار البرمجي (framework) أو المنصة الجيدة ليست قفصًا، بل هي شراء للوقت.
فكر في الأمور القياسية في كل تطبيق حديث تقريبًا. يحتاج المستخدمون إلى تسجيل الدخول. تحتاج البيانات إلى الانتقال بين الشاشات. تحتاج المعلومات البعيدة إلى تخزينها محليًا حتى لا تتوقف الواجهة عن العمل. يحتاج الأشخاص إلى التنقل دون فقدان السياق. هذه مجرد سلع أساسية، وليست عوامل تميز.
الإطار البرمجي الناضج يضع هذه الأنماط في قواعد رسمية مرة واحدة، ويقرر ما يلي:
- كيف تبدو حالات التحميل ومتى تظهر
- كيف تنتقل أخطاء الشبكة لتصل إلى الواجهة
- كيف يتم حل التعارض بين معاملي تنقل أو مرشحين نشطين
- ماذا يحدث للبيانات المحلية عندما يتم تحديث الخدمة الأساسية
ثم يقوم بتوثيق السلوك، واختبار الحالات الاستثنائية (edge cases)، وإرسال التحديثات (patches) بينما أنت نائم. وبذلك، يمكنك صب طاقتك في العشرة بالمائة الأخيرة التي تخصك حقًا: التفاعل المبتكر، أو منطق العمل الخاص.
