شاید تا به الان کلمه معماری نرمافزار را نشنیده باشید. هر نرمافزار یک معماری ساده یا پیچیده دارد. به طور خلاصه معماری نرمافزار یک سیستم، مجموعهایی از ساختارهایی است که کمک میکنند تا درباره سیستم استدلال کنیم و حرف بزنیم. اگر به معماری نرمافزار توجهی نداشته باشیم تغییر سیستم بسیار سخت و حتی غیرممکن میشود. امروزه با توجه به گستردگی و تنوع نیازهای مردم، نیازمندیها با سرعت بیشتری تغییر پیدا میکند و یک سیستم را ملزم به تغییرپذیری میکند. بنابراین یک معماری خوب یکی از مهمترین جنبه های تولید نرمافزار است.
یکی از ویژگیهای معماری خوب این است که یک دید و فهم مشترک را، به افراد مختلف پروژه و حتی ذینفعان نرمافزار ارائه دهد و این دید برای تمام افراد قابل درک باشد و روی آن تفاهم داشته باشند. به دلیل تغییر کردن نیازمندیها و حتی عوض شدن افراد تیم توسعه، بهتر است که این فهم مشترک مستند شود.
نمودارها یکی از راههای مستند سازی هستند اما نه هر نموداری!
نمودارهای مبهم و غیراصولی نه تنها به افراد کمکی نخواهند کرد، بلکه منجر به سوء تفاهم میشود که میتواند سرعت یک تیم خوب را کند کند.
مستندسازی معماری نرمافزار باید به گونه ای باشد که برای همه قابل درک باشد. استانداردهایی مانند UML یا ArchiMate وجود دارد، اما آنها محدودیتهایی دارند، به خصوص زمانی که می خواهیم از دیدگاههای مختلف به سیستم خود نگاه کنیم. علاوه بر آن افراد بدون پیشینه فنی یا حتی برنامه نویسان بدون آموزش قبلی، با دیدن این نمودارها احساس راحتی نخواهند کرد و نمادها را درک نمی کنند.
یک راه حل پیشنهاد شده برای حل این مشکل، مدل C4 است که در ادامه به آن میپردازیم.
مدل C4 توسط یک معمار نرمافزار به اسم سیمون براون بین سالهای 2006 تا 2011 بر پایه زبان مدلسازی واحد (UML) و مدل نمای معماری 4+1 ایجاد شد.
کلمه C4 مخفف کلمات: مفاهیم سیستم (Context)، کانتینرها(Container)، مؤلفهها(Components) و کد(Code) است. هر یک از این کلمات دیدگاهی از سیستم را به ما نشان داده و هرکدام مخاطبان خاص خود را دارد. درواقع مانند یک نقشه جغرافیایی از یک منطقه با بزرگنماییهای متفاوت است.
شکل 2 دیدگاههای مطرح شده و سلسله مراتب بزرگنمایی را نشان میدهد. در بالاترین سطح، سیستم مد نظر و افراد و سیستمهایی که با آن در ارتباط است را نشان میدهد. در سطح بعدی روی سیستم بزرگنمایی انجام داده که در آن مجموعهایی از کانتینرهاست (کانتینر یک اپلیکیشن یا پایگاه داده است در واقع چیزی برای اجرای کد است). در سطح بعد یکی از کانتینرها را بزرگنمایی کرده که شامل مجموعهایی از مؤلفههاست و هر مؤلفه هم مجموعه ایی از کد است.
همانطور که گفته شد مدل C4 از 4 کلمه تشکیل شده است که هر کدام یک سطح از این مدل را تشکیل میدهد.
در ادامه این 4 سطح را معرفی میکنیم و برای هر کدام یک مثال واحد (سیستم بانکداری اینترنتی) را ارائه میدهیم.
بالاترین سطح انتزاع این نمودار است. در این نمودار سیستم مورد نظر مانند جعبهایی در مرکز قرار میگیرد و کاربران و سایر سیستمها با آن در تعامل هستند. در این سطح به جزئیات سطح پایینی مانند فناوریها و ... اهمیتی نمیدهیم و بیشتر بر روی افرادی که از سیستم استفاده میکنند و سیستمهایی که با سیستم مورد نظر در تعامل است، تمرکز دارد.
مخاطبان این نمودار همه افراد، با هر سطح دانش و تجربهایی چه خارج چه داخل تیم توسعه است. شکل 3 نمودار سطح 1 یک سیستم بانکداری اینترنتی را نشان میدهد که یک گروهی از افراد برای استفاده از خدمات بانکداری اینترنتی مانند پرداخت قبوض، انتقال وجه و... از آن استفاده میکنند. در این نمودار برای اینکه سیستم ما اطلاعات مشتری خود را داشته باشد و از آن استفاده کند، از سیستم Mainframe استفاده میکند. همچنین این سامانه با سامانه ایمیل در ارتباط بوده به مشتریان خود ایمیل را ارسال میکند. در این نمودار جعبهایی که به رنگ آبی وجود دارد سیستم مد نظر ما است و جعبههای خاکستری سیستمهایی است که با سیستم مد نظر ما در ارتباط هستند.
اکنون به راحتی می توانیم ببینیم که با کدام سیستم کار میکنیم و کاربران اصلی ما چه کسانی هستند.
وقتی روی سیستم مورد نظر خود بزرگنمایی کنیم با کانتینرها مواجه میشویم. یک کانتینر ساختاری است مانند یک برنامه وب سمت سرور، برنامه دسکتاپ، برنامه تلفن همراه، شمای پایگاه داده، سیستم فایل، و ... . در اصل، یک کانتینر یک واحد قابل اجرا و قابل استقرار جداگانه است که کد را اجرا میکند. کانتینرها با API هایی با یکدیگر ارتباط برقرار میکنند و به طور مستقیم وابسته نیستند. در این نمودار بعضی از فناوریها مانند پروتکلهایی که هر کانتینر برای برقراری ارتباط استفاده میکند، صحبت میشود. شکل 4، نمودار کانتینر سیستم بانکداری اینترنتی را نشان میدهد. داخل جعبه خط چین کانتینرهایی مانند اپلیکیشن تلفن همراه، برنامه وب سمت سرور، پایگاه داده، API سمت سرور و... آمده است. در این نمودار فناوری استفاده شده در کانتینرها و تکنولوژی ارتباط کانتینرها با یکدیگر و چگونگی تعامل این کانتینر با سایر سیستمها و کاربران نیز قابل مشاهده است.
مخاطبان این نمودار افراد دارای تجربهی فنی داخل و خارج تیم توسعه نرم افزار مانند معماران نرمافزار یا توسعه دهندگان است.
نمودار مؤلفه، یک کانتینر را جداگانه بزرگنمایی میکند تا اجزای داخل آن و تعاملات آن را نشان دهد. نمودار مؤلفه نشان میدهد که چگونه یک کانتینر از تعدادی مؤلفه تشکیل شده است. مسئولیت و جزئیات سطح پایین برای هر مؤلفه نیز مشخص میشود. شکل 5، مؤلفههای کانتینر API سیستم بانکداری اینترنتی را نشان میدهد.
مخاطبان این نمودار معماران و توسعهدهنگان نرمافزار هستند تا به کمک آن بتوانند به صورت تخصصی و فنی دربارهی راهحل و ارتباطات، اطلاعات کسب کنند.
کد پایینترین سطح است و زیاد مستند سازی این بخش توصیه نمیشود. زیرا این بخش دائما در حال تغییر است ولی اگر واقعا به آن نیاز بود میتوان روی مؤلفه مورد نیاز بزرگنمایی کرد، تا نحوه پیادهسازی آن مشخص شود. اگر واقعاً میخواهید یا نیاز دارید، میتوانید یک مؤلفه را بزرگنمایی کنید تا نحوه پیادهسازی آن مؤلفه را نشان دهید. برای نمودار این بخش میتوان از نمودارهای UML مانند نمودار کلاس استفاده کرد. شکل 6 نحوه پیاده سازی و کلاسهای مؤلفه MainframeBankingSystemFacade را نشان میدهد.
برای ایجاد نمودارهای مدل C4، هیچ گونه نشانه گذاری و محدودیتی وجود ندارد ولی توصیه میشود که از نمادهای واحد نمودارهای UML استفاده شود ولی این تنها یک توصیه است و ما هیچ محدودیتی نداریم. مهم این است که بتوانیم مفهوم را به درستی و به سادگی هرچه تمامتر منتقل کنیم.
علاوه بر این آقای برآون توصیههای دیگری هم برای نشانه گذاری میکند:
ابزارهای تحت وب زیادی برای طراحی مدل C4 وجود دارد مانند draw.io و gliffy.com که در هر کدام با فعال کردن افزونه c4 میتوان به طراحی نمودارهای سطحهای مختلف پرداخت.
علاوه بر این ابزارهای تحت وب، ابزار متن باز c4-plantUML نیز وجود دارد.
لازم به ذکر است که برای رسم نمودارهای مدلC4، لزومی به استفاده از ابزار نیست و میتوان با استفاده از کاغذ یا تخته وایت برد این نمودارها را به صورت دستی ترسیم کرد.
مدل C4 یکی از سادهترین روشهای مستندسازی معماری نرمافزار است. به کمک این مدل میتوان با سطوح مختلف سیستم ارتباط برقرار کرد و سناریوهای مختلف را برای کاربران مختلف تشریح کرد.
«این مطلب، بخشی از تمرینهای درس معماری نرمافزار در دانشگاه شهیدبهشتی است»
https://www.youtube.com/watch?v=x2-rSnhpw0g
https://www.youtube.com/watch?v=Ym9nhVZs89o
https://www.infoq.com/articles/C4-architecture-model/
https://en.wikipedia.org/wiki/C4_model
https://betterprogramming.pub/modeling-software-architecture-with-c4-243eb1f240c7
https://www.ibm.com/garage/method/practices/code/c4-model-for-software-architecture/
https://www.diagrams.net/blog/c4-modelling
https://www.gliffy.com/blog/c4-model
https://github.com/plantuml-stdlib/C4-PlantUML