مهندسی نرم افزار به زبان (واقعا) ساده

11 01 2008

درود بسیار بر همه دوستان

تو این مقاله تلاش کردم تا به یک زبان ساده، یک سری مفاهیم اولیه در مورد مهندسی نرم افزار رو کنار هم بذارم و برای فهم بهتر، اون رو با چند دانش دیگه ای که اکثرا با مهندسی نرم افزار اشتباه میگیرن مقایسه کردم. اگر میخواید به این حیطه وارد بشید یا اینکه وقتی میگید (یا میگن) «مهندسی نرم افزار» واقعا بفهمید چی دارین میگن (یا میگن)، این مقاله بدرد تون نمیخوره! برین کتاب دکتر «پرسمن» رو بخونید. شوخی کردم. این مقاله میتونه نقطه آغاز خوبی باشه.

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

شاید بهتر باشد ک نخست بپرسیم اصولا «مهندسی» چیست؟ مهندسی عبارت است ازاعمال روشهایی برای تضمین و کنترل کیفیت محصول با بیشترین بازده. هدف از مهندسی، ساخت محصولی هر چه بهتر (کییفیت) در محدوده منابع مشخص شده است (بازدهی و کارایی). محصول آن چیزی است که مشتری آن را درخواست نموده (میتواند اتوموبیل یا یک شاتل فضا پیما باشد) و مهندس می کوشد تا در بازه زمانی مشخص شده و با استفاده از منابعی که در دسترس اوست (پول، افراد، ابزارها، دانشهای دیگر و…) بهترین محصول را بسازد. آیا میتوان خیلی کلی گفت که مهندسی دانش ساختن چیزهایی است که به دردخور هستند؟ بله! و البته ساختن آنها با بهترین کیفیت و کمترین منابع.

برای نمونه مهندسین ایران خودرو در تلاش هستند تا بهترین خودرو ها را در کوتاه ترین زمان ممکن و با توجه به منابعی که به آنها داده شده بسازند (البته در «تلاش» هستند! هنوز به جایی نرسیده اند و احتملا هرگز هم نخواهند رسید). در گوشه ای دیگر از دنیا، مهندسین هوا فضا در«ناسا» می کوشند تا بهترین فضا پیماها را پیش از ممهندسین روسی و با توجه به بودجه ای که به ناسا داده میشود بسازند (که البته «میسازند» و احتملا تا پایان دنیا هم خواهند ساخت). میبینید که مهندسی بسیار مهم است و هیچ دانشی بدون مهندسی به دست مردم نمیرسد.

مهندسی نرم افزار عبارت است از اعمال روشهای مهندسی بر فرایند ساخت نرم افزار برای آنکه نرم افزاری با کیفیت، در زمان موجود و با هزینه مشخص شده ساخته شود. مهندس نرم افزار کسی است که این روشها را در پروژه به کار میبندد و در ننیجه کیفیت و کارایی دلخواه را بدست می آورد. همین جا نخستین ویژگی مهندسی نرم افزار دانسته میشود و آن «کابردی» بودن آن است. با خواندن کتابهای مهندسی نرم افزار کسی مهندس نرم افزار نمی شود، اما آنگاه که روشهای مهندسی نرم افزار را در پروژه به کار انداخت، وارد حیطه مهندسی شده است. اگر این پرسش برایتان پیش آمده که : «اگر مدرک دکترای مهندسی نرم افزار بگیرم اما هیچ نرم افزاری را مهندسی نکنم، آنگاه من چه هستم؟» پاسخش این است که «در دانشکاه صنعتی شریف، در پروژه سیستم عامل ملی مشغول به کار هستید» و هنوز نفهمیده اید که محصول باید به درد کسی بخورد، خواه با دکترا یا بی دکترا . آنچه گفتم بر خلاف صورت فکاهی اش نکته ای بسیار ژرف درباره ماهیت مهندسی نرم افزار در خود دارد و شاهدی است بر اینکه دوصورت عمل نکردن به اصول و روشهای مهندسی نرم افزار، چه پیش خوآهد امدد. فراموش نکنید که به مهندسی نرم افزار باید عمل شود، نه اینکه تنها «دانسته» شود. برای این ساخته شده که به آن عمل شود. هر آنچه به گونه ای فرایند ساخت نرم افزار را کمک کند میتواند جای خود را در این شاخه از مهندسی بیابد. از روانشناسی افراد درگیر (حتی مشتری ها و کد نویسان) گرفته تا روشهای مدیریت پروژه و مستند سازی و صد البته مباحث تخصصی کامیپوتری و نرم افزاری هم که شالوده انرا میسازند و جای خود را دارن.د از جمله برنامه نویسی (اگوریتم، ساختمان داده، آنالیز و طراحی)، طراحی رابط کابر، تست و نگهداری نرم افزار و دانش کامپیوتر (Computer science). همه اینها آنگاه که به ساخت نرم افزار با کیفیت منجر میشوند، مهندسی نرم افزار را میسازند.

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

