كنا نغرق في بحر من ‘على جهازي تعمل!’: كيف أنقذتنا حاويات التطوير (Dev Containers)

يا جماعة الخير، السلام عليكم ورحمة الله.

اسمحوا لي أبدأ معكم بقصة قصيرة من أيام زمان، قبل ما يصير الشعر الأبيض هذا علامة خبرة بدل ما يكون علامة وجع راس من البرمجة. كنا في نص مشروع مهم، فريق صغير من ثلاث مبرمجين، أنا على نظام Linux، وزميلي “خالد” على Mac، وزميلتنا “سارة” على Windows. المشروع كان ماشي زي الحلاوة، لحد ما قرب موعد التسليم.

فجأة، ظهر “بَغ” (Bug) غريب، كان يكسر جزء أساسي في التطبيق. المشكلة؟ البَغ هذا ما كان يظهر إلا على جهاز سارة! أنا وخالد نجرب الكود عنا، كل شي تمام وشغال 100%. قضينا يومين كاملين، مش بنصلح في الكود، لأ… بنصلح في “بيئة العمل” على جهازها. مرة نكتشف إنه إصدار مكتبة معينة عندها أقدم بشحطة، ومرة نكتشف إنه متغير بيئة (environment variable) إله اسم مختلف، ومرة… والله يا جماعة قائمة ما بتخلص من الفروقات اللي زي هاي.

في نهاية اليوم الثاني، وإحنا محبطين وتعبانين، صرخت سارة مازحة: “خلص! رح أسلمكم جهازي تشتغلوا عليه!”. كلنا ضحكنا، بس في قلبي قلت: “يا ريت لو في طريقة نسلم فيها بيئة العمل كلها مع الكود”. وقتها، ما كنت أعرف إنه هالأمنية راح تصير حقيقة، وراح يكون اسمها Dev Containers.

ما هي مشكلة “على جهازي تعمل!” بالضبط؟

عبارة “عندي شغال” أو “على جهازي تعمل!” هي أشهر كذبة في عالم تطوير البرمجيات، بس هي مش كذبة عن قصد. هي عرض لمشكلة أعمق بكثير: عدم تطابق بيئات التطوير (Inconsistent Development Environments).

بيئة التطوير هي كل شي بيحتاجه الكود تبعك عشان يشتغل على جهازك:

  • نظام التشغيل (Windows, macOS, Linux).
  • إصدار لغة البرمجة (Python 3.8 vs 3.9).
  • المكتبات والحزم (Dependencies) وإصداراتها.
  • قواعد البيانات والخدمات الخارجية (PostgreSQL, Redis).
  • إعدادات المحرر (VS Code extensions, settings).
  • متغيرات البيئة (Environment Variables).

أي اختلاف بسيط في أي واحد من هدول بين جهازك وجهاز زميلك، ممكن يسبب ساعات وأيام من التنبيش والبحث عن مشاكل ما الها علاقة بمنطق الكود نفسه. هذا وجع راس حقيقي وإهدار للوقت والمال.

المحاولات القديمة: من الـ README إلى الآلات الافتراضية

طبعاً إحنا كبشر، حاولنا نحل هالمشكلة من زمان بطرق مختلفة:

  1. ملف README.md الأسطوري: كلنا كتبنا ملفات README فيها 100 خطوة عشان زميلك الجديد يقدر يشغل المشروع. “أولاً، نزل بايثون إصدار 3.7.4، ثانياً، لا تنسى تثبيت هذه الأدوات… عاشراً، ادعي إنه كل شي يشتغل!”. طبعاً هاي الطريقة أغلب الوقت بتفشل لأنها بتعتمد على البشر، والبشر بنسوا وبغلطوا.
  2. الآلات الافتراضية (Virtual Machines): حل أفضل بكثير. كنا نجهز آلة افتراضية (VM) عليها كل شي، ونشاركها مع الفريق. المشكلة؟ الآلات الافتراضية ثقيلة على الجهاز، بتستهلك موارد (RAM, CPU) بشكل كبير، وبطيئة في التشغيل والمشاركة. كل مشروع بده VM؟ يا لطيف! الجهاز بصير زي السلحفاة.

كان لازم يكون في حل أفضل… حل يجمع بين عزل الآلات الافتراضية وخفة الملفات النصية. وهون بيجي دور البطل: Docker.

حاويات Docker: حجر الأساس للحل

