تحصیلات آکادمیک «مهندسی نرم افزار» لازمه؟

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