في هذه الصفحة
المصدر: docs-content/ar/07-legacy-comparison.mdتعديل هذه الصفحة

نُطقي — مقارنة بالبناء السابق

سبق أن بُني نُطقي مرة أولى. تقارن هذه الصفحة ذلك البناء السابق بالبناء المُسلَّم هنا، وحدةً وحدة، وتسجّل ما أخذناه عنه. وهي تقويم لمفاضلات هندسية لا بطاقة درجات: فقد حلّ الفريق السابق بعض المسائل قبلنا وعلى نحو أفضل مما فعلنا، وتلك الحلول تُتبنّى بدل أن يُعاد اختراعها.

كيف أُجريت هذه المقارنة#

يتألف البناء السابق من قطعتين منشورتين: واجهة برمجية مكتوبة على Django REST Framework، وعميل ويب مكتوب على Next.js. وكلتاهما متاحتان للعموم، وهو ما جعل المقارنة الواقعية ممكنة أصلًا.

  • الواجهة البرمجية تصف نفسها. فهي تنشر وصفًا آليًا بصيغة OpenAPI 3.0.3 وتستضيف فوقه واجهة Swagger UI، فأمكن قراءة سطحها قراءةً دقيقة بدل استنتاجه من الشاشات: 40 مسارًا، و87 عملية، و103 مخططات (‏30 GET، و22 POST، و11 PUT، و12 PATCH، و12 DELETE).
  • العميل جرى تشغيله لا تخمينه. تُصفِّحت صفحاته في المتصفح بالنسختين اللغويتين، وقُرئت استجابات مساراته العامة قراءة مباشرة.
  • لم يُمَسّ شيء خاص. لم يُنشأ أي حساب ولم تُستخدم أي بيانات اعتماد. وقد تأكّد أن المسارات الشخصية ترفض المنادي المجهول بالرمز 401؛ ولم يُقرأ إلا ما هو عام من بيانات مرجعية وصفحات.

ما يُحسِنه البناء السابق#

في ذلك البناء أربعة أمور هي هندسة جيدة بحق، اثنان منها أفضل مما شحنّاه نحن.

  • سطح المصادقة مكتمل ومغلق على نحو صحيح. دخول برمز حامل مع مسارات صريحة للدخول والتجديد والتحقق والخروج، وإلى جانبها طقم استعادة حساب كامل: إصدار رمز OTP، والتحقق منه، وطلب إعادة تعيين كلمة السر، وتأكيدها، وضبط كلمة سر جديدة. والمسارات الشخصية تُرجع 401 للمنادي المجهول، بينما البيانات المرجعية عامة عن قصد. وهذا هو الفصل الصحيح، وقد تحقّقنا منه بدل افتراضه.
  • البيانات المرجعية مُطبَّعة وثنائية اللغة في قاعدة البيانات نفسها. فالدول والمحافظات والمدن جداول قائمة بذاتها، وكل صف يحمل اسمًا بالعربية واسمًا بالإنجليزية (إضافة إلى مفتاح الاتصال ومفتاح الترتيب). وجدول الدول وحده مزروع بالكامل: 246 صفًا، والتهجئتان موجودتان. وسجل الطفل يحمل الاقتران نفسه: الاسم الأول والأخير مخزَّنان مرتين، مرة لكل لغة.
  • المؤهلات المهنية مُنمذَجة لا مكتوبة. فالتخصصات والتخصصات الفرعية جداول، وكذلك التدريبات والدورات، والشهادات الجامعية، وسجل بيانات العمل الذي يربط المهني بتخصص ودولة ومحافظة ومدينة — كلها بالإشارة لا بالنص الحر. ويجلس على السجل نفسه سعرٌ لأول جلسة محسوبٌ لكل تخصص.
  • أنواع الحسابات مصرَّح بها. فللمستخدم الأساسي ووليّ الأمر والحساب الشخصي والدكتور أو الأخصائي والمركز مخططٌ خاص بكل منها، فلا تحتاج الحمولة إلى قراءة دفاعية لمعرفة أي نوع من الحسابات تصف.
  • القوائم تتشارك اتفاقًا واحدًا. فكل قائمة مُصفَّحة تقبل معاملات الاستعلام نفسها — رقم الصفحة وحجمها، وsearch، وordering، ومرشِّحات لكل حقل تشمل المطابقة الجزئية غير الحساسة لحالة الأحرف. ومن تعلّم قائمة واحدة فقد تعلّمها كلها.
  • قصد المنتج ظاهر في العميل. فأنماط الحجز الثلاثة (أونلاين، وحضوري، واستشارة) وطقم المرشِّحات (التخصص والمحافظة والمدينة والبحث الحر) هي الأدوات الصحيحة لهذا المنتج، والمراكز والمهنيون المعروضون سجلات مزروعة حقيقية لا صفوفًا وهمية. والتسجيل معالج من أربع خطوات — نوع الحساب، ثم البريد والتليفون، ثم التفاصيل، ثم تأكيد التليفون — عبر خمسة أنواع حسابات، مع منتقي دولة على حقل التليفون وخيار الدخول عبر Google.

