زبان پایتون - آری یا نه

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


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

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


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


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


نیاز به چنین ابزارهایی در بخش های دیگری از صنایع مرتبط با فناوری اطلاعات نیز وجود دارد. به عنوان نمونه در حوزه مدیریت شبکه های کامپیوتری، یک تکنسین شبکه ممکن است نیاز پیدا کند تا ابزارهای متفاوتی را برای گرفتن پشتیبان (backup)، تحلیل فایل های رخدادها (log) و ... تولید کند. اما نیازمندی اصلی این است که تولید چنین برنامه هایی نباید مستلزم داشتن دانشی عمیق از یک فناوری برنامه سازی باشد. به علاوه زبان مورد استفاده باید تا حد ممکن راحت و دارای امکان توسعه سریع باشد.


ک تیم بزرگ نرم افزاری را در نظر بگیرید که در حال توسعه یک بستر پردازش داده برروی یک کلاستر متشکل از ده ها سیستم کامپیوتری است. این تیم به دلیل محدودیت های نرم افزاری (مثلا استفاده از کتابخانه های پردازش سریع) و نیز سخت افزاری (استفاده از سخت افزارهای خاص منظوره پردازش سریع) زبان سی پلاس پلاس (++C) را برای تولید این بستر انتخاب کرده است. اما در کنار فرایند اصلی تولید، فعالیت های دیگری هم هستند که استفاده از زبان سی پلاس پلاس در آنها چندان منطقی نیست.


مثال اول: هر توسعه دهنده نرم افزار در این پروژه نیازمند ابزاری است که محیط تولید را برای یک برنامه نویس آماده کند. منظور از آماده کردن محیط تولید، گرفتن آخرین کدهای موجود از سرورهای نگهداری کد (source control)، گرفتن کتابخانه های مرتبط، کامپایل وابستگی های اصلی پروژه، مقداردهی متغیر های محیطی، مقداردهی درست وابستگی های بین کدها و ... است. داشتن چنین ابزاری در هر محیط تولیدی اجتناب ناپذیر است و بدون وجود آن ممکن است هر توسعه دهنده سیستم ساعت ها وقت خود را صرف چنین فعالیت هایی بکند. با وجود اینکه ابزارهای متفاوتی در این حوزه اخیرا تولید شده اند (مانند اسپک (spack: see www.spack.io)) هنوز بسیاری از شرکت های بزرگ نرم افزاری ترجیح می دهند که ابزارهای خاص خود را در این حوزه داشته باشند. مسلما زبان سی پلاس پلاس زبان مناسبی برای تولید این ابزار نیست. چرا که این ابزار نیاز به تعامل فراوان با فایل سیستم و کنترل خط فرمان دارد که کتابخانه استاندارد سی پلاس پلاس (یا همان STL) در این موارد خیلی قوی و کاربردی نیست.


مثال دوم: استفاده از ابزارهای کنترل مستمر (continuous integration) یک امکان ضروری و اجتناب ناپذیر در پروژه نرم افزاری گفته شده به شمار می رود. این ابزارها وظیفه گرفتن آخرین کدهای موجود از یک مکان مشخص (شاخه های متفاوت از کد)، ساختن (Build)، استقرار (deployment) و همچنین تست آنها را برعهده دارند. نتایج و جزییات همه این فعالیت ها لازم است که پس از انجام در قالب مشخصی دراختیار توسعه دهندگان سیستم قرار بگیرد. برای انجام چنین فعالیت هایی معمولا تیم های نرم افزاری برنامه های خاص منظوره خود را توسعه داده و آن را به ابزار کنترل مستمر خود متصل می کنند. بالطبع فناوری استفاده شده برای تولید چنین برنامه هایی باید دارای قابلیت های متعددی مانند اتصال راحت به سرورهای راه دور و نیز ذخیره سازی خروجی ها در قالب مشخصی (نظیر json) باشد. با توجه به نیازهای گفته شده، زبان اصلی این پروژه یعنی سی پلاس پلاس زبان مناسبی در این حوزه نیز نیست.


مثال سوم: توسعه دهندگان پروژه ذکر شده برای اطمینان از صحت عملکرد سامانه خود هزاران تست واحد (unit test) را تولید کرده اند. این تست ها به توسعه دهندگان امکان می دهد که پس از هر تغییر از صحت و سلامت بخش های مختلف کد تا حدود زیادی اطمینان پیدا کنند. اما اجرای موازی این تست ها، اطمینان از صحت عملکرد صحیح هر تست، انتظار برای پایان یافتن موفق هر تست و جمع اوری نتایج تست ها معمولا به ابزار متفاوتی نیاز دارد که بسته به نیازمندهای هر تیم می تواند متفاوت باشد. نیاز به امکانات چندپردازه ای (multi-processing) و نیز ذخیره سازی نتایج تست در قالب های مشخص باعث می شود که برای چنین ابزاری نیز زبان سی پلاس پلاس انتخاب مناسبی نباشد.


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