क्या कोड स्वामित्व एक कोड गंध है?


27

यह कुछ ऐसा है जिसके बारे में मैं तब से सोच रहा हूँ जब से मैंने इस जवाब को विवादास्पद प्रोग्रामिंग राय में पढ़ा है :

आपका काम खुद को काम से बाहर रखना है।

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

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

दिलचस्प बात यह है कि मैंने पाया है कि उस लक्ष्य ने मुझे मेरे नियोक्ताओं के लिए अधिक मूल्यवान बना दिया है। जितना अधिक मैं डिस्पोजेबल होने का प्रयास करता हूं, उतना ही मूल्यवान मैं उनके लिए बन जाता हूं।

और यह इस तरह के एक के रूप में अन्य सवालों में थोड़ा चर्चा की गई है , लेकिन मैं इसे फिर से ऊपर लाने के लिए चर्चा करना चाहता था एक अधिक बिंदु रिक्त " यह एक कोड गंध है !! " बिंदु से - जो वास्तव में कवर नहीं किया गया है! गहराई में अभी तक।

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

बेशक, इसके साथ स्पष्ट समस्या यह है: क्या होगा यदि व्यक्ति क्विट करता है या "बस से टकरा जाता है"? या टीम स्तर पर: क्या होगा यदि पूरी टीम को उनकी टीम के लंच पर बाहर जाने पर फूड पॉइज़निंग हो जाती है, और वे सभी मर जाते हैं? क्या आप नए यादृच्छिक डेवलपर्स के एक नए सेट के साथ टीम को अपेक्षाकृत दर्द रहित तरीके से बदल पाएंगे? - मेरी पिछली कई नौकरियों में, मैं ऐसा बिल्कुल भी नहीं सोच सकता। सिस्टम इतनी चालाकी और हैक्स से भरे हुए थे कि आपको " बस जानना होगा ", कि आपके द्वारा किराए पर ली गई कोई भी नई टीम लाभदायक व्यवसाय चक्र (जैसे, नए स्थिर रिलीज) की तुलना में अधिक समय लेगी ताकि चीजों को फिर से प्राप्त किया जा सके। संक्षेप में, मुझे आश्चर्य नहीं होगा कि यदि उत्पाद को छोड़ना होगा।

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

लेकिन बात यह है - कोड स्वामित्व को अक्सर किसी परियोजना और कंपनी के लिए "निष्ठा" के रूप में प्रस्तुत किया जाता है, क्योंकि आपके काम के लिए "जिम्मेदारी लेने" का एक सकारात्मक रूप है - इसलिए यह एकमुश्त रूप से इसकी निंदा करता है। लेकिन एक ही समय में, समीकरण के तकनीकी ऋण पक्ष का अर्थ है कि कोड आधार उत्तरोत्तर कम खुला हो रहा है, और इसके साथ काम करना अधिक कठिन है। और विशेष रूप से जैसे ही लोग आगे बढ़ते हैं और नए डेवलपर्स को उनकी जगह लेनी पड़ती है, तकनीकी ऋण (यानी रखरखाव) की लागत बढ़ने लगती है।

तो एक अर्थ में, मुझे वास्तव में लगता है कि यह हमारे पेशे के लिए एक अच्छी बात होगी यदि कोड के स्वामित्व की आवश्यकता के उच्च स्तर को खुले तौर पर नौकरी की गंध (लोकप्रिय प्रोग्रामर कल्पना में) के रूप में देखा गया। इसके बजाय इसे काम में "जिम्मेदारी और गर्व" के रूप में देखा जा रहा है, इसे "अपने आप को लुभाने और तकनीकी ऋण के माध्यम से कृत्रिम नौकरी की सुरक्षा" के रूप में अधिक देखा जाना चाहिए।

और मुझे लगता है कि परीक्षण (सोचा प्रयोग) मूल रूप से होना चाहिए: क्या होगा यदि व्यक्ति (या वास्तव में, पूरी टीम) कल पृथ्वी के चेहरे को गायब कर दे। क्या यह एक बड़ी घटना होगी - संभवतः परियोजना के लिए घातक - या हम नए लोगों को लाने में सक्षम होंगे, उन्हें डोकोस को पढ़ने और फाइलों की मदद करने और कुछ दिनों के लिए कोड के साथ खेलने में मदद मिलेगी - और फिर वापस आ जाएं कुछ हफ्तों में व्यापार (और एक या एक महीने में पूर्ण उत्पादकता पर वापस)?


3
क्या पूछते हैं? इसके अलावा, "कोड गंध" क्या है?
CamelBlues

2
@CamelBlues: " कोड गंध किसी प्रोग्राम के स्रोत कोड में कोई लक्षण है जो संभवतः एक गहरी समस्या को इंगित करता है।" (विकिपीडिया) कोड की बदबू के बारे में इस साइट के कुछ सवालों के लिए इस खोज को देखें ।
कार्सन 63000

