مباحثی در رابطه با معماری نرم‌افزار

Modular Monolithicبرنامه نویسی monolithic به شیوه‌ای از برنامه نویسی گفته میشود کهدر آن تمام قسمت‌های برنامه شامل دیتابیس، منطق برنامه، فرانت و ... در یک فایل نوشته میشوند و همه‌ی اجزای برنامه به هم وابسته هستند و در این شیوه تغییر جزئی منجر به تغییر و در اغلب موارد منجر به خرابی در اجزای دیگر میشود. در مقابل این شیوه، برنامه نویسی modular وجود دارد که برنامه به بخش‌های مختلف شکسته شدا و مستقل از هم ایجاد شده و مستقل از هم نیز کار میکنند. در این روش ایجاد تغییر در یک بخش معمولا تاثیری بر دیگر اجزا ندارد و توسعه‌ی برنامه نیز راحت تر است. Modular monolithic اصطلاحی است که به برنامه‌هایی گفته میشود که در ابتدا به صورت monolithic ایجاد شده اند و بعد تلاش هایی برای ماژوله کردن صورت گرفته است که ساختار برنامه اندکی شکل modular به خود بگیرد و بتوان از مزیت‌های modularity تا حدودی بهره‌مند شد.https://vrgl.ir/jzMoYhttps://medium.com/design-microservices-architecture-with-patterns/microservices-killer-modular-monolithic-architecture-ac83814f6862AWSفرض کنید فردی میخواهد خانه‌ای بخرد. او نیاز به برق، آب، گاز و ... برای زندگی در آن خانه دارد. پس از خرید خانه فرد خودش منبع تولید برق، چاه آب و ملزومات آن را فراهم نمیکند بلکه از شرکت برق که تمام این زیرساخت‌های مورد نیاز را فراهم کرده و آماده‌ی خدمت رسانی است برق میگیرد و در آخر ماه به اندازه‌ی مصرف خود هزینه میپردازد. اکنون در نظر بگیرید فردی میخواهد یک بیزینسی راه‌ اندازی کند که نیاز به فضای ذخیره سازی و پردازشی که هزینه‌ی بسیار زیادی دارد داشته باشد. شرکت آمازون ابزاری به نام AWS (Amazon Web Service) ایجاد کرده است که استخری از منابع مورد نیاز دارد و افراد میتوانند از آن خدمت گرفته و به ازای مصرفشان هزینه پرداخت کنند، بدون نیاز به خریداری سخت افزارها.https://fanology.ir/what-is-amazon-web-service/https://www.karlancer.com/blog/aws/API-first ApproachAPI-first Approach یک رویکردی در برنامه نویسی است که به طراحی و ایجاد API ها قبل از دیگر بخش‌ها تاکید دارد. الویت دادن به طراحی و تعریف API ها باعث میشود پس از مشخص شدن اهداف، ارتباطات واضح بین اجزا مشخص شوند و هر بخش به طور مستقل و با وظایف مشخص توسعه پیدا کنند بنابراین میتوان گفت این رویکرد به موازی سازیِ توسعه کمک کرده و زمان توسعه را کاهش پیدا میدهد. کاهش وابستگی بین اجزا از دیگر مزیت‌های این استراتژی است و در نتیجه‌ی کاهش وابستگی ها نگهداری آسان میشود. تعریف API ها در ابتدای کار توسعه پذیری و انعطاف پذیری برنامه را افزایش میدهد.https://www.postman.com/api-first/https://apieco.ir/blog/what-is-api-first/NoSQL DatabaseNoSQL Database یا not only SQL روشی برای ذخیره سازی داده است که در آن داده های با حجم زیاد و نامتمرکز میتوان ذخیره کرد بنابراین این نوع از دیتابیس بیشتر برای کسب و کارهایی مناسب است که با حجم انبوهی از داده‌های ساختار نیافته سروکار دارند. همین ساختارنیافتگی داده‌ها مزیت مهم NoSQL است زیرا نیاز به سازماندهی داده‌ها، ایجاد جدول، روابط و ... نداریم؛ بنابراین نیاز به مدیریت آنچنانی وجود ندارد و این خود یک مزیت مهم است. این نوع دیتابیس از مقیاس پذیری افقی پشتیبانی میکند یعنی در صورت نیاز بدون افزایش سرورها میتوانیم حجم داده‌ی بیشتری ذخیره کنیم. NoSQL Database ها سرعت زیادی برای پردازش دارند. انواع مختلفی از NoSQL ها وجود دارند مانند: Document-Oriented, Key-Value sores, Columan-family stores, Graph Database؛ اکثرا در فضاهای ابری نیز مورد استفاده قرار میگیرند.https://7learn.com/blog/what-is-nosqlhttps://aws.amazon.com/nosql/Serverless Architectureزمانی که نرم افزاری تولید میشود نیاز به سرور دارد که این سرور علاوه بر اینکه هزینه‌ی زیادی دارد نیازمند مدیریت و نگهداری است. امنیت سرور نیز یکی دیگر از چالش های نگهداری سرور هست. Serverless Architecture یک مدل رایانش ابری است که میتواند بستر سرور فراهم نماید و میگوید میتوانید با خذف چالش های نگهداری سرور تمرکز و هدف را بر روی ایده‌ی خود و نرم افزار مجتمع کنید. بنابراین، این زیرساخت تنها کد برنامه را گرفته و بسته به نیازِ یک نرم افزار، به صورت داینامیک منابع مورد نظر را به آن اختصاص میدهد. هزینه‌ای که باید پرداخت شود بر اساس میزان مصرف محاسبه میشود. به این نکته باید توجه داشت که مهاجرت از سرویس سنتی به این زیرساخت‌ها فرآیندی ساده‌ای نیست و چالش‌های خود را به همراه دارد.https://vrgl.ir/8HY4ahttp://sokanac.ir/kNLDomain Driven Designطراحی دامنه محور (DDD) یک رویکرد توسعه نرم افزار است که بر درک و مدل سازی مفاهیم اصلی کسب و کار و اتباط شفاف بین اعضا تمرکز دارد. این یک زبان مشترک ((زبان جاودانه)) بین توسعه دهندگان و کارشناسان کسب و کار را برای ایجاد یک درک مشترک تشویق می کند. DDD به ساختن نرم‌افزاری کمک می‌کند که مستقیماً فرآیندهای کسب‌وکار در دنیای واقعی را منعکس می‌کند و نگهداری و تکامل آن را آسان‌تر می‌کند. یکی از مزایای کلیدی آن بهبود همکاری بین اعضای تیم فنی و غیر فنی است که منجر به راه حل های نرم افزاری موثرتر و دقیق تر می شود.https://en.wikipedia.org/wiki/Domain-driven_designhttps://martinfowler.com/bliki/DomainDrivenDesign.htmlHexagonal Architectureمعماری Hexagonal یا شش‌گوشی، الگویی در طراحی نرم‌افزار است که هدف اصلی این معماری، تمرکز بر منطق کسب و کار و هسته‌ی اصلی برنامه است. جزئیات وابسته به ورودی و خروجی، مثل واسط‌های کاربری یا دیتابیس‌ها، از منطق اصلی تفکیک می‌شوند. در این مدل، هسته اصلی برنامه در وسط قرار دارد و با ورودی‌ها و خروجی‌ها از طریق شش دید مختلف در ارتباط است. این الگو از پلاگین‌پذیری بهره می‌برد که امکان اضافه کردن واسط‌های جدید را بدون تغییر در منطق اصلی برنامه فراهم می‌کند. با جدا سازی I/O و منطق کسب و کار، این معماری انعطاف‌پذیری بالا، تست و نگهداری آسان و کاهش وابستگی‌ها را به ارمغان می‌آورد؛ Hexagonal Architecture به ویژه برای برنامه‌هایی که با برنامه‌های دیگر تعامل دارند مناسب است.https://vrgl.ir/gC1Qrhttp://sokanac.ir/JnIhttps://tsh.io/blog/hexagonal-architecture/#:~:text=Hexagonal%20architecture%20is%20a%20pattern,databases%20from%20the%20core%20applicationEvent SourcingEvent Sourcing یک الگوی طراحی نرم‌افزار است که به جای نگهداری وضعیت فعلی یک سیستم، تمامی رخدادها و تغییرات را در طول زمان ثبت می‌کند. در این الگو، تاریخچه‌ی کامل تغییرات در سیستم قابل دسترس است، که این موضوع می‌تواند به رفع اشکالات و تجزیه و تحلیل کمک کند. Event Sourcing به سیستم این امکان را می‌دهد که با تجمیع رخدادها، وضعیت فعلی را محاسبه کند و از این طریق قابلیت بازگردانی وضعیت به هر زمانی را فراهم سازد. این الگو مناسب برای سیستم‌هایی است که نیاز به ثبت و ردیابی دقیق تغییرات دارند، مانند سیستم حسابداری. اما برای پیاده‌سازی آن، نیازمند تغییرات در مدل داده و logic سیستم است که ممکن است برای سیستم‌های ساده باعث پیچیدگی شود. Event Sourcing از پلاگین‌پذیری بهره می‌برد که به راحتی امکان اضافه کردن واسط‌های جدید بدون تغییر در بخش‌های اصلی را فراهم می‌کند و به سیستم امکان به‌روزرسانی یا تغییر مدل داده بدون از دست رفتن تاریخچه‌ی رخدادها میدهد.https://learn.microsoft.com/en-us/azure/architecture/patterns/event-sourhttps://vrgl.ir/t7NUtLow-code platformsLow-code platforms، ابزارهای توسعه نرم‌افزار هستند که امکان ایجاد برنامه و نرم افزار‌ها برای کسانی که به مهارت عالی و پیشرفته در برنامه نویسی نرسیده‌اند را فراهم میکند. این پلتفرم‌ها با فراهم آوردن یک محیط گرافیکی و امکانات متنوع، توسعه‌دهندگان را در فرآیند ایجاد و تنظیم فرآیندها و برنامه‌ها همراهی می‌کنند. مزایای این ابزارها شامل افزایش سرعت توسعه، وجود امکان شرکت کاربران غیر توسعه دهنده در فرایند ایجاد برنامه و کاهش هزینه‌ها و زمان موردنیاز برای پروژه‌های کوچک و متوسط است. با این حال، در پروژه‌های پیشرفته و نیازمند کنترل دقیق‌تر، ممکن است محدودیت‌هایی وجود داشته باشد. به طور کلی، Low-code platforms با توجه به نوع پروژه‌ها، ابزارهایی کارآمد برای توسعه سریع و آسان نرم‌افزارها هستند.https://www.ibm.com/topics/low-codehttps://blog.faradars.org/what-is-low-code-development/Business Process Management Systems (BPMS)BPMS به عنوان سیستم‌های مدیریت فرآیند کسب و کار، نقش بسیار مهمی در بهبود عملکرد و بهینه‌سازی فرآیندها و فعالیت‌های سازمانی ایفا می‌کنند. از جمله مزایای این سیستم‌ها می‌توان به افزایش شفافیت در داخل سازمان و بهبود هماهنگی، سیستم امکان مشارکت افراد غیرتکنیکی را در طول فرایند و همکاری میان اعضای تیم اشاره کرد. این سیستم‌ها میتوانند با گزارش‌گیری و تجزیه و تحلیل پیشرفته مدیران را در ارزیابی و بهبود عملکرد فرآیندها ‌کنند. به علاوه، این سیستم‌ها قابلیت ادغام با سایر سیستم‌ها و داده‌های مختلف درون سازمان را دارند و به سازمان‌ها این امکان را می‌دهند که با سرعت به تغییرات بازار و نیازهای مشتریان واکنش نشان دهند. با این حال استفاده از این سیستم‌ها ممکن است نیازمند تغییرات در ساختار و فرآیندهای سازمانی باشد که این مسئله ممکن است به چالش‌هایی برای برخی از سازمان‌ها منجر شود.https://www.pegaheaftab.com/bpms-%DA%86%DB%8C%D8%B3%D8%AA/https://abpmp-ir.org/what-are-business-process-management-systems/Message QueueMessage Queue یا صف پیام، مثل Kafka و RabbitMQ، یک سیستم مهم برای ارتباط و انتقال پیام بین برنامه‌ها یا بخش‌های مختلف یک سیستم هستند. این سیستم‌ها مانند یک پستچی عمل می‌کنند. هر برنامه می‌تواند یک پیام را به این صف بفرستد و بعداً برنامه دیگری این پیام را از صف بیرون آورد. مزیت این روش این است که وقتی یک برنامه پیامی بفرستد، می‌تواند به کار خود ادامه داده و منتظر دریافت پیام توسط بخش دیگر نباشد. همچنین، اگر بخشی از سیستم برای لحظه‌ای کار نکند و نتواند یک پیام را دریافت کند آن پیام از بین نرفته و می‌تواند بعداً آن را بخواند. ایجاد صف به هنگام ترافیک زیاد می‌تواند به عملکرد سیستم کمک کند؛ به طور کلی ارتباط بین برنامه‌ها ایجاد کرده و به کارامد بودن سیستم کمک میکند.https://vrgl.ir/rpyGuhttps://en.wikipedia.org/wiki/Message_queueContainer OrchestrationContainer Orchestration، نقش مهمی در مدیریت کانتینرها و اجرای برنامه ها در محیط های توزیع شده ایفا می کند. این به توسعه دهندگان این امکان را می دهد که به راحتی برنامه های خود را در کانتینرها اجرا و مدیریت کنند. Kubernetes، به عنوان یک نمونه‌ی برجسته، قابلیت‌هایی را برای ایجاد، مقیاس‌بندی و نظارت بر برنامه‌ها فراهم می‌کند و به بهبود فرآیندهای ساخت و اجرای برنامه‌ها کمک می‌کند. مزایای مهم شامل توزیع بهینه حجم کار، امکان ایجاد و به روز رسانی خدمات بدون وقفه، و نظارت پیشرفته است. استفاده از این Orchestration ‌ها روند ارتقاء و مقیاس بندی برنامه ها را سرعت می بخشد.https://xaas.ir/blog/orchestration/https://cloud.google.com/discover/what-is-container-orchestrationLog Management Toolsمدیریت لاگ یک فرآیند مداوم است که شامل جمع‌آوری و تجزیه و تحلیل داده‌های لاگ برای نظارت بر عملکرد، شناسایی مشکلات و افزایش امنیت می‌شود. تحلیل داده‌های جمع‌آوری شده برای به دست آوردن تصویری از عملکرد تجاری، امنیتی و عملیاتی استفاده می‌شود. به عنوان مثال، یک سرویس میزبانی وب را در نظر بگیرید. Elasticsearch(ELK) به عنوان یک مخزن مرکزی عمل می کند و به سرعت لاگ های سرور را ذخیره و بازیابی می کند. Logstash به طور سیستماتیک داده ها را جمع آوری و پردازش می کند و از انسجام اطمینان حاصل می کند. سپس Kibana این اطلاعات را به تصاویر قابل درک تبدیل می‌کند و مدیران را قادر می‌سازد تا عملکرد سرور را نظارت کنند، تهدیدات امنیتی بالقوه را شناسایی کنند و مشکلات را به سرعت عیب‌یابی کنند. این اعمال به سازمان‌ها اجازه می‌دهد تا از گزارشات به راه‌ حل‌های عملی برسند و قابلیت اطمینان و امنیت سیستم را افزایش دهند.https://www.sumologic.com/blog/log-management-tool/https://sematext.com/guides/elk-stack/Monitoring toolsابزارهای مانیتورینگ، مانند Prometheus، به عنوان نگهبان هوشیار سیستم‌ها و برنامه‌های دیجیتال عمل می‌کنند و به طور مداوم معیارهای مختلفی مانند استفاده از منابع، زمان پاسخ و نرخ خطا را جمع‌آوری و تجزیه و تحلیل می‌کنند. وظیفه‌ی آنها مطمئن شدن از اجرای درست همه چیز است. برای مثال، Prometheus از مدل pull برای جمع‌آوری معیارهای مختلف از سیستم‌ها و خدمات استفاده می‌کند. این ابزار، این امکان را فراهم می‌کند تا کاربران بتوانند داده‌های جمع‌آوری‌شده را استفاده کرده و پرس‌وجوهای پیچیده را انجام دهند، همچنین از قابلیت اعلان استفاده می‌کند تا به کاربران اطلاع دهد که آیا شرایط مشخصی در سیستم رخ داده یا خیر؛ این امر به مدیران سیستم اجازه می‌دهد به سرعت هر مشکلی را شناسایی و رسیدگی کنند و سیستم را ارتقا دهند.https://vrgl.ir/NlJCOhttps://logit.io/blog/post/prometheus-monitoring-tools/Static Code AnalysisStatic Code Analysis به تجزیه و تحلیل کد برای یافتن ایرادات و مشکلات کد مانند مشکلات امنیتی، Dead codeها، باگ‌ها و ... بدون اجرای کد است. این مرحله معمولا قبل از مرحله‌ی تست نرم افزار و ابتدای توسعه انجام می‌شود. این تحلیل را میتوان به صورت دستی نیز انجام داد اما ابزارهای قدرتمندی برای انجام خودکار این مرحله وجود دارد. SonarQube یکی از این ابزارهاست که به طور مداوم کیفیت کد را بررسی می‌کند و از همسویی آن با استانداردهای کدنویسی و نبود مشکلات رایج، اطمینان می‌دهد. این ابزارها با ارائه بازخورد اولیه در مورد کیفیت و امنیت کد به توسعه دهندگان، تیم ها را قادر می سازند تا به طور فعالانه به مسائل رسیدگی کنند و در نتیجه برنامه های نرم افزاری قوی تر، کارآمدتر و ایمن تر ایجاد کنند. با انجام این تحلیل توسعه‌ی یک نرم افزار آسان‌تر خواهد شد.https://vrgl.ir/1gAvfhttps://www.bitegarden.com/static-code-analysis-with-sonarqube