آشنایی با چند اصطلاح در معماری نرم افزار

در این نوشته می‌خوایم با ۱۵ تا از اصطلاحات و اسامی که در توسعه نرم‌افزار و به خصوص جنبه های معماری نرم افزار احتمالا برخورد کردیم آشنا بشیم.Modular MonolithicAWSAPI-first ApproachNoSQL DatabasesServerless ArchitectureDomain Driven DesignHexagonal architectureEvent SourcingLow code platformsBusiness Process Management Systems (BPMS)Message QueueContainer orchestrationLog Management ToolsMonitoring toolsStatic Code Analysisتوضیحات بسیار ساده و در حد آشنایی ابتدایی نوشته شده‌اند.Modular Monolithicیک سیستم مونولیتیک ماژولار ترکیبی است از سادگی یک سیستم مونولیتیک و مزیت های یک سیستم ماژولار. این سیستم شامل ماژول هایی میشود که وابستگی کمی به هم داشته و میتوان یک خط مرز معنایی بین ماژول های مختلف کشید.سیستم مونولیتیک ماژولار مزیت هایی نسبت به مونولیتیک معمولی دارد که چند مورد عبارت است از:قابلیت نگهداری بالاتر: به دلیل بخش بندی سیستم به واحد های کوچک‌تر، ساده‌تر و قابل مدیریت تر. و همچنین بخاطر وابستگی کمتر ماژول ها به یکدیگر تغییرات سیستم باعث اثرات دومینویی در سیستم نمی‌شود.کمتر کردن پیچیدگی سیستم: این مورد به همان دلیل بخش بندی سیستم به واحد های کوچک‌تر و ساده‌تر اتفاق می‌افتد و این واحد های کوچک‌تر و ساده‌تر پیچیدگی سیستم را به شدت کاهش میدهند.همچنان باید در نظر داشت که ماژولار شدن یک سیستم مونولیتیک نمی‌تواند به همه مشکلاتی که در سیستم مونولیتیک معمولی وجود داشته پاسخ دهد و مواردی از قبیل افزایش کارایی یا پاسخ به درخواست های بیشتر منوط به تغییرات زیادی در کلیت یک سیستم مونولیتیک است.AWSسرویس های وب آمازون یک زیر مجموعه از شرکت بزرگ آمازون است که به ارائه سرویس های ابری متنوع به شرکت ها و اشخاص میپردازد. گوناگونی این سرویس ها بسیار زیاد بوده و کاربران و افراد مختلف بر حسب نیاز خود می‌توانند از بین خدمات متنوع این شرکت مناسب ترین خدمت را برای خود انتخاب کنند و در صورت لزوم با کمترین هزینه خدمات دریافتی خود را تغییر دهند و مثلا نسبت به افزایش توان محاسباتی آن اقدام کنند. تمام هزینه های این سرویس ها به صورت پیش فرض براساس میزان استفاده است و شرکت ها و کاربران به اندازه‌ای که استفاده کرده‌اند در انتهای دوره، هزینه را پرداخت می‌کنند.آمازون سرویس های مختلفی را بر این بستر ارائه میدهد که چند مورد پراستفاده آنها شامل سرویس های محاسباتی مثل EC2(Elastic compute cloud)، سرویس های ذخیره سازی اطلاعات مثل S3 (Simple Storage Service)، سرویس های پایگاه داده مثل RDB(Relational Database) و... است.امروزه استارتاپ ها و شرکت های بزرگی از سرویس های ابری آمازون استفاده میکنند تا علاوه بر کنترل هزینه ها از مزیت های این شرکت اعم از امنیت بالای این سرویس ها، دسترسی بالای آنها در نقاط مختلف دنیا و قابلیت اتکای بالایی که ارائه میدهد استفاده کنند. چند مورد از این شرکت ها عبارت است از Netflix, Twitch, Adobe.API-first Approachرویکرد API-first یک روش توسعه سیستم نرم افزاری است که در آن APIها در اولویت قرار دارند و قبل از توسعه هرگونه کد چه در سمت کاربر و چه سمت سرور ابتدا و با تمرکز بالا بر نحوه کارکرد سیستم نرم افزاری در کسب و کار شرکت APIهای این سیستم به نحوی طراحی و ساخته میشوند که قابلیت استفاده مجدد بالا و کارکرد بالایی داشته باشند و سپس بر اساس این APIها سایر بخش های نرم افزار توسعه داده میشوند به نحوی که یا عملکرد این APIها را پیاده کنند و یا از این APIها به درستی استفاده کنند.این رویکرد مزیت های زیادی در روند تولید و محصول نهایی دارد از جمله اینکه:پس از ایجاد APIها تیم ها می‌توانند با استقلال زیاد و به صورت هم زمان بخش های نرم افزاری خود را توسعه دهند و نیازی به معطل ماندن تیمی برای اتمام کار تیم دیگر نیست.بخش های نرم افزاری هرکدام مستقل از دیگر بخش هاست و حتی میتواند از زبان، چهارچوب و ابزارهای متفاوتی از سایر بخش ها استفاده کند و فقط کافی است با APIها سازگار باشدمیتوان در این رویکرد حتی بدون پیاده‌سازی واقعی سیستم با استفاده از ابزارهای موجود عملکرد سیستم را شبیه‌سازی کرده و در سریعترین زمان ممکن بازخورد مشتری را دریافت کرد.انعطاف پذیری و استفاده مجدد در بخش های مختلف سیستم در این رویکرد بسیار بالا بوده و میتواند هزینه های تولید سیستم را به شدت کاهش دهد.توسعه نرم افزار در این رویکرد بسیار سریعتر اتفاق افتاده و میتوان نرم افزار نهایی را به سرعت و با اطمینان بالایی به بازار داد.NoSQL Databasesاین پایگاه های داده که به پایگاه داده های غیر رابطه ای نیز شناخته می شوند نوعی پایگاه داده هستند برخلاف پایگاه های داده که اطلاعات را در قالب جدول ها ذخیره می کنند این پایگاه های داده در قالب های دیگری نظیر key-value, Graph و … نگهداری میکنند. این بدان معنی است که آنها از ساختار سطرها و ستون های سنتی پایگاه های داده رابطه ای استفاده نمی کنند. همچنین این پایگاه های داده در حافظه اصلی نگهداری میشوند و ذخیره سازی در حافظه جانبی تحت شرایطی اتفاق می افتد.پایگاه های داده NoSQL به دلیل مزایایی نظیر قابلیت پاسخ دهی به تعداد زیاد تقاضاها (مقیاس پذیری بالا) و تاخیر کمتر نسبت به پایگاه های داده رابطه ای(عملکرد بهتر) به طور فزاینده ای محبوب میشوند اما حتی با مزایای گفته شده نیز ایراداتی به این پایگاه های داده وارد است که اصلی ترین مورد آن برمیگردد به مساله نگهداری در حافظه جانبی که امکان از دست رفتن اطلاعات و یا ناهمگونی اطلاعات را در بر دارد. میتوان داده های این پایگاه های داده را برای ماندگاری به حافظه جانبی انتقال داد ولی این امر ممکن است با تاخیری اتفاق افتاده و داده های حافظه اصلی با داده های حافظه جانبی متفاوت باشد.Serverless Architectureرویکردی در طراحی نرم افزار است که به توسعه دهندگان اجازه می دهد تمرکز خود را بر روی بخش های اصلی عملکردی نرم افزار گذاشته و نحوه مدیریت سرور و استقرار نرم افزار بر روی سرور را تماما بر عهده یک ارائه دهنده سرویس ابری بگذارند.شرکت های بزرگ ابری ابزاری به نام Function as a service (FaaS( ارائه میدهند که به توسعه دهندگان امکان می دهد برنامه های خود را در قالب توابع نوشته و براساس اتفاقاتی نظیر درخواست HTTP این توابع فراخوانی شده و به مشتریان خدمات بدهند. همین امر بسیاری از کارهای مرتبط با توسعه نرم افزار را از عهده توسعه دهندگان خارج کرده و دغدغه این بخش ها برای توسعه دهندگان را از بین میبرد.علاوه بر نحوه فراخوانی براساس اتفاقات شرکت ارائه دهنده این خدمات مسئولیت امنیت و مقیاس بندی سرویس را خود بر عهده دارد و بر حسب نیازهای نرم افزار منابع به صورت خودکار تخصیص می یابد.یکی از دلایل مهمی که شرکت ها را به استفاده از این نوع خدمات سوق میدهد نحوه هزینه کرد این خدمات است که براساس فراخوانی شدن این توابع است و دیگر هزینه هایی مثل منابع سخت افزاری و زیرساختی بر هزینه کلی شرکت ها سربار نمیشود.Domain Driven Designرویکرد توسعه نرم افزار است که در آن تمرکز بر روی اصل کسب و کار موجود بوده و برای آن یک مدل نرم افزاری معادل طراحی می شود تا بتواند عملکردهایی که در کسب و کار اصلی وجود دارد را انجام دهد. این رویه به خصوص برای کسب و کارهای پیچیده می تواند بسیار موثر باشد و پیچیدگی ذاتی آنها را کاهش دهد.در این فرآیند تیم توسعه دهنده نرم افزاری نیازمند ارتباط گرفتن با یک خبره کسب و کار هدف هستند و برای ارتباط موثر و درست هم نیازمند ایجاد یک زبان مشترک هستند تا اصطلاحات و کلمات یکدیگر را درک کنند و در تولید مدل کسب و کار دچار اشتباهاتی از جنس فهم غلط نشوند. همچنین بهتر است از همین زبان مشترک برای نام گذاری مدل کسب و کار و عملکردهای آن استفاده شود.این روش به دلیل ارتباط با یک خبره کسب و کار میتواند در نهایت باعث تولید یک محصول مناسب و قابل اتکا شده و در زمان ورود به بازار نیازهای کسب و کار را به خوبی جواب داده و موفق شود.Hexagonal architectureمعماری شش ضلعی که به معماری پورتها . آداپتورها نیز شناخته میشود یک الگوی طراحی نرم افزار است که هدف آن جداسازی بخش اصلی نرم افزار از وابستگی های خارجی نظیر ارتباط با دیتابیس است و برای هر وابستگی خارجی یک اینترفیس(پورت) تعریف میشود و برای استفاده از این پورت باید این اینترفیس پیاده سازی شده(تعریف آداپتور) و از طریق آن اتصال صورت پذیرد. این معماری به خوبی اصل Dependency Inversion را رعایت میکند و از این بابت ایجاد تغییرات و نگهداری نرم افزار به راحتی انجام می پذیرد.جداسازی بخش های اصلی و اتصال از طریق پورت ها و آداپتورها در راحتی آزمون نرم افزار هم بسیار مفید خواهد بود زیرا عملکرد داخلی نرم افزار وابسته به عملکرد بخش های دیگر نیست و همچنین ارتباط بین هر شش ضلعی فقط از طریق پورت ها و آداپتورها است و میتوان ارتباط خارجی آن را با راحتی بیشتری شبیه سازی کرده و عملکرد شش ضلعی مد نظر را مورد آزمون قرار داد.Event Sourcingمنبع یابی رویداد به رویکردی در توسعه نرم افزار گفته میشود که در آن هر رویدادی که برای نرم افزار می‌افتد و منجر به تغییر وضعیت نرم افزار میشود را در لیستی بر حسب زمان ذخیره کنیم. در این رویکرد اگر رویدادی اتفاق بیفتد که منجر به تغییر وضعیت سیستم شود اطلاعات مربوط به این رویداد به انتهای لیست رویداد ها اضافه میشود و به این صورت علاوه بر داشتن وضعیت حال حاضر نرم افزار میتوان التفاتی که منجر به قرار گرفتن نرم افزار در این وضعیت شده را نیز با استفاده از این لیست دنباله یابی کرد.این رویکرد در حالاتی مثل وضعیتی که سیستم به خطایی برخورد کرده میتواند خیلی مفید باشد لذا می‌توان سلسله اتفاقات منجر شده به این وضعیت را دنبال کرده و اطلاعات آنها را نیز به دست آورده و با آنالیز این اطلاعات خطایابی راحت تر انجام شده و با سرعت بیشتری نرم افزار را اصلاح کرد.Low code platformsاین پلتفرم ها به نوعی ساخته شده اند که کاربرانی که آشنایی بسیار کمی با برنامه نویسی و کدنویسی دارند بتوانند با استفاده از این پلتفرم با کمترین کدزدن برنامه خود را ساخته و در فضای ابری مستقر کنند. استفاده از این پلتفرم ها اکثرا با استفاده از رابط گرافیکی است و کاربران با استفاده از drag and drop و فرم ها و.. اقدام به ساخت نرم افزار میکنند. همچنین این پلتفرم ها تکه کدهای پرتکرار را به صورت از پیش آماده فراهم میکنند تا کاربران بتوانند از آنها مجدد استفاده کنند و در نهایت نیز با استفاده از خود این پلتفرم ها میتوان برنامه ساخته شده را در سرویس های خدمات ابری مستقر کرد.این ابزارها برای برنامه های کوچک و کاربرانی که تجربه کمی در برنامه نویسی دارند بسیار مفید است و امکان برنامه سازی را برای جامعه بسیار بزرگتری فراهم میکنند.Business Process Management Systems (BPMS)سیستم مدیریت فرآیند های کسب و کار یک ابزار نرم افزاری است که به منظور کشف، مدل سازی، تجزیه و تحلیل، اندازه گیری، بهبود و بهینه سازی استراتژی و فرآیندهای کسب و کار استفاده میشود و با این کار شرکت ها میتوانند با استفاده از آن فرآیندهای خود را به نحوی مدیریت کنند که در نهایت باعث افزایش سود کلی شرکت شود.در این سیستم ها فرایندها یعنی مجموعه قدم هایی منجر به به نتیجه رسیدن یک عمل میشود مثل فرآیند خرید یک مشتری که از درخواست اولیه شروع شده و در نهایت به فروخته شدن محصول به مشتری ختم می شود. در این مسیر کارهای مختلفی باید انجام بگیرد که میتواند شامل تایید هویت مشتری پرداخت و در نهایت ارائه محصول باشد و در این بین کارهای بسیار زیاد دیگری نیز ممکن است انجام بگیرد که مدیریت این کارها می تواند عملکرد کلی شرکت در ارائه این خدمات را بهینه تر کم هزینه تر و سودمندتر کند. لذا شرکت های زیادی از این ابزارها استفاده میکنند تا بتوانند عملکرد شرکت را بررسی و در صورت امکان بهینه کنند.Message Queueصف های پیام یک برنامه میانی هستند که بین سرویس های مختلف یک سیستم وظیفه ارتباط را بر عهده میگیردند و با این کار میتوانند استقلال و عدم وابستگی سرویس ها به یکدیگر را افزایش دهند. صف های پیام مزیت های دیگری نیز برای سیستم دارند من جمله اینکه یک سرویس در صورتی که کار خود را انجام داده نیازی ندارد برای از بین نرفتن نتیجه منتظر سرویس بعدی مانده و نتیجه را به آن سرویس تحویل دهد بلکه کافی است نتیجه را در قالب پیام در صف پیام داده و کار خود را بر روی ورودی بعدی شروع کند. علاوه بر این می توان با استفاده از صف های پیام مقیاس پذیری سیستم را افزایش داد به این صورت که چندین سرویس کلون شده که بر روی نوع خاصی از پیام ها کار میکنند هر کدام می توانند پیام های موجود در صف را برداشته سپس پردازش کرده و دوباره نتیجه را در صف قرار دهند.یکی دیگر از مزیت های استفاده از این صف ها این است که میتوان برای پیام های مهمتر اولویت بالاتر تعریف کرده و این صف پیام های با اولویت بالاتر را اول صف قرار داده و این پیام ها زودتر پردازش شوند و حتی پیام های بی اهمیت دور ریخته شده و بار کلی سیستم را در مواقع اضافه بار کاهش دهند.Container orchestrationارکستره کردن کانتینرها فرآیندی است به منظور خودکارسازی استقرار مقیاس بندی و مدیریت برنامه های کانتیری و برای این کار ابزارهای قدرمتندی وجود دارد که معروف ترین آنها درحال حاضر Kubernetes است. توسعه دهندگان با استفاده از این ابزار بدون نیاز به در نظر گرفتن وضعیت زیربنایی کانتینرها میتوانند با ایجاد فایل های پیکربندی که به صورت برنامه نویسی اعلامی (declarative programming) به این ابزار اعلام کرده و این ابزار به طور خودکار با در نظر گرفتن وضعیت سیستم و وضعیت زیربنایی کانتینرها اقدام به اجرای فرآیندهایی در سیستم میکند که در نهایت منجر به نتیجه اعلامی توسعه دهنده شود و از این بابت نیز توسعه دهنده دغدغه نحوه مدیریت کانتینرها و منابع موجود در سرورها را ندارد.Log Management Toolsلاگ های یک سیستم اطلاعات مفیدی هستند بخاطر برنامه نویسی انجام شده توسط توسعه دهندگان به صورت اتوماتیک در زمان اجرای نرم افزار تولید میشود. برای جمع آوری ذخیره آنالیز و حتی بصری کردن این اطلاعات ابزارهای قدرتمندی ساخته شده اند که در حال حاضر معروف ترین اینها سه ابزار هستند به نام های Elasticsearch, Logstash و Kibana هستند که به اختصار به آنها پشته ELK گفته میشود.در صورت تولید لاگ های معنادار و مناسب در حین اجرای سیستم این لاگ ها تداعی کننده عملکرد سیستم هستند و با استفاده از ابزارهای مدیریت لاگ میتوان در زمان خطایابی سیستم بررسی های امنیتی سیستم بررسی و بهبود عملکرد کلی سیستم میتوان اطلاعات مناسب و مد نظر را بازیابی و آنالیز کرد.Monitoring toolsابزارهای مانیتورینگ نرم افزارهایی هستند که به جمع آوری و پردازش معیارهای عملکردی سیستم مثل استفاده از منابع زمان انجام کارها و حتی نرخ خطاهای اتفاق افتاده در سیستم می پردازند. این ابزارها برای بررسی عملکرد سیستم های نرم افزاری لازم هستند و به خوبی می توانند جنبه های کیفی از نرم افزار مثل performance را به خوبی نشان دهد.یکی از معروف ترین این ابزارها که به صورت متن باز است Prometheus نام دارد و علاوه بر جمع آوری اطلاعات لازم و مفید از بخش های مختلف یک سیستم نظیر منابع سیستم اطلاعات نرم افزار معیارهای کانتینر و معیارهای شبکه و… میتواند این اطلاعات را در قالب سری های زمانی ذخیره و با رابط گرافیکی نمایش دهد.ابزارهایی نظیر Prometheus علاوه بر جمع آوری ذخیره و نمایش داده ها میتواند طوری تنظیم شوند که به افراد فنی مرتبط اخطارهایی را که با ایجاد شرایط خاصی در سیستم مثل افزایش پردازش پردازنده ارسال کند.Static Code Analysisابزارهای تحلیل ایستای کد نرم افزارهایی هستند که بدون اجرا، با بررسی های زبانی و سینتکسی کد را از برخی جهات نظیر یافتن ایرادات، مشکلات امنیتی و کدهای مرده بررسی و پیشنهاداتی در جهت اصلاح این ایرادات ارائه دهند. این ابزارها میتواند از اولین لحظات نوشتن کد، آن را بررسی کرده و نسبت به اصلاح ایرادات به وجود آمده از همان لحظات اولیه مفید واقع شده و از تاثیرات دومینویی این ایرادات در سیستم جلوگیری کنند.این ابزارها در عین اینکه هزینه و منابع زیادی برای شرکت نخواهند داشت می‌توانند در تولید یک نرم افزار با کیفیت و قابل نگهداری بسیار مفید باشند.