معماری نرمافزار و ارائه روشی برای مستندسازی آن از چالشهای حوزه نرمافزار است. در این پست به بررسی مدل C4 که یکی از روشهای مستندسازی معماری نرمافزار است میپردازیم.
مدل C4 روشی برای مدلسازی و مستندسازی معماری نرمافزار است که آن را در سطوح مختلف جزئیات توصیف و تعریف میکند. مدل C4 یک روش "abstraction-first" است یعنی در این روش نمودارسازی معماری نرمافزار بر اساس انتزاعاتی است که نشان میدهد معماران و توسعهدهندگان نرمافزار چگونه در مورد نرمافزار فکر میکنند و آن را میسازند.
در مدل C4 میتوان نقشهای از کد برنامه را در سطوح مختلف از جزئیات ایجاد کرد. در واقع ایدهی این روش این است که بتوان همانند نقشهی گوگل روی آن زوم کرد و به جزئیات بیشتری رسید.
با استفاده از مدل C4 تیمهای توسعه نرمافزار میتوانند به طور کارآمد و مؤثر معماری نرمافزار خود را در سطوح مختلف از جزئیات، با گفتن داستانهایی متفاوت برای مخاطبان متفاوت، هم در زمان طراحی اولیه و هم در مستندسازی، به اشتراک بگذارند.
مدل C4 از چهار سطح context، container، component و code تشکیل شده است. هر کدام از این چهار مورد به سطح متفاوتی از جزئیات میپردازند و مخاطبان متفاوتی دارند.
نمودار context مشخص میکند که سیستم چه کاری انجام میدهد، چه کسانی از آن استفاده میکنند و با چه سیستمهای دیگری در تعامل است، به بیان دیگر چگونگی تعامل کاربران با سیستم، و چگونگی تناسب سیستم با سایر سیستمها را نشان میدهد. به کمک این نمودار میتوان محدوده پروژه و آن چه که خارج از این محدوده است را به خوبی نمایش داد.
در این نمودار سیستم به شکل یک باکس در مرکز نشان داده میشود و کاربران و سایر سیستمها در اطراف این باکس قرار میگیرند.
این نمودار را میتوان به افراد غیر فنی نشان داد.
در نمودار container هر یک از عناصر بزرگ سیستم مانند اپلیکیشنهای وب و دسکتاپ، اپهای موبایل، APIها، پایگاه دادهها و فایل سیستمها، در قالب یک container نمایش داده میشوند. در واقع container یک واحد قابل اجرا یا قابل استقرار مجزاست که کدی را اجرا یا دادههایی را ذخیره میکند.
نمودار container فناوریهای اصلی انتخاب شده و چگونگی ارتباط containerها با یکدیگر را نشانمیدهد.
این نمودار هم برای توسعهدهندگان نرمافزار و هم برای کارمندان پشتیبانی IT مفید است.
نمودار component، مؤلفههای تشکیلدهندهی یک container را نشان میدهد و مسئولیتها و جزئیات فناوری و پیادهسازی هر یک از این مؤلفهها (components) را مشخص میکند.
نمودار مؤلفهی مدل C4 در مقایسه با نمودار مؤلفهی UML، قوانین سختگیرانهی کمتری دارد.
این نمودار برای معماران و توسعهدهندگان نرمافزار مفید است.
در این سطح چگونگی پیادهسازی کد هر component با استفاده از نمودارهای کلاس UML، نمودارهای موجودیت-رابطه و موارد مشابه نشان داده میشود. چنین نمودارهای را معمولا میتوان از طریق ابزارهایی مانند IDEها به طور خودکار تولید کرد.
این سطح از جزئیات اختیاری است و تنها برای componentهای مهم یا پیچیده مناسب است و برای سایر componentها توصیه نمیشود.
علاوه بر چهار سطح گفته شده که برای نمایش ساختار ایستا استفاده میشوند میتوان نمودارهای C4 را برای نمایش سایر جنبهها تکمیل کرد.
نمودار System Landscape diagram: این نمودار مرزهای سازمانی، کاربران داخلی/خارجی و سیستمهای داخلی/خارجی را نشان میدهد.
نمودار Dynamic diagram: این نمودار نشان میدهد که چگونه عناصر یک مدل ایستا در زمان اجرا برای پیاده سازی یک user story، use case، ویژگی یا موارد دیگر، با یکدیگر همکاری میکنند.
نمودار Deployment diagram: این نمودار نشان میدهد که چگونه سیستمهای نرمافزاری و containerها در مدل ایستا به زیرساخت نگاشت میشوند.
مدل C4 نشانهگذاری خاصی را تعیین نمیکند و آنچه که در نمودارهای نمونه دیده میشود نمادهای ساده ایست که روی تختهسفید، کاغذ و هر ابزار ترسیم نموداری به خوبی کار میکند.
در این مدل پیشنهاد میشود که:
هر نموداردارای یک عنوان باشد که نوع و محدوده نمودار را توصیف میکند.
هر عنصرشامل یک نام، نوع عنصر (Person، Software System، Container و Component)، فناوری انتخاب شده(در صورت لزوم) و یک متن توصیفی باشد.
هر خط نشاندهندهی یک رابطه یکطرفه باشد، برچسبگذاری شود و برچسب با جهت و هدف رابطه سازگار باشد.
همچنین میتوان برای تکمیل نمودار با هدف افزودن اطلاعات اضافی یا زیباتر کردن آن، از اشکال و رنگهای مختلف استفاده کرد. نکته مهم این است هر نمادی که از آن استفاده شده با یک کلید راهنما (key/legend) توصیف شود.
در سال 2014، Structurizr توسط Simon Brown، خالق مدل C4، ایجاد شد. Structurizr مجموعهای از ابزارها برای ایجاد نمودارهای معماری نرمافزار و مستندسازی براساس مدل C4 است. Structurizr از نمودارها به شکل کد (Java, Clojure, .NET, TypeScript, PHP, Python, Go) یا متن (DSL یا YAML) پشتیبانی میکند و ارائهی نمودارها با ابزارهای متفاوتی (Structurizr cloud service, PlantUML, Mermaid و غیره) را ممکن میسازد.
این مطلب، بخشی از تمرینهای درس معماری نرمافزار در دانشگاه شهیدبهشتی است.
https://www.infoq.com/articles/C4-architecture-model/
https://www.diagrams.net/blog/c4-modelling
https://www.gliffy.com/blog/c4-model