
چند روز پیش به ذهنم رسید نگاهی به سایتهای فرصتهای شغلی نرمافزار بندازم تا ببینم ذهنیت بازار کار نرمافزار چیه. البته نتیجهگیری از تقاضای سایت لزوما نشاندهنده گرایش کاری نیست ولی باید توجه کرد که حجم خروج متخصص در بیشتر حوزهها و البته نرمافزار بقدری هست که بیشتر شرکتها با مشکل کمبود نیروی متخصص روبرو هستند که منطقا باید به دنبال تامینش باشند و این سایتها یکی از این راهها هستند.
تقاضای نیروی کار چند زبان رو برای مثال جستجو کردم
Julia، Rust، Go، Python و C/C++
خود اعداد به تنهایی و البته بیشتر نسبت اعداد برام جالب بود.
جولیا ۰
Rust ۵
Go ۴۰
پایتون ۲۶۶
C/C++ هم تقریبا هم اندازه پایتون حدود ۲۵۲

صفر بودن تقاضا برای جولیا حقیقتا برام دردناک بود، اگر چه قابل پیشبینی و تا اندازهای قابل توجیه.
پایتون تونسته خودش رو به عنوان زبان هوش مصنوعی جا بندازه و زبانی مثل جولیا با وجود شایستگی فراوان و رشد قابل توجه در این سالها، کار بسیار سختی داره تا جای پایی برای خودش دست و پا کنه. پایتون به لطف توجه عمومی به هوش مصنوعی چند سالیه که در شاخصهای بررسی زبانها مثل TIOBE Index تونسته خاندان معظم C/C++ شامل C# و Java رو از تخت پایین بکشه و زبان اول مورد توجه باشه
درباره جولیا قبلا نوشتهام (جولیا Julia و تحلیل دادههای بورس تهران) و سعی کردم با مثال جذاب اون سالها که بورس در بورس بود گوشهای از قابلیتهاش رو نشون بدم
https://vrgl.ir/Pufgc
https://vrgl.ir/XlyAG
در این سالها همیشه دوست داشتم تا فرصتی فراهم میشد و بیشتر درباره جولیا صحبت میشد و ویدیو آموزشی به فارسی تهیه میشد.
نسبت ۸ برابری توجه به Go در مقایسه با Rust هم برام کمی قابل هضم نبود و انتظار داشتم فاصله کمتر باشه.
نشون میده که Go تونسته بهتر جا بیفته که احتمال شهرت سادگیش در مقایسه با سختی یادگیری Rust بیتاثیر نبوده. نگاه گذار به درخواستهای کاری و البته ماهیت زبان هم نشون میده که Go خیلی آروم و کند در حال جایگزینی backend هایی از جنس پایتون هست و عمدتا دلیلش کارآمدی و سرعت است. درباره Node.js هم اعداد حدود ۱۰۰ مورد بود که تقریبا ۲ برابر Go است و با مقایسه در مقاطع زمانی میشه نظر داد که گرایش به کدوم سمته.
دلیل تعجبم بیشتر این بود که انتظار داشتم که Rust به عنوان زبانی که بیشترین نزدیکی به C یا C++ رو داره خیلی بیشتر در جامعه الکترونیک و embedded مطرح باشه. هر چند اگر این ایده درست باشه که Go در بخش بکاند بخاطر کارآمدی در حال گسترش است، اگر نگیم Rust گزینه شایستهتری هست، به همون اندازه توانمنده. البته جامعه کاربری Go بزرگتره و یادگیری سادهتر.
اما در موضوع کار بر روی میکروکنترلرها و سیستمهای embedded و Single-board computer (SBC) یا رایانه تک برد، انتظار داشتم Rust نفوذ بیشتری کرده باشه. بطور سنتی این بخش سالهاست ملک انحصاری زبان C بود که C++ به آرامی سعی داشت جای پایی باز کنه تا کار توسعه یا develop نرمافزار کمی سطح بالاتری پیدا کنه. گسترش بوردهایی مثل Arduino و خانواده Raspberry و ESP و STM در سالهای گسترش IOT و جذب مخاطبان وسیعتر باعث شد در این سالها انواع سبکی از پایتون مثل MicroPython و CircuitPython هم مطرح بشوند. موفقیت زبان Lua در ساخت بازیها هم باعث شد بود ایده استفاده از اون با نام Embedded Lua یا eLua آزمایش بشه. نیاز بازار در این است که توسعه و ساخت نرمافزار برای ابزارهای embedded و SBC سریعتر بشه اما مشکل اینجاست که زبانهای اسکریپتی به خاطر محدودیت سختافزار و حافظه و توان پردازش ابزارهای مناسبی نیستند. این زبانها کامپایل نمیشوند و نیاز به مترجم یا interpreter برای اجرا دارند و مساله بعدی اینکه برای بحث مهم مدیریت حافظه و اشکالات و خطاهای ناشی که در زبانی مثل C و C++ موضوع کشندهای است، به سراغ Garbage Collector یا GC رفتهاند که ترکیب اسکریپت بودن و GC تاثیر مهمی در کاهش کارآیی دارند که شاید در پردازش رومیزی با ارتقا سختافزار مشکل حل بشه اما در اینجا برنامه باید در حجم و اندازه حافظه و توان پردازش معین و محدود اجرا بشه.
یه دلیل دیگه استفاده از نسخههای زبان اسکریپتی مانند پایتون بحث IOT و ارتباطش با هوش مصنوعی و یادگیری ماشینه و کتابخانه کامل و جامع پایتون برای کار با هوش مصنوعی یکی از دلایل طرح این زبانها بوده اما همونطور که گفته شد کندی اجرا و نیاز به حافظه زیاد باعث ایجاد نوعی بنبست شده.
حالا Rust این وسط به چه کار میاد؟ در طراحی Rust تلاش شده تا با روشی غیر از Garbage Collector که در Java و C# و Python و بسیاری از زبانهای نو استفاده شده، مشکل مهم مدیریت حافظه حل بشه و ساختار زبان باعث بشه تا در همون زمان کامپایل از بخش عمدهای از مشکلات رایج در مدیریت حافظه جلوگیری بشه. این شیوه نو کمی باعث شده تا Rust دشوارتر از مثلا زبانی مثل Go به نظر بیاد اما از طرفی باعث شده که بسیاری از دردسرهایی که ممکنه در زبانی مثل C در موضوع مدیریت حافظه پیش بیاد جلوگیری بشه. منظور این نیست که نمیشه با Rust مشکل حافظه درست کرد اما بقول معروف باعث میشه سختتر بتونی به پای خودت شلیک کنی. کار با سختافزار گاهی ایجاب میکنه تا مستقیما با حافظه و رجیسترها کار کرد ولی در Rust در عوض اینکه وضعیت کل کد و برنامه زیر سوال باشه، این بخشهای خاص علامت گذاری میشن و سعی میشه تاثیر و حوزهشون محدود و محصور باشه.
مزیت دیگه استفاده از Rust در مقایسه با C این است که همزمان دسترسی به موضوعات سطح بالاتری مثل concurrency و ساختارهای زبانهای پیشرفته شیگرا هم داریم. البته Rust بطور دقیق مشابه جاوا و سی شارپ شیگرا حساب نمیشه اما مفاهیم مهمی مثل مثل struct و ماژول یا trait داره که کمک میکنند به پیادهسازی مفاهیمی مثل Encapsulation و Polymorphism و Abstraction که از اصول مهم شیگرایی هستند.
مفهوم مهمی به نام zero cost abstraction در Rust مطرحه که معنای سادهاش اینه که برنامهنویس بتونه کد سطح بالا بنویسه اما کارآیی رو فدا نکنه.
میشه ادامه داد و باز درباره ایده استفاده از Rust بجای C در embedded و میکروکنترلها و SBC گفت اما به نظرم اگه فرصتی بشه و نمونهای عملی بررسی بشه مفیدتره.