مقدمه ای بر معماری نرم افزار و طراحی نرم افزار

در این قسمت از سری آموزش معماری نرم افزار و طراحی نرم افزار از وب سایت پرووید که به صورت رایگان به شما تقدیم می گردد، سعی می‌کنیم که یک مقدمه در رابطه با این دو موضوع بسیار مهم در تولید و ساخت محصولات نرم افزاری به شما ارائه دهیم.همانطور که در قسمت معرفی این دوره آموزشی خدمت شما عرض شد، معماری یک سیستم به اجزای تشکیل دهنده اصلی و کلان آن و البته ارتباط بین این ساختارها و تعاملات انجام شده بین آنها دلالت دارد. معماری نرم افزار و طراحی نرم افزار، شامل عوامل مشارکت کننده ای از قبیل؛ استراتژی کسب و کار و یا business strategy، ویژگی های کیفی و یا quality attribute ها، مشارکت های انسانی و یا human dynamics، طراحی و یا design و محیط فناوری اطلاعات و یا IT environment می‌باشد. این موضوع به صورت واضح در تصویر زیر نشان داده شده است.یک موضوع دیگر اینکه به راحتی می توان طراحی و معماری نرم افزار را به دو فاز منحصر به فرد، تفکیک کرد؛ معماری نرم افزار و طراحی نرم افزار. در معماری نرم افزار، تصمیمات غیر عملکردی و یا اصطلاحاً nonfunctional decision ها اتخاذ می گردند و از نیازمندی های عملکردی تفکیک می شوند. این در حالی است که در طراحی نرم افزار، نیازمندی های عملکردی در نظر گرفته می‌شوند. نیازمندی های عملکردی و یا functional requirements، و در کنار آن نیازمندی های غیر عملکردی و یا Non-functional requirements، دو موضوع بسیار مهم می باشند که در قسمت های بعدی در رابطه با آنها صحبت خواهیم کرد.معماری نرم افزارمعماری به عنوان یک نقشه و یا یک الگو برای سیستم ایفای نقش می‌کند. با استفاده از معماری می‌توانیم یک دید کلی و یا اصطلاحاً abstraction را برای مدیریت پیچیدگی‌های سیستم ایجاد کنیم و یک ارتباط بسیار مفید و یک هماهنگی منحصربه‌فرد را بین اجزای تشکیل دهنده یک سیستم ایجاد نماییم.معماری، یک راه حل ساختارمند را برای رسیدن به تمامی نیازمندی های فنی و عملکردی یک سیستم در دست قرار می دهد. علاوه بر این؛ با استفاده از معماری می توان ویژگی های کیفی معمول از قبیل؛ عملکرد و یا performance و امنیت و یا security را تقویت و یا بهبود کرد.علاوه بر این؛ معماری، شامل تصمیمات مهمی در رابطه با سازمان مربوط به توسعه نرم افزار است. هر کدام از این تصمیمات می‌توانند تاثیر چشمگیری بر روی کیفیت، قابلیت نگهداری، قابلیت عملکرد و موفقیت سراسری پروژه داشته باشند. برخی از این تصمیمات شامل موارد زیر هستند:انتخاب عناصر ساختاری و interface هایی که با استفاده از آنها سیستم به عملکرد خود جامه عمل می پوشاند.رفتار تعریف شده بین همکاری‌های شکل گرفته، مابین این عناصر.ترکیب این ساختارها و رفتارهای آنها به درون یک زیر سیستم بزرگتر.تصمیمات معماری منطبق بر اهداف کسب و کار.سبک های معماری و تصمیمات کاربردی در برابر آنها.طراحی نرم افزاردر ادامه در رابطه با طراحی نرم‌افزار صحبت خواهیم کرد. طراحی نرم افزار باعث می شود که یک برنامه طراحی که در آن عناصر مربوط به یک سیستم، نحوه عملکرد آنها با یکدیگر و تعاملات بین آنها برای رسیدن به اهداف یک سیستم، توصیف شود. اهداف مربوط به داشتن یک برنامه طراحی و یا اصطلاحاً design plan، موارد زیر می‌باشند:مذاکره کردن در رابطه با نیازمندی‌های سیستم و تنظیم کردن انتظارات مشتری، بازاریابی و مدیریت پرسنل.به عنوان یک نقشه برای فرآیند توسعه نرم افزار عمل می‌کند. در این رابطه توصیه می‌کنیم از آموزش متنی فرآیندهای توسعه نرم افزار (SDLC) استفاده کنید.راهنمایی برای وظایف پیاده سازی از قبیل؛ طراحی دقیق، کدنویسی، یکپارچه سازی و تست می باشد. در رابطه با تست نرم افزار می توانید از بسته آموزش ویدئویی نکات طلایی تست واحد (Unit Test) پیشرفته در سی شارپ استفاده کنید.طراحی نرم‌افزار قبل از طراحی دقیق، کدنویسی، یکپارچه سازی و تست نرم‌افزار اتفاق می‌افتد و پس از تجزیه و تحلیل دامنه، تجزیه و تحلیل نیازمندی ها و تجزیه و تحلیل ریسک رخ می‌دهد. این تقدم و تأخر دقیقاً در تصویر زیر نشان داده شده اند.اهداف معماریدر ادامه در رابطه با اهداف معماری صحبت خواهیم کرد. هدف اصلی معماری، مشخص کردن نیازمندی هایی است که بر روی ساختار یک برنامه تاثیر می گذارند. یک معماری اصولی و دقیق، باعث کاهش ریسک های تجاری مربوط به ساختن یک نرم افزار فنی می‌شود و به عنوان یک پل ارتباطی، بین نیازمندی های فنی و نیازمندی های تجاری ایفای نقش می‌کند. برخی از دیگر اهداف مربوط به معماری، شامل موارد زیر هستند:نمایانگر ساختار سیستم می‌باشند اما جزئیات پیاده سازی را مخفی می کند.تمامی موارد کاری و یا use-case ها و سناریوها را جامه عمل می پوشانند.تلاش می‌کنند که به نیازمندی های مطرح شده توسط ذینفعان پاسخ دهند.هم نیازمندی های کیفی و هم نیازمندی های عملکردی را در نظر می گیرند.باعث کاهش هدف مالکیت و افزایش جایگاه بازار یک سازمان می شود.باعث افزایش سطح کیفی و عملکردی یک سیستم می گردد.باعث افزایش اعتماد خارجی به سازمان و یا سیستم می‌گردد.محدودیت هامعماری نرم افزار در حال حاضر یک حوزه نوظهور و در حال توسعه و تکامل در مهندسی نرم افزار به حساب می آید و شامل محدودیت های زیر می باشد:نبود ابزارها و روش های استاندارد برای نشان دادن معماری.نبود روش های دقیق تجزیه و تحلیل برای پیش بینی کردن اینکه آیا یک معماری به پیاده‌سازی منجر خواهد شد و تمامی نیازمندی ها را پاسخ خواهد داد و یا خیر.نبود آگاهی از اهمیت طراحی معماری اساسی و توسعه نرم‌افزار.نبود درک مناسبی از نقش معمار نرم افزار و ارتباط نامناسب و ضعیف بین ذینفعان.نبوده درک مناسب از فرایند طراحی، تجربه طراحی و ارزیابی طراحی.در ادامه در رابطه با نقش معمار نرم افزار صحبت خواهیم کرد.نقش یک معمار نرم افزاردر حوزه تولید محصولات نرم افزاری، نقش یک معمار نرم افزار، بسیار مهم و اساسی می‌باشد. یک معمار نرم افزار، یک solution و یا راه حل را ارائه می‌دهد که تیم فنی می‌تواند آن را طراحی و تولید کند و در سرتاسر برنامه و محصول نرم افزاری استفاده نماید. یک معمار نرم افزار باید در مواردی که در قسمت زیر آنها را بررسی خواهیم کرد، تخصص کافی داشته باشد:مهارت کامل در طراحیمتخصصین طراحی سیستم‌های نرم‌افزاری، از متدهای متنوع و متعدد و راهکارهای متفاوتی از قبیل طراحی شی گرا و طراحی مبتنی بر رویدادها استفاده می کنند. در رابطه با این موضوع توصیه می‌کنیم از آموزش ویدئویی مفاهیم برنامه نویسی شی گرا (OOP) در سی شارپ و بسته ی آموزش ویدئویی شی گرایی در سی شارپ و بسته ی آموزش ویدئویی شی گرایی پیشرفته در سی شارپ استفاده کنید.معماران نرم افزار در این حوزه باید بتوانند تیم های توسعه نرم‌افزار را رهبری کنند و تلاش کافی برای هماهنگی آن دسته از افراد، در پیشبرد طراحی سیستم نرم افزاری را داشته باشند.این گونه از افراد همچنین می بایست بتوانند، پیشنهادهای طراحی را بازبینی کنند و مصالحه ها و یا tradeoff های بین هر کدام را تجزیه و تحلیل نمایند.تخصص کامل در مورد دامنهیکی دیگر از حوزه هایی که یک معمار نرم افزار باید در آن تخصص کامل داشته باشد، دامنه و یا domain ای هست که سیستم نرم‌افزاری قرار است در آن مورد استفاده قرار بگیرد.معمار نرم افزار باید بر روی فرآیند کشف نیازمندی‌ها و تضمین کامل شدن و سازگاری پروژه، دقت کافی را داشته باشد.علاوه بر این؛ تعریف domain model برای سیستم در حال توسعه، یکی دیگر از حوزه‌های تخصصی یک معمار نرم‌افزار است. در این رابطه توصیه می کنیم از بسته ی آموزش ویدئویی معماری مدرن نرم افزار Domain Model، CQRS و Event Sourcing از وبسایت پرووید استفاده کنید.تخصص تکنولوژیمعمار نرم افزار باید بتواند درک دقیق و کاملی از تکنولوژی هایی که می‌توانند در پیاده سازی یک سیستم مورد استفاده قرار بگیرند را داشته باشد.همچنین؛ این گونه از افراد باید بتوانند انتخاب صحیحی از پلتفرم ها، فریم ورک ها، زبان های برنامه نویسی، پایگاه های داده یا database ها و مواردی از این دست را داشته باشند.تخصص در متدولوژیمتخصصین حوزه معماری نرم افزار باید بتوانند بر روی متدولوژی‌های توسعه نرم‌افزار که می‌توانند در فاز SDLC و همان software development lifecycle مورد استفاده قرار بگیرند، تخصص کاملی داشته باشند. در رابطه با این موضوع توصیه می‌کنیم از آموزش متنی فرآیندهای توسعه نرم افزار (SDLC) استفاده کنید.این گونه از افراد باید بتوانند از روش های مناسب برای توسعه نرم افزار استفاده کنند و تمامی اعضای تیم نرم افزاری را به سمت این موارد سوق بدهند.نقش پنهان معمار نرم‌افزاریکی از نقشهای بسیار مهم و اغلب پنهان معمار نرم افزار، تسهیل کار فنی بین اعضای تیم نرم افزار و ایجاد اعتماد و ارتباط بین آنها است.متخصصین اطلاعات که دانش و تجارب خود را با اعضای تیم به اشتراک می گذارند، در واقع همین معماران نرم افزار هستند.یکی دیگر از وظایف معماران نرم افزار، محافظت از اعضای تیم در برابر عوامل خارجی است که می‌تواند باعث از بین رفتن تمرکز آنها و از بین بردن ارزش کاری آنها بشود.موارد مورد تحویل یک معماردر این قسمت در رابطه با آنچه که یک معمار نرم افزار می بایست با حضور خود در پروژه رقم بزند و به ما تحویل دهد را بررسی خواهیم کرد.اهداف عملکردی قابل اندازه گیری، کامل، شفاف و سازگار، اولین مورد از مواردی است که معمار نرم افزار باید آنها را بتواند تحویل بدهد.مورد بعدی، یک توصیف عملکردی از سیستم با حداقل دو لایه از تجزیه می باشد.علاوه بر این، معمار نرم افزار باید بتواند درکی از سیستم را برای ما ایجاد کند.طراحی یک سیستم نرم‌افزاری با حداقل دو لایه از تجزیه و یا همان decomposition یکی دیگر از وظایف معمار نرم افزار است.درک مناسبی از زمان بندی، ویژگی های عملکردی و همچنین پیاده سازی برنامه های عملیاتی، از دیگر وظایف یک معمار نرم افزار می باشد.یک سند و یا فرآیند که ضمانت کند، تجزیه عملکردی در روند توسعه پروژه تحت نظر قرار می‌گیرد، از دیگر وظایف یک معمار نرم‌افزار است.در قسمت بعدی از این آموزش در رابطه با ویژگی های کیفی و یا اصطلاحاً quality attribute ها و اهمیت آنها صحبت خواهیم کرد.