دعوت به تبادل نظر: آیا جاوا برای تولید نرمافزارهای عمومی گزينه مناسبی است؟

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

در دنیا، جاوا برای تولید انواع نرمافزارها استفاده شده است: نرمافزارهای بزرگ سازمانی (مانند پورتالهای شرکتها و دانشگاهها، نرمافزارهای بانکی و بیمهای و بورس)، نرمافزاهای مدیریتی (مانند سامانههای مدیریت سیستمهای مخابراتی و نفتی) و نرمافزارهای شخصی و دسکتاپ، و البته نرمافزارهای عمومی.
حال سؤال اینجاست: آیا جاوا برای تولید نرمافزارهای عمومی گزينه مناسبی است؟ نرمافزارهای عمومی با تعداد فراوان کاربران سروکار دارند و حجم تعاملات کاربران با این نرمافزارها و بار کاری آنها بسيار زیاد است. اما در مقابل (معمولاً) فرایندها و روالهای کاری بسيار ساده و سريع هستند.
امروزه بسياری از شرکتهای نوپا (startup) از زبانهایی مانند پایتون، اسکالا و PHP برای تولید نرمافزارهای عمومی استفاده میکنند. بسياری از شرکتهای بزرگ هم از این فناوریها استفاده میکنند. با این اوصاف، آیا هنوز جاوا گزينه مناسبی برای این کار است؟ نقاط ضعف و قوت جاوا در این عرصه چیست؟ چه پارامترهایی در بازار (تولیدکنندگان نرمافزار و مصرفکنندگان) ایران باید موردتوجه قرار گیرد؟
منتظر شنیدن نظرها و تجربههای شما در این زمينه هستیم. لطفاً از طريق بخش «نوشتن دیدگاه» (در پایین همین مطلب) در این بحث شرکت کنید. دانش و تجربه شما، حتی در حد چند جمله کوتاه، برای خوانندگان و تصمیمگیرندگان این عرصه مفید و راهگشا خواهد بود.




