क्या परियोजना के पैमाने और भाषा की सख्ती के बीच संबंध है?


72

अपने एक सहयोगी को भाषाओं और प्रतिमानों की कठोरता के बीच के अंतर को समझाते हुए, मैंने कहा कि:

  • सहनशील भाषाएं, जैसे कि गतिशील और व्याख्या की गई भाषा, प्रोटोटाइप और छोटी परियोजनाओं या मध्यम आकार के वेब अनुप्रयोगों के लिए सबसे अच्छी तरह से उपयोग की जाती हैं। जब नोड्स.जेएस के साथ पायथन या जावास्क्रिप्ट जैसी सुरुचिपूर्ण गतिशील भाषाएं चुनते हैं, तो लाभ हैं:

    1. तेजी से विकास,

    2. कम बॉयलर कोड,

    3. युवा, रचनात्मक प्रोग्रामर को आकर्षित करने की क्षमता जो   जावा की तरह "कॉर्पोरेट भाषाओं" से भागते हैं ।

  • वैधानिक रूप से टाइप की गई / संकलित भाषाएं उन अनुप्रयोगों के लिए सर्वोत्तम हैं, जिनमें उच्च-कठोरता की आवश्यकता होती है जैसे कि व्यावसायिक-महत्वपूर्ण एप्लिकेशन या मध्यम से बड़े आकार के ऐप्स।

    1. दशकों के लिए विकसित प्रसिद्ध प्रतिमान और पैटर्न,

    2. स्थिर जाँच में आसानी,

    3. दशकों के अनुभव के साथ कई पेशेवर डेवलपर्स को खोजने की क्षमता।

  • Haskell, Ada या C # में कोड कॉन्ट्रैक्ट्स जैसी सख्त भाषाएं उन प्रणालियों के लिए बेहतर हैं, जो लचीलेपन पर सुरक्षा की पक्षधर हैं (भले ही Haskell बेहद लचीली हो सकती है), जैसे कि जीवन की महत्वपूर्ण प्रणालियाँ और प्रणालियाँ, जिनके बेहद स्थिर होने की उम्मीद है। लाभ हैं:

    1. संकलित समय पर अधिक से अधिक कीड़े पकड़ने की क्षमता,

    2. स्थिर जाँच में आसानी,

    3. औपचारिक प्रमाणों की आसानी।

हालांकि, बड़े निगमों द्वारा बड़े पैमाने पर परियोजनाओं के लिए इस्तेमाल की जाने वाली भाषाओं और प्रौद्योगिकियों को देखकर, ऐसा लगता है कि मेरा दावा गलत है । उदाहरण के लिए, Python का उपयोग बड़ी प्रणालियों जैसे YouTube या अन्य Google अनुप्रयोगों के लिए सफलतापूर्वक किया जाता है, जिनके लिए एक महत्वपूर्ण मात्रा में सख्ती की आवश्यकता होती है।

क्या परियोजना के पैमाने और भाषा / प्रतिमान की कठोरता के बीच अभी भी एक संबंध है जिसका उपयोग किया जाना चाहिए?

क्या कोई तीसरा कारक है जिसे मैं ध्यान में रखना भूल गया हूं?

मैं गलत कहाँ हूँ?


12
सख्त प्रकार की जाँच और स्थैतिक प्रकार की जाँच एक ही बात नहीं है। पायथन गतिशील रूप से टाइप किया गया है, लेकिन सी की तुलना में अधिक सख्त है। स्थैतिक प्रकार की जाँच का लाभ प्रति से कठोरता नहीं है, लेकिन निर्माण समय पर जाँच की जाती है, रन समय नहीं। मैंने अपने कैरियर में कई सी / सी ++ मुद्दों के साथ निपटाया है क्योंकि अंतर्निहित कास्टिंग है।
स्टीवन बर्नैप

5
जीवनचक्र के बारे में कुछ कहा जाना चाहिए: सॉफ्टवेयर जो आपकी पहली श्रेणी में शुरू होता है, वह दूसरों के लिए विकसित हो सकता है, इसके साथ भाषा को "खींच"।
Mat

11
जावास्क्रिप्ट के बारे में केवल एक चीज यह सबसे ब्राउज़रों में चलती है।
जेएफओ

