تعلم البرمجة مش معناه تجمع أسماء دوال أو تحفظ طريقة كتابة حل معين المقصود إنك تفهم المشكلة وتحدد البيانات وتختار خطوات واضحة وتختبر النتيجة وفي نفس الوقت تتعلم لغة كويس علشان تقدر تنفذ الخطوات دي
مش مطلوب تتجاهل اللغة أو تتنقل بين لغات كتير الفكرة إنك تربط كل أداة بتتعلمها بالمشكلة اللي بتحلها علشان معرفتك تفضل مفيدة لما الأدوات تتغير
ابدأ بالسؤال قبل الكود
لو المطلوب البحث عن كتاب في قائمة اسأل هل المقارنة حساسة لحالة الحروف ولو الكتاب مكرر نرجع أول ظهور ولا كل النتائج ولو مش موجود نرجع إيه الأسئلة دي جزء من البرمجة قبل اختيار اسم الدالة الجاهزة
هنحدد المطلوب ببساطة عندنا قائمة نصوص وعاوزين نبحث فيها عن نص مطابق تماما ونرجع فهرس أول نتيجة أو -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 اطلب منه شرح قرار أو اقتراح حالات اختبار وبعدها جرب بنفسك متكتفيش بكود اشتغل مرة من غير ما تعرف ليه اشتغل أو إمتى ممكن يفشل
كتدريب جديد عدل البحث بحيث يرجع عدد مرات ظهور الكتاب بدل مكان أول ظهور وحدد نتيجة القائمة الفاضية قبل ما تبدأ الحل