التغطية: ماذا يحوي كل من الواجهتين#

الواجهتان ليستا بالحجم نفسه لأنهما ليستا في المرحلة نفسها. فواجهتهم طبقة حسابات وملفات وبيانات مرجعية: 40 مسارًا. وواجهتنا هي تلك الطبقة مضافًا إليها النصف المعاملاتي من المنتج: نحو 150 مسارًا موزّعة على سبع عشرة وحدة.

تغطي الواجهة السابقة الأماكن، والمصادقة والمستخدمين، وبيانات الملف المهني (التخصصات والتخصصات الفرعية والتدريبات والدورات والشهادات الجامعية وبيانات العمل)، وجانب وليّ الأمر (الأطفال ومستنداتهم)، ومرفقات المستخدم وقوائم الحظر والفيديوهات.

وما يوجد في البناء الحالي ويغيب عن السابق كليًا:

  • الحجز — شبكة المواعيد، ودورة حياة الحجز، والانتقالات بين حالاته.
  • الجلسات، وجداول العمل، وأيام الإجازة.
  • المدفوعات — المحفظة، ودفتر الأستاذ، وطلبات السحب.
  • محرك الخطط العلاجية والمقاييس — القوالب، والتكليفات، والحفظ التلقائي أثناء ملء الاستمارة، والنتائج.
  • التقييمات.
  • المراكز — الفروع، والموظفون، وجداول الموارد البشرية خلفهم: الحضور والغياب والوقت الإضافي والجزاءات والطلبات.
  • الوظائف وطلبات التوظيف.
  • الإشعارات، وطابور تفعيل المشرف، ومسبار سلامة للنشر.

والمفاضلة واضحة القراءة: استثمروا هم في الأساس الذي تقوم عليه أي سوق ونمذجوه بعناية، واستثمرنا نحن في المعاملات التي تحوّل الدليل إلى عيادة عاملة. وكل بناء أقوى ما يكون حيث يكون الآخر أنحف، ولهذا وُجدت قائمة التبنّي أدناه.

محتوى المنتج وتصنيف التخصصات#

العميل المنشور يعمل بمحتوى قالبٍ لم تمرّ عليه بعدُ مراجعة محتوى. فالواجهة الرئيسية ما زالت تحمل نصوص القالب الأصلي في مجال العقارات — عنوانًا عن اكتشاف ما هو آتٍ، وسطرًا يدعو الزائر إلى إيجاد المنزل الذي يطابق أحلامه. وبطاقات المراكز تستخدم صورًا مخزونة لغرف عمليات جراحية، وبطاقات المهنيين تستخدم صور أشخاص لا صلة لها بهم.

أما الجزء الجوهري فهو التصنيف. قائمة التخصصات في الإنتاج قائمة طبية عامة: الأسنان، والجهاز الهضمي والمناظير، والطب النفسي، والروماتيزم، والعظام، وجراحة الأوعية، والأنف والأذن والحنجرة، وإنقاص الوزن والتغذية، وجراحة الأطفال، والكلى. ولا يوجد فيها أي تخصص تخاطب على الإطلاق. فالزائر الواصل إلى ذلك الموقع لا يستطيع أن يعرف ما الغرض من المنصة، ووليّ الأمر الباحث عن التخاطب لا يجد مرشِّحًا يوصله إلى أخصائي.

والبناء الحالي تخاطبيّ أولًا في كل موضع: أنواع الجلسات هي التخاطب وتنمية المهارة والتواصل البصري والاستشارة، وهي القيم الأربع نفسها في مرشِّح الدليل، واستمارة الحجز، وسجل الجلسة، وملف الأخصائي. وهذا قرار منتج لا فرق إدخال بيانات — لكن راجع قائمة التبنّي، لأن طريقة تخزينهم للتخصص أفضل من طريقتنا.

