مهندسی نرم‌افزار (تکنیک ها و روش ها) – مقدمه – ۱

مهندسی نرم افزار

با نام خدا و سلام، در این مجموعه بحث که در پیش خواهیم داشت قصد دارم به موضوع مهندسی نرم افزار بپردازم.

اهداف در قسمت اول مجموعه مباحث مهندسی نرم افزار:

  • آشنایی با مفهوم «مهندسی نرم افزار» و چیستی آن و چرا اهمیت دارد.
  • فهم و درک اینکه توسعه انواع مختلف سیستم های نرم افزاری نیاز به تکنیک های مختلف مهندسی نرم افزار دارند.
  • آشنایی با مسائل حرفه ای و اصولی برای مهندسی نرم افزار

مرجع اصلی در مجموعه مطالبی که در حوزه «مهندسی نرم افزار» در خدمتتون هستم کتاب “Software Engineering” نوشته ی “Ian Summervil” و ویرایش دهم آن می باشد. مطالب پیش رو به هیچ عنوان کپی شده نیست 😊 ممنون میشم اگر از مطالب استفاده ای می کنید، مرجع مطالب (سایت صادق خان یا محمد صادق صالحی) را قید کنید.

کتاب مهندسی نرم افزار - ایان سامرویل
کتاب Software Engineering

در سال ۲۰۱۶ بیش از ۷۵ درصد از جمعیت جهان دارای گوشی های هوشمند و در نتیجه موبایل های کنترل شده توسط نرم افزار داشنتند و تمامی آنها امکان دسترسی به اینترنت را نیز داشتند.

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

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

در حال حاضر «خرابی نرم افزار» زیاد گزارش می شود و مهندسی نرم افزار را برای توسعه نرم افزارهای مدرن، ناکافی دانسته و آن را نکوهش می کنند. اگرچه به نظر میرسه اکثر این خرابی ها حاصل دو فاکتور زیر باشند:

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

تاریخچه مهندسی نرم افزار:

باور به مهندسی نرم افزار ابتدا در سال ۱۹۶۸ در کنفرانسی مطرح شد که بعدا «نقطه عطف نرم‌افزار» نامیده شد. در این کنفرانس مشخص شد که رویکردهای فردی برای توسعه برنامه، برای سیستم های نرم‌افزاری پیچیده ی بزرگ قیاس پذیر نمی باشد. غیر قابل اعتماد بوده و بیش از حد تعیین شده هزینه بردار بوده و به زمان تحویل تعیین شده نمی رسیدند و معمولا با تاخیر به مشتری تحویل داده می شدند.

 بین سال های دهه ۷۰ و ۸۰ میلادی، تنوعی از تکنیک ها و متدهای مهندسی نرم افزار توسعه داده شدند، به عنوان نمونه : برنامه نویسی ساختاریافته و توسعه شیئ محور. ابزارهای استاندارد در آن سال‌ها توسعه داده شدند که شالوده مهندسی نرم افزار امروزه را ساخته‌اند.

مهندسی نرم افزار

توسعه نرم افزار حرفه ای:

مهندسی نرم افزار قصد دارد که توسعه نرم افزار حرفه ای را پشتیبانی کنه، نه برنامه نویسی شخصی را. که شامل تکنیک هایی است که از مشخصات برنامه، طراحی و تکامل برنامه پشتیبانی می کند و نکته اینجاست که هیچ کدام این موارد به طور معمول با توسعه برنامه شخصی ارتباطی ندارند. برای کمک به اینکه دید گسترده بر مهندسی نرم افزار داشته باشید، به جدول ۱.۱ توجه داشته باشید.

