कॉन्सेप्ट


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

मेटाडेटा

कॉन्सेप्ट का मेटाडेटा config.json फाइल में मौजूद concepts की में तय होता है। यह मेटाडेटा कॉन्सेप्ट का UUID, स्लग और अन्य जानकारी तय करता है।

उदाहरण

{
  "concepts": [
    {
      "uuid": "b9a421b2-c5ff-4213-bd6d-b886da31ea0d",
      "slug": "numbers",
      "name": "Numbers"
    }
  ]
}

फाइलें

हर कॉन्सेप्ट की अपनी अलग डायरेक्टरी होती है, जो ट्रैक की concepts डायरेक्टरी के अंदर होती है। कॉन्सेप्ट की डायरेक्टरी का नाम, config.json फाइल में तय कॉन्सेप्ट की slug प्रॉपर्टी से मेल खाना चाहिए।

एक कॉन्सेप्ट में दो तरह की फाइलें होती हैं:

डॉक्युमेंटेशन फाइलें

ये फाइलें छात्र को कॉन्सेप्ट समझाने में मदद के लिए दिखाई जाती हैं।

  • about.md: उस छात्र के लिए कॉन्सेप्ट की जानकारी देती है जिसने संबंधित कॉन्सेप्ट अभ्यास पूरा कर लिया है, ताकि वह इसे सीख सके और आगे भी देख सके (आवश्यक)
  • introduction.md: उस छात्र के लिए एक संक्षिप्त परिचय देती है जिसने अभी संबंधित कॉन्सेप्ट अभ्यास पूरा नहीं किया है (आवश्यक)
  • links.json: कॉन्सेप्ट के बारे में ज़्यादा पढ़ने या जानकारी देने वाले उपयोगी लिंक देती है (आवश्यक)

मेटाडेटा फाइलें

ये फाइलें छात्र को नहीं दिखाई जाती हैं, बल्कि इनका इस्तेमाल कॉन्सेप्ट का मेटाडेटा तय करने के लिए होता है।

  • .meta/config.json: कॉन्सेप्ट की मेटा जानकारी रखती है (आवश्यक)

उदाहरण

concepts
└── numbers
    ├── .meta
    |   └── config.json
    ├── about.md
    ├── introduction.md
    └── links.json

फाइल: about.md

उद्देश्य: उस छात्र के लिए कॉन्सेप्ट की ज़्यादा विस्तृत जानकारी देना जिसने संबंधित कॉन्सेप्ट अभ्यास पूरा कर लिया है, ताकि वह उससे सीख सके और बाद में देख सके।

मौजूदगी: आवश्यक

संबंधित कॉन्सेप्ट अभ्यास पूरा करने के बाद (जिसे कॉन्सेप्ट को "सीखना" भी कहा जाता है), कॉन्सेप्ट पेज introduction.md फाइल के बजाय about.md फाइल की सामग्री दिखाता है। about.md फाइल छात्रों को इस बारे में पूरी जानकारी देनी चाहिए कि कॉन्सेप्ट में निपुण होने के लिए उन्हें क्या-क्या जानना ज़रूरी है। कम से कम, इस फाइल में वह सारी जानकारी होनी चाहिए जो कॉन्सेप्ट के introduction.md दस्तावेज़ में दी गई है।

अगर कॉन्सेप्ट नया सिंटैक्स पेश करता है, तो सिंटैक्स के नमूने भी होने चाहिए। इस फाइल में जो जानकारी देने की कोशिश की गई है, उसे पाने के लिए छात्र को ढेर सारे लिंक पर नहीं जाना पड़ना चाहिए। इसके बजाय about.md में इतनी जानकारी होनी चाहिए कि उसे उसके संदर्भ में समझा जा सके।

about.md फाइल संबंधित कॉन्सेप्ट अभ्यास के स्कोप तक सीमित नहीं है। इसकी सामग्री के लिए उन अन्य कॉन्सेप्ट की जानकारी ज़रूरी हो सकती है जो आगे पेश किए जाएँगे। अगर दूसरे कॉन्सेप्ट का ज़िक्र हो, तो उनके अपने परिचय से लिंक जोड़ा जाना चाहिए (विवरण के लिए इंटरनल लिंकिंग देखिए)।

यहाँ कुछ उदाहरण दिए गए हैं कि इसमें क्या-क्या शामिल किया जा सकता है।

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

about.md फाइल का उद्देश्य कॉन्सेप्ट की पूरी जानकारी देना नहीं है। उदाहरण के लिए, किसी ऐसी भाषा की कल्पना कीजिए जिसमें कुछ पुरानी विशेषताएँ हैं, जिनके बारे में अनुभवी प्रोग्रामर (और शायद आधिकारिक डॉक्स/स्पेक्स भी) कहते हैं कि इन्हें अब इस्तेमाल नहीं करना चाहिए। ऐसी विशेषताओं की जानकारी देना about.md फाइल के स्कोप से बाहर होगा, क्योंकि निपुणता हासिल करने के लिए वे ज़रूरी नहीं हैं। लेकिन अगर किसी छात्र को वास्तविक दुनिया में अक्सर इन पुराने मानकों से सामना करना पड़ सकता है, तो मेंटेनर चाहें तो इन्हें स्वीकार करने के लिए एक छोटा ब्लॉक जोड़ सकते हैं। हालाँकि ऐसे ब्लॉक को इस तरह चिह्नित करना चाहिए।

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

