تغيير المحتوى داخل التطبيق دون إصدار جديد
لا يصبح تغيير المحتوى دون إصدار جديد ممكنًا إلا بعد أن تبني هندسة التطبيق مسار تسليم وعرض آمنًا.
التكامل يأتي أولًا
لا يصل أي شيء من منصة المحتوى إلى الشاشة قبل أن يطلبه التطبيق. في ContentFlow يمر هذا الطلب عبر REST API؛ وحزم SDK الأصلية لـReact Native وiOS وAndroid والويب لا تزال قيد المعاينة، فالتكامل المكتوب للإنتاج اليوم يُكتب مقابل عقد الواجهة. المضيف هو من يقرر متى يطلب، وماذا يخزّن مؤقتًا، وماذا يعرض حين تتأخر الإجابة أو تكون خاطئة.
هذه القرارات الثلاثة، لا واجهة النشر، هي ما يجعل تغيير المحتوى مفيدًا أو خطرًا.
إعداد البلوكات الديناميكية أربع خطوات، ولا تخص الأخيرتان منها إلا من سيستخدم الأداة يوميًا.
- الهندسةاربطوا REST API ليتمكن التطبيق من طلب المحتوى لمواضع واجهة محددة بالاسم.
- الهندسةسجّلوا كل فتحة محتوى: اسمها، وبنية المحتوى التي تقبلها، والمحتوى الاحتياطي الذي يظهر عند عدم رجوع أي بلوك.
- فريق المحتوىابنوا النسخ المسموح بها داخل كل فتحة مسجّلة. نصوص، وسائط، روابط، نسخ سياقية.
- فريق المحتوىاختبروا كل نسخة مقابل الفتحة التي ستدخلها، ثم انشروها للجمهور المحدد.
الخطوة الثانية هي التي يُتجاوَزها غالبًا، لأنها الوحيدة التي لا تُظهر نتيجة فورية. فتحة بلا محتوى احتياطي مُعلَن ليست محايدة. إنها قرار بعرض ما يفعله المكوّن تلقائيًا مع استجابة فارغة، اتخذه من كتب ذلك المكوّن، في يوم لم يكن هذا الموضوع محل تفكيره.
يمكن أن يختفي بانر ترويجي. ولا يمكن أن يختفي توضيح رسوم.
نشر المحتوى عبر ContentFlow لا يتطلب إصدارًا جديدًا للتطبيق ولا مراجعة جديدة في المتجر. أما أي تغيير في شفرة تطبيقك نفسه فيمر بمراجعة آبل وجوجل كالمعتاد، ويجب أن يبقى المحتوى المُرسَل عن بُعد ضمن الغرض المعلن لتطبيقك وضمن سياسات المتجر السارية عليه.
النشر ليس العرض. المنصة تُسلّم المحتوى، والتطبيق يقرر شكله وما يحدث حين يغيب.
ما يمكن للفرق تغييره
بمجرد وجود الفتحات، يمكن لفرق غير الهندسة تغيير ما جعلته الهندسة متغيّرًا فقط، ولا شيء غيره. تحمل البلوكات الديناميكية ستة أنساق: البطاقات، والبانرات، والكاروسيل، والنوافذ المنبثقة، والإشعارات العابرة، والتلميحات، ويبقى البلوك قابلًا للتعديل فقط ضمن النسق الذي سُجِّل فيه.
يمكن للمحرر اختيار معرّف إجراء من قائمة مسموح بها. المضيف هو من يقرر ما يفعله ذلك المعرّف.
الحقول المُهيكلة أفضل من صندوق نص غني واحد كبير أينما حملت الواجهة نتيجة فعلية. إشعار الرسوم يريد عنوانًا، ووصف مبلغ، وشرطًا مؤهِّلًا، ورابط دعم، كأربع قيم منفصلة، لأن التطبيق حينها يضع كل واحدة في مكوّن يملك أصلًا مقياس النوع الصحيح، والدلالات الصحيحة لإمكانية الوصول، وقاعدة الاقتطاع الصحيحة. حقل نص غني واحد يمنح المحرر حرية أكبر ويمنح المُصيّر جداول متداخلة لم يُبنَ من أجلها قط.
لذا اختاروا الحرية بعناية، حقلًا حقلًا. الجزء غير المريح أن النظام الأكثر أمانًا هو الأقل راحة في العمل عليه، ولا يوجد ترتيب يجعل ذلك يتوقف عن الصحة.
حيث يكون التغيير مهمًا بما يكفي ليحتاج عينًا ثانية، فذلك مكانه في الحملات، التي تحمل مراجعين مُسمّين ولن تحرك عملية نشر خارج حالة الاعتماد حتى يوقّعوا.
النشر ليس العرض
النشر الناجح يعني أن نسخة معتمدة أصبحت متاحة على مسار التسليم. لا يعني أن أحدًا رآها. الأجهزة تحمل ذاكرة تخزين مؤقت، والأجهزة تنقطع عن الشبكة، ويمكن أن يطلب جهاز بيئة أو لغة خاطئة بينما يبقى سجل النشر صحيحًا تمامًا.
حالة النشر، وحالة التسليم، وحالة العرض ثلاث حقائق مختلفة، وعادة ما تحتاج تذكرة الدعم إلى الثلاث للإجابة عن سؤال واحد.
وهنا أيضًا يتوقف دور التحليلات عن المساعدة. فهي تسجّل مرات الظهور والتفاعلات والنتائج التي أرسلها التطبيق فعلًا، ولا يمكنها إعادة بناء ما لم يُرسله. إذا أسقط المُصيّر بلوكًا بصمت، فلا حدث يوثّق ذلك، ويُظهر التقرير عرضًا لا يمكن لأحد إثبات أنه رُسم فعلًا.
لذا يجب أن تحمل الاستجابة هوية إصدار كافية ليقول السجل أي محتوى استلمه العميل. والتراجع (Rollback) يستحق أن يُفهم على حقيقته: إنه يعيد نسخة محتوى سابقة. لا يعيد وصل جهاز غير متصل، ولا يعلّم إصدارًا قديمًا حقلًا لم يدعمه قط.
المعاينة لا تستحق اسمها إلا حين تعرض البنية نفسها التي يعرضها الإنتاج. متصفح المعاينة يلتقط حقلًا مفقودًا وخطأ إملائيًا. لا يلتقط التفاف السطر في الأصل، ولا استبدال الخط، ولا قاعدة اقتطاع تحذف كلمة "لا" من نهاية جملة.
الهندسة تبقى مالكة الحد الفاصل
المحتوى دون إصدار لا ينهي مسؤولية الهندسة. إنه ينقلها. المحلِّل، والمكونات، وسياسة الشبكة، والذاكرة المؤقتة، وقيم الاحتياط، ومعالجة الحقول غير المدعومة كلها تبقى في التطبيق، وكذلك القرار بشأن أي مخططات روابط يُسمح لرابط المحرر باستخدامها.
المحتوى البعيد مُدخَل. يجب ألا يتحول أبدًا إلى شفرة.
عند انقطاع الشبكة يعرض التطبيق المحتوى البديل المضمّن في نسخته. ولا يمكن لأي تغيير من ContentFlow أن يصل إلى جهاز غير متصل، والجهاز الذي لم يتصل بنا مطلقًا لا يحمل أي نسخة مخزّنة من محتوانا.
انحراف الإصدارات هو المشكلة الأبطأ. حقل أُضيف هذا الشهر غير ضار لإصدار صدر هذا الشهر، وغير مرئي لإصدار صدر العام الماضي، وكل علاج لذلك، حقول اختيارية، إصدار للمخطط، نسخ مرتبطة بقدرات مُعلنة، يضيف عملًا تحريريًا فوق عمل الهندسة. سحب نسخة قديمة مبكرًا جدًا يكسر إصدارات لا تزال قيد الاستخدام. والاحتفاظ بكل نسخة إلى الأبد يجعل نموذج المحتوى الشيء الذي لن يلمسه أحد.
دوّنوا الملكية عبر الهندسة والمنتج والمحتوى والتعريب والتشغيل. امنحوا أدوار النشر أقل الصلاحيات الممكنة. اشحنوا محتوى احتياطيًا مُختبرًا بدل افتراض أن التراجع سيكون متاحًا يوم الحاجة إليه.
ليس هذا حجة ضد المحتوى دون إصدار. إنه حجة لصالح أن تقرروا، سطحًا سطحًا، أي التغييرات تنتمي إلى عملية نشر وأيها لا يزال ينتمي إلى إصدار.