آیا Go سریعتر از Java است؟

آفلاین
user-avatar
عرفان حشمتی
16 بهمن 1399, خواندن در 9 دقیقه

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

بنابراین اگر کسی بگوید که زبان Go بسیار جذاب است، ده‌ها نفر پاسخ می‌دهند که جاوا بهتر است، زیرا این معیاری وجود دارد که ثابت می‌کند جاوا بسیار سریعتر است (به علاوه دارای Generics و همچنین try-catch است). سپس بنچمارک را نگاه می‌کنید و می‌بینید که زبان جاوا سریع‌تر از Go است و دسته دیگری از نظرات را پیدا می‌کنید که برعکس آن است. رفته رفته لحن گفتگوها به سمت جنگ تعصبی گرایش پیدا می‌کند.

اما یک لحظه صبر کنید. آیا می‌توان از زاویه دیگری به آن نگاه کرد؟ آیا می‌توان ارزیابی کرد که کدام یک از دو زبان مزایای بیشتری برای یک سازمان، محصول یا پروژه خاص دارد؟

سهولت توسعه و نگهداری از برنامه‌های استاندارد سازمانی مهم‌ترین جنبه‌ای است که باید هنگام مقایسه زبان‌های مختلف برنامه نویسی مورد توجه قرار گیرد.

این بدان معنی است که زبان‌های برنامه نویسی را در مورد آنچه واقعا اهمیت دارد مقایسه کنیم. در بیشتر موارد به ویژه در سطح سازمانی، عملکرد و نگهداری کد برنامه در اولویت است. تولید و نگهداری از کد چیزی است که معمولا بیشترین هزینه برای آن صرف می‌شود. بنابراین سهولت تولید و نگهداری چنین کدی باید در مرکز ارزیابی قرار گیرد.

بیایید با واقعیت‌ها شروع کنیم

حقایقی وجود دارد، چیزهایی که درست هستند و به نظرات کاربران بستگی ندارند. در اینجا لیست مواردی را که به ذهنم رسیده‌اند، بدون ترتیب خاصی عنوان کرده‌ام:

واقعیت: Go فایل‌های اجرایی کوچکتری دارد و از حافظه کمتری استفاده می‌کند.

تصاویر داکر حاوی فایل‌های Go معمولا کوچکتر از معادل جاوا هستند. این مهم است که بهینه سازی منابع زیرساختی با به حداقل رساندن حجم کد همراه باشد.

واقعیت: Go می‌تواند سطح بالاتری از همزمانی را حفظ کند

Go می‌تواند به راحتی صد هزار گوروتین (goroutine) را اجرا کند. اما نخ‌های (threads) جاوا بسیار محدودتر هستند. این موضوع مهمی است اگر بخواهیم بیشتر پردازنده‌های خود را به طور خاص در زمینه کاری I / O محدود کنیم.

واقعیت: جاوا کتابخانه‌هایی برای اتصال به همه چیز دارد

این موضوع می‌تواند در برخی موارد یک عامل تصمیم گیری مهم باشد. اگر نیاز به ارتباط با مدیریت تراکنش‌ها مانند CICS یا TxSeries یا سایر فناوری‌های قدیمی دارید، جاوا تنها گزینه است. پکیجی برای این مورد در Go وجود ندارد.

واقعیت: تعداد بیشتری برنامه نویس جاوا در دنیا وجود دارد

طبق نظرسنجی‌های انجام شده، تعداد برنامه نویسانی که با جاوا کار می‌کنند بسیار بیشتر از برنامه نویسانی است که از زبان Go استفاده می‌کنند.

واقعیت: Go سینتکس ساده‌تری دارد

مستندات Go، 86 صفحه دارد که مثال‌ها را نیز شامل می‌شود. مستندات جاوا از سال 2000، 250 صفحه بوده و تابه حال ساده‌تر نشده است.

واقعیت: "یک بار نوشتن و در همه جا اجرا کردن" کمتر مورد توجه است

با محبوبیت روزافزون کانتینرها، می‌توانید تقریبا به هر زبانی بنویسید و در همه جا توسط داکر اجرا کنید.

واقعیت: Go در هنگام ساخت سریع‌تر است

آیا تا به حال چرخش چرخ دنده را بر روی صفحه نمایش یک توسعه دهنده جاوا مشاهده کرده‌اید که می‌خواهد اجرای برنامه را آغاز کند؟ این اتفاق خیلی کمتر با Go می‌افتد.

برخی واقعیات صریح و بدیهی نیز وجود دارند که ما آن را نظریه می‌نامیم

متأسفانه یا خوشبختانه زندگی همه سیاه و سفید نیست و سایه‌های خاکستری هم وجود دارد. در اینجا برخی از این سایه‌ها که به کار ما مربوط هستند، آورده شده:

نظریه: Go برای توسعه برنامه‌ها بسیار محدود است

Go قابلیت generic ندارد، Try-catch هم ندارد. برخی می‌گویند که نمی‌توان کدی را در سطح سازمانی بدون چنین ویژگی‌های اساسی ایجاد کرد.

نظریه: جاوا خیلی پیچیده شده است

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

نظریه: Go برای برنامه نویسی سیستم مناسب است