سلام . از اساتید گرامی که به طور کامل جواب دادن تشکر .
سوالی داشتم که لطفا جواب بدید ممنون میشم .
1 : اگر کسی بخواد فروشگاه اینترنتی بزنه و یک برنامه نویس java استخدام کنه . آیا بعد از اتمام پروژه میشه بعد از چند وقت به یک نفر دیگه داد برای توسعه ؟ یا فقط باید همون شخص باشه ؟
چون در زبان asp.net من شنیدم که اگر کسی بخواد برنامه بنویسه بعد از اینکه پروژه تموم میشه شخص دیگری نمیتونه ادامه بده یا حوصله خوندن ندارن یا مشکل چیزه دیگه ای هست.
2 : میخواستم فروشگاه اینترنتی بزنم با زبان java . به نظر اساتید گرامی انتخاب خوبی هست ؟ یا asp.net یا c# یا c++ بهتر هست ؟
کل افکارم برای آینده هست . که بتونم مثلا یک برنامه نویس آوردم بگم فلان جارو عوض کن یا این امکان رو میخوام یا هر چیز دیگه .
درسلام
با سپاس از نظرات مفید و خوب دوستان.
من هم در چند سال اخیر تجربیاتی در پروژه های جاوا و .net و پایتون و کارهای Client-side و Desktop داشتم که به نظرم هر یک از این زبان ها واقعا کاربرد خاص خودشون رو دارن و در زمینه هایی بهتر اند. مثلا به عنوان یه استارت آپ که مشتکل از آدم های جوون و معمولا کم تجربه است شاید گزینه هایی مثل پایتون به دلیل سرعت در راه اندازی اولیه یه راه کار و صرفه جویی در هزینه ها واقعا گزینه بهتری می تونه باشه. معمولا بحث بودجه اجازه نمی ده به یک استارت آپ که روی راه اندازی یه راهکار جاوایی که به نسبت بسیار پیچیده تر از سایر پلتفرم ها هست فکر کنه. البته اگر به دنبال ساخت یه چارچوب خوب برای چند سال آینده باشیم و هزینه slow start اولیه ای که وجود داره رو بشه تحمل کرد جاوا گزینه بسیار بهتری (به نظر شخصی من) از زبان هایی مثل پایتون خواهد بود. دلیلش هم این هست که برای کارهای حرفه ای و منظم و اصولی اساسا فریم ورک های قوی تری در زبان جاوا پیدا میشه که علیرقم پیچیدگی در راه اندازی محصول نهایی با کیفیت تری رو می سازن. یه مسیله ای که باید در مورد جاوا در نظر بگیریم این هست که بسیاری از دوستانی که اینجا هستند سال ها جاوا کار کردند و میزان سختی و راحتی کار با جاوا اونقدر که برای یک تیم تازه کار یا ناآشنا با جاوا قابل لمس هست برای دوستان نیست.
در مورد سرویس های سازمانی فکر می کنم داستان برعکس وجود داره. اکوسیستم هایی مثل پایتون با اینکه ابزارهای خوبی دارند و یا بسیاری از ابزارها مستقل از زبان هستند و در اونجا کاربرد دارند با این وجود بلوغ کافی در مقایسه به جاوا یا دات نت در اونها نیست و شاید برای این نوع سرویس ها استفاده از پایتون مناسب نباشه. این رو هم اگر در نظر بگیریم که معمولا در پروژه های سازمانی نحوه کسب درآمد و زمان بندی به نوعی هست که امکان بیشتری برای ساختن راهکار دلخواه خودمون داریم باز هم کفه ترازو به سمت جاوا یا دات نت سنگینی می کنه.
در مورد بحث Template Engine و کلا لایه View تیم ما به طور کامل فریم ورک های .net و جاوا رو کنار گذاشت و از AngularJS استفاده می کنیم. چند دلیل عمده برای ما وجود داشت که عبارتند از:
* کلاینت های ما معمولا موبایل دیوایس ها و وب هستند و استفاده از مدل REST امکان بازاستفاده بیشتری از کدهای سرور رو میده و هزینه کمتری داره.
* مدل MVC در سمت جاوااسکریپت بسیار قوی هست و نگهداری کدها با فریم ورکی مثل Angular بسیار بهتر و راحت تر هست
* مدل های Single Page و وب سایت های کاملا آژاکس ای پیشفرض این فریم ورک ها هستند
* معمولا چون تکنولوژی های کلاینت مستقل از سرور میشن آموزش افراد جدید بسیار ساده است و نیازی نیست آگاهی یا وابستگی به سرور داشته باشند
* فریم ورک های به خصوص جاوایی برای دادن سرویس های REST بسیار خوش ساخت تر و بهتر و ساده تر از حالت دارای View هستند به خصوص اینکه وابستگی به View Engine هم نخواهیم داشت و صرفا در لایه Object کار می کنیم
* امکان تست سرویس ها و مدل های REST معمولا بیشتر و راحت تره
* امکان Deploy ساده برای کارهای Scalable . مثلا خود ما از Spring boot و Jetty جهت دادن سرویس های REST و از AngularJS به همراه nginx جهت ارایه محتوای ثابت استفاده می کنیم. به نظرم اینکه خیلی از Html و اسکریپت های ما کامپایل بشه به جاوا و هر بار نوشته بشه روی شبکه خیلی کارایی رو کاهش میده در حالی که nginx برای این کار بهینه تر هست.
از بحث منحرف شدیم.
در نهایت مشکلاتی هم به نظرم جاوا (نه صرفا زبان بلکه اکوسیستم) داره:
* زبان با وجود اینکه ویژگی های زیادی بهش اضافه شده در نسخه ۸ ولی همچنان ضعیف هست. اینکه هر ویژگی رو به زبان اضافه کنیم لزوما منطقی نیست. ولی به نظرم زبانی مثل C# با اینکه مفاهیم بسیار زیادی درونش هست اما همچنان از منظر ساختار شیی گرایی و نبود ضعف در طراحی بسیار قوی تر از جاوا هست. البته یادگیری همه ویژگی های اون سخت تر هست ولی اگر به اندازه Subset جاوا بخوایم یاد بگیریم تفاوتی از لحاظ زمان و هزینه نداره.
* زبان هایی مثل Scala و Groovy وجود دارند و میشه استفاده کرد ولی اساسا در تیم های کوچیک و متوسط وارد کردن یک زبان دیگر (روی JVM بودن به هر حال تاثیری در نگهداری نداره و چیز زیادی از سختی کار کم نمی کنه ) هزینه بر هست و به خصوص تعداد کسانی که این زبان ها رو بلدن خیلی خیلی کم هست. حتی خود ما هم برای اینکه بتونیم کتابخونه های جاوایی رو با اینها ادغام کنیم وقتی وارد جزییات کار میشیم می بینیم که کلی باید تجربه کسب کنیم که بتونیم واقعا بدون مشکل این کار رو انجام بدیم.
* تعداد بسیار زیادی گزینه برای هر کار (ذاتا خیلی خوبه) ولی در عمل با تعداد زیادی گزینه مرده یا نابالغ و خیلی اوقات بدون مستندات کافی و Community ضعیف طرف هستیم که عملا کار رو به جای راحت کردن سخت می کنن.
* بحث مدیریت وابستگی ها که حتی با وجود استفاده از ابزارهای متنوعی مثل Maven و Gradle و چند سال تجربه همچنان در مقایسه با بقیه اکوسیستم ها عذاب آور هستند
جمع بندی من این هست که جاوا برای بسیاری از کارها خوب هست (لزوما بقیه بد نیستن) ولی در مواردی که نیاز به سرعت بالا با فرض تجربه کم هست می شود از گزینه های Noobie Friendly تر استفاده کرد. معمولا هم برای ساخت یک چارچوب اولیه خوب در جاوا نیاز به حدود یک سال آزمون و خطا هست و بعد از اون از لحاظ Productivity راهکار ساخته شده به نظر من می تونه با بقیه رقابت کنه. در زمینه های خاص مثل Desktop یا سمت کلاینت هم به نظرم تکنولوژی هایی مثل C# یا AngularJS بسیار قوی تر هستند که اصولا می تونن به صورت موازی در کنار جاوا مورد استفاده قرار بگیرند.
ببخشید طولانی شد.
با سلام خدمت همهی اساتید محترم.
دوست داشتم چند نکته به فرمایش دوستان اضافه کنم:
به نظرم برای نرمافزارهای بزرگ به چیزی به جز جاوا نمیتوان فکر کرد. خیلی از شرکتها هم که به صورت نوپا کار رو آغاز کردند پس از زیاد شدن کاربران به سمت جاوا و اسکالا رفتند. چند سالی هست که community کاربران جاوا به سمت این مطلب رفتند که سرعت کار رو بالا ببرند. دوستانی که خیلی به فکر سرعت بالا در توسعه هستند میتوانند به چارچوبهای Play و Spring Boot و Spring Roo یک نگاهی بیاندازند.
در جواب دوستی که گفتند جاوا در لایهی View ضعیف هستش باید بگم که من خودم به شخصه خیلی با این موضوع مشکل داشتم و به صورت گسترده برای فناوریهای لایهی View در جاوا جستجو کردم و باید بگم که از هیچ کدوم از لایههای JSP و JSTL و JSF و Thymeleaf و … رضایت نداشتم و دلیل اصلی اون هم نداشتن type برای متغیرها در این تکنولوژیها بود. تکنولوژی GWT نیز مناسب بود ولی به نظرم کار با اون خیلی سخت و پیچیده است. در حال حاضر، من به شخصه به Twirl که template engine چارچوب Play است علاقه دارم. Twirl مدت زیادی هست که از توی چارچوب Play بیرون اومده و به راحتی میشه در چارچوبهای دیگر مانند Spring مورد استفاده قرار بگیرد. از مزیتهای اصلی Twirl میتوان به داشتن type برای متغیرها، کامپایل شدن این تمپلیتها، و پشتیبانی IDEهای اصلی جاوا (eclipse و intellij) اشاره کرد.
نکتهی دیگری که میخوام اضافه کنم اینه که میخوام اندکی توجهتون رو به زبان اسکالا جلب کنم. امکانات این زبان فوق العاده است و این که میشه از اسکالا در کنار جاوا استفاده کرد بسیار قدرت برنامهنویسی رو بالا میبره. اسکالا از جاوا 8 خیلی جلوتر هستش و به نظرم یکی از دلایلی که از جاوا 8 تا حالا خیلی استقبال نشده وجود زبان اسکالا هست.
در آخر میخوام بخاط جسارتی که کردم و در محضر اساتید اظهار نظر کردم معذرت خواهی کنم.
موفق باشید
سلام
صحبتهای امیر مقیمی و سید جمال پیشوایی نکات تقریبا کاملی رو از نوع نگاه عمومی مطرح کردن
یعنی شروع پروژه کوچیک با زبان جاوا، بدلیل هزینه اولیه راه اندازی بالا اصولا مورد انتخاب قرار نمیگیره مگر اینکه شخصی که پروژه رو راه اندازی کرده خودش مسلط به جاوا باشه و به دلیل شناخت و تجربه اون رو انتخاب کنه (مثل سید جمال)
اما بخصوصه در ایران، با توجه به تجاربی که غالبا افراد متخصص تر در زمینه برنامه نویسی دارن، پروژه های بزرگ رو اصولا با جاوا شروع میکنن. علت اصلیش شاید بدلیل متن باز بودن، وجود پلاگینها رایگان و با پشتیبانی، و …
البته به جهت جلوگیری از برداشت نادرست از صحبت هام اضافه کنم که:
اصول و الگوهای شیگرا واقعا لازم هستند و در اغلب زبان ها حتی python! تا جای ممکن رعایت شده اند. گذشتن از این اصول به هیچ عنوان جایز نیست.
روی صحبت های بنده بیشتر مخصوص سرویس های عمومی بود که سرعت توسعه کسب و کاری و چابکی بسیار بسیار در آن مهم است. از همین رو هم هست که Java رو برای SPL بهترین می دونم.
واقعا هیچ وقت چیزی تحت عنوان Golden Hammer یا Silver Bullet وجود ندارد. یه وقت دوستان ناراحت نشن :-“
در مورد صحبت دوستان چند نکته به ذهنم رسید
.
زبان جاوا یکی از ساده ترین زبانهای دنیاست. چیزی که جاوا را پیچیده کرده ساختار زبان نیست بلکه زیاد بودن امکانات و تنوع ارائه کنندگان است. در نتیجه نقطه صفر شروع کار با جاوا دورتر از بسترهای دیگر است. مشکل کمبود نیرو و عدم اقبال startup ها را می توان در همین مساله ریشه یابی کرد.
من تجربه کد زدن با پایتون را ندارم و از لذتی که طرفداران پایتون را پابند کرده بهره نبردم ولی آنقدری که در جریان کار تیمهای پایتون بودم دیدم با مشکلاتی مواجه می شدند که در جاوا کاملاً حل شده است. مثلاً در هنگام تغییر نسخه اوراکل به مشکل driver برخورد کردند. یا برای تولید گزارش pdf به شکل صفحه بندی شده دچار دردسر شدند. زمان تولید کم بود ولی پشتیبانی به سادگی جاوا نبود.
فقط ساختارهای زبان نیست که productivity را بالا می برد. در پایتون خیلی از امکاناتی که در جاوا وجود دارد با آن کیفیت وجود ندارد. مثلاً Report Engine در تراز BIRT و Jasper Report یا Rule Engine در تراز Drools یا Process Engine در تراز Activiti و JBPM. حتی امکانات بدیهی مثل JMX و JDBC با این کیفیت و سهولت وجود ندارد. نبود چنین امکاناتی زمان پروژه را تلف می کند و کیفیت محصول را پایین می آورد. البته تبعاً یادگیری این امکانات نقطه شروع را دورتر می کند.
بیشتر بودن productivity زبانهایی مثل pyton و ruby فقط به داینامیک بودن آنها برنمی گردد بلکه بعضی از ساختارها و امکانات زبان هم در آن تاثیر دارد. خیلی از این امکانات در java 8 گنجانده شد. با این حال اگر به زبانهای دینامیک علاقه دارید پیشنهاد می کنم Groovy را تجربه کنید.
ممنون از سوال خوبتون و همچنین از نظرات دوستان که خیلی جالب بود.
تجربه من اینه که در ابتدای تشکیل یک استارتاپ تجربه اعضای تیم با یک زبان حرف اول و آخر رو میزنه. مثلا به این دلیل فیس بوک با php نوشته شده که مارک زاکربرگ خودش به اون زبان مسلط بوده و توییتر هم با ruby نوشته شده به این دلیل از زبان خود موسس شرکت:
Originally I was going to program twttr in Python, C, & Ocaml. But, I got @florian who was a core contributor to Ruby on Rails.
بنابراین خیلی بحث مقایسه زبانها در اون مقطع برای شروع یک کار جدید مطرح نیست. به بیان ساده تر برای یک سرویس عمومی جدید روی وب با هر زبانی که بهتر بلد هستید یØ