معرفی پروژه
معماری میکروسرویس ها به عنوان یکی از رویکردهای مدرن در طراحی و پیاده سازی سیستم های نرم افزاری، تحولی چشمگیر در نحوه ساخت و نگه داری سامانه های مقیاس پذیر و قابل توسعه ایجاد کرده است. در این سبک معماری، سیستم به مجموعهای از سرویس های مستقل و کوچک تقسیم می شود که هر کدام مسئول یک قابلیت مشخص تجاری یا فنی هستند. این استقلال باعث می شود توسعه، استقرار و نگهداری هر سرویس به صورت جداگانه امکان پذیر باشد و وابستگی به تیم های مرکزی کاهش یابد. با وجود مزایای مطرح شده، معماری میکروسرویس ها هم زمان با افزایش انعطاف پذیری، پیچیدگی های جدیدی را به سیستم تحمیل می کند. این معماری نیازمند هماهنگی دقیق میان سرویس ها، کنترل دقیق وابستگی ها، مدیریت صحیح پیکربندی و حفظ انسجام در سطح کلان معماری است. بدون وجود نظارت پیوسته، احتمال بروز مشکلاتی نظیر تکرار کد در سرویس های مختلف، ایجاد وابستگی های دو طرفه، کاهش ماژولاریتی، دشواری در تست و اشکال زدایی و در نهایت افت کلی کیفیت، وجود دارد.
هدف اصلی این پروژه، تحلیل کیفیت معماری یک سامانه میکروسرویسی با اتکا به روش تحلیل ایستا است؛ روشی که بدون نیاز به اجرای کد، از طریق بررسی ساختار، وابستگی ها، قواعد کدنویسی و متادیتاها، تصویر دقیقی از وضعیت کیفیت ارائه می دهد.
انتخاب ابزار تحلیل ایستا
برای اجرای تحلیل ایستا، ابزار SonarQube به عنوان پلتفرم ارزیابی انتخاب شد. انتخاب این ابزار بر اساس ارزیابی معیارهایی چون قدرت تحلیلی بالا، انعطاف پذیری، پشتیبانی از زبان های برنامه نویسی مختلف، قابلیت تعریف و تنظیم قوانین دلخواه، ارائه داشبورد گرافیکی قابل فهم و مهم تر از همه، متن باز بودن نسخهی Community آن صورت گرفت.
SonarQube یک بستر جامع برای تحلیل کیفیت کد از منظرهای مختلف فراهم می آورد. این ابزار همچنین قابلیت اتصال به خطوط CI/CD، پشتیبانی از افزونه های متنوع و تولید گزارش های قابل استناد را دارد که آن را به گزینهای ایده آل برای تحلیل معماری تبدیل کرده است.

اتصال پروژه به SonarQube
برای اجرای تحلیل، یک پروژه واقعی با معماری میکروسرویسی ایجاد شد. این پروژه، یک سامانه فروشگاه اینترنتی مبتنی بر معماری میکروسرویس است که با استفاده از ابزار V0 تولید شده است. این پروژه شامل پنج سرویس مستقل است که هرکدام در یک زیرپوشه مجزا قرار دارند و به یک مسئولیت مشخص در سیستم پاسخ می دهند:
api-gateway: مدیریت درخواست های ورودی و احراز هویت
user-service: ثبت نام و ورود کاربران، مدیریت پروفایل
product-service: مدیریت کالاها، موجودی و دسته بندی ها
order-service: پردازش سفارش ها و ارتباط با موجودی
notification-service: ارسال اعلان های ایمیلی از طریق صف
پیام

