بررسی موضوعات پایه‌ای در حوزه توسعه نرم‌افزار

در این پست با موضوعات پایه‌ای حوزه توسعه نرم‌افزار آشنا میشویم.Modular Monolithicروشی است که در آن بخش‌های مختلف یک سرویس به ماژول‌های مستقل تبدیل میشوند که همه اجزا مورد نیاز هر ماژول در آن وجود دارد ولی همچنان درون یک سرویس هستند و یک بستر را به اشتراک میگذارند. این روش بین حالت Monolithic و حالت Microservice قرار میگیرد. در حالت Monolith همه اجزا در کنار هم هستند و به عنوان یک جز شناخته میشود. در حالت Microservice، بخش‌های مختلف یک سرویس ممکن است به سرویس‌های کوچکتر شکسته شوند. مثلا یک نرم‌افزار فروشگاه میتواند به ماژول‌های مشتریان، سفارشات، و محصولات تقسیم شود. از خوبی های Modular Monolithic میتوان به تفکیک کار و اجازه برای کار کردن موازی بر روی بخش‌های نرم‌افزار اشاره کرد. یکی از معایب این روش نیز نبود قابلیت استفاده از تکنولوژی‌های مختلف برای ماژول‌های مختلف است.AWSیک سرویس ابری است که خدمات مختلفی از جمله Iaas، Paas، Saas ارائه میکند. یعنی شما میتواند به صورت pay as you go و با کمترین هزینه مدیریتی خدمات زیرساختی مثل حافظه، مموری، قدرت پردازشی یا خدمات پلتفرمی مثل یک سیستم ویندوزی یا خدمات نرم‌افزاری مثل ایمیل دریافت کنید. از معروف‌ترین خدمات AWS میتوان به سرویس EC2 اشاره کرد که یک فضای محاسباتی ابری به شما ارائه داده میشود که میتوان بر اساس نیاز از پلن‌های مختلف آن استفاده کرد و منعطف بودن آن تغییر منابع سرویس را در هر لحظه ممکن میکند.API-first Approachدر این روش API به عنوان بلاک‌های اصلی سازنده یک نرم‌افزار شناخته میشود و قبل از بخش‌های دیگر توسعه داده میشود. با ساخت API در قدم اول مطمئن میشویم که ارتباطات بین بخش‌های مختلف نرم‌افزار به صورت درونی و بیرونی به درستی برقرار میشود. همچنین در این روش API ها دارای ارزش هستند و لایه بیزینس درون آن‌ها وجود دارد. این مدل توسعه در مقابل مدل‌های قدیمی قرار میگیرد که در آن بعد از ساخت نرم‌افزار API صرفا جهت برقراری ارتباط استفاده میشود.NoSQL Databasesنوعی از دیتابیس‌ها هستند که برای ذخیره داده با اسکیما منعطف استفاده میشوند. داده به صورت کلید-مقدار، سند، و گراف ذخیره میشود. از ویژگی‌های این مدل دیتابیس‌ها میتوان به منعطف بودن، مقایس‌پذیری، و عملکرد بالا اشاره کرد. یکی از معروف‌ترین دیتابیس‌های این دسته MongoDB است.Serverless Architectureدر این روش نرم‌افزار بدون نیاز به مدیریت زیرساخت، ساخته و تولید میشود. یعنی تمرکز تیم توسعه بر روی بیزینس و هسته اصلی قرار میگیرد و نگه‌داری از دیتابیس و مقایس کردن نرم‌افزار به عهده سرویس ارائه دهنده زیرساخت می‌باشد. با توسعه نرم‌افزار به صورت serverless وقت زیادی صرفه جویی میشود چرا که انجام کارهای زیرساخت نیازمند وقت و حتی نیروی اختصاصی است. در این مدل توسعه منابع و هزینه‌ها صرف نیازمندی‌های کسب و کار میشود و با پرداخت هزینه کمی به سرویس ابری میتوان از بابت زیرساخت مطمئن بود. یکی از ارائه کننده‌های serverless architecture سرویس AWS است که خدمات متنوعی از جمله AWS Lambda ارائه میکند.Domain Driven Designروشی برای توسعه نرم‌افزار است که در آن کسب و کار به دامنه‌های معنا داری تعریف میشود. هر کدام از این دامنه‌ها مدل‌ها و منطق خود را دارند و به تنهای قابل استفاده هستند. اگرچه این به معنی ایزوله بودن کامل هر دامنه نیست بلکه در دامنه‌ها ممکن است مواردی مشابه وجود داشته باشد. مثلا در یک سامانه خرید آنلاین کالا بخش پشتیبانی و فروش وجود دارد. هر کدام از این‌ها میتواند یک دامنه باشد. مفاهیم مشتری یا کالا در هر دو یکسان است. با تعریف دامنه‌ها در توسعه نرم‌افزار به یک زبان مشترک بین بیزینس و تیم توسعه میرسیم که از کلمات یکسان برای توصیف اجزا نرم‌افزار استفاده میکنیم.Hexagonal architectureیکی از معماری‌های توسعه نرم‌افزار می‌باشد که در آن منطق و قواعد کسب و کار در هسته نرم‌افزار قرار میگیرد که از همه بخش‌های دیگر نرم‌افزار ایزوله است. همچنین port هایی وجود دارد تا رفتارهای هسته را به بیرون به صورت انتزاعی و از طریق interface ها ارائه کنند. مورد دیگر adapter ها است که برای اتصال کامپوننت‌هایی مانند دیتابیس، درگاه بانکی، اس‌ام‌اس، و غیره استفاده میشود و عملا نقش مترجم را بازی میکنند. یعنی درخواست‌های خارجی را به داده قابل فهم برای هسته ترجمه میکنند و برعکس.Event Sourcingدر این روش وضعیت سیستم به صورت مجموعه‌ای از رخدادها ذخیره میشود. این رخدادها غیرقابل تغییر و نمایانگر یک اقدام در سیستم هستند. با داشتن لاگ این رخداد میتوان وضعیت سیستم را در هر لحظه از زمان ایجاد کرد. همچنین این روش مقایس‌پذیر است چون میتوان دسترسی‌های خواندن و نوشتن را جدا کرد.Low code platformsپلتفرم‌هایی برای ساخت نرم‌افزار هستند که نیاز به کدنویسی ساده و خیلی کم دارند. اکثر این پلتفرم‌ها دارای رابط کاربری هستند و به صورت drag and drop عمل میکنند. یعنی یک پلتفرم با کامپوننت‌های از قبل آماده وجود دارد و شما صرفا با انتخاب کامپوننت‌های مختلف نرم‌افزار را درست میکنید. البته ممکن است در بعضی جاها برای اتصال بخش‌های مختلف نیاز به برنامه‌نویسی نیز باشد. از نمونه این پلتفرم‌ها به wix.com میتوان اشاره کرد.Business Process Management Systems (BPMS)نرم‌افزای است که پروسه‌های کسب و کار را مدیریت میکند. یعنی شما با استفاده از BPMS میتوانید تمامی رویه‌ها و پروسه‌هایی که درون سیستم وجود دارد از طریق دیاگرام و فلوچارت ایجاد کنید و در یک سامانه مدیریت کنید. همچنین این سیستم به خوبی با دیگر نرم‌افزارها متصل میشود تا بتواند یک سامانه یکپارچه را ایجاد کند. باید به این نکته نیز اشاره کرد که سیستم‌های BPMS با تعریف یکسری قوانین از قبل نوشته شده، جلوی هرگونه تداخل و یا اقدام غیرقانونی نیز میگیرند.Message Queue (such as Kafka and RabbitMQ)یکی از روش‌های ارتباطات بین بخش‌های مختلف نرم‌افزار است که در آن قسمت‌های مختلف از طریق گذاشتن پیام‌های غیرهمزمان با یکدیگر ارتباط برقرار میکنند. این کار به تفکیک سیستم به بخش‌های کوچکتر کمک میکند چون که به بخش‌های مختلف اجازه میدهد تا در هر زمانی که نیاز شد از پیام فرستاده شده توسط یک بخش دیگر استفاده کنند و نیاز به تعامل لحظه‌ای ندارند.مدل‌های مختلفی برای پیاده‌سازی صف پیام وجود دارد اما میتوان به روش های نقطه به نقطه و ارسال کننده/دریافت کننده اشاره کرد. در روش نقطه به نقطه یک فرستنده و یک گیرنده حتما دخیل هستند. اما در روش ارسال کننده/دریافت کننده پیام فرستاده میتواند چندین دریافت کننده داشته باشد.از نکات مهم این قسمت میتوان به تضمین ارسال نیز اشاره کرد. بعضی از صف‌های پیام به تضمین میکنند که پیام ارسال شده حتما به دست گیرنده میرسد اما در بعضی نیز به صورت fire and forget هستند. یعنی بعد از ارسال پیام تضمینی برای رسیدن حتمی به گیرنده نیست و بعد از ارسال پیام از صف پاک میشود.Container orchestration (such as Kubernetes)برای توضیح این مورد نیاز هست که بدانم container چیست. Container یک جزه مستقل و پورتبل است که نرم‌افزار و نیازمندی‌های آن را درون خود دارد تا قابلیت نصب آسان بر روی زیرساخت‌های مختلف را داشته باشد. Container orchestration یک سرویس است که وظیفه مدیریت کانتینرها را به عهده دارد تا به درستی ایجاد شوند و به صورت مفید از منابع استفاده کنند. همچنین این سرویس شامل یک زیرساخت شبکه‌ای می‌باشد که ترافیک را از خارج به کانتینر متناسب و بالعکس به خارج منتقل میکند. همچنین از طریق این سرویس میتوان کانتینرها را مانیتور کرد و همینطور از لحاظ سکیوریتی اقداماتی را انجام داد.برای اینکه یک اپلیکیشن بر روی یک سرویس ابری نصب شود به یک منیفست ابری به نام pod نگاشت میشود. همچنین pod ها زیرمجموعه منیفست دیگری به اسم deployment هستند. ارتباط با دیپلویمنت از طریق منیفست Service انجام میشود. همچنین ترافیک خارج از کلاستر نیز از طریق route به داخل و به سرویس آن کانتینر منتقل میشود. البته که این ماجرا مفصل تر است اما به صورت خلاصه و با نگاه کلی داستان بدین شکل است.Log Management Tools (such as ELK)ابزاری برای مدیریت لاگ‌های نرم‌‌افزار است که لاگ‌ها در یک سیستم یکپارچه برای بررسی اتفاقات و رخدادهای سیستم ذخیره میشوند. اگر الستیک را به عنوان نمونه ابزار در نظر بگیریم، لاگ‌ها از بخش‌های مختلف سیستم وارد الستیک میشوند و سپس طبق الگوهای خاصی که کاربر آن‌ها را تعریف میکنند اطلاعات مفید از این لاگ‌ها استخراج و در ایندکس‌هایی ذخیره میشوند. ایندکس کردن این لاگ‌ها به دسترسی سریع‌تر در آینده و همچنین کوئری زدن بر روی آن‌ها کمک میکند.از طریق الستیک میتوان داشبوردهای مختلفی را از لاگ‌های نرم‌افزار ایجاد کرد. مثلا تعداد درخواست های موفق در یک روز میتواند موردی باشد که از لاگ‌ها استخراج شود و به در داشبوردها وجود داشته باشد. همچنین با تعریف دیگر بخش‌ها در داشبورد، میتوان از وضعیت سیستم در یک نگاه مطلع شد.همچنین میتوان سیستم تعریف کرد در صورتی که بعضی حالات خاص رخ داد به ما از طریق پلتفرم‌های پیام‌رسانی اطلاع داده شود.Monitoring tools (such as Prometheus)ابزاری است مانیتور کردن سرویس‌های مختلف نرم‌افزاری است که به خوبی در محیط‌های ابری مثل Kubernetes عمل میکند. نحوه عملکرد بدین صورت است که هر نرم‌افزار برای خود یکسری متریک تعریف میکند. هر متریک نمایانگر یک وضعیت از سیستم است. مثلا تعداد درخواست‌های در حال انجام، یا میزان مصرف مموری سیستم، و غیره. سپس این متریک‌ها در یک خروجی به همراه زمان ثبت نوشته میشوند. پرومتئوس در بازه‌های زمانی مشخص این داده‌ را جمع‌آوری و در خود ذخیره میکند. حال قابلیت کوئری زدن و ساخت داشبورد بر روی این دیتا وجود دارد. میتوان از طریق آن نرخ گیری کرد یا نمودار خطی دیتا را رسم کرد. پرومتئوس دیاگرام‌های مختلفی را پشتیبانی میکند که متناسب با داده میتوان آن‌ها را انتخاب کرد.همچنین دارای یک سیستم هشدار دهی است تا در صورتی که یک متریک دارای شرایط خاصی بود هشدار داده و شخصی را مطلع کند تا جلوی حادثه گرفته شود.Static Code Analysis (such as SonarQube)روشی است که در آن بدون نیاز به اجرا، کد بررسی میشود تا باگ‌های احتمالی و آسیب پذیری‌ها کشف شوند. این روش کمک میکند تا پروسه بررسی کد به صورت خودکار انجام شود و همینطور کد نوشته با استاندارد‌های صنعت مقایسه شود و در صورت وجود ایراد امنیتی، سینتکسی و غیره، شناسایی و برطرف شوند. بخاطر خودکار بودن این پروسه میتوان آن را در رویه CI نرم افزار قرار داد تا هر زمان که تغییری بر روی سیستم اعمال میشود به صورت اتوماتیک کد بررسی شود.با تشکر از اینکه مطالعه کردید.