داستان مهاجرت من از دات نت به جاوا

java or c#?سال ها پیش که تازه به دانشگاه رفته بودم سعی می شد الفبای اولیه برنامه نویسی با زبان سی تدریس شود تا دانشجویان سریعتر مسئله را درک کنند، پس از گذشت مدتی به شکلی حیرت آسا در تمام کار های عملی و کد های نمونه تاکیید دانشگاه و اساتید به زبان #C تغییر کرد، همه جا بحث در مورد این زبان بود، سعی می شد همه چیز را فقط در این زبان توصیف و پیاده سازی کرد - به حدی اساتید تعصب مند #C شدند که سر بعضی از کلاس ها، فضایی برای مطرح کردن زبان های دیگر احساس نمیشد طبیعی بود که خواسته یا ناخواسته باید از #C استفاده می کردیم .دوستانم که از دبیرستان سراغ این رشته رفته بودن فقط Visual basic را زبانی برای همه چیز تصور می کردند و علاقه ای برای یادگیری #C از خود نشان نمی دادند ، دانشگاه شبیح میدان جنگی میان دو زبان ویژوال بیسیک و سی شارپ شده بود، کمتر کسی به پشت پرده و پایه این دو زبان توجه میکرد، گویی که کسی نمی خواستند سراغ این واقعیت که پلتفرم و پایه هر دو آن ها Net. است برود.نگاهی به دوران دبیرستان:وقتی که دبیرستانی بودم (رشته ی غیر مرتبط) تا آن زمان به خاطر سرعت پایین اینترنت و مشکلاتش محدود بودم و شناخت دقیق و روشنی از سیستم عامل های دیگر به خصوص لینوکس نداشتم و تمام دنیای کامپیوتر را در ویندوز خلاصه میدیدم،‌مدتی بعد مقالاتی در مورد دنیای باز و آزاد لینوکس دیدم ، هیجان زده شدم و چند روز بعد یک نسخه از Linux Redhat تهیه کردم ، بدون هیچ آشنایی با معماری و روش پارتیشن بندی Linux آن روی سیستمم نصب کردم ، خیلی طول کشید چون نسبتا حجمش زیاد و سرعت نصب شدنش پایین بود، مدتی بعد که سیستم راه اندازی شد با دیدن Desktop آن بسیار حیرت زده شدم چند دقیقه ای که با آن کار کردم متوجه شدم که پارتیشن هایی که با فرمت NTFS قالب بندی شده پشتیبانی نمیشد، در حالی که تمام زندگیم درون این پارتیشن ها بود میدانستم که در نهایت مجبور به نصب دوباره ویندوز میشوم ولی دوست نداشتم محیط جدید و شگفت انگیز لینوکس را ترک کنم بی آنکه چیزی از آن کشف کرده باشم ، با کمال تاسف و ناراحتی در پایان ویندوز را دوباره نصب کردم، ولی دیگر درصد تعلق خاطرم به ویندوز از ۱۰۰٪ به ۸۰٪ رسیده بود، می دانستم که نمیتونم تا ابد با ویندوز کنار بیام، هرچی زمان پیش میرفت با مشکلات و ضعف های عجیب ویندوز بیشتر آشنا میشدم (در آن زمان Windows 7 تازه در حال همه گیر شدن بود) با ویروس (البته نوعی کرم) که درون فلش مموری های خزش میکرد خیلی مشکل داشتم، با قسمت Regestry هم خیلی کلنجار میرفتم(شبیح شهری بدون نقشه بود)از مشکل نام گذاری ها غیر استاندارد در ویندوز خیلی حراس داشتم،‌به یاد دارم که یک بد افزار فقط وظیفه اش ساخت پوشه هایی با نام های شبیح به Hash بود و نمیشد آن پوشه هارا حذف و تغییر نام داد و صدها مشکل ریز و درشت دیگر که در آن زمان جز مشکلات روزمره ویندوز شده بود، از استفاده های ۱۰۰٪ از CPU , Disk هم نگم که همه باهاش آشنا هستنبعد از مدتی فارغ از تمام مشکلات دیگر یک قضیه خیلی برام عذاب آور شده بود! پیدا نکردن آدرس و منبع یک برنامه در Task Manager اگر برنامه ای با دسترسی Admin اجرا می شد و برنامه ی کوچکی با اسم svchost در مسیر windows\system32 کپی کرده و آن را در قسمت Startup رجیستری ثبت می کرد فهمیدن ماهیت و پیدا کردن آن بسیار مشکل میشد، به خاطر این قبیل مشکل ها بار ها ویندوز را دوباره نصب می کردم در حالی که بیشتر انرژی و وقتم در همین راه اتلاف میشد.(بگذریم)سلطه زبان #C در دانشگاه:همه جا #C بود همه از Net. تعریف میکردن - عده زیادی با PHP خداحافظی کرده و سراغ ASP.NET رفته بودند - تا اسم از زبان جدیدی برده میشد سیل عظیمی از تعریف و تمجید از NET. و شرکت Microsoft و سیاست هاش به سمت شخص سرازیر میشد ، مدتی بود که خودم از #C استفاده میکردم و بسیار راضی بودم چون واقعا syntax روان - مشخص و دوست داشتنی داشت ، خیلی راحت میشد یه Windows form را فقط با نوشتن چند خط ساده و واضح بدون داشتن محیط ویژوال نوشت و کامپایل کرد ، از این همه راحتی و سهولت در پیاده سازی بسیار خرسند بودم و علاقه ای به آشنا شدن با زبان دیگری در خودم حس نمیکردم ، باید اعتراف کنم که #C پکیجی بود از هر آنچه که می خواستم همه چیز دم دست بود و میشود به راحتی کارهای بزرگ و باحالی انجام داد، در آن زمان سیستم من نسبتا قوی نبود و توان پردازشی چشمگیری نداشت و حافظه RAM و Disk چندانی هم نداشتم - با ویژوال استدیو ۲۰۱۳ بسیار راحت بودم و کار ها را پیش میبردم.یک روز قصد داشتم یک ربات تلگرامی بنویسم،‌به سراغ یه سری کتابخانه رفتم و با مبحث جدیدی که در ویژوال استودیو ۲۰۱۳ پشتیبانی نمیشد (تا آن زمان) رو به رو شدم await و async کتابخانه هایی که برای من مناسب بودن اغلب با این ویژگی جدید پیاده سازی شده بودند ولی من امکان استفاده از آن را نداشتم از طرفی هم به خاطر قوی نبودن سیستمم امکان ارتقا ویژوال استودیو برایم مهیا نبود ، حس میکردم به یک بن بست بزرگ خوردم . در نهایت خودم مجبور شدم یه کتابخانه مختصر و ساده بنویسم، از کتابخانه های دیگری برای طراحی رابط کاربری استفاده کردم ، در نهایت کار تمام شد و از کدهایی که نوشته بودم خروجی گرفتم، برنامه را به دانشگاه بودم تا به دوستانم نشان دهم ولی با مشکلات ریز و درشتی رو به رو شدم که حسابی از محیط NET. دلسردم کرد.همخوانی نداشتن نسخه Net. استفاده شده ی من با سیستم میزبانبعضی از کتابخانه ها برای اجرا شدن نیازمند شرایط خاصی بودند که برای مصرف کننده نهایی کمی گیج کننده بودمایکروسافت هر سال زبان #C را آپدیت میکرد و تنها راه استفاده از آن فقط از طریق بروزرسانی ویژوال استودیو ممکن بودویژوال استودیو بیش از اندازه بزرگ و حجیم شده بود همیشه به این فکر میکردم که آیا واقعا راه دیگری به جز ویژوال استودیو (آن زمان هنوز VS Code وجود نداشت) وجود دارد؟هرچه بیشتر در این زبان عمیق تر میشدم بیشتر به این نتیجه میرسیدم که مایکروسافت سیاست مرموزی برای جذب و نگه داشتن افراد به محیط ویندوز و محصولاتش در بیش گرفتهآن روز ها نصف انرژیم را صرف مشکلات ویندوز . ویروس ها و کند شدن ناگهان و نصف دیگر را برای کنار آمدن با ویژگی هایی که در ویژوال استدیو من نبود تلف میکردماز کامپایل کردن سورس برای سیستم های ۳۲ بیتی و ۶۴ بیتی هم میگذرم.هر بار که هنگام کد نوشتن کار جدیدی را پیاده سازی میکردم حس میکردم زبان های که در Net. اجرا میشوند یک زبان واقعی که دسترسی به سخت افزار را برای برنامه نویس فراهم میکند نیستند، Net. مثل ریل قطاری است که برای جابجایی فقط باید در امتداد آن حرکت کردبزرگ ترین مشکل این بود که دات نت رفته رفته پشتیبانیش از سیستم عامل های قدیمی مایکروسافت را در حال لغو کردن بود، مثلا در ویندوز XP که آن زمان کاملا منقرض نشده بود فقط تا دات نت ۴ پشتیبانی میشد . خلاصه حس میکردم از قافله ای که مایکروسافت رهبریش میکند به سرعت در حال عقب ماندن هستمورود به جاوا، محقق شدن یک رويا:مشکلاتی که حس کرده بودم را با یکی از اساتید در میان گذاشتم او زبان JAVA را به من پیشنهاد کردمن علاقه ای به یادگیری زبان جدیدی نداشتم ولی به دلیل کنجکاوی سراغش رفتم.مدتی سعی میکردم تمام برنامه هایی که می نوشتم فقط با JAVA باشد، در این راه موفق شدم که به اندازه ی نیاز جاوا را درک کنممدت زیادی نگذشته بود که فهمیدم زمانی که با #C سپری میکردم به بطالت گذشته، در جاوا ویژگی های منحصر به فردی دیدم که بسیار با نیاز های من مطابقت داشت.مهم ترین آن ها این شعار بود یک بار بنویس، یک بار کامپایل کن، همه جا استفاده کن٬ این شعار به معنای واقعی کلمه امکان پذیر شده بود زیرا کدی که در جاوا کامپایل می شود(به بایت کد) در هر سه سیستم عامل (لینوکس - ویندوز - مک) بدون هیچ تغییری و فارغ از ۳۲ یا ۶۴ بیتی بودن میزبان اجرا می شد و به درستی کار میکرد، در زمان نوشتن کد هم می شد چک کرد که این سورس روی چه پلتفرمی در حال اجرا است و متناسب با آن اقدام کرد، سه نوع مدل برای استفاده از رابط های گرافیکی کتابخانه استاندارد داشت(AWT, SWING,FX)، با جاوا می شود کارهای زیادی کرد مثل دسترسی داشتن به کتابخانه های تولید صدا - ذخیره صدا - تولید و پخش آنی صدا ، و کارهایی بسیار زیادی که در حوصله این متن نمیگنجد.چون از #C استفاده نمیکردم دلیلی برای ماندن و استفاده کردن از ویندوز نمی دیدم، از دوران دبیرستان تا این مرحله از زندگی خدمات و سرعت اینترنت برای من بهبود قابل توجهی یافته بود، بدون معطلی یک نسخه از اوبونتو را دانلود و بلافاصله نصب کردم، نسبت به Redhat ی که در گذشته دیده بودم اوبونتو بسیار پیشرفت کرده بود و اصلا قابل مقایسه با ردهت نبود(برای من به عنوان سیستم Desktop) بعد از مدت کوتاهی ابزارهای مورد نیاز برای برنامه نویسی جاوا را فراهم کردم، در لینوکس همه چیز طعم دیگری دارد، حتی پخش یک موزیک تکراری!، این محیط جذاب و شگفت انگیز درهای جدیدی را برایم باز کردند، با java همه کار میشه انجام داد(با کمی تفاوت) بعد از مدتی خود را در توسعه برنامه های اندرویدی دیدم، مدت نسبتا طولانی(از نظر خودم) با java کار کردم تقریبا می توانم بگویم هر نوع برنامه ای که به ذهنم ميرسد مینوشتم و به دوستانم میدادم. از برنامه های سمت سرور یا سایت های کوچک تا web api تا بازی های کوچک اندرویدی و……جاوا برای کار کردن با هر قسمت از سیستم عامل یک کتابخانه یا Api تهیه کرده از کارهای پیش پا افتاده مانند تکان دادن موس و فرستادن رویداد فشردن صفحه کلید تا مدیریت Thread ها و استفاده از روش سمافور و کلی چیز باحال که گفتنشان در اینجا نمی گنجدولی جاوا هم مانند #C روی یک ماشین مجازی اجرا می شد، با اینکه به نسبت، جاوا سرعت زیادی در اجرا شدن داشت ولی بعضی وقت ها که سعی در طراحی یک شی گرافیکی داشتم سرعت کم جاوا در پردازه های بصری، خود را نشان میداد. موضوع دیگری که کمی وقت گیر به نظر می رسید این بود که اگر در هر خط کدی که به یک سیمیکولون(نقطه ویرگول ; )ختم میشود را در نظر بگیریم طولش کمی زیاد به نظر میرسد و کلی برای نوشتن یک کلاس (class) وقت و انرژی مصرف میشود. به مثال زیر توجه کنید تا درک بهتری به دست آوریدjava example codeاین قطعه کد که به زبان جاوا نوشته شده. یک فایل متنی را خوانده و در نهایت نام های کاربری را به صورت یک آرایه از رشته ها بازگشت میدهدبا جاوا یک سری کار ها را نمیشود به راحتی انجام داد بزرگ ترین آن ها این بود که نمیشود به صورت مستقیم از Api های یک سیستم عامل یا کتابخانه های که به زبان C پیاده سازی شده اند استفاده کرد البته راه هایی برای انجام دادن این کار ها وجود دارد مانند JIN - JNA ولی کمی روش کار را پیچیده میکند. نمی خواهم بگویم که جاوا زبان خوبی نیست ولی احساس میکنم به کمی ساده سازی نیازمند است در برخی قسمت ها حس میشود که اصطلاحا لقمه را از پشت سر به دهان میگذارد که این روش مناسبی نیست، زبان جاوا خیلی درگیر شی گرایی شده و این باعث میشود توسعه دهنده برای کارهای ساده به پیاده سازی کلاس ها بپردازد، زبان های که با ماشین مجازی اجرا می شوند مثل چاقوی دو لبه عمل میکنند اجرا شدن در بستر ماشین مجازی یک مزیت قوی و مثبت برای چند سکویی بودنش است در حالی که میشود آن را به نوعی نقطه ضعف منفی دانست که قدرت و سرعت و دسترسی به سخت افزار را کاهش میدهدبه همین دلیل نیاز شدیدی را در خودم برای پیدا کردن و یاد گرفتن زبانی که کاستی های جاوا و دات نت را نداشته باشد حس میکنم.سخن پایانی:هرکسی بسته به نوع ، وسعت کار و نیازش از زبان های مختلف استفاده میکند.استفاده کردن یا نکردن از زبان خاصی به معنی خوب یا بد ، قوی یا ضعیف بودن توسعه دهنده نیست.هرکسی سلیقه ای دارد ولی راه پیشرفت زمانی باز می شود که بی دلیل روی زبان یا تکنولوژی خاصی تعصب نداشته باشیمهر زبانی مشکلات خاص خودش را دارد - پدید آمدن زبان های جدیدی گواهی بر وجود مشکلات استتا زمانی که وقت و انرژی دارید زبان های جدید را امتحان کنید، زیرا همیشه ابزار های جدید با خود ایده های جدیدی را به ارمغان می آوردند.ali_slm1995@yahoo.com