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