4
कोड स्वामित्व नहीं है एक परिणाम बदबू आ रही है कोड की, न कि कोड स्वामित्व एक है कोड गंध? मुझे लगता है कि यह अभी भी अन्य लोगों के साथ एक ही सवाल है, इसमें यह भी शामिल है: programmers.stackexchange.com/questions/48697/…
Rei Miyasaka

1
मेरे लिए "जिम्मेदारी लेना / स्वामित्व"! = "कोड स्वामित्व", मेरे पास हाल ही में एक प्रबंधक के साथ एक तर्क था कि कोड स्वामित्व कुछ बुरा था और यह लोगों को जिम्मेदारी देने की अनुमति देने के समान नहीं था। इस प्रबंधक कोड स्वामित्व के लिए जिम्मेदार होने के रूप में एक ही बात थी।
थॉमस जेम्स

1
हाँ, मैंने कभी भी कोड स्वामित्व का मतलब यह नहीं निकाला कि यह क्यू इसे किस रूप में परिभाषित करता है। मेरे लिए स्वामित्व लेने का मतलब है कि भयानक बस की बात के बाद मुझे मेरी जगह लेने वाला लड़का मेरा कोड पढ़ सकता है क्योंकि मैंने इस पर गर्व किया जैसे कि यह मेरा निजी बच्चा था।
एरिक रेपेन

जवाबों:


32

मुझे लगता है कि हमें कोड स्वामित्व के बीच अंतर करना चाहिए:

  • जिम्मेदारी की दृष्टि से,
  • कोड शैली / हैक आदि से।

पहले एक को प्रोत्साहित किया जाना चाहिए। यदि कम गुणवत्ता कोड और बग के लिए कोई भी जिम्मेदार नहीं है, तो खराब चीजें होंगी । इसका मतलब यह नहीं है कि आपके अपने कोड से संबंधित बग आपको हर बार सौंपा जाना चाहिए: यदि कोड सही लिखा गया है, तो कोई भी कोड के किसी भी हिस्से में बग को ठीक कर सकता है। लेकिन अगर आपके पास बगों के बारे में कोई प्रतिक्रिया नहीं है, तो आप बार-बार उसी कीड़े का उत्पादन करेंगे

कोड स्वामित्व प्रबंधकों और डेवलपर्स दोनों की बहुत मदद कर सकता है, विशेष रूप से डेवलपर्स। अगर मुझे पता है कि उत्पाद में 80% कीड़े मेरे कोड में थे, जबकि हम तीन डेवलपर्स प्रोजेक्ट पर काम कर रहे थे, और यह कि 75% बग्स SQL ​​इंजेक्शन से संबंधित थे, तो मैं अगली बार कोड लिखने में अधिक सावधान रहूंगा, और डेटाबेस प्रश्नों को सही ढंग से लिखने के लिए एक अतिरिक्त प्रयास करें।


दूसरा एक (कोड शैली / हैक से कोड स्वामित्व) ज्यादातर एक बुरी बात है। यह उत्पाद में क्या लाता है? यह उत्पाद की गुणवत्ता में वृद्धि नहीं करता है, लेकिन स्रोत कोड की एकरूपता को कम करता है और इसे हाल ही में बनाए रखना मुश्किल बनाता है

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

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

क्या यह एक कोड गंध है? खैर, यह इस बात पर निर्भर करता है कि आपको कोड गंध से क्या मतलब है। मेरे लिए, यह परियोजना के समग्र सामंजस्य और सही प्रबंधन के बारे में है । एक अच्छी परियोजना में,

  • कोड स्टाइल दिशानिर्देशों को कोड को बाद में समझने में मदद करने के लिए लागू किया गया है,
  • अधिक अनुभवी डेवलपर्स KISS सिद्धांत का उल्लंघन नहीं करते, इस प्रकार बाद में कम अनुभवी सहयोगियों द्वारा स्रोत कोड की समझ में मदद मिली।

निष्कर्ष निकालने के लिए, कोड स्वामित्व को संस्करण नियंत्रण के माध्यम से ट्रैक किया जाना चाहिए, लेकिन आपको यह कहने में सक्षम नहीं होना चाहिए कि कोड का एक टुकड़ा आपके द्वारा या किसी अन्य टीम में लिखा गया है


9

पहले हमें यह परिभाषित करने की आवश्यकता है कि "कोड-स्वामित्व" क्या है।


जब कोड का एक टुकड़ा (हिस्सा) विकसित होने की प्रारंभिक प्रक्रिया में होता है, तो अक्सर एक या दो व्यक्तियों को "मालिकों" के रूप में नामित करना आवश्यक होता है:

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

आम तौर पर प्रत्येक कार्य के लिए एक ही मालिक होता है। जोड़ी-प्रोग्रामिंग के साथ दोहरे मालिक संभव हैं। इसे किसी भी संकीर्ण रूप से नामित "कोड-स्वामित्व" के बिना करना व्यावहारिक नहीं होगा।

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


