مدل C4 چیست ؟

خوشبختانه این روزها توفیق اجباری پیش اومد با مدل C4 در معماری نرم افزار آشنا بشم و قصد دارم اینجا اون چیزی که فهمیدم رو به اشتراک بذارم. خوشحال میشم اگر اشکالی دیدید یا نظری داشتید در بخش نظرات منتقل کنید. در این پست قصد دارم بگم C4 از کجا اومده ؟ برای چی اومده؟ چه ویژگی هایی داره؟مدل C4 از کجا اومده ؟جناب آقای Simon Brown که یک توسعه دهنده و معمار نرم افزار ساکن لندن است؛ در جاهای مختلف جهان معماری نرم افزار رو در قالب کارگاه دو سه روزه تدریس میکنه؛ در این کارگاه ها از تیم ها می خواد بر اساس نیازمندی ها معماری برای نرم افزار پیشنهاد بدهند. چند نمونه از معماری هایی که تیم ها در این کارگاه ها کشیدن رو در تصاویر زیر می بینید:آقای Brown می گوید: "معماری های طراحی شده در نمایش جزییات با هم تفاوت دارند و هر وقت یک طراحی رو در مقابل تیم های دیگه میزارم و ازشون میخوام تا چیزی که میفهمن رو توضیح بدن معمولا تیم ها اگر خود طراحان توضیح ندن نمیتونن معماری رو درک کنند."مدل C4 برای چی اومده؟آقای Brown دو تا مشکل اساسی در طراحی ها میدید:مفهوم مشترکی از اینکه به چه میزان جزئیات در طراحی معماری نرم افزار لازم است وجود ندارد. بدیهتا نباید ارائه معماری به کارفرما ، افرادی غیر فنی یا تیم های دیگر با معماری ای که برای توسعه دهندگان اون بخش لازم است یکسان باشد.اگر در رشته ای مثل برق هر وقت یه نقشه مثل شکل زیر طراحی میشه همه از آن برداشت مشترک دارند ولی به نظر میرسه چنین چیزی در طراحی معماری نرم افزار وجود نداره یا به صورت مشترک استفاده نمیشه. شاید این سوال پیش بیاید آیا UML ( و دیگر راه های مدلسازی ) زبان مشترک نیستند ؟آقای Brown در پاسخ می گوید اگر شما از UML استفاده میکنید و مشکلی ندارید از آن استفاده کنید اما واقعیت اینه که اکثر شرکت ها و تیم های برنامه نویسی (ازجمله تیم هایی که از متدولوژی توسعه agile استفاده می کنند) به دلیل پیچیده بودن پروژه و محدود بودن یا دلایل ترجیح میدن دیگر بجای UML از مستطیل های خط و دایره های خودساخته (مثل تصاویر بالا) استفاده کنند.آقای Brown برای حل چالش های بالا مدل C4 را به عنوان راه حل ارائه داده که در ادامه بهش می پردازیم.مدل C4 چه ویژگی هایی داره ؟آقای Brown با بررسی سطوح مختلف در دیگر علوم مهندسی مدل C4 را بر پایه UML و معماری 4+1 پیشنهاد داد .در این مدل اقای مدل اقای Brown چهار سطح برای انتزاع (Abstractions) معرفی می کند. (۴ تا C)که این چهار لایه شامل context , containers ,components, code می‌شود.کسانی که فقط نیاز به دید کلی دارند باید معماری در سطح context به انها ارائه شود اگر جزییات بیشتر لازم بود میتوانیم به سطوح داخلی برویم این مثل یه نقشه که هر وقت جزییات بیشتر خواستیم میتونیم zoom کنیم.چهار سطح مدل C4طبق این نگاه سامانه نرم افزاری از تعدادی کانتینر تشکیل شده است (کانتینرها میتواند پایگاه داده یا هر برنامه مستقلی باشند مثل اپلیکیشن ها و برنامه های وب یا دسکتاپ و...) و هر کانتینر شامل یک یا تعداد بیشتر کامپوننت هست که با زبان برنامه نویسی پیاده سازی شده است.قالب یک سامانه نرم افزاری در مدل C4بیاید جزییات این مدل رو در قالب یک مثال مرور کنیم: (هدف در این مثال طراحی یک اینترنت بانک با مدل C4 است)سطح اول : System Context diagramدر این نمودار سامانه ما در وسط قرار می‌گیرد و کاربران و سامانه های دیگه ای که با سامانه ما تعامل دارند و همیچنین نحوه تعامل نمایش داده می‌شوند. در مثال زیر مشتریان با سامانه در ارتباط هستند آنها می‌خواهند موجودی حساب خود را بررسی کنند یا از دیگر خدمات بانک بهره‌مند شوند.همچین اینترنت بانک به سیستم ایمیل و زیر ساخت بانک نیازمند است و درخواست هایی به آنها ارسال می کند. این ارتباط ها بوسیله خطوط جهت دار با توضیحات محدود نمایش داده می‌شود، که در شکل زیر مشاهده می‌کنید.در شکل رنگ ها نشان‌دهندۀ وضعیت سیستم‌ها هستند؛ آبی به معنای درحال ساخت و خاکستری به معنای آماده برای استفاده است.نمودار سطح اول (System Context)سطح دوم : Container diagramدر این سطح باید زیر سامانه های اینترنت بانک را نمایش می دهیم در واقع سامانه اینرنت بانک را بزرگ می کنیم و داخل آن را می بینیم. هر سامانه از یک یا چندین کانتینر تشکیل شده . همونطور که گفتیم کانتینر میتونه هر نوع برنامه مستقلی یا پایگاه داده باشه. در این نمودار ارتباط میان کانتینر ها و تکنولوژی های انتخاب شده نمایش داده میشود.در مثال ما سامانه اینترنت بانک (که با خط چین نمایش داده شده) شامل وب اپلیکشن، موبایل اپلیکیشن، صفحه اینترنتی ، API اپلیکیشن و پایگاه داده است که ارتباط میان آنها نمایش داده شده است.نمودار سطح دوم (Container)سطح سوم : Component diagramدر این مرحله میتوانیم هر یک از کانتینر ها بزرگ کنیم و بخش های مختلف رو مشاهده کنیم. در این نمودار بخش های مختلف هر کانتینر ، وابستگی ها و ارتباط میان بخش های مختلف و قابلیت های پیاده سازی شده در هر بخش رو می‌بینیم. در مثال کانتینر API Application رو بزرگ کردیم و بخش های مختلف پیاده سازی شده برای این کانتینر رو می‌بینیم . در هر بخش قابلیت پیاده سازی شده بطور مختصر توضیح داده شده.(Component)نمودار سطح سوم سطح چهارم : Codeدر نهایت در این سطح نحوه برنامه نویسی هر بخش رو نمایش میدهیم. در این مرحله میتوانیم برای نمایش از UML و relationship diagrams و ابزار های مشابه استفاده کنیم.این نمودار رو میتوان با استفاده از ابزار هایی مثل IDE ها یا UML modelling بصورت خودکار ایجاد کرد. کشیدن این نمودار فقط برای توسعه دهندگان همان بخش توصیه می‌شود.نمودار سطه چهارم (code)باید های دیگر C4در مدلسازی C4 توصیه میشود :۱. عنوان ها شفاف و قابل فهم باشد۲. در سامانه ها و کانتینر ها توضحیات مختصری از هدف آنها نوشته شود.۳. در بخش ها تکنولوژی و قابلیت های پیاده سازی شده نوشته شود.۴. پیکان ها که رابطه یک طرفه نشان میدهند نوع ارتباط توضیح داده شود.جمع بندی : مدل C4 تلاشی برای کاهش شکاف در طراحی های معماری نرم افزار با الگویی ساده است. همچنین سعی میکند سطح بندی مختلف جزییات غیر ضروری و گیج کننده معماری را برای افراد مختلف درگیر با پروژه حذف کند. مدل C4 میخواهد تا معماری ها بدون توضیح طراحان برای همه قابل فهم باشند. C4 در جزییات استفاده از اشکال یا حتی تعداد سطح ها سختگیر نیست و اگر فکر می‌کنید با اضافه کردن سطح جدیدی میتوانید معماری را بهتر نمایش دهید حتما این کار را بکنید.این مطلب، بخشی از تمرینهای درس معماری نرم‌افزار در دانشگاه شهید بهشتی است. که امیدوارم از آن استفاده کرده باشید.منابع :https://c4model.comhttps://www.youtube.com/watch?v=x2-rSnhpw0ghttps://en.wikipedia.org/wiki/C4_modelhttps://www.youtube.com/watch?v=Ym9nhVZs89o