اینم یه تجربه پراکنده دیگه
این مطلب رو من بخاطر اینکه این اصول در طراحی نرمافزارهایی که من تاکنون دیدم رعایت نشده مینویسم پس امیدوارم اول خودم و شاید هم دیگران بهش عمل کنیم.
در مجموع این اصول برای طراحی «نرمافزار به عنوان سرویس» مورد استفاده قرار میگیره که:
- از فرمتهای declarative برای روند اتوماتیک نصب استفاده میکند به منظور کاهش زمان و هزینه لازم برای پیوستن توسعه دهندگان جدید
- دارای ارتباط دقیق و تمیز با سیستم عامل به منظور بیشینه کردن قابلیت حمل میان محیطهای اجرایی مختلف
- برای اجرا روی سیستمهای مبتنی بر محاسبات ابری مناسب هستند.
- حداقل تفاوت میان محیط عملیاتی و محیط آزمایش را دارا هستند
- قابلیت افزایش کارایی را بدون تغییر در ابزار، ساختار و نحوه اجرا را دارا هستند
این دوازده اصل از این قرارند
- داشتن یک منبع کد و چندین deploy: هر نرم افزار در یک منبع کد همانند git، mercurial و subversion وجود دارد و یک ارتباط یک به یک میان نرمافزارهای و منبع کد وجود دارد. بدین منظور که اگر چند منبع کد وجود دارد، اینها هریک یک سیستم نرمافزاری مجزا هستند
- تمامی وابستگیهای نرم افزار بصورت صریحی در تعریف نرمافزار وجود داشته و یک نرمافزار هیچگاه به دنبال نیازمندیهای اجرایی خود بصورت global در سیستم عامل اجرایی خود نیست
- تمامی اطلاعات مرتبط با پیکربندی در متغیرهای محیطی ذخیره می شوند از قبیل نحوه ارتباط با پایگاه داده، یوزر نیم و پسورد ارتباط با سرویسهای خارجی و …
- سرویسهای پشتیبان سرویسهایی هستند که نرمافزار آنها از طریق شبکه مورد استفاده قرار میدهد همانند سوریس پایگاه داده، سرویس ارسال ایمیل و یا سرویس صف هستند. هیچ تفاوتی میان سوریسهای پشتیبان داخلی و یا خارجی وجود نداشته و تمامی اطلاعات مرتبط با آنها در پیکربندی ذخیره می شوند.
- منبع کد بایستی بصورت صریحی مراحل build، release و run را از یکدیگر جدا کند. بدین معنا که تغییرات هیچگاه روی محیط run اعمال نشده بلکه ابتدا در محیط توسعه پیاده سازی و تست شده سپس مرحله build توسط توسعه دهنده اجرا شده و سپس محیط عملیاتی (run) بصورت اتوماتیک بروزرسانی میشود
- هریک از بخشهای نرمافزار در یک پروسه بدون حالت(stateless) اجرا شوند. این بذین معناست که هیچ اطلاعاتی در پروسه در زمان اجرا ذخیره نشده و در صورت نیاز در یک سیستم ذخیره سازی مجزا ذخیره میشود
- برای اجرا نرم افزارها معمولا نیاز به یک وب سرور همانند apache است اما یکی از اصول طراحی اینجا عدم اعتماد به وجود سرویسهایی از قبیل apache بوده و استفاده از وب سرورهای موجود در زبان های برنامه نویسی همانند tornado و … بوده و ارائه سرویسها از طریق استفاده از پورتهای مجزا است.
- از افزایش حجم عرضی برای افزایش کارایی سیستم استفاده شود بدین صورت که از چندین پروسه استفاده شود.
- هریک از روندهای یک نرمافزار بایستی با سرعت لود شده و بصورت دقیق و قابل اعتماد خارج شوند
- محیطهای توسعه، پایلوت و عملیاتی بایستی کاملا به یکدیگر شبیه باشند.
- لاگها یک جریان از دادههای زماندار هستند که نرم افزار آنها را در جایی ذخیره نکرده بلکه آنها را بصورت ساده در stdout نوشته و سرویسهای دیگر مسئول ذخیرهسازی، نگهداری و بازیابی لاگ ها هستند.
- عملیات مرتبط به نصب و راهاندازی سیستم که معمولا تنها یک بار اجرا می شوند همانند بروزرسانی ساختار پایگاه داده و یا درست کردن اطلاعات ناقص در پایگاه داده بخاطر یک باگ سیستم بایستی در همان محیط اجرا شوند که پروسههای اصلی سیستم اجرا میشوند.
همین