बस Java का इस्तेमाल करें
(teamten.com)- मेरी सबसे पसंदीदा भाषा Python है। इसके बावजूद मैं हर जगह — साधारण scripts तक के लिए — Java का इस्तेमाल करता हूँ.
- कुछ अनुभव:
- एक Java-आधारित कंपनी में मैंने test scenarios को JavaScript में लिखा था। लेकिन stack trace को ट्रैक करना मुश्किल था, और Java तथा JavaScript के बीच bridge code लिखने में बेकार की मेहनत लगी.
- logs को JSON format में सहेजा जा रहा था, और एक साथी developer ने इन logs को संभालने के लिए
logcatनाम का एक program बनाया। वह program अच्छा था, लेकिन बाद में उसी तरह का program Java में बनाया गया तो 10 गुना से भी ज़्यादा performance improvement मिला. - Java पर उपलब्ध भरपूर अनुभव और संसाधनों की वजह से web service बनाने में Java, Python से तेज़ साबित हुआ। सख्ती से कहें तो यह एक ही भाषा का उपयोग करने से मिलने वाला लाभ है.
- Java को लेकर सबसे गर्म बहस उसकी verbosity है। लेकिन यह बिल्कुल भी कमी नहीं है। नीचे के दो code देखिए.
// java
Map<String,User> userIdMap = new HashMap<String,User>();
// python
userIdMap = {}
- लेकिन वास्तव में Python code के नीचे की तरह लिखा होने की संभावना ज़्यादा है। (अगर ऐसा न हो, तो उसका maintenance सच में बहुत कठिन होगा)
# Map from user ID to User object.
userIdMap = {}
- यानी dynamic type language का उपयोग करना ऐसा है जैसे 30 मिनट में कुछ शानदार बनाने के लिए 14 दिन बाद की productivity की बलि दे देना.
- Stack Overflow ने ASP.NET का उपयोग करके (2010 में) 5 servers पर 60,000,000 pageviews संभाले थे.
- unit test का उदाहरण देखते हैं। unit tests लिखना और उनका maintenance करना समय लेता है। खासकर, वे exception cases जिन्हें types से आसानी से जाँचा जा सकता है, dynamic type languages के unit tests में अक्सर ठीक से पकड़े भी नहीं जाते (उदा: parser).
- (Python का उपयोग न करने की एक और वजह जोड़ें तो) quick hacks धीरे-धीरे बड़े होकर बहुत महत्वपूर्ण tools बन जाते हैं, लेकिन उन्हें फिर से लिखने का समय नहीं होता, और नतीजतन हर बार इस्तेमाल करते समय performance और maintenance से जूझना पड़ता है.
- अंत में, दूसरी static type languages की जगह Java को पसंद करने की वजहें
- C/C++ को मेरे काम में लागू करना मुश्किल है
- C# में cross-platform support की कमी है
- Scala बहुत ज़्यादा जटिल है
- D, Go जैसी दूसरी भाषाएँ मेरे काम में लगाने के लिए अभी बहुत नई हैं
- इस लेख को GeekNews पर लाने के मेरे कुछ कारण हैं:
- “मुझे Java सच में बहुत पसंद है!” जैसा लेख मैंने पहली बार देखा, इसलिए यह दिलचस्प लगा (सिर्फ शीर्षक देखकर लगा था कि कोई twist होगा...)
- लेखक के पास अपना एक (Java से बना) toolbox होना मज़ेदार लगा। कुछ ऐसा, जैसे कोई बुज़ुर्ग अपनी जेब से टटोलते हुए प्राचीन हथियार निकाल रहा हो.
- मुझे व्यक्तिगत रूप से JavaScript और Python बहुत पसंद हैं। लेकिन ऊपर-ऊपर देखने पर भी लगता है कि इन भाषाओं में अब ‘किसी न किसी तरह types को शामिल करना’ ही मुख्य धारा बनती जा रही है (JavaScript के लिए TypeScript, Python के लिए typing/mypy)। ऐसे में, यह लेख पढ़कर मुझे लगा कि कहीं मैं static type language का उपयोग (बिना types को बिल्कुल भी सख्ती से लागू किए) कुछ हद तक सिर्फ आत्मसंतुष्टि के लिए तो नहीं कर रहा.
- लेखक के पास Java और Python दोनों का अनुभव था, इसलिए उन्होंने इन दोनों भाषाओं की सीधे तुलना की, लेकिन ज़रूरी नहीं कि हम इसे सिर्फ उसी दायरे में सीमित करके सोचें। एक व्यापक नज़रिए से static type और dynamic type languages के बारे में आप क्या सोचते हैं?
PS. किसी खास भाषा को बेवजह नीचा न दिखाएँ :D
58 टिप्पणियां
यह शायद बहुत ही व्यक्तिगत अनुभव हो, लेकिन मुझे लगता है कि Java में भाषा से ज़्यादा सबसे बड़ी समस्या JVM है.
मैंने JVM के कई versions में memory management ठीक से काम न करने के बहुत ज़्यादा मामले देखे हैं.
तो फिर pandas, numpy भी Java में बनाकर इस्तेमाल कीजिए। ऐसे दावे करने वाले लोगों को अपने पास नहीं रखना चाहिए।
Java वेब बैकएंड के लिए इस्तेमाल होता है और Python AI के लिए, है न।
अगर performance की बात करनी है तो Rust इस्तेमाल करना चाहिए, इसमें कौन-सी नई बात है?
लेकिन आगे AI का हिस्सा बढ़ने की संभावना है, इसलिए शायद अब Java को छोड़ने का समय
आ गया है? ऐसा लगता है। हमारे यहाँ "पीछे नहीं रहना चाहिए"
वाली mindset बहुत ज़्यादा है, हाहा
अगर AI की मांग बहुत बढ़ जाए और सामान्य REST API या साधारण CRUD काम को replace कर दे, इसलिए ऐसे सिस्टम अब बनाए ही न जाएँ, तब शायद Java को छोड़ा जा सकता है.
साथ ही, कई बार प्रोजेक्ट एक ही भाषा से नहीं बने होते, इसलिए मेरा मानना है कि भाषा और प्रोजेक्ट के उद्देश्य को one-to-one तरीके से जोड़ना भी सही नहीं है. क्योंकि अक्सर programming interface Python होता है, और जहाँ performance महत्वपूर्ण होती है वहाँ native code इस्तेमाल किया जाता है. हालाँकि हमारे देश में इस तरह से प्रोजेक्ट बनाना बहुत आम नहीं है.
परिचय थोड़ा निराशाजनक है। अगर आपने पहले मूल लेख लिखे जाने की तारीख बता दी होती, तो यहाँ मौजूद लोगों में से आधे लोग इसे कुछ हद तक समझ पाते...
मैंने भी दूसरे लोगों की टिप्पणियाँ देखकर बात समझी।
लेकिन मैंने जल्दबाज़ी में मान लिया था कि यह हाल ही में लिखा गया है, और इसे पढ़ते समय मुझे बिल्कुल भी अटपटा नहीं लगा। कम से कम मेरे लिए यह अब भी एक भरोसेमंद लेख है।
उससे अलग, मैं आगे से तारीख़ पर भी कभी-कभी ध्यान दूँगा, हाहा
बहस बहुत गरम हो रही है।
यदि कोई आपत्ति है, तो कृपया केवल उसका ही विवरण लिखें।
साइट उपयोग नियमों के विरुद्ध जाने वाली टिप्पणियाँ हटा दी गई हैं।
साथ ही, जो ID बार-बार नियमों के अनुरूप नहीं गतिविधियाँ कर रही थीं, उन्हें ब्लॉक किया गया है, कृपया इसे ध्यान में रखें।
कृपया स्वस्थ चर्चा करें।
मैं Oracle (JVM) की तुलना में Google (V8) पर ज़्यादा भरोसा करता हूँ।
जब मैंने Python करने के बाद पहली बार Java देखा था, तो वह सच में बहुत verbose लगा था. लेकिन आजकल Python में पूरी type hints जोड़ने के लिए जो कोड चाहिए होता है, उसे देखकर अब ऐसा भी नहीं लगता lol Java की कमी मुझे तो बल्कि उसकी naming convention लगती है, जिसमें method names को बेवजह बहुत लंबा रखने की कोशिश की जाती है.
1 जून, 2014
मैं भी static type languages को पसंद करता हूँ.
Dynamic type languages के कुछ हिस्से सुविधाजनक होते हैं, लेकिन production environment में कई बार maintenance मुश्किल हो जाती है.
और dynamic type languages अक्सर "सरल code लिखना" को अपनी design philosophy मानती हैं, इसलिए language स्तर पर बहुत-सी चीज़ें implicitly manage हो जाती हैं, लेकिन इसी वजह से कई बार optimization की गुंजाइश कम रह जाती है.
आखिरकार implementation की सुविधा बनाम optimization की अधिक गुंजाइश, इन दोनों के बीच development environment के हिसाब से सोच-समझकर चुनना ही बेहतर लगता है.
10 साल पुरानी पोस्ट, हाहा
सही कहा lol
Java छोड़ने के बाद मेरी ज़िंदगी शांत हो गई।
Stack Overflow सर्वे में Java की लोकप्रियता रैंक लगातार गिर रही है, और इसके पीछे वाजिब वजहें हैं।
खासकर कोरिया में, उस तथाकथित सरकारी framework को Spring पर फिक्स कर देने की वजह से नौकरी पाने के समय यह काम का पड़ता है,
लेकिन पश्चिमी देशों में legacy के अलावा, नए प्रोजेक्ट शुरू करते समय Java चुनना अब लगभग खत्म होता दिख रहा है।
यह सही है कि इसके पीछे वजह है, लेकिन लगता है आप उस वजह को अलग तरह से देख रहे हैं।
TIOBE साइट पर भी कहा गया है कि programming language rankings को सिर्फ संदर्भ के लिए देखना चाहिए और उनका market share या popularity से सीधा संबंध नहीं है।
निष्कर्ष यह है: Python भारी बढ़त के साथ नंबर 1 है, लेकिन क्या बाजार में उसके आधार पर आए tools हैं?
सबसे आम तौर पर जो दिखते हैं वे C/C++, .NET, और Java (Kotlin) तथा Swift हैं।
सवाल और search ज़्यादा होने से कोई भाषा ज़्यादा इस्तेमाल होने वाली भाषा नहीं बन जाती।
Python ऐसी भाषा है जिसे बिना formal background के भी कोई भी इस्तेमाल कर सकता है।
यह नहीं नकारा जा सकता कि वह popular है, लेकिन development market में बात अलग है।
Instagram बैकएंड में Python का उपयोग करता है.
'मार्केट में उपलब्ध टूल' से क्या मतलब है, यह थोड़ा अस्पष्ट है, लेकिन... Django, FastAPI, PyTorch, NumPy, Pandas वगैरह टूल क्या पर्याप्त नहीं हैं...?
शीर्षक देखकर तो मैं कमेंट्स की ही उम्मीद करके आया था hahaha आजकल भाषाओं पर निर्भरता की सीमा काफ़ी बढ़ गई है।
अगर बात सिर्फ़ लागत की हो, तो cloud में Java की memory usage की वजह से खर्च काफ़ी बढ़ जाता है। जो प्रोग्राम किसी static language में 100MB, 200MB memory में चल सकता है, वही Java में लिखा हो तो अक्सर 1G, 2G चाहिए होता है, और lightweight threads भी library compatibility की वजह से कई बार इस्तेमाल नहीं हो पाते।
Java भी एक static language है, लेकिन... memory की समस्या garbage collector या JVM से जुड़ी होती है, और आपने जो "static language में 100MB, 200MB memory चाहिए वाला program" कहा है, वह शायद C, C++ जैसी native languages पर लागू होने वाली बात है।
हैलुसिनेशन के लिए माफ़ कीजिए. T_T Java भी एक static language ही है. क्लाउड में तरह-तरह के खर्च जोड़ें तो memory के प्रति 1G पर लगभग 30,000 won मानना पड़ता है, इसलिए Java में develop की गई services पर बहुत महंगा खर्च आता है।
अगर exceptions मौजूद हैं, तो वह एक dynamic type language है। अलग से, मैं इस बात से सहमत हूँ कि type system और memory usage अलग-अलग मुद्दे हैं।
आपने जिस अपवाद का ज़िक्र किया, उसका अर्थ मुझे काफ़ी व्यापक लग रहा है। क्या आप इसे थोड़ा और विस्तार से समझा सकते हैं?
जहाँ तक मैं जानता हूँ, static/dynamic typed language की परिभाषा यह है कि अगर किसी variable का type compile time पर तय हो जाता है और उसे बदलने के लिए explicit रूप से करना पड़ता है, तो वह static typed language होती है। वहीं dynamic typed language ऐसी होती है जिसमें runtime पर variable का type मनचाहे तरीके से तय किया जा सकता है और उसे implicit रूप से भी बदला जा सकता है।
जब रनटाइम पर downcasting करना पड़ता है जैसी स्थिति सामने आती है, तो Java को रनटाइम पर type check करना पड़ता है। इसी वजह से Java dynamic type वाला है, और इसी समय exceptions पैदा होते हैं.
मूल रूप से अगर यह gap ही न हो, तो exceptions को exception कहने की ज़रूरत नहीं पड़ेगी।
throwबस उस pattern की syntactic sugar बन जाएगा जिसमें throw की जाने वाली object को global variable में रखकरgotoकिया जाता है।आपने जो कहा, उसी तरह runtime पर type check करने वाली भाषाओं को dynamic type कहा जाता है। लेकिन यह प्रोग्राम में संभाली जाने वाली सभी values पर लागू होने वाली बात है। चूंकि यह Java पर लेख है, Java को उदाहरण के रूप में लें तो Java code का type check compile time पर होता है, लेकिन इसमें यह महत्वपूर्ण निहितार्थ शामिल है कि उस variable से मेल खाने वाली value, variable के type से संगत होनी चाहिए।
अगर type check रनटाइम पर होता है, तो क्या C भी dynamic typed language है क्योंकि उसमें
voidpointer जैसा कॉन्सेप्ट है? मुझे पता है कि ऐसा एक कॉन्सेप्ट होता है, लेकिन इन दोनों के बीच फर्क क्या है?कौन-सा C compiler type checking को कोड में जोड़ता है और type गलत होने पर स्पष्ट error पैदा करता है? अगर ऐसा कोई implementation है, तो कृपया सिर्फ़ एक उदाहरण दीजिए।
C में उस प्रक्रिया में type checking जैसी कोई चीज़ नहीं होती। अगर आप floating-point data को integer के रूप में पढ़ें तो भी कोई समस्या नहीं आती, है न? यह dynamic typing नहीं है, बस सीधा-सीधा ख़तरनाक है।
हाँ, अगर C में type check रनटाइम पर होता, तो वह dynamic type भाषा होती।
लेकिन ऐसा नहीं है, इसलिए वह static type है।
voidpointer बस एक raw pointer है, जिसकी मूल data type पता नहीं होती। उस pointer के address पर कौन-सा type मौजूद है, यह पता नहीं लगाया जा सकता।मेरा मानना है कि सबसे अच्छी भाषा वही है जिसमें आप सहज हों।
सहमत हूँ। लगता है कि टीम या संगठन में इस्तेमाल होने वाली भाषा से बाहर जाना भी आसान नहीं है।
काम की प्रकृति या असाइनमेंट के बंटवारे के अलग-अलग कारणों में जब कोई नई भाषा भी जुड़ जाती है, तो कुछ खास लोगों पर काम का बोझ बढ़ जाता है, और स्टाफ में बदलाव होने पर काम आगे बढ़ ही नहीं पाता। भर्ती पर भी इसका असर पड़ता है, इसलिए मेरा मानना है कि tech stack का चयन बहुत सोच-समझकर करना चाहिए.
लेकिन दूसरी तरफ, सिर्फ इसलिए कि कोई भाषा परिचित है, अगर हम ऐसी भाषा पर अड़े रहें जिसका hiring pool छोटा हो या भर्ती के बाद अलग से सीखना पड़े, तो वह भी समस्या ही है।
C# में cross-platform की कमी क्यों है? आजकल ज़्यादातर .NET server apps को Linux servers पर deploy किया जाता है.
Python तो शुरू से ही तुलना का विषय नहीं है, और Kotlin, C# की तुलना में Java वाकई ज़्यादा verbose है और उसमें कई ज़रूरी features भी नहीं हैं, ऐसा लगता है।
अरे, यह 10 साल पुरानी पोस्ट है। अब स्थिति काफ़ी बदल चुकी है
C# भी virtual machine इस्तेमाल करने वाली भाषा है, इसलिए cross-platform support बहुत पहले आ जाना चाहिए था, लेकिन मेरी जानकारी के मुताबिक यह बेहद हाल में आया है, और इसी वजह से कुछ समय तक यह धारणा बनी रहेगी कि इसे Windows के अलावा दूसरे OS पर चलाया तो जा सकता है, बस इतना ही।
इसके अलावा, अगर 365 दिन चलने वाले server-केंद्रित Linux environment की बात करें, तो यह भी सच है कि उस सिस्टम पर 10 साल से ज़्यादा समय से stability साबित कर चुकी दूसरी भाषाओं की तुलना में पर्याप्त रूप से verify न हुए .NET से लोग हिचकते हैं।
क्या इसी अर्थ में लोग यह नहीं कहते कि cross-platform की कमी है?
लेकिन स्थिरता के सत्यापित होने का मानदंड आखिर है क्या? क्या आप सिर्फ इस्तेमाल की अवधि की बात कर रहे हैं? मुझे यह समझ नहीं आ रहा।
यह 10 साल पुराना लेख है, इसलिए .NET Core की शुरुआत हुए ज़्यादा समय नहीं हुआ था और लेख उस तरह लिखा गया था.
.NET applications पहले से ही Linux और Mac पर स्थिर रूप से अच्छी तरह चलती हैं.
Python जैसी संक्षिप्त syntax वाली और static types के साथ आने वाली कोई language है क्या, यह खोजते-खोजते मुझे संयोग से GDScript मिला, लेकिन इसका सबसे बड़ा नुकसान यह है कि इसे आम तौर पर इस्तेमाल करना मुश्किल है।
अगर मौका मिले, तो Godot के ज़रिए कोई छोटा प्रोजेक्ट करके देखें, और GDScript का थोड़ा अनुभव लेने की मैं सलाह दूँगा।
मुझे Kotlin से परिचय होने के बाद Java से नफ़रत होने लगी थी...
जब भी किसी फीचर की ज़रूरत पड़ती है, Java के लिए एक परखा हुआ सही जवाब मौजूद होने का आभास होता है।
बस Kotlin का इस्तेमाल करें।
वैसे भी, मैंने भी (एक Kotlin यूज़र होने के नाते) ईमेल से Kotlin पर उनकी राय पूछी थी, लेकिन उन्होंने जवाब दिया कि उन्होंने इसे कभी इस्तेमाल नहीं किया, इसलिए अपने अनुभव के बारे में बताना उनके लिए मुश्किल है।
मुझे static type वाली भाषाएँ पसंद हैं। वे सोचने की ज़रूरत कम कर देती हैं, जिससे उसी समय में मैं दूसरी चीज़ों के बारे में सोच सकता हूँ।
Java वाकई एक बहुत ही अनोखी स्थिति वाली भाषा है। मैंने Java को आख़िरी बार काम में लगभग 10 साल पहले इस्तेमाल किया था, लेकिन आज भी अगर मुझे कोई प्रोग्राम शौक़िया नहीं बल्कि काम के लिए बनाना हो, तो यह उन भाषाओं की सूची में होगा जिन्हें मैं सबसे पहले विचार करूँगा।
इस समय काम में मेरी मुख्य भाषाएँ Ada और C हैं, लेकिन निजी तौर पर या टीम के अंदर इस्तेमाल होने वाले टूल मैं ज़्यादातर PowerShell में लिखता हूँ। लेकिन लिखते-लिखते थोड़ा सा समय (बस 5 मिनट...) बीत जाए तो मैं सोचने लगता हूँ, "यह variable किस type का था?" इसलिए आजकल मैं type ज़रूर लिखता हूँ। (PowerShell में variable definition के समय type दिया भी जा सकता है, या उसे छोड़कर dynamic तरीके से भी इस्तेमाल किया जा सकता है)
मुझे C भी ज़्यादा पसंद नहीं है। Ada होती तो compiler type से जुड़ी जिन गलतियों को पकड़ लेता, C उन्हें बिल्कुल पकड़ नहीं पाता। मैं अक्सर सोचता हूँ कि काश C जैसी syntax वाली कोई भाषा हो, लेकिन उसमें Ada का type system भी हो।
Javascript और Python से भी मुझे ख़ास लगाव नहीं है। Perl या Shell Script तो... उनके बारे में सोचना भी नहीं चाहता।
लगता है कि C भाषा के बुनियादी दर्शन, 'प्रोग्रामर पर भरोसा करो', की वजह से इसे टाला नहीं जा सकता..
आह, और मुझे Java पसंद है, लेकिन Maven पसंद नहीं है.
पुराने अच्छे दिनों में, Ant से सब कुछ किया जा सकता था!
यह कुछ राहत की बात लगती है कि Java में record और pattern matching जैसी चीज़ें जुड़ रही हैं, इसलिए वह धीरे-धीरे सही ही सही, आधुनिक भाषाओं के साथ कदम मिला रहा है।
Java में references ज़्यादा हैं, यह अच्छी बात है, लेकिन अगर बस यही वजह है तो फिर C++ न चुनने का कारण क्या होगा, यह सोचने वाली बात है।
अच्छा होता अगर Java के फ़ायदों पर थोड़ा और बात की गई होती।
मैं मुख्य रूप से C++ इस्तेमाल करता हूँ, इसलिए मैंने सिर्फ़ C++ को उदाहरण के तौर पर लिया था। मैं भी Java को एक अच्छी भाषा मानता हूँ, लेकिन मैं जिस बात की ओर इशारा करना चाहता था, वह यह थी कि उस मूल पोस्ट में Java के फ़ायदों की बात कम थी।
अगर उसमें लिखा है, "Java बहुत पसंद है," तो मुख्य फोकस Java के फ़ायदों पर होना चाहिए, लेकिन मुझे लगा कि दूसरे भाषाओं की आलोचना ही मुख्य बात बन गई है।
जैसा आपने कहा, मुझे भी लगता है कि Java का JVM वाकई बहुत अच्छा है.
मैं पूरी तरह सहमत हूँ। यह disclaimer कि बात को बेवजह सिर्फ Java तक सीमित न किया जाए, उसी इरादे से था। लगता है कि वह बात ठीक से पहुँच नहीं पाई..
तुलना के लिए Java और C++ को रखा गया है, ये देखते ही भरोसा कुछ कम हो जाता है lol
बस Java का उपयोग करें
Java JVM पर चलती है, इसलिए local और machine environment को एक जैसा सेट करना संभव होता है। C++ में सभी developers और machine environments को एक जैसा बनाने में काफी समय लगेगा। उसे maintain करना भी मुश्किल है...
मूल लेखक शायद सिर्फ इसलिए Java का इस्तेमाल कर रहे हैं क्योंकि यह ऐसा काम है जिसमें C++ लागू करना मुश्किल है। शायद अगर Python और C++ में से चुनना होता, तो क्या वे C++ नहीं चुनते?
fix: "अंत में, दूसरी static type भाषाएँ नहीं होने के कारण" -> "अंत में, दूसरी static type भाषाओं के बजाय Java को पसंद करने के कारण"
आग तो अच्छे से भड़क रही है.. ज़ोरदार upvote
यह वह आग नहीं है जो मैं चाहता था T_T
गरमाहट... है...