
آموزش درس مهندسی نرم افزار کامپیوتر از دید راجر اس پرسمن
فهرست مطالب
درس مهندسی نرمافزار یکی از دروس بنیادین در دوره کارشناسی رشته نرمافزار کامپیوتر است که بر طراحی، توسعه، آزمایش، و نگهداری سیستمهای نرمافزاری با کیفیت بالا و قابل اعتماد تمرکز دارد. این جزوه، برگرفته از دانشگاه امام محمد باقر ساری و مبتنی بر کتاب کلاسیک راجر اس. پرسمن با عنوان “Software Engineering: A Practitioner’s Approach”، به بررسی دقیق و تخصصی سرفصلهای این درس میپردازد. تمامی سرفصلهای ارائهشده توسط شما بهصورت کامل و با جزئیات شرح داده شدهاند، و همچنین مفاهیم کلیدی دیگری از دیدگاه پرسمن که برای درک جامع مهندسی نرمافزار ضروری هستند، اضافه شدهاند.
درمورد درس طراحی الگوریتم بخوانید.
مفهوم مهندس
واژه مهندس از ریشه لاتین ingenium به معنای خلاقیت و ابتکار گرفته شده و در مفهوم هندسه (محاسبه و اندازهگیری) ریشه دارد. مهندس فردی است که با استفاده از دانش علمی، ریاضی، و خلاقیت، مسائل پیچیده را به روشی ساده، نظاممند، و کارآمد حل میکند. در مهندسی نرمافزار، مهندس نقش یک حلکننده مسئله را ایفا میکند که با استفاده از اصول مهندسی، سیستمهای نرمافزاری پیچیده را طراحی و پیادهسازی میکند.
- ویژگیهای کلیدی مهندس:
- توانایی تحلیل و سادهسازی مسائل پیچیده.
- طراحی راهحلهای خلاقانه و قابل اجرا.
- استفاده از رویکردهای نظاممند برای تضمین کیفیت و کارایی.
- مثال: یک مهندس نرمافزار برای توسعه یک سیستم مدیریت بیمارستان، باید نیازهای پیچیده (مانند ثبت نوبت و مدیریت پروندهها) را به اجزای قابلمدیریت تقسیم کرده و راهحلهای کارآمد ارائه دهد.
مفهوم مهندسی نرمافزار
مهندسی نرمافزار، به گفته پرسمن، کاربرد اصول مهندسی برای طراحی، توسعه، آزمایش، و نگهداری نرمافزار بهصورت نظاممند، قابل اعتماد، و مقرونبهصرفه است. این رشته ترکیبی از علم کامپیوتر، مدیریت پروژه، و اصول مهندسی است که هدف آن تولید نرمافزارهایی با ویژگیهای زیر است:
- قابلیت اطمینان: عملکرد بدون خطا در شرایط مختلف.
- کارایی: استفاده بهینه از منابع (زمان، حافظه، پردازش).
- قابلیت نگهداری: امکان بهروزرسانی و رفع اشکال بهسادگی.
- قابلیت استفاده: ارائه تجربه کاربری مطلوب.
مثال: توسعه یک اپلیکیشن بانکداری آنلاین نیازمند مهندسی نرمافزار است تا امنیت تراکنشها، سرعت بالا، و رابط کاربری ساده تضمین شود.
دیدگاه پرسمن: مهندسی نرمافزار فراتر از کدنویسی است و شامل مدیریت فرآیندها، مستندسازی، و ارتباط با ذینفعان است.

