الخصائص كبوصلة: البرمجة الدقيقة ✛ ✎

الأصل: "Accurate Programming: Thinking about programs in terms of properties"
· Walid Taha, Veronica Gaspes, Rex Page
arXiv:1109.0786 · 2011-09-05 · arXiv non-exclusive · تحليل مستقل · 2 دقيقة
البرامج ليست مجرد كود، بل هي خصائص رياضية يمكن التحقق منها آليًا.

يتكاثف الضباب فوق السطر «def max(a: Int, b: Int): Int». ماذا يفعل هذا السطر؟ يعيد أكبر رقمين، ولكن كيف يمكن التحقق من ذلك؟ يمكن كتابة عشرات الاختبارات بأزواج محددة: max(2,3)=3، max(5,5)=5، max(-1,0)=0. ومع ذلك يبقى القلق: ماذا لو تعطلت الدالة مع مليون وسالب مليون؟ بدلًا من التحديق في الضباب، يمكن للمطور أن يأخذ بوصلة، وهذه البوصلة تسمى خاصية.

الخاصية هي عبارة عن البرنامج يجب أن تكون صحيحة لجميع المدخلات. ليست «بالنسبة إلى 2 و3 تُرجع 3»، بل «بالنسبة إلى أي a وb، النتيجة لا تقل عن كل منهما». يمكن كتابة هذه العبارة ليس فقط على الورق، بل أيضًا في الكود. مكتبة ScalaCheck قادرة على توليد مئات القيم العشوائية، وإدخالها في الخاصية، والإبلاغ إذا انتهكت إحداها. هذا هو الاختبار القائم على الخصائص: بدلًا من الفحص اليدوي للأمثلة، يتم التحقق الآلي من القانون.

الخاصية كبوصلة: لا تقودك عبر مسار واحد، بل تحدد اتجاهًا صحيحًا لأي طريق. بالنسبة للدالة max، هناك ثلاثة اتجاهات من هذا القبيل: التماثل (max(a,b)=max(b,a))، والاستقرار (max(a,a)=a)، وخاصية الحد الأعلى الأصغر (النتيجة لا تقل عن كل وسيط ولا تزيد عن أي رقم آخر من هذا القبيل). معًا تحدد هذه الخصائص تمامًا معنى «الحد الأقصى».

لكن الخصائص لا تختبر الكود الجاهز فحسب، بل تساعد أيضًا في كتابته. لنأخذ الدالة sum التي تجمع قائمة الأرقام. إحدى الخصائص هي الرتابة: إذا أخذنا قائمة وأضفنا إليها رقمًا موجبًا، فسيزيد المجموع. يبدو هذا واضحًا. لكن ScalaCheck يجد مثالًا مضادًا: بالنسبة للقائمة [65536] وإضافة 1، لا يزيد المجموع، بل يبقى 65537 بسبب تجاوز سعة النوع الصحيح في بعض اللغات. أشارت البوصلة إلى صخرة لم ترها الاختبارات العادية.

يمكن تحسين الخصائص مثل ضبط البوصلة. الدالة count تعد عناصر القائمة. الخاصية الأولى «النتيجة غير سالبة» ضعيفة جدًا: حتى الدالة التي تُرجع دائمًا صفرًا تحققها. نضيف خاصية «بالنسبة لقائمة من عنصر واحد، النتيجة تساوي 1»: يُستبعد الصفر، لكن تبقى دوال أخرى منتحلة. تدريجيًا، خطوة بخطوة، تتقارب الخصائص نحو التنفيذ الصحيح الوحيد.

وهنا التحول: البرنامج نفسه هو أيضًا خاصية. إذا كانت الدالة تُرجع دائمًا 42، يمكن وصفها بالخاصية «بالنسبة لأي مدخل، النتيجة تساوي 42». الحدود بين المواصفات (ما نريده) والتنفيذ (كيف نفعله) تصبح غير واضحة. البرمجة الدقيقة هي نهج يضع المطور في ذهنه ليس فقط الكود، بل أيضًا الخصائص التي يجب أن يحققها هذا الكود. إنها جسر بين الاختبار والتحقق الرسمي: نحن لا نثبت البرنامج بالكامل، لكننا نحصل على معظم الضمانات بجزء صغير من التكلفة.

ينقشع الضباب. لم يعد السطر «def max» لغزًا: لديه ثلاث خصائص-بوصلات، ويمكن التحقق من كل منها آليًا. لم تعد البرمجة تخمينًا، بل أصبحت إبحارًا على خريطة نرسمها بأنفسنا.

اسم مكتبة ScalaCheck يشير إلى فكرة التحقق الآلي من الخصائص، وليس إلى «فحص سكالا» — إنها أداة للتحقق من الخصائص في سكالا.

في مسلسل «ويست وورلد»، يتم تحديد سلوك الروبوتات بقواعد معقدة، لكن صحتها غير مضمونة. كان يمكن للبرمجة الدقيقة أن تساعد في صياغة والتحقق من خصائص السلوك، مما يمنع الأعطال غير المتوقعة.

العلماء
Max BornAlbert EinsteinErwin SchrödingerHugh Everett IIIJohn von NeumannAugustin-Louis Cauchy
المفاهيم
دقة أتمتة التحسين دقة تشخيصية معالجة اللغة الطبيعية زمن حقيقي الخوارزمية الكمومية تصميم الدواء مفتوح المصدر تقارب التعلم الآلي محاكاة حاسوبية التعرف على الكلام طب شخصي ذكاء اصطناعي الروبوتية حساب التصنيف حل دقيق دقة