1
@StevenBurnap: मैं स्थैतिक और सख्त के बीच के अंतर के बारे में अधिक सहमत नहीं हो सकता। जावा स्पेक्ट्रम पर एक और बिंदु है, स्थिर और बहुत सख्त है। डेवलपर्स अक्सर उदाहरण के रूप में जावा का उपयोग करते हुए स्थैतिक टाइपिंग करते हैं, लेकिन उस आलोचना का अधिकांश वास्तव में जावा के अत्यधिक सख्त संकलक पर निर्देशित किया जाना चाहिए , सामान्य रूप से स्थैतिक टाइपिंग नहीं। स्कैला को उसी JVM पर देखें, जो वैधानिक रूप से टाइप की गई है, लेकिन शानदार कंपाइलर की टाइप-इनफिनिटी क्षमताओं के कारण इसमें बहुत कम वर्बोस कोड है।
कॉर्नेल मैसन

2
"पायथन का सफलतापूर्वक बड़ी प्रणालियों के लिए उपयोग किया जाता है" - यहाँ "सफलता" की परिभाषा क्या है? कि यह ज्यादातर चलता है और कुछ परिणाम पैदा करता है? क्या परीक्षण और कार्यबल की राशि शामिल है? स्थिरता के बारे में क्या?
डेने

जवाबों:


39

स्केलिंग प्रोजेक्ट्स के मामलों पर एक दिलचस्प केस स्टडी जो गतिशील और व्याख्या की गई भाषा का उपयोग करते हैं, डेविड पोलाक द्वारा शुरुआती स्केला में पाया जा सकता है ।

मैंने अपने मस्तिष्क में कोड को सरल, अधिक प्रत्यक्ष तरीके से व्यक्त करने का तरीका खोजना शुरू कर दिया। मुझे रूबी और रेल्स मिले। मुझे मुक्ति महसूस हुई। रूबी ने मुझे कोड की बहुत कम लाइनों में अवधारणाओं को व्यक्त करने की अनुमति दी। स्प्रिंग MVC, हाइबरनेट और अन्य "सुव्यवस्थित" जावा वेब फ्रेमवर्क की तुलना में रेल का उपयोग करना बहुत आसान था। रूबी और रेल्स के साथ, मुझे एक छोटी सी अवधि में मेरे सिर में जो कुछ था वह बहुत अधिक व्यक्त किया गया। यह उस मुक्ति के समान था जिसे मैंने C ++ से जावा में स्थानांतरित होने पर महसूस किया था ...

जैसे-जैसे मेरी रूबी और रेल परियोजनाएं कोड की कुछ हज़ार लाइनों से आगे बढ़ती गईं और जैसे-जैसे मैंने अपनी परियोजनाओं में टीम के सदस्यों को जोड़ा , गतिशील भाषाओं की चुनौतियाँ स्पष्ट होती गईं।

हम अपने आधे से अधिक कोडिंग समय लिखने के परीक्षण में खर्च कर रहे थे, और हमने जो उत्पादकता लाभ देखे, उनमें से अधिकांश परीक्षण लेखन में खो गए थे । अधिकांश परीक्षण जावा में अनावश्यक थे क्योंकि उनमें से अधिकांश यह सुनिश्चित करने की दिशा में सक्षम थे कि जब हमने विधि के नाम या पैरामीटर की गणना को बदलकर कोड को रिफलेक्ट किया तो हम कॉलर्स को अपडेट कर देंगे। इसके अलावा, मैंने पाया कि उन टीमों पर काम करना जहां दो से चार टीम के सदस्यों के बीच मन में मधुरता थी, रूबी में चीजें अच्छी हो गईं, लेकिन जैसा कि हमने टीम में नए सदस्यों को लाने की कोशिश की, मानसिक कनेक्शन नए टीम के सदस्यों को प्रेषित करना कठिन था

मैं एक नई भाषा और विकास के माहौल की तलाश में था। मैं एक ऐसी भाषा की तलाश कर रहा था जो रूबी के रूप में अभिव्यंजक थी लेकिन जावा के रूप में सुरक्षित और उच्च प्रदर्शन ...

जैसा कि आप देख सकते हैं, लेखक के लिए प्रोजेक्ट स्केलिंग में प्रमुख चुनौतियां परीक्षण विकास और ज्ञान हस्तांतरण में बदल गईं।

