مستندسازی معماری نرم افزار با استفاده از مدل C4

مقدمهنمودار های معماری، روشی برای برقراری ارتباط با نحوه ایجاد یک نرم افزار و یا نحوه عملکرد یک سیستم نرم افزاری موجود هستند. با این حال به احتمال زیاد، اکثر نمودار های معماری نرم افزاری که دیده اید، ترکیبی به هم ریخته از اشکال و خطوط هستند؛ یکی از عوارض ناگوار این نمودار های ناخوانا و شلوغ، این بوده است که بسیاری از تیم ها، تلاش های مستند سازی و نمودار سازی خود از جمله استفاده از UML را کاهش داده و یا متوقف کرده اند و به رسم نمودار های موردی روی تخته وایت برد و استفاده از ابزار هایی مانند Microsoft Visio روی آورده اند.مستند سازی نرم افزار باید به گونه ای باشد که برای تمام ذی نفعان که هریک از دیدگاه مختلفی به سیستم نگاه می کنند، قابل درک باشد. درک نمودار های UML، به دلیل پیچیدگی زیاد، برای افرادی که با نماد های آن آشنا نبوده و دانش فنی در این زمینه ندارند، دشوار خواهد بود.برای حل مشکلات ذکر شده، فردی به نام Simon Brown مدلی به نام C4 را ارائه کرد که در ادامه به شرح این مدل می پردازیم. مدل سازی C4 چیست؟مدل C4، معماری نرم افزار را در سطوح مختلف جزئیات، توصیف می کند. این مدل برگرفته از ۴ کلمه ، Components ،Containers ،Context و Code بوده و شامل مجموعه ای از نمودار ها است که مفاهیم سیستم، کانتینر ها، مولفه ها و کد یک نرم افزار را نمایش می دهند. سلسله مراتب این نمودارها به مخاطبان اجازه می دهد که معماری نرم افزار را در سطح جزئیات مورد نیاز خود، درک کنند. می توان از یک مدل C4 برای مایکرو سرویس ها، برای نمایش برنامه ریزی برای ساخت یک سیستم و یا توصیف یک سیستم موجود استفاده کنید. نمودار های C4، یک چارچوب جایگزین و ساده شده در مقایسه با نمودار های UML هستند و بر خلاف نمودار های معماری AWS، نمودار های معماری GCP و یا نمودار های معماری AZURE، می توانند چندین سیستم را توصیف کنند.مدل C4 توسط Simon Brown، نویسنده کتاب "معماری نرم افزار برای توسعه دهندگان"، در طی سال‌های 2006 تا 2011، بر پایه زبان مدل‌سازی واحد (UML) و مدل نمای معماری 4+1 ایجاد شد.سطوح مدل C4چهار نوع مدل C4 وجود دارد (شکل ۱) که هر کدام برای مخاطبان متفاوتی بوده و دارای سطح متفاوتی از جزئیات می باشند. مفاهیم سیستم (زمینه)،کانتینر ها، مولفه ها و نمودار های کد هستند که مدل معماری نرم افزار شما را می سازند.در ادامه، 4 سطح مدل را معرفی کرده و برای یک سیستم بانکداری اینترنتی، نمودار های مرتبط را مشاهده می کنیم.شکل ۱ ـ سطوح مدل C4سطح اول: نمودار مفاهیم سیستمنمودار مفاهیم سیستم، کلی ترین و سطح بالا ترین توصیف از سه مورد زیر را ارائه می دهد:سیستم چه کاری را انجام می دهد؟چه کسی از آن استفاده می کند؟ با چه سیستم های دیگری تعامل خواهد داشت؟یک نمودار زمینه به شما کمک می کند تا محدوده پروژه خود را توصیف کنید و مشخص کنید که کاربر چه کسی است و می خواهید چه مشکلی را حل کنید.شکل ۲، نمودار سطح اول سیستم بانکداری اینترنتی را نمایش می دهد؛ مشتریان، خدماتی از جمله پرداخت قبوض و انتقال وجه را از این سیستم دریافت می کنند. سیستم های Mainframe و E-mail، با سامانه ما در ارتباط هستند؛ Mainframe، وظیفه ذخیره اطلاعات مشتریان را داشته و سیستم بانکداری، اطلاعات مورد نیاز را از این سیستم دریافت می کند.سیستم E-mail، ارتباط سامانه با مشتریان را فراهم می کند.شکل ۲ ـ نمودار مفاهیم سیستمسطح دوم: نمودار های کانتینرنمودار کانتینر، اولین گام برای توصیف سیستم نرم افزاری را برداشته و API ها، برنامه های کاربردی، پایگاه های داده و مایکرو سرویس هایی که سیستم از آن ها استفاده خواهد کرد را نشان می دهد. هر یک از این برنامه های کاربردی و یا سرویس ها، با یک کانتینر نمایش داده شده و تعاملات بین آن ها به صورت سطح بالا (High-Level) نشان داده می شود.در شکل ۳، نمودار کانتینر سیستم بانکداری اینترنتی قابل مشاهده است. داخل باکسی که محدوده آن با خط چین مشخص شده است، کانتینر هایی قرار دارند که سیستم بانکداری از آن ها تشکیل شده است. در این نمودار، تکنولوژی های مورد استفاده برای ارتباط کانتینرها با یکدیگر و چگونگی تعامل سیستم بانکداری با سایر سیستم‌ها و کاربران، قابل مشاهده است.شکل ۳ ـ نمودار کانتینرسطح سوم: نمودار های مولفهیک گام عمیق تر از نمودار کانتینر، نمودار مولفه است که گروه های کدِ قرار گرفته شده در یک کانتینر را شرح می دهد. این مولفه ها، انتزاعی از بیس کد نرم افزار را نشان می دهند.این نوع نمودار، با نمودار مولفه UML قابل مقایسه است؛ با این تفاوت که نمودار مولفه UML، از مجموعه قوانین سخت گیرانه تری پیروی می کند.شکل ۴، مؤلفه‌های کانتینر API سیستم بانکداری را نشان می‌دهد. مخاطبان این نمودار، معماران و توسعه‌دهندگان نرم‌افزار هستند و به کمک آن، در مورد معماری سیستم در سطوح پایین، تبادل اطلاعات می کنند.شکل ۴ ـ نمودار مولفهسطح چهارم: نمایش کد با نمودار های کلاسآخرین سطح، به جزئیات زیادی نیاز دارد تا نشان دهد که چگونه کد یک مولفه، پیاده سازی می شود. برای نمودار این سطح، می‌توان از نمودار‌های UML، مانند نمودار کلاس استفاده کرد.شکل ۵، جزئیات پیاده سازی مؤلفه MainframeBankingSystemFacade و نمودار کلاس آن را نشان می‌دهد.شکل ۵ ـ نمودار کدنشانه گذاریبرای رسم نمودار های مدل C4، هیچ نشانه گذاری خاصی پیشنهاد نشده است و محدودیتی در این باره وجود ندارد، اما توصیه می شود که از نشانه گذاری های UML استفاده شود؛ تنها اهمیت این امر، انتقال درست و ساده مفاهیم به مخاطب است.در شکل ۶، نشانه گذاری پیشنهادی آقای Brown آورده شده است. شکل ۶ ـ نشانه گذاری پیشنهادی آقای Brownابزارروش های زیادی برای ایجاد نمودار های C4 وجود دارد که در ادامه به طور مختصر به بعضی از این روش ها می پردازیم:ابزار Structurizr توسط Simon Brown، سازنده مدل C4 ایجاد شده است که به ما اجازه رسم نمودار ها را به صورت دستی و یا کدنویسی آن ها با جاوا، #C و TypeScript را می دهد.استفاده از Draw.io می تواند روشی مناسب برای نگهداری و نسخه بندی نمودار های معماری در ریپازیتوری های مختلف باشد. همچنین می توانیم با استفاده از افزونه C4، نشانه گذاری C4 را در این ابزار فعال نماییم.از Gliffy، برای توصیف معماری نرم افزار بوسیله مدل C4 استفاده می شود. این ابزار، نمودار های UML، نمودار های Entity-Relationship و نمودار های معماری ابری را نیز پشتیبانی می کند. بخشی از محیط این ابزار، در شکل ۷ قابل مشاهده است.شکل ۷ ـ محیط ابزار Gliffyجمع بندیمدل C4 یک چارچوب ساده و منعطف برای برقراری ارتباط با سطوح مختلف معماری نرم افزار است که بسته به نیازهای مختلف، می توان به صورت متفاوتی از آن استفاده کرد؛ به عنوان نمونه،‌ معماران نرم افزار و توسعه دهندگان، از طریق نمودار های مولفه و یا نمودار های کانتینر با هم تبادل اطلاعات می کنند، اما برای نمایش ساختار کلی نرم افزار به مشتری و یا افرادی که دانش زیادی در حوزه فنی ندارند، از نمودار مفاهیم سیستم استفاده می کنیم. این مدل، مزایای زیادی دارد که برخی از آن ها در زیر آورده شده است:مزایای C4قابلیت نگهداری آسان: نگهداری آن سخت نبوده و نسبت به بسیاری از راه حل های دیگر، آسان تر می باشد.معماری را از دیدگاه های مختلفی نمایش می دهد.نه فقط برای کادر فنی، بلکه در سطح سازمانی می تواند مفید واقع شود.نماد های مبهم را حذف می کند.بعضی از قسمت ها می توانند به صورت خودکار تولید شوند. معایب C4مدل C4 در کنار مزایای زیادش، معایبی نیز دارد:مصور سازی ایستا: ما نمی دانیم که یک ارتباط، در چه زمان و چند مرتبه، اتفاق می افتد.انتزاعات سطح پایین، باید به طور منظم به روز رسانی شوند.«این مطلب، بخشی از تمرینهای درس معماری نرم‌افزار در دانشگاه شهیدبهشتی است»مراجعhttps://c4model.comhttps://www.youtube.com/watch?v=x2-rSnhpw0ghttps://www.infoq.com/articles/C4-architecture-model/https://www.gliffy.com/blog/c4-modelhttps://betterprogramming.pub/modeling-software-architecture-with-c4-243eb1f240c7https://github.com/plantuml-stdlib/C4-PlantUMLhttps://www.structurizr.comhttps://github.com/tobiashochguertel/c4-draw.io