उदाहरण

# About

There are two different kinds of numbers in Elixir - integers and floats.

Floats are numbers with one or more digits behind the decimal separator. They use the 64-bit double precision floating-point format.

```elixir
float = 3.45
# => 3.45
```

Elixir also supports the scientific notation for floats.

```elixir
1.25e-2
# => 0.0125
```

## Rounding errors

Floats are infamous for their rounding errors.

```elixir
0.1 + 0.2
# => 0.30000000000000004
```

However, those kind of errors are not specific to Elixir. They happen in all programming languages. This is because all data on our computers is stored and processed as binary code. In binary, only fractions whose denominator can be expressed as `2^n` (e.g. `1/4`, `3/8`, `5/16`) can be expressed exactly. Other fractions are expressed as estimations.

```elixir
# 3/4
Float.ratio(0.75)
# => {3, 4}

# 3/5
Float.ratio(0.6)
# => {5404319552844595, 9007199254740992}
```

You can learn more about this problem at [0.30000000000000004.com][0.30000000000000004.com]. The [Float Toy page][evanw.github.io-float-toy] has a nice, graphical explanation how a floating-point number's bits are converted to an actual floating-point value.

फाइल: introduction.md

उद्देश्य: उस छात्र के लिए एक संक्षिप्त परिचय देना जिसने अभी संबंधित कॉन्सेप्ट अभ्यास पूरा नहीं किया है।

मौजूदगी: आवश्यक

यह फाइल तब दिखाई जाती है जब छात्र ने अभी संबंधित कॉन्सेप्ट अभ्यास पूरा नहीं किया हो। इसमें कॉन्सेप्ट का संक्षिप्त परिचय होना चाहिए।

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

उदाहरण

# Introduction

One of the key aspects of working with numbers in C# is the distinction between integers and floating-point numbers (numbers with zero or more digits after the decimal separator).

The two most commonly used numeric types in C# are `int` (a 32-bit integer) and `double` (a 64-bit floating-point number).

```csharp
int i = 123;
double d = 54.29;
```

उद्देश्य: कॉन्सेप्ट के बारे में ज़्यादा पढ़ने या जानकारी देने वाले उपयोगी लिंक देना।

मौजूदगी: आवश्यक

ये आधिकारिक डॉक्स, कोई बढ़िया ट्यूटोरियल वगैरह हो सकते हैं। ये लिंक कॉन्सेप्ट की about.md फाइल में दिए गए ज़्यादा संदर्भ-आधारित लिंक की जगह नहीं लेते, बल्कि छात्र के लिए जल्दी देखने लायक कुछ व्यापक संदर्भ बिंदु देते हैं।

हर लिंक में ये फील्ड होने चाहिए:

  • url: वह URL जिससे यह जुड़ता है।
  • description: लिंक का विवरण, जो लिंक टेक्स्ट के रूप में दिखाया जाता है।

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

[
  {
    "url": "https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/intro-to-csharp/numbers-in-csharp-local",
    "description": "Numbers in C#"
  },
  {
    "url": "https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/integral-numeric-types",
    "description": "Integral numeric types",
    "icon_url": "http://test.org/icon.png"
  }
]

फाइल: .meta/config.json

उद्देश्य: कॉन्सेप्ट की मेटा जानकारी रखता है।

मौजूदगी: आवश्यक

इस फाइल में कॉन्सेप्ट की मेटा जानकारी होती है:

  • authors: कॉन्सेप्ट के लेखक/लेखकों के GitHub यूज़रनेम (आवश्यक)
    • समीक्षकों को भी शामिल कीजिए, अगर उनकी समीक्षाओं से कॉन्सेप्ट में काफी बदलाव हुआ हो (इतना कि लगे कि "यह काम आपने मिलकर किया है")
  • contributors: कॉन्सेप्ट के योगदानकर्ता/योगदानकर्ताओं के GitHub यूज़रनेम (वैकल्पिक)
    • समीक्षकों को भी शामिल कीजिए, अगर उनकी समीक्षाएँ सार्थक हों, उन पर कुछ किया जा सके या उन पर काम किया गया हो।
  • blurb: इस कॉन्सेप्ट का छोटा विवरण। इसकी लंबाई <= 350 होनी चाहिए। Markdown का समर्थन नहीं है (आवश्यक)

अगर कोई व्यक्ति लेखक भी है और योगदानकर्ता भी, तो उसे सिर्फ लेखक के रूप में ही लिखिए।

उदाहरण

{
  "authors": ["FSharpForever"],
  "contributors": ["IWantToHelp"],
  "blurb": "F# has two types of numbers: integers and floating-point numbers."
}

ध्यान दीजिए:

  • लेखकों और योगदानकर्ताओं का क्रम मायने नहीं रखता और उसका कोई अर्थ नहीं है।