در اقیانوس Back-end چه خبره؟ مبادا چیزی از قلم بیوفته!

برنامه نویسی شاخه های متنوعی داره و میشه گفت هیچ کدوم از این شاخه ها انتهایی ندارند. تکنولوژی ها، ایده ها ، ابزار ها و معماری های مختلف هر روز با سرعت بیشتری منتشر میشن و ما به عنوان یک برنامه نویس برای باقی موندن در این دنیای عجیب و غریب مجبوریم همیشه تایم قابل توجهی رو صرف مطالعه کنیم، وگرنه شاید دانش قابل قبولی که امروز برای ما درآمد خوبی به همراه داره، فردا کمکی به ما نکنه.

در این مطلب به صورت تیتر وار، با مثال هایی اشاره میکنم که به عنوان یک برنامه نویس back-end ، مستقل از اینکه در چه پلتفرم و با چه ابزار هایی برنامه نویسی میکنیم، لازمه به چه مفاهیمی آشنایی داشته باشیم.

تسلط داشتن به بعضی از مواردی که ذکر شده خیلی واجبه اما بعضی موارد هم هستند که ممکنه فقط در پروژه هایی با ابعاد خاص نیاز بشن. ضمنا مشابه این مطلب در اینترنت شاید به وفور یافت بشه که من چکیده ای از اونها رو با چاشنی تجربه خودم ذکر میکنم.

1- مبانی شبکه ، اینترنت و پروتکل های مهم

شاید بدون داشتن دانش شبکه و اینترنت بتونیم یک اپ کوچیک و باحال واسه دل خودمون بنویسیم یا از پس پروژه های دانشجویی بر بیایم، اما برای ساخت محصول نرم افزاری در دنیای واقعی ، اشراف به مبانی شبکه و اینترنت مثل آب حیات واجبه.

  • پروتکل TCP/IP
  • مفاهیم پروتکل HTTP
  • گواهینامه های SSL و پروتکل HTTPS
  • سرویس DNS و اولویت های DNS
  • آشنایی با مفهوم و عملکرد Firewall ها
  • آشنایی با نحوه عملکرد مرورگر ها
  • ...

2- مبانی سیستم عامل

وقتی حرف از برنامه نویسی back-end میزنیم داریم راجع به سطح زیری تری از یک سیستم صحبت میکنیم. سطحی که در درجه اول با وب سرور و در درجه بعدی با سیستم عامل شما مستقیما در تعامله. پس لازمه اول هم برای نوشتن برنامه های بهینه و هم برای جلوگیری از خطاهایی که معلوم نیست از کجا ناشی میشن دانش عمومی قابل قبولی از سیستم عامل داشته باشیم.

  • آشنایی با کاربری عمومی سیستم عامل هدف
(مثلا، به طور قطع اگر هیچی از کار کردن با لینوکس نمیدونیم و سرویس خودمون رو روی لینوکس میزبانی کردیم یه روزی به مشکل بر خواهیم خورد)
  • آشنایی با دستورات مهم ترمینال سیستم عامل هدف
  • مدیریت حافظه (RAM)
  • مدیریت عملیات ذخیره و بازیابی (I/O)
  • نوع برخورد سیستم عامل با Thread ها و همزمانی های احتمالی (Cuncurrency)

3- اصلی ترین موضوع، تسلط به یک زبان برنامه نویسی

همه زبان ها خوبن و هرکدوم نقاط ضعف و قوت خودشون رو دارن. به جای درگیر کردن خودتون با تعویض تکنولوژی، در تکنولوژی خودتون عمیق تر بشید. (این نظر منه)
همه زبان ها خوبن و هرکدوم نقاط ضعف و قوت خودشون رو دارن. به جای درگیر کردن خودتون با تعویض تکنولوژی، در تکنولوژی خودتون عمیق تر بشید. (این نظر منه)


بحث های زیادی راجع به مقایسه زبان های برنامه نویسی وجود داره و همیشه هرکدام از زبان ها از ابعاد مختلف توسط طرفدارهاشون حمایت میشن. اما این موضوعات به بحث اصلی ما مربوط نمیشن و صرفا میشه گفت زبان خوب و بد نداریم. برای هر زبان برنامه نویسی ، در دنیا مثال های زیادی از برنامه های موفق وجود داره. به هر حال میشه با یکی از زبان های C# ، php ، Go ، Java ، Python ، Node.js و..... برنامه نویسی back-end انجام داد.