چالشهای مهندسی نرمافزار
مهندسی نرمافزار با چالشهای متعددی مواجه است که توسعهدهندگان باید آنها را مدیریت کنند:
- پیچیدگی نرمافزار: نرمافزارهای مدرن ممکن است شامل میلیونها خط کد باشند که هماهنگی آنها دشوار است.
- تغییرات مداوم نیازمندیها: مشتریان ممکن است در طول پروژه نیازهای جدیدی مطرح کنند.
- مقیاسپذیری: نرمافزار باید بتواند با افزایش کاربران یا دادهها عملکرد خوبی داشته باشد.
- کیفیت: تضمین امنیت، کارایی، و تجربه کاربری مطلوب.
- هزینه و زمانبندی: تکمیل پروژه در بودجه و زمان تعیینشده.
- مدیریت ریسک: شناسایی و کاهش عواملی که پروژه را تهدید میکنند.
مثال: در توسعه یک سیستم رزرو بلیط آنلاین، تغییر مداوم نیازهای مشتری (مانند افزودن قابلیت پرداخت جدید) میتواند زمانبندی پروژه را مختل کند.
نرمافزار کامپیوتر حقیقتاً چیست؟
نرمافزار کامپیوتر، به تعریف پرسمن، مجموعهای از برنامهها، دادهها، و مستندات است که برای انجام وظایف خاص روی یک سیستم کامپیوتری طراحی شدهاند. اجزای اصلی نرمافزار:
- برنامهها: کدهای قابل اجرا که عملکردهای موردنظر را پیادهسازی میکنند.
- دادهها: اطلاعات موردنیاز برای اجرای برنامهها، مانند پایگاههای داده.
- مستندات: اسنادی مانند راهنمای کاربر، مشخصات فنی، و مستندات طراحی که برای استفاده و نگهداری نرمافزار ضروریاند.
مثال: یک نرمافزار مدیریت انبار شامل کدهای برنامه (برای مدیریت موجودی)، دادهها (لیست محصولات)، و مستندات (راهنمای استفاده) است.
نکته پرسمن: نرمافزار صرفاً کد نیست، بلکه یک محصول کامل است که تجربه کاربر را شکل میدهد.
چرا تلاش میکنیم سیستم باکیفیت بسازیم؟
ساخت سیستمهای نرمافزاری باکیفیت برای دستیابی به اهداف زیر ضروری است:
- قابلیت اطمینان: جلوگیری از خرابی و خطاها در شرایط مختلف.
- کارایی: اجرای سریع و بهینه با حداقل منابع.
- امنیت: حفاظت از دادهها در برابر تهدیدات سایبری.
- نگهداری آسان: امکان اصلاح و بهروزرسانی بدون پیچیدگی.
- رضایت کاربر: ارائه تجربه کاربری مطلوب و برآورده کردن انتظارات.
- کاهش هزینههای بلندمدت: سیستمهای باکیفیت هزینههای تعمیر و نگهداری را کاهش میدهند.
مثال: یک اپلیکیشن بانکداری باید تراکنشها را بهسرعت و با امنیت بالا انجام دهد تا اعتماد کاربران را جلب کند.
دیدگاه پرسمن: کیفیت نرمافزار مستقیماً بر موفقیت پروژه و رضایت ذینفعان تأثیر میگذارد.
فرایند نرمافزار: ورودی تا خروجی
فرآیند نرمافزار، به گفته پرسمن، مجموعهای از فعالیتهای نظاممند است که از دریافت نیازهای اولیه (ورودی) تا تحویل محصول نهایی (خروجی) را شامل میشود:
- نیازمندیها (ورودی): جمعآوری و مستندسازی نیازهای مشتری.
- تحلیل: بررسی دقیق نیازمندیها برای امکانسنجی و رفع ابهامات.
- طراحی: ایجاد معماری سیستم و طرحهای جزئی.
- پیادهسازی: کدنویسی بر اساس طراحی.
- آزمایش: بررسی نرمافزار برای اطمینان از عملکرد صحیح و رفع اشکالات.
- تحویل و نگهداری: ارائه محصول به مشتری و پشتیبانی مداوم.
مثال: برای یک اپلیکیشن آموزشی، ابتدا نیازها (مانند درسهای آنلاین) جمعآوری میشود، سپس رابط کاربری طراحی شده، کد نوشته میشود، و پس از آزمایش، محصول منتشر میشود.
نکته پرسمن: فرآیند نرمافزار باید منعطف باشد تا با تغییرات نیازها سازگار شود.
نقش مهم شناخت ابزار (زبان برنامهنویسی)
انتخاب زبان برنامهنویسی مناسب تأثیر مستقیمی بر موفقیت پروژه دارد. شناخت ابزارها (مانند زبانهای برنامهنویسی و فریمورکها) به دلایل زیر مهم است:
- بهرهوری: زبانهایی مانند Python به دلیل سینتکس ساده، سرعت توسعه را افزایش میدهند.
- کارایی: زبانهایی مانند C++ برای سیستمهایی با نیاز به عملکرد بالا مناسباند.
- خوانایی کد: زبانهایی مانند Java کدهای قابلفهم و قابل نگهداری تولید میکنند.
- سازگاری با پروژه: زبان باید با نوع پروژه (وب، موبایل، سیستمهای نهفته) هماهنگ باشد.
مثال: برای توسعه یک وبسایت تعاملی، JavaScript به دلیل پشتیبانی از رابطهای پویا مناسب است، در حالی که برای سیستمهای نهفته، C انتخاب بهتری است.
دیدگاه پرسمن: انتخاب ابزار مناسب باید با در نظر گرفتن نیازمندیهای پروژه و مهارتهای تیم انجام شود.
تفاوت نرمافزار و سختافزار چیست؟
- نرمافزار: مجموعهای از دستورات و دادههای قابل اجرا که روی کامپیوتر اجرا میشوند. نرمافزار غیرملموس است و شامل کدهای برنامه، دادهها، و مستندات است.
- مثال: سیستمعامل لینوکس، اپلیکیشنهای موبایل مانند تلگرام.
- سختافزار: اجزای فیزیکی کامپیوتر مانند پردازنده، حافظه، و دیسک سخت که قابل لمس هستند.
- مثال: CPU، RAM، کارت گرافیک.
تفاوت کلیدی: نرمافزار دستورات را تعریف میکند، در حالی که سختافزار بستر فیزیکی برای اجرای این دستورات را فراهم میکند.
مثال: در یک سیستم فروش آنلاین، نرمافزار (وبسایت) منطق فروش را پیادهسازی میکند، اما سرور (سختافزار) آن را اجرا میکند.
چرا مهندسی نرمافزار مهم است؟
مهندسی نرمافزار به دلایل زیر اهمیت دارد:
- تولید نرمافزار باکیفیت: تضمین عملکرد صحیح، امنیت، و تجربه کاربری مطلوب.
- مدیریت پیچیدگی: سازماندهی پروژههای بزرگ با اجزای متعدد.
- کاهش هزینهها: استفاده از روشهای نظاممند هزینههای توسعه و نگهداری را کاهش میدهد.
- تحویل بهموقع: برنامهریزی دقیق برای رعایت زمانبندی پروژه.
- مزیت رقابتی: نرمافزارهای باکیفیت و قابل اعتماد در بازار موفقترند.
مثال: بدون مهندسی نرمافزار، توسعه یک سیستم مدیریت بیمارستان ممکن است با خطاها، تأخیر، و هزینههای بالا مواجه شود.
دیدگاه پرسمن: مهندسی نرمافزار پلی بین نیازهای کاربر و فناوری است که با فرآیندهای منظم، موفقیت پروژه را تضمین میکند.
ویژگیهای اصلی نرمافزار چیست؟
بر اساس دیدگاه پرسمن، نرمافزار ویژگیهای زیر را دارد:
- توسعه داده میشود، نه تولید فیزیکی: برخلاف محصولات فیزیکی، نرمافزار از طریق کدنویسی ایجاد میشود.
- فرسوده نمیشود، اما ممکن است منسوخ شود: نرمافزار با گذر زمان خراب نمیشود، اما ممکن است با فناوریهای جدید ناسازگار شود.
- اغلب سفارشی است: نرمافزارها معمولاً برای نیازهای خاص مشتری طراحی میشوند.
- پیچیده اما انعطافپذیر: نرمافزار قابلیت تغییر دارد، اما مدیریت این تغییرات چالشبرانگیز است.
مثال: یک نرمافزار مدیریت پروژه ممکن است برای یک شرکت خاص سفارشی شود، اما با ظهور فناوریهای جدید نیاز به بازنویسی دارد.
مدل آبشاری چیست؟
مدل آبشاری (Waterfall Model) یک مدل خطی و ترتیبی برای توسعه نرمافزار است که مراحل آن بهصورت متوالی انجام میشوند:
- نیازمندیها: جمعآوری و مستندسازی نیازهای مشتری.
- طراحی سیستم: ایجاد معماری و طرحهای جزئی.
- پیادهسازی: کدنویسی بر اساس طراحی.
- آزمایش: بررسی نرمافزار برای رفع اشکالات.
- نگهداری: پشتیبانی و بهروزرسانی پس از تحویل.
مثال: در توسعه یک سیستم مدیریت کتابخانه، ابتدا نیازها (مانند جستجوی کتاب) مشخص شده، سپس رابط کاربری و پایگاه داده طراحی میشود، کد نوشته شده، آزمایش انجام میشود، و در نهایت سیستم تحویل داده میشود.
دیدگاه پرسمن: مدل آبشاری برای پروژههایی با نیازمندیهای ثابت و مشخص مناسب است، اما برای پروژههای پویا محدودیت دارد.
مزایا و معایب مدل آبشاری
- مزایا:
- سادگی: فرآیند واضح و قابلفهم است.
- ساختارمند: مراحل بهصورت منظم و قابل پیشبینی پیش میروند.
- مناسب پروژههای با نیازمندیهای ثابت: مانند پروژههای دولتی یا صنعتی با مشخصات مشخص.
- معایب:
- انعطافپذیری کم: تغییرات در نیازمندیها در مراحل بعدی دشوار است.
- شناسایی دیرهنگام مشکلات: اشکالات ممکن است در مرحله آزمایش کشف شوند که رفع آنها هزینهبر است.
- عدم بازخورد زودهنگام: مشتری تا پایان پروژه محصول را نمیبیند.
مثال: مدل آبشاری برای توسعه یک سیستم حسابداری دولتی با نیازمندیهای ثابت مناسب است، اما برای یک اپلیکیشن استارتاپی با تغییرات مداوم نامناسب است.
نیازمندیهای نرمافزار به چند دسته تقسیم میشوند؟
نیازمندیهای نرمافزار به دو دسته اصلی تقسیم میشوند:
- نیازمندیهای عملکردی (Functional Requirements): مشخص میکنند که نرمافزار چه کاری باید انجام دهد.
- مثال: در یک اپلیکیشن فروشگاهی، امکان افزودن محصول به سبد خرید.
- نیازمندیهای غیرعملکردی (Non-Functional Requirements): کیفیت و محدودیتهای سیستم را مشخص میکنند، مانند سرعت، امنیت، و مقیاسپذیری.
- مثال: اپلیکیشن باید در کمتر از 2 ثانیه بارگذاری شود یا از دادههای کاربر محافظت کند.
مثال: در یک سیستم بانکی، نیازمندی عملکردی شامل انتقال وجه و نیازمندی غیرعملکردی شامل امنیت تراکنشها و پاسخگویی سریع است.
نکته پرسمن: نیازمندیهای غیرعملکردی اغلب دشوارتر از عملکردیها هستند، زیرا اندازهگیری آنها پیچیدهتر است.
فعالیتهای چارچوب فرایند چیست؟
پرسمن چارچوب فرایند مهندسی نرمافزار را شامل پنج فعالیت کلیدی میداند:
- ارتباط: تعامل با مشتری و ذینفعان برای درک نیازها.
- برنامهریزی: تعیین زمانبندی، منابع، و مدیریت ریسک.
- مدلسازی: طراحی مدلهای سیستم (مانند نمودارهای UML برای تحلیل و طراحی).
- ساخت: کدنویسی و پیادهسازی سیستم.
- تحویل و نگهداری: ارائه محصول به مشتری و پشتیبانی مداوم.
مثال: در توسعه یک اپلیکیشن آموزشی، ارتباط با مشتری برای شناسایی دروس موردنظر، برنامهریزی برای زمانبندی، مدلسازی رابط کاربری، کدنویسی، و تحویل اپلیکیشن انجام میشود.
نکته پرسمن: این فعالیتها باید در هر مدل توسعه (خطی یا تکراری) اجرا شوند.
نقش تحلیل نیازمندیها چیست؟
تحلیل نیازمندیها فرآیند شناسایی، مستندسازی، و تأیید نیازهای مشتری است که پایهای برای طراحی و توسعه نرمافزار فراهم میکند. نقشهای اصلی آن:
- درک دقیق نیازها: مشخص کردن آنچه مشتری واقعاً میخواهد.
- مستندسازی: ثبت نیازمندیها بهصورت واضح و قابلفهم.
- جلوگیری از سوءتفاهم: اطمینان از همراستایی تیم توسعه و مشتری.
- ایجاد پایه طراحی: نیازمندیها بهعنوان ورودی برای معماری سیستم استفاده میشوند.
مثال: در یک نرمافزار مدیریت بیمارستان، تحلیل نیازمندیها مشخص میکند که سیستم باید امکان ثبت نوبت، مدیریت پرونده بیماران، و گزارشگیری را داشته باشد.
دیدگاه پرسمن: تحلیل نیازمندیها قلب مهندسی نرمافزار است، زیرا اشتباه در این مرحله به کل پروژه آسیب میرساند.
تفاوت فرایندهای خطی و تکراری چیست؟
- فرایند خطی:
- مراحل به ترتیب و بدون بازگشت انجام میشوند (مانند مدل آبشاری).
- مناسب پروژههایی با نیازمندیهای ثابت و مشخص.
- مثال: توسعه سیستمهای بانکی با مشخصات دقیق.
- فرایند تکراری:
- مراحل بهصورت چرخهای تکرار میشوند، با امکان بازبینی و بهبود در هر چرخه.
- مناسب پروژههایی با نیازمندیهای متغیر یا نامشخص.
- مثال: توسعه اپلیکیشنهای چابک (Agile) برای استارتاپها.
مثال: مدل آبشاری (خطی) برای سیستمهای دولتی با مشخصات ثابت مناسب است، اما مدل چابک (تکراری) برای اپلیکیشنهای استارتاپی با تغییرات مداوم بهتر عمل میکند.
دیدگاه پرسمن: فرایندهای تکراری انعطافپذیری بیشتری دارند و برای پروژههای مدرن مناسبترند.
چرا مدیریت پروژه نرمافزاری دشوار است؟
مدیریت پروژههای نرمافزاری به دلایل زیر چالشبرانگیز است:
- پیچیدگی نرمافزار: تعداد زیاد اجزا و تعاملات آنها مدیریت را دشوار میکند.
- تغییرات مداوم نیازمندیها: مشتریان ممکن است در طول پروژه نیازهای جدیدی مطرح کنند.
- عدم قطعیت در تخمینها: پیشبینی دقیق زمان، هزینه، و منابع دشوار است.
- مدیریت تیم: هماهنگی بین اعضای تیم با مهارتها و دیدگاههای متفاوت.
- ریسکهای فنی: اشکالات نرمافزاری یا ناسازگاریهای فناوری.
مثال: در یک پروژه اپلیکیشن موبایل، تغییر ناگهانی نیازهای مشتری (مانند افزودن قابلیت چت) میتواند زمانبندی و بودجه را مختل کند.
دیدگاه پرسمن: مدیریت پروژه نیازمند مهارتهای فنی و غیرفنی (مانند ارتباطات و رهبری) است.
مفهوم “بحران نرمافزار” چیست؟
بحران نرمافزار به مشکلات تاریخی در توسعه نرمافزار در دهههای 196 _
مفهوم “بحران نرمافزار” چیست؟
بحران نرمافزار به مشکلات تاریخی در توسعه نرمافزار در دهههای 1960 و 1970 اشاره دارد که شامل موارد زیر بود:
- تأخیر در تحویل: پروژهها اغلب با تأخیرهای قابلتوجه تکمیل میشدند.
- هزینههای بالا: بودجه پروژهها بیش از پیشبینیها بود.
- کیفیت پایین: نرمافزارها پر از خطا و غیرقابل اعتماد بودند.
- عدم تطابق با نیازها: محصولات نهایی اغلب انتظارات مشتری را برآورده نمیکردند.
دیدگاه پرسمن: بحران نرمافزار نتیجه نبود روشهای مهندسی نظاممند بود. معرفی مهندسی نرمافزار بهعنوان یک رشته، این مشکلات را با استفاده از فرآیندهای منظم، مستندسازی، و مدیریت ریسک کاهش داد.
مثال: در دهه 1970، پروژههای نرمافزاری دولتی مانند سیستمهای دفاعی به دلیل فقدان فرآیندهای مهندسی با شکست مواجه شدند.
نقش مستندسازی در مهندسی نرمافزار چیست؟
مستندسازی فرآیند ثبت اطلاعات مربوط به نیازمندیها، طراحی، پیادهسازی، و نگهداری نرمافزار است. نقشهای اصلی آن:
- ارتباط بهتر: ایجاد درک مشترک بین تیم توسعه، مشتری، و سایر ذینفعان.
- نگهداری آسانتر: ارائه راهنما برای بهروزرسانی و رفع اشکال.
- آموزش: کمک به کاربران برای استفاده صحیح از نرمافزار.
- پیگیری پروژه: ثبت تصمیمات و پیشرفت پروژه برای ارجاع بعدی.
مثال: در یک نرمافزار مدیریت انبار، مستندات شامل مشخصات سیستم (مانند قابلیت جستجو)، راهنمای کاربر، و نمودارهای طراحی (مانند UML) است.
دیدگاه پرسمن: مستندسازی یک فعالیت کلیدی است که کیفیت و طول عمر نرمافزار را تضمین میکند.
مدل تکاملی چیست؟
مدل تکاملی رویکردی است که نرمافزار را بهصورت تدریجی و با تکرار توسعه میدهد. در این مدل، نسخههای اولیه نرمافزار ارائه شده و با بازخورد مشتری بهبود مییابد.
- ویژگیها:
- توسعه در چرخههای کوتاه.
- امکان تغییر نیازمندیها در هر چرخه.
- مناسب برای پروژههایی با نیازمندیهای نامشخص.
- مثال: مدل مارپیچی یا پروتوتایپ که در ادامه توضیح داده شدهاند.
- مثال کاربردی: در توسعه یک اپلیکیشن استارتاپی، نسخه اولیه با قابلیتهای پایه (مانند ثبتنام) ارائه شده و بر اساس بازخورد کاربران، قابلیتهای جدید (مانند چت) اضافه میشود.
دیدگاه پرسمن: مدل تکاملی برای مدیریت پیچیدگی و تغییرات در پروژههای مدرن ایدهآل است.
ریسک در پروژههای نرمافزاری چیست؟
ریسک هر عاملی است که میتواند پروژه را از اهدافش (زمان، هزینه، کیفیت) منحرف کند. انواع ریسکها شامل:
- ریسکهای فنی: اشکالات در کد، ناسازگاری فناوری، یا انتخاب ابزار نامناسب.
- ریسکهای مدیریتی: برنامهریزی ضعیف، عدم هماهنگی تیم، یا کمبود منابع.
- ریسکهای مشتری: تغییرات مداوم در نیازمندیها یا عدم وضوح در نیازها.
- ریسکهای خارجی: تغییرات در قوانین، بازار، یا فناوری.
مثال: در یک پروژه نرمافزاری، انتخاب یک فریمورک قدیمی میتواند به ناسازگاری با فناوریهای جدید و افزایش هزینه منجر شود.
دیدگاه پرسمن: مدیریت ریسک باید در تمام مراحل پروژه انجام شود، بهویژه در مدلهای تکاملی مانند مارپیچی.
چرا ارتباط با مشتری در فرایند نرمافزار مهم است؟
ارتباط با مشتری برای موفقیت پروژه حیاتی است، زیرا:
- درک دقیق نیازمندیها: جلوگیری از سوءتفاهم در مورد انتظارات مشتری.
- بازخورد مداوم: بهبود محصول بر اساس نظرات مشتری در طول توسعه.
- افزایش رضایت: محصول نهایی با نیازهای مشتری همراستا خواهد بود.
- کاهش ریسک: شناسایی زودهنگام مشکلات و تغییرات.
مثال: در توسعه یک اپلیکیشن فروشگاهی، جلسات منظم با مشتری برای تأیید قابلیتهایی مانند سبد خرید و پرداخت آنلاین ضروری است.
دیدگاه پرسمن: ارتباط مؤثر با مشتری، پایه موفقیت تحلیل نیازمندیها و تحویل محصول باکیفیت است.
انواع نرمافزار
نرمافزارها بر اساس کاربرد و هدف به دستههای زیر تقسیم میشوند:
- نرمافزار سیستمی: برای مدیریت منابع کامپیوتر طراحی شدهاند.
- مثال: سیستمعاملها (ویندوز، لینوکس)، درایورهای سختافزاری.
- نرمافزار کاربردی: برای انجام وظایف خاص کاربران طراحی شدهاند.
- مثال: نرمافزارهای واژهپرداز (Microsoft Word)، مرورگرهای وب (Chrome).
- نرمافزارهای مهندسی: برای کاربردهای تخصصی در مهندسی و علوم.
- مثال: نرمافزارهای طراحی (AutoCAD)، ابزارهای شبیهسازی (MATLAB).
- هوش مصنوعی: نرمافزارهایی که از الگوریتمهای یادگیری ماشین و هوش مصنوعی استفاده میکنند.
- مثال: دستیارهای صوتی (Siri)، سیستمهای تشخیص چهره.
- نرمافزار تحت وب: نرمافزارهایی که از طریق مرورگر اجرا میشوند.
- مثال: وبسایتهای فروشگاهی (دیجیکالا)، اپلیکیشنهای آنلاین (Google Docs).
دیدگاه پرسمن: هر نوع نرمافزار نیازمند رویکردهای مهندسی خاص خود است.
مفهوم محصول
محصول در مهندسی نرمافزار، خروجی نهایی فرآیند توسعه است که شامل موارد زیر میشود:
- کد قابل اجرا: برنامهای که عملکرد موردنظر را ارائه میدهد.
- دادههای موردنیاز: اطلاعات لازم برای اجرای نرمافزار (مانند پایگاه داده).
- مستندات: اسناد شامل راهنمای کاربر، مشخصات فنی، و مستندات طراحی.
پرسمن تأکید دارد که محصول نرمافزاری نهتنها کد، بلکه کل بستهای است که نیازهای عملکردی و غیرعملکردی مشتری را برآورده کرده و به کاربر تحویل داده میشود.
مثال: محصول یک نرمافزار مدیریت پروژه شامل کد برنامه (برای مدیریت وظایف)، دادههای پروژهها (مانند وظایف و زمانبندی)، و مستندات (راهنمای کاربر و مشخصات فنی) است.
انواع مدلهای مهندسی نرمافزار
1. مدل آبشاری
- توضیح: یک مدل خطی و ترتیبی که مراحل توسعه (نیازمندیها، طراحی، پیادهسازی، آزمایش، نگهداری) بهصورت متوالی انجام میشوند.
- ویژگیها:
- هر مرحله کاملاً تکمیل میشود قبل از شروع مرحله بعدی.
- مناسب برای پروژههایی با نیازمندیهای ثابت.
- مثال: توسعه یک سیستم مدیریت کتابخانه با مشخصات دقیق.
2. مدل چابک (Agile)
- توضیح: رویکردی انعطافپذیر که بر توسعه سریع، تحویل مداوم، و مدیریت غیررسمی ریسک تمرکز دارد.
- ویژگیها:
- توسعه در چرخههای کوتاه (اسپرینتهای 2-4 هفتهای).
- بدون در نظر گرفتن مشکلات احتمالی در آینده.
- مناسب برای پروژههایی با تغییرات زیاد.
- مثال: توسعه یک اپلیکیشن استارتاپی که نیازهای آن بهمرور مشخص میشود.
3. مدل پروتوتایپ (Prototyping)
- توضیح: ساخت نمونه اولیه (پروتوتایپ) برای درک بهتر نیازمندیها قبل از توسعه کامل.
- ویژگیها:
- امکان بازخورد زودهنگام از مشتری.
- مدیریت پیچیدهتر به دلیل نیاز به بازنگری پروتوتایپ.
- مناسب برای پروژههایی با نیازمندیهای متغیر.
- مثال: ایجاد یک نمونه اولیه از رابط کاربری یک اپلیکیشن برای تأیید مشتری.
4. مدل تکاملی
- توضیح: توسعه نرمافزار بهصورت تدریجی و تکراری، با ارائه نسخههای متوالی که بهمرور بهبود مییابند.
- ویژگیها:
- مدیریت پیچیدهتر به دلیل چرخههای تکراری.
- مناسب برای پروژههایی با نیازهای متغیر.
- مثال: توسعه یک نرمافزار مدیریت محتوا که در هر نسخه قابلیت جدیدی اضافه میشود.
5. مدل مارپیچی (Spiral)
- توضیح: ترکیبی از مدلهای خطی و تکراری که در هر چرخه بر تحلیل ریسک تمرکز دارد.
- ویژگیها:
- هر چرخه شامل برنامهریزی، تحلیل ریسک، توسعه، و ارزیابی است.
- پیچیده و زمانبر، اما مناسب برای پروژههای بزرگ و پرریسک.
- مثال: توسعه یک سیستم امنیتی با ریسکهای بالا که نیاز به تحلیل مداوم دارد.
مفاهیم کلیدی اضافهشده از کتاب پرسمن
بر اساس کتاب راجر اس. پرسمن، مفاهیم زیر نیز برای درک جامع مهندسی نرمافزار حیاتیاند و به متن اضافه شدهاند:
1. اصول مهندسی نرمافزار (Core Principles)
پرسمن مجموعهای از اصول را برای مهندسی نرمافزار تعریف میکند:
- ارزش برای مشتری: نرمافزار باید ارزش واقعی برای کاربر ایجاد کند.
- سادگی: طراحیها باید ساده و قابلفهم باشند.
- تکرار و بهبود: توسعه تکراری به بهبود مستمر منجر میشود.
- مدیریت تغییر: تغییرات باید بهصورت نظاممند مدیریت شوند.
مثال: در توسعه یک اپلیکیشن، طراحی ساده رابط کاربری (مانند دکمههای واضح) ارزش بیشتری برای کاربر ایجاد میکند.
2. متدولوژیهای چابک و اسکرام
پرسمن در ویرایشهای جدید کتاب خود به متدولوژیهای چابک، بهویژه اسکرام، توجه ویژهای دارد:
- اسکرام: یک چارچوب چابک که بر تیمهای کوچک، اسپرینتهای کوتاه، و جلسات روزانه (Daily Scrum) تمرکز دارد.
- ویژگیها:
- نقشها: مالک محصول، اسکرام مستر، تیم توسعه.
- مراسمها: برنامهریزی اسپرینت، بازبینی، و بازنگری.
- مثال: در توسعه یک اپلیکیشن، تیم اسکرام در اسپرینتهای دوهفتهای قابلیتهای جدید (مانند سیستم اعلان) را اضافه میکند.
3. معماری نرمافزار
معماری نرمافزار، به گفته پرسمن، طرح کلی سیستم است که اجزا، روابط، و رفتارهای آن را تعریف میکند.
- انواع معماری:
- لایهای (Layered): تقسیم سیستم به لایههای مجزا (مانند ارائه، منطق تجاری، داده).
- مبتنی بر شیء (Object-Oriented): استفاده از کلاسها و اشیا برای مدولارسازی.
- مثال: در یک وبسایت فروشگاهی، معماری لایهای شامل لایه رابط کاربری (فرانتاند)، منطق تجاری (بکاند)، و پایگاه داده است.
4. آزمایش نرمافزار (Software Testing)
آزمایش نرمافزار برای اطمینان از کیفیت و عملکرد صحیح ضروری است. پرسمن آزمایش را به انواع زیر تقسیم میکند:
- آزمایش واحد (Unit Testing): بررسی اجزای کوچک (مانند توابع).
- آزمایش یکپارچگی (Integration Testing): بررسی تعامل بین اجزا.
- آزمایش سیستم (System Testing): بررسی کل سیستم.
- آزمایش پذیرش (Acceptance Testing): تأیید محصول توسط مشتری.
مثال: در یک اپلیکیشن بانکی، آزمایش واحد تابع انتقال وجه را بررسی میکند، در حالی که آزمایش پذیرش تأیید میکند که مشتری میتواند تراکنش را بهراحتی انجام دهد.
5. معیارهای کیفیت نرمافزار
پرسمن معیارهای کیفیت را بر اساس استانداردهایی مانند ISO/IEC 9126 تعریف میکند:
- عملکردی بودن: برآورده کردن نیازهای کاربر.
- قابلیت اطمینان: عملکرد بدون خطا.
- قابلیت استفاده: سهولت استفاده برای کاربر.
- کارایی: استفاده بهینه از منابع.
- قابلیت نگهداری: سهولت در اصلاح و بهروزرسانی.
- قابلیت حمل: اجرا روی پلتفرمهای مختلف.
مثال: یک اپلیکیشن باید رابط کاربری ساده (قابلیت استفاده) و عملکرد سریع (کارایی) داشته باشد.
6. مدیریت پیکربندی نرمافزار (SCM)
مدیریت پیکربندی نرمافزار (Software Configuration Management) فرآیند کنترل و ردیابی تغییرات در نرمافزار است.
- فعالیتها:
- کنترل نسخه (Version Control): مدیریت تغییرات در کد.
- مدیریت ساخت (Build Management): ایجاد نسخههای قابل اجرا.
- مثال: استفاده از Git برای ردیابی تغییرات کد در یک پروژه تیمی.
7. اندازهگیری و معیارهای نرمافزار
پرسمن تأکید دارد که اندازهگیری (مانند تعداد خطوط کد، پیچیدگی سیکلوماتیک) برای ارزیابی پیشرفت و کیفیت پروژه ضروری است.
- مثال: در یک پروژه، معیار Function Points برای تخمین تلاش توسعه استفاده میشود.