ما راح أدخل في تفاصيل Docker المعقدة، بس ببساطة تخيل Docker كطريقة إنك “تغلّف” تطبيقك مع كل مكتباته وكل شي بيحتاجه عشان يشتغل في صندوق معزول وخفيف اسمه حاوية (Container).

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

لكن… كيف بنستفيد من هالقوة في عملية التطوير اليومية؟ هل معقول كل ما أعدل حرف في الكود أعمل build لصورة Docker جديدة؟ هون بيجي دور بطل قصتنا الحقيقي.

حاويات التطوير (Dev Containers): الجنة الموعودة للمطورين!

الـ Dev Container هي مش أداة جديدة منفصلة، هي عبارة عن معيار (specification) وتطبيق عملي رائع (خصوصاً في محرر VS Code) بيسمحلك تستخدم حاوية Docker كبيئة تطوير متكاملة ومعزولة لمشروعك.

خليني أبسطها:

  1. بتفتح مشروعك في VS Code.
  2. بتحكي لـ VS Code: “الله يرضى عليك، افتحلي هالمشروع جوا حاوية Docker معرفة مسبقاً”.
  3. بيقوم VS Code بتشغيل الحاوية، وبيربط حاله فيها.

النتيجة؟ محرر VS Code شغال على جهازك (Host)، لكن كل شي ثاني – الطرفية (Terminal)، لغة البرمجة، الأدوات، الامتدادات (Extensions)، وحتى الـ Debugger – كله شغال جوا الحاوية المعزولة والموحدة. كأنك بتبرمج على جهاز “مثالي” تم إعداده خصيصاً لهذا المشروع.

كيف تعمل هذه الأعجوبة؟ (تشريح ملفات الـ Dev Container)

السحر كله موجود في مجلد صغير بتضيفه لمشروعك اسمه .devcontainer. هذا المجلد عادة بيحتوي على ملفين أساسيين:

  1. devcontainer.json: ملف الإعدادات الرئيسي. هون بتخبر VS Code بكل شي عن بيئتك.
  2. Dockerfile (اختياري لكن مهم): ملف التعليمات اللي بيستخدمه Docker عشان يبني صورتك المخصصة (Custom Image) لو احتجتها.

مثال عملي: مشروع Node.js مع Dev Container

لنفترض عنا مشروع Node.js بسيط. بدل ما أطلب من كل واحد في الفريق ينزل Node.js و npm و yarn و…و…، بكل بساطة بضيف مجلد .devcontainer بالملفات التالية:

ملف .devcontainer/devcontainer.json:


{
  "name": "My Node.js Project",

  // استخدم صورة دوكر جاهزة تحتوي على Node.js و TypeScript
  "image": "mcr.microsoft.com/devcontainers/typescript-node:18-bullseye",

  // الخصائص اللي بدك تعدلها في VS Code جوا الحاوية
  "customizations": {
    "vscode": {
      "settings": {
        "editor.formatOnSave": true
      },
      "extensions": [
        "dbaeumer.vscode-eslint",
        "esbenp.prettier-vscode"
      ]
    }
  },

  // إعادة توجيه المنفذ 3000 من الحاوية إلى جهازك المحلي
  "forwardPorts": [3000],

  // أمر يتم تشغيله بعد إنشاء الحاوية (مثلاً، لتثبيت الحزم)
  "postCreateCommand": "npm install"
}

شرح بسيط للكود أعلاه:

  • name: اسم بيئة التطوير اللي راح يظهر في VS Code.
  • image: أهم خاصية. هون بنحدد صورة Docker اللي بدنا نستخدمها. مايكروسوفت بتوفر صور جاهزة ممتازة لمعظم لغات البرمجة.
  • customizations: كنز حقيقي! هون بتقدر تفرض إعدادات وامتدادات معينة لـ VS Code على كل الفريق. يعني ما في حدا ينسى يركب الـ Linter أو الـ Formatter.
  • forwardPorts: لو تطبيقك بيشتغل على منفذ (port) معين، هاي الخاصية بتخليه متاح على localhost:3000 في جهازك كأن التطبيق شغال عندك مباشرة.
  • postCreateCommand: أمر سحري بيشتغل تلقائياً بعد ما الحاوية تجهز. هون حطينا npm install عشان نضمن إنه كل الحزم والمكتبات يتم تثبيتها بدون أي تدخل يدوي.

