un

guest
1 / ?
back to lessons

الاسم ليس العثور

تعرف الآن على سبعة أنماط MOAD. معرفة الأسماء مهمة: فهي تسمح لك التعرف على النمط عندما تراه. لكن التعرف في دروس مختلطة يختلف عن الكشف في مكتبة لم تقرأها من قبل.

المكتبة لا تضع علامة على عيوبها. MOAD رسوبي لا يأتي مع تعليق يقول // O(N²) — إصلاح هذا. العصفة الضاحكة لا تعلن عن نفسها كتصادم طرد صامت. تجدها بواسطة قراءة الكود مع سؤال محدد في العقل: ما الهيكل البياني الذي يحمل هذه القيم، وما العمليات التي تُجرى ضده داخل حلقة؟

الكشف هو مهارة منفصلة عن التعرف. التعرف يقول: نعم، هذا النمط هو MOAD-0001. الكشف يقول: دعني أجد كل الأماكن في هذا الكودbase حيث يمكن أن توجد هذه النمط، سواء كنت أرى الكود الكامل أو لا.

سبعة MOADs: substrates, signatures, fixes

التنقيب الأولي

المرة الأولى تستخدم grep. لكل MOAD هناك حشوة: هيكل بيانات أو واجهة يُعتبر وجودها، بالقرب من بعض العمليات، إشارة تستحق التحقيق.

MOAD-0001 (الرسوب): membership test على list في حلقة

# الإشارة: اختبار الأعضاء في قائمة متغيرة داخل حلقة
grep -rn '.contains(' src/ | grep -v HashSet | grep -v TreeSet
grep -rn 'visited =' src/ | grep -v set | grep -v Set

MOAD-0002 (التعصيب): علامة مشتركة غير مستقرة بين المراحل

# الإشارة: حقل غير مستقرة مُشترك يُكتب بواسطة نظام واحد، ويُقرأ بواسطة آخر
grep -rn 'static ' src/ | grep -v final | grep -v class | grep -v void

MOAD-0003 (التنازل عن السياق): ThreadLocal في معالج مخزن

# الإشارة: ThreadLocal.set() بدون ضمان ThreadLocal.remove()
grep -rn 'ThreadLocal' src/
grep -rn 'ThreadLocal.set' src/ -l

MOAD-0004 (التنسيق السري): رأس HTTP في خروج التبديل

# Signal: log call with headers variable near auth endpoints
grep -rn 'log.*header' src/
grep -rn 'Authorization' src/ --include='*.log'

MOAD-0005 (Thundering Herd): cache miss with no synchronization

# Signal: cache.get() + null check + cache.put() without lock
grep -rn 'cache.get' src/ -A4 | grep 'cache.put'

These patterns produce candidates, not confirmed defects. Every candidate needs triage: read the surrounding code, verify the data structure type, confirm the operation runs at scale.

اختر MOAD واحد من MOAD-0001 إلى MOAD-0005. وصف خطوة كشف واضحة في مكتبة لم تقرأها من قبل: ما الذي تبحث عنه، ماذا يبدو إيجابيًا، وما الذي يفترض أن يفترض بين عيب مؤكد ووهم إيجابي.

Reading Code for Complexity

Grep finds candidates. Reading confirms them. When you open a candidate file, you read with one question: does this operation's cost grow with input size?

For MOAD-0001, the confirmation protocol:

1. Find the outer loop. What bounds its iteration count?
2. Find the inner operation (.contains, .indexOf, 'in'). What data structure does it run against?
3. Does that data structure grow with the same input that drives the outer loop?
4. If yes: the cost is O(N²) where N = input size. Confirmed defect.
5. If no: the inner structure is bounded (config, enum, small constant). False positive.

A graph traversal visiting N nodes, checking a visited list on each step: both the loop and the inner data structure grow with N. Confirmed.

A request handler checking an allowlist of 5 admin IPs: the allowlist never grows with request volume. False positive.

The same protocol applies to each MOAD: identify the outer driver, identify the inner structure, ask whether both scale together.

Surge Score: Prioritizing Your Findings

لا يلزم جميع العيوب المؤكدة التصحيح الفوري. MOAD في مكتبة بها 10,000 من المستخدمين المتصلة يملك درجة انفجار أعلى من نفس MOAD في أداة داخلية خاصة.

الدرجة الانفجارية = السرعة × درجة المدخل. السرعة: كم يسرع إصلاحه عند مقياس الإنتاج العادي؟ درجة المدخل: كم عدد الوحدات المتصلة التي ستورث التغيير تلقائيًا عندما يدمج المستخدم الأعلى؟

