2.3

View in English

2.3 واجهات البرمجة وتصميم الواجهات

نظرة عامة والدافع

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

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

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

المبادئ الأساسية

  • صمم العقد أولًا. الواجهة قرار منتج متعمد، لا نتاجًا ثانويًا للتنفيذ.
  • حسّن من أجل تجربة المستهلك، لا راحتك الخاصة.
  • عامل التوافق الخلفي كوعد. التغييرات الكاسرة تحتاج إصدارًا جديدًا ومسار انتقال.
  • اجعل الشيء السهل صحيحًا: افتراضات معقولة، وأخطاء قابلة للتنبؤ، واصطلاحات متسقة.
  • صمم من أجل الفشل. الاتّسام بعدم التأثر بالتكرار (idempotency، حيث يكون لطلب مكرر التأثير نفسه لطلب واحد)، وإعادة المحاولة، والترقيم، وتحديد المعدل اهتمامات أساسية لا أفكار لاحقة.
  • اختر نمط البروتوكول ليناسب التفاعل، لا الموضة.
  • احكم واجهات البرمجة كمنتجات، بمالكين ودورات حياة وتوثيق.

التوصيات

اعمل أولًا بواجهة البرمجة ومدفوعًا بالعقد

حدد وراجع عقد واجهة البرمجة، بما يشمل مواردها وعملياتها ومخططاتها ودلالات أخطائها، قبل كتابة التنفيذ. استخدم مواصفة قابلة للقراءة الآلية، بحيث يستطيع العقد توليد التوثيق، وجذاذات (stubs) العميل والخادم، وخوادم محاكاة، والتحقق. الآن يستطيع المستهلكون بدء التكامل مقابل المحاكاة بينما تبني أنت، ويصبح العقد مصدر الحقيقة الوحيد الذي يختبر الطرفان مقابله.

اختر نمط التفاعل عمدًا

اختر بين REST (نقل الحالة التمثيلي)، وGraphQL، وgRPC، والرسائل الموجهة بالأحداث بناءً على التفاعل، لا التفضيل الشخصي. استخدم REST للواجهات الموجهة بالموارد، القابلة للتشغيل البيني على نطاق واسع، والقابلة للتخزين المؤقت. استخدم GraphQL عندما تحتاج عملاء متنوعون قراءات مرنة ومجمّعة عبر رسم بياني غني. استخدم gRPC للنداءات عالية الأداء وقوية التنميط بين الخدمات الداخلية. استخدم الرسائل الموجهة بالأحداث لتدفقات العمل غير المتزامنة وفصلها، ولنشر تغييرات الحالة. تستخدم أنظمة كبيرة كثيرة عدة أنماط في آن واحد، كل واحد حيث يناسب.

أصدِر وأهمِل بانضباط

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

اجعل دلالات الأخطاء متسقة وقابلة للقراءة الآلية

أعِد أخطاء منظمة وقابلة للتنبؤ: رموز مستقرة قابلة للقراءة الآلية، ورسائل قابلة للقراءة البشرية، وسياق كافٍ للتصرف، دون تسريب تفاصيل داخلية حساسة. استخدم دلالات الحالة نفسها عبر كل نقطة نهاية، بحيث يستطيع العملاء معالجة الأخطاء بشكل موحد. وثّق كل خطأ قد يواجهه المستهلك.

ابنِ الاتّسام بعدم التأثر بالتكرار والترقيم وتحديد المعدل

اجعل عمليات الكتابة آمنة لإعادة المحاولة بدعم مفاتيح الاتّسام بعدم التأثر بالتكرار، بحيث لا يؤدي عميل يعيد المحاولة بعد انتهاء مهلة إلى تحصيل مضاعف أو إنشاء مضاعف. رقّم كل نقطة نهاية قائمة منذ اليوم الأول، وفضّل الترقيم القائم على المؤشر (cursor) لمجموعات البيانات الكبيرة أو المتغيرة. طبّق وثبّت حدود المعدل، وأعِد حالة الحد الحالي للعملاء بحيث يستطيعون التراجع بسلاسة.

احكم واجهات البرمجة واستثمر في تجربة المطور

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

المفاضلات: الإيجابيات والسلبيات

النمطالأنسب لـالإيجابياتالسلبيات
REST / HTTPواجهات برمجة عامة موجهة بالمواردمنتشر، قابل للتخزين المؤقت، بسيط، قابل للتشغيل البينيجلب زائد أو ناقص؛ رحلات ذهاب وإياب كثيرة؛ عقود فضفاضة ما لم تُحدَّد
GraphQLقراءات مرنة لعملاء متنوعيناستعلامات يحددها العميل؛ نقطة نهاية واحدة؛ مخطط قويتعقيد التخزين المؤقت وتحديد المعدل؛ مخاطر تكلفة الاستعلام؛ تعقيد الخادم
gRPCنداءات داخلية عالية الأداءسريع، مضغوط، قوي التنميط، يدعم التدفقدعم متصفح ضعيف؛ أقل قابلية للقراءة البشرية؛ أدوات أثقل
الموجه بالأحداثتدفقات عمل غير متزامنة ومنفصلةاقتران فضفاض؛ قابل للتوسع؛ مرنأصعب في التفكير؛ اتساق نهائي؛ تعقيد تشغيلي

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