پرسشپاسخ
نرم افزار چیست؟برنامه های کامپیوتری و مستندات مرتبط با آن. محصولات نرم افزاری ممکن است برای یک مشتری مشخص یا برای یک بازار عام طراحی و توسعه داده شوند.
ویژگی های یک نرم‌افزار خوب چیست؟نرم افزار خوب باید عملکرد و کارایی لازم را در اختیار کاربر قرار دهد و باید قابل نگهداری، قابل اطمینان و قابلیت استفاده داشته باشد.
مهندسی نرم‌افزار چیست؟مهندسی نرم‌افزار یک انتظام مهندسی می باشد که نگرانی اش کلیه جنبه های تولید نرم افزار از مفاهیم اولیه تا بهره‌برداری و نگهداری می باشد.
فعالیت های اساسی مهندسی نرم‌افزار چیست؟مشخصات نرم افزار، توسعه نرم‌افزار، اعتبار سنجی نرم‌افزار و تکامل نرم افزار.
تفاوت بین مهندسی نرم‌افزار و علوم کامپیوتر چیست؟علوم کامپیوتر تمرکز روی تئوری و مفاهیم پایه دارد، مهندسی نرم‌افزار توجه‌اش عملی بودن توسعه و ارائه نرم افزار مفید می باشد.
تفاوت بین مهندسی نرم‌افزار و مهندسی سیستم چیست؟مهندسی سیستم توجه بر تمامی جنبه های توسعه سیستم های کامپیوتری شامل سخت‌افزار، نرم‌افزار و مهندسی فرآیند ها دارد. مهندسی نرم‌افزار قسمتی از این فرآیند عمومی تر می باشد.
چالش های اساسی مهندسی نرم‌افزار چیست؟مقابله با افزایش تنوع، تقاضا برای کاهش زمان تحویل  و توسعه نرم افزاری قابل اعتماد
هزینه های مهندسی نرم‌افزار چیست؟تقریباً ۶۰ درصد از هزینه نرم‌افزار هزینه های توسعه آن می باشد و ۴۰ درصد هزینه تست کردن آن. برای نرم‌افزارهای سفارشی، هزینه های تکامل عموما بیشتر از هزینه های توسعه می باشد.
بهترین متد و تکنیک‌های مهندسی نرم‌افزار چیست؟به این دلیل که همه ی پروژه های نرم‌افزاری باید به طور حرفه ای مدیریت و توسعه شوند، تکنیک های متفاوتی برای انواع مختلف سیسستم ها مناسب می باشد. برای مثال، بازی‌ها باید همیشه با مجموعه ای از پروتوتایپ ها توسعه داده شوند، درحالیکه سیستم های کنترل ایمنی بحرانی، نیازمند مشخصات کامل و قابل تحلیلی دارند تا توسعه داده شوند. متد یا روشی وجود ندارد که برای همه چیز خوب باشد.
چه تفاوت‌هایی را اینترنت در مهندسی نرم‌افزار ایجاد کرده است؟نه تنها اینترنت منجر به توسعه سیستم های بسیارگسترده، بزرگ و مبتنی بر سرویس شده است، همچنین منجر به پشتیبانی از ساخت اپلیکیشن برای دستگاه های موبایل شده است که خود باعث تغییر در افتصاد نرم افزار شده است.
جدول ۱.۱

خیلی از افراد فکر می کنند نرم افزار (Software) به سادگی و به لغتی دیگر همان برنامه های کامپیوتری (Computer Program ) می باشد. در حالیکه وقتی ما از مهندسی نرم افزار صحبت می کنیم، نرم افزار فقط خود برنامه ها نمی باشد، بلکه تمامی مستندات مرتبط، کتابخانه ها، وب سایت های پشتیبانی، و داده های پیکر بندی مورد نیاز برای بهبود این برنامه ها را شامل می شود. یک سیستم نرم افزار حرفه ای توسعه یافته، اغلب بیشتر از یک برنامه می باشد. یک سیستم ممکن است شامل چندین برنامه جدا باشد که از فایل های پیکربندی جهت تنظیم همین برنامه ها استفاده می کند.

این یکی از مهمترین تفاوت های بین توسعه نرم افزار حرفه ای و آماتور می باشد زمانی که شما برنامه ای برای خودتان می نویسید، نگران این نیستید که سندی برای روش استفاده آن بسازید، چرا که فقط خود شما از آن استفاده خواهید کرد. در حالیکه اگر نرم افزاری توسعه می دهید که افراد دیگر از آن استفاده می کنند و مهندسین دیگری آن را تغییر خواهند داد، شما باید اطلاعات اضافی دیگری در کنار کُد فراهم کنید.

