برای شناخت مهندسی نرم افزار ابتدا باید ماهیت وجود آن را بهتر بشناسیم بنابراین بهتر است ابتدا کمی در مورد فرآیندهای تولید محصول صحبت کنیم. برای تولید هر محصول یک سری قوانین، استانداردها و توافقها وجود دارند که تولیدکنندگان از آنها تبعیت میکنند و عدم تبعیت از آنها مشکلات بسیاری برای تولید کنندگان و مصرف کنندگان ایجاد خواهد کرد.
فرض کنید این استانداردها و توافقات وجود نداشتند و هر شرکت محصولات خود را بر اساس افکار و علائق خود تولید میکرد؛ در کوچکترین حالت و فقط در تولید کلید و پریز لوازم برقی چه اتفاقی میافتاد؟ دنیایی از تولیدات برقی که هر کدام ساز خودشان را میزند! پریزهای برقی با ۳ یا ۴ درگاه و دوشاخههای معمولی در شرکتهای تولید کننده لوازم برقی که استفاده از آن لوازم را برای مصرف کنندگان غیر ممکن میکردند و همین موضوع سبب میشد که مشتریان علاقهای به خرید محصولات این چنینی نداشته باشند.
بنابراین برای ایجاد یک انسجام کلی در تولید توافقاتی بر اساس استاندارد ایجاد شد تا همه تولیدکنندگان و مصرف کنندگان از آن بهره ببرند. مهندسی نرم افزار نیز تا حد زیادی همین مسیر را در تولید نرم افزار طی میکند و در حقیقت فاکتورها و فرآیندهایی برای رسیدن به محصولی با کیفیت بالا در تولید نرم افزار ارائه میدهد.
مهندسی نرم افزار چیست؟
برای درک بهتر از معانی عباراتی چون مهندسی نرم افزار بهتر است از هم تفکیک شوند. این اصطلاح از دو کلمه نرم افزار و مهندسی ساخته شده است:
- نرم افزار چیزی بیش از کدهای اجرایی یک برنامه نیست. به طور کاملتر نرم افزار به مجموعهای از کدهای برنامه نویسی اجرایی به همراه کتابخانههای مرتبط و اسناد مخصوص آن گفته میشود.
- از طرف دیگر مهندسی به همه موضوعات در مورد نحوه تولید محصولات، با استفاده از اصول و روشهای علمی تعریف شده گفته میشود.
موسسه استاندارد IEEE مهندسی نرم افزار را استفاده از یک روش منظم و قابل اندازه گیری برای توسعه، بهره برداری و نگهداری نرم افزار تعریف میکند.
مزایای مهندسی نرم افزار
بزرگترین مزیت مهندسی نرمافزار ایجاد یک مسیر ایمن برای طراحی و ارائه یک نرم افزار کامل، کاربردی و بدون مشکل است. مهندسی نرم افزار در کنار ارائهی مدلها و راهحلهای مختلف روشهایی را جهت سهولت نگهداری، تعمیر و توسعه آن ارائه میدهد. علاوه بر این در کنار مزایای ذکر شده مزایای فوق العاده دیگری را به همراه میآورد که در ادامه مورد بررسی قرار خواهیم داد.
پیچیدگی را کاهش میدهد
نرم افزارهای بزرگ همیشه پیچیده و دشوار هستند. مهندسی نرم افزار برای کاهش پیچیدگی هر پروژه یک راه حل عالی دارد. مهندسی نرم افزار مشکلات بزرگ را به چندین مشکل کوچک تقسیم می کند تا به راحتی شروع به حل هر یک از مشکلات کوچک کنید. تمام این مشکلات کوچک به طور مستقل از یکدیگر حل می شوند.
به حداقل رساندن هزینه نرم افزار
برخی از نرم افزارها به سخت افزار زیادی احتیاج دارند و این هزینهی کاربران نهایی را برای بهره بردن از آنها افزایش میدهد. یا الگوریتمهای نادرست استفاده شده در آنها سبب میشود نیروی انسانی زیادی برای توسعه نرم افزار جهت تولید میلیونها خط کد به کار گرفته شود. اما در مهندسی نرم افزار، برنامه نویسان همه چیز را برنامه ریزی میکنند و تمام موارد اضافی را که لازم نیست، کاهش میدهند و کدها را به صورت کاملا بهینه سازی شده به اتمام میرسانند.
همچنین اشتباهات حاصل از خطاها زمان و هزینه زیادی را در پی خواهد داشت که هزینه تولید را افزایش خواهد داد. اما به دلیل کاهش خطا و ارائه راهحلهای علمی، هر نرم افزاری که از روش مهندسی نرم افزار استفاده میکند، هزینه کمتری را به افراد مرتبط با نرم افزار تحمیل میکند.
کاهش زمان
هر چیزی که طبق برنامه ساخته نشده باشد، همیشه وقت را تلف میکند. اگر در حال تهیه نرم افزارهای بزرگ هستید بالطبع برای به دست آوردن کد اجرایی نهایی، نیاز به برنامه نویسی هزاران خط کد خواهید داشت. این فرآیند از شروع پروژه تا رسیدن به کد نهایی بسیار وقت گیر است و اگر به خوبی مدیریت نشود میتواند زمان زیادی را به خود صرف کند. بنابراین اگر شما نرم افزار خود را مطابق رویکرد مهندسی نرم افزار تهیه کنید، میزان زیادی از این هدر رفت زمان را کاهش خواهید داد.
انجام راحتتر پروژههای بزرگ
پروژه های بزرگ چند روزه ساخته نمیشوند و به صبر، برنامه ریزی و مدیریت زیادی احتیاج دارند. مهندسی نرم افزار به جهت برنامه ریزی، جهت دهی به کارها، بخش بندی، تقسیم کار و آزمایش و نگهداری را در ارائه نرمافزارها سبب مجزا شدن بخشهای مختلف و اجرای همروند آنها میشود. بنابراین برای مدیریت پروژههای بزرگ شرکتهای نرم افزاری باید به رویکرد مهندسی نرم افزار روی بیاورند.
نرم افزار قابل اعتماد
نرم افزار باید قابل اعتماد باشد، به این معنی که اگر مهندسین نرم افزار آن را به شما تحویل دادهاند، باید حداقل برای مدت زمان مشخص به درستی کار کند. و اگر اشکالی در نرم افزار وجود دارد، شرکت مهندسی مسئولیت حل همه این اشکالات را بر عهده دارد. از آنجا که در مهندسی نرم افزار، روشهای آزمایش و نگهداری ارائه شده است، بنابراین هیچ نگرانی از قابلیت اطمینان بودن نرم افزارها وجود ندارد.
اثربخشی
اثربخشی نشان میدهد که تا چه میزان از نتایج مورد نظر مشتری حاصل شده است. اگر کارها مطابق با استانداردها انجام شده باشد، اثربخشی به وجود میآید. استانداردهای نرم افزاری تمرکز بزرگ شرکتها برای اثربخشی بیشتر نرم افزار هستند. بنابراین نرم افزار با کمک این مباحث کاربردی عملکرد موثرتری خواهد داشت.
اهمیت مهندسی نرم افزار
مهندسی نرم افزار بسیار مهم است زیرا تقریباً در هر صنعت، هر تجارت و برای هر عملکردی نرم افزار خاصی مورد نیاز است. و این موضوع با گذشت زمان از اهمیت بیشتری نیز برخوردار میشود. به عنوان مثال اگر در هنگام خرید آنلاین مشکلی در سبد خرید شما رخ دهد یک مشکل حیاتی است که بر وجهه آن فروشگاه آنلاین تاثیر میگذارد. بنابراین تمامی تلاش صاحبان کسب و کار استفاده از نرم افزارهایی با کمترین میزان خطا و مشکل است که این موضوع توسط تولید نرم افزار بر اساس اصول مهندسی نرم افزار امکان پذیر است.
در تولید صنعتی نرم افزار نیز تمایل به پیروی از یک فرآیند نرم افزاری جهت تضمین تولید یک محصول نهایی قابل تعمیر و نگهداری، قابل اعتماد و کاربردی است. از انتخاب زبان برنامه نویسی مناسب و الگوریتمها گرفته تا در نظر گرفتن پویایی گروه، در دسترس بودن منابع و رضایت مشتریان همه مواردی هستند که مهندسان نرم افزار باید برای هر پروژه در نظر بگیرند و کیفیت حاصل از این اصول تمام چیزی است که کاربران نهایی آن نرم افزار نیاز خواهند داشت.
اما همه این موارد در فازهای مختلف و به وسیله گروههای متخصص بر طبق فرآیندهای مرتبط انجام میشوند که در ادامه به اختصار به بررسی مزایای برخی از آنها میپردازیم.
اهمیت نیاز سنجی و مهندسی نیاز در مهندسی نرم افزار
در این فرآیند نیازها به صورت کامل و مکتوب از طرف قرارداد گرفته میشود و بر اساس آن روشهایی جهت برآورده کردن نیاز در مهندسی نیازمندی تعریف میشود. در حقیقت این نیازمندی است که پایه و اساس هر پروژه است. نیازها شامل انتظاراتی هستند که تمامی افراد مرتبط با نرم افزار دارند.
مهندسی نیازمندیها به ما کمک میکند که درک درستی از نیازها و مسائلی که باید حل شوند به دست بیاوریم و بهترین راه حل را نسبت به نیازهای موجود انتخاب کنیم. برای درک بهتر این فاز مهم فرض کنید که شما به عنوان مهندس معمار قصد طراحی و ساخت یک برج را برعهده دارید. بالطبع ابتدا بایستی نیازهای کارفرما را در پروژه تحویل بگیرید که ممکن است شامل متراژ هر واحد، تعداد آسانسورها، محل قرارگیری راه پله، تعداد طبقات و… باشد.
حال اگر کارفرما زمان مناسبی برای بحث و گفتگو با شما و برگزاری جلسات مورد نیاز جهت بررسی این موضوع اختصاص ندهد و پس از شروع به اجرا و در حین کار به دلیل کاهش هزینهها یکی از نیازها مانند تعداد آسانسور را کاهش دهد چه اتفاقی در پروژه خواهد افتاد و چه چیزهایی تحت تاثیر این تغییر قرار خواهد گرفت؟ قطعا اگر تحویل یک کار کامل و بدون نقص مورد نظر باشد کل پروژه بایستی به نقطه صفر باز گردد تا نقاط ضعف ایجاد شده بر طرف شود!
چرا که با این تغییر به اصطلاح کوچک متراژ و نقشه واحدها تغییر خواهند کرد، اختصاص فضای آسانسور و قرارگیری محلی مرکزی برای آسانسورهای دیگر باید مورد بحث قرار گرفته و در نهایت جابجا شوند، مدل سازی دوباره انجام شود و مراحل انجام شده در ساخت باید تخریب و دوباره سازی شوند و این یعنی هدر رفت زمان و هزینه بسیار زیاد! اگر هم نخواهند این کار را انجام دهند یک برج با هدر رفت فضای خالی آسانسور در طبقات و نقطه ضعف بزرگ عدم دسترسی درست همه ساکنان به آسانسور خواهد بود که به نقطه تاریکی در رزومه کاری کارفرما و مهندس طراح تبدیل خواهد شد.
در فرآیند تولید نرمافزار نیز با رخداد این اشتباهات تمامی این مراحل اتفاق خواهد افتاد. بنابراین شناخت درست نیازها مهمترین گام در طراحی یک محصول استاندارد در کمترین زمان ممکن با صرف کمترین هزینه ممکن است که مستلزم صرف زمان و بررسی و گفتگو برای استخراج تمامی نیازهاست.
اهمیت مدل سازی و طراحی اولیه در مهندسی نرم افزار
معمولا در پروژههای عمران پس از شناسایی نیازها و کشف راههای حل مسئله، تجزیه و تحلیل و استخراج یک طرح نهایی، مهندسین اقدام به ساخت ماکت بر اساس نیازهای ذکر شده توسط کارفرمای پروژه میکنند تا طرح نهایی را برای کارفرما شبیه سازی کنند. معمولا در این فاز تغییراتی توسط کارفرما ایجاد خواهد شد که به طرح مورد تایید نهایی منجر خواهد شد. در مبحث مدل سازی در مهندسی نرم افزار نیز باید این کارها انجام شوند.
در مدل سازی هدف مهندسین تبدیل نیازهای کارفرما به نیازمندیهای قابل پیاده سازی است. به عنوان مثال یکی از نیازهای کارفرما امکان به روز رسانی نرم افزار در پشت صحنه و بدون تایید کاربران است که این باید توسط مهندسین بررسی و در صورت عدم ایجاد باگهای امنیتی اجرا شود. اما در صورت ایجاد مشکل باید باید به نیازهای قابل اجرا تبدیل و به کارفرما ارائه شوند تا بتواند در مورد آنها تصمیم گیری کند.
در طراحی اولیه نیز همانند ساخت ماکت ساختمان و ارائه آن به کارفرما مهندسین نرم افزار نیز یک طرح و شمای کلی از بخشها و کارکردهای نرم افزار به کارفرما ارائه میدهند تا به یک طرح نهایی و مورد تایید برسند.
فاز دوم طراحی نرم افزار
در این بخش نوع معماری نرم افزار، انتخاب واسط کاربری، نحوه پیاده سازی طرح و تبدیل به کد و بسیاری از مسائلی که کاربرد سیستم را به صورت مستقیم تحت الشعاع قرار میدهند مورد بررسی و اجرا قرار میگیرند. تا سیستم به کد اجرایی نهایی تبدیل شود. این بخش مهمترین بخش در فرآیند مهندسی نرم افزار است و بیشترین زمان را به خود اختصاص میدهد.
انتخاب تمامی موارد و پیاده سازی آنها در بهترین حالت ایده آل مهندسی نرم افزار است که با ارائه راه حلهای مختلف سعی در رسیدن به این هدف بسیار مهم دارد. انجام این بخش اگر به صورت علمی و مهندسی شده انجام نشود ممکن است مشکلات جبران ناپذیری ایجاد کند. برای مثال بارها مشکلات و خطاهای برنامه نویسی و طراحی حتی در شرکت های بزرگی چون ناسا سبب سقوط ماهوارهها و خسارتهای چند میلیون دلاری شده است.
کنترل کیفیت و تست نرم افزار
در این فاز نرم افزار ایجاد شده بر اساس موارد مهمی چون صحت عملکرد، پایداری، سادگی و قابلیت فهم و رعایت اصول اساسی در مهندسی نرم افزار و استانداردها مورد بررسی قرار گرفته و در شرایط معینی تست و مورد آزمایش قرار میگیرد تا از عملکرد نهایی آن اطمینان حاصل شود.
رعایت نکردن هر یک از فازها در طراحی و تولید یک نرم افزار ممکن است مشکلات و خسارات گاهاً جبران ناپذیری را به تیم پروژه و کارفرما تحمیل کند. به همین دلیل مهندسی نرم افزار به عنوان علم و روشی پیش رو در تمام شرکتهای بزرگ دنیا مورد توجه بوده و هست تا بتوانند بهترین استفاده را از زمان و هزینه برای تولید با کیفیتترین محصول نرم افزاری داشته باشند.