विशेष रूप से, लेखक अध्याय 7 में गतिशील और वैधानिक रूप से टाइप की गई भाषाओं के बीच परीक्षण लेखन के अंतर को समझाने में और अधिक विवरण में जाता है। अनुभाग में "मार्मिक रूप से किलिंग बनिज़: डवेमी के सीढ़ियाँ" लेखक एक विशेष रूबी उदाहरण के स्काला पोर्ट पर चर्चा करता है:

लकी स्टिफ क्यों ... ड्वेमी के एरे में रूबी के कुछ मेट्रोपोग्रामिंग अवधारणाओं का परिचय देता है जिसमें एक खरगोश जीवों की एक लड़ाई लड़ता है। N8han14 ने स्काला में काम करने के लिए उदाहरण को अद्यतन किया ...

रूबी कोड की तुलना में, स्काला कोड के पुस्तकालय भागों अधिक जटिल थे। हमें यह सुनिश्चित करने के लिए बहुत काम करना था कि हमारे प्रकार सही थे। हमें DupMonster और CreatureCons कक्षाओं में प्राणी के गुणों को मैन्युअल रूप से फिर से लिखना पड़ा। इससे ज्यादा काम है method_missing। हमें अपने जीवों और हथियारों में अपरिवर्तनीयता का समर्थन करने के लिए उचित मात्रा में काम करना था।

दूसरी ओर, परिणाम रूबी संस्करण की तुलना में बहुत अधिक शक्तिशाली था। अगर हमें अपने रूबी कोड के लिए परीक्षण लिखना था, तो यह जांचने के लिए कि स्कैला कंपाइलर हमें क्या आश्वासन देता है, हमें कोड की बहुत अधिक लाइनों की आवश्यकता होगी। उदाहरण के लिए, हम यह सुनिश्चित कर सकते हैं कि हमारा खरगोश एक कुल्हाड़ी नहीं मार सकता। रूबी में यह आश्वासन पाने के लिए, हमें एक परीक्षण लिखना होगा जो यह सुनिश्चित करता है कि |^एक खरगोश पर आक्रमण विफल हो जाता है। हमारा स्काला संस्करण यह सुनिश्चित करता है कि किसी दिए गए प्राणी के लिए परिभाषित केवल हथियार का उपयोग उस प्राणी द्वारा किया जा सकता है, कुछ ऐसा जो रूबी में बहुत सारे रनटाइम प्रतिबिंब की आवश्यकता होगी ...


उपरोक्त पढ़ना यह सोच सकता है कि जैसे-जैसे परियोजनाएँ और भी बड़ी होंगी, परीक्षण लेखन निषेधात्मक रूप से बोझिल हो सकता है। यह तर्क गलत होगा, जैसा कि इस बहुत ही प्रश्न में वर्णित सफल बहुत बड़ी परियोजनाओं के उदाहरणों से स्पष्ट है ("पायथन सफलतापूर्वक ... YouTube" के लिए उपयोग किया जाता है)।

बात यह है, परियोजनाओं का स्केलिंग वास्तव में सीधा नहीं है। बहुत बड़ी, लंबे समय तक रहने वाली परियोजनाएं अलग-अलग परीक्षण विकास प्रक्रिया को "बर्दाश्त" कर सकती हैं, जिसमें उत्पादन गुणवत्ता परीक्षण सूट, पेशेवर परीक्षण देव टीम और अन्य हेवीवेट सामान शामिल हैं।

Youtube परीक्षण सुइट्स या जावा कम्पैटिबिलिटी किट यकीन है कि द्विमूर्ति के ऐरे जैसे एक छोटे ट्यूटोरियल प्रोजेक्ट में परीक्षणों की तुलना में एक अलग जीवन जीते हैं



24

आपका दावा गलत नहीं है। आपको बस थोड़ी गहरी खुदाई करने की आवश्यकता है।

सीधे शब्दों में कहा जाए, तो बड़ी प्रणालियाँ केवल एक भाषा नहीं, कई भाषाओं का उपयोग करती हैं। ऐसे हिस्से हो सकते हैं जो "सख्त" भाषाओं का उपयोग करके बनाए गए हों, और ऐसे हिस्से भी हो सकते हैं जो गतिशील भाषाओं का उपयोग करके बनाए गए हों।