مهندسین نرم افزار، دغدغه شان در مورد نرم افزاری است که قرار به فروش آن به مشتری می باشد، دو نوع محصول نرم افزاری وجود دارد:

  1. محصولات عمومی (Generic products): این سیستم ها مستقل (stand-alone) هستند که توسط یک سازمان توسعه دهنده تولید شده‌اند و در بازار آزاد به هر مشتری که قادر به خرید آن باشد، فروخته می‌شوند. مثال برای این نوع محصولات میتوان: محصولاتی شامل اپ های موبایل، نرم‌افزار برای Pcها مانند پایگاه‌داده ها، ویرایشگر های متن، پکیچ های طراحی و ابزار های مدیریت پروژه اشاره کرد.
  2. نرم‌افزار سفارشی (Customized (or bespoke) software): اینها سیستم‌هایی هستند که توسط مشتری خاصی و برای همان مشتری توسعه داده شده اند. پیمانکار نرم افزاری را برای مشتری و مختص آن طراحی و پیاده سازی می کند. مثال بر این توع نرم‌افزارها: سیستم های کنترلی برای دستگاه‌های الکترونیکی، سیستم هایی که برای پشتیبانی فرآیند تجاری مشخصی نوشته می‌شوند و سیستم های کنترل ترافیک هوایی.

تمایز مهم بین این سیستم ها این هست که در محصولات عمومی، سازمانی که محصول را توسعه داده است، مشخصات نرم‌افزار را نیز کنترل می کند. به این معنی که اگر به مشکلات توسعه برخورد کنند، آنها می توانند مجدد فکر کنند که چه چیزی درحال توسعه است. در محصولات سفارشی، مشخصات توسط سازمانی که نرم‌افزار را خریداری کرده است، کنترل و توسعه داده می شوند. توسعه دهندگان نرم‌افزار باید با همان مشخصات کار کنند.

با این حال باز تمایز بین این دو دسته تقریبا مات و غیر شفاف است. در حال حاضر سیستم های زیادی ابتدا به صورت محصول عمومی توسعه داده می شوند و سپس نیازمندی های مشتری وفق داده می شوند. برا مثال سیستم های ERP.

مجموعه مشخصه های خاصی که شما ممکن است از سیستم های نرم‌افزاری انتظار داشته باشید به کاربرد آن سیستم بستگی دارد. در نتیجه سیستم کنترل هوایی باید ایمن باشد، یک بازی تعاملی باید واکنشگرا باشد و یک سیستم سوییچینگ تلفن نیز باید قابل اعتماد باشد و … .اینها را میتوان به مجموعه ویژگی هایی نشان داد. در تصویر ۱.۲ ویژگی های اساسی یک سیستم نرم افزاری حرفه ای نشان داده شده است.

ویژگی محصولتوضیحات
مقبولیت (Acceptability)نرم افزار باید برای کاربرانی که برای آنها طراحی شده، قابل پذیرش باشد. به این معنی که باید قابل فهم باشد، قابل استفاده و سازگار با دیگر سیستم هایی که آنها استفاده می کنند، باشد.
قابلیت اطمینان و امنیت (Dependability and security)قابلیت اطمینان نرم افزار شامل گستره ای از ویژگی ها از جمله قابلیت اعتماد، امنیت و ایمنی می باشد. نرم افزار قابل اعتماد نباید بهنگام رخداد خطای سیستمی، منجر به آسیب های فیزیکی یا اقتصادی شود. نرم افزار باید امن باشد و در نتیجه کاربران مخرب نتوانند به سیستم دسترسی داشته باشند یا به آن آسیب وارد کنند.
کارایی (Efficiency)نرم افزار نباید در استفاده از منابع سیستمی همچون مموری و پردازنده، ولخرجی داشته باشد.
قابلیت نگهداری (Maintainability)نرم افزار باید به روشی نوشته شود که بتواند منجر به تغییرات مورد نیاز کاربران شود. این ویژگی بحرانی می باشد، چرا که تغییر نرم افزار نیاز غیر قابل امتناع از تغییر محیط بیزینس مورد نظر می باشد و باید بتوان با محیط جدید و تغییرات وفق پیدا کند.