زبان برنامهنویسی ابزار است، نه هدف
یک برنامهنویس حرفهای قرار نیست صرفاً در یک زبان کد بنویسد؛ قرار است مسئله حل کند.
مثل یک نجار که نمیگوید:
«من فقط با این نوع اره کار میکنم.»
بلکه ابتدا به پروژه نگاه میکند و بعد ابزار مناسب را انتخاب میکند.
در نرمافزار هم سؤال اصلی نباید این باشد:
«C# بهتر است یا Python؟»
بلکه باید پرسید:
«برای این مسئله، با این محدودیتها، چه انتخابی منطقیتر است؟»
هیچ زبان برنامهنویسی برای همهچیز بهترین نیست
هر زبان نقاط قوت و ضعف خودش را دارد.
برای مثال:
C# / .NET میتواند برای سیستمهای سازمانی، APIهای بزرگ و نرمافزارهای چندلایه انتخاب بسیار مناسبی باشد.
Python در حوزههایی مثل Data Science، AI، Automation و توسعه سریع بسیار قدرتمند است.
JavaScript / TypeScript بخش بزرگی از اکوسیستم Web را پوشش میدهد.
Go برای برخی سرویسهای backend، ابزارهای زیرساختی و سیستمهای concurrent انتخاب جذابی است.
Rust کنترل سطح پایین، ایمنی حافظه و performance قابل توجهی ارائه میدهد.
Java همچنان در بسیاری از سیستمهای enterprise و ecosystemهای بزرگ استفاده میشود.
اینها به این معنی نیست که یکی «بهتر» از دیگری است.
مسئله، context است.
انتخاب تکنولوژی باید بر اساس مسئله باشد
فرض کنیم قرار است یک سیستم بسازیم.
قبل از انتخاب زبان باید سؤالهایی مثل این مطرح شوند:
حجم و نوع workload چیست؟
performance چقدر اهمیت دارد؟
تیم چه تخصصی دارد؟
زمان توسعه چقدر است؟
چه کتابخانهها و ابزارهایی نیاز داریم؟
deployment چگونه انجام میشود؟
هزینه نگهداری چقدر خواهد بود؟
سیستم قرار است چند سال نگهداری شود؟
hiring برای این تکنولوژی چقدر آسان است؟
امنیت چه الزاماتی دارد؟
ecosystem موردنیاز ما چقدر mature است؟
بعد میتوانیم درباره زبان تصمیم بگیریم.
نه اینکه اول زبان را انتخاب کنیم و بعد تلاش کنیم مسئله را با آن حل کنیم.
تعصب حتی میتواند به معماری و ساختار آسیب بزند
یکی از خطرناکترین حالتها این است:
«ما همیشه با X کار میکنیم.»
ممکن است یک تیم سالها با یک تکنولوژی کار کرده باشد و به همین دلیل تصمیم بگیرد هر مسئله جدیدی را هم با همان تکنولوژی حل کند.
این الزاماً تصمیم مهندسی نیست.
گاهی اوقات انتخاب یک تکنولوژی جدید هزینه یادگیری دارد، اما در بلندمدت هزینه توسعه و نگهداری را کاهش میدهد.
از طرف دیگر، گاهی مهاجرت به تکنولوژی جدید فقط به خاطر مد روز بودن آن، خودش یک تصمیم بد است.
پس:
تعصب نسبت به تکنولوژی میتواند هم باعث انتخاب اشتباه تکنولوژی قدیمی شود و هم انتخاب اشتباه تکنولوژی جدید.
«جدیدتر» الزاماً بهتر نیست
یکی دیگر از شکلهای تعصب این است که فکر کنیم:
New = Better
هر سال زبانها، frameworkها و ابزارهای جدیدی معرفی میشوند.
اما یک تکنولوژی جدید لزوماً:
گاهی یک تکنولوژی قدیمی، boring و بسیار mature، دقیقاً انتخابی است که یک پروژه production به آن نیاز دارد.
هدف مهندسی نرمافزار هیجانانگیزترین انتخاب نیست؛ انتخاب مناسب است.
اما یادگیری چند زبان چه فایدهای دارد؟
یادگیری زبانهای مختلف فقط برای اضافه کردن چند مورد به رزومه نیست.
هر زبان میتواند طرز فکر متفاوتی به برنامهنویس نشان دهد.
مثلاً یک زبان میتواند شما را بیشتر با این مفاهیم درگیر کند:
Memory Management
Concurrency
Functional Programming
Type Systems
Immutability
Low-level Programming
Garbage Collection
Metaprogramming
در نتیجه یادگیری زبان جدید میتواند باعث شود فقط syntax جدید یاد نگیریم؛ بلکه مدل ذهنی جدیدی پیدا کنیم.
برنامهنویس خوب، زبان را نمیپرستد
اگر فردی C# بلد باشد و تمام دانش او محدود به syntax و frameworkهای C# باشد، با تغییر تکنولوژی ممکن است بخش زیادی از تواناییاش بیاستفاده شود.
اما اگر مفاهیم را بداند:
HTTP
Database
Distributed Systems
Caching
Concurrency
Authentication
Authorization
Testing
Architecture
Data Structures
Algorithms
Networking
انتقال به زبان دیگری بسیار سادهتر میشود.
چون زبان را یاد گرفته، اما اسیر زبان نشده است.
جنگ زبانها معمولاً بیشتر از آنکه فنی باشد، شخصی است
بحثهایی مثل:
C# vs Java
یا:
Python vs Go
یا:
React vs Vue
گاهی آنقدر احساسی میشوند که افراد فراموش میکنند هدف اصلی همه این ابزارها یک چیز است:
ساختن نرمافزار قابل اعتماد برای حل یک مسئله واقعی.
در دنیای واقعی، یک شرکت ممکن است همزمان از چند زبان استفاده کند.
مثلاً:
Frontend
↓
TypeScript
Backend
↓
C# / Go / Java
Data & AI
↓
Python
Infrastructure
↓
Go / Rust
Database
↓
PostgreSQL
این سیستم لزوماً «بد» نیست.
مهم این است که مرزها، هزینهها، پیچیدگی و نیازهای واقعی سیستم منطقی باشند.
حتی یک زبان محبوب هم انتخاب مناسبی برای همه نیست
این نکته مهم است.
نباید از:
«تعصب نداشته باشیم»
به این نتیجه برسیم که:
«پس همه زبانها تقریباً یکسان هستند.»
نه.
زبانها واقعاً تفاوت دارند.
Performance، ecosystem، tooling، type system، runtime، memory model، concurrency model و developer experience میتوانند تفاوتهای بسیار مهمی ایجاد کنند.
بنابراین تصمیم درست این نیست که بگوییم:
«همه زبانها برابرند.»
بلکه:
«هیچ زبانی را بدون توجه به مسئله، بهترین انتخاب فرض نکنیم.»
معیار حرفهای بودن چیست؟
به نظرم یکی از مهمترین تفاوتهای برنامهنویس مبتدی و حرفهای همینجاست.
برنامهنویس مبتدی ممکن است بپرسد:
«کدام زبان بهتر است؟»
اما برنامهنویس باتجربهتر معمولاً میپرسد:
«Trade-off این انتخاب چیست؟»
چون تقریباً همیشه trade-off وجود دارد.
ممکن است یک انتخاب:
یا:
یا:
مهندسی نرمافزار یعنی شناخت همین trade-offها.
در آخر
قرار نیست C# را کنار بگذاریم چون Python وجود دارد.
قرار نیست Python را کنار بگذاریم چون Rust سریعتر است.
قرار نیست Rust را انتخاب کنیم فقط چون مدرنتر است.
و قرار نیست از تکنولوژیای که سالها با آن کار کردهایم فقط به دلیل عادت دفاع کنیم.
زبان برنامهنویسی ابزار ماست.
گاهی C# ابزار مناسب است.
گاهی Python.
گاهی Go.
گاهی Rust.
گاهی Java.
و حتی گاهی بهترین تصمیم این است که از هیچ تکنولوژی جدیدی استفاده نکنیم و همان چیزی را که تیم به خوبی میشناسد ادامه دهیم.
برنامهنویس حرفهای کسی نیست که بگوید:
«من طرفدار فلان زبان هستم.»
بلکه کسی است که بتواند توضیح دهد:
«با توجه به مسئله، محدودیتها، هزینهها و نیازهای پروژه، چرا این ابزار را انتخاب کردم.»
و شاید مهمترین نشانهی رشد یک برنامهنویس همین باشد:
از دفاع کردن از ابزارها، به دفاع کردن از تصمیمهای مهندسی برسیم.