आपके Google और YouTube उदाहरण के लिए, मैंने सुना है कि वे विभिन्न प्रणालियों के बीच मुख्य रूप से "गोंद" के रूप में पायथन का उपयोग करते हैं। केवल Google ही जानता है कि उन प्रणालियों का निर्माण किसके साथ किया गया है, लेकिन मैं शर्त लगाता हूं कि Google की कई महत्वपूर्ण प्रणालियां C ++ या Java जैसी सख्त और "कॉर्पोरेट" भाषाओं का उपयोग करके बनाई गई हैं, या शायद कुछ ऐसा जो उन्होंने स्वयं बनाया हो।

ऐसा नहीं है कि आप बड़े पैमाने पर सिस्टम के लिए सहिष्णु भाषाओं का उपयोग नहीं कर सकते हैं। कई लोग कहते हैं कि फेसबुक PHP का उपयोग करता है, लेकिन वे यह उल्लेख करना भूल जाते हैं कि फेसबुक को इस पैमाने पर कुशलतापूर्वक उपयोग करने के लिए बेहद सख्त प्रोग्रामिंग दिशानिर्देश बनाने थे।

हां, बड़े स्तर की परियोजनाओं के लिए कुछ स्तर की सख्ती की आवश्यकता है। यह या तो भाषा या रूपरेखा की कठोरता से, या प्रोग्रामिंग दिशानिर्देशों और कोड सम्मेलनों से आ सकता है। आप सिर्फ कुछ कॉलेज स्नातकों को नहीं पकड़ सकते, उन्हें पायथन / रूबी / जावास्क्रिप्ट दें और उनसे ऐसे सॉफ्टवेयर लिखने की अपेक्षा करें जो लाखों उपयोगकर्ताओं के लिए हैं।


"आप केवल कुछ कॉलेज स्नातकों को नहीं पकड़ सकते" ... "और उनसे उन सॉफ्टवेयरों को लिखने की अपेक्षा करें जो लाखों उपयोगकर्ताओं के लिए हैं।" शायद पर्याप्त होता।
dyesdyes

यहां ध्यान देने योग्य बात यह है कि Google और पायथन के साथ, फेसबुक का PHP का उपयोग बड़े पैमाने पर गोंद के रूप में किया जाता है ... मेरी समझ यह है कि अधिकांश कार्यों के लिए, PHP का उपयोग केवल अधिक जटिल सर्वर सिस्टम पर अपेक्षाकृत सरल क्लाइंट के रूप में किया जाता है जिसे आमतौर पर लागू किया जाता है अधिक पारंपरिक "हैवीवेट" भाषा में, जैसे कि जावा, सी ++, हास्केल, ओसीएमएल, आदि
जूल्स

"केवल Google जानता है कि उन प्रणालियों को किसके साथ बनाया गया है" .. मुझे उस बारे में कुछ संदेह भी है :) मेरे अनुभव में, कोई भी इकाई (व्यक्ति या अन्यथा) बहुत बड़े सिस्टम के सभी हिस्सों को सूचीबद्ध नहीं कर सकती है। कई मामलों में, कुछ सर्वर के कटोरे में दफन पर्ल, फोरट्रान या केएसएच स्क्रिप्ट का एक लंबा भूला हुआ टुकड़ा है जो 'जादू' करता है।
मटनज़

3

चेक करने के लिए दो तरह की त्रुटियां हैं: टाइप त्रुटियां (एक पूर्णांक + फ़्लोट्स की सूची) और व्यापार तर्क त्रुटियों (बैंक खाते में धन स्थानांतरित करें, जांचें कि क्या स्रोत खाते में पैसा है)।

एक गतिशील प्रोग्रामिंग भाषा का "डायनामिक" हिस्सा सिर्फ वह जगह है जहां टाइप चेकिंग होती है। "डायनामिक रूप से टाइप की गई" प्रोग्रामिंग भाषा में, टाइपिंग चेकिंग प्रत्येक स्टेटमेंट को निष्पादित करते समय की जाती है, जबकि "स्टेटिकली टाइप्ड लैंग्वेज" टाइप चेकिंग संकलन समय पर की जाती है। और आप एक स्थिर प्रोग्रामिंग भाषा के लिए दुभाषिया लिख ​​सकते हैं (जैसे emscriptem does), और आप एक गतिशील प्रोग्रामिंग भाषा (जैसे gcc-python या शेड-स्किन करता है) के लिए एक स्थैतिक संकलक भी लिख सकते हैं ।

