كنت أبحث عن إبرة في كومة قش: كيف أنقذني البحث التقريبي (Fuzzy Finding) من جحيم الـ history؟

يا جماعة الخير، السلام عليكم ورحمة الله. معكم أبو عمر.

خليني أحكيلكم قصة صارت معي قبل كم سنة، يومها كنت تقريبًا راح أكسر الكيبورد من كثر العصبية. كنت شغال على مشروع ضخم لعميل مهم، والمشروع كان بيعتمد بشكل كبير على حاويات Docker و Kubernetes. في هذاك اليوم، كنت بعمل deploy لخدمة جديدة وحساسة جدًا، واستخدمت أمر kubectl طويل ومعقد، فيه اسم ملف YAML، واسم namespace معين، وكم argument خاص… يعني سطر أوامر من اللي “بملّي العين”.

المهم، مشي الحال وعملت الـ deploy. بعد حوالي ساعة، طلب مني مدير المشروع أرجع للنسخة القديمة بشكل عاجل عشان مشكلة ظهرت فجأة. قلت في نفسي “بسيطة”، كل اللي عليّ أعمله إني ألاقي الأمر اللي استخدمته قبل شوي وأغير فيه كلمة apply لكلمة delete أو أستخدم أمر الـ rollback. فتحت الطرفية بكل ثقة وكتبت:

history | grep kubectl

وهنا بدأت المأساة. ظهرت أمامي مئات الأسطر! أنا بستخدم kubectl طول اليوم، وكل الأوامر متشابهة. صرت أدور بعيوني زي المجنون، “ولك وينه؟” “مش معقول!”، “يا زلمة هلأ كنت كاتبه!”. كل ما أتذكر جزء من الأمر، أرجع أعمل grep بشكل أدق، لكن بدون فايدة. الوقت بيمر، والضغط بيزيد، وأنا حاسس حالي بدور على إبرة في كومة قش، أو يمكن في مزرعة قش كاملة!

هذاك اليوم، وبعد ما انحلت المشكلة بطريقة أصعب وأطول، أخذت عهد على نفسي: مستحيل أرجع أوقع بنفس الحفرة. ومن هنا بدأت رحلتي مع ما يسمى بالـ “البحث التقريبي” أو الـ Fuzzy Finding.

ما هو الجحيم الذي أتحدث عنه؟ (مشكلة الـ history التقليدية)

كلنا بنعرف أمر history، وكلنا بنعرف اختصار Ctrl+R (reverse-i-search) في الطرفية. هذه الأدوات مفيدة، لكنها محدودة جدًا:

  • history | grep: الطريقة الكلاسيكية. المشكلة إنك لازم تتذكر كلمة دقيقة من الأمر عشان تلاقيها. لو غلطت بحرف واحد، أو نسيت الكلمة بالضبط، ما راح تلاقي شي. แถม إنها طريقة غير تفاعلية بالمرة.
  • Ctrl+R: أحسن شوي، لكنها برضه بتعتمد على البحث عن سلسلة متطابقة (substring). لو بدك تبحث عن أمر فيه “docker” و “build” و “myapp”، ما بتقدر تكتبهم كلهم. لازم تكتب جزء متواصل من الأمر، ولو ضغطت Ctrl+R مرة ثانية بالغلط، ممكن تضيع النتيجة اللي كنت قريب منها.

باختصار، هذه الطرق بتفترض إن ذاكرتك ممتازة، وهذا إشي مش دايماً صحيح، خصوصًا لما تكون تحت ضغط الشغل.

المنقذ: البحث التقريبي (Fuzzy Finding) وأداة fzf

تخيل معي عالم ثاني. عالم بتقدر فيه تكتب كم حرف متباعد من الأمر اللي بتدور عليه، والنظام ذكي كفاية ليفهم قصدك ويعرض لك أفضل النتائج بشكل فوري وتفاعلي. هذا هو عالم الـ Fuzzy Finding.

الأداة اللي بتعمل هذا السحر اسمها fzf، وهي اختصار لـ “fuzzy finder”. هذه الأداة الصغيرة، اللي كتبها المبرمج الكوري Junegunn Choi، هي حرفيًا أفضل إشي صار للـ Command Line من سنين طويلة.

كيف يعمل السحر؟

ببساطة، fzf بتقرأ قائمة من الأسطر (من أي مصدر: ملف، أمر ثاني، …إلخ)، وبتفتح واجهة تفاعلية بتخليك تكتب أي حروف أو كلمات، وهي بتقوم بترتيب القائمة بناءً على أفضل التطابقات.