گرچه درست است که برای ساخت مواردی مانند Docker و Kubernetes به شدت مورد استفاده قرار گرفته، اما دلیل روشنی برای مناسب نبودن آن برای توسعه برنامه استاندارد سازمانی وجود ندارد. مگر اینکه از سایر عناصر مشکوک به عنوان استدلال استفاده کنیم. مثلا بحث generics و try-catch که در بالا ذکر شد

کدام زبان کارآمدترین تجربه توسعه و نگهداری بهتر را می‌دهد؟

همانطور که مشاهده کردید، هر دو مورد مزایا و معایب خاص خود را دارند. اما وقتی نوبت به تصمیم گیری می‌رسد، باید در یک زمینه خاص آنها را بررسی کنیم.

بیایید یک سناریو استاندارد مثلا یک فروشگاه نرم‌افزاری را در نظر بگیریم که راه‌حل‌های سازمانی مانند برنامه‌های بانکی یا سیستم‌های مدیریت سفارش را توسعه می‌دهد.

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

تلاش برای توسعه و نگهداری

این مهمترین عامل برای ارزیابی در بیشتر موارد است. آیا تهیه و نگهداری برنامه‌ای که با زبان Go نوشته شده هزینه کمتری دارد یا با جاوا نوشته شده باشد؟

سرمایه گذاری اولیه محدود

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

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

ساده است یا ضعیف؟

Go ساده است. اما ممکن است ضعیف نیز دیده شود. ما قبلا اشاره کردیم که این برنامه Generics ندارد و مدیریت خطا ممکن است بسیار دشوار باشد. به خودی خود هیچ کلاس و وراثتی وجود ندارد. بنابراین می‌توان گفت که فقدان چنین ویژگی‌هایی باعث کاهش بهره‌وری می‌شود.

از طرف دیگر با Go معمولا فقط یک راه برای انجام یک کار وجود دارد. سازندگان Go این را "ارتوگونالی" می‌نامند.

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

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

به نظر می‌رسد Go ارزش امتحان کردن را دارد

اگر یادگیری Go آسان است، برای شروع استفاده از آن نیازی به سرمایه‌گذاری زیاد نیست.

اگر Go بسیار ساده باشد، می‌تواند توسعه و نگهداری کد برنامه‌های سازمانی را کارآمدتر کند.

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

اگر پشتیبانی از همزمانی در Go بسیار مطلوب باشد، بنابراین می‌توانیم از زیرساخت‌های خود به ویژه در سناریوهای محدود به ورودی / خروجی بهره ببریم.

با جمع‌بندی تمام نکات، این احتمال وجود دارد که توسعه برنامه‌های سازمانی با Go می‌تواند از نظر کارایی در عملکرد IT پیشرفت چشمگیری داشته باشد.

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

این یک سرمایه گذاری پر ریسک است. همانطور که هر سرمایه گذاری برخی از خطرات را در پی دارد، اما نوید برخی از سودها را نیز می‌دهد. بر اساس نتایج می‌توانید تصمیم بگیرید که آن را ادامه دهید یا متوقف کنید.

الگوریتم تصمیم نهایی

آیا ارزش دارد Go را در سطح سازمانی امتحان کنید؟ ما می‌توانیم کل محتوای این مقاله را در یک الگوریتم فرآیند تصمیم گیری که در Go واضح است، خلاصه کنیم.

func DecideIfTryGo() Outcomes {
 // check for showstoppers (g.g. CICS integration) in my environment
 showstopper := os.Getenv("SHOWSTOPPERS")
 // if there are showstoppers there is no point to try Go
 if showstopper != "" {
   return errors.New(showstopper)
 }
 // find a good candidate project considering Go characteristics
 project := FindProject("concurrent", "IOBound", "InfraEfficiency")
 // create a team
 team := NewTeam(project)
 // do a bit of training
 TrainTeam(team)
 // launch the project with a timeout
 ctx, cancel = context.WithTimeout(context.Background(), timeout)
 outcomes := Launch(ctx, project)
 // return the outcomes
 return outcomes
}

سخن پایانی

این مقاله حول محور Go و جاوا است، اما مفهوم اصلی مقایسه چیزهایی که واقعا مهم هستند را می‌توان برای هر مجموعه فناوری استفاده کرد.

بنابراین می‌توانید جاوا یا Go را با هر چیز دیگری جایگزین کنید، به شرطی که آنها را با آنچه واقعا اهمیت دارند و در اولویت هستند مقایسه کنید. در آخر توجه داشته باشید که محتوا هم بسیار مهم است.

منبع

چه امتیازی به این مقاله می دید؟
خیلی بد
بد
متوسط
خوب
عالی

دیدگاه‌ها و پرسش‌ها

برای ارسال دیدگاه لازم است، ابتدا وارد سایت شوید.

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

آفلاین
user-avatar
عرفان حشمتی @heshmati74
مهندس معماری سیستم های کامپیوتری، طراح و توسعه دهنده وب سایت
دنبال کردن

گفتگو‌ برنامه نویسان

بخشی برای حل مشکلات برنامه‌نویسی و مباحث پیرامون آن وارد شو