درود بسیار بر همه دوستان
تو این مقاله تلاش کردم تا به یک زبان ساده، یک سری مفاهیم اولیه در مورد مهندسی نرم افزار رو کنار هم بذارم و برای فهم بهتر، اون رو با چند دانش دیگه ای که اکثرا با مهندسی نرم افزار اشتباه میگیرن مقایسه کردم. اگر میخواید به این حیطه وارد بشید یا اینکه وقتی میگید (یا میگن) «مهندسی نرم افزار» واقعا بفهمید چی دارین میگن (یا میگن)، این مقاله بدرد تون نمیخوره! برین کتاب دکتر «پرسمن» رو بخونید. شوخی کردم. این مقاله میتونه نقطه آغاز خوبی باشه.
مهندسی نرم افزار
شاید بهتر باشد ک نخست بپرسیم اصولا «مهندسی» چیست؟ مهندسی عبارت است ازاعمال روشهایی برای تضمین و کنترل کیفیت محصول با بیشترین بازده. هدف از مهندسی، ساخت محصولی هر چه بهتر (کییفیت) در محدوده منابع مشخص شده است (بازدهی و کارایی). محصول آن چیزی است که مشتری آن را درخواست نموده (میتواند اتوموبیل یا یک شاتل فضا پیما باشد) و مهندس می کوشد تا در بازه زمانی مشخص شده و با استفاده از منابعی که در دسترس اوست (پول، افراد، ابزارها، دانشهای دیگر و…) بهترین محصول را بسازد. آیا میتوان خیلی کلی گفت که مهندسی دانش ساختن چیزهایی است که به دردخور هستند؟ بله! و البته ساختن آنها با بهترین کیفیت و کمترین منابع.
برای نمونه مهندسین ایران خودرو در تلاش هستند تا بهترین خودرو ها را در کوتاه ترین زمان ممکن و با توجه به منابعی که به آنها داده شده بسازند (البته در «تلاش» هستند! هنوز به جایی نرسیده اند و احتملا هرگز هم نخواهند رسید). در گوشه ای دیگر از دنیا، مهندسین هوا فضا در«ناسا» می کوشند تا بهترین فضا پیماها را پیش از ممهندسین روسی و با توجه به بودجه ای که به ناسا داده میشود بسازند (که البته «میسازند» و احتملا تا پایان دنیا هم خواهند ساخت). میبینید که مهندسی بسیار مهم است و هیچ دانشی بدون مهندسی به دست مردم نمیرسد.
مهندسی نرم افزار عبارت است از اعمال روشهای مهندسی بر فرایند ساخت نرم افزار برای آنکه نرم افزاری با کیفیت، در زمان موجود و با هزینه مشخص شده ساخته شود. مهندس نرم افزار کسی است که این روشها را در پروژه به کار میبندد و در ننیجه کیفیت و کارایی دلخواه را بدست می آورد. همین جا نخستین ویژگی مهندسی نرم افزار دانسته میشود و آن «کابردی» بودن آن است. با خواندن کتابهای مهندسی نرم افزار کسی مهندس نرم افزار نمی شود، اما آنگاه که روشهای مهندسی نرم افزار را در پروژه به کار انداخت، وارد حیطه مهندسی شده است. اگر این پرسش برایتان پیش آمده که : «اگر مدرک دکترای مهندسی نرم افزار بگیرم اما هیچ نرم افزاری را مهندسی نکنم، آنگاه من چه هستم؟» پاسخش این است که «در دانشکاه صنعتی شریف، در پروژه سیستم عامل ملی مشغول به کار هستید» و هنوز نفهمیده اید که محصول باید به درد کسی بخورد، خواه با دکترا یا بی دکترا . آنچه گفتم بر خلاف صورت فکاهی اش نکته ای بسیار ژرف درباره ماهیت مهندسی نرم افزار در خود دارد و شاهدی است بر اینکه دوصورت عمل نکردن به اصول و روشهای مهندسی نرم افزار، چه پیش خوآهد امدد. فراموش نکنید که به مهندسی نرم افزار باید عمل شود، نه اینکه تنها «دانسته» شود. برای این ساخته شده که به آن عمل شود. هر آنچه به گونه ای فرایند ساخت نرم افزار را کمک کند میتواند جای خود را در این شاخه از مهندسی بیابد. از روانشناسی افراد درگیر (حتی مشتری ها و کد نویسان) گرفته تا روشهای مدیریت پروژه و مستند سازی و صد البته مباحث تخصصی کامیپوتری و نرم افزاری هم که شالوده انرا میسازند و جای خود را دارن.د از جمله برنامه نویسی (اگوریتم، ساختمان داده، آنالیز و طراحی)، طراحی رابط کابر، تست و نگهداری نرم افزار و دانش کامپیوتر (Computer science). همه اینها آنگاه که به ساخت نرم افزار با کیفیت منجر میشوند، مهندسی نرم افزار را میسازند.
از آنچه گفتیم نتیجه میشود که تمام دیگر دانشهای مربوط به کامپیوتر به نوعی در خدمت مهندسی نرم افزار هستند. این نتیجه گیری از دید فلسفه علم کاملا درست است. مانند ریاضی و هندسه که در خدمت فیزیک و شیمی هستند . حتی خود فیزیک و شیمی هم آنگاه کارایی دارند که از آنها چیزی ساخته شود که نیاز انسانها را برآورده کند. هدف از کل دانشهای کامپیوتری این است که از آنها نتیجه ای برای ما انسانها بدست بیاید و بخش بزرگی از آن «نتیجه» هم چیزی نیست جز خود نرم افزار. پس مهندس نرم افزار میتواند اینگونه فرض کند که دیگر شاخه های دانش کامپیوتر او را در رسیدن به هدفش یاری میکنند و کمال آنها زمانی است که چیزی بر کارایی مهندسی نرم افزار بیافزایند. برای روشن شدن موضوع برخی از شاخه های علوم کامپیوتری را با مهندسی نرم افزار مقایسه می کنیم:
برنامه نویسی : هودف آن تنها تولید کد خوب و کارا برای نرم افزار های کاربردی است (Application coding) و بر روی مهارتهای فردی کدنویسی تاکید دارد. تمرکز ان بر روی فرد است. در مقابل مهندسی نرم افزار بر روی کل پروژه تمرکز دارد و تاکید آن بر روی تیم برنامه نویسی و ارتباط آنها با یکدیگر و با دیگر تیمهای درگیر در پروژه است. نرم افزار هایی که در این حیطه جای دارند بدست یکنفر ساخته نمیشوند. برنامه نوسی در زمینه تجارت سخنی برای گفتن ندارد اما هدف از مهندسی نرم افزار آن است که نرم افزار را در بازار جای دهد. تفاوت عمده آنها در «حوزه» کاری است. برنامه نوسی حوزه فردی و مهندسی نرم افزار حوزه پروژه ای دارد.
دانش کامپیوتر: به دنبال پاسخ دادن به پرسشهای بنادین در حیطه فناوری پردازش اطلاعات است. بیشتر ریاضی وار و محض است تا کاربردی. الگوریتم و ساختمان داده (در حات تئوری و محض خود) در این حیطه جای دارند. در مقابل مهندس نرم افزار به چگونگی حل و فصل این مسائل کاری ندارد. وقتی یک الگوریتم جدید مرتب سازی ساخته میشود یا یک مدل داده جدید معرفی میگردد، مهندس نرم افزار به دنبال آن است که آیا این دانش جدید به درد پروژه او میخورد یا خیر و اگر این طور است، چگونه میشود با کمترین هزینه این تکنیک جدید را در پروژه استفاده کرد. برخی ثمرات «دانش کامپیوتر»، مهندسی نرم افزار را عمیقا تحت تاثیر قرار میدهند. برای نمونه زمانی که اشکال ذاتی یک معماری یا متد خاص شناخته میشود یا تئوری های ساخمان داده ها تغییرات اساسی میکنند. مهندسی نرم افزار از این یافته ها استفاده میکند تا نرم افزار بهتری بسازد.
دوست داشتم که مهندسی فرایند و معماری نرم افزار را هم وارد کنم اما بدبختانه با سادگی مقاله مغایرت دارد ساعت هم شش صبح است (نمیکشه).
تا اینجا ماهیت مهندسی نرم افزار را موشکافی کردیم و پافشاریمان بر آن بود که تا به آن عمل نشود، سودی ندارد. از روشهای ساخت نرم افزار با کیفیت چیزی نگفتیم. نگفتیم بلاخره «چطور» میشود که نرم افزار خوب را ساخت. اینها جزئیات و دستاوردهای مهندسی نرم افزار هستند. عمل کردن به آنها (آنچه مهندسی نرم افزار برای ارائه دارد) کیفیت نرم افزار را تضمین میکند. همین«روش»ها هستند که در مجموع مهندسی نرم افزار را میسازند. پس میشود گفت که مهندسی نرم افزار، عمل کردن به روشهای مهندسی نرم افزار است. روشهای مهندسی نرم افزار میگویند که چه کار کنیم تا نرم افزار با کیفیت ساخته شود.
با درود فراوان
خيلي عااااااااااااااااااااااااااااااالي بود دستتان درد نكنه ميشه بازم از اينا به زبان واقعا ساده بنويسين؟ خيلي ممنونم .
مقاله بسیار خوبی بود.
ممنون.
سلام.
یک سئوال : من امسال کنکور دارم.و به شدت علاقه مند به مباحثی مثل هوش مصنوعی و یا ساخت روبات های هوشمند(مثل فوتبالیست یا …) به نظر شما تو کدوم رشته دانشگاهی میتونم بیشتر به علائق ام بپردازم؟ چون تا الان فکر میکردم مهندسی کامپیوتر-نرم افزار رشته مناسبی هست اما با خوندن این نوشتار کمی مردد شدم. یعنی رشته بهتری هم هست تو این زمینه؟!
جالب بود
در پاسخ به خانم «سالومه شایگان»:
درود بسیار بر شما. بدبختامه من از سیستم طبقهبندی رشتههای وابسته به کامپوتر آگاهی ندارم. اما به گونهای کلی آن هدفی که شما بهدنبال آن هستید در مقطع کارشناسی یا حتی کارشناسی ارشد هم بدست نمیاید و هیچ رشته دانشگاهی هم به طور اختصاصی به آن نمیپردازد. افزون بر آن ساختن رباتی که فوتبال بازی کند کار یکنفر نیست و تیمی مرکب از افرادی با تخصصهای گوناگون آن کار را کردهاند. چنانچه به هوش مصنوعی به گونهای محض و ریاضیوار علاقهمندید، برای شما Computer Science مناسب است. اگر به اجزاء و قطعات مکانکی ربات توجه دارید باید رباتیکس بخوانید و اگر پیاده سازی نرمافزاری کنترل ربات برای شما جذابیت دارد، کارتان بسیار دشوار است چون این موضوع (یک ربات فوتبالست) جنبه تجاری چندانی ندارد و زیاد در حیطه مهندسی نرمافزار به صورت رایج نمیگنجند. نزدیکنرین رشته را برگزینید و در راستای آنچه میخواهید پیش بروید. بیشتر دانشجویان ترمهای بالا همین کار را میکنند. برای شما آرزوی کامیابی دارم.
در پاسخ به «رامین»:
از سخنان مهرورزانه شما بسیار شاد شدم. به یاری یزدان میخواهم چندین مقاله برای آشنایی با مدلسازی UML و معماری نرمافزار و الگوهای طراحی بنویسم.
خيلي خوب بود دوست عزيز ما كه فعلا در سرماي شمال به مطالعه ي JavaScript و Prototype براي پروژه مي پردازيم.سعي مي كنم مقاله اي براي سايت آماده كنم.(سعي..)
ممنون از مقاله جالبت
ارادتمند اوس بامداد. پروژه که بدون تو معنی نداره… اصلا زندگی بدون تو معنی نداره!!! (اوه اوه، چی گفتم!)
اگر این پرسش برایتان پیش آمده که : «اگر مدرک دکترای مهندسی نرم افزار بگیرم اما هیچ نرم افزاری را مهندسی نکنم، آنگاه من چه هستم؟» پاسخش این است که «در دانشکاه صنعتی شریف، در پروژه سیستم عامل ملی مشغول به کار هستید»
لطفا نحوه سطح بندی و نمودار یبی را توضیح دهید؟
ببخشید dfd
خانم «سیمین»:
در پاسخ به درخواست شما مقالهای نوشتم. اگر پرسشی بود (که حتما هست) در قسمت نظرات آن مقاله بپرسید، با کمال میل پاسخ خواهم داد (یا اینکه میگم بلد نیستم!)
خوب بود
سلام
شاد و سر حال باشید و خداقوت
ممنونم به خاطر این مطلب مفید
راستش من دنبال روشهای تست نرم افزارم
میخواستم بدونم شما میتونین به من کمک کنین
ممنونتون میشم اگه منو راهنمایی کنین
و باز ممنونتون میشم اگه به میلم بفرستین
با کمال تشکر
موفق وسر بلند باشید
و خدانگهدار اندیشه های سبزتون
برای جمله بالا امیدوارم منظورت دکتر ربیعی یا دکتر خوانساری یا بچه های این گروه نباشه؛ چون توهین هیچ وقت چیز خوبی نیس! در ضمن اینا که 900 میلیون پولو حروم نکردن هیچوقت… رانت برادرشه حق داره….
ولی کلا توهین چیز خوبی نیس…
<<<<<<اگر این پرسش برایتان پیش آمده که : «اگر مدرک دکترای مهندسی نرم افزار بگیرم اما هیچ نرم افزاری را مهندسی نکنم، آنگاه من چه هستم؟» پاسخش این است که «در دانشکاه صنعتی شریف، در پروژه سیستم عامل ملی مشغول به کار هستید»
سلام به همگي
من دانشجو نرم افزار كامپيوتر هستم .اگه مي تونين مراحل تجزيه و تحليل يك سيستم نرم افزاري رو برام ميل كنيد.
سلام من مهندسی نرم ازارو از ایران گرفتم ولی فوق تو کانادا به نظر من بهتره نرم بخونید واسه روباتیک و هوش مصنوعی به آمریکا یا کانادا بییاید چون اینجا و ایرانم از زمین تا آسمون فرق داره من وقتی رفتم کانادا تازه فهمیدم چقدر ما ها در علم کامپیوتر بیسوادیم
سُلام
جالب بود ممنون…موفق باشید
با سلام
نياز مبرم دارم به فصل 29 راجر.اس پرسمن كه در رابطه به مهندسي وب ميباشد. در صورت امكان خواهش ميكنم به ايميل ارسال شود
با تشكر
با سلام به همه دوستان
من یک پروژه کامل درس مهندسی نرم افزار ترجیحا با محتوای سیستم خرید و فروش قطعات شرکت کامپیوتری و یا سیستم ثبت اسنادو املاک رو می خواستم اگر کمکم کنید ممنون میشم
Email : matx8amir@yahoo.com
درود
من راستش درست نفهمیدم که از من کمک خواستید یا از همه دوستان یا اینکه دقیقا چه کمکی خواستید اما اگر پرسشی دارین من خوشحال میشم بپرسین. شاید تونستیم کمکی بکنیم
مقاله توپی بود و به من در فهم مطلب بسیار کمک کرد برای غلط یابی مقاله هم حاضرم کمکت کنم جیگر!!! ولی بچه های کامپیوتر هم کلا حالم گرفتن،اینکه همه دنبال پروژه آماده اند و تازه می خوان که به میلشون فرستاده بشه کمی خجالت ترخدا!!! امیدوارم که بهشون کمک نکنی جیگر!!!
قربون شما خواننده با احساس برم. غلط فنی که چیزی توش نداشت اما اگر غلط املایی پیدا کردی حتما بگو چون از چشم من دیگه دور مونده. هر نظری هم که داری برای غنی تر کردن مقاله و بلاگ بده من حتما با کمال میل بررسی میکنم. این بلاگ مال شماست نه من