النسختان اللغويتان#

عميلهم يصيب الجزء الصعب ويخطئ الذيل الطويل. فالتحويل إلى العربية يقلب التخطيط إلى اليمين على نحو صحيح — وهذا هو الجزء المكلف تركيبه لاحقًا وقد أُنجز — وعناوين حقول الاستمارات مترجمة.

أما ما يبقى إنجليزيًا داخل النسخة العربية فهو: شريط التنقل (الرئيسية، ومن نحن، واتصل بنا)، وزرّا تسجيل الدخول والبدء، والواجهة الرئيسية، وتبويبات نمط الحجز، والسطر الذي يعلو قائمة النتائج، وعناوين حقول استمارة التسجيل نفسها (البريد الإلكتروني، ورقم التليفون، وتسجيل، ورجوع). والنتيجة صفحة عربية يظل على قارئها أن يقرأها بلغتين.

وهذا بالضبط هو الإخفاق الذي أنفق البناء الحالي عليه قرارًا. فالقرار D-28 قسم التوثيق إلى نسختين كاملتين بدل موقع واحد مخلوط، والقرار D-29 حدّد متى تكتمل ثنائية اللغة، وكلاهما مفروض آليًا: يسقط البناء إن حمل النص الإنجليزي حروفًا عربية، أو حمل النص العربي كلمة لاتينية غير مترجمة خارج المعرّفات البرمجية، أو وُجد نص واجهة بلغة دون الأخرى. ولمعالجة الاتجاه اختباراتها الخاصة، لأن العطبين اللذين جعلا الصفحة العربية غير مقروءة يسهل عودتهما.

أساسيات الويب: البيانات الوصفية والزحف والترويسات#

هذه فحوص يستطيع أي عميل إجراءها على موقع منشور دون أي صلاحية، وتستحق القول صراحةً لأن إصلاحها رخيص وتركها مكلف.

  • البيانات الوصفية للصفحة هي الافتراضي الجاهز. فعنوان المستند في الإنتاج هو عنوان القالب الأصلي، ووصفه هو وصف القالب الأصلي. ولا يوجد رابط أساسي، ولا بدائل hreflang تقرن النسختين اللغويتين، ولا og:title ولا og:image لمعاينات الروابط، ولا رابط أيقونة موقع ولا بيان تطبيق ويب.
  • ثلاثة مسارات بنيوية تُرجع التطبيق بدل ما تَعِد به. فطلبات robots.txt وsitemap.xml وmanifest.webmanifest تُجيب كل منها بالرمز 200 مع هيكل التطبيق كاملًا بصيغة صفحة ويب — نحو 2.3 ميجابايت لكل منها، والمسار المطلوب منسوخ داخل خاصية lang في المستند. والسبب ضيق وقابل للإصلاح: أي مسار يحوي نقطة يتخطى وسيط اللغة ويسقط إلى التطبيق. أما المسارات المجهولة الخالية من النقطة فتتصرف تصرفًا صحيحًا وتُرجع 404 بحجم 7 كيلوبايت. والأثر العملي أن الزاحف الذي يطلب قواعد الزحف يتسلّم صفحة بحجم 2.3 ميجابايت ليست قواعد زحف.
  • ترويسات الأمان نحيفة على العميل وجزئية على الواجهة البرمجية. فالعميل يرسل HSTS — وهو افتراضي منصة الاستضافة — ولا شيء غيره: لا Content-Security-Policy ولا X-Frame-Options ولا X-Content-Type-Options ولا Referrer-Policy ولا Permissions-Policy، ويعلن إطار عمله في ترويسة x-powered-by. والواجهة البرمجية أفضل حالًا: ترسل X-Frame-Options: DENY وX-Content-Type-Options: nosniff وReferrer-Policy، وإن كانت بلا HSTS ولا Content-Security-Policy ولا Permissions-Policy.