أسئلة للنقاش مع فريقك

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

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

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

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

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

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

المنظور القطاعي

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

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

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

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

أمثلة

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

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

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

حالة العمل: الدوافع والعائد على الاستثمار وتكلفة الملكية الإجمالية

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

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

الأنماط المضادة والمزالق

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

نموذج النضج

  • المستوى 1، الشروع: تظهر واجهات البرمجة من التنفيذ كنتاج ثانوي؛ لا توجد اصطلاحات مشتركة؛ تسرّب الواجهة بنية قاعدة البيانات الداخلية؛ التغييرات الكاسرة شائعة وغير معلنة وتُكتشف عندما يفشل تكامل مستهلك.
  • المستوى 2، التطوير: تتبع بعض الفرق اصطلاحات REST الأساسية، وتُصدر بشكل غير رسمي، وتكتب التوثيق يدويًا، لكن الممارسة غير متسقة عبر الفرق؛ يظهر الاتّسام بعدم التأثر بالتكرار والترقيم وتحديد المعدل على بعض نقاط النهاية دون أخرى؛ ما زال المستهلكون يتعلمون خصوصيات كل واجهة برمجة حالة بحالة.
  • المستوى 3، التوحيد القياسي: يُوثَّق التصميم أولًا بالعقد بمواصفات قابلة للقراءة الآلية ويُفرض على نطاق المؤسسة؛ تنطبق سياسة إهمال منشورة، ودلالات أخطاء متسقة، واتّسام إلزامي بعدم التأثر بالتكرار وترقيم بالمؤشر وتحديد معدل على كل نقطة نهاية جديدة؛ يبقي دليل أسلوب مشترك ومراجعة معايير واجهات البرمجة الواجهات متسقة عبر الفرق.
  • المستوى 4، الإدارة: تُقاس محفظة واجهات البرمجة وتُضبط مقابل خطوط أساس: تحكم فحوصات توافق خلفي آلية كل تغيير في التكامل المستمر، وتتبع الوقت حتى أول نداء ناجح، وحجم تذاكر الدعم لكل نقطة نهاية، وتواتر التغييرات الكاسرة، وعدد الإصدارات الحية، والاستخدام لكل نقطة نهاية بحيث تستند قرارات الإهمال والتصميم إلى الأدلة لا الرأي. كل واجهة برمجة منتج محكوم في فهرس بمالك مسمى، وتحفّز المقاييس إجراءً عندما تنحرف خدمة عن أهدافها.
  • المستوى 5، التنسيق الشامل: تُحسَّن استراتيجية واجهات البرمجة باستمرار وتُدمَج عبر المؤسسة؛ يعمل الفهرس والبوابة وقواعد الإصدار وبوابات التوافق كنظام واحد؛ تتقاعد المؤسسة بانتظام وتوحّد وتعيد تحديد نطاق الواجهات بناءً على التبني والتكلفة المقاسين؛ تتكيف معايير نمط التفاعل والإصدار مع تحول النظام البيئي والشركاء والتقنية، والتغييرات الكاسرة نادرة ومُدارة جيدًا.

أفكار للنقاش

  • كيف تقرر متى تكون واجهة برمجة داخلية مستقرة بما يكفي لنشرها خارجيًا؟
  • ما نافذة الدعم الصحيحة للإصدارات المهملة في سياقك، ومن يدفع ثمنها؟
  • أين ينبغي أن يحل GraphQL أو gRPC محل REST داخليًا، وأين سيضيفان تعقيدًا أكثر من القيمة؟
  • كيف تفرض اتساق واجهة البرمجة عبر فرق مستقلة كثيرة دون أن تصبح عنق زجاجة؟
  • كيف ينبغي أن تغيّر واجهات البرمجة القابلة للاستهلاك بالذكاء الاصطناعي وواجهات أدوات الوكيل اصطلاحات تصميمك؟
  • ما الفحوصات الآلية التي تستطيع التقاط تغييرات غير متوافقة خلفيًا قبل شحنها؟

النقاط الرئيسية

  • صمم العقد أولًا؛ واجهة البرمجة منتج ووعد طويل الأمد.
  • التوافق الخلفي يحمي المستهلكين؛ التغييرات الكاسرة تحتاج إصدارات جديدة ومسارات انتقال.
  • اختر REST أو GraphQL أو gRPC أو الأحداث وفق ملاءمة التفاعل، لا الموضة.
  • ابنِ الاتّسام بعدم التأثر بالتكرار والترقيم وتحديد المعدل والأخطاء المتسقة منذ اليوم الأول.
  • احكم واجهات البرمجة كمنتجات بمالكين وفهارس وتجربة مطور قوية.

المراجع والقراءات الإضافية

  • Roy Fielding, Architectural Styles and the Design of Network-based Software Architectures (dissertation)
  • Arnaud Lauret, The Design of Web APIs
  • Mike Amundsen, RESTful Web APIs and Design and Build Great Web APIs
  • Sam Newman, Building Microservices
  • OpenAPI Specification; JSON Schema (as reference standards)
  • Martin Kleppmann, Designing Data-Intensive Applications