نعرّف المؤسسة والعميل قبل أن تتعقد البيانات
نرسم علاقة المؤسسة بالمستخدمين والفروع والإعدادات والبيانات منذ البداية، لأن هذه الحدود تصبح أساس الصلاحيات والفوترة والتقارير والدعم لاحقاً.
نصمم المؤسسات والصلاحيات والعزل والإعدادات والفوترة والدعم والتحديثات من البداية، حتى يبقى المنتج واحداً مع نمو قاعدة العملاء.
للمنتجات التي تُباع لعدة شركات أو فرق، نحدد نموذج المؤسسة والعزل والصلاحيات والخطط وأدوات التشغيل قبل أن تنتشر هذه القرارات داخل كل جزء من المنصة. هكذا يبقى المنتج قابلاً للإدارة مع نمو العملاء.
نرسم علاقة المؤسسة بالمستخدمين والفروع والإعدادات والبيانات منذ البداية، لأن هذه الحدود تصبح أساس الصلاحيات والفوترة والتقارير والدعم لاحقاً.
لا يكفي فلتر في الواجهة. العزل يؤثر في الاستعلامات والملفات والذاكرة المؤقتة والسجلات والتقارير وأدوات الدعم، وأي ثغرة فيه قد تعني وصول مؤسسة إلى بيانات أخرى.
نحدد الأدوار والقدرات بطريقة تسمح بإضافة حالات جديدة من دون توزيع شروط استثنائية داخل كل شاشة ووظيفة.
عندما يحتاج عميل إلى ميزة أو إعداد مختلف، نفضّل تمثيله كإعداد أو صلاحية ضمن المنتج ما دام ذلك منطقياً، بدلاً من إنشاء نسخة كود مستقلة يصعب تحديثها وصيانتها لاحقاً.
الاشتراك والترقية والتخفيض والإلغاء وفشل الدفع والفواتير كلها حالات يجب أن يفهمها النظام، لا أحداثاً تعيش فقط داخل لوحة مزود الدفع.
لوحة الإدارة يجب أن تساعد الفريق على معرفة المؤسسة والخطة والاستخدام والمشكلات، مع صلاحيات وسجلات واضحة للعمليات الحساسة.
نفكر في التصدير والحذف والاحتفاظ والنسخ والاستعادة من البداية، لأن العملاء يضعون بياناتهم داخل المنصة ويحتاجون إلى حدود واضحة حولها.
يمكن تأجيل وظائف متقدمة، لكن لا نؤجل العزل والهوية ونموذج البيانات والمسار الذي يثبت القيمة الأساسية للمنتج.
وجود tenant_id في جدول لا يكفي. كل قراءة أو تعديل أو مهمة خلفية أو تقرير يجب أن يحمل سياق المؤسسة الصحيح، حتى لا يتحول خطأ عادي في استعلام إلى وصول عابر بين العملاء.
طريقة العزل تختلف بحسب حساسية المنتج وحجمه، لكن المبدأ واحد: سياق المؤسسة يجب أن يبقى صحيحاً في الـAPI والمهام الخلفية وأدوات الدعم والتصدير.
مع الوقت تظهر تجارب وإضافات وعروض خاصة وعملاء قدامى وخطط مختلفة. إذا كانت كل ميزة مرتبطة بشروط مبعثرة داخل الواجهة، يصبح أي تغيير في التسعير مخاطرة تقنية.
نمثّل القدرات والحدود والاستهلاك بوضوح، حتى يعرف المنتج ما الذي يحق لكل مؤسسة استخدامه ويمكن تعديل الباقات من دون إنشاء نسخة منفصلة لكل عميل.
الاشتراكات غير متزامنة بطبيعتها: قد يفشل التجديد، أو يتأخر Webhook، أو يتكرر الحدث، أو يعدّل أحدهم الاشتراك مباشرة لدى مزود الدفع. لا يجب أن تصبح لوحة المزود المصدر الوحيد للحقيقة.
نحتفظ بحالة اشتراك مفهومة داخل المنتج، ونعالج الأحداث بطريقة تمنع التكرار، ونضيف مصالحة دورية عندما توجد فرصة لاختلاف الحالتين.
أدوات الدعم قد تمنح أقوى الصلاحيات: تغيير خطة، إدارة مستخدمين، تصدير بيانات، انتحال جلسة مستخدم للدعم، أو تصحيح حالة. إذا بُنيت على عجل قد تصبح أخطر نقطة في المنظومة.
نحدد ما يستطيع كل دور رؤيته وفعله، ونضيف إعادة تحقق أو تأكيداً أو سجل تدقيق عندما يكون الإجراء عالي الأثر.
البريد وإنشاء الملفات والاستيراد ومعالجة AI والمزامنة والمهام المجدولة قد تصبح جزءاً أساسياً من المنتج. تراكم المهام بصمت يُعد عطلاً حتى لو بقيت الواجهة سريعة.
نراقب حالة المهام وأعمارها وإعادة المحاولة والفشل النهائي، ونظهر للمستخدم حالة صادقة عندما تكون العملية غير فورية.
تغيير بنية البيانات أو نموذج الصلاحيات أو منطق الفوترة يصبح أصعب عندما توجد مؤسسات ببيانات تاريخية تعتمد عليه. أحياناً نحتاج إلى توافق مؤقت أو تعبئة بيانات لاحقة أو طرح تدريجي.
نصمم عمليات الترحيل بحيث يمكن متابعة تقدمها والتحقق من نتيجتها، ونفكر في طريق الرجوع قبل أي تحويل يصعب التراجع عنه.
إذا كان كل سؤال من عميل يحتاج إلى مهندس يفتح قاعدة البيانات، فالمنصة قد تتحمل حركة المستخدمين لكنها لا تتحمل نمو التشغيل.
عندما يبرره المنتج، نبني أدوات آمنة لفريق الدعم للبحث عن المؤسسة ورؤية التاريخ وإعادة مهمة محددة أو تصحيح حالة عبر مسار مسجل، بدلاً من تنفيذ SQL يدوي على الإنتاج.
أمثلة على منتجات تحتاج إلى حالة مستمرة وصلاحيات محددة ومصدر مشترك للحقيقة.
سياق المستخدم وتقدمه يبقيان جزءاً من حالة المنتج، بينما يعمل AI فوق هذه الحقيقة لا بدلاً منها.
الويب والعمل داخل الموقع يستخدمان الحالة التشغيلية نفسها بدلاً من بناء نظامين منفصلين.
الحالة التجارية والتشغيلية تبقى مترابطة عندما يتخذ النظام قرارات المخزون والتنفيذ.
اشرح كيف يجري العمل اليوم وأين يتعطل. نبدأ بفهم الواقع وتحديد ما يستحق البناء قبل أن يتحول إلى مشروع برمجي.