هر سرویس به صورت مستقل طراحی شده و از Express.js به عنوان فریم ورک استفاده می کند. همچنین برای ارتباط بین سرویسی از RabbitMQ بهره گرفته شده است. هر سرویس شامل مسیر server.js و پایگاه داده مجزای خود است.
کد کامل پروژه به صورت عمومی در مخزن GitHub زیر در دسترس است:
https://github.com/zgasiaee/microservices-ecommerce.git
برای اتصال این پروژه به SonarQube، ابتدا سرور محلی SonarQube راه اندازی شد و یک توکن احراز هویت از پنل کاربری آن دریافت گردید. سپس فایل پیکربندی sonar-project.properties در ریشه پروژه ایجاد شد و مشخصات پایهای پروژه در آن وارد گردید. سپس با اجرای دستور sonar-scanner در مسیر اصلی پروژه، فرآیند تحلیل ایستا آغاز شد. این فرآیند بدون نیاز به اجرای پروژه، تمامی فایل های کد را بررسی و نتایج آن را به سرور SonarQube ارسال کرد. پس از اتمام اسکن، نتایج در داشبورد SonarQube قابل مشاهده بود.

تحلیل داشبورد
داشبورد SonarQube، نمایی خلاصه از وضعیت کیفیت پروژه را در محورهای اصلی همچون امنیت (Security)، قابلیت اطمینان (Reliability)، نگه داری پذیری (Maintainability)، میزان تکرار کد (Duplications)، پوشش تست (Coverage)، نقاط حساس امنیتی (Security Hotspots) و خطاهای پذیرفته شده (Accepted Issues) ارائه می دهد. برای هر شاخص رتبهای بین A تا E اختصاص داده و با نمایش تعداد خطاها در هر حوزه، تصویری شفاف از وضعیت کلی پروژه ترسیم می کند. نتایج به دست آمده به شرح زیر قابل بررسی است:
۱. امنیت (رتبه A، بدون آسیب پذیری): این بخش وضعیت خوبی دارد و نشان می دهد که تحلیل ایستا در کد پروژه هیچ آسیب پذیری امنیتی آشکار یا تهدیدهای جدی گزارش نکرده است. گرچه تعدادی Security Hotspot در پروژه شناسایی شده، اما این موارد برای رتبه بندی نهایی در معیار امنیت لحاظ نمی شوند.
۲. قابلیت اطمینان (۱۰ مورد، رتبه C): رتبه بندی صرفا به تعداد خطا بستگی ندارد، بلکه شدت و نوع آن ها نیز بسیار مهم است. در این بخش، تمام مشکلات با شدت medium بودهاند و چنین خطاهایی ممکن است باعث بروز رفتارهای نادرست یا ناپایداری در زمان اجرا شوند بنابراین تأثیر منفی شدیدی بر قابلیت اطمینان دارند.
۳. نگه داری پذیری (۴ مورد، رتبه A): خطاهای این بخش از نوع Code Smell هستند. این خطاها بیشتر نشان دهنده ضعف هایی در طراحی، خوانایی و ساختار کد هستند که تأثیر بلندمدت دارند، اما باعث ایجاد خطای فوری در اجرای سیستم نمی شوند.
۴. خطاهای پذیرفته شده (۰ مورد): خطاهایی که معتبر هستند اما توسعه دهنده به صورت آگاهانه تصمیم گرفته آن ها را اصلاح نکند. این قابلیت برای مستندسازی تصمیم های فنی مفید است و امکان مدیریت منعطف تر خطاها را فراهم می کند. در پروژهی فعلی، تعداد این خطاها صفر است، که نشان می دهد تیم توسعه هیچ یک از مشکلات شناسایی شده را به صورت «پذیرفته شده» علامت گذاری نکرده و همهی موارد همچنان به عنوان خطاهای باز (Open Issues) باقی ماندهاند.
۵. پوشش تست (۰٪): هیچ فایل تستی شناسایی نشده و پوشش کد توسط Unit Test صفر درصد گزارش شده است. این نشان دهندهی یک ضعف جدی در فرآیند تضمین کیفیت و نیاز فوری به افزودن تست های خودکار است، چرا که نبود تست می تواند مانع از شناسایی به موقع خطاها و بررسی رفتار سیستم در موقعیت های مختلف شود.
۶. درصد کد تکراری (۱۶.۸٪ از حدود ۱۵۰۰ خط کد): مقدار بالای تکرار کد می تواند نشانهی طراحی غیربهینه یا نبود سازوکارهای مناسب برای استفاده مجدد از کد (مثل ماژول های مشترک) باشد. این موضوع نگه داری کد را دشوار می کند، احتمال بروز خطا را افزایش می دهد و توسعهی آینده را پرهزینه تر می سازد.
۷. نقاط حساس امنیتی (۱۱ مورد، رتبه E): بخش هایی از کد که از دیدگاه امنیتی مشکوک یا حساس تلقی می شوند، اما برای قضاوت نهایی نیاز به بازبینی توسعه دهنده دارند. این بخش با رتبه E مشخص شده که به معنای نیاز فوری به بازنگری است، هرچند که امنیت پروژه را تحت تأثیر قرار نمی دهد مگر اینکه تبدیل به Vulnerability شوند.
در مجموع، پروژه نمرهی خوبی دریافت کرده، اما وجود مشکلات با شدت بالا در بخش قابلیت اطمینان و نبود تست های خودکار نشان می دهد که هنوز برای رسیدن به سطح بالای کیفیت معماری، نیاز به بازنگری و اصلاح در برخی نواحی کد وجود دارد. همچنین درصد بالای تکرار کد می تواند یک زنگ خطر برای افزایش پیچیدگی در آینده باشد.


