بررسی رشته مهندسی نرمافزار
دانشجویان مقطع کارشناسی معمولاً در پایان دوره تحصیلاتشان و صرفاً در قالب یکی دو درس با نام «مهندسی نرمافزار» با آن آشنا میشوند و مفاهیم بسیار مهم و پیچیده تنها بهصورت گذرا معرفی میشود و فرصت کافی برای مسلط شدن بر این مفاهیم فراهم نمیشود. با وجود این، چند سالی است برخی از دانشگاههای برجسته دنیا این رشته را بهصورت مستقل از همان مقطع کارشناسی تدریس میکنند. چهارچوبهای این رشته بهصورت مدون از سوی انجمنهای IEEE و ACM معرفی شده است. در این مقاله، با استناد به کتاب «راهنمای سرفصلهای مهندسی نرمافزار» که توسط شاخه کامپیوتر انجمن IEEE تهیه شده است، چهارچوب رشته مهندسی نرمافزار را مرور کردهایم تا داوطلبان ورود به دانشگاهها (چه در مقطع کارشناسی و چه کارشناسی ارشد) که مایلند روزی بهعنوان مهندس نرمافزار (و نه برنامهنویس کامپیوتر) مشغول به کار شوند، دقیقاً بدانند چه چیزی را باید بیاموزند و چه توقعی از آنان میرود. این چهارچوب برای مؤسسات آموزشی که مایلند دانشجویان را برای بازار کار این رشته آماده کنند نیز مفید است.
مهندسی نرمافزار چیست؟
طبق تعریف ساده و موجزی که در کتاب راهنمای SWEBOK v3.0 آمده است، (1) مهندسی نرمافزار عبارت است از «کاربرد یک رهیافت قابل اندازهگیری، منظم و سیستماتیک برای توسعه، اجرا و نگهداری نرمافزار، یا به طور خلاصه اعمال اصول مهندسی بر نرمافزار». فایل کامل این کتاب 335 صفحهای را میتوانید از وبسایت ماهنامه شبکه دانلود کنید. (2) این تعریف البته خیلی کلی است و برای کسانی که با این شاخه از مهندسی کاملاً آشنا نیستند مقداری گنگ است. مهمترین نکتهای که در این تعریف روشن نیست تفاوت مهندسی نرمافزار با مهارت برنامهنویسی است که درباره آن صحبت خواهیم کرد.
اما قبل از پرداختن به این موضوع لازم است دو نکته را روشن کنیم. نخست، تفاوت مهندسی نرمافزار با مهندسی کامپیوتر از نظر محتوای دروس علمی این رشته و هدف آن است. اگر هنوز مقاله «آشنایی با رشتههای اصلی کامپیوتر در دنیا در مقطع کارشناسی» در شماره 196 ماهنامه شبکه را مطالعه نکردهاید، توصیه میکنیم حتماً نگاهی به آن بیاندازید. در آنجا به تفاوت رشتههای اصلی کامپیوتر در دوره لیسانس، بهویژه تفاوت رشتههای «علوم کامپیوتر»، «مهندسی کامپیوتر» و «مهندسی نرمافزار» اشاره مختصری کردهایم. همچنین، در شماره 199 بهتفصیل درباره معنا و هدف رشته «مهندسی کامپیوتر» صحبت کردهایم. به طور خلاصه، هدف رشته «مهندسی کامپیوتر» تولید سیستمهای کامپیوتری (مانند خود کامپیوتر از قبیل لپتاپ یا گوشی موبایل هوشمند) است. اما «مهندسی نرمافزار» که زیرشاخهای از همین رشته محسوب میشود، با مقداری تغییر جهت در رویکرد و رهیافت، از مباحث سختافزاری و معماری دیجیتال عبور میکند و روی موضوع مهم «تولید انبوه نرمافزار» تمرکز میکند. دوم اینکه، چنانکه جلوتر توضیح خواهیم داد، رشته «مهندسی نرمافزار» بهدلیل ماهیت نرم این رشته به بُعد انسانی فرآیند مهندسی توجه ویژهای نشان میدهد که این بُعد در رشته «مهندسی کامپیوتر» کمرنگ است.
تفاوت مهندسی نرمافزار با مهارت برنامهنویسی
یک نکته مهم برای نوآموزان رشته کامپیوتر تفاوت مهارت برنامهنویسی با مهندسی نرمافزار است. اغلب این دو با هم اشتباه میشود. در حالی که مهارت برنامهنویسی یک مهارت عام برای تمام شاخههای رشته کامپیوتر است، مهندسی نرمافزار شامل این مهارت و فراتر از آن است. اهمیت این موضوع آنجا است که این روزها بسیاری از جوانان حتی پیش از ورود به دانشگاه مهارتهایی در زمینه برنامهنویسی کسب کردهاند و مایلند در دانشگاه چیزی بیشتر از آنچه تا به حال میدانستهاند یاد بگیرند. بسیاری از دروس رشته «مهندسی کامپیوتر» اگرچه جالب و مفیدند، اما بهلحاظ مفهومی بهموازات و نه در امتداد مباحث برنامهنویسی قرار میگیرند. محتوای رشته «مهندسی نرمافزار» دقیقاً برای پاسخ به چنین نیازی تدوین شده است و در ادامه اصول برنامهنویسی معنا پیدا میکند. به این ترتیب، برنامهنویسی (یا کدنویسی) بهعنوان تنها یک ابزار برای این رشته معرفی میشود و ابزارهای دیگری که برای فرآیند تولید حرفهای نرمافزار نیاز است نیز معرفی میشوند. بعضی از این ابزارها انسانی هستند مانند «مهندسی نیازمندیها» و برخی دیگر فرآیندهای مدیریتی هستند مانند «روش آبشاری» یا «روش اجایل» و بعضی ابزارها خود نرمافزارهای کمکی دیگری هستند که به یاری مهندسان نرمافزار میآیند، مانند نرمافزارهایی که برای پیگیری عیوب و باگهای نرمافزار در حال تولید به کار میروند.
فرآیند کامل مهندسی نرمافزار مانند ساعتی است که از دوازده چرخدنده تشکیل شده و هریک از این چرخدندهها یکی از ارکان این فرآیند را به حرکت درمیآورد. ساعت مهندسی نرمافزار وقتی در حالت ایدهآل قرار دارد که همه این چرخها بهدرستی و با سرعت مناسب و در جهت صحیح بچرخند.
ارکان مهندسی نرمافزار
مهندسی نرمافزار رشتهای است که از 15 رکن یا اصطلاحاً حوزه علمی تشکیل شده است. هریک از این پانزده بخش یک موضوع مهندسی بسیار مهم و گسترده است که میتواند بهتنهایی موضوع یک یا چند درس سهواحدی دانشگاهی باشد. سه مورد از این پانزده زمینه با سایر رشتههای کامپیوتر مشترک هستند. آنها عبارتند از:
• مبانی کامپیوتر
• مبانی ریاضیات مهندسی
• مبانی مهندسی
اما دوازده بخش دیگر اختصاصی رشته نرمافزار هستند و ارکان آن را تشکیل میدهند. ارکان مهندسی نرمافزار عبارتند از:
• مهندسی نیازمندیهای نرمافزار
• طراحی نرمافزار
• تولید نرمافزار (کدنویسی)
• تست نرمافزار
• نگهداری نرمافزار
• مدیریت تنظیمات نرمافزار
• مدیریت مهندسی نرمافزار
• فرآیندهای مهندسی نرمافزار
• متدها و مدلهای مهندسی نرمافزار
• کیفیت نرمافزار
• اصول حرفهای و شغلی مهندسی نرمافزار
• اقتصاد مهندسی نرمافزار
چنانکه ملاحظه میکنید، از میان این دوازده رکن، تنها یک مورد یعنی تولید نرمافزار با مهارت برنامهنویس متناظر است و بقیه موارد اگرچه مرتبط هستند اما از جنس کدنویسی نیستند، بلکه مکمل یا پیشنیاز یا ماورای آن هستند. این ارکان را میتوان به چرخدندههای یک ساعت تشبیه کرد که حتی اگر یکی از آنها نچرخد کل سیستم متوقف میشود.
همپوشانی مهندسی نرمافزار با علوم انسانی
از نکات جالب این رشته یکی این است که چندین رکن آن به طور مستقیم به موضوع انسان بهعنوان استفادهکننده یا تولیدکننده نرمافزار توجه ویژه دارد. این یکی از نقاط تمایز «مهندسی نرمافزار» با «مهندسی کامپیوتر» است. اساساً مهندسی نرمافزار با «مهندسی نیازمندیهای مشتری» شروع میشود (حوزه نخست) و با «اصول حرفه و شغلی» این رشته و «اقتصاد مهندسی نرمافزار» خاتمه مییابد. این کافی نیست که نرمافزار جالبی بسازیم. این نرمافزار باید نیازهای مشخصی را پاسخ دهد و مشکلی از مشتری یا مشتریان بالقوه حل کند. برای این منظور ضروری است این نیازها در وهله نخست بهدرستی شناسایی شوند. شاید شما هم تجربه کار با نرمافزارهایی را داشتهاید که جالباند و امکانات زیادی دارند، ولی استفاده از آنها برای کاربرانی که مشتریان اصلی آن هستند دشوار است و نیازشان را خوب پاسخ نمیدهد. این نرمافزارها در واقع خوب مهندسی نشدهاند و در بازار نرمافزار بهتدریج شکست میخورند. همچنین، اگر تولید یک نرمافزار از نظر اقتصادی مقرون به صرفه نباشد و خیلی دیر به دست مصرفکننده برسد ـ حتی اگر قابلیتهای زیادی داشته باشدـ دیگر کارایی خود را از دست داده است. این یکی از ارکان مهندسی نرمافزار است.
اصول حرفهای و شغلی در مهندسی نرمافزار نیز بسیار مهم هستند. برای ما ایرانیان که به جنبه اخلاقی مسائل توجه ویژه نشان میدهیم، حتماً جالب است بدانیم ارزشهای اخلاقی در اصول مهندسی نرمافزار مورد توجه قرار گرفتهاند. طیف وسیعی از مسائل، از رعایت ایمنی و حریم خصوصی و دیجیتالی کاربر نرمافزار گرفته تا توجه به نکات ظریفی مانند خرد نکردن اعصاب مصرفکننده نرمافزار (!) در زمره اخلاق مهندسی قرار میگیرند.
همپوشانی با علوم مدیریتی
مدیریت فرآیند مهندسی نرمافزار یکی دیگر از شاخههای بسیار مهم در این رشته است و «کار تیمی» در کانون این مدیریت قرار میگیرد. یکی از ابعاد «نرم بودن» این رشته انعطافپذیری و درهم تنیدگی بسیار زیاد عوامل فنی و انسانی در فرآیند تولید است. به دو دلیل تولید نرمافزار یک فرآیند مکانیکی نیست که بتوان گامهای آن را بهصورت خطکشی شده و دقیق برنامهریزی کرد. یکی آنکه کاربر محصول نهایی در خیلی موارد «انسان» است و جنبههای روانشناسانه مسائل (مانند زیبایی و کارآمدی واسطه کاربری نرمافزار) بهاندازه جنبههای فنی محصول مهم است. دیگر اینکه، مادامی که تولیدکننده نرمافزارها گروهی از انسانها باشد، احساسات و روحیات تیمی آنان در کیفیت محصول نهایی تأثیر بسزایی دارد. به همین دلیل، چند بخش مختلف این رشته به طور مستقیم و غیرمستقیم با مباحث مدیریت در ارتباط است. از جمله، مباحث «کیفیت نرمافزار»، «تست نرمافزار»، «مدیریت مهندسی» و «متدها و مدلهای مهندسی» دغدغه مدیریتی و کیفی دارند و از ارکان مهم این رشته به شمار میروند.
فصل مشترک با سایر رشتهها و گرایشها
بعضی از ارکان مهندسی نرمافزار با اهداف و رویکرد مهندسی فناوری اطلاعات اشتراکاتی دارند. از جمله، «نگهداری نرمافزار» و «مدیریت تنظیمات نرمافزار» در رشته آیتی نیز سرفصلهای مهمی محسوب میشوند. به طور کلی، هر آنچه به «مهندسی نصب و استقرار و نگهداری سیستمهای کامپیوتری» مربوط میشود، در مهندسی نرمافزار نیز اهمیت دارند و این روزها بخش قابل توجهی از انرژی و وقت مهندسان صرف اینگونه امور میشود. همچنین، موضوع «طراحی نرمافزار» ارتباط تنگاتنگی با مباحث گرافیکی و بصری مانند «واسطه کاربری نرمافزار» دارد. گاهی این واسطه روی نرمافزارهای استاندارد رومیزی (دسکتاپ) هستند و گاهی بهشکل صفحات وب یا اینترفیس برنامههای موبایل. مثلاً نرمافزارهای رزرواسیون هتلها و پرواز هواپیماها چه بهصورت تحت وب و چه بهصورت اپلیکیشنهای موبایل، سیستمهای نرمافزاری پیچیدهای هستند که زمان زیادی از فرآیند مهندسی نرمافزار در آنها صرف طراحی و بهینهسازی واسطه کاربریشان میشود.
اهمیت مهندسی و تولید نرمافزار
مهندسی نرمافزار یک رشته استراتژیک و پولساز در سراسر دنیا است. البته رویکرد این رشته «اقتصاد تولیدمحور» است و وقتی تولید انبوه نرمافزارهای باکیفیت و «مهندسیساز» هدف نباشد، همان «مهارت برنامهنویسی» نیز جوابگوی بسیاری از نیازها است. بعضی کشورهای در حال توسعه مانند هند و چین توجه ویژهای به این موضوع دارند و سرمایهگذاریهای فراوانی روی تقویت پایههای مهندسی نرمافزار در اقلیم خود میکنند. در ایران نیز این سرمایهگذاری روی توانمندسازی متخصصان این رشته میتواند به همان اندازه مفید باشد زیرا ابزارهای تولید در این رشته نسبت به سایر رشتههای مهندسی ارزانتر و قابل بازیافتند.
در بعضی رشتهها مانند الکترونیک تا یک متخصص کارآزموده شود باید چند قطعه بسوزاند و اشتباهات هزینه دارند. در رشته مهندسی نرمافزار میتوان خطاها را از طریق بازنویسی کدهای اشتباه یا ناکارآمد جبران و فرآیندهای تولید را بهمرور بهتر و بهتر کرد. نرمافزار کالایی است که وقتی یکبار تولید شد، تولید انبوه و توزیع آن بسیار کم هزینهتر از محصولات سختافزاری است و محصول نهایی به سهولت از طریق شبکههای کامپیوتری و اینترنت قابل انتقال است.
در اینجا قصد نداریم بیش از این درباره مزایای اقتصادی سرمایهگذاری روی رشته مهندسی نرمافزار صحبت کنیم، اما امیدواریم با توجه به اهمیت این رشته، در شمارههای آتی ماهنامه شبکه مفصلتر به ابعاد و ارکان مهندسی نرمافزار بپردازیم.