مفاهیم زیادی هم وجود داره که باید روش های مناسب پیاده سازیشون در اون زبان به خصوص رو یاد بگیریم. مثل استراتژی های Error Handling ، استراتژی های Logging , نوع مدیریت حافظه در اون زبان و ......

4- گیت Git ، عصای دست هر برنامه نویس

نیاز به یک ابزار برای مدیریت سورس کد و ورژن های اون انقدر واجب و حیاتیه که فکر میکنم نیازی به توضیح نداشته باشه. از ساده ترین موضوع یعنی داشتن بک آپ همیشگی از کد ها گرفته تا عملیات های پیچیده تر روی سورس ، roll back کردن ها ، ایجاد انشعاب از کد و کار های تیمی روی پروژه های مشترک همگی دلایل شفافی هستند که باید به ابزار هایی نظیر github ، gitlab یا مثلا TFS آشنا باشیم.

حتی با دونستن دستورات خیلی ساده ای از گیت هم میتونیم نیاز های وسیعی رو کاور کنیم
این روزها Gitlab با ایرانی ها خیلی دوست تره و بهتر از Github برامون کار میکنه

5- دیتابیس Database ، یک جزء جدایی ناپذیر

شاید اگر راجع به برنامه نویسی موبایل اپلیکیشن صحبت میکردیم آشنایی مختصر با دیتابیس های کوچک مثل SQLite خیلی از نیازهای ما رو رفع میکرد اما وقتی به عرصه برنامه نویسی Back-end پا میذاریم موضوع ذخیره داده ها، نگهداری از اونها، و ارائه صحیح و بهینه داده ها به کلاینت ها تقریبا مساوی است با تمام اهداف یک وب سرویس. پس یک برنامه نویس Back-end باید تسلط خوبی به پایگاه داده ها داشته باشه. از مبانی گرفته تا طراحی ، Normalization ، Query Language و ...

به عنوان یک برنامه نویس Back-end لازمه حتما هم استفاده از دیتابیس های رابطه ای (Relational) و هم دیتابیس های Document-Based یا همون NoSql ها رو بلد باشیم.

ساختار RDBMS در اکثر نمونه های دیتابیس سرویس رابطه ای تا حد زیادی یکسانه مثل MS-SQL ، MySQL ، PostgreSQL و ...
اما در مورد دیتابیس های NoSQL گزینه های فراوانی وجود داره که هرکدام UseCase های خاصی دارند و باید بسته به نیاز از اونها استفاده کنیم.

6- قرار است API بنویسیم ، پس درباره API ها بدانیم

وقتی قراره خروجی نرم افزار ما یک سری API باشه لازمه بدونیم API ها چی هستند و تا حد زیادی به معماری های متداول مثل REST آشنا باشیم. اگر RESTful API نمینویسیم لااقل REST API بنویسیم. آشنایی نسبی با متودولوژی های غیر مرسوم تری مثل SOAP هم خالی از لطف نیست. بدیهیه برای پیاده سازی API ها باید با انواع ساختار های محتوای درخواست آشنایی داشته باشید. مثل json ، XML ، فرم ها و ...

بدانیم و آگاه باشیم API هایی که به خوبی مستند سازی نشده باشند فقط به درد خودمان میخورند. پس از ابزار هایی نظیر Swagger برای ساخت متادیتا هایی حاوی مستندات ، غافل نشیم

7- استراتژی های Caching ؛ جایی که بهینه بودن معنا پیدا میکند

اگر دوست داریم برنامه نویس بزرگی باشیم ، باید آمادگی مقابله با چالش های بزرگ بودن سیستم را هم داشته باشیم. یکی از این چالش ها قطعا بازدهی سیستم در هنگام لود و ترافیک بالاست. جایی که بهینه بودن سیستم معنا پیدا میکنه. استراتژی های Caching در سیستم، UseCase های مختلفی دارند و لازمه راجع به اونها و ابزار های مربوطه مطالعه داشته باشیم

از مفاهیم و ساز و کار Caching سمت کلاینت مطلع باشیم، و به مفاهیم و ابزار های Caching سمت سرور مسلط

8- امنیت ، امنیت ، امنیت


