تعلم البرمجة مش معناه تجمع أسماء دوال أو تحفظ طريقة كتابة حل معين المقصود إنك تفهم المشكلة وتحدد البيانات وتختار خطوات واضحة وتختبر النتيجة وفي نفس الوقت تتعلم لغة كويس علشان تقدر تنفذ الخطوات دي

مش مطلوب تتجاهل اللغة أو تتنقل بين لغات كتير الفكرة إنك تربط كل أداة بتتعلمها بالمشكلة اللي بتحلها علشان معرفتك تفضل مفيدة لما الأدوات تتغير

ابدأ بالسؤال قبل الكود

لو المطلوب البحث عن كتاب في قائمة اسأل هل المقارنة حساسة لحالة الحروف ولو الكتاب مكرر نرجع أول ظهور ولا كل النتائج ولو مش موجود نرجع إيه الأسئلة دي جزء من البرمجة قبل اختيار اسم الدالة الجاهزة

هنحدد المطلوب ببساطة عندنا قائمة نصوص وعاوزين نبحث فيها عن نص مطابق تماما ونرجع فهرس أول نتيجة أو -1 لو مش موجود والفهرس بيبدأ من صفر

استخدام الأداة الجاهزة بشكل واعي

في JavaScript ال indexOf بتقدر تنفذ المطلوب ده للنصوص في المصفوفة فهم القيمة الراجعة مهم لأن الفهرس صفر نتيجة صحيحة ومش معناه إن البحث فشل

const books = ["HTML", "CSS", "JavaScript"];

console.log(books.indexOf("HTML"));
console.log(books.indexOf("Python"));
0
-1

نفذ الفكرة بنفسك للتدريب

هنمر على العناصر بالترتيب ونقارن كل عنصر بالمطلوب لو لقيناه نرجع مكانه فورا ولو خلصنا القائمة من غير نتيجة نرجع -1

function findFirst(items, target) {
  for (let index = 0; index < items.length; index++) {
    if (items[index] === target) {
      return index;
    }
  }
  return -1;
}

console.log(findFirst(["HTML", "CSS", "HTML"], "HTML"));
console.log(findFirst(["HTML", "CSS"], "CSS"));
console.log(findFirst([], "HTML"));
0
1
-1

كتابة البحث يدوي هنا هدفها فهم التكرار والمقارنة والرجوع المبكر مش استبدال أدوات اللغة في كل مشروع بعد ما تفهم السلوك استخدم الأدوات الموثوقة المناسبة بدل إعادة اختراعها من غير سبب

نفس المطلوب بلغة مختلفة

هننفذ نفس المطلوب في Python باستخدام enumerate اللي بيدينا الفهرس والعنصر أثناء المرور على القائمة مش لازم نترجم كل سطر حرفيا المهم ننفذ نفس المطلوب ونوصل لنفس النتيجة

def find_first(items, target):
    for index, item in enumerate(items):
        if item == target:
            return index
    return -1

print(find_first(["HTML", "CSS", "HTML"], "HTML"))
print(find_first(["HTML", "CSS"], "CSS"))
print(find_first([], "HTML"))
0
1
-1

التشابه مش معناه إن اللغات متطابقة

المثال محدد بنصوص علشان المقارنة تبقى واضحة لكن أنواع البيانات وقواعد المساواة وإدارة الأخطاء بتختلف بين اللغات نقل الفكرة محتاج تعلم تفاصيل اللغة الجديدة مش مجرد تغيير الأقواس

قبل ما تنقل حل اسأل عن ترتيب العناصر والقيم الفارغة وحدود الأرقام وطريقة معالجة الفشل الاختلافات الصغيرة دي ممكن تغير صحة البرنامج

جرب كل الحالات المطلوبة مش الحالة اللي بتنجح بس

جرب عنصر في أول القائمة وعنصر في آخرها وعنصر مكرر وعنصر غير موجود وقائمة فاضية الاختبارات بتوضح هل الحل بيحقق المطلوب اللي حددته ولا نجح مع حالة واحدة بالصدفة

function findFirst(items, target) {
  for (let index = 0; index < items.length; index++) {
    if (items[index] === target) return index;
  }
  return -1;
}

const cases = [
  { items: ["HTML", "CSS"], target: "HTML", expected: 0 },
  { items: ["HTML", "CSS"], target: "CSS", expected: 1 },
  { items: ["CSS", "CSS"], target: "CSS", expected: 0 },
  { items: ["HTML"], target: "PHP", expected: -1 },
  { items: [], target: "HTML", expected: -1 }
];

for (const test of cases) {
  console.log(findFirst(test.items, test.target) === test.expected);
}
true
true
true
true
true

فكر في تكلفة الحل بعد ما تتأكد من صحته

البحث الخطي ممكن يمر على كل العناصر في أسوأ حالة فتكلفته الزمنية بتزيد مع عدد العناصر وده بنوصفه ب O(n) لو البحث بيتكرر كتير على بيانات كبيرة ممكن تحتاج طريقة تنظيم مختلفة

متختارش حل أعقد لمجرد إنه معروف إنه أسرع في حالة معينة قارن حجم البيانات وعدد مرات الاستخدام وتكلفة التجهيز وطريقة تحديث البيانات

ازاي تطبق الفكرة في تعلمك

اختار لغة واحدة وطبق بيها مشاريع صغيرة وبعد كل ميزة اكتب المطلوب والمدخلات والمخرجات والحالات الخاصة نفذ نسخة بسيطة ثم اختبرها وراجع أسماء المتغيرات والدوال

لو استخدمت AI اطلب منه شرح قرار أو اقتراح حالات اختبار وبعدها جرب بنفسك متكتفيش بكود اشتغل مرة من غير ما تعرف ليه اشتغل أو إمتى ممكن يفشل

كتدريب جديد عدل البحث بحيث يرجع عدد مرات ظهور الكتاب بدل مكان أول ظهور وحدد نتيجة القائمة الفاضية قبل ما تبدأ الحل

مصادر للتوسع