برنامه نویسی : هودف آن تنها تولید کد خوب و کارا برای نرم افزار های کاربردی است (Application coding) و بر روی مهارتهای فردی کدنویسی تاکید دارد. تمرکز ان بر روی فرد است. در مقابل مهندسی نرم افزار بر روی کل پروژه تمرکز دارد و تاکید آن بر روی تیم برنامه نویسی و ارتباط آنها با یکدیگر و با دیگر تیمهای درگیر در پروژه است. نرم افزار هایی که در این حیطه جای دارند بدست یکنفر ساخته نمیشوند. برنامه نوسی در زمینه تجارت سخنی برای گفتن ندارد اما هدف از مهندسی نرم افزار آن است که نرم افزار را در بازار جای دهد. تفاوت عمده آنها در «حوزه» کاری است. برنامه نوسی حوزه فردی و مهندسی نرم افزار حوزه پروژه ای دارد.

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

دوست داشتم که مهندسی فرایند و معماری نرم افزار را هم وارد کنم اما بدبختانه با سادگی مقاله مغایرت دارد ساعت هم شش صبح است (نمیکشه).

تا اینجا ماهیت مهندسی نرم افزار را موشکافی کردیم و پافشاریمان بر آن بود که تا به آن عمل نشود، سودی ندارد. از روشهای ساخت نرم افزار با کیفیت چیزی نگفتیم. نگفتیم بلاخره «چطور» میشود که نرم افزار خوب را ساخت. اینها جزئیات و دستاوردهای مهندسی نرم افزار هستند. عمل کردن به آنها (آنچه مهندسی نرم افزار برای ارائه دارد) کیفیت نرم افزار را تضمین میکند. همین«روش»ها هستند که در مجموع مهندسی نرم افزار را میسازند. پس میشود گفت که مهندسی نرم افزار، عمل کردن به روشهای مهندسی نرم افزار است. روشهای مهندسی نرم افزار میگویند که چه کار کنیم تا نرم افزار با کیفیت ساخته شود.


کارها

اطلاعات

23 جواب

12 01 2008
رامن

با درود فراوان
خيلي عااااااااااااااااااااااااااااااالي بود دستتان درد نكنه ميشه بازم از اينا به زبان واقعا ساده بنويسين؟ خيلي ممنونم .

12 01 2008
کاوه

مقاله بسیار خوبی بود.
ممنون.

12 01 2008
سالومه شایگان

سلام.
یک سئوال : من امسال کنکور دارم.و به شدت علاقه مند به مباحثی مثل هوش مصنوعی و یا ساخت روبات های هوشمند(مثل فوتبالیست یا …) به نظر شما تو کدوم رشته دانشگاهی میتونم بیشتر به علائق ام بپردازم؟ چون تا الان فکر میکردم مهندسی کامپیوتر-نرم افزار رشته مناسبی هست اما با خوندن این نوشتار کمی مردد شدم. یعنی رشته بهتری هم هست تو این زمینه؟!

12 01 2008
alon1985

جالب بود

13 01 2008
اشکان

در پاسخ به خانم «سالومه شایگان»:

درود بسیار بر شما. بدبختامه من از سیستم طبقه‌بندی رشته‌های وابسته به کامپوتر آگاهی ندارم. اما به گونه‌ای کلی آن هدفی که شما به‌دنبال آن هستید در مقطع کارشناسی یا حتی کارشناسی ارشد هم بدست نمیاید و هیچ رشته دانشگاهی هم به طور اختصاصی به آن نمیپردازد. افزون بر آن ساختن رباتی که فوتبال بازی کند کار یکنفر نیست و تیمی مرکب از افرادی با تخصصهای گوناگون آن کار را کرده‌اند. چنانچه به هوش مصنوعی به گونه‌ای محض و ریاضی‌وار علاقه‌مندید، برای شما Computer Science مناسب است. اگر به اجزاء و قطعات مکانکی ربات توجه دارید باید رباتیکس بخوانید و اگر پیاده سازی نرم‌افزاری کنترل ربات برای شما جذابیت دارد، کارتان بسیار دشوار است چون این موضوع (یک ربات فوتبالست) جنبه تجاری چندانی ندارد و زیاد در حیطه مهندسی نرم‌افزار به صورت رایج نمیگنجند. نزدیکنرین رشته را برگزینید و در راستای آنچه میخواهید پیش بروید. بیشتر دانشجویان ترمهای بالا همین کار را میکنند. برای شما آرزوی کامیابی دارم.

13 01 2008
اشکان

در پاسخ به «رامین»:

از سخنان مهرورزانه شما بسیار شاد شدم. به یاری یزدان میخواهم چندین مقاله برای آشنایی با مدلسازی UML و معماری نرم‌افزار و الگوهای طراحی بنویسم.