وللمقارنة، وهو المعيار الذي نُلزم أنفسنا به (D-30): يقدّم البناء الحالي سياسة Content-Security-Policy مُنفَّذة برمز عشوائي جديد لكل طلب، مع HSTS وReferrer-Policy وPermissions-Policy وإزالة لافتة إطار العمل، على التطبيق والواجهة البرمجية معًا؛ وكل صفحة تحمل رابطها الأساسي، والنسختان مقترنتان ببدائل hreflang مع x-default، وكل لغة وصفحة تُخرج بطاقة معاينة خاصة بها، وrobots.txt وsitemap.xml مستندان مولَّدان حقيقيان.

ما نأخذه عنهم#

مسجَّل في القرار D-39. أربعة بنود تدخل البناء، واثنان قيد الدراسة.

مرجع أماكن مُطبَّع بالاسمين#

جداول الأماكن عندهم أوضح ما يستحق النقل. فنحن نخزّن المحافظة والمدينة نصًا حرًا في الملف الشخصي، وهذا يُنتج مشكلتين ظاهرتين: المدينة المُدخلة بالعربية تُعرض بالعربية على الموقع الإنجليزي، وترشيح الدليل مطابقة نصوص لما كُتب أيًا كان. ونموذجهم — الدولة والمحافظة والمدينة جداول، وكل صف يحمل اسمًا عربيًا واسمًا إنجليزيًا — يعالج الاثنتين دفعةً واحدة: تختار البوابة التهجئة المناسبة للغة القارئ، ويصير المرشِّح مطابقة هوية على مرجع بدل مقارنة نصية.

تصنيف تخصصات بدل النص الحر#

الحجة نفسها، درجةً أعلى. فجدولا التخصص والتخصص الفرعي عندهم كيانان حقيقيان يشير إليهما سجل عمل المهني. أما عندنا فنصٌّ حر معبورٌ إلى مجموعة ثابتة من أنواع الجلسات عبر خريطة تسميات مشتركة، وهو ما وثّقه القرار D-26 بوصفه الآلية التي تُسطِّح الحمولات — والجسر يعمل، لكنه حل التفافي لا نموذج: لا يستطيع التعبير عن تخصص فرعي، ولا يمكن توسيعه دون تعديل الشيفرة. وجدول تخصصات وتخصصات فرعية ثنائي اللغة، بأنواع الجلسات الأربعة الحالية صفوفًا أولى فيه، يستبدل بالجسر نموذجًا.

التحقق من التوافر قبل إرسال الاستمارة#

مسار التسجيل عندهم يستطيع أن يسأل هل البريد أو رقم التليفون مأخوذ قبل إرسال الحساب. ومسارنا يكتشف التكرار كما تفعل أغلب الأبنية: يُكمل المستخدم الاستمارة ويضغط الإرسال فيتلقى تعارضًا. وشكلهم أفضل لمعالج من أربع خطوات، إذ يُكتشف التكرار عند الخطوة التي أنشأته لا في نهاية الرحلة.

البحث والترتيب على القوائم المُصفَّحة#

القوائم التي تُصفَّح أصلًا في واجهتنا تكسب المعاملين العامّين الموجودين عندهم في كل مكان: بحثٌ حر search وحقل ترتيب ordering. وكلفتهما قليلة، ويتركّبان مع المرشِّحات القائمة، ويعنيان أن شاشة في بوابةٍ ما تستطيع إضافة أداة ترتيب دون تغيير في الواجهة البرمجية.

قيد الدراسة: سعر أول جلسة، والمصادقة برمز حامل#

بندان مسجَّلان غير مجدولين. فنموذجهم يضع سعر أول جلسة على سجل تخصص المهني، فيستطيع من يعمل في تخصصين أن يسعّرهما تسعيرًا مختلفًا — وهو جدير بالتنفيذ إن احتاجه المنتج يومًا، ورخيص الإضافة متى وُجد جدول التخصصات. ومصادقتهم برمز Bearer هي الملائمة طبيعيًا لعميل محمول؛ وجلسة الكوكيز عندنا هي الافتراضي الصحيح للمتصفح، فالسؤال هو هل نقدّم الاثنتين، لا أيهما نستبدل بالأخرى.

ما لا نأخذه عن قصد#

اتفاقان من اتفاقاتهم خياران معقولان يتعارضان مع قرارات اتُّخذت واختُبرت هنا. وتغيير المسار في أي منهما يكلّف أكثر مما يعيد.

غلاف تصفيح على كل قائمة#