पायथन और जावास्क्रिप्ट जैसी एक गतिशील प्रोग्रामिंग भाषा में, आपको न केवल कार्यक्रम व्यापार तर्क के लिए इकाई परीक्षण लिखने की आवश्यकता है, बल्कि यह भी जांचने के लिए कि क्या आपके प्रोग्राम में कोई वाक्यविन्यास या प्रकार की त्रुटियां नहीं हैं। उदाहरण के लिए, यदि आप फ़्लोट्स की सूची में "+" को एक पूर्णांक जोड़ते हैं (जो समझ में नहीं आता है और एक त्रुटि जारी करेगा), एक गतिशील भाषा में कथन को निष्पादित करने का प्रयास करते समय त्रुटि को रनटाइम पर उठाया जाएगा। C ++, Haskell और Java जैसी स्टैटिक प्रोग्रामिंग लैंग्वेज में, कंपाइलर द्वारा इस प्रकार की त्रुटि पकड़ी जाएगी।

एक गतिशील रूप से जांच की गई प्रोग्रामिंग भाषा में एक छोटा कोडबेस टाइप त्रुटियों के लिए देखना आसान है क्योंकि स्रोत कोड का 100% कवरेज करना आसान है । यही है, आप विभिन्न मानों के साथ कोड को कुछ समय के लिए निष्पादित करते हैं और आपका काम हो जाता है। स्रोत कोड का 100% कवरेज होने से आपको एक उचित संकेत मिलता है कि आपके प्रोग्राम में टाइप त्रुटियां नहीं हो सकती हैं

गतिशील रूप से जाँच की गई प्रोग्रामिंग भाषा में एक बड़े कोडबेस के साथ, हर संभव प्रकार के संयोजन के साथ प्रत्येक कथन का परीक्षण करना कठिन है, खासकर यदि आप लापरवाह हैं और एक फ़ंक्शन लिखें जो इसके तर्कों के आधार पर एक स्ट्रिंग, सूची या कस्टम ऑब्जेक्ट वापस कर सकता है।

संवैधानिक रूप से जाँच की गई प्रोग्रामिंग भाषा में कंपाइलर समय पर अधिकांश प्रकार की त्रुटियों को पकड़ लेगा। मैं सबसे अधिक कहता हूं क्योंकि शून्य त्रुटि या विभाजन सीमा त्रुटि से एक विभाजन भी प्रकार की त्रुटियां हैं।

अधिक बार वास्तविक चर्चा प्रोग्रामिंग भाषाओं के बारे में नहीं है, बल्कि उन भाषाओं का उपयोग करने वाले लोगों के बारे में है। और यह सच है क्योंकि, उदाहरण के लिए, विधानसभा भाषा किसी अन्य प्रोग्रामिंग भाषा की तरह शक्तिशाली है, फिर भी हम जावास्क्रिप्ट पर कोड लिख रहे हैं। क्यों? क्योंकि हम इंसान हैं। सबसे पहले, हम सभी गलती करते हैं और एक विशिष्ट कार्य के लिए विशेष समर्पित उपकरण का उपयोग करने के लिए आसान और कम त्रुटि का खतरा होता है। दूसरा, संसाधन की कमी है। हमारा समय सीमित है, और असेंबली पर वेबपेज लिखने के लिए उम्र खत्म हो जाएगी।


3

बड़े सिस्टम के साथ मेरा अनुभव यह है कि वे भाषा की पसंद से नहीं बल्कि डिजाइन / आर्किटेक्चर या टेस्ट कवरेज के मुद्दों पर खड़े होते हैं या गिरते हैं । बल्कि मैं अपने बड़े उद्यम प्रोजेक्ट पर एक प्रतिभाशाली पायथन टीम, एक औसत जावा एक की तुलना में अधिक है।

यह कहने के बाद कि कोई भी भाषा जो आप बहुत कम कोड लिखते हैं , को देखने लायक होना चाहिए (उदाहरण पायथन बनाम जावा)। शायद भविष्य उन्नत, टाइप-इनविज़न (उदाहरण के लिए स्काला मोल्ड) के साथ चालाक, सांख्यिकीय रूप से टाइप की गई भाषाओं में है। या हाइब्रिड, जैसे कि C # अपने dynamicक्वालीफायर के साथ प्रयास कर रहा है ...?

