روش C4 در مستند سازی معماری نرم افزار

اگر از یک معمار ساختمان بخواهیم که معماری یک ساختمان را به صورت تصویری به ما نشان دهد، نقشه های کلی، پلان های طبقات، نماها و نقشه های جزئیات را به ما نشان می دهد. اگر همین درخواست را از یک توسعه دهنده ی نرم افزار داشته باشیم و بخواهیم معماری سیستم نرم افزاری خود را به ما نشان دهد، احتمالا با نمودارهای به هم ریخته ای که شامل نام گذاری های مبهم ، روابط نامشخص و خطوط درهم هستند مواجه میشویم. به دلایل بالا و همچنین تلاش تیم ها برای حفظ چابکی خود، بسیاری از آن ها تلاش های مستندسازی خود از جمله استفاده از UML را متوقف کرده یا کاهش داده اند و استفاده از تخته برای رسم نمودار را ترجیح می دهند. با توجه به اهمیت وجود نمودارها برای درک معماری سیستم های نرم افزاری و همچنین برای حل مشکلات مطرح شده روش C4 ارائه شد.مدل C4 راهی را برای تیم‌های توسعه نرم‌افزار فراهم می‌کند تا به طور کارآمد و مؤثر معماری نرم‌افزار خود را در سطوح مختلف از جزئیات برای انواع مختلف مخاطب به اشتراک بگذارند.شکل ۱ - استفاده از تخته برای رسم نمودار سیستمروش C4 چیست؟مدل C4 به عنوان راهی برای کمک به تیم های توسعه نرم افزار برای توصیف معماری نرم افزار و بررسی ساختار ایستا یک سیستم نرم افزاری، توسط یک معمار نرم افزار به نام Simon Brown بین سال های ۲۰۰۶ تا ۲۰۱۱ بر مبنای زبان مدلسازی UML و مدل معماری 4+1 ارائه شد.یک مدل C4 معماری نرم افزار را در سطوح مختلف جزئیات توصیف می کند. مدل C4 مجموعه ای از نمودارها است که چهار سطح Context(سیستم)، Containers(کانتینرها)، Components(مولفه ها) و Code(کد) یک سیستم نرم افزاری را نشان می دهد.سلسله مراتب این نمودارها به مخاطبان مختلف اجازه می دهد تا معماری نرم افزار را در سطح جزئیات مورد نیاز خود درک کنند. نمودارهای C4 یک چارچوب جایگزین و ساده شده در مقایسه با نمودارهای UML هستند که می توانند چندین سیستم را توصیف کنند.شکل ۲- سطوح مختلف در مدل C4سطوح مدل C4همانطور که پیشتر گفته شد مدل C4 دارای ۴ سطح نمودار سیستم، کانتینرها، مولفه ها و کد است که در ادامه به توضیح هر کدام با ذکر یک مثال مربوط به سیستم بانکداری اینترنتی می پردازیم.سطح اول:‌نمودار مفاهیم سیستم (System Context diagram)این نمودار نقطه شروع خوبی برای ترسیم نمودار و مستندسازی یک سیستم نرم افزاری است که این امکان را به می دهد تا یک نمای کلی از سیستم نرم افزاری ببینیم تا دریابیم سیستم چه کاری انجام می دهد، چه کسانی از آن استفاده می کنند و با چه سیستم های دیگری تعامل خواهد داشت. در این نمودار سیستم ما در مرکز به شکل جعبه ای قرار می گیرد و کاربران و سایر سیستم هایی که با آن در تعامل هستند، نمایش داده می شوند. جزئیات در این نمودار مهم نیست چون این نمودار نمای کوچکی از چشم انداز سیستم است. همچنین در این نمودار تمرکز بر کاربران و سایر سیستم های در ارتباط است و به جزئیات سطح پایینی مثل فناوری ها و پروتکل ها توجه نمی کنیم. مخاطب این نمودار می تواند همه ی افراد اعم از فنی و غیر فنی چه در داخل و چه خارج تیم توسعه ی نرم افزار باشد. شکل زیر یک نمونه از نمودار مفاهیم سیستم است که یک سیستم بانکداری اینترنتی را توصیف می کند. شکل ۳- نمودار مفاهیم سیستم برای یک سیستم بانکداری اینترنتیمشتریان بانک از سیستم بانکداری اینترنتی برای مشاهده اطلاعات حساب های بانکی خود و انجام پرداخت ها استفاده می کنند. سیستم بانکداری اینترنتی از سیستم بانکداری مرکزی موجود بانک برای انجام این کار استفاده می کند و از سیستم ایمیل بانک برای ارسال ایمیل به مشتریان استفاده می کند. رنگ خاکستری در این نمودار مربوط به سیستم های نرم افزاری است که از قبل وجود داشته اند و رنگ آبی نشان دهنده ی سیستم هایی است که قرار است ساخته شوند.سطح دوم:‌نمودار کانتینرها (Container diagram)گام مفید بعدی این است که با نمودار Container، مرز سیستم را مشخص کنیم. یک کانتینر یک واحد است که قابلیت اجرا و یا استقرار را به صورت مستقل دارد. این نمودار شکل سطح بالا (high level) معماری نرم افزار و توزیع نقش ها را در آن نشان می دهد. همچنین انتخاب های اصلی فناوری های مورد استفاده و ارتباط کانتینرها با هم در این نمودار قابل درک است که برای توسعه دهندگان نرم افزار و تیم پشتیبانی نرم افزار مفید است.در شکل زیر نمونه ای از نمودار کانتینر برای سیستم بانکداری اینترنتی آورده شده است. از این نمودار می توان دریافت که سیستم بانکداری اینترنتی از پنج کانتینر تشکیل شده است: یک برنامه وب سمت سرور، یک اپلیکیشن تک صفحه ای(single page application)، یک اپلیکیشن تلفن همراه، API و یک پایگاه داده.شکل ۴- نمودار کانتینر برای یک سیستم بانکداری اینترنتیسطح سوم:‌نمودار مولفه (Component diagram)در مرحله ی بعد می توانیم بزرگنمایی را بیشتر کنیم و مولفه های تشکیل دهنده ی هر کانتینر را شناسایی کنیم. این نمودار یک تجرید از کدهای سیستم را نشان می دهد و نقش هر یک از مولفه ها، مسئولیت آن ها و جزئیات اجرای آن ها را نشان می دهد. مخاطبان این نمودار معماران و توسعه دهندگان نرم افزار هستند. این نوع نمودار با نمودار مؤلفه‌های UML قابل مقایسه است، اما از قوانینی که کمتر دقیق هستند، استفاده می کنند. در شکل زیر نمودار مولفه مربوط به بخش API یک سیستم بانکداری اینترنتی نمایش داده شده است.شکل ۵- نمودار مولفه برای یک سیستم بانکداری اینترنتیسطح چهارم:‌نمودار کد (Code diagram)در آخر می توانیم پیاده سازی هر مولفه را با استفاده از نمودار کلاس UML یا نمودارهای ارتباط موجودیت (ERD) انجام دهیم. پیاده سازی این سطح از جزئیات فقط برای مولفه های مهم یا پیچیده سیستم توصیه می شود.شکل زیر نمودار کلاس UML را برای مولفه ی MainframeBankingSystemFacade را نشان می دهد.شکل ۶- نمودار کدنشانه گذاریمدل C4 نشانه گذاری خاصی ندارد و می توانیم از هر نماد ساده ای که به خوبی مفهوم را منتقل کند استفاده کنیم. همچنین یک پیشنهاد می تواند استفاده از نمادهای UML باشد. صرف نظر از نماد مورد استفاده در این مدل، توصیه می شود که هر عنصر شامل نام، نوع عنصر و نوع فناوری مورد استفاده باشد. همچنین اضافه کردن یک متن توصیفی کوتاه می تواند بسیاری از ابهامات ممکن را رفع کند. برای هر نمودار در نظر گرفتن یک عنوان نیز ضروری است.شکل ۷- نمونه ای از نشانه گذاری در مدل C4ابزارابزارهایی مانند Structurizr و Gliffy برای طراحی مدل C4 وجود دارند که می توانیم با آن ها نمودارهای مختلفی ایجاد کنیم. شکل زیر نمونه ای از رسم نمودار کانتینر برای یک سیستم نرم افزاری را در محیط نرم افزار Gliffy نشان می دهد.شکل ۸- نمودار Container در Glifffyجمع بندیمدل C4 یک راه ساده برای درک معماری نرم افزار در سطوح مختلف انتزاعی است، به طوری که می توان با استفاده از سطوح مختلف آن جزئیات قابل درکی را برای هر نوع مخاطبی ارائه کرد. همچنین راهی برای معرفی برخی مدل‌سازی‌های دقیق و سبک به تیم‌های توسعه نرم‌افزار است.«این مطلب، بخشی از تمرینهای درس معماری نرم‌افزار در دانشگاه شهیدبهشتی است»منابعhttps://c4model.comhttps://www.infoq.com/articles/C4-architecture-model/https://en.wikipedia.org/wiki/C4_modelhttps://www.gliffy.com/blog/c4-modelhttps://structurizr.com