با نام و یاد خداوند مهربان، این پست به تمرین درس معماری نرمافزار به تدریس جناب آقای دکتر صادق علیاکبری اختصاص داشته و چه عالی که این تمرین درخواستی را با هم به اشتراک بگذاریم.
"هدف این تمرین، کسب دانشی اولیه و سطحی درباره چندین موضوع متنوع و پراکنده است. در واقع، میخواهیم درباره بیست موضوع مورد اشاره در این تمرین، اطلاعاتی اولیه داشته باشیم و بتوانیم درباره هر کدام، کمی (مثلاً دو دقیقه) حرف بزنیم و اگر کسی درباره این موضوعات صحبت کرد، کلیات آنها را درک کنیم. همچنین ممکن است در امتحان پایان ترم، درباره هر یک از این موضوعات، سؤالهای پایهای و تحلیلی پرسیده شود.
موضوعات موردنظر در این تمرین:
خروجی تمرین: درباره هر یک از مطالب فوق، توضیحات کوتاهی از زبان خودتان بنویسید. برای توضیح هر موضوع، حداقل صد کلمه بنویسید، بنابراین کل مطلب شما حداقل 1500 کلمه خواهد بود. در صورت نیاز میتوانید تصویر اضافه کنید. کپی تصاویر اشکالی ندارد ولی متنی که مینویسید باید کاملاً اوریجینال باشد و به هیچ وجه از جایی کپی یا ترجمه تحتاللفظی نشده باشد. دقت کنید مهمتر از متنی که مینویسید، این است که دانش و شناخت اولیه مناسبی (حتی کمعمق) درباره این مفاهیم، کسب کرده باشید."
معماری Modular Monolithic ترکیبی از دو رویکرد است: پیمانهبندی برای تعریف سیستم به بخشهای مستقل و یکپارچه برای استقرار آسان. در این مدل، سیستم به بخشهای کوچک (ماژول یا پیمانه) تقسیم میشود که اما در یک واحد بزرگتر (مونولیت یا یکپارچه) تجمیع میشوند. این معماری اجازه میدهد که هر پیمانه به صورت مستقل توسعه و تست شود، در حالی که استقرار و مدیریت سیستم به سادگی انجام میشود. از مزایا و معایب این معماری میتوان به موارد زیر اشاره کرد:
خدمات بر بستر وب آمازون یا Amazon Web Service، به کاربران امکان ایجاد، مدیریت و میزبانی آنلاین را به کمک خدماتی نظیر محاسبات و رایانش ابری، پایگاه داده، بسترهای تجارت الکترونیک و ... فراهم میکند. این بستر ابری از مزایایی نظیر انعطافپذیری بالا، مقیاسپذیری و امنیت مناسب برخوردار است. از معایب آن میتوان به هزینههای بالای احتمالی در صورت استفاده نادرست و احتمال پیچیدگی در مدیریت محیطهای گسترده و پیچیده اشاره داشت.
رویکرد API-first به ایجاد رابطهای برنامهنویسی برنامه (API) به عنوان اولین قدم در توسعه نرمافزار اشاره دارد. در این رویکرد، توسعهدهندگان ابتدا API را طراحی و پیادهسازی کرده سپس بر اساس آن، بخشهای مختلف برنامه را توسعه میدهند. این رویکرد معیارهایی نظیر انعطافپذیری، قابلیت تست و هماهنگی بین تیمها را افزایش میدهد. همچنین تغییرات در پیادهسازی برنامه از طریق تغییرات در API اعمال شده و این امکان را به توسعهدهندگان میدهد تا به صورت مستقل از یکدیگر کار کنند.
پایگاهدادههای NoSQL یک دسته از سیستمهای مدیریت داده هستند که از مدل دادهای و ساختارهای فارغ از رویکردهای سنتی SQL بهرهمند هستند. این نوع پایگاهداده از مدلهای متفاوتی نظیر مدل سندی، کلید - مقدار، گرافی یا ستونی برخوردارند. از مزایای آن میتوان به انعطافپذیری در ذخیرهسازی دادههای غیرساختاری، مقیاسپذیری مناسب و سرعت بالا در عملیات خواندن/نوشتن اشاره داشت. پیچیدگی در پرسوجوهای پیچیده و کمبود استاندارد SQL از معایب این معماری پایگاهدادهای است. از برخی پایگاههای مشهور میتوان MongoDB، Cassandra و Redis را نام برد.
معماری بدون سرور یا Serverless Architecture به مدلی اشاره دارد که در آن توسعهدهندگان بدون نگرانی از مدیریت سرورها، کد نوشته و عملکردهایشان را اجرا میکنند. در این مدل، ابرسرویسها (مانند AWS Lambda یا Azure Functions) برنامه را در واکنش به رویدادها یا درخواستهای مشتری اجرا میکنند. مزایای این معماری شامل هزینههای بهینه شده، انعطافپذیری بالا و اجرای کد در مقیاس خودکار میباشد. از معایب ممکن، مشکلات احتمالی در مدیریت و نظارت متقابل و وابستگی به سرویسهای خاص ابرسرویس اشاره دارد.
متدولوژی DDD یک راه توسعه نرمافزار است که تمرکز خود را بر روی مدلسازی و تفکر استراتژیک درباره دامنههای کسبوکار میگذارد. این رویکرد از زبان مشترک بین توسعهدهندگان و صاحبان کسبوکار (Ubiquitous Language) برای توصیف دقیق دامنهها استفاده میکند. مفاهیمی مانند Aggregate، Entity، Repository و Service به تیم توسعه در ایجاد مدلهایی با انعطافپذیری بالا کمک میکنند. DDD توسعهدهندگان را به تمرکز بر مشکلات کسبوکار و طراحی مدلهای بهینه برای حل این مشکلات تشویق میکند.
معماری Hexagonal Architecture که به Ports and Adapters و Ports and Hexagons شناخته میشود، یک الگوی معماری نرمافزار است که تمرکز آن بر تفکیک لایهها و افزایش انعطافپذیری است. در این مدل، یک ششضلعی نمایانگر هسته برنامه است که خدمات دامنه را اجرا کرده، ورودی و خروجیها از طریق درگاهها (Ports) انجام شده که نقطههای اتصال با سایر لایهها (مانند واسطهای کاربری یا دیگر خدمات) هستند؛ آداپتورها (Adapters) به ششضلعی وصل شده و وظیفه تبدیل ورودی و خروجی را برعهده دارند، تا ششضلعی از جزئیات پیادهسازی مستقل باشد. این الگو از بابت جدا بودن لایهها، قابلیت تست و توسعه را ارتقاء میدهد.
ثبت وقایع یا Event Sourcing یک الگوی ذخیرهسازی داده است که در آن وضعیت سیستم توسط یک دنبالهای از رویدادها (Events) ثبت میشود. هر وقوع (Event) به عنوان یک نمایانگر تغییری در وضعیت سیستم در زمان است. برخلاف مدل ذخیرهسازی متداول که وضعیت کنونی را ذخیره میکند، Event Sourcing امکان بازیابی وضعیت هر زمانه ممکن را فراهم میکند. از مزایا میتوان به تاریخچه کامل تغییرات، امکان بازیابی دقیق وضعیت سیستم در زمان مشخص و امکان آزمون و پیشبینی بهتر اشاره داشت. اما از معایب احتمالی میتوان پیچیدگی در پیادهسازی و مدیریت حجم زیاد دادهها را نام برد. Event Sourcing معمولاً با CQRS (Command Query Responsibility Segregation) که یک الگوی معماری به جهت حذف دستور (Query) و استعلام (Command) است، ترکیب میشود.
بسترهای Low-Code محیطهای توسعهای هستند که اجازه داده تا برنامهها با حداقل کدنویسی و تلاش دستی ایجاد شوند. این پلتفرمها از رابطهای بصری، اجزاء پیشساخته، و قابلیت کشیدن و رها کردن (drag-and-drop) برای سادهسازی فرآیند توسعه برنامه بهرهمند هستند. کاربران با تجربههای فنی مختلف، از جمله افراد با تجربه کدنویسی محدود، میتوانند از بسترهای Low-Code برای سریع ایجاد و راهاندازی برنامهها استفاده کنند. از مزایا و معایب احتمالی در این بستر میتوان به موارد ذیل اشاره داشت:
1. فرآیند توسعه برنامه را شتاب میدهد و زمان را کاهش میدهد.
2. افراد با تجربیات مختلف میتوانند در توسعه برنامه شرکت کنند.
3. نیاز به کدنویسی و مهارتهای فنی گسترده را کاهش داده و احتمالاً هزینه توسعه را کاهش میدهد.
4. ممکن است برای برنامههای پیچیده یا ویژه که نیاز به سفارشیسازی گسترده دارند، مناسب نباشد.
5. برخی از بسترهای Low-Code ممکن است با چالشهایی در مقیاس بزرگ مواجه شوند.
6. کاربران ممکن است محدودیتهایی را در انتقال برنامهها از یک بسترخاص Low-Code به بستر دیگری را تجربه کنند.
از انواع معروف Low-Code میتوان OutSystems، Mendix و Microsoft Power Apps را نام برد.
سیستمهای مدیریت فرآیندهای کسب و کار (Business Process Management Systems) نرمافزارهایی هستند که به سازمانها این امکان را میدهند تا فرآیندهای کسب و کار خود را به صورت مؤثرتر و بهینهتر مدیریت کنند. این سیستمها از ابزارها و فناوریهای متنوعی برای مدیریت، نظارت و بهینهسازی فرآیندها استفاده کرده و قدرت تصمیمگیری مدیران برای بحث مهندسی مجدد (BPR) و یا بهبود (BPI) را افزایش میدهند. موارد زیر به مزایا و معایب اشاره دارد:
1. افزایش بهرهوری و بهبود عملکرد فرآیندهای کسب و کار.
2. امکان تغییرات سریع در فرآیندها و ساختار سازمانی.
3. ارائه اطلاعات دقیق در مورد عملکرد فرآیندها و امکان پیشبینی بهبودهای ضروری.
4. نیاز به اجرای پروژههای پیچیده و گاهی زمانبر.
5. مداومت در تغییر نیازها و فرآیندهای کسب و کار.
6. ارائه آموزش به کاربران برای استفاده مؤثر از سیستم.
صف پیام یا Message Queue یک سیستم نرمافزاری است که برای ارسال و دریافت پیامها بین اجزاء یا برنامهها در سیستمهای توزیعشده به کار میرود. در این سیستم، پیامها به صورت ترتیبی و با تاخیرهای کم بین اجزاء منتقل میشوند.از این سیستم برای برای ارتباط بین بخشهای مختلف یک سیستم یا بین سیستمهای متفاوت، افزایش قابلیت اطمینان و تحمل خطا در معماریهای توزیعشده و برای ارتباط بین میکروسرویسها در معماری مبتنی بر سرویس به کار میرود. از مزایا و معایب این سیستم نیز میتوان به موارد زیر اشاره داشت:
1. جداکردن فرستنده و گیرنده پیام، که اجازه افزایش انعطافپذیری و اصلاحپذیری را میدهد.
2. امکان بازیابی اطلاعات پس از خطا یا قطعی را فراهم میکند.
3. امکان انتقال پیامها در محیطهای توزیعشده را فراهم میکند.
4. مدیریت و نگهداری صفها و پیامها ممکن است پیچیده باشد.
5. در صورت حجم بالای پیامها، ممکن است مشکلات مدیریتی و امنیتی پیش آید.
6. اطمینان از تطابق نسخه پیامدهنده و گیرنده در مورد فرمت پیامها.
ترتیب کننده کانتینر به معماری و اداره کردن برنامههای مبتنی بر کانتینر، مثل Docker، بر روی یک محیط توزیعشده متمرکز است. این سیستمها اجازه میدهند تا مدیریت و کنترل گستردهتری بر روی کانتینرها و برنامههای مختلف اعمال شود. از این رویکرد در توسعه و کوچکشدن خودکار تعداد کانتینرها بر اساس بار کاری، مدیریت برنامههایی که از میکروسرویسها تشکیل شدهاند را به صورت همگن و اجازه توزیع و مدیریت برنامه در بین چندین محیط و ماشین مجاور بهرهگیری میشود. مزایا و معیاب این رویکرد متشکل از موارد ذیل میشود:
1. افزایش سطح انعطافپذیری و اداره کانتینرها و برنامهها.
2. امکان تغییر اندازه سیستم به سرعت و با اتوماسیون.
3. توزیع بهینه بار کاری بین کانتینرها.
4. پیکربندی و مدیریت ترتیبدهنده نیازمند تجربه مدیریتی میباشد.
5. ممکن است نیاز به منابع سختافزاری بیشتری برای اجرای ترتیبدهنده وجود داشته باشد.
6. نیاز به آموزش تیمها برای استفاده بهینه از این تکنولوژی.
ابزارهای مدیریت لاگ برای جمعآوری، ذخیره، جستجو، و تحلیل لاگهای سیستمی و برنامهها مورد استفاده قرار میگیرند. این ابزارها اطلاعات ارزشمندی از عملکرد و وضعیت سیستم فراهم میکنند. پیدا کردن و رفع مشکلات سیستم و برنامه از طریق لاگهای تولید شده، مانیتورینگ عملکرد سیستم و بررسی وضعیت به صورت زمان واقعی و استخراج دادههای مربوط به زمان اجرا، خطاها، و کارایی را میتوان از انواع کاربرد این نوع ابزارها نام برد.
مزایا و معایب:
1. امکان جستجو و پیگیری لاگها برای تحلیل و ارتقاء عملکرد.
2. اطلاعات لاگ در یک مکان متمرکز جمعآوری میشوند که انتقال دادهها را آسانتر میکند.
3. امکان شناسایی الگوها و حوادث ناپیشبینی در لاگها.
4. مدیریت و ذخیره لاگهای حجیم میتواند چالشهای مدیریتی و مالی ایجاد کند.
5. انجام عملیات جستجو و تجزیه و تحلیل پیچیده بر روی حجم بالای دادهها.
6. اطلاعات حساس در لاگها نیاز به راهکارهای امنیتی دارد.
ابزارهای نظارت (Monitoring tools) برای نظارت بر سیستمها و برنامهها به کار میروند. این ابزارها اطلاعات مفیدی از عملکرد سیستم، میزان منابع مصرفی، و وضعیت مختلف را جمعآوری و نمایش میدهند. نظارت بر عملکرد سیستم و اجزاء مختلف آن، اطلاعات به موقع برای شناسایی و رفع مشکلات و خطاها و برنامهریزی منابع بر اساس الگوهای مصرف و تغییرات درخواستها از انواع خدماتی هستند که این دسته از ابزارهای نظارتی ارائه میدهند. مزایا و چالشهای این نوع از سیستمها را میتوان به شرح ذیل بیان نمود:
1. امکان دریافت اطلاعات به صورت فوری در مورد تغییرات و مشکلات سیستم.
2. قابلیت تحلیل و گزارش گیری پیشرفته بر روی دادههای مانیتورینگ.
3. برخی از ابزارها از تکنیکهای یادگیری ماشین برای پیشبینی مشکلات استفاده میکنند.
4. پیکربندی و راهاندازی ابزارها ممکن است پیچیده باشد.
5. ممکن است نیاز به منابع سختافزاری و نرمافزاری برای اجرای ابزارهای مانیتورینگ باشد.
6. مدیریت اطلاعات حساس و مواردی مرتبط با حریم خصوصی.
تجزیه و تحلیل کد ثابت (Static) یک فعالیت در توسعه نرمافزار است که در آن کد منبع یک برنامه مورد بررسی قرار میگیرد تا اشکالات احتمالی، نقضهای اصول برنامه نویسی، و مسائل امنیتی شناسایی شود. بهرهمندی از این فعالیت را میتوان در شناسایی خطاها و اشکالات مرتبط با ساختار کد، شناسایی و رفع آسیبپذیریها و مسائل امنیتی در کد منبع و اطمینان از اینکه کد تا حد ممکن با اصول و استانداردهای برنامه نویسی سازگار است، خلاصه نمود.
مزایا و چالشها:
1. امکان شناسایی خطاها در مراحل اولیه توسعه.
2. شناسایی آسیبپذیریها و نقضهای امنیتی پیش از اجرای برنامه.
3. کاهش زمان و هزینه تعمیر خطاها با شناسایی آنها در مراحل ابتدایی.
4. نیاز به پیکربندی صحیح ابزارهای تجزیه و تحلیل کد برای جلوگیری از اطلاعات غلط.
5. بررسی و تجزیه و تحلیل کد ممکن است زمانبر باشد، خصوصاً برای پروژههای بزرگ.
6. نیاز به دانش و تجربه برنامهنویسی برای درست تفسیر و رفع اشکالات یافته.
تقدیم به مادر عزیزم که کمتر از 40 روز گذشته جمع ما را ترک نمود و داغ سنگینی را بر دوش ما تحمیل کرد.
امیرمحمد ناطقی
کارشناسی ارشد فناوری اطلاعات/ معماری سازمانی
درس معماری نرمافزار؛ به تدریس جناب آقای دکتر صادق علیاکبری
دانشکده مهندسی و علوم کامپیوتر / دانشگاه شهید بهشتی
نیمسال تحصیلی نخست 1403-1402