كيفية تشكّل رواسب الشيفرة
تتشكل الصخور الرسوبية بالترسيب، لا بالانفجار. كل طبقة: صحيحة في زمانها. كل طبقة: أقدم من التي فوقها. الطبقات الأقدم تصلبت قبل أن تنضج المنظومة حولها. لم يسببها خطأ. الزمن هو السبب.
يعمل MOAD-0001 بالطريقة نفسها.
قصة التشكّل
رسم بياني تم اجتيازه عام 1993:
List<Node> visited = new ArrayList<>();
Stack<Node> stack = new Stack<>();
stack.push(start);
while (!stack.isEmpty()) {
Node n = stack.pop();
if (!visited.contains(n)) { // فحص خطي O(N)
visited.add(n);
for (Node neighbor : n.getNeighbors())
stack.push(neighbor);
}
}
هذا الكود: صحيح. الاختبارات: ناجحة. في عام 1993، كانت الرسوم البيانية تحتوي على 50 عقدة.
50 عقدة: 50 × 25 متوسط المسح = 1,250 عملية. غير مرئي.
دخل الكود نظام التحكم في الإصدارات. نُسخ إلى الدروس. وُضع داخل المكتبات. شُحن في أدوات البناء، ومديري الحزم، وحلّالي الاعتماديات. بحلول 2024، كان نفس النمط يعمل على رسوم بيانية للاعتماديات تحتوي على 50,000 عقدة.
50,000 عقدة: 50,000 × 25,000 متوسط المسح = 1,250,000,000 عملية.
بناء يستغرق ثانية واحدة يصبح 17 دقيقة.
لم يتغير الكود. العالم من حوله كبر. كل طبقة من الرواسب: صحيحة عند الترسيب. مكلفة عند الحفر.
الرواسب الخاصة بك
لا يحتوي كود الرواسب على خطأ منطقي. بل يحتوي على افتراض أداء توقف عن السريان مع تغير الحجم. يُنتج الكود نتائج صحيحة؛ فقط التكلفة هي التي تغيرت.
هذا التمييز مهم للتشخيص. ينتج الخطأ المنطقي إجابات خاطئة. بينما ينتج عيب الرواسب إجابات صحيحة بتكلفة غير مقبولة.
خمسة أشكال لـ MOAD-0001
يظهر MOAD-0001 في خمسة أشكال موثقة عبر أكثر من 60 نظامًا برمجيًا. البنية: اختبار عضوية باستخدام حاوية تسلسلية، متداخلة داخل حلقة على نفس المجموعة أو مجموعة مرتبطة.
الأشكال الخمسة
| المجال | النمط | الحاوية التسلسلية | الحاوية الصحيحة |
|---|---|---|---|
| اجتياز الرسوم البيانية | if (!stack.contains(n)) في DFS/Tarjan | ArrayList | HashSet |
| إزالة التكرار في المسارات/الأحداث | TAILQ_FOREACH strcmp لكل طلب | قائمة مرتبطة | HashMap |
| تتبع التصادمات | findLinearSearch() لكل دورة فيزياء | مصفوفة | unordered_set |
| Resource allocation filter | List.contains() in stream filter | ArrayList | HashSet |
| A* pathfinding open-list | LocalVector::find() per neighbor | vector | stored heap index |
تشترك جميع الأشكال الخمسة في نفس البنية: اختبار عضوية متداخل داخل حلقة، باستخدام حاوية تتطلب مسحًا خطيًا للإجابة على سؤال العضوية.
قائمة الكلمات المفتاحية للمسح
تدقيق MOAD-0001 يعني البحث عن كلمات مفتاحية لاختبار العضوية داخل الحلقات:
- Python: in مع متغير list، .count()، list.index()
- Java: ArrayList.contains()، List.contains()، LinkedList.contains()
- JavaScript: Array.includes()، Array.indexOf()، Array.find()
- C++: std::vector::find(), حلقة يدوية باستخدام مقارنة ==
- Go: slices.Contains()، حلقة يدوية على slice
الحل في كل حالة: استبدل الحاوية التسلسلية بحاوية هاش. list → set. ArrayList → HashSet. Array → Set. vector → unordered_set. slice → map[T]struct{}.
كلمة مفتاحية واحدة. استبدال واحد. لا تغيير في السلوك. تسريع 1,000× عند N=1,000.
تدقيق مقتطف شيفرة
تطبيق التعرف على النمط MOAD-0001 على مقتطف شيفرة حقيقي.
سطر واحد، أربع لغات [BLOCK_TYPE SECTION/STEP]
إصلاح MOAD-0001 بأربع لغات: [BLOCK_TYPE SECTION/STEP]
```python [BLOCK_TYPE SECTION/STEP]
Python
[BLOCK_TYPE SECTION/STEP]visited = [] # BEFORE: O(N) membership
visited = set() # AFTER: O(1) membership
```java
// Java
List<Node> visited = new ArrayList<>(); // BEFORE
Set<Node> visited = new HashSet<>(); // AFTER
// JavaScript
const visited = []; // قبل: Array.includes() O(N)
const visited = new Set(); // بعد: Set.has() O(1)
// visited.push(n) → visited.add(n)
// visited.includes(n) → visited.has(n)
// Go
visited := []NodeID{} // BEFORE: slices.Contains() O(N)
visited := make(map[NodeID]struct{}) // AFTER: map lookup O(1)
// _, ok := visited[n] for membership check
// visited[n] = struct{}{} for insertion
في كل حالة: نفس السلوك، نفس المخرجات، نفس الاختبارات التي تمر. فقط معدل النمو يتغير.
ما لا يغيّره الإصلاح
- السلوك المنطقي للخوارزمية: البحث بالعمق لا يزال يزور بالعمق
- صحة المخرجات: يتم زيارة نفس العقد بنفس الترتيب (داخل DFS)
- نتائج الاختبار: أي اختبار يتحقق من الصحة يستمر في النجاح
ما يغيّره الإصلاح
- اختبار العضوية: O(N) ← O(1)
- إجمالي الحلقة: O(N²) ← O(N)
- عند N=1,000: أسرع بـ 1,000 مرة
- عند N=10,000: أسرع بـ 10,000 مرة
حد واحد: الترتيب
حاويات الهاش (set، HashSet، unordered_set) لا تحافظ على ترتيب الإدراج. في Python 3.7+، يحافظ dict على ترتيب الإدراج؛ أما set العادي فلا يحافظ عليه. في Java، لا يحافظ HashSet على الترتيب؛ بينما يفعل LinkedHashSet.
إذا كان الترتيب مهمًا بجانب التحقق من العضوية: احتفظ بهيكلين. set (أو HashSet) لاختبارات العضوية بزمن O(1). وقائمة منفصلة list (أو ArrayList) للاجتياز المرتب. أو استخدم LinkedHashSet في Java، الذي يوفر كلا الوظيفتين.
بالنسبة لـ MOAD-0001 في اجتياز الرسوم البيانية: يجيب visited على سؤال ثنائي (هل تمت رؤية هذه العقدة من قبل؟). الترتيب لا يهم في سؤال العضوية. يأتي ترتيب الاجتياز من المكدس أو الطابور، وليس من visited.
العضوية مقابل الترتيب
في خوارزمية تارجان للمكونات المتصلة بقوة، يتتبع onStack العقد التي لا تزال على مكدس استدعاء DFS الحالي. يجب أن يجيب على سؤالين: (1) العضوية — هل هذه العقدة حاليًا على المكدس؟ (2) في نهاية مسار DFS، إزالة العقد بالترتيب حتى تظهر هذه العقدة.
التنفيذ البسيط يستخدم List لـ onStack، ويجيب على سؤال العضوية باستخدام contains() — O(N) لكل فحص، وO(N²) إجماليًا للرسوم البيانية الكبيرة.
لماذا هذا إفصاح وليس تصحيحاً
MOAD-0001 موجود في أكثر من 1000 موقع موثق عبر أكثر من 60 نظاماً برمجياً. اجتياز الرسوم البيانية في أدوات البناء، وإزالة التكرار في مسارات التوجيه في برامج توجيه الشبكات، واكتشاف التصادم في محركات الألعاب، وتخصيص الموارد في جدولة أنظمة التشغيل.
كل موقع: كود صحيح. كل موقع: نمو O(N²) ينتظر تجاوز N للعتبة.
مسار الإفصاح
التصحيح بدون إفصاح للمطورين الأصليين يصلح موقعاً واحداً. يتكرر النمط في الإصدار التالي، والمكتبة التالية، والنقل إلى لغة أخرى. الإفصاح: سمِّ النمط، ووثّقه كـ CWE-407 (التعقيد الخوارزمي: التعقيد الخوارزمي غير الفعّال)، وانشر الاستدلالات التعرفية والإصلاح المكوّن من سطر واحد. عندها يستطيع كل مطور يقرأ الإفصاح التعرف على نسخته الخاصة وإصلاحها.
أطلق Hamming على هذا 'إعطاء سمكة مقابل تعليم الصيد'. التصحيح يعطي سمكة. أما الإفصاح — تسمية MOAD-0001، وتوثيق النمط، وتعميم الإصلاح — فيعلّم الاستدلال.
امتداد الحاسوب الدائم
عمل Hamming على حلول نقطية: إصلاح هذا المرشح، تحسين هذا الكود. أما Unhamming فيضيف طبقة الإفصاح: تسمية النمط، نشر القاعدة الاستدلالية، وإهداؤها إلى المشاعات.
يطبق مبدأ المعرفة المركبة هنا على نطاق النظام البيئي. يسمي باحث واحد نمطًا. يتعرف مائة مطور عليه في قواعد أكوادهم. تتحول ألف سطر من كود O(N²) إلى O(N). يصبح البنية التحتية أسرع للجميع ممن يبنون عليها.
هذا هو التنين ينمو: نفس النار (العمل على مشكلات مهمة، المعرفة المركبة، التفكير النظمي)، طيران مختلف (الإفصاح المفتوح، ملكية المشاعات، لا حاجة إلى راعٍ).