هندسة المنصات وتجربة المطورين

منصات المطورين الداخلية

18 دقيقة الدرس 2 من 28

منصات المطورين الداخلية

منصة المطورين الداخلية (IDP) هي مجموعة منسّقة من الأدوات وسير العمل والتجريدات الذاتية التي تعرضها فرقة هندسة المنصة للمهندسين العاملين على المنتجات. هي ليست بوابة ويب، ولا ويكي، ولا أداة متكاملة ضخمة — بل هي طبقة تكامل ذات توجه واضح تقع بين البنية التحتية الخام (Kubernetes وTerraform وVault وDatadog) والسطح المعرفي الذي يُفترض أن يتعامل معه المطوّر فعلياً. مكدّس Borg/Monarch الداخلي في Google ومبدأ Paved Road في Netflix ومنصة Spotify القائمة على Backstage تمثّل النماذج المرجعية الأكثر احترافاً. كل منظمة هندسية كبيرة الحجم تقاربت نحو هذا النمط، لأن البديل — كل فريق يدير سطح بنيته التحتية بنفسه — لا يتوسّع.

تشريح منصة المطورين الداخلية

تتألف منصة المطورين الداخلية الجاهزة للإنتاج من ثلاث طبقات متشابكة:

  1. المسارات الذهبية (Golden Paths) — خطوط توصيل برمجي وتهيئات تشغيلية مُعدَّة مسبقاً ذات توجه واضح. يتضمّن المسار الذهبي لخدمة Python المصغرة: هيكل المشروع (قالب Cookiecutter)، وخط أنابيب CI، ونشر Kubernetes مع HPA وPDB، وmTLS لشبكة الخدمات، وسياسة RBAC، وحقن Datadog APM. يستنسخ المطوّر قالباً واحداً ويحصل على بنية تحتية جاهزة للإنتاج منذ اليوم الأول.
  2. كتالوج الخدمة الذاتية — الآلية التي تطلب بها الفرق وتهيئ موارد المنصة (قواعد البيانات، وقوائم الانتظار، وتخزين الكائنات، وإدخالات DNS، ومساحات أسماء علامات الميزات) دون الحاجة لفتح تذاكر دعم. مدعوم بإجراءات Backstage scaffolder أو Crossplane Compositions أو طلبات سحب GitOps تُدمج تلقائياً عبر محركات السياسات.
  3. الطرق المُمهَّدة (Paved Roads) — حواجز الحماية التشغيلية: صور حاويات أساسية معتمدة مسبقاً، وحصص موارد مُطبَّقة، وسياسات قبول OPA/Kyverno، وإصدارات Helm chart مُتحقَّق منها، وخط أنابيب المراقبة الذي ترثه كل حمل عمل تلقائياً. الفريق الذي يلتزم بالطريق المُمهَّد لا يحتاج أبداً لتهيئة Fluentd أو شهادات TLS أو PodDisruptionBudgets يدوياً.
Internal Developer Platform layers Developer Zone Service Scaffold Backstage Portal Self-Service Catalog CLI / API Surface IDP Core (Platform Engineering Layer) Golden Paths Templates & pipelines Paved Roads Guardrails & policies Self-Service Infra provisioning Score Cards DX metrics Infrastructure Plane Kubernetes Terraform / TF Cloud Vault / SOPS Datadog / OTel ArgoCD / Flux Cloud / Physical Infrastructure (AWS, GCP, Azure, On-Prem)
نموذج طبقات منصة المطورين الداخلية: يتفاعل المطوّرون فقط مع سطح المنصة؛ والبنية التحتية الخام مُجرَّدة تماماً.

المسارات الذهبية في التطبيق العملي

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

يستخدم التطبيق المعياري اليوم Backstage Software Templates (المجدوِل). يُعرِّف ملف YAML للقالب مدخلات المستخدم، والمستودع المصدري للاستنساخ منه، وتسلسل الإجراءات (fetch:template وpublish:github وcatalog:register وtrigger:ci):

# backstage/templates/python-microservice/template.yaml apiVersion: scaffolder.backstage.io/v1beta3 kind: Template metadata: name: python-microservice title: Python Microservice (Golden Path) description: Production-ready FastAPI service with CI, k8s, mTLS, and observability. tags: [python, microservice, recommended] spec: owner: platform-team type: service parameters: - title: Service Details required: [name, owner, environment] properties: name: type: string pattern: '^[a-z][a-z0-9-]{2,40}$' owner: type: string ui:field: OwnerPicker environment: type: string enum: [prod, staging, sandbox] steps: - id: fetch-template name: Fetch skeleton action: fetch:template input: url: ./skeleton values: name: ${{ parameters.name }} owner: ${{ parameters.owner }} - id: publish name: Publish to GitHub action: publish:github input: repoUrl: github.com?owner=acme&repo=${{ parameters.name }} defaultBranch: main repoVisibility: internal - id: register name: Register in catalog action: catalog:register input: repoContentsUrl: ${{ steps.publish.output.repoContentsUrl }} catalogInfoPath: /catalog-info.yaml - id: trigger-ci name: Trigger bootstrap pipeline action: http:backstage:request input: method: POST path: /api/proxy/tekton/trigger body: serviceName: ${{ parameters.name }}
احتفظ بـسجل قوالب في كتالوج Backstage. صنّف القوالب بوصفها موصى بها أو مُهمَلة أو تجريبية. شغِّل فحوصات التوافق الآلية (OPA مع GitHub Actions) على المخرجات المُولَّدة بحيث يكتشف تحديث القالب فوراً الانجرافات في الخدمات القائمة عبر عمليات الفحص الدوري للسياسات.

