কনসেপ্ট


কনসেপ্ট হলো সেসব বিষয়, যা একটি ভাষায় সাবলীল হতে হলে একজন প্রোগ্রামারকে বুঝতে হয়। কনসেপ্ট শেখানো হয় কনসেপ্ট অনুশীলনীর মাধ্যমে, এবং এগুলো কনসেপ্ট এবং প্র্যাকটিস অনুশীলনীর পূর্বশর্ত হিসেবে ব্যবহৃত হয়। কনসেপ্ট শিক্ষার্থীর কাছে প্রদর্শনের সময় একটি কনসেপ্ট ম্যাপে বসানো হয়।

মেটাডেটা

কনসেপ্টের মেটাডেটা নির্ধারিত হয় config.json ফাইলের concepts কী-তে। মেটাডেটা কনসেপ্টের UUID, স্লাগ এবং আরও অনেক কিছু নির্ধারণ করে।

উদাহরণ

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

ফাইল

প্রতিটি কনসেপ্টের নিজস্ব একটি ডিরেক্টরি থাকে ট্র্যাকের concepts ডিরেক্টরির ভেতরে। কনসেপ্টের ডিরেক্টরির নাম অবশ্যই কনসেপ্টের slug প্রোপার্টির সাথে মিলতে হবে, যেমনটি config.json ফাইলে সংজ্ঞায়িত করা আছে।

একটি কনসেপ্টে দুই ধরনের ফাইল থাকে:

ডকুমেন্টেশন ফাইল

এই ফাইলগুলো শিক্ষার্থীর কাছে উপস্থাপন করা হয়, যাতে কনসেপ্টটি বুঝতে সাহায্য হয়।

  • 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."
}

লক্ষ্য করুন:

  • লেখক ও কনট্রিবিউটরদের ক্রম গুরুত্বপূর্ণ নয় এবং এর কোনো অর্থ নেই।