13 01 2008
بامداد دشت بان

خيلي خوب بود دوست عزيز ما كه فعلا در سرماي شمال به مطالعه ي JavaScript و Prototype براي پروژه مي پردازيم.سعي مي كنم مقاله اي براي سايت آماده كنم.(سعي..)
ممنون از مقاله جالبت

13 01 2008
اشکان

ارادتمند اوس بامداد. پروژه که بدون تو معنی نداره… اصلا زندگی بدون تو معنی نداره!!! (اوه اوه، چی گفتم!)

14 01 2008
احسان

اگر این پرسش برایتان پیش آمده که : «اگر مدرک دکترای مهندسی نرم افزار بگیرم اما هیچ نرم افزاری را مهندسی نکنم، آنگاه من چه هستم؟» پاسخش این است که «در دانشکاه صنعتی شریف، در پروژه سیستم عامل ملی مشغول به کار هستید» :D

22 01 2008
سیمین

لطفا نحوه سطح بندی و نمودار یبی را توضیح دهید؟

22 01 2008
سیمین

ببخشید dfd

22 01 2008
اشکان

خانم «سیمین»:

در پاسخ به درخواست شما مقاله‌ای نوشتم. اگر پرسشی بود (که حتما هست) در قسمت نظرات آن مقاله بپرسید، با کمال میل پاسخ خواهم داد (یا اینکه میگم بلد نیستم!)

17 02 2008
علي

خوب بود

10 05 2008
امید

سلام
شاد و سر حال باشید و خداقوت
ممنونم به خاطر این مطلب مفید
راستش من دنبال روشهای تست نرم افزارم
میخواستم بدونم شما میتونین به من کمک کنین
ممنونتون میشم اگه منو راهنمایی کنین
و باز ممنونتون میشم اگه به میلم بفرستین
با کمال تشکر
موفق وسر بلند باشید
و خدانگهدار اندیشه های سبزتون

23 08 2008
حسینی

برای جمله بالا امیدوارم منظورت دکتر ربیعی یا دکتر خوانساری یا بچه های این گروه نباشه؛ چون توهین هیچ وقت چیز خوبی نیس! در ضمن اینا که 900 میلیون پولو حروم نکردن هیچوقت… رانت برادرشه حق داره….
ولی کلا توهین چیز خوبی نیس…
<<<<<<اگر این پرسش برایتان پیش آمده که : «اگر مدرک دکترای مهندسی نرم افزار بگیرم اما هیچ نرم افزاری را مهندسی نکنم، آنگاه من چه هستم؟» پاسخش این است که «در دانشکاه صنعتی شریف، در پروژه سیستم عامل ملی مشغول به کار هستید»

11 11 2008
MONA_2M

سلام به همگي
من دانشجو نرم افزار كامپيوتر هستم .اگه مي تونين مراحل تجزيه و تحليل يك سيستم نرم افزاري رو برام ميل كنيد.

12 11 2008
hamidreza

سلام من مهندسی نرم ازارو از ایران گرفتم ولی فوق تو کانادا به نظر من بهتره نرم بخونید واسه روباتیک و هوش مصنوعی به آمریکا یا کانادا بییاید چون اینجا و ایرانم از زمین تا آسمون فرق داره من وقتی رفتم کانادا تازه فهمیدم چقدر ما ها در علم کامپیوتر بیسوادیم

15 01 2009
الهه عشق

سُلام
جالب بود ممنون…موفق باشید

21 02 2009
يزدان

با سلام
نياز مبرم دارم به فصل 29 راجر.اس پرسمن كه در رابطه به مهندسي وب ميباشد. در صورت امكان خواهش ميكنم به ايميل ارسال شود
با تشكر

14 04 2009
امیر

با سلام به همه دوستان
من یک پروژه کامل درس مهندسی نرم افزار ترجیحا با محتوای سیستم خرید و فروش قطعات شرکت کامپیوتری و یا سیستم ثبت اسنادو املاک رو می خواستم اگر کمکم کنید ممنون میشم
Email : matx8amir@yahoo.com

17 04 2009
لوگوس

درود
من راستش درست نفهمیدم که از من کمک خواستید یا از همه دوستان یا اینکه دقیقا چه کمکی خواستید اما اگر پرسشی دارین من خوشحال میشم بپرسین. شاید تونستیم کمکی بکنیم :-)

20 04 2009
محسن

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

20 04 2009
لوگوس

قربون شما خواننده با احساس برم. غلط فنی که چیزی توش نداشت اما اگر غلط املایی پیدا کردی حتما بگو چون از چشم من دیگه دور مونده. هر نظری هم که داری برای غنی تر کردن مقاله و بلاگ بده من حتما با کمال میل بررسی میکنم. این بلاگ مال شماست نه من :-)

بیان دیدگاه