چگونه برنامه نویس وب شویم؟ – بخش دوم: بکاند (Backend)


این نوشته قسمت دوم از یک راهنمای سه بخشی است که در بخش اول آن به توصیف فرانتاند پرداختهایم. در بخش قبلی این راهنما به بررسی فرایند توسعه فرانتاند پرداختیم و اینک میخواهیم در مورد توسعه بکاند صحبت کنیم. همچنین، مطالعه مقاله «برنامه نویسی وب چیست» نیز میتواند به درک بهتر چیستی این حوزه در برنامه نویسی کمک کند.
منظور از توسعه بکاند که گاهی اوقات توسعه سمت سرور نیز نامیده میشود، توسعه پردازشهایی است که روی سرور رخ میدهند و معمولاً در دید کاربران قرار ندارند. یک رابط کاربری وب میتواند درخواستهایی به بکاند ارسال کند و تقاضای رندر برخی کدهای HTML، ذخیرهسازی ورودیهای کاربر در پایگاه داده، احراز هویت یک کاربر، ارسال یک ایمیل یا پردازش یک تقاضای پرداخت را ارائه کند. با این که این بخش از اپلیکیشن در دید کاربر قرار ندارد؛ اما به هیچ وجه کماهمیت نیست. در واقع بکاند، قلب و مغز هر اپلیکیشنی محسوب میشود.
- مقاله پیشنهادی: چگونه برنامه نویس شویم ؟ — راهنمای شروع و موفقیت در برنامه نویسی
راهنمای رنگهای نمودار فوق کاملاً آسان است. خطوط به رنگ زرد نشاندهنده چیزهای سادهای هستند که باید یاد بگیرید، خطوط نارنجی موارد پیشرفتهتری هستند که میتوانید آنها را بعدتر نیز بیاموزید و خطوط خاکستری موضوعاتی هستند که احتمالاً در پروژههای خاص مفید خواهند بود.
زبانها
در مقایسه با توسعه فرانتاند، گزینههای موجود برای زبانهای برنامهنویسی روی بکاند بسیار وسیعتر هستند و میتوان بسته به هر مورد و محیط کاربردی، راهحل خاصی را انتخاب کرد.
روشهای مختلفی برای دستهبندی زبانهای برنامهنویسی وجود دارند. ما زبانهای برنامهنویسی را به دو دسته زبانهای اسکریپت نویسی و کامپایل شونده تقسیم میکنیم. با این حال باید اذعان کرد که این تقسیمبندی چندان دقیق نیست. برخی از زبانهای اسکریپت نویسی در واقع به صورت درجا کامپایل میشوند و برخی از زبانهای کامپایل شونده میتوانند مفسر داشته باشند. با این وجود، این تقسیمبندی نقطه شروع مناسبی برای تحلیل ما محسوب میشود.
زبانهای اسکریپتنویسی
زبانهایی که پیش از اجرا نیازمند کامپایل نباشند، به نام زبانهای اسکریپت نویسی (scripting) یا زبانهای تفسیر شونده (interpreted) نامیده میشوند. این زبانها برخلاف زبانهای کامپایل شونده فایلهای اجرایی باینری تولید نمیکنند. کدهای این زبانها به طور معمول به صورت درجا ارزیابی و اجرا میشود. برخی اوقات شاید شروع برنامهنویسی با زبانهای اسکریپت نویسی آسانتر باشد، چون لازم نیست کد را به روش سختگیرانه تعیین شده از سوی کامپایلر بنویسید. با این وجود، این بدان معنی است که خطاهایی که در زمان کامپایل مشخص میشوند تنها در طی اجرا ظاهر خواهند شد.
برخی از زبانهای اسکریپت نویسی شامل موارد زیر هستند:
- Node.js یک محیط اجرای جاوا اسکریپت سمت سرور است. این زبان برنامهنویسی از مجموعهای خاص از ویژگیهای جاوا اسکریپت پشتیبانی میکند و مجموعهای از API برای تأمین موارد کاربردی بکاند مانند کار کردن با سیستم فایل ارائه کرده است. یادگیری Node.js باعث میشود که برنامهنویس بتواند هم روی فرانتاند و هم بکاند کار کند. Node.js چند فریمورک محبوب مانند express ، koa و LoopBack دارد.
- Python یک زبان برنامهنویسی چندمنظوره است. دستور زبان ساده این زبان و ساختارهای روشن آن باعث شده که یادگیریاش برای مبتدیان آسان باشد. پایتون به طور گستردهای برای نوشتن اپلیکیشنها استفاده میشود؛ اما در زمینه انجام پژوهشهای عملی و کار با هوش مصنوعی نیز توجه زیادی را برانگیخته است. در حال حاضر دو نسخه از پایتون به طور عمده استفاده میشود: پایتون 2 و پایتون 3. یکی از محبوبترین پروژههای توسعه یافته با پایتون، سیستم مدیریت محتوای Django است. Flask نیز یک میکرو فریمورک برای توسعه وب است.
- PHP زبان برنامهنویسی محبوب دیگری برای توسعه وب اپلیکیشنها محسوب میشود. این زبان خودش زبان آسانی برای افراد مبتدی محسوب میشود؛ اما ویژگیهای پیشرفتهتر آن برای کاربران متوسط رو به بالا ارائه شده است. برخی از محبوبترین پروژههایی که با استفاده از پیاچپی خلق شدهاند شامل وردپرس و دروپال هستند. وردپرس پرکاربردترین سیستم مدیریت محتوای دنیا محسوب میشود. فریمورکهای قالب توجهی مانند Laravel،Symfony و CodeIgnite برای این زبان برنامهنویسی عرضه شدهاند.
- Ruby یک زبان اسکریپت نویسی است که طوری طراحی شده است تا خواندن و نوشتن آن آسان و طبیعی باشد. محبوبترین فریمورک برای این زبان شامل Ruby on Rails است. Jekyll یک تولیدکننده وبسایتهای استاتیک است که بر مبنای روبی ساخته شده است.
زبانهای کامپایل شونده
کدهای نوشته شده به یک زبان کامپایل شونده باید پیش از اجرا، ابتدا به صورت فایلهای باینری کامپایل شوند. با این که این فرایند به طور بدیهی از برنامهنویس میخواهد که یک مرحله کار بیشتر انجام دهد؛ اما مزیتهایی نیز دارد. کامپایلر میتواند مواد ناسازگاری در کد را تحلیل کند و بازخورد اولیهای از مسائل و مشکلات احتمالی ارائه کند. برخی کامپایلرها میتوانند اقدام به بهینهسازی کد حاصل برای یک پلتفرم خاص نیز بکنند و بدین ترتیب عملکرد بالاتری را تضمین میکنند. با این که زبانهای کامپایل شونده ممکن است در ابتدا یادگیری دشوارتری داشته باشند؛ اما در پروژههای بزرگتر ترجیح بیشتری به استفاده از این زبانها وجود دارد، زیرا معیارهای امنیتی بیشتر و کد گویاتری تولید میکنند.
در میان زبانهای کامپایل شونده گزینههای زیادی برای انتخاب وجود دارند:
- Java یک زبان برنامهنویسی شیءگرا و سطح بالا است که در ابتدا از سوی شرکت سان مایکروسیستمز توسعه یافته و اینک توسط اوراکل نگهداری میشود. جاوا طوری طراحی شده است که بین پلتفرمهای مختلف قابل جابجایی باشد، یعنی کد منبع به بایتکد جاوا کامپایل میشود و این بایتکد روی ماشین مجازی جاوا اجرا میشود که میتواند روی هر پلتفرمی نصب شود. جاوا یک زبان کاملاً بلوغیافته است که فریمورکهای مختلفی برای توسعه وب اپلیکیشنها در آن ارائه شده است. محبوبترین پلتفرم آن Spring است. به علاوه جاوا میتواند به منظور توسعه اپلیکیشنهای اندرویدی مورد استفاده قرار گیرد. با این که از نظر برخی افراد جاوا قدیمی شده است و نسبت به زبانهای JVM دیگر مانند کاتلین (Kotlin) ترجیح پایینتری دارد؛ اما جاوا همچنان یکی از محبوبترین زبانهای برنامهنویسی محسوب میشود. جاوا در بخش برنامهنویسی سازمانی محبوبیت بسیار بالایی دارد.
- #C یک زبان برنامهنویسی شیءگرای سطح بالای دیگر است که از سوی مایکروسافت عرضه شده است. این زبان در ابتدا به منظور استفاده روی ویندوز ارائه شد؛ اما اینک میتوان از آن برای ساخت اپلیکیشنهای چند پلتفرمی با استفاده از محیط اجرای نسبتاً جدید.NET Core. بهره گرفت. یکی از فریمورکهای محبوب برای ساخت وب اپلیکیشن با استفاده از سی شارپ ASP.NET Core است. سی شارپ در میان شرکتهایی که از مجموعه فناوریهای مایکروسافت استفاده میکنند، محبوبیت بالایی دارد.
- Go زبان نسبتاً جدیدی است که از سوی گوگل توسعه یافته و به سرعت محبوبیت زیادی کسب کرده است. این زبان بدین منظور طراحی شده است که نسبت به جاوا یا سی شارپ فشردهتر باشد و مبتنی بر مقدمات سادهای است. Go به طور عامدانه سازههای پیچیدهتری که در زبانهای دیگر وجود دارد را کنار گذاشته است، همچنین بسیار سریع است و مصرف حافظهای بسیار پایینی دارد. این زبان از همزمانی درجه اول پشتیبانی میکند و از این رو گزینه مناسبی برای پروژههایی محسوب میشود که سرعت و مصرف پایین حافظه در آنها اهمیت بالایی دارد. اکوسیستم کتابخانهها و ابزارهای Go همچنان در مرحله توسعه است و شاهد پروژههای جذابی هستیم که در جامعه توسعهدهندگان این زبان ظاهر میشوند. Go محبوبیت زیادی در توسعه بلاک چین کسب کرده است.
- Kotlin زبانی است که از سوی JetBrains توسعه یافته است و رقیب نزدیک جاوا محسوب میشود. کاتلین روی ماشین مجازی جاوا اجرا میشود؛ اما آن را میتوان به صورت جاوا اسکریپت نیز کامپایل کرد. این زبان طوری طراحی شده است تا فشردهتر از جاوا باشد و پشتیبانی از تابعهای درجه اول به آن اضافه شده و از معیارهای امنیتی اضافی برای جلوگیری از خطاهای رایج بهره میگیرد. کاتلین نیز همانند جاوا میتواند برای توسعه اپلیکیشنهای اندرویدی استفاده شود.
- Scala زبان دیگر مبتنی بر JVM است که جایگزینی برای جاوا محسوب میشود. این زبان ساختار فشردهتری دارد و با ارائه معیارهای امنیتی اضافی، بهرهگیری زیادی از برنامهنویسی تابعی (functional programming) کرده است.
- Erlang یک زبان تابعی است که برای همزمانی و دسترسیپذیری بالا (high availability) طراحی شده است. ارلانگ در اپلیکیشنهایی که عملکرد و مقیاسپذیری بالا حائز اهمیت است محبوبیت دارد. موارد استفاده رایج این زبان شامل پردازش تصویر و سیگنال یا تحلیل مقادیر بالایی از دادهها است.
- Haskell زبان برنامهنویسی تابعی دیگری است که به خاطر سیستم نوع بندی قدرتمند و یک طراحی که به تولید کدهای روشن و خوانا کمک میکند مشهور شده است. از آنجا که هَسکِل یک زبان تابعی است، مقیاسپذیریِ کارآمدی دارد و عملکرد مناسبی ارائه میکند.
پایگاههای داده
یکی از مهمترین قابلیتهای اغلب اپلیکیشنها توانایی ذخیرهسازی دادههای کاربر است. این کار به طور معمول از طریق نرمافزار خاصی به نام سیستم مدیریت پایگاه داده (DBS) صورت میپذیرد. DBS امکان دسترسی به ذخیرهسازی داده را فراهم میسازد که به اپلیکیشنها امکان ذخیرهسازی، بازیابی و بهروزرسانی دادهها را میدهد. انواع مختلفی از پایگاههای داده وجود دارند که برای شکلها و حجمهای مختلفی از دادهها بهینهسازی شدهاند. در این راهنما نگاهی به دو نوع پایگاه داده محبوب خواهیم داشت: پایگاههای داده رابطهای و غیر رابطهای.
پایگاههای داده رابطهای
پایگاههای داده رابطهای دادهها را در جدولهایی ذخیره میکنند که در این جداول ردیفها نشاندهنده مدخلها و ستونها خصوصیات مدخلها هستند. ردیفهای جدولهای مختلف را میتوان با استفاده از کلیدهای خارجی به همدیگر پیوند داد تا رابطه بین انواع مختلف مداخل را نشان داد. برای نمونه اگر میخواهید یک فروشگاه آنلاین بسازید، ممکن است جدولی برای ذخیرهسازی سفارشها با ستونهایی مانند «شماره سفارش»، «نام مشتری»، «آدرس ارسال» داشته باشید که در این جدول هر ردیف نشاندهنده یک سفارش مجزا است. اطلاعات آیتمهای سفارش در جدول دیگری به نام «آیتمهای سفارش» با ارجاع به جدول سفارش ذخیره میشود.
پایگاههای داده رابطهای زیادی از زبانی به نام زبان کوئری ساختیافته (SQL) و دیالکت آن برای کوئری زدن به دادهها و تغییر دادنشان استفاده میکنند. به همین دلیل در اغلب موارد این نوع پایگاههای داده به نام SQL شناخته میشوند. پایگاههای داده رابطهای محبوب شامل موارد زیر هستند:
- Oracle Database پایگاه دادهای است که از سوی شرکت اوراکل توسعه یافته است. پایگاه داده اوراکل به دلیل مقیاسپذیری بالا و مجموعه ویژگیهای قدرتمند، در اغلب موارد از سوی سازمانهای بزرگ مورد استفاده قرار میگیرد. این پایگاه داده به دلیل هزینه لایسنس بالا در پروژههای کوچک و متوسط کمتر استفاده میشود.
- MySQL یک پایگاه داده متن-باز و رایگان است که از سوی شرکت سوئدی MySQL AB توسعه یافته و اینک توسط اوراکل خریداری شده است. MySQL میتواند از موتورهای ذخیرهسازی مختلفی برای هر جدول، جهت ذخیرهسازی و استفاده مؤثر از دادهها بهره بگیرد. MySQL در طیف گستردهای از کاربردها استفاده میشود؛ با این وجود استفاده از آن برای وب اپلیکیشنها و به طور خاص در مجموعه مشهور LAMP (لینوکس، آپاچی، مایاسکیوال و پیاچپی) محبوبیت زیادی دارد. این پایگاه داده چند نسخه پولی نیز برای کاربران بزرگمقیاس عرضه کرده است.
- SQL Server که به نام MSSQL نیز شناخته میشود یک پایگاه داده است که از سوی مایکروسافت نگهداری میشود. این پایگاه داده چند نسخه برای مدیریت بارهای کاری و حجم دادههای متفاوت دارد. SQL Server رقیب عمده Oracle است و در میان کاربران محصولهای مایکروسافت محبوبیت زیادی دارد.
- PostgreSQL یک پایگاه داده متن-باز و رایگان است که از سوی تیمی جهانی از داوطلبان توسعه یافته است. این پایگاه داده مجموعه ویژگیهای گستردهای دارد و میتواند بارهای کاری بزرگ را مدیریت کند.
پایگاه داده غیر رابطهای
دادهها در پایگاه داده غیر رابطهای در مدلهایی به جز جدول ذخیره میشوند. مدلهای مختلفی مانند ذخیرهسازی جفتهای کلید-مقدار، اسناد، رابطهای گرافی یا سری زمانی وجود دارند که بسته به موارد استفاده مختلف، قابل انتخاب هستند. با این که پایگاههای داده غیر رابطهای مدتها است که معرفی شدهاند؛ اما اخیراً به دلیل سادگی طراحی و سهوت مقیاسبندی محبوبیت گستردهای به دست آوردهاند.
پایگاه داده غیر رابطهای به نام پایگاههای داده NoSQL نیز شناخته میشوند، چون اغلب آنها زبان کوئری خاص خود را به جای SQL ارائه کردهاند. سه پایگاه داده زیر به طور عمده در توسعه وب مورد استفاده قرار میگیرند:
- MongoDB یک پایگاه داده سند متن-باز رایگان است که شیءهای شبه JSON را ذخیره میکند. میتوان این شیءها را ذخیره و بازیابی کرد و آنها را به شیءهایی در اپلیکیشن نگاشت کرد. مانگودیبی قابلیتهای معمول کوئری زدن و تجمیع (aggregation) را ارائه کرده است. مانگودیبی گزینه مناسبی برای اپلیکیشنها محسوب میشود، زیرا در آن انسجام دادهها دغدغه اصلی محسوب نمیشود.
- Redis یک پایگاه داده کلید-مقدار درون حافظهای است که در اغلب موارد برای ذخیره موقت دادههای کش شده و انتقال پیامها استفاده میشود. از آنجا که دادهها لازم نیست حتماً دائمی باشند، ذخیرهسازی دادهها روی دیسک را میتوان غیرفعال کرده یا به تأخیر انداخت تا عملکرد افزایش یابد. ردیس میتواند انواع مختلفی از مقادیر مانند رشتهها، اعداد، لیستها، نگاشتها و موارد دیگر را ذخیره سازد.
- Elastic Search یک موتور جستجوی اوپنسورس برای تحلیل متن است. این موتور جستجو امکان ذخیرهسازی اسناد متنی و ایجاد اندیسهای متنی قابل جستجو را فراهم میسازد. الاستیکسرچ به طور عمده برای تحلیل log استفاده میشود. به طور خاص از آن به عنوان بخشی از مجموعه ELK استفاده میشود و امکان جستجوی اسناد متنی را به رایگان فراهم میسازد.
پیامرسانی
در برخی موارد اجزای سمت سرور اپلیکیشن باید وظایفی را آغاز کنند که نیاز به اجرا در پسزمینه دارند. برای نمونه، درخواست یک گزارش تجاری ممکن است یک فرایند طولانی را آغاز کند که منتهی به تولید گزارش و ایمیل کردن آن به کاربر میشود و بدین ترتیب لازم نیست کاربر منتظر آن باشد. بدین منظور باید بتوانیم پیامی را به کامپوننتهای مختلف بفرستیم تا مطمئن شویم که درخواست به طرز موفقیتآمیزی پردازش شده است. اگر یک بخش از کار ناموفق باشد، باید ریاستارت شود. نرمافزاری که چنین کارکردهایی را ارائه میکند کارگزار پیام (message broker) نامیده میشود. دو مورد از رایجترین کارگزارهای پیام شامل موارد زیر هستند:
- RabbitMQ یک کارگزار پیام قدیمی است که از مدلهای مختلف تحویل پیام و قواعد مسیریابی پشتیبانی میکند. این کارگزار تضمین میکند که پیام از سوی مصرفکننده دریافت و پردازش میشود. پیامهای ناموفق میتوانند در صف dead-letter ذخیره شوند. RabbitMQ از طریق پروتکل AMPQ استاندارد عمل میکند که توسط کارگزارهای پیام دیگر و کتابخانههای کلاینت نیز پشتیبانی میشود.
- Apache Kafka یک موتور پردازش stream است که میتوان از آن به عنوان یک کارگزار پیام نیز استفاده کرد. این کارگزار پیام علاوه بر اغلب ویژگیهای استاندارد از امکانات پیشرفتهتری مانند توانایی پردازش پیامها از روی سوابق نیز پشتیبانی میکند. این کارگزار عملکرد بالاتری ارائه میدهد که باعث میشود برای پردازش حجمهای بالایی از پیامها مناسب باشد.
سخن پایانی
اگر بخشهای اول و دوم این راهنما را مطالعه کرده باشید، در این صورت ایده خوبی از فناوریهای مورد استفاده برای توسعه فرانتاند و همچنین بکاند به دست آوردهاید. توصیه میکنیم پیش از تصمیمگیری در مورد مسیری که میخواهید در این حوزه انتخاب میکنید از مطالب دیگری نیز استفاده کنید و به تحقیق بیشتری بپردازید. در بخش آخر این راهنما نگاهی به ابزارهایی خواهیم داشت که هر توسعهدهندهای باید در مورد آنها اطلاع داشته باشد.
اگر این مطلب برایتان مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای طراحی و برنامه نویسی وب
- چگونه برنامهنویسی وب را شروع کنم؟
- مجموعه آموزشهای ابزارها و راهکارهای مدیریت وبسایتها
- آموزش برنامه نویسی PHP
- چگونه برنامه نویس شویم ؟ — راهنمای شروع و موفقیت در برنامه نویسی
- آموزش پایتون (Python) — مجموعه مقالات جامع وبلاگ فرادرس
- مناسبترین زبان برنامهنویسی وب برای اهداف مختلف چیست؟
- آموزش پایگاه داده ها در جاوا
==