और आइए "अन्य" स्थिर टाइपिंग लाभ को न भूलें: उचित आईडीई कोड-पूरा / इंटैलिजेंस, जो कि मेरे विचार में एक अनिवार्य विशेषता है, एक अच्छा-से-नहीं है।


1
"कोड-समापन / इंटेलीसेन्स" - स्वचालित रीफैक्टरिंग भी काफी महत्वपूर्ण है।
डेन

@ पूरी तरह से। क्या ऐसा हो सकता है कि डायनेमिक भाषाएं शुरुआती संस्करणों को लिखने में बहुत तेज़ी से (आसान, कम कोड लिखने में) मदद करें, लेकिन बाद में आपस में टकरा जाएं, क्योंकि परिवर्तन के प्रभाव का आकलन करना मुश्किल हो जाता है या फिर रिफैक्टरिंग (स्वचालित रीफ़ैक्टरिंग उपकरण के बिना) करना मुश्किल हो जाता है?
कॉर्नेल मैसन

0

एक अन्य विचार यह है कि बड़े पैमाने पर आवेदन लिखने के पीछे कौन है । मैंने कई स्थानों पर काम किया है जो कुछ बड़े उद्यम-शैली की परियोजनाओं पर रूबी या पायथन का उपयोग करना चाहते हैं, लेकिन आईटी प्रबंधकों और कॉर्पोरेट सुरक्षा टीमों द्वारा परियोजनाओं के खुले स्रोत की प्रकृति के कारण लगातार "शॉट डाउन" किया जाता है।

मुझे बताया गया है, "हम रूबी ऑन रेल्स का उपयोग नहीं कर सकते क्योंकि यह खुला स्रोत है और कोई व्यक्ति वहां हैक कर सकता है जो महत्वपूर्ण या संरक्षित जानकारी चुराता है।" मुझे क्षमा करें, लेकिन एक बार किसी की मानसिकता है कि खुला स्रोत == बुराई, इसे बदलना लगभग असंभव है। सोच की वह रेखा एक कॉर्पोरेट बीमारी है।

सी # और जावा रहे हैं पर भरोसा के साथ भाषाओं भरोसा प्लेटफार्मों। रूबी और पायथन विश्वसनीय भाषा नहीं हैं।


2
मैं अंतिम पंक्ति से असहमत हूं। जावा यह सबसे कम विश्वास बिंदुओं में से एक है। सी # को पूरे खुले स्रोत समुदाय द्वारा युद्ध के रूप में माना जाता है। रूबी को ठोस लेकिन धीमा (भले ही अब यह नहीं है) के रूप में देखा जाता है और पायथन पूरे उद्योगों (मशीन-लर्निंग और डेटा विज्ञान किसी को भी?) का विश्वसनीय काम-घोड़ा ग्लैमर बच्चा है।
कोडबर्ड

1
गतिशील भाषाएं सुरक्षा के लिए खराब हैं, लेकिन "खुला स्रोत" अच्छा कारण नहीं है। शायद उनका मतलब था "कोड के एक हिस्से को कोड के पूरी तरह से अलग हिस्से से प्रभावित करना आसान है"। प्रोग्रामर
।stackexchange.com

1
ध्यान दें कि वास्तव में, "खुली खटास" एक भाषा की पसंद के पहलुओं में से एक है। उदाहरण के लिए जेफ एटवुड द्वारा दिए गए तीन कारणों में से एक यह व्याख्या करना है कि प्रवचन रूबी का उपयोग क्यों करता है।
आर्सेनी मूरज़ेंको

C # अब पूरी तरह से ओपन-सोर्स है, फिर भी यह पेशेवर देवों द्वारा अभी भी क्यूरेट, योजनाबद्ध और विकसित किया गया है जो मुझे अच्छा लगता है। चलो आशा करते हैं कि "पायथन 3 बनाम 2" इस तरह की चीज यहां नहीं होगी।
डेन

बग्स और सुरक्षा छेद प्रोग्रामर द्वारा प्रस्तुत किए जाते हैं और भाषाओं द्वारा नहीं, और रिकॉर्ड के लिए मैंने स्रोत परियोजनाओं को खोलने के लिए कई सुरक्षा फ़िक्सेस का योगदान दिया है। कितने बंद प्रोजेक्ट मैंने मदद की है ??? शून्य!
रिएक्टगुलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.