एक बार जब एक टुकड़ा लिखा जाता है और कोड आधार ("किया") में स्वीकार किया जाता है, तो अधिक सामान्य "कोड-स्वामित्व" प्रश्न प्रकट होता है।

  • कौन विशेषज्ञ है जो कोड के इस टुकड़े / कार्यक्षमता के इस हिस्से के बारे में सभी सवालों के जवाब दे सकता है?
  • क्या यह ज्ञान मूर्त कलाकृतियों, जैसे आवश्यकता दस्तावेज़, इकाई परीक्षण, स्वीकृति परीक्षण, परिवर्तन लॉग, प्रोजेक्ट विकी आदि में कैप्चर किया गया है?

हमेशा डोमेन ज्ञान (ग्राहकों की आवश्यकताओं की स्पष्ट समझ, आर्कन सिस्टम के साथ अनुकूलता की समस्या आदि) का कुछ हिस्सा होगा जो लिखित विनिर्देशों में औपचारिक रूप से कठिन हैं। इसलिए, जब कोई आपदा घटना होती है, तो डोमेन ज्ञान के कुछ नुकसान की उम्मीद की जाती है।

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

इसका मतलब यह नहीं है कि "विशेषज्ञों" का अस्तित्व खराब है: विशेषज्ञों को लिखित ज्ञान का "कैश" होने पर विचार करें। विशेषज्ञ अक्सर लिखित ज्ञान को देखने और पचाने की तुलना में तेजी से सवालों के जवाब दे सकते हैं।


हालांकि, कभी-कभी "कोड-स्वामित्व" एक परियोजना के सक्रिय डेवलपर्स द्वारा कोड को संशोधित करने से रोकने के लिए बाधाओं को संदर्भित करता है।

  • कोड के इस टुकड़े में कौन परिवर्तन कर सकता है?
    • स्पष्ट कीड़े को ठीक करने के लिए?
    • कोड को कुछ अन्य आवश्यकताओं को पूरा करने के लिए?
    • पूरी तरह से किसी के स्वाद के लिए कोड को फिर से लिखना?

अच्छे अवरोध और बुरे अवरोध हैं:

  • अच्छा अवरोध
    • डोमेन ज्ञान - आवश्यकताओं और वास्तुकला / कोडिंग शैली को आप कितनी अच्छी तरह समझते हैं
    • प्रोग्रामिंग और डिजाइन कौशल - क्या आपके पास परियोजना के डिजाइन और कोड की गुणवत्ता में सुधार करने का कौशल है
  • बुरी बाधाएँ
    • आप मूल डेवलपर टीम पर नहीं थे, इसलिए आपको परिवर्तन करने की अनुमति नहीं है।
    • केवल बगफिक्स का स्वागत है। फीचर एन्हांसमेंट का स्वागत नहीं है।

इस मामले में, अन्य परियोजना के स्रोत कोड को संपादित करने का विशेषाधिकार कोड-स्वामित्व पर आधारित नहीं होना चाहिए, लेकिन यह योग्यता आधारित होना चाहिए।


अंत में, @ ग्राहम ली का उत्तर ज्ञान और वास्तुकला के विखंडन की ओर इशारा करता है जो विभागीयकरण के कारण होता है।

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


7

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

क्या ये एक दिक्कत है? यह है अगर वास्तुकला है-या हो जाता है। यह कहना असंभव है (उदाहरण के लिए) कि इंस्टॉलर बेहतर काम करेगा या सस्ता होगा अगर यह ग्राहक का उपयोग मामला है, क्योंकि यह एक टीम और उसके प्रबंधक से दूर ले जा रहा है। कार्यात्मक मॉड्यूल के बीच विभाजन इंजीनियरिंग विभाग चलाने के तरीके के बारे में तथ्य बन गए हैं, और उन तथ्यों को बदलने के लिए बहुत अधिक उथल-पुथल होती है।

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


6

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

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

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

मुझे लगता है कि बदबू के रूप में अन्य व्यावसायिक समस्याओं का वर्णन करना ठीक है , लेकिन निश्चित रूप से इसका मतलब यह नहीं है कि सिर्फ इसलिए कि एक गंध है , कि यह विशेष रूप से कोड के साथ करना है।


1

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

मैंने कई महीनों पहले इस पर एक ब्लॉग पोस्ट लिखा था, जहां मैंने तर्क दिया कि कोड स्वामित्व के बिना, जैसा कि मैं इसे परिभाषित करता हूं, एक कोडबेस अक्सर कॉमेड्स की त्रासदी का शिकार होता है ।

कोड स्वामित्व की आपकी परिभाषा से, मैं सहमत हूं कि कोड के लिए बुरा है कि केवल लेखक ही काम कर सकता है।


अधिक लगता है जैसे "कोड-ट्रेंडिंग", या "कोड-सिटिंग (एक ला-बेबी-बैठे)"। मैं आपके उत्तर की हर बात से सहमत हूं।
मावग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.