Day 2 / 30 — فخ الافتراض الأول
كيف يضيع المبرمج ساعات وهو يطارد المشكلة في المكان الخطأ؟ تعرف على فخ الافتراض الأول وطريقة تجنبه.
Day 2 — The First Assumption Trap
مرة ضيعت ساعتين على Error.
كنت متأكد أن المشكلة من الـ API.
راجعت الـ API.
عملتله Test.
وعدلت عليه.
وكل ما أجرب أكثر...
كنت أقتنع أكثر إني قريب من الحل.
بعد ساعتين...
اكتشفت أن الـ API كان شغال من البداية.
المشكلة؟
User ID غلط.
حرف واحد بس.
ساعتين ما ضاعوا بسبب الكود.
ضاعوا بلحظة وحدة.
لحظة قررت فيها إني فاهم المشكلة.
وهون اكتشفت شيء مهم:
أول تفسير يخطر ببالك للمشكلة...
غالبًا يصير أخطر شيء في عملية الحل كلها.
Challenge #1
خلينا نجرب شيء سريع.
عندك نظام Login.
والمستخدم متأكد 100٪ أنه كتب الإيميل والباسورد الصحيحين.
ومع ذلك يحصل على:
Wrong password
هذا جزء من الكود:
async function login(email, password) {
const user = await User.findOne({ email });
if (!user) {
return "User not found";
}
if (user.password === password) {
return "Login successful";
}
return "Wrong password";
}
وقف هون.
قبل ما تكمل.
وين تتوقع المشكلة؟
بالـ Database؟
بالـ Password؟
بالـ API؟
بالـ Query؟
خذ 10 ثواني.
واكتب أول فرضية خطرت ببالك.
ماذا حدث الآن؟
الأهم من إجابتك...
هو الشيء الذي حدث داخل رأسك.
في أول ثانيتين تقريبًا...
كوّنت فرضية.
ومن تلك اللحظة...
بدأ عقلك يبحث عن أدلة تدعمها.
هاي العملية تصير بسرعة لدرجة أن معظم الناس ما ينتبهوا إلها.
لكنها مسؤولة عن كمية هائلة من الوقت الضائع أثناء الـ Debugging.
لأنك تتحول من شخص يبحث عن الحقيقة...
إلى شخص يبحث عن إثبات.
شيء أخطر من الخطأ نفسه
الـ Bug لا يقرر أين ستبحث.
أنت من يفعل.
وأول مكان تقرر أن تبحث فيه...
يؤثر على كل شيء يأتي بعده.
على الـ Logs التي ستقرأها.
وعلى الأسئلة التي ستسألها.
وعلى الأدلة التي ستلاحظها.
وعلى الأدلة التي ستتجاهلها.
لهيك أحيانًا شخصان ينظران إلى نفس المشكلة.
واحد يحلها خلال 5 دقائق.
والثاني يضيع ساعتين.
ليس لأن الأول أذكى.
بل لأنه لم يتزوج أول فرضية خطرت بباله.
Investigator vs Lawyer
تخيل شخصين أمام نفس المشكلة.
الأول محقق.
والثاني محامي.
المحقق عنده هدف واحد:
معرفة الحقيقة.
أما المحامي...
فعنده هدف مختلف.
إثبات أنه على حق.
المشكلة أن أغلب المبرمجين يبدؤوا كمحققين.
لكن بعد أول فرضية...
يتحولوا إلى محامين.
يفتح الـ Logs.
ويبحث عن شيء يدعم فكرته.
يفحص الكود.
ويبحث عن شيء يدعم فكرته.
ويراجع الـ Database.
ويبحث عن شيء يدعم فكرته.
وكلما وجد دليلًا صغيرًا...
ازدادت ثقته.
حتى لو كانت الفرضية نفسها غلط.
لهيك أحيانًا المشكلة الحقيقية ما تكون صعبة.
لكن الطريق الذي اخترته للوصول إليها هو الصعب.
أول مشروع حقيقي يختبر طريقة تفكيرك أكثر من أي Tutorial.
هناك تظهر القرارات.
وهناك تظهر الافتراضات.
وهناك تبدأ المشاكل التي لا تملك إجابة جاهزة.
Your First Real Project
طريقك لأول مشروع حقيقي.
Real World Example
تخيل أن عندك متجر إلكتروني.
وفجأة الصفحة الرئيسية أصبحت بطيئة جدًا.
أول فرضية عند الفريق:
السيرفر تحت ضغط.
بدأوا يفحصوا الـ CPU.
والـ RAM.
والـ Network.
وكل شيء كان يبدو منطقيًا.
لكن المشكلة لم تكن هناك أصلًا.
بعد ساعات من التحقيق...
اكتشفوا أن السبب كان Query واحدة.
SELECT *
FROM products
الاستعلام كان يسحب آلاف المنتجات.
ثم يتم فلترتها داخل التطبيق.
المشكلة هنا ليست بالـ Query فقط.
المشكلة أن الجميع بدأ من فرضية واحدة.
ثم قضى وقته يحاول إثباتها.
FAT Framework
قبل ما تبدأ أي Debugging.
مر على هذه الخطوات الثلاث.
F — Fact
ما الشيء الذي تعرفه يقينًا؟
ليس ما تتوقعه.
ولا ما تشك فيه.
فقط ما تعرفه.
A — Assumption
ما الفرضية التي بنيتها؟
اكتبها بشكل واضح.
لأن الفرضيات غير المرئية هي الأخطر.
T — Test
ما أسرع تجربة ممكن تكسر هذه الفرضية؟
ليس تثبتها.
تكسرها.
إذا نجت من الاختبار...
استمر.
وإذا سقطت...
وفرت على نفسك ساعات من الدوران.
Task #1
ارجع لآخر Bug ضيع منك وقتًا أكثر مما يستحق.
واكتب:
- أول فرضية بنيتها.
- لماذا اقتنعت بها.
- أين كانت المشكلة فعلًا.
- كم دقيقة ضاعت بسبب هذه الفرضية.
Task #2
اقرأ هذا الكود:
const age = "18";
if (age === 18) {
console.log("Adult");
}
قبل أن تبحث عن الحل:
اكتب أول فرضية خطرت ببالك.
ثم اكتب أول 3 أشياء كنت ستفحصها.
بعدها فقط...
ابحث عن السبب الحقيقي.
الهدف من هذا التمرين ليس إيجاد الخطأ.
الهدف أن تراقب كيف يبدأ عقلك ببناء فرضية.
Final Thought
في أول دقيقة من أي مشكلة...
أنت لا تحارب الـ Bug.
أنت تحارب افتراضك عنه.
كلما أصبحت أسرع في كشف افتراضاتك...
أصبحت أسرع في رؤية الحقيقة.
وكلما أصبحت أسرع في رؤية الحقيقة...
أصبحت أسرع في حل المشكلة.
لهيك أحيانًا الفرق بين ساعتين و5 دقائق...
ليس مهارة Debugging.
بل الفرضية التي بدأت منها.