مهندسی نرمافزار (Software engineering) یعنی استفاده از اصول مهندسی بجا و مناسب برای تولید و ارائه محصول نرمافزاری با کیفیت که قابل اطمینان و با صرفه بوده و بر روی ماشینهای واقعی بهطور کارآمدی عمل کند.
برای درک بهتر از معانی عباراتی چون مهندسی نرم افزار بهتر است از هم تفکیک شوند. این اصطلاح از دو کلمه نرم افزار و مهندسی ساخته شده است:
نرم افزار چیزی بیش از کدهای اجرایی یک برنامه نیست. به طور کاملتر نرم افزار به مجموعهای از کدهای برنامه نویسی اجرایی به همراه کتابخانههای مرتبط و اسناد مخصوص آن گفته میشود.
از طرف دیگر مهندسی به همه موضوعات در مورد نحوه تولید محصولات، با استفاده از اصول و روشهای علمی تعریف شده گفته میشود.
موسسه استاندارد IEEE مهندسی نرم افزار را استفاده از یک روش منظم و قابل اندازه گیری برای توسعه، بهره برداری و نگهداری نرم افزار تعریف میکند.
مهندس های موفق می دانند که چطور از زبان برنامه نویسی، پلتفرم ها و معماری مناسب برای توسعه همه چیز از بازی های رایانه ای گرفته تا سیستم های کنترل شبکه استفاده کنند. مهندسان نرم افزار علاوه بر ساختن سیستم های خود، نرم افزارهای ساخته شده توسط مهندسان دیگر را نیز آزمایش، بهبود و پشتیبانی می کنند.
برنامه نویسان کامپیوتر، از مهندسین نرم افزار راهنمایی های لازم را دریافت کرده و شیوه ی برنامه نویسی را به دستورالعمل های کدهای نوشتاری که کامپیوتر توانایی دنبال کردن آن ها را دارد، تغییر می دهند. مهندس نرم افزار نیازهای کاربر، بودجه و سبک کار را تحلیل می کنند تا یک طرح واضح از سیستم نرم افزاری را که این خواسته ها را برآورده میکند، توسعه داده و پیاده کنند. پس از آن راهنمایی های لازم را به منظور برنامه نویسی برای برنامه نویس ها ارائه می کند. پس از آزمایش کردن برنامه به شیوه استاندارد، مهندس نرم افزار به سراغ نگهداری سیستم نرم افزاری به منظور تایید قابلیت اطمینان و قدرت برنامه، می روند.
چارچوب فرایند با تعیین تعداد کوچکی از فعالیت های چارچوبی که برای کلیه پروژه های نرم افزاری قابل استفاده باشند، صرف نظر از اندازه و پیچیدگی آنها، شالوده ای برای یک فرایند مهندسی نرم افزار کامل پی ریزی می کند. یک چارچوب فرایند کلی برای مهندسی نرم افزار شامل پنج فعالیت می شود.
پیش از اینکه هرگونه کار فنی آغاز شود، برقراری ارتباط و همکاری با مشتری بسیار مهم است. هدف، درک اهداف طرف های ذی نفع برای پروژه و جمع آوری خواسته هایی است که می توانند ویژگی ها و قابلیت های عملیاتی نرم افزار را تعیین کنند.
یک پروژه نرم افزاری، سفری پیچیده است و فعالیت برنامه ریزی، نقشه ای ایجاد می کند که به راهنمایی تیم در انجام این سفر کمک می کند. این نقشه با توصیف وظایف فنی که قرار است اجرا شوند، خطرات احتمالی، منابعی که مورد نیاز خواهند بود، محصولات کاری ای که باید تولید شوند و زمانبندی کاری، مهندسی نرم افزار را مشخص می کند.
یک معمار، هر روز با مدل ها کار می کند، اِتودی می زند تا تصویر بزرگ را درک کند، اینکه از نظر معماری چه ظاهری دارد، بخش های سازنده اش چگونه با هم جور در خواهند آمد، و بسیاری خصوصیات دیگر. مهندسی نرم افزار با ایجاد مدل هایی جهت درک بهتر خواسته ها و طراحی که به این خواسته ها برسد، همین کار را می کند.
این فعالیت، تولید کدها و آزمون لازم برای آشکار کردن خطاهای موجود در کدها را با هم تلفیق می کند.
نرم افزار به مشتری تحویل داده می شود تا محصول تحویل داده شده را ارزیابی کرده و بر اساس این ارزیابی، بازخوردی ارائه دهد.
کنترل و پیگیری پروژه های نرم افزاری: به تیم نرم افزاری امکان می دهد تا پیشرفت را در مقایسه با نقشه پروژه بسنجد و هر گونه کنش لازم را برای حفظ زمان بندی به عمل آورد.
خطراتی را ارزیابی می کند که ممکن است بر نتیجه پروژه یا کیفیت محصول تاثیر بگذارند.
فعالیت های لازم برای حصول اطمینان از کیفیت نرم افزار را معین می کند.
محصولات کاری مهندسی نرم افزار را در تلاش برای آشکار کردن خطاها قبل از انتشار آنها در فعالیت بعدی و برطرف کردن آنها ارزیابی می کند.
موازینی از فرایند، پروژه و محصول را تعریف می کند که نیازهای طرف های ذی نفع را برطرف می سازند.
اثرات تغییرات را در سراسر فرایند نرم افزار مدیریت می کند.
ملاک های مربوط به استفاده مجدد (از جمله قطعات نرم افزاری) را تعریف می کند و سازوکارهایی برای دستیابی به قطعات قابل استفاده مجدد برقرار می سازد.
شامل فعالیت های لازم برای ایجاد محصولات کاری از قبیل مدل ها، مستندات، وقایع نگارها(کارنامه ها)، فرم ها و فهرست ها می شود.
مهندسی نرم افزار بسیار مهم است زیرا تقریباً در هر صنعت، هر تجارت و برای هر عملکردی نرم افزار خاصی مورد نیاز است. و این موضوع با گذشت زمان از اهمیت بیشتری نیز برخوردار میشود. به عنوان مثال اگر در هنگام خرید آنلاین مشکلی در سبد خرید شما رخ دهد یک مشکل حیاتی است که بر وجهه آن فروشگاه آنلاین تاثیر میگذارد. بنابراین تمامی تلاش صاحبان کسب و کار استفاده از نرم افزارهایی با کمترین میزان خطا و مشکل است که این موضوع توسط تولید نرم افزار بر اساس اصول مهندسی نرم افزار امکان پذیر است.
یک نکته مهم برای نوآموزان رشته کامپیوتر تفاوت مهارت برنامهنویسی با مهندسی نرمافزار است. اغلب این دو با هم اشتباه میشود. در حالی که مهارت برنامهنویسی یک مهارت عام برای تمام شاخههای رشته کامپیوتر است، مهندسی نرمافزار شامل این مهارت و فراتر از آن است. اهمیت این موضوع آنجا است که این روزها بسیاری از جوانان حتی پیش از ورود به دانشگاه مهارتهایی در زمینه برنامهنویسی کسب کردهاند و مایلند در دانشگاه چیزی بیشتر از آنچه تا به حال میدانستهاند یاد بگیرند. بسیاری از دروس رشته «مهندسی کامپیوتر» اگرچه جالب و مفیدند، اما بهلحاظ مفهومی بهموازات و نه در امتداد مباحث برنامهنویسی قرار میگیرند. محتوای رشته «مهندسی نرمافزار» دقیقاً برای پاسخ به چنین نیازی تدوین شده است و در ادامه اصول برنامهنویسی معنا پیدا میکند. به این ترتیب، برنامهنویسی (یا کدنویسی) بهعنوان تنها یک ابزار برای این رشته معرفی میشود و ابزارهای دیگری که برای فرآیند تولید حرفهای نرمافزار نیاز است نیز معرفی میشوند. بعضی از این ابزارها انسانی هستند مانند «مهندسی نیازمندیها» و برخی دیگر فرآیندهای مدیریتی هستند مانند «روش آبشاری» یا «روش اجایل» و بعضی ابزارها خود نرمافزارهای کمکی دیگری هستند که به یاری مهندسان نرمافزار میآیند، مانند نرمافزارهایی که برای پیگیری عیوب و باگهای نرمافزار در حال تولید به کار میروند.
مهندسی نرمافزار یک حوزه مهم در زمینه فناوری اطلاعات است که به توسعه، طراحی، تست، نگهداری، و مدیریت نرمافزارها میپردازد. مهندسان نرمافزار با استفاده از روشها و استانداردهای مهندسی نرمافزار، کارهای مختلف مرتبط با تولید نرمافزار را انجام میدهند. در زیر تعدادی از جنبههای مهم مهندسی نرمافزار ذکر شدهاند:
– مهندسان نرمافزار در این مرحله با مشتریان و استفادهکنندگان محتمل برای درک نیازها و الزامات مربوط به نرمافزار مورد نظر همکاری میکنند.
– در این مرحله، ساختار و نقشه نرمافزار طراحی میشود. این شامل تصمیمگیری در مورد ساختار داخلی نرمافزار، انتخاب الگوهای طراحی، و تعیین معماری است.
– مرحله پیادهسازی شامل ترجمه طراحی به کد برنامه و پیادهسازی وظایف مشخص شده در مراحل قبلی است.
– تست نرمافزار یک مرحله بسیار حیاتی است که با هدف اطمینان از صحت و کارایی نرمافزار صورت میگیرد. این شامل تست واحد، تست ادغامی، و تست سیستمی است.
– پس از عرضه نسخه اولیه نرمافزار، مرحله نگهداری شروع میشود. این شامل اعمال تغییرات، اصلاح باگها، بهروزرسانیها و افزودن قابلیتهای جدید به نرمافزار است.
– مدیران پروژه نرمافزار به تنظیم و نظارت بر فرآیندهای توسعه نرمافزار، مدیریت منابع، و مسائل مربوط به زمانبندی و بودجهبندی مشغولند.
– در دنیای امروزی که بسیاری از نرمافزارها به شکل خدمات آنلاین در دسترس هستند، مهندسی نرمافزار تحت وب نیز به عنوان یک زیرشاخه مهم مطرح است.
– در طول فرآیند توسعه نرمافزار، پایش و ارزیابی عملکرد نرم
افزار و پروژه به منظور بهبود مستمر و ارتقاء اجزاء مختلف ضروری است.
مهندسی نرمافزار به عنوان یک زمینه پویا و در حال تغییر مداوم، در تلاش برای ایجاد روشها و راهکارهای بهتر برای توسعه نرمافزارهای با کیفیت و قابل اطمینان مشغول به کار است.