A Concern-Centric Empirical Evaluation of Multi-Language Code Smells: An LLM-Assisted Study of JNI Software Evolution
تقدم هذه الورقة تقييماً تجريبياً متمحوراً حول المخاوف لروائح كود (JNI) باستخدام تحليل مدعوم بالنماذج اللغوية الكبيرة لـ 8,207 عملية إرسال (commits) عبر 15 مشروعاً مفتوح المصدر، مما يكشف أن تعريفات الروائح الحالية تغطي 36.5% فقط من مخاوف الصيانة لدى المطورين، وتقترح ثلاثة تعريفات جديدة للروائح لمعالجة الفجوات التي تم تحديدها.
البحث الأصلي مرخَّص بموجب CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/). هذا شرح مولَّده بالذكاء الاصطناعي للبحث أدناه. لم يكتبه المؤلفون ولم يصادقوا عليه. وللتحقق من الدقة التقنية، يرجى الرجوع إلى البحث الأصلي. اقرأ إخلاء المسؤولية الكامل
غالباً ما تبدو البرمجيات الحديثة وكأنها آلة تعمل بسلاسة، ولكن تحت واجهتها الأنيقة، غالباً ما تُبنى من أجزاء مختلفة تتحدث لغات متنوعة. ولجعل البرنامج سريعاً أو فعالاً أو قادراً على التواصل مع أجهزة متخصصة، يقوم المطورون بدمج كود مكتوب بلغة ما مع كود مكتوب بلغة أخرى. ومن الطرق الشائعة للقيام بذلك جسر يُسمى "واجهة جافا الأصلية" (Java Native Interface)، والتي تسمح لبرنامج مكتوب بلغة جافا بالوصول واستخدام أدوات قوية مكتوبة بلغتي C أو C++. وبينما يمنح هذا المزيج من اللغات البرمجيات قوة هائلة، فإنه يخلق أيضاً نوعاً فريداً من الفوضى. تماماً كما قد يكافح المترجم للحفاظ على اتساق لهجتين مختلفتين، يمكن للبرمجيات أن تطور عيوباً خفية حيث تفشل اللغتان في الاتفاق على كيفية مشاركة البيانات أو إدارة الذاكرة أو التعامل مع الأخطاء. هذه العيوب، المعروفة في الصناعة باسم "روائح الكود" (code smells)، ليست أخطاءً تؤدي إلى تعطل البرنامج فوراً، بل هي خيارات تصميم تجعل البرمجيات صعبة الإصلاح أو التحديث أو الفهم بمر مرور الوقت. لسنوات طويلة، حاول الخبراء تصنيف هذه الروائح، وإنشاء قوائم لما يبدو عليه التصميم السيئ عبر اللغات. ولكن ظل هناك سؤال جوهري بلا إجابة: هل تطابق هذه القوائم بالفعل المشكلات الحقيقية التي يواجهها المطورون يومياً عند محاولة تشغيل هذه الأنظمة المعقدة؟
لقد وضع فريق من الباحثين هدفاً للإجابة على هذا السؤال من خلال النظر مباشرة إلى تاريخ كيفية تغير البرمجيات بمرور الوقت، بدلاً من مجرد التحديق في الكود نفسه. ركزوا على خمسة عشر مشروعاً شهيراً مفتوح المصدر يعتمد بشكل كبير على هذا الجسر بين جافا وC. وبدلاً من التخمين حول ماهية الخطأ، فحصوا آلاف التحديثات، أو ما يُعرف بـ "الالتزامات" (commits)، التي أجراها المطورون على هذه المشاريع على مر السنين. كانوا يبحثون عن اللحظات التي اضطر فيها المطور للتوقف لإصلاح مشكلة صيانة محددة تتعلق بالاتصال بين اللغتين. وللتعامل مع الحجم الهائل من البيانات، استخدموا أداة ذكاء اصطناعي متطورة لقراءة التغييرات في الكود والملاحظات التي كتبها المطورون عنها. عمل الذكاء الاصطنا enviado كـ "مساعد عالي المهارة"، حيث قام بمسح التعديلات لتحديد المشكلة المحددة التي كان المطور يحاول حلها، مثل إصلاح تسرب في الذاكرة، أو تأمين نقل البيانات، أو إعادة تنظيم كيفية تواصل جزأين من النظام مع بعضهما البعض. ثم قام الباحثون بمراجعة عينة من هذه النتائج يدوياً للتأكد من صحة ما وجده الذكاء الاصطناعي، مؤكدين أن الطريقة كانت موثوقة.
كشفت الدراسة عن صورة واضلة لما يعاني منه المطورون بالفعل. فقد حددوا إحدى عشرة عائلة متميزة من المشكلات التي تتكرر باستمرار. وتضمنت المشكلات الأكثر شيوعاً الحفاظ على سلامة الحدود بين اللغتين والتأكد من تنظيف الموارد، مثل الذاكرة أو مقابض الملفات، بشكل صحيح بعد الاستخدام. وقد شكلت هاتان الفئتان وحدهما ما يقرب من ستين بالمائة من جميع أعمال الصيانة التي وجدها الباحثون. يشير هذا إلى أن العمل اليومي الأكثر إلحاحاً لهؤلاء المطورين هو ببساطة الحفاظ على الاتصال بين اللغات من الانكسار أو التسريب. ومع ذلك، عندما قارن الباحثون هذه المشكلات الواقعية بالقوائم الموجودة لـ "روائح الكود" المعروفة، وجدوا فجوة كبيرة. فالكتالوجات الحالية، التي تم إنشاؤها إلى حد كبير من قبل خبراء بناءً على مبادئ تصميم نظرية، لم تغطِ سوى حوالي ستة وثلاثين بالمائة من المشكلات الفعلية التي كان المطورون يصلحونها. بعبارة أخرى، أغفلت القوائم الموجودة غالبية العمل الذي كان يقوم به المطورون للحفاظ على صحة برمجياتهم.
أدرك الباحثون أن المشكلات المفقودة لم تكن أخطاءً عشوائية، بل كانت أنماطاً متكررة تستحق أسماء خاصة بها. فقد وجدوا أن المطورين يضطرون تكراراً لإجراء تغييرات منسقة في كل من كود جافا وكود C كلما تغير تفصيل واحد، وهو موقف جعل التحديثات بطيئة وعرضة للخطأ. كما شاهدوا حالات يتم فيها كشف تفاصيل داخلية خفية عبر حاجز اللغة، مما يضعف أمن وتنظيم النظام. وأخيراً، لاحظوا أن المسؤوليات غالباً ما توضع في اللغة الخاطئة، مما يجبر أحد جانبي النظام على طلب القيام بعمله من الجانب الآخر باستمرار، مما خلق تعقيداً غير ضروري. وبناءً على هذه الملاحظات المتكررة، اقترح الفريق ثلاثة تعريفات جديدة لروائح الكود تعالج تحديداً هذه القضايا العابرة للغات. وقد أطلقوا عليها اسم "جراحة السكين المبعثرة عبر اللغات" (Cross-Language Shotgun Surgery)، لوصف الحاجة لتغيير ملفات عديدة في وقت واحد؛ و"تسرب التجريد عبر اللغات" (Cross-Language Abstraction Leakage)، حيث يتم كشف التفاصيل الخفية عن طريق الخطأ؛ و"تخصيص المسؤولية الخاطئ" (Wrong Responsibility Allocation)، حيث تُسند المهام إلى طبقة اللغة الخاطئة.
ينقل هذا العمل التركيز من ما يعتقده الخبراء كمشكلة إلى ما يقوم المطورون بإصلاحه بالفعل. ومن خلال الاستماع إلى تاريخ البرمجيات نفسه، أظهر الباحثون أن الفهم الحالي لعيوب التصميم متعدد اللغات غير مكتمل. فالقوائم الموجودة جيدة في رصد الأخطاء المحلية البسيطة، لكنها تغفل التحديات الهيكلية الأعمق التي تظهر عندما يحاول عالمان مختلفان من الكود العمل معاً. توفر التعريفات الجديدة مفردات لهذه الصراعات الخفية، مما يوفر وسيلة للمطورين لرصد وإصلاح هذه الأنواع المحددة من الفوضى قبل أن تصبح غير قابلة للسيطرة. وتخلص الدراسة إلى أنه لفهم جودة البرمجيات حقاً، يجب ألا ننظر فقط إلى الكود الثابت، بل إلى التاريخ الطويل والفوضوي لكيفية الحفاظ على ذلك الكود وتطويره.
غارق في أبحاث مجالك؟
تصلك نشرة يومية بأحدث الأبحاث المطابقة لكلماتك البحثية المفتاحية — مع ملخصات تقنية، بلغتك.