MOAD-0001 مؤكد في حلاقة الاعتماد في Apache Maven، تعمل على أشجار من 50,000 العمود، مع أكثر من 1,000 من تابعي Maven الذي يرث التغييرات تلقائيًا: الدرجة الانفجارية عالية جدا. يجب أن يكون هذا الإصلاح في مقدمة قائمةك.

MOAD-0001 مؤكد في أداة CLI واحدة للمستخدم بدون مستخدمين: الدرجة الانفجارية قريبة من الصفر. يستحق التصحيح ولكن ليس عاجلا.

العامل المضطرب vs العامل الجبان العمود. العمود ذو بينات عاليه وسرعة عاليه هو عامل مضطرب: يتعامل مع التيار الحركي الحراسيه وينفذ الكوادر التالية عند الرفع. لا تتم إصلاحه إلا بعد تأكيد قدرة المستخدمين الأسفل. العمود ذو درجة الخروج العاليه وسرعة منخفضة هو عامل جبان: يستهلك كل شيء يُدفَع إليه ويفشل الشعور. إصلاح العامل المضطرب بدون إعداد القدرة الأسفل يخلق MOAD-0005 (الجماعة الثائرة) على مستوى البنية التحتية.

DAG المصنع: أنماط العامل المضطرب والعامل الجبان العمود

لقد أكدت MOAD-0001 في مكانين: (أ) حلقة تعتمد في أداة بناء مع 200,000 مشروع نشط يعتمد عليها، تعمل على أشجار من 10,000-العناصر منحنى الاعتماد؛ (ب) أداة الرسم البياني في خطط بيانات داخلية في شركة واحدة، تعمل على أشجار من 50 العمود. قم بتحليل درجات الانفجار. أي منها تتم إصلاحه أولاً؟ وما الخطوات التي يجب اتخاذها قبل الكشف؟

فحص الجمع: خط طرد MOAD

يتم نقل عيب مؤكد مع درجة موجة عالية عبر خط طرد. ينتج كل مرحلة منتجًا. لا توجد مرحلة اختيارية.

فحص    → قائمة مرشحة (خروج grep ، نتائج التحليل الإحصائي)
تذكرة  → وصف العيب (رقم MOAD ، الموقع ، تحليل التعقيد)
ترقية  → تغيير الكود (تبديل هيكل البيانات ، تبني أساسي)
اختبار    → اختبار وحدة (برهان O(1) : زمن التصحيح عند N = 100 و N = 10,000)
UNDF    → نشر عام بعد (undefect.com ، المجال العام)
كشف    → مرجعية CVE أو CWE إذا كان ذات صلة بالامن
PR      → طلب استلام مركزي مع الترقية + الاختبار + رابط UNDF
دمج   → قبول المحرر; يتم نقل الصيانة عبر زيادة الإصدار

يتم تغذية كل منتج لمرحلة التالية. لا يمكن التحقق من الترقية بدون اختبار. لا يمكن نقل الاختبار بدون كشف إلى مثيلات نفس المخطط في أماكن أخرى. لا يمكن نشر الكشف بدون طلب استلام مركزي يترك الصيانة في فرع.

النشر بعد MOAD (UNDF) هي المرحلة التي يغفلها معظم المهندسين. يصحح المهندسون العيب ويدخلون طلب استلام ويعتبرون أنفسهم قد انتهوا. لكن الترقية بدون نشر بعد تعني أن كل مهندس في المستقبل الذي يلتقي بمخطط同هم يجب أن يكتشف المشكلة والتصحيح بشكل مستقل. نشر MOAD يغلق حلقة المعرفة: يسمي المخطط ويظهر طريقة الكشف عنه ويربط بالترقية. يجد الباحثون في المستقبل التصحيح عند البحث عن اسم المخطط.

التصحيح على الكوكب على مستوى الجداول. تصحيح MOAD-0001 في مكتبة شعبية ينتشر إلى كل مشروع يستورد منه. يضمن نشر MOAD أن المهندسين في مشاريع لن تتجدد المكتبة بالتأكيد يتعلمون التصحيح. كلا المسارين يعملان في平ويا.

كتابة تذكرة العيب

تذكرة العيب الجيدة ترد على خمسة أسئلة:

1. أين: ملف دقيق ، وصف الفئة ، وظيفة ، ونطاق سطر الجدول
2. ماذا: نوع هيكل البيانات والعملية ضده
3. لماذا: تحليل التعقيد (O(N²) أو أسوأ ، مع N تعریف)
4. تأثير: ما يtrigger inputs أسوأ سلوك ، وعلى مستوى ما
5. التصحيح: الهيكل أو البنية الأساسية لتبديلها

تذكرة تقوم بتوضيح جميع الخمسة هي ذاتية: يمكن للمحرر الذي لم يقرأ تحليلك إعادة إنتاج مكتشفتك وتحقق التصحيح. تتطلب تذاكر عدم (3) أو (4) من المحررين تكرار تحليل التعقيد قبل أن يتمكنوا من دمجها. تقل هذه العبثية بفعل الدمج.

تضاعف الصدق. أول طلب تعديل يحتوي على تذكرة واضحة وتركيب محدد واختبار مرجعي يتم دمجه. طلب تعديل ثاني من نفس المؤلف يتم مراجعتها بقليل من المقاومة. طلب تعديل ثالث يتم مراجعة المخول الذي دمج الأثنين الأولين. الصدق في برمجيات الحرة هو دفتر الأستاذ للآثار: كل تصحيح مقبول يكسب الثقة للتصحيح التالي.

اكتب تذكرة العيب البسيطة للعيب MOAD-0001 الذي تتوقعه في مكتبة الرسم البياني. قم بتشمل: (1) اسم ملف وظيفة محتمل ، (2) هيكل البيانات والعملية ، (3) بيان التعقيد ، (4) سيناريو تأثير عادي ، (5) التصحيح.

قراءة مرشح حقيقي

هنا مرشح MOAD-0001 الحقيقي بلغة Python. قراءة وتحقق من إجراء التriage.

class DependencyResolver:
    def resolve(self, package, resolved=None, seen=None):
        if resolved is None:
            resolved = []
        if seen is None:
            seen = []
        if package in seen:
            return
        seen.append(package)
        for dep in self.registry.get_dependencies(package):
            self.resolve(dep, resolved, seen)
        resolved.append(package)
        return resolved

أسئلة التriage:

1. ما هو التركيب البياني لـ `seen`؟
2. ما العملية التي تُجرى عليها على السطر 6؟
3. هل يزداد `seen` بحجم حجم المدخلات؟
4. هل حلقة التحكم في الدعوات التكرارية تزداد بحجم حجم المدخلات أيضًا؟
5. هل هذا تذكرة MOAD-0001 مؤكدة أم إشارة خطأ؟
تجاوز الخمس أسئلة التriage لهذا الكود. ثم اكتب التصحيح البنائي الواحد والشرح لماذا لا يغير الناتج من الوظيفة.

إصدارك

العيب المؤكد مع درجة قوية للزحف تحتاج إلى صورة كاملة: الإصلاح الكودي، اختبار يثبت التحسين، ومخطط MOAD بعد.

يجب أن يكون الاختبار اختبارًا للأداء وليس صحة. اختبار الصحة ينجح قبل وبعد الإصلاح - هذا هو النقطة؛ لا يحدث تغيير في الخروج. اختبار الأداء عند اثنتين من أحجام المدخلات يثبت التحسين:

import time

def build_graph(n):
    # n packages, each depending on the previous one
    return {f'pkg{i}': [f'pkg{i-1}'] if i > 0 else [] for i in range(n)}

for n in [100, 1000, 5000]:
    registry = build_graph(n)
    resolver = DependencyResolver(registry)
    start = time.perf_counter()
    resolver.resolve(f'pkg{n-1}')
    elapsed = time.perf_counter() - start
    print(f'n={n}: {elapsed:.4f}s')

قبل الإصلاح، زمن الانتهاء يزداد بشكل تربيعي مع n. بعد الإصلاح، يزداد خطيًا. طباعة كليهما وضم الأعداد في وصف طلب الورقة.

خطة ملخص MOAD تغطي: اسم المخطط، الوسيط (حلقة التبعية في بايثون)، طريقة الكشف (grep للبحث عن في seen حيث seen تبدأ بـ [])، التصحيح، وروابط لطلب الاقتراح. يذهب المنشور إلى undefect.com كملكية عامة. سيجد المهندسون المستقبليون البحث عن 'Python list membership in loop slow'.

لقد أكدت وصفت MOAD-0001 في أداة تجميعة باسم في بايثون. قبل فتح طلب الورقة، ماذا تشمل في وصف طلب الورقة ثلاثة أشياء، ولماذا يهم كل منها للمشرف؟