بخش Issues
ابزار SonarQube در مجموع ۱۴ مشکل را شناسایی کرده است. توزیع مشکلات به تفکیک نوع و شدت آن ها، کمک می کند تا نقاط بحرانی سیستم در تصمیم گیری های معماری مشخص شوند. خروجی تحلیل شامل داده هایی در قالب دسته های زیر بود:
۱. Reliability (قابلیت اطمینان): بیشتر خطاهای شناسایی شده در این دسته قرار دارند. این خطاها دارای شدت متوسط (Medium) هستند، ولی تعداد زیادشان می تواند به مرور باعث افت قابلیت اطمینان سیستم شود. الگوهای تکرارشونده عبارتاند از:
نبودن تگ <title> در صفحات HTML
نبودن ویژگی های lang یا xml:lang در تگ <html>
این خطاها از دیدگاه عملکرد فنی ممکن است بی اهمیت به نظر برسند، اما نقش مهمی در دسترس پذیری، سازگاری با موتورهای جستجو (SEO) و تجربه کاربری دارند. به علاوه، این موارد در صورت عدم اصلاح، می توانند در ممیزی های امنیتی یا انطباق (compliance) تأثیر منفی داشته باشند.
۲. Maintainability (نگه داری پذیری): از پنج مشکل ثبت شده در این دسته، چهار مورد دارای شدت Medium و یک مورد دارای شدت Blocker است. الگوهای تکرارشونده عبارتاند از:
استفاده نکردن از Optional Chaining به جای ساختارهای شرطی پیچیده که مستقیما با خوانایی و سادگی کد مرتبط است.
عدم استفاده از کلیدواژه let/const در تعریف متغیر که با شدت Blocker شناسایی شده است. در صورت عدم تعریف صریح متغیر، احتمال ایجاد متغیر global و تغییرات ناخواسته در رفتار برنامه وجود دارد که این می تواند به مشکلات جدی در زمان اجرا منجر شود.
این دسته از خطاها از نظر نگه داری کد در آینده بسیار حیاتی هستند. اصلاح آن ها موجب ساده تر شدن فرآیند توسعه، افزایش قابلیت تست پذیری و کاهش احتمال بروز خطا در refactor های آینده خواهد شد.

این مشکلات قابل فیلتر شدن بر اساس نوع (کدام بُعد از کیفیت نرم افزار)، شدت (اولویت هر مشکل) و ویژگی های مرتبط با اصول Clean Code (کدام اصل از اصول کدنویسی تمیز) هستند؛ این امکان به تیم توسعه کمک می کند تا با اولویت بندی بهتری نسبت به اصلاح کد اقدام کند.

می توان هر مشکل را به یک عضو مشخص از تیم توسعه اختصاص داد. با انتخاب یک نفر از این لیست، مسئولیت رفع آن مشکل به او واگذار می شود. این قابلیت به مدیریت بهتر وظایف و تقسیم کار مؤثرتر در تیم کمک می کند.