الآن، أي مطور جديد بينضم للفريق، كل اللي عليه يعمله هو:

  1. تثبيت VS Code و Docker Desktop.
  2. تثبيت امتداد Dev Containers في VS Code.
  3. يعمل git clone للمشروع.
  4. يفتح المشروع في VS Code، راح يطلعله إشعار صغير تحت على اليمين يسأله: “Folder contains a Dev Container configuration file. Reopen in Container?”.
  5. يضغط على الزر… ويشرب فنجان قهوة. بعد دقيقتين، بيكون عنده بيئة تطوير كاملة، موحدة، وجاهزة للعمل 100%.

وداعاً لعبارة “على جهازي تعمل!”. أهلاً بعبارة “البيئة معرفة في الكود، وهي تعمل على كل الأجهزة!”.

نصائح أبو عمر العملية (من خبرة السنين)

هذا الحل غيّر حياتي المهنية، وخلال استخدامي إله لسنوات، جمعت شوية نصائح بحب أشاركها معكم:

  • ابدأ بالصور الجاهزة: مايكروسوفت وفريق VS Code عندهم مستودع ضخم من الصور الجاهزة (Pre-built Images) لبايثون، جافا، Node، Go، وغيرها. ابدأ منها دائماً، بتوفر عليك وقت وجهد كبير.
  • استغل الـ postCreateCommand: هذا الأمر هو صديقك المفضل. استخدمه لتشغيل أي شي بيحتاجه مشروعك بعد الإعداد: تثبيت الحزم، تهيئة قاعدة البيانات، أي سكريبت تجهيزي.
  • استخدم “Features”: الـ Dev Containers فيها ميزة اسمها “Features”. هي طريقة سهلة لإضافة أدوات إضافية (مثل AWS CLI, Terraform, Docker-in-Docker) لحاويتك بدون ما تعدل على الـ Dockerfile. سهلة جداً وقوية.
  • لا تخف من تخصيص الـ Dockerfile: لو احتجت تثبت أداة معينة على مستوى نظام التشغيل (مثلاً ffmpeg)، لا تتردد في استخدام Dockerfile مخصص. الـ devcontainer.json بيقدر يستخدم Dockerfile بدل صورة جاهزة.
  • حافظ على نظافة جهازك: أجمل شعور إنه جهازي الأساسي (Host machine) بضل نظيف. ما عليه 10 إصدارات من Node.js أو 3 أنواع من قواعد البيانات. كل مشروع معزول في حاويته، وجهازي بضل سريع ومستقر.

الخلاصة يا جماعة الخير ✅

الاستثمار في تعلم وتطبيق حاويات التطوير (Dev Containers) هو واحد من أفضل القرارات اللي ممكن ياخدها أي فريق برمجي اليوم. هو مش مجرد أداة جديدة، هو نقلة نوعية في طريقة التفكير والعمل.

بتحل مشكلة “على جهازي تعمل!” بشكل جذري، بتسرّع عملية انضمام المطورين الجدد من أيام إلى دقائق، بتضمن توحيد الأدوات والإعدادات بين كل أعضاء الفريق، وبتحافظ على أجهزتنا نظيفة وسريعة.

إذا كنت لسا بتعاني من جحيم بيئات العمل غير المتطابقة، نصيحتي لك: جرب الـ Dev Containers اليوم. راح تدعيلي. 🚀

أبو عمر

سجل دخولك لعمل نقاش تفاعلي

كافة المحادثات خاصة ولا يتم عرضها على الموقع نهائياً

آراء من النقاشات

لا توجد آراء منشورة بعد. كن أول من يشارك رأيه!

آخر المدونات

ادارة الفرق والتنمية البشرية

كان الخطأ يعني الإعدام: كيف أنقذتنا ‘مراجعات ما بعد الحادثة بلا لوم’ من ثقافة الخوف؟

أتذكر جيداً ذلك اليوم الذي تسبب فيه خطأ برمجي بسيط في شلل نظامنا بالكامل، وكيف كانت ثقافة "صيد المخطئين" هي السائدة. في هذه المقالة، أسرد...

3 يونيو، 2026 قراءة المزيد
تجربة المستخدم والابداع البصري

كان المستخدمون يقاتلون واجهاتنا: كيف أنقذتنا ‘قوانين تجربة المستخدم’ من جحيم التصميم غير البديهي؟

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

2 يونيو، 2026 قراءة المزيد
البودكاست