يتكاثف الضباب فوق السطر «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 قادرة على توليد مئات القيم العشوائية، وإدخالها في الخاصية، والإبلاغ إذا انتهكت إحداها. هذا هو الاختبار القائم على الخصائص: بدلًا من الفحص اليدوي للأمثلة، يتم التحقق الآلي من القانون.
لكن الخصائص لا تختبر الكود الجاهز فحسب، بل تساعد أيضًا في كتابته. لنأخذ الدالة sum التي تجمع قائمة الأرقام. إحدى الخصائص هي الرتابة: إذا أخذنا قائمة وأضفنا إليها رقمًا موجبًا، فسيزيد المجموع. يبدو هذا واضحًا. لكن ScalaCheck يجد مثالًا مضادًا: بالنسبة للقائمة [65536] وإضافة 1، لا يزيد المجموع، بل يبقى 65537 بسبب تجاوز سعة النوع الصحيح في بعض اللغات. أشارت البوصلة إلى صخرة لم ترها الاختبارات العادية.
وهنا التحول: البرنامج نفسه هو أيضًا خاصية. إذا كانت الدالة تُرجع دائمًا 42، يمكن وصفها بالخاصية «بالنسبة لأي مدخل، النتيجة تساوي 42». الحدود بين المواصفات (ما نريده) والتنفيذ (كيف نفعله) تصبح غير واضحة. البرمجة الدقيقة هي نهج يضع المطور في ذهنه ليس فقط الكود، بل أيضًا الخصائص التي يجب أن يحققها هذا الكود. إنها جسر بين الاختبار والتحقق الرسمي: نحن لا نثبت البرنامج بالكامل، لكننا نحصل على معظم الضمانات بجزء صغير من التكلفة.
ينقشع الضباب. لم يعد السطر «def max» لغزًا: لديه ثلاث خصائص-بوصلات، ويمكن التحقق من كل منها آليًا. لم تعد البرمجة تخمينًا، بل أصبحت إبحارًا على خريطة نرسمها بأنفسنا.
اسم مكتبة ScalaCheck يشير إلى فكرة التحقق الآلي من الخصائص، وليس إلى «فحص سكالا» — إنها أداة للتحقق من الخصائص في سكالا.
في مسلسل «ويست وورلد»، يتم تحديد سلوك الروبوتات بقواعد معقدة، لكن صحتها غير مضمونة. كان يمكن للبرمجة الدقيقة أن تساعد في صياغة والتحقق من خصائص السلوك، مما يمنع الأعطال غير المتوقعة.