البنية التحتية الذاتية

الخدمة الذاتية تعني أن المطوّرين يستأمنون ما يحتاجونه — مثيل PostgreSQL RDS، أو حاوية S3، أو عنقود Redis — دون فتح تذاكر لفريق العمليات. نمط التطبيق الرائد هو Crossplane Compositions: موارد Kubernetes مخصصة تُغلِّف موارد مزوّد السحابة وتُطبِّق معايير المنصة (التشفير أثناء السكون، وجداول النسخ الاحتياطي، والشبكات الخاصة حصراً). يُطبِّق المطوّر كائن YAML؛ فيُوفِّق Crossplane ذلك تلقائياً في موارد AWS/GCP فعلية.

# Developer applies this (simple, opinionated) apiVersion: platform.acme.io/v1alpha1 kind: PostgresDatabase metadata: name: orders-db namespace: orders-team labels: app: orders-service cost-center: commerce spec: size: medium # maps to db.t3.large; enforced by Composition environment: prod owner: orders-team backupRetentionDays: 30 --- # Platform Composition enforces: private subnet, encrypted, backup window, tagging # Developers never write aws_db_instance Terraform — the Composition handles it. # Status surface: # kubectl get postgresdb orders-db -o jsonpath='{.status.atProvider.endpoint}'

البديل للفرق العميقة أصلاً في Terraform هو Terraform Cloud workspaces المُشغَّلة عبر API. يدمج المطوّر طلب سحب في مستودع infra-requests؛ فيستدعي سير عمل GitHub Actions واجهة برمجة TFC لتطبيق مساحة عمل مُحدَّدة لحساب AWS الخاص بذلك الفريق. تمتلك فرقة المنصة الوحدة؛ أما المطوّر فيُقدِّم قيم المتغيرات فقط.

الخدمة الذاتية لا تتوسّع إلا إذا كانت الوحدات الأساسية مُختبَرة بعمق (Terratest وCheckov وtfsec) وذات توجه واضح. بوابة خدمة ذاتية غير محكومة حيث يكتب المطوّرون Terraform خاماً أسوأ من نظام التذاكر — تتراكم تهيئات متفرّقة بسرعة استقلالية كل فريق.

الطرق المُمهَّدة والحواجز الواقية

الطريق المُمهَّد هو ما تحصل عليه الخدمة مجاناً بالبقاء على المسار الذهبي. تحديداً: يمنع خطاف قبول Kubernetes (Kyverno) نشر صور أساسية غير معتمدة؛ وتحقن شبكة Linkerd أو Istio بيانات mTLS تلقائياً؛ وتُتحقَّق من طلبات الموارد وحدودها؛ ويرفض OPA أي حاوية تعمل بصلاحية root أو بلا مسبار استعداد. المراقبة ليست اختيارية — كل خدمة في الشبكة تُصدر مقاييس RED وآثاراً موزّعة إلى Datadog أو Tempo دون سطر واحد من كود الأدوات.

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

حلقة التغذية الراجعة الداخلية

منصة مطورين لا يتبنّاها أحد هي بنية تحتية مسرحية. عامل المنصة كمنتج حقيقي له مستخدمون حقيقيون (المطوّرون الداخليون). رصِّد مساراتك الذهبية: تتبّع وقت أول نشر، وعدد استنساخات القوالب، ومعدلات انتهاكات السياسة، وزمن الانتظار لطلبات الخدمة الذاتية. نتناول مقاييس تجربة المطوّر بعمق في الدرس السادس؛ النقطة المحورية هنا هي أن المنصة يجب أن تعرض هذه المقاييس لفريقها على لوحة قيادة حية. برنامج مقاييس DORA الخاص بـ Google نشأ بالضبط بهذه الطريقة — قياس أثر تحسينات المنصة الداخلية على تواتر النشر ومعدل فشل التغيير.

نظِّم يوم عرض المنصة ربع سنوي: تعرض فرق المنتجات كيف استخدمت منصة المطورين لتسليم أسرع. لا شيء يدفع التبنّي مثل الرؤية بين الأقران. اقرنه بخارطة طريق عامة في Backstage نفسه — استخدم صفحة TechDocs تُدرج المسارات الذهبية القادمة حتى تعرف الفرق ما تنتظره مقابل ما تبنيه بنفسها.