داشتن یک سیستم آسیب پذیر به مزاج هیچ کس خوش نمیاد. تصور کنید لحظه ای رو که متوجه میشید به خاطر سهل انگاری های امنیتی ، آسیب های بدی به سیستمی که شما خالق اون بودید وارد شده و یا حتی بدتر، به خاطر این سهل انگاری ها، یک بیزنس صدمات جبران ناپذیری دیده. پس لازمه به عنوان ایجاد کننده یک نرم افزار با مبانی امنیت و نحوه پیاده سازی اون در سطوح مختلف آشنا باشیم. مثل سیستم عامل، وب سرور ، دیتابیس ، محتوای درخواست ها ، گواهینامه ها SSL، تفاوت Hashing و Encryption و الگوریتم های مفید برای هرکدوم ، امنیت در لایه API و ایمن کردن درخواست ها (روش هایی مثل Basic ، Oauth ، Jwt و ...) و و و ...

9- تحویل سرویس تست نشده؟ هرگز !!!

اولین تستر هر برنامه ای ، برنامه نویسه اونه. پس باید برای تست کردن سیستم روش ها و استراتژی های مختلفی بلد باشیم تا پاسخ تست ها استاندارد و قابل اتکا باشه.

10- وب سرور ها، میزبان سیستم ما

نهایتا سرویسی که منتشر میکنیم معمولا قراره روی وب سرور خاصی میزبانی بشن (میگیم معمولا، چون خیلی از سرویس ها امکان Self-hosted بودن دارند)

وب سرور میزبان ، ارتباط تنگاتنگی با نرم افزار ما داره و قطعا کانفیگ ها و policy های اون میتونه روی عملکرد سیستم ما تاثیرات زیادی داشته باشه. پس الزاما باید آشنایی قابل قبولی با وب سرویسی که سیستممون رو روی اون میزبانی کردیم داشته باشیم. معروف ترین اونها IIS برای ویندوز ، Nginx ، Apache و ... برای لینوکس هستند.

11- در سطوح بالاتر و پیشرفته تر

دنیای شگفت انگیز برنامه نویسی ته نداره و وقتی درگیر موضوعات جدی تر و بزرگتری میشیم بعضا سادگی جواب کار ما رو نمیده. لازمه با معماری ها و الگوهای طراحی بیشتری آشنا باشیم. معماری هایی مثل SOA ، Microservices ، CQRS Event-Based و ... در دنیای امروز برای حل مسائل خاصی کاربردهای زیادی دارند. کی از فردا خبر داره؟؟؟ :)

12- عملیات DevOps ، آش کشک خاله

اصولا DevOps که شامل فرایند های زیادی برای انتشار کد میشه یک تخصص جداگانه است. و معمولا مسئولیت های DevOps مثل پیکربندی سرور ها و سرویس های مورد نیاز، انتشار مستقیم کد ها و ... بر عهده فرد خاصی با این تخصص ها خواهد بود. اما متاسفانه یا خوشبختانه مسئولیت انجام این فرآیند ها در بسیار از پروژه هایی با ابعاد متوسط و کوچک به شانه ی برنامه نویس Back-end گذاشته میشه. پس بد نیست آشنایی نسبی با مفاهیم ، ابزارها و سرویس های موجود در این حوزه داشته باشیم.

و حرف آخر از پست اول

اگر برنامه نویس مبتدی هستید و تازه پا به این عرصه گذاشتید ، اصلا نگران نباشید. قرار نیست تمام این مفاهیم و آیتم ها رو در مدت کوتاهی و به صورت موازی و یکجا یاد بگیرید و به همشون مسلط بشید. اینها ایستگاه هایی در نقشه راه برنامه نویسی Back-end هستند و طی مدت قابل توجهی کسب خواهند شد. کافیه علاقه و پشتکار داشته باشید و از آموختن خسته نشید
اگر برنامه نویس کار کشته و نسبتا با تجربه ای هستید، لطفا برای من کامنت بذارید و مطالب رو تکمیل کنید
اگر به نظرتون در کل این مطلب ارزشهایی در خودش داشت و بد نبود، لطفا لایکش کنید و من رو دنبال کنید تا انگیزه ی بیشتری برای خارج شدن از حالت کار در سکوت داشته باشم و بیشتر مطلب منتشر کنم