مثلاً، لو عندك أمر زي git commit -m "feat: add user authentication" وبدك تبحث عنه، ما في داعي تكتب git commit. ممكن تكتب gt cmt auth، و fzf راح تلاقيه فوراً!

تثبيت وتفعيل السحر (Ctrl+R الجديد)

تثبيت fzf سهل جدًا على معظم الأنظمة. على سبيل المثال في Ubuntu/Debian:

sudo apt install fzf

أو على macOS باستخدام Homebrew:

brew install fzf

بعد التثبيت، لازم تشغل السكربت الخاص بالتفعيل:

$(brew --prefix)/opt/fzf/install

هذا السكربت راح يسألك إذا بدك تفعل الـ key bindings (الاختصارات) والـ auto-completion. طبعًا جاوب “yes” على كل إشي!

الآن، افتح طرفية جديدة واضغط Ctrl+R. بدل الواجهة القديمة المملة، راح تظهر لك واجهة fzf الرهيبة، اللي بتعرض لك كل الـ history تبعك، مع prompt جاهزให้ك تكتب فيه وتبحث بشكل فوري. مبروك، لقد انتقلت من العصر الحجري إلى عصر الفضاء في ثانية واحدة!

fzf ليست فقط للـ history: استخدامات تغير حياتك

وهنا تكمن العبقرية الحقيقية. استخدام fzf مع Ctrl+R هو مجرد قمة جبل الجليد. هذه الأداة مصممة لتعمل مع أي شي تقريبًا في بيئة يونكس، بفضل الـ “pipes” (|).

البحث عن الملفات والمجلدات (وداعًا لأمر find)

هل سئمت من كتابة أوامر find . -name "*something*" المعقدة؟ fzf بتقدملك اختصار Ctrl+T. بمجرد الضغط عليه، fzf راح يعرض لك كل الملفات والمجلدات في المسار الحالي وتفرعاته. ابدأ بالكتابة، ولما تلاقي الملف اللي بدك اياه، اضغط Enter، وراح يتم إدراج مساره في سطر الأوامر.

مثلاً، بدك تفتح ملف معين بـ vim؟ بسيطة:

vim + <اضغط Ctrl+T وابحث عن ملفك>

نصيحة أبو عمر العملية

أنا شخصيًا بستخدم دالة (function) في ملف .zshrc أو .bashrc تبعي عشان أعمل cd بشكل أذكى. الدالة بتبحث عن المجلدات فقط وبتعمل cd عليها مباشرة. هيك شكلها:

# fzcd - cd into the selected directory
fzcd() {
  local dir
  dir=$(find ${1:-.} -path '*/.*' -prune 
                  -o -type d -print 2> /dev/null | fzf +m) &&
  cd "$dir"
}

الآن، بدل ما أكتب cd ../../src/components/....، بكتب بس fzcd وببحث عن اسم المجلد اللي بدي أروح عليه. إنتاجية x10!

إدارة العمليات (Process Management) كالقناص المحترف

كم مرة احتجت توقف عملية (process) معينة وكتبت ps aux | grep "process_name"، وبعدين أخذت الـ PID وعملت kill -9 PID؟

مع fzf، الموضوع بصير زي لعبة فيديو. شوفوا هذا الأمر الساحر:

ps -ef | fzf | awk '{print $2}' | xargs kill -9

خليني أشرحه، لأنه تحفة فنية:

  1. ps -ef: بيعرض كل العمليات الشغالة.
  2. | fzf: “بايب” هذه القائمة لـ fzf، اللي بتفتح واجهة البحث التفاعلية.
  3. | awk '{print $2}': بعد ما تختار العملية اللي بدك اياها بـ fzf وتضغط Enter، هذا الجزء بياخذ السطر اللي اخترته وبستخرج منه الجزء الثاني (اللي هو الـ PID).
  4. | xargs kill -9: وأخيرًا، بياخذ الـ PID اللي استخرجناه وبمرره لأمر kill -9.

بأمر واحد، صار عندك قناص عمليات احترافي. طبعًا، بنصحك تعمل alias لهذا الأمر، مثلاً تسميه fkill.

التنقل بين فروع Git (Git Branches)

إذا كنت بتشتغل مع Git وعندك فروع كثيرة، التنقل بينهم ممكن يكون مزعج. مع fzf، الموضوع بصير متعة:

git branch | fzf | xargs git checkout

هذا الأمر بيعرض لك كل فروعك في واجهة fzf، بتختار الفرع اللي بدك اياه، و xargs بتمرره لأمر git checkout. ولا أسهل!

