لماذا يجب على كل Backend Engineer فهم 12-Factor App؟
في عالم البرمجة، أغلب المطورين يقضون وقتًا كبيرًا في كتابة الكود،
لكن المشاكل الحقيقية غالبًا لا تظهر أثناء التطوير…
بل تظهر بعد النشر في بيئة الإنتاج (Production).
مشاكل مثل:
- التطبيق شغال عندك ومش شغال على السيرفر
- إعدادات مختلفة بين dev و prod
- صعوبة في التوسّع (scaling)
- أعطال مفاجئة وقت الضغط
هنا بالضبط يظهر دور 12-Factor App.
ما هو 12-Factor App؟
12-Factor App هو مجموعة مبادئ (Best Practices) تم وضعها لبناء تطبيقات حديثة:
- قابلة للتشغيل على السحابة
- سهلة النشر
- سهلة التوسّع
- وأسهل في الصيانة
المفهوم ظهر من فريق Heroku،
لكن مع الوقت بقى Standard تفكير لأي تطبيق Backend حديث.
المهم هنا:
12-Factor App مش Framework
ومش مرتبط بلغة معينة
لكن طريقة تفكير في بناء التطبيقات.
لماذا 12-Factor App مهم لأي Backend Engineer؟
لأن Backend Engineer مش بس بيكتب API
هو مسؤول عن:
- استقرار التطبيق
- سهولة النشر
- التعامل مع البيئات المختلفة
- مشاكل الإنتاج
فهم 12-Factor App بيخليك:
- تفكر من البداية بعقلية Production
- تقلل المشاكل بعد النشر
- تكتب كود يعيش ويكبر
شرح أهم مبادئ 12-Factor App (بأسلوب عملي)
1️⃣ Codebase – قاعدة كود واحدة
التطبيق لازم يكون له Repository واحد
ونفس الكود يشتغل في:
- development
- staging
- production
الاختلاف يكون في الإعدادات فقط، مش في الكود.
2️⃣ Dependencies – الاعتماديات واضحة
كل المكتبات اللي التطبيق محتاجها لازم تكون:
- مذكورة بوضوح
- Managed عن طريق أداة رسمية
في Java مثلًا:
- Maven
- Gradle
ده يمنع مشاكل “شغال عندي بس”.
3️⃣ Config – الإعدادات خارج الكود
أي حاجة بتختلف من بيئة للتانية:
- DB URL
- Username / Password
- API Keys
لازم تكون:
- Environment Variables
- أو Config Server
مش مكتوبة داخل الكود.
4️⃣ Backing Services – الخدمات الخارجية موارد قابلة للتبديل
قاعدة البيانات، الكاش، الرسائل…
كلها لازم تتعامل معاها كخدمات خارجية.
يعني تقدر تغيّر:
- Database
- Cache Provider
من غير ما تغيّر منطق التطبيق.
5️⃣ Build / Release / Run – مراحل واضحة
التطبيق يمر بثلاث مراحل:
- Build → تجميع الكود
- Release → ربط الإعدادات
- Run → التشغيل
ده أساس أي CI/CD Pipeline محترم.
6️⃣ Processes – التطبيق Stateless
التطبيق ما يعتمدش على:
- Session محفوظة على السيرفر
- ملفات محلية
أي حالة (state) تتحفظ في:
- Database
- Cache (Redis مثلًا)
وده شرط أساسي للتوسّع الأفقي.
7️⃣ Port Binding – التطبيق يشغّل نفسه
التطبيق لازم:
- يشغّل السيرفر بنفسه
- ويستمع على Port
زي Spring Boot أو Node.js
مش محتاج Web Server خارجي.
8️⃣ Concurrency – قابلية التوسّع
التطبيق يتوسّع عن طريق:
- زيادة عدد النسخ
- أو زيادة عدد الـ processes
مش عن طريق كود معقّد.
9️⃣ Disposability – إقلاع وإيقاف سريع
التطبيق لازم:
- يبدأ بسرعة
- يقفل بسرعة وبشكل آمن
ده مهم جدًا في:
- Docker
- Kubernetes
- Auto-scaling
🔟 Dev / Prod Parity – تقارب البيئات
كل ما الفرق بين dev و prod يقل:
- المشاكل تقل
- المفاجآت تقل
استخدم نفس:
- Database type
- Config style
- أدوات التشغيل
1️⃣1️⃣ Logs – السجلات كتدفّق بيانات
التطبيق يطبع logs على:
- stdout
وتسيب:
- ELK
- CloudWatch
- أي log system
تتعامل مع التخزين والتحليل.
1️⃣2️⃣ Admin Processes – مهام الإدارة منفصلة
زي:
- Database migrations
- Cleanup jobs
تتشغّل بنفس الكود ونفس الإعدادات
لكن كأوامر مستقلة.
12-Factor App و Spring Boot
Spring Boot بطبيعته قريب جدًا من 12-Factor App:
- Externalized Configuration
- Embedded Server
- Stateless APIs
- Easy CI/CD
لكن مش تلقائي
المطور هو اللي لازم يلتزم بالمبادئ.
الخلاصة
12-Factor App:
- مش ترند
- مش رفاهية
- مش حاجة اختيارية
هو أساس تفكير لأي Backend Engineer عايز:
- تطبيق مستقر
- نشر سهل
- مشاكل أقل في الإنتاج
📌 الكود الجيد مهم…
لكن التطبيق اللي يعيش في Production أهم.