دوازده فرمان برنامه‌سازی (بخش اول)

نوشته اصلی از Adam Wiggins


مقدمه

در عصر مدرن، به طور کلی هر نرم‌افزار به صورت یک خدمت - تحت عنوان برنامه‌ی وب (web app) یا نرم‌افزار اجاره‌ای (نرم‌افزار به عنوان یک خدمت یا software-as-a-service) - ایجاد و عرضه می‌گردد. برنامه‌ی دوازده عاملی (twelve-factor app) روشی است برای ساخت برنامه‌هایی برای اجاره که:

  • برای به حداقل رساندن زمان و هزینه‌ی پیوستن برنامه‌نویس‌های جدید به پروژه، از قالب‌هایی اعلانی (declarative) در خودکار ساختن راه‌اندازی و تنظیمات برنامه استفاده می‌کنند.
  • برای به حداکثر رساندن امکان انتقال (portability) بین محیط‌های اجرا، قراردادی روشن و شفاف با سیستم عامل میزبان دارند.
  • با استقرار (deployment) روی بستر‌های ابری (cloud platform) امروزی سازگاری و تناسب دارند، در نتیجه نیاز به مدیریت سرور و سیستم‌ها را مرتفع می‌سازند.
  • تفاوت و واگرایی بین محیط‌های توسعه (development) و محصول نهایی (production) را به حداقل می‌رسانند، در نتیجه امکان استقرار مداوم (continuous deployment) برای دستیابی به حداکثر چابکی (agility) را فراهم می‌کنند.
  • می‌توانند بدون تغییر چندانی در تجهیزات، معماری، یا شیوه‌های توسعه گسترش یابند و در مقیاسی بزرگتر فعالیت کنند (scale out).

اصول دوازده عاملی را می‌توان برای هر برنامه‌ای، فارغ از اینکه با چه زبانی نوشته شده یا از چه ترکیبی از خدمات زیرساختی و حمایتی (backing service) - از قبیل پایگاه داده، صف، کش حافظه و غیره - استفاده می‌کند، به کار برد.

پیش‌زمینه

دست‌اندرکاران این سند مستقیما در توسعه و استقرار صدها برنامه نقش داشته‌اند، و از طریق کارهای نویسنده در بستر Heroku شاهد توسعه، عملکرد، و رشد صدها هزار برنامه بوده‌اند.

این سند همه‌ی تجربیات و مشاهدات ما در گستره‌ی عظیمی از برنامه‌های اجاره‌ای موجود را در هم می‌آمیزد. حاصل آن ادغام روش‌های ایده‌آل توسعه‌ی برنامه، با توجه ویژه به پویایی رشد طبیعی برنامه به مرور زمان، پویایی همکاری میان توسعه‌دهندگان برنامه، و جلوگیری از فرسودگی نرم‌افزار و هزینه‌های آن، می‌باشد.

هدف و انگیزه‌ی ما این است که نسبت به برخی مشکلات سیستمی که در توسعه‌ی برنامه‌های مدرن مشاهده کرده‌ایم هشدار و آگاهی دهیم، واژه‌نامه‌ای مشترک برای بحث در مورد این مشکلات ارائه‌ کنیم، و مجموعه‌ای گسترده از راهکارهای مفهومی برای حل آن‌ها را به همراه واژگان مرتبط پیشنهاد کنیم. قالب این اصول از کتاب‌های مارتین فاولر (Martin Fowler) - الگوهای معماری برنامه‌های سازمانی (Patterns of Enterprise Application Architecture) و بازآرایی (Refactoring) - الهام گرفته شده است.

مخاطب این سند چه کسانی هستند؟

هر برنامه‌نویسی که برنامه‌هایی می‌سازد که به عنوان یک خدمت اجرا می‌شوند. مهندسان عملیاتی که چنین برنامه‌هایی را مستقر یا مدیریت می‌کنند.


دوازده عامل

1. پایگاه کد - Codebase

برای همه‌ی استقرارهای مختلف از یک منبع کد با سیستم کنترل نسخه و پیگیری تغییرات استفاده کنید.

2. وابستگی‌ها - Dependencies

وابستگی‌ها را صریحا اعلان و از هم تفکیک کنید.

3. پیکره‌بندی - Config

تنظیمات و پیکره‌بندی را در محیط استقرار ذخیره کنید.

4. خدمات زیرساختی - Backing Services

خدمات زیرساختی و پشتیبان را به عنوان منابع پیوسته در نظر بگیرید.

5. ساخت، عرضه، اجرا - Build, Release, Run

گام‌های ساخت و اجرا را کاملا از هم جدا کنید.

6. فرآیندها - Processes

برنامه را به صورت یک یا چند فرآیند بدون حالت (stateless) اجرا کنید.

7. اتصال به درگاه - Port Binding

خدمات را به درگاه‌ها متصل و عرضه کنید.

8. همروندی - Concurrency

افزایش منابع (scale up) را از طریق مدل فرآیند اعمال کنید.

9. دسترسی پذیری - Disposability

با شروع سریع به کار و به شکلی مطلوب از کار ایستادن، توانمندی را به حداکثر برسانید.

10. توازن توسعه/محصول - Dev/Prod Parity

محیط‌های توسعه (development)، نمایش (staging) و محصول نهایی (production) تا جای ممکن مشابه نگه دارید.

11. سوابق - Logs

سوابق را به صورت جریانی از رویدادها در نظر بگیرید.

12. فرآیندهای مدیر - Admin Processes

وظایف مدیریتی را به صورت فرآیندهایی یک‌باره اجرا کنید.