۲۴ موضوع مهمی که مهندسان نرم افزار و برنامه نویسان باید در کنار برنامه نویسی بیاموزند
یک مهندس نرم افزار در وهله اول باید زمان زیادی را صرف آموزش کند. حتی اگر همه چیز را هم بلد باشد، باید مدیریت تجربه زیادی کسب نماید. من قصد ندارم شما را با آنچه در ادامه میگویم دلسرد کنم. اما مواردی که ذکر میشود، همان چیزی است که وقتی میخواهید یک مهندس نرم افزار تمام عیار شوید باید از خود انتظار داشته باشید.
ریاضیات و منطق
آشنایی با نظریه اعداد، جبر مقدماتی، کاربردهای آن در کدنویسی و ماشینهای حالت متناهی. علاوه بر این منطق، نحوه کار آن، سیستمهای مختلف منطقی که وجود دارد و تأثیر آنها بر توسعه سیستمهای نرم افزاری، نحوه بهینهسازی عبارات منطقی، همچنین عبارات منظم و کاربردهای آنها.
الگوریتمها و ساختارهای داده
الگوریتمها و ساختار دادهها اصول برنامه نویسی هستند نه زبانهای برنامه نویسی. پس باید الگوریتمهای مختلف را بشناسید. به عنوان مثال انواع جستجو، ترتیب، الگوریتمهای عددی، اتصال نمودارها، درختها، تکنیکهای ماتریس و مواردی از این دست. همچنین آشنایی با ساختارهای داده اولیه و پیشرفته مثل لیستها، پشتهها، صفها و جداول هش داشته باشید. به علاوه تکنیکهای برنامه نویسی: بازگشتی، تعاملی، تقسیم و غلبه، الگوریتمهای حریصانه، تکنیکهای اکتشافی، کوله پشتی، بهینهسازی توابع هش و… .
برخی از تکنیکهای پیشرفته: برنامهنویسی پویا، الگوریتمهای مبتنی بر جریان، الگوریتمهای ژنتیک، الگوریتمهای تکاملی، ازدحام الگوریتمها و سایر تکنیکهای بهینهسازی.
درست است زمانی که الگوریتمها را مطالعه میکنید، تمایل دارید از یک زبان برای پیادهسازی آنها استفاده کنید، اما یادگیری زبان در اولویت آخر قرار میگیرد.
به علاوه میتوان گفت که مطالعه الگوریتمها با زبانهایی که معمولا در صنعت استفاده نمیشوند (حتی با شبه کد) بسیار مفیدتر است. این کار به شما کمک میکند تا نحوه اجرای الگوریتمها را هنگام پیادهسازی در برنامه (بسیاری از متخصصان اغلب در این مورد مشکل دارند)، بهتر درک کنید.
نظریه محاسبهپذیری و پیچیدگی الگوریتمی
دانستن محدودیتهای کار با سیستم ها، آنچه که میتوان از طریق استراتژیهای مختلف پیادهسازی کرد و همچنین محاسبه و برآورد هزینهها بسیار ضروری است. علاوه بر این، یادگیری سنجش پیچیدگی الگوریتمها به خودی خود یک هنر است.
پارادایمهای برنامه نویسی
یک مهندس نرم افزار باید بداند چه زمانی هر پارادایم را اعمال کند که شامل مدلهای مختلف مانند imperative (ساختار یافته، رویهای، شیگرا) و declarative (فانکشنال، منطقی و رابطهای) میشود.
تئوری بازیها
دانستن این مفهوم برای درک نحوه بهینهسازی سیستمهایی که بخشهای مختلف آن به طور قطعی رفتار میکنند ضروری است. الگوریتمهای minimax، بازیهای تصادفی، هرس آلفا و بتا و موارد دیگر.
برخی از جنبههای پیشرفته برنامه نویسی
به عنوان مثال برنامه نویسی همزمان و برنامه نویسی فانکشنال.
مدیریت تکنیکهای بهینهسازی
برنامه نویسی linear، برنامه نویسی integer، برنامه نویسی constraint، برنامه نویسی stochastic، برنامه نویسی heuristic و … .
آمار
آمار یکی از پیشنیازهای اصلی هر رشته مهندسی است. در مورد مهندسی نرم افزار هم برای هر سیستم دیجیتالی که تا حدی به ورودیهای تصادفی وابستگی دارد (یعنی اکثر سیستمها) مرتبط میشود.
همچنین در بسیاری از محیطها مانند شبیهسازی، هوش مصنوعی و سیستمهای خبره مورد استفاده قرار میگیرد که شامل محاسبه احتمال، توزیع ارزش، استنتاج آماری، نمونهگیری، تخمین، تجزیه و تحلیل سریهای زمانی، تئوری صف و موارد دیگر است.
مدیریت نیازمندیهای مهندسی و نرم افزار
بسیاری از پروژهها شامل به دست آوردن الزامات و مدیریت آنها در زمینههای مختلف (کیفیت، کمیت، هزینه، آزمایش، اولویتبندی و غیره) هستند. بنابراین تکنیکهای استنباط و مذاکره، ابزارها و فرآیندهای اساسی عناصریاند که یک مهندس نرمافزار باید بداند و بر آنها تسلط کافی داشته باشد.
مدیریت پروژه
اکثر پروژهها به مدیریت منابع مختلفی نیاز دارند مثل مدلهای چرخه عمر، تکنیکهای برنامهریزی، ارزیابی و اعتبارسنجی، تکنیکهای کنترل اجرا، تعیین پروفایلهای حرفهای و غیره.
روشهای توسعه نیز شامل waterfall، spiral، نمونههای اولیه تکاملی، توسعه سریع، متدهای سبک (مانند XP یا scrum)، مدلهای ظرفیت و مدیریت ریسک هستند.
مدیریت مهارت طراحی نرم افزار
شیگرایی، تکنیکهای پایین به بالا و بالا به پایین، ماژولار بودن، تکنیک های طراحی رابط، الگوها و UML.
معماری نرم افزار
یک سیستم پیچیده دارای عناصر متعددی است که با یکدیگر تعامل دارند. هدف مطالعه در چنین زمینهای این است که بدانیم یک سیستم چگونه در لایهها و عناصر مختلف (کلاینت / سرور، چند سطحی) سازماندهی شده است و چگونه لایهها و عناصر با یکدیگر مرتبط هستند.
پایگاههای داده
طراحی و تعریف لایه پایداری یک برنامه یا یک سیستم میتواند شامل تسلط بر مفاهیم و بسیاری از فناوریهای مختلف برای یک مهندس نرم افزار باشد.
این مفاهیم و فناوریها شامل مدلهای پایگاه داده مفهومی، منطقی و فیزیکی، مدل جبری-رابطهای، عادی سازی پایگاه داده، پایگاههای داده شیگرا و مدل شی-رابطهای، پایگاههای داده سلسله مراتبی، شبکه پایگاههای داده، کوئریها، بهینهسازی عملکرد (شاخصها، کوئریهای ذخیره شده)، تراکنشها، پایگاههای داده توزیع شده، دادههای بزرگ و پایگاههای داده بهینه شده برای تجزیه و تحلیل هستند.
اپلیکیشن سرورها
نحوه سازماندهی لایه کسب و کار و تطبیقپذیری عناصر مختلف یک برنامه مدرن مبتنی بر اپلیکیشن سرورها (به عنوان مثال JBoss، Weblogic، Websphere یا NET.).
ارائه اطلاعات
فناوریهایی برای متصل کردن لایه ارائه به بقیه لایههای سیستم (HTML، XML، REST/SOAP و …) استفاده میشود.
ابزارها و محیطهای برنامه نویسی
آشنایی با ابزارها یکی دیگر از عناصری است که مهندس نرم افزار باید از آن اطمینان حاصل کند: محیطهای توسعه یکپارچه، مجازیسازی، داکر، کتابخانهها و فریمورکها، مدیریت ماژول و مواردی از این قبیل.
کامپایلر و مفسر
یکی از اساسیترین ابزارهایی که یک مهندس به صورت روزانه از آن استفاده میکند، کامپایلرها هستند (یعنی برنامههایی که زبانهای سطح بالا را به کدهای باینری تبدیل میکنند تا سیستمهای کامپیوتری بتوانند آنها را تشخیص دهند).
همچنین مطالعه فناوری که زیربنای کامپایلر و مفسر است برای دانستن نحوه استفاده از آنها و تطبیق آنها با نیازهای خود و در صورت لزوم نحوه توسعه بسیار ضروری است.
سیستمهای کیفی نرم افزار
تکنیکهای تایید و اعتبارسنجی فعالیتهای مختلف در توسعه نرم افزار: تستهای واحد، تستهای یکپارچهسازی، اتوماسیون تست، تکنیکهای بررسی کد، تکنیکهای تضمین کیفیت و استانداردهای کیفی.
جنبههای نگهداری نرم افزار
فناوریهای به کار رفته در نگهداری نرم افزار: مدیریت پیکربندی، کنترل نسخه، مدیریت تیکت و رویدادها.
نرم افزار به عنوان یک سرویس
توسعه نرم افزار در cloud و سرویسهای ابری.
معیارهای امنیتی
خطرات ناشی از تولید نرم افزار با روشهای ضعیف یا منسوخ شده.
شبکههای کامپیوتری
شما باید حداقل از جنبههایی که بر ایجاد سیستمهای کامپیوتری تأثیر میگذارند آگاهی داشته باشید. به عنوان مثال نحوه سازماندهی برنامههای کاربردی وب، پهنای باند، تأخیرها، پروتکلهای ارتباطی، کنترل جریان، لایههای مختلف یک سیستم ارتباطی، ساختار داده پیام و مواردی از این دست.
سیستمعامل و معماری کامپیوتر
این بخش شامل تسلط عمیق بر حداقل یک سیستمعامل (بهترین گزینه سیستم POSIX مانند لینوکس یا یونیکس) و دانش کافی از سایر سیستمهای موجود در بازار (از جمله سیستمهای بزرگ، متوسط، میکرو و ترمینالهای موبایل) است. همچنین ساختارهای اساسی یک سیستم فیزیکی، سلسله مراتب حافظههای مختلف، حافظه مجازی، خط لوله درون یک پردازنده، حافظههای کش، نحوه مدیریت خطاها، نحوه افزایش سرعت خواندن و نوشتن دیسک و موارد دیگر.
تکنیکهای یادگیری ماشین و هوش مصنوعی
آشنایی با اصول پایهای و حتی عمیق از شبکههای عصبی، سیستمهای خبره و ….
سخن پایانی
هرچند موارد ذکر شده در بالا کامل نیستند، اما بسته به علایق و نیازهای خود میتوانید راجع به حساب دیفرانسیل و انتگرال، تجزیه و تحلیل ریاضی و عددی، الکترونیک، سیستمهای دیجیتال، پردازش سیگنال، سیستمهای تجزیه و تحلیل دادهها، توسعه وب، تکنیکهای شبیهسازی، سیستمهای تعبیه شده، تکنیکهای پردازش گرافیکی، بازیهای ویدئویی و خیلی حوزههای دیگر نیز اطلاعات کسب کنید.