البرمجة20 يناير 20264 دقائق قراءة
تسمية الأشياء: أصعب مشكلة سهلة
أسامـــة الدروشـــي

قضيتُ ذات مرة أربعين دقيقة من مراجعة تصميم في جدال حول كلمة واحدة: هل الكيان المحوري في نموذج البيانات Measurement أم Indicator؟ بدا الأمر عبثيًا حينها، لكنه تبيّن لاحقًا أنه أنفع أربعين دقيقة في ذلك المشروع كله؛ لأن الجدال لم يكن يومًا حول الكلمة، بل حول ماهية النظام نفسه.
إذا عجزتَ عن التسمية فأنت لم تفهم بعد
بعد ست سنوات في هذه المهنة، يتكرّر النمط أمامي بثبات لافت: حين يستعصي الاسم، فالمشكلة ليست في المفردات أبدًا، بل في أن المفهوم تحته ما يزال عجينًا لم يتشكّل. أسماء مثل DataHandler وProcessManager وdoStuff() ليست أسماء؛ إنها اعترافات. تقرّ بأن شيئًا ما يحدث هنا، لكن أحدًا لا يستطيع أن يقول ما هو.
حين بنينا منصة «المؤشرات» لهيئة تنظيم الاتصالات في عُمان، احتوى نموذج البيانات في نسخته الأولى على جدول اسمه values. قيم ماذا؟ ومن أرسلها؟ وهل هي خام أم مدققة؟ كان كل نقاش حول ذلك الجدول يستغرق ضعف ما يستحق، لأن كل واحد منا كان يحمل في رأسه تعريفًا مختلفًا بصمت. لم يكن الحل هندسة بارعة؛ جلسنا مع خبراء المجال فتعلمنا أن الهيئة تفرّق بين الإفادة، وهي ما يرسله المشغّل، وقيمة المؤشر، وهي ما يجتاز التدقيق ويُنشر. مفهومان، اسمان، جدولان. وتبخّر نصف «الأخطاء» في تلك الزاوية من النظام، لأن معظمها كان سوء فهم متنكّرًا في هيئة stack trace.
الاسم الرديء ليس مسألة أسلوب؛ إنه عيب في التصميم صودف أنه كُتب بالحروف.
لذلك حين يستعصي عليّ الاسم اليوم، أتوقف عن الكتابة وأبدأ بطرح الأسئلة. وخلال عشر دقائق غالبًا ما يقول أحدهم: «في الحقيقة هما شيئان»، أو «هذا لا يوجد إلا بعد الاعتماد»، فيُصلح التصميمُ نفسَه بنفسه. كان الاسم أداة التشخيص منذ البداية.
أعد التسمية مبكرًا، وأعدها كثيرًا
الغريب في الأمر أن العلاج شبه مجاني. إعادة التسمية هي أعلى عمليات إعادة الهيكلة مردودًا على الإطلاق، وقد حوّلتها بيئة التطوير إلى عملية من ثانيتين: rename symbol، ثم شغّل الاختبارات، ثم commit. لا تغيير في السلوك، ولا ترحيل بيانات، ولا مخاطرة تُذكر. لا شيء آخر في كتالوج إعادة الهيكلة يقاربها في نسبة الكلفة إلى الفائدة.
ومع ذلك تتعايش الفرق مع الأسماء الرديئة سنوات. رأيتُ مهندسين يكتبون تعليقات تشرح أن customer في هذه الخدمة بالذات يعني الموزّع لا المستخدم النهائي، بدل أن يقضوا تسعين ثانية في إعادة تسميته. كل تعليق من هذا النوع هو فائدة تتراكم على دين كان يمكنك سداده قبل الغداء.
قاعدتي بسيطة: في اللحظة التي تضبط فيها نفسك تشرح ما يعنيه الاسم فعلًا، أعد تسميته. توجد استثناءات مشروعة بالطبع؛ فالمعرّف الذي يتسرب إلى عقد API عام، أو عمود في PostgreSQL تستعلم عنه عشرات التقارير، تغييره مكلف حقًا، فوازن الأمر. أما داخل شيفرتك أنت، فالتردد في إعادة التسمية هو اختيارٌ للبقاء في الالتباس بالتقسيط المريح.
الاتفاقيات عقود لا أذواق
كثيرًا ما تُستهجن اتفاقيات التسمية بوصفها جدالًا في التوافه، وتفاصيل الاختيارات نفسها توافه فعلًا في الغالب. أن تكتب getUser أم fetchUser أقل أهمية بكثير من أن يعني الفريق كله الشيء نفسه بها. الاتفاقية عقد: وعدٌ بسلوك معيّن مشفّر في الاسم.
في «صبر»، منصة التحليلات والمراقبة التي بنيناها لهيئة تنظيم الاتصالات، اتفقنا على حفنة من هذه العقود:
- كل ما ينتهي بـ
Repositoryيخاطب قاعدة البيانات ولا شيء غيرها. - دوال
find*قد تُعيد نتيجة فارغة، أما دوالget*فترمي استثناءً إن لم يوجد الشيء. - كل ما يسمى
Snapshotغير قابل للتغيير ويمكن تخزينه في الذاكرة المؤقتة بأمان.
لم يُكتب شيء من هذا في wiki يقرؤه أحد، ولم يكن بحاجة إلى ذلك؛ فالأسماء كانت تحمل القواعد. كان بوسع مهندس جديد أن يثق بدالة لم يفتحها قط، اعتمادًا على توقيعها وحده. هذا ما تشتريه لك الاتفاقية: القدرة على الاستدلال على شيفرة لم تقرأها.
والنتيجة اللازمة من ذلك: خرق الاتفاقية ليس مخالفة أسلوبية، بل وعد منكوث. دالة getUser تُعيد null بصمت تكذب على كل من وثق بالعقد. راجعها كما تراجع خطأً برمجيًا، لأنها ستتحوّل إلى خطأ فعلي عاجلًا أم آجلًا.
ما علّمتني إياه العربية عن الأسماء
أعمل بلغتين. في مسقط تجري نقاشات المجال بالعربية بينما تُكتب الشيفرة بالإنجليزية، وهذه الترجمة الدائمة اختبار إجهاد للتسمية لا تحظى به معظم الفرق.
حين بنينا «مدى»، منصة تحليلات تدهور أداء الأبراج لعمانتل، بدت كلمة degradation بديهية بالإنجليزية. ثم تحاول قولها بالعربية فتجبرك اللغة على الاختيار: التدهور تفاقم تدريجي، والخلل عطب، والانقطاع توقف كامل. أيّها كنا نقصد؟ كانت الكلمة الإنجليزية تخلط بين ثلاثة مفاهيم مختلفة بكل ارتياح، والنماذج المبنية فوقها ورثت الخلط نفسه. لم تُضف العربية دقة جديدة؛ بل كشفت الدقة التي كانت غائبة.
هذا هو الاختبار الذي ألتزمه منذ ذلك الحين: ترجم المفهوم. إن نجا من الرحلة بين اللغتين بمعناه سليمًا فهو مفهوم حقيقي؛ وإن تحلّل إلى ثلاث كلمات فلم يكن يومًا شيئًا واحدًا، ولا ينبغي لشيفرتك أن تدّعي أنه كذلك.
التسمية عمل تصميمي. خصص لها وقتًا، وجادل حول الكلمات في المراجعات، وأعد التسمية بلا مراسم. فالدقائق الأربعون لا تدور يومًا حول الكلمة.