وضعیت هر مشکل را می توان مشخص کرد. این ویژگی به تیم کمک می کند تا تصمیم گیری درباره هر Issue را مستند و قابل پیگیری کند. گزینه های موجود برای تغییر وضعیت به شرح زیر هستند:
Accept: مشکل شناسایی شده معتبر است، اما در حال حاضر قرار نیست اصلاح شود. این گزینه زمانی استفاده می شود که مشکل از نظر فنی درست باشد، اما فعلا قابل چشم پوشی یا بی اولویت تلقی شود.
False Positive: تحلیل SonarQube در این مورد اشتباه بوده و کدی که به عنوان مشکل علامت گذاری شده، در واقع مشکلی ندارد. انتخاب این گزینه باعث می شود که Issue از گزارش ها حذف شود و در تحلیل های بعدی نیز نادیده گرفته شود.
Confirm (deprecated): گزینهای قدیمی که دیگر کاربرد رسمی ندارد.
Fixed (deprecated): این گزینه نیز دیگر استفاده نمی شود؛ در عوض، اگر مشکلی در نسخه بعدی کد برطرف شده باشد، SonarQube آن را از لیست حذف می کند.

تحلیل یک نمونه Issue
SonarQube صرفا گزارش دهندهی خطا نیست، بلکه یک ابزار راهنما برای بهبود سبک کدنویسی و کیفیت معماری محسوب می شود. برای هر Issue شناسایی شده، یک توضیح دقیق از محل بروز مشکل، دلیل آنکه چرا این مشکل است و یک روش پیشنهادی برای اصلاح آن ارائه می دهد. یکی از خطاهای شناسایی شده را بررسی کردیم:

دلیل این هشدار، استفاده از ساختار شرطی قدیمی برای بررسی null/undefined بودن متغیر قبل از دسترسی به ویژگی آن است. این روش نه تنها طولانی است، بلکه می تواند منجر به بروز خطای منطقی و کاهش خوانایی کد شود.

SonarQube پیشنهاد داده که کد شرطی فعلی را با استفاده از عملگر .? بازنویسی کنیم. نتیجه همان است، اما کد ساده تر، ایمن تر و قابل فهم تر خواهد بود.

بخش Security Hotspots
ابزار SonarQube در مجموع ۱۱ مورد Security Hotspot با اولویت بررسی Low را شناسایی کرد. این موارد به عنوان نقاطی در کد مشخص شدهاند که اگرچه فعلا به عنوان آسیب پذیری جدی شناخته نمی شوند، اما ممکن است در شرایط خاص منجر به تهدید امنیتی شوند و نیاز به بازبینی دقیق توسط توسعه دهنده دارند. موارد شناسایی شده به شرح زیر هستند:
۱. استفاده از HTTP به جای HTTPS: ارسال داده ها، به ویژه اطلاعات حساس مانند نام کاربری و رمز عبور از طریق پروتکل HTTP، می تواند باعث آسیب پذیری در برابر حملات شود. با وجود اینکه در محیط توسعه ممکن است HTTP مورد استفاده قرار گیرد، بهتر است که در محیط عملیاتی، فقط HTTPS فعال باشد تا امنیت ارتباطات تضمین شود.
۲. پیکربندی ناایمن CORS: فعال سازی Cross-Origin Resource Sharing (CORS) بدون اعمال محدودیت، ممکن است امکان ارسال درخواست از دامنه های نامعتبر را فراهم کند و سطح حملات XSS یا سرقت داده را افزایش دهد. بنابراین لازم است که فهرست دامنه های مجاز، محدود و مشخص تعریف شود.
۳. عدم استفاده از Subresource Integrity (SRI): در چند فایل HTML، اسکریپت ها یا استایل های خارجی، بدون استفاده از ویژگی امنیتی integrity بارگذاری شدهاند. این ویژگی به مرورگر کمک می کند تا بررسی کند آیا فایل بارگذاری شده دقیقا همان نسخهای است که انتظار می رود و نبود آن، ممکن است منجر به بارگذاری کد آلوده از منابع خارجی شود.
۴. نمایش نسخه فریم ورک در هدر پاسخ ها: در برخی فایل ها، هدر X-Powered-By فعال است. این هدر می تواند نسخه دقیق فریم ورک یا پلتفرم را به کاربر اطلاع دهد. چنین اطلاعاتی ممکن است در حملات هدفمند مورد سوء استفاده قرار گیرد و توصیه می شود این هدر غیرفعال شود.
تحلیل یک نمونه Security Hotspots
یکی از Security Hotspots های شناسایی شده را بررسی کردیم:

