در این قسمت می خواهیم با معماری نرم افزار آشنا شویم و مروری اجمالی بر آن داشته باشیم. در ابتدا برای وارد شدن به موضوع اصلی لازم می دانم مقدمه ای برای ورود به بحث اصلی را مطرح کنم تا ذهنمان کمی آمادگی ورود به مطلب را داشته باشد. همه ما بارها در طول زندگی خود کلمه معماری را شنیده ایم ولی شاید با شنیدن این کلمه بیش از اینکه فکرمان به سمت سیستم های کامپیوتری برود به سمت ساختمان و یا ساخت و ساز و زیبایی و دکوراسیون می رود. حتی معنی این کلمه در فرهنگ لغت نیز عمل یا فرایند ساخت و کار وابسته به معماری ، ساخت و ساز، هنر یا علم ساخت هر نوع عمارت که مورد استفاده بشر است بیان شده است. در ادامه بحث خواهیم دید که می تواند این دو تعریف چه در نرم افزار و چه در ساخت و ساز ارتباط هایی باهم داشته باشد و در بسیاری از تعاریف و مفاهیم دارای معانی یکسانی باشند. در نتیجه شاید اولین جایی که انسان ها از معماری استفاده کردند به زمان های ساخت ساختمان های بزرگ برمیگردد. مفهوم معماری به طور حتم از زمانهای قدیم در ذهن بشریت بوده و از آن استفاده میکرده است. به طورمثال، ساختن بناهای عظیم، بدون تفکر معماری امکان پذیر نبوده است. اگر بناهایی مثل اهرام مصر یا تخت جمشید را بررسی کنیم، به این نتیجه میرسیم که ساخت چنین بناهایی بدون نقشه اولیه و تدبیرات قبل از ساخت، امکان پذیر نبوده است و در واقع همان مفهوم معماری است. این بدان معنی نیست که ساختمان های کوچک به معماری نیاز ندارند بلکه می توان این گونه برداشت کرد که هر چه سیستم بزرگ تر و پیچیده باشد نیاز به تفکر معماری از قبل بیش تر احساس می شود.
با مقدمه زیر وارد بحث معماری سیستم های نرم افزاری و آنچه از بیان واژه ی معماری هدف و قصد ما است، می شویم. پیشرفت و بزرگتر شدن جامعه بشری در دنیای امروزی و پیچیدهتر شدن روابط بین آنها، باعث بوجود آمدن سیستمهای بزرگ و پیچیده در زندگی انسان امروزی شده است. با پیشرفت علم کامپیوتر و وارد شدن آن به بطن زندگی بشر، اکثر سیستمهایی که بشر امروزی با آنها سروکار دارد، به صورت کامپیوتری پیادهسازی میشوند.
زندگی ما امروزه وابسته به سیستمهای نرمافزاری بزرگ و پیچیده ی موجود میباشد. سیستم های شرکت های هواپیمایی و مسافربری، سیستم های ارتباطی توزیع شده همانند تلویزیون، تلفن های معمولی و همراه، سیستم های بانکداری، سیستم های مدیریت بورس، سیستم های عمل جراحی راه دور، سیستم های کنترل ماهوارههای مختلف، سیستم های معاملات راه دور و هزاران سیستم نرمافزاری دیگر که وجود خلل و نقصی در آن ها تاثیرات جبران ناپذیری بر زندگی ما خواهد داشت. در نتیجه یکی از نیازهای حیاتی بشر امروزی این است که سیستم های بزرگ و پیچیده ی موجود، بدون خطا، سریع، با امنیت و کارایی بالا و… در اختیار آنها قرار گیرد. بنابراین توسعه دهندگان سیستم های نرمافزاری بزرگ و پیچیده، باید سیستمهایی با چنین ویژگیهایی، در اختیار کاربرانشان قرار دهند. در نتیجه ارائه سیستم هایی در مقیاس بزرگ که دارای برخی ویژگیها همچون کارایی بالا، بدون خطا و بدون عیب، سریع و امن و…، نیاز توسعه دهندگان سیستمهای نرمافزاری مقیاس بزرگ میباشد. به این مشخصهها در حوزه مهندسی نرمافزار نیازهای غیرعملیاتی یا مشخصههای کیفی میگویند. مهمترین مسئله در توسعه سیستم های نرمافزاری مقیاس بزرگ، مبحث معماری آن میباشد. معماری، ساختارهای موئلفه ها و زیرسیستم های یک سیستم مقیاس بزرگ و ارتباط بین آنها میباشد. معماری نرمافزار، یکی از مهمترین حوزهها در مهندسی نرمافزار است و دلیل اهمیت آن تاثیر حیاتی معماری در موفقیتِ توسعه سیستم های نرمافزاری است. توسعه یک سیستم نرمافزاری مقیاس بزرگ با ویژگیهای مذکور، نیازمند ارائه یک معماری مناسب و کامل برای سیستم نرمافزاری مورد نظر میباشد. بنابراین ارائه یک معماری درست و مناسب برای چنین سیستمهایی از اهمیت حیاتی برخوردار است.
دسته بندی معماری نرم افزار
معماری را میتوان از جنبههای مختلف مورد بررسی قرار داد. یک طراح پایگاه داده، همیشه از معماری داده صحبت میکند، طراح نرمافزار، از معماری نرمافزار و مدیر ارشد IT سازمان، از معماری اطلاعات سخن میگویند. برای معماری، دستهبندی خاصی در مراجع وجود ندارد ولی در برخی منابع مانند [McGovern 03]، برخی معماری های موجود را تشریح کرده است. در ادامه به معرفی عمده معماری های موجود همانند دستهبندی [McGovern 03] میپردازیم که به صورت زیر میباشد.
• معماری سیستم (System Architecture)
• معماری نرمافزار (Software Architecture)
• معماری سازمان (Enterprise Architecture)
• معماری کسب و کار (Business Architecture)
• معماری اطلاعات (Information Architecture)
• معماری کاربرد (Application Architecture)
• معماری داده (Data Architecture)
• معماری تکنولوژی (Technology/Infrastructure Architecture)
• معماری مرجع (Reference Architecture)
• معماری خط تولید (Product-Line Architecture)
معماری نرم افزار (معماری سیستم)
بالاترین مفهوم در دستهبندیهای معماری، معماری سیستم میباشد. مفهوم معماری نرم افزار و معماری سیستم تقریباً یکسان است. به این دلیل که در بیان تعربف معماری نرم افزار در اصل معماری یک سیستم را تعریف میکنیم که این سیستم میتواند هر چیزی باشد. تعریف معماری سیستم را [IEEE 1471-00] ارائه میکنیم. معماری سیستم، مجموعهاي است از موجودیت های يك سيستم، خصوصيات هر يك از آنها و رابطه بين آنها که یک ساختار برای سیستم تعریف میکنند.
اگر بخواهیم یک تعریف برای معماری نرمافزار (معماری سیستمهای نرمافزاری) یا معماری سیستمهای دیگر (مثل معماری سیستمهای تولیدی) ارائه کنیم، کافی است در تعریف معماری سیستم، بجای “موجودیتها”، موجودیتهای سیستم مورد نظر را قرار دهیم. ولی آنچه از مفهوم معماری برمیآید اینست که معماری، ساختارهای سطح بالای یک سیستم را شامل میشود. درنتیجه اگر بخواهیم تعریف معماری سیستم را برای سیستم های دیگری مثل سیستم های نرمافزاری بیان کنیم، باید موجودیتهای سطح بالای آن را بیان کنیم و در قسمت خصوصیات، چون به صورت Black Box به اجزاء نگاه میکند، فقط خصوصیات بیرونی آنها را در نظر میگیریم. موجودیتهای سطح بالای سیستمهای نرمافزاری، موئلفه های نرمافزاری و زیرسیستم های آن میباشند. درنتیجه تعریف معماری نرمافزار، بر اساس معماری سیستم، بدین صورت باید باشد: معماری نرمافزار، مجموعه زیرسیستم ها و موئلفهها، خصوصیات بیرونی هر یک از آنها و ارتباطات بین آنها است که یک ساختار برای نرمافزار تعریف میکند.
معماری نرمافزار:
یکی از زیر شاخههای مهم و اصلی در مهندسی نرمافزار به شمار میرود. معماری باعث تقسیم بندی یک کل به بخش ها، و ارتباط بین بخش ها میشود که باعث بوجود آمدن گروه هایی از افراد، به صورت سازمانی، جغرافیایی یا در حدود و اندازههای مختلف میشود که به صورت مشترک برای حل یک مسئله بزرگ، تلاش میکنند. معماری یک راه حل تقسیم غلبه برای حل مسائل میباشد، به طوری که یک کل را به بخش ها شکسته و بعد از حل هر یک از بخشها، با استفاده از ارتباط بین بخش ها، باعث حل مسئله اصلی میشود. مفهوم معماري نرمافزار، طراحي سطح بالا ميباشد. يعني فاز طراحي را به دو سطح، طراحي سطح بالا و طراحي با جزئيات تقسيم ميكنيم. در حقيقت هدف مشخص كردن دقيقتر حد فاصل اين دو سطح ميباشد به طوريكه بتوان هر عامل در فاز طراحي را در يكي از اين دو سطح قرار داد.
مجموعه اجزا و معماری نرم افزار و ارتباط بین آن ها
حال معماری نرمافزار، مجموعهای از اجزاء معماری و خصوصیات و رفتارهای بیرونی آنها و ارتباط بیرونی بین آنها است. نکته بعدی که در شناخت و تحلیل معماری نرمافزار وجود دارد اینست که این اجزاء باید سطح مند باشند. یعنی تشکیل یک ساختار سطح مند از اجزاء و روابط، میدهند. ولی ممکن است چندین نوع ساختار ارائه دهیم. به عنوان مثال در پروژههاي مقياس بزرگ، اجزاء مختلف بين تيمه اي مختلف تقسيم ميشود. فرض كنيد براي چنين كاري يكبار سيستم را به صورت عملياتي (تابعي) بين تيم تقسيم كنيم و بار ديگر به صورت دادهاي بين تيمهاي ديگر تقسيم كنيم. در نتيجه ساختارهاي متفاوتي براي توصيف يك سيستم مورد نظر خواهيم داشت. در نهایت معماری ساختارهایی از سیستم مورد نظر میباشد که این ساختارها اجزاء معماری و فقط خصوصیات و رفتارهای بیرونی هر جزء و ارتباط بیرونی بین آنها خواهد بود.
مفهوم کیفیت نرم افزار و مشخصه های کیفی
سیستم های کامپیوتری در بسیاری از برنامههای کاربردهای بحرانی مورد استفاده قرار میگیرد. در این برنامهها یک نقص میتواندعواقب زیادی را به دنبال داشته باشد. توسعه دهندگان اين سيستم ها، مسئول تشخيص و تعيين نيازمندي هاي اين برنامههاي کاربردي و ايجاد سيستم براي محقق سازي اين نيازمندي ها هستند. توسعه دهندگان سیستمه ای بحرانی، ابتدا نیازمندیهای برنامه مورد نظر را شناسایی میکنند، نرمافزار مورد نظر را طوری توسعه میدهند که نیازمندیهای مورد نظر را با منابع مقتضی پوشش داده شوند. سیستم های بحرانی در حالت کلی نیازمند برخی مشخصههای دیگر نیز هستند که میتوان به کارایی، وابستگی، امنیت، سلامتی و برخی نیازهای مشابه اشاره کرد. نيازمنديها در حالت کلي به دو دسته نيازمنديهاي عملیاتی و نيازمندي هاي غیرعملیاتی تقسيم ميشوند. نيازمندي هاي عملیاتی، عبارتست از توانايي سيستم در انجام کاري که براي آن ايجاد شده است. نيازمنديهاي غيرعملیاتی که تحت عنوان مشخصههاي کیفی از آنها ياد ميشود، هر آنچه که غير از نيازمندي هاي عملیاتی سيستم باشد، در اين دسته قرار ميگيرند. مانند کارايي، امنيت، هزينه ساخت و… . کیفیت نرمافزار به صورت مستقیم با توانایی یک سیستم در قبال نحوه انجام نیازمندیهای عملیاتی و غیرعملیاتی آن در ارتباط میباشد. یک سیستم میتواند شامل مشخصههای زیادی همچون کارایی، قابلیت نگهداری، امنیت و… باشد. کیفیت هر یک از مشخصههای موجود، بر کیفیت کل سیستم تاثیر دارد. یعنی کیفیت کل سیستم تابعی از کیفیت تکتک این مشخصهها میباشد. لازم به ذکر است که همیشه کیفیت این مشخصهها قابل اندازهگیری نیست.
سبک ها و الگوهای معماری نرم افزار و نحوه ارزیابی و انتخاب آن ها
هر سیستم، از موئلفههای مختلفی تشکیل شده است. هر سیستم را میتوان به روش های مختلف به موئلفهها و روابط بین آنها شکست. در حقیقت سیستم ها را میتوان به مجموعههای مختلفی از موئلفهها و روابط بین آنها، افراز کرد. برای سیستم های نرمافزاری، روشهای مختلفی برای شکستن سیستم به اجزاء و روابط، وجود دارد که هر کدام از این روش ها در سطوح بالا، یک معماری برای سیستم مورد نظر خواهند بود. برخی از این روش ها یا معماریها، توسط معماران نرمافزار بارها برای سیستم های خاص ارائه شدهاند و به کرات مورد استفاده قرار گرفتهاند و کاربرد ها و توانایی های آنها تائید شده است و مجموعهای از معماریها و الگوهای معماری تشکیل شده است که معماران را در ارائه معماریها، یاری میکنند. یعنی معماران، برای ارائه یک سبک معماری، میتوانند از این مجموعه از معماریها، استفاده کنند. هر یک از معماریهای این مجموعه را یک سبک معماری میگویند.
معرفی برخی از سبک های متداول
• سبک های متمرکز روی داده
• سبک های جریان داده ای
• سبک های ماشین مجازی
• سبک های فراخوانی و بازگشت
• سبک های سیستم شی گرا
• …
با توجه به اینکه هر روز سبکهای زیادی برای حوزههای مختلف ارائه میشود، به طور حتم برای یک حوزه مشخص، بیش از یک سبک معماری نرمافزار وجود خواهد داشت. در نتیجه باید روشهایی برای مقایسه، ارزیابی و انتخاب یک سبک معماری نرمافزار وجود داشته باشند. ارزیابی و انتخاب یک سبک معماری نرمافزار را نباید با روش های ارزیابی معماری نرم افزار اشتباه گرفت. ارزیابی معماری نرمافزار بعد از ارائه معماری برای یک سیستم، برای اطمینان از صحت و پوشش تمامی نیازمندی های ذی نفعان سیستم انجام میشود. در حالی که ارزیابی سبک های معماری نرم افزار برای انتخاب یک سبک معماری از بین چندین سبک میباشد.
تاکنون سبکها زیادی براساس دستهبندی موضوعی یا سیستمی ارائه شده است و روز به روز بر تعداد آنها افزوده میشود. به طوری که استفاده کنندگان سبکها، برای انتخاب یک سبک مطلوب خود باید در کتابها، نوشتهها و مقالات مختلف جستجو کرده که در این صورت به سبکهای زیادی در این حوزه برخورد میکند که باید بر اساس مشخصههای کیفی مورد نظر، سبک مطلوب خود را از بین آنها انتخاب کنند. از طرفی همه روزه بر تعداد سبک ها افزوده میگردد، در حالی هیچگونه استاندارد و سازماندهی خاصی برای گردآوری، دستهبندی، مقایسه و ارزیابی و… آن ها وجود ندارد.
به طور مختصر با معماری نرم افزار آشنا شدیم و در جریان کلیات موضوع قرار گرفتیم حال برای بررسی دقیق تر و علمی تر موضوع برای علاقه مندان به این موضوعات و مهندسی نرم افزار و معماری نرم افزار که هردو بحث های عمیق و جدی در سطوح مهندسی کامپیوتر است شما را به مقالات معتبر و کتب دانشگاهی و پایان نامه ها، برای مطالعه بیشتر و بهتر ارجاع می دهم.