الخلاصة… أو زي ما بنحكيها، الزبدة 📝

يا جماعة، أداة مثل fzf هي مثال حي على كيف ممكن أداة بسيطة وذكية تغير طريقة عملك بالكامل. هي مش مجرد أداة، هي “فلسفة” عمل بتعتمد على السرعة والذكاء وتقليل الحمل الذهني عليك كمبرمج.

من يوم ما اكتشفت الـ Fuzzy Finding و fzf، صرت أبحث عن أوامري القديمة بثقة وسرعة، وأتنقل بين الملفات والمجلدات كأني في فيلم The Matrix، وأدير نظامي بسهولة ما كنت أحلم فيها. بطلت أخاف من الـ history، بالعكس، صار كنز حقيقي بقدر أوصل لأي جزء منه بثواني.

نصيحتي الأخيرة: لا تستخفوا بأدوات سطر الأوامر. استثمروا شوية وقت في تعلم أداة مثل fzf، والوقت اللي راح توفروه على المدى الطويل لا يقدر بثمن. جربوها اليوم، وادعولي. 🚀

أبو عمر

سجل دخولك لعمل نقاش تفاعلي

كافة المحادثات خاصة ولا يتم عرضها على الموقع نهائياً

آراء من النقاشات

لا توجد آراء منشورة بعد. كن أول من يشارك رأيه!

آخر المدونات

نصائح برمجية

كانت بياناتنا تتغير من تحت أقدامنا: كيف أنقذتنا ‘اللامُتَغَيِّرية’ (Immutability) من جحيم الأخطاء؟

هل تعاني من أخطاء برمجية غامضة تختفي وتظهر؟ في هذه المقالة، أشاركك قصة حقيقية من قلب المعركة البرمجية، عن كيف أنقذ مبدأ 'اللامتغيرية' (Immutability) فريقي...

21 مايو، 2026 قراءة المزيد
​معمارية البرمجيات

كان تغيير بسيط يكسر كل شيء: كيف أنقذتنا ‘المعمارية القائمة على الأحداث’ من جحيم التشابك؟

أشارككم قصة حقيقية من ميدان المعركة البرمجية، يوم كاد تغيير بسيط أن يوقف عملنا بالكامل. سنغوص في أعماق "المعمارية القائمة على الأحداث" (Event-Driven Architecture) لنكتشف...

21 مايو، 2026 قراءة المزيد
ذكاء اصطناعي

كنا نغرق في بحر البيانات: كيف أنقذنا ‘الإشراف الضعيف’ (Weak Supervision) من جحيم التسمية اليدوية؟

مقالة تستعرض تقنية الإشراف الضعيف (Weak Supervision) كحل عملي لمشكلة تسمية البيانات الهائلة في مشاريع الذكاء الاصطناعي. من قصة واقعية إلى دليل تطبيقي، نكتشف كيف...

21 مايو، 2026 قراءة المزيد
خوارزميات

كنا نرهق قاعدة البيانات بسؤال ‘هل هذا موجود؟’: كيف أنقذنا ‘فلتر بلوم’ من جحيم الاستعلامات غير الضرورية؟

في هذه المقالة، أسرد لكم قصة حقيقية من واقع العمل، كيف أنقذنا نظامنا من ضغط الاستعلامات الهائل باستخدام هيكل بيانات بسيط وعبقري يُدعى "فلتر بلوم"....

21 مايو، 2026 قراءة المزيد
تسويق رقمي

كانت تحويلاتنا ضحية لحاصرات الإعلانات: كيف أنقذتنا واجهة برمجة تطبيقات التحويلات (CAPI) من جحيم التتبع المفقود؟

في هذه المقالة، أشارككم قصة حقيقية من قلب الميدان عن كيفية انهيار تتبع حملاتنا الإعلانية بسبب حاصرات الإعلانات، وكيف كانت واجهة برمجة تطبيقات التحويلات (CAPI)...

21 مايو، 2026 قراءة المزيد
تجربة المستخدم والابداع البصري

من الشاشات البيضاء إلى الحوار: فن تصميم حالات الواجهة (Loading, Empty, Error)

في هذا المقال، يأخذكم أبو عمر في رحلة من تجربته كمطور فلسطيني، ليكشف أسرار تصميم حالات الواجهة (التحميل، الفراغ، والخطأ). تعلم كيف تحول الشاشات الصامتة...

21 مايو، 2026 قراءة المزيد
البودكاست