استفاده از منابع خارجی بدون بررسی صحت آن ها، ممکن است منجر به اجرای کد مخرب شود. اگر سرور میزبان فایل آلوده شود یا فایل به صورت عمدی تغییر داده شود، کد آلوده به سادگی در مرورگر کاربران اجرا خواهد شد. در سمت سرور نیز، بارگذاری اسکریپت هایی با پیکربندی ناایمن ممکن است منجر به دسترسی غیرمجاز به سیستم یا شبکه شود. SonarQube هشدار می دهد که استفاده از HTTPS انتقال امن را تضمین می کند نه صحت فایل دریافتی را.

برای ارزیابی این که آیا واقعا این مورد خطرناک است، باید پرسید آیا فایل خارجی، کدی اجرایی است و می تواند روی رفتار برنامه تأثیر بگذارد؟

پیشنهاد SonarQube استفاده از ویژگی integrity همراه با الگوریتم رمزگذاری امن (مثل SHA384) برای بررسی صحت فایل است.

بخش Rules
در این بخش، تمامی قوانین تحلیل ایستا که SonarQube برای شناسایی مشکلات در کد اعمال می کند، فهرست شدهاند. این قوانین پایه و اساس تحلیل های انجام شده هستند و شامل قوانین مربوط به امنیت، نگه داری پذیری و قابلیت اطمینان هستند.
امکان فیلتر کردن قوانین بر اساس زبان برنامه نویسی وجود دارد. به عنوان مثال، با انتخاب زبان JavaScript، می توان لیستی شامل تمام ۴۰۷ قانون تعریف شده برای این زبان را مشاهده کرد. این ویژگی به توسعه دهندگان کمک می کند تا با معیارهایی که ابزار تحلیلگر برای شناسایی مشکلات استفاده می کند، آشنا شوند و نقش مؤثری در پیشگیری از تکرار خطاها و ارتقای کیفیت کلی پروژه ایفا می کند.

بخش Measures
داده های این بخش، دید عددی و دقیق تری نسبت به سلامت معماری پروژه ارائه می دهند. این شاخص ها به خصوص برای تحلیل نگه داری پذیری، پیچیدگی، مقیاس پذیری و امنیت ساختاری پروژه بسیار کلیدی اند. در این بخش، اطلاعات کلیدی به صورت نمودارهای حبابی (Bubble Charts) نمایش داده می شوند که اندازه حباب ها نشان دهنده تعداد مشکلات و رنگ آن ها نشان دهنده رتبه بندی آن معیار است. این نمودارها به توسعه دهنده کمک می کنند تا در یک نگاه متوجه شود که کدام بخش های پروژه بیشترین بار مشکلات را دارند یا از نظر نگه داری پذیری، امنیت و پیچیدگی، نیازمند توجه بیشتری هستند. در ادامه، هر یک از این نمودارها بررسی و تحلیل می شوند.
تحلیل نمودار Risk
همهی ماژول ها دارای پوشش صفر درصد هستند. این موضوع نشان دهندهی نبود تست های خودکار در پروژه است که از نظر معماری، ضعف قابل توجهی محسوب می شود و اطمینان از صحت عملکرد ماژول ها پس از اعمال تغییرات را دشوار می سازد. بدهی فنی برای ماژول ها بین ۵ تا ۶ دقیقه برآورد شده است؛ اگرچه این اعداد کم هستند، اما بیانگر نیاز به بازنگری و بهبود جزئی در کد هستند. از نظر امنیت و قابلیت اطمینان، وضعیت پروژه رضایت بخش است و ماژول ها موفق به کسب رتبه A و B شدهاند.

