5 يونيو

Mohamed Saif published on
4 min, 619 words

حسنًا، لن أذكر ( خجلاً ) المدة التي أخذتها حتى استقر على redis كمشروع مفتوح المصدر اعمل عليه وأشارك فيه بغرض التعلم والانخراط في مجتمع الـ open-source، سحر هذا العصر وعلامة المجتمع التقني المتميزة. كانت النية في البداية العمل على محرك postgresql حتى استفيد من خبرات أستاذي (mentor بلغة الإفرنج) في هذا المشروع تحديدًا إلا أنني رأيت أن المجتمع الخاص بالـ postgresql مُغلق قليلا لذا لم أشعر بالحماس وأخبرت أستاذي أنني سأبحث عن مشروع غيره يكون أكثر ترحيبًا من الـ postgresql. كانت المعايير التي عليها سأختار المشروع بسيطة للغاية:

  • قنوات اتصال مريحة مع المطورين
  • مشروع من فئة الـ system programming. فقط!

واستقر الأمر على redis ؛ قنوات اتصال عديدة، قوائم بريد ومجتمع فعال على discord وقناة يوتيوب و redis client: redis-py مكتوب بلغة البايثون (redis نفسه مكتوب بالـ c) ومصادر جيدة لتعلم redis و documentation نظيفة _ هذا ما لم نشاهده من قبل.

قمت بتحميل الـ codebase وبدأت في إعداد تعريفات الـ Clion الجميل جدا ♥️. تعلمّت أساسيات الـ Makefile وقرأت ملفات الـ Makefiles الموجودة وكانت شديدة الوضوح (نسبيًا).

بعد ذلك لمحتُ Python script يتيم بين تلال ملفات الـ c المرعبة، يبدو أنه لم يُمس من فترة طويلة؛ حتى أنني من النظرة الأولى أيقنت انه يحتاج إلى refactoring ومن هنا رسميًا يمكنني البدء. وظيفة الـ script خلق أوامر redis المخزنة في ملفات Json في مجلد commands. ماذا يعني ذلك؟ آثرت عدم التعمق في هذه الجزئية وركزت فقط على تنظيف هذا الملف حتى بدون فهم كامل / عميق لطبيعة وظيفته. بدون مبدأ الـ Abstraction كانت لم تقوم للبشرية قائمة. وسريعًا حددت ما سأقوم بتعديله:

  • استخدام pathlib بدلا من os.path
  • جعل نقطة بداية الـ script بداخل الـ if __name__ == "__main__": حتى يمكن تنفيده ك script أو استخدامه ك module بدون تنفيذ
  • استخدام Enum بدلا من الـ dict
  • مشروعية استخدام assert خارج الـ test modules ؟
  • وطبعًا، استخدام الـ typing module

بعد تنظيف دالة الـ main يمكنني حينها البدء في تنظيف الـ classes والـ functions الأخرى _ أحلى object-oriented على عيون القارئ!

الـ classes الموجودة:

  • KeySpec
  • Argument
  • Command
  • Subcommand

الدوال الموجودة:

  • create_command
  • check_main_command_key_spec
  • check_command_args_key_spec
  • get_optional_desc_string

على الرغم من أن هذا الملف لا يُعد من صميم core الـ redis إلا أنه بالنسبة لي نقطة انطلاق مشجعة جدا للانخراط في المشروع. أسأل الله التوفيق وأن يشملني ببركته سبحانه وتعالى.

ماذا فعل الـ "Dog" بالكلب؟

في الطريق إلى صلاة الفجر بصحبة أخي الأصغر، مستغلين هدوء الشارع نتندر أحيانًا بسؤال غريب يطرحه أحدنا على الآخر لا لسبب وجيه إلا لتسلية الوقت. الإجابات تكون مضحكة وعميقة (أحيانا)! كانت من ضمن هذه الأسئلة أن سألته: تُرى ما الفارق بين "الكلب" والـ "Dog"؟ بالطبع لن يخطر بباله أن إجابة السؤال ستكون "أنهما نفس الشئ لكن بلغتين مختلفتين" لأننا أتفه / أعمق من اعتماد الإجابات المباشرة والمنطقية في هذه الحالة.

أتذكر أن محاولاته كانت مبدعة، وللأسف لا أتذكر أيا منها نصًا. إلا أنني أتذكر أن إحدى هذه الإجابات كانت قريبة من أننا لم نرى "Dog" من قبل قط! وأن مغامرات الطفولة لا تتذكر أي شيء اسمه "Dog". ما رأيناه حقًا ونعرفه كان "الكلب" رغم تشابه المظهر الخارجي لكلا الشيئين: الكلب والـ dog إلا أن الطفل في داخلنا يقسم أنه لا يتذكر الثاني

ليسا نفس الشئ بالنسبة إلى موقعهما من خبرة الشخص ووجدانه. والسبب يكمن في أن اللغة باعتبار أنها كائن حي يعيش بداخلنا، وأن اللغة الأم هي أم بالفعل في خبرتها بالحياة والألفاظ والتجارب مقارنة باللغات التي نتعلمها في سن متأخرة كاللغة الإنجليزية. "الكلب" ككلمة لها ملايين البصمات في ذاكرة الإنسان العربي ووعيه ولا-وعيه؛ وتملك الذاكرة العديد العديد من القصص والمغامرات مع هذا الحيوان، وهذه الكلمة تستدعي جميع هذه البصمات النفسية والتشابكات الشعورية بأسلوب لا يُقارن بسماع نفس الكلمة لكن بلغة أخرى!

الآن، تخيل أننا مجتمعات اتفقت على دراسة العلم بلغتها الأم؟ كيف ستكون مقدرة الفرد منا في استقبال المعلومة بلغته الحية في نفسه؟ كيف باسترجاعها واستخدامها؟ كيف بتطويره هذه المعلومة؟ كيف سيكون وقع المصطلحات على نفوسنا واستيعابنا للمعلومة إن كانت؟