تغلّف واجهتهم كل قائمة بغلاف يحمل عدادًا ورابطي التالي والسابق والصفوف ورسالة. وهو متسق، وللاتساق قيمة حقيقية. لكن عقدنا يمضي في الاتجاه الآخر عن قصد: تُرجع القائمة مصفوفة مسطّحة إلا إذا كانت الشاشة القارئة لها تُصفِّح فعلًا، فترجع حينها شكلًا مُصفَّحًا مُصرَّحًا به. والقرار D-34 هو السبب. فقد تركت مرحلة سابقة تسامحًا في العملاء — مساعدات تقبل المصفوفة أو الغلاف — وذلك التسامح أتاح للمسارات أن تنجرف صامتة: فالشاشة التي تتلقى الشكل الخطأ كانت تعرض فراغًا بدل أن تفشل. وإزالة التسامح هي ما كشف 32 مسار قراءة غير متطابق. وإعادة الغلاف الشامل تعيد معها الالتباس الذي حُصِّنت تلك العملاء ضده.

اسم عرض يُركَّب على الخادم#

تحمل حمولاتهم أسماء مركَّبة على الخادم. وكذلك كانت حمولاتنا، وقد أزال القرار D-36 كل واحدة منها. والسبب بسيط وليس مسألة ذوق: الخادم لا يعرف لغة القارئ. والاسم المُجمَّع في الواجهة البرمجية يثبّت الموقع الإنجليزي على أسماء عربية، والموقع العربي على أسماء إنجليزية، حسب اتجاه الاحتياط المكتوب. وحمولاتنا اليوم ترسل التهجئات الموجودة وتدع البوابة تختار حسب اللغة — وهي القاعدة نفسها التي جعلت النسخة الإنجليزية تُقرأ إنجليزيةً حقًا.

شيء ينشرونه ولا ننشره#

تنشر واجهتهم وصفها بصيغة OpenAPI على مسار عام، وفوقه واجهة Swagger UI. وهذه ميزة حقيقية تستحق القول صراحةً: أي مطوّر يتكامل مع تلك الواجهة يستطيع قراءة سطحها الدقيق في المتصفح، وتوليد عميل مُنمَّط منه، ومقارنة نسختين من العقد آليًا. وهو أيضًا ما جعل هذه المقارنة دقيقة بدل أن تكون تقريبية.

وواجهتنا تولّد الوصف نفسه، لكن واجهة التوثيق التفاعلية معطّلة في الإنتاج افتراضيًا — وهو خيار تحصين مقصود من القرار D-30، إذ إن وحدة تحكم تفاعلية فوق واجهة إنتاج سطحُ هجوم. والحل الصحيح ليس المفاضلة بين الاثنين: يُنشر مستند وصفٍ مُنقّى للقراءة فقط لمن يتكاملون، وتبقى الوحدة التفاعلية مطفأة في الإنتاج. وهذا مسجَّل في القرار D-39 بندًا للمتابعة.

وثمة تفصيل عرضٍ واحد يستحق أن يُنقل تحذيرًا لا ممارسة: الوصف المنشور عندهم ما زال يحمل العنوان والوصف ورقم الإصدار الافتراضية من المولّد. والمخطط مستند يقرؤه العملاء، فيجدر أن يُسمّى تسمية تليق به.

أين يضع هذا المشروع#

البناء السابق طبقة حسابات وملفات وبيانات مرجعية مُنمذَجة جيدًا، بموقف مصادقة سليم وواجهة برمجية تصف نفسها، يحملها عميل لم تمرّ عليه بعدُ مراجعة محتوى ولا بيانات وصفية ولا ثنائية لغة. والبناء الحالي منتج كامل — حجز، وجلسات، وخطط ومقاييس، ومدفوعات، وتقييمات، ومراكز وموارد بشرية، ووظائف، وإشعارات، وإدارة — بثنائية لغة وتحصين مكتملين ومحروسين باختبارات، لكن بنموذج بيانات أضعف في الموضعين اللذين هما أقوى ما عندهم بالضبط.

ولهذا تنتهي هذه الصفحة بقائمة تبنٍّ لا بحكم. فالأماكن والتخصصات تصير جداول مرجعية بالاسمين؛ والتسجيل يتحقق من التوافر قبل الإرسال؛ والقوائم المُصفَّحة تكسب البحث والترتيب؛ ويُنشر مخطط مُنقّى. وما عدا ذلك يبقى كما تقرّر، وأسبابه مسجّلة.