
ما برنامهنویسها معمولاً برای اینکه با ساختار کلی یک نرمافزار آشنا شویم، ابتدا به سراغ مستندات معماری آن نرمافزار میرویم. مستند معماری هر نرمافزار سندی است که کمک میکند ذینفعان مختلف یک پروژه فهم مشترکی از نقاط کلیدی و روش عملکرد آن پروژه پیدا کرده و به درک یکسانی از پروژه برسند. در فرایند توسعهی یک پروژه نرمافزاری، ذینفعان مختلفی مثل مدیر پروژه، کاربر، کارفرما، برنامهنویس، مدیر فنی و ... با تخصصها و پیشینههای مختلفی وجود دارند. مستند معماری باید برای تمامی این افراد قابلفهم باشد و بهنوعی یک نقطهی ارتباطی این افراد باشد.
اگر به تیمهای نرمافزاری مختلف رجوع کنید و از آنها بخواهید که نمودار معماری نرمافزار خود را بکشند، معمولاً با نمودارهایی پر از خطوط و اشکال مختلف روبرو خواهید شد که اغلب نامفهوم، بدون اسمگذاریهای صحیح و همچنین دارای نشانهگذاریهای ناسازگارند. نکتهی جالب این است که اگر نمودار معماری نرمافزار یک تیم را به تیم دیگری بدهید، بهاحتمال بالا اعضای آن نمیتوانند معماری نرمافزار را بهدرستی بفهمند و درک کنند و با نمودار ارتباط برقرار کنند.

برای اینکه نمودار معماری نرمافزار توسط ذینفعان مختلف قابلفهم باشد، نیازمند به نمادها و نشانهگذاریهای یکسان و البته سادهای هستیم تا که توسط اکثر افراد قابلفهم باشد. در طول زمان در صنعت نرمافزار نمادها و استانداردهای مختلفی برای کشیدن نمودارها به وجود آمدهاند. یکی از نمونههای معروف در این زمینه، نمودارهای UML است. نمودارهای UML در گذشته پراستفادهتر و رایجتر از امروز بودند اما رفتهرفته از محبوبیت آنها کاسته شد. یکی از دلایلی که باعث شده است تیمهای نرمافزاری UML را کنار بگذارند، پیچیدگی و تنوع زیاد نمادها و نشانهگذاریها است. ضعف دیگر UML کمبود لایههای مختلف انتزاع برای نشاندادن معماری است. افراد مختلف برای فهم نرمافزار نیازمند به سطوح مختلفی از انتزاع هستند و روش ما برای مدل کردن معماری نرمافزار باید بهخوبی این سطوح را مدل کند.
مدل C4 یکی از مدلهای معروف برای مستند کردن و مدل کردن معماری نرمافزار است. در این مدل توجه ویژهای به لایههای مختلف انتزاع شده است. همچنین سعی شده است که نمادها و علائم این مدل تاحدامکان ساده و قابلفهم برای عموم باشد. بر خلاف بعضی از مدلهای دیگر، در این مدل توصیه میشود که برای هر نماد عنوان و توضیح کوتاهی نوشته شود. به همین دلیل معمولاً نمودارهای C4 متن بیشتری نسبت به دیگر نمودارها دارند.

همانطور که در اسم مدل نیز مشخص است، مدل C4 از چهار لایهی انتزاع تشکیل شده است که عبارتاند از Component، Container ، Context و Code. در ادامه به توضیح مختصری از این لایهها میپردازیم و نمونهای از هرکدام را میآوریم.
این لایه بالاترین سطح انتزاع در مدل ماست که طرح کلی نرمافزار را نشان میدهد. در این لایه به بازیگران و سیستمهای خارجی و نحوهی ارتباط آنها با سیستم خودمان میپردازیم و از جزئیاتی مثل پروتکلها و تکنولوژیهای استفاده شده صرفنظر میکنیم. مخاطب این لایه همهی افراد اعم از فنی و غیرفنی هستند.

هر Container نشاندهندهی یک نرمافزار قابلاجرا و یا یک پایگاه ذخیرهسازی داده است. کانتینر بخشی از نرمافزار است که بهصورت جداگانه قابل استقرار (deploy) است و اجرا شدن آن برای کارکرد کلی سیستم لازم است. برای مثال یک Web application، پایگاهداده یا یک برنامهی موبایلی مثالهایی از یک Container هستند.
این لایه از سطح انتزاع کمتری نسبت به Context برخوردار است و در واقع مولفههای داخلی سیستم، نحوهی ارتباط آنها، نحوهی تقسیم وظایف بین آنها، تصمیم های اصلی معماری و تکنولوژی های انتخاب شده را نشان میدهد. مخاطب اصلی این لایه افراد فنی داخل و خارج از سازمان هستند. دقت شود که در این نمودار از نحوهی استقرار و یا کلاستر شدن اجزا حرفی نمیزنیم.

در این لایه سطح انتزاع بازهم کاهش مییابد و اجزا داخل یک Container نمایش داده میشود. در اینجا منظور از Componentمجوعهایی از کدهاست که پشت که واسط(API) مناسب و مستند شده قرار گرفته اند. معمولا کل Componentهای داخل یک Containerداخل یک processاجرا میشوند. نکتهی حائز اهمیت در اینجا این است که Component ها به تنهایی قابل استقرار و اجرا نیستند و یک واحد کاملا مستقل به حساب نمیآیند.
این لایه شامل وظایف بخشهای داخل یک Container، وظایف هرکدام و جزئیات تکنولوژیها و پیادهسازی آنها است. مخاطب این لایه برنامهنویسان و معمار داخلی هر تیم است. همچنین توصیه میشود که این نمودار بهصورت خودکار از داخل کد تولید شود.

در نهایت جزئیترین لایه در مدلC4 لایهی کد است. این لایه شامل نمودار UML یا نمودارEntity relationship یک Component است و شامل جزئیات پیادهسازی است. این لایه معمولاً بهصورت خودکار توسط IDEها قابل تولید است و پیشنهاد میشود که از این لایه مگر برای بخشهای خیلی مهم و پیچیده استفاده نشود. همچنین در نمودار UML نیز فقط ویژگیها و اجزای که برایمان اهمیت دارند و قرار است آنها را توضیح دهیم را نمایش میدهیم. مخاطب این نمودار برنامهنویسان و طراح معماری داخل تیم است.

همانطور که در ابتدا گفتیم یکی از اهداف مدل C4 استفاده نمادگذاری ساده و قابلفهم است تا یادگیری و بهیادسپاری را تسهیل کند. مدل کشیده باید بهگونهای باشد که حتی با استفاده از سادهترین اشکال نیز قابلفهم باشد. نمونهای چند شکل پراستفاده در مدل C4 در زیر آورده شده است:

مدل C4 یکی از روشهای مستند کردن و مدل کردن معماری نرمافزار است. در این مدل میتوان متناسب با سطح مخاطب لایههای مختلف انتزاع را در نظر گرفت و مدل کرد. همچنین بر خلاف دیگر روشها، مدل C4 از علائم و نشانهگذاری بسیار سادهای بهره میبرد.
این مطلب، بخشی از تمرینهای درس معماری نرمافزار در دانشگاه شهیدبهشتی است.
https://www.youtube.com/watch?v=Ym9nhVZs89o
https://www.youtube.com/watch?v=x2-rSnhpw0g