تحلیل نمودار Reliability
تنها یک ماژول دارای مشکلات Reliability است که دارای حدود ۲۰ خط کد می باشد. میزان تلاش لازم برای اصلاح این مشکلات حدود ۷ دقیقه تخمین زده شده است. این نشان دهندهی تمرکز مشکلات در یک واحد کوچک است. با توجه به رتبه C در این بخش، پروژه نیازمند توجه و بازسازی کد در این ماژول خاص است تا از بروز خطاهای عملکردی در زمان اجرا جلوگیری شود.

تحلیل نمودار Maintainability
تعدادی از ماژول ها با حجم کد متوسط (حدود 200 خط) دارای بدهی فنی حدود ۵ دقیقه هستند. بزرگ ترین حباب مربوط به فایلی با بیش از 300 خط کد است که بدهی فنی آن به حدود ۷ دقیقه می رسد و بیشترین تعداد مشکلات نگه داری پذیری در همین ماژول متمرکز شده است. این وضعیت نشان می دهد که نیاز به اعمال استانداردهای مشخص در سبک کدنویسی و طراحی معماری وجود دارد تا کیفیت کلی نگه داری پذیری پروژه ارتقا یابد.

تحلیل نمودار Duplication
برخی فایل ها در بازهی 200 تا 250 خط کد، دارای حجم قابل توجهی از خطوط تکراری هستند (حدود 90 خط)، که نشان دهندهی ضعف در طراحی توابع مشترک و ماژولار کردن منطق مشابه است. این وضعیت از نبود الگوهای بازطراحی شده یا ناهماهنگی در سبک توسعه بین بخش های مختلف پروژه ناشی می شود. تکرار کد نه تنها باعث افزایش بار نگه داری می شود، بلکه احتمال بروز خطای انسانی را هنگام اصلاح یا توسعهی بخش های مختلف بالا می برد. کاهش این تکرارها می تواند به بهبود ساختار پروژه و افزایش انسجام کد کمک کند.

بخش Background Tasks
این بخش برای بررسی و پایش وضعیت تحلیل های انجام شده طراحی شده است و تاریخچهی تحلیل های پیشین را نمایش می دهد. برای هر تحلیل، اطلاعاتی شامل زمان شروع و پایان تحلیل، مدت زمان اجرای آن، وضعیت نهایی (موفق یا ناموفق) و زمان و فرد ارسال کننده ثبت می شود. این اطلاعات به تیم کمک می کند تا روند اجرای تحلیل ها را دنبال کرده و عملکرد سیستم تحلیل را در طول زمان، ارزیابی نمایند.

نتیجه گیری
در این پروژه، با هدف ارزیابی کیفیت معماری یک سامانه نرم افزاری، از ابزار تحلیل ایستای SonarQube بهره گرفته شد. با انجام تحلیل های دقیق روی کد منبع، شاخص هایی چون قابلیت اطمینان، نگه داری پذیری و امنیت مورد بررسی قرار گرفت و تصویری شفاف از وضعیت کیفی پروژه به دست آمد. تحلیل ایستا نه تنها به عنوان ابزاری برای شناسایی خطاها و ناهنجاری های پنهان عمل می کند، بلکه به توسعه دهندگان کمک می کند تا با شناخت عمیق تری از استانداردهای کدنویسی و نقاط ضعف پروژه، گام های مؤثرتری در جهت ارتقای کیفیت محصول بردارند. استمرار در استفاده از چنین ابزارهایی می تواند به بهبود مداوم کد، کاهش هزینههای نگه داری و افزایش پایداری نرم افزار در بلندمدت منجر شود.
«این مطلب، بخشی از تمرینهای درس معماری نرم افزار در دانشگاه شهیدبهشتی است»
منابع
1.SonarQube Documentation. Static Code Analysis. sonarqube.org
2.SonarScanner CLI – Installation & Configuration Guide. docs.sonarsource.com
3. Vercel V0. AI Code Generator and App Scaffolding. V0.dev
4.Yeboah, A., & Popoola, S. (2024). Efficacy of static analysis tools for software defect detection
5.Guaman, D., Sarmiento, P. A.-Q., Barba‑Guamán, L., Cabrera, P., & Enciso, L. (2017). SonarQube as a tool to identify software metrics and technical debt in the source code through static analysis