English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

tamu
1 / ?
kembali ke pelajaran

Penamaan Bukan Penemuan

Anda sekarang mengenal tujuh pola MOAD. Mengetahui nama penting: itu memungkinkan Anda mengenali pola ketika Anda melihatnya. Tetapi pengenalan dalam pelajaran terkontrol berbeda dengan deteksi dalam basis kode yang tidak pernah Anda buka.

Basis kode tidak melabeli defeknya. MOAD sedimenter tidak datang dengan komentar yang mengatakan // O(N²) — perbaiki ini. Kawanan mengamuk tidak mengumumkan dirinya sebagai stampedo cache miss. Anda menemukannya dengan membaca kode dengan pertanyaan spesifik: struktur data apa yang menyimpan nilai-nilai ini, dan operasi apa yang dijalankan terhadapnya dalam loop?

Deteksi adalah keterampilan terpisah dari pengenalan. Pengenalan mengatakan: ya, pola itu adalah MOAD-0001. Deteksi mengatakan: biarkan saya menemukan semua tempat dalam basis kode ini di mana pola itu mungkin ada, apakah saya dapat melihat kode lengkap atau hanya nama simbol.

Tujuh MOAD: substrat, tanda tangan, perbaikan

Pemindaian Pertama

Lintasan pertama menggunakan grep. Setiap MOAD memiliki substrat: struktur data atau API yang kehadirannya, di dekat operasi tertentu, adalah sinyal yang layak diperiksa.

MOAD-0001 (Sedimenter): List.contains dalam loop

# Signal: membership test on a list variable inside a loop
grep -rn '.contains(' src/ | grep -v HashSet | grep -v TreeSet
grep -rn 'visited =' src/ | grep -v set | grep -v Set

MOAD-0002 (Intertangle): bendera mutable bersama di seluruh fase

# Signal: static mutable field written by one subsystem, read by another
grep -rn 'static ' src/ | grep -v final | grep -v class | grep -v void

MOAD-0003 (Konteks Bocor): ThreadLocal dalam executor berkumpulan

# Signal: ThreadLocal.set() without guaranteed ThreadLocal.remove()
grep -rn 'ThreadLocal' src/
grep -rn 'ThreadLocal.set' src/ -l

MOAD-0004 (Rahasia Dicatat): header HTTP dalam output log

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

MOAD-0005 (Kawanan Mengamuk): cache miss tanpa sinkronisasi

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

Pola-pola ini menghasilkan kandidat, bukan defek yang dikonfirmasi. Setiap kandidat membutuhkan triase: baca kode sekitarnya, verifikasi tipe struktur data, konfirmasi operasi berjalan dalam skala.

Pilih satu MOAD dari MOAD-0001 hingga MOAD-0005. Jelaskan langkah deteksi konkret yang akan Anda ambil dalam basis kode yang tidak pernah Anda baca sebelumnya: apa yang Anda cari, seperti apa tampilan hasil positif, & apa yang membedakan defek yang dikonfirmasi dari positif palsu.

Membaca Kode untuk Kompleksitas

Grep menemukan kandidat. Membaca mengonfirmasi. Ketika Anda membuka file kandidat, Anda membaca dengan satu pertanyaan: apakah biaya operasi ini tumbuh dengan ukuran input?

Untuk MOAD-0001, protokol konfirmasi:

1. Temukan loop luar. Apa yang membatasi jumlah iterasinya?
2. Temukan operasi inner (.contains, .indexOf, 'in'). Struktur data apa yang dijalankan?
3. Apakah struktur data itu tumbuh dengan input yang sama yang mendorong loop luar?
4. Jika ya: biayanya adalah O(N²) di mana N = ukuran input. Defek dikonfirmasi.
5. Jika tidak: struktur inner dibatasi (konfigurasi, enum, konstanta kecil). Positif palsu.

Traversal grafik mengunjungi N node, memeriksa daftar visited di setiap langkah: baik loop maupun struktur data inner tumbuh dengan N. Dikonfirmasi.

Handler permintaan yang memeriksa allowlist 5 IP admin: allowlist tidak pernah tumbuh dengan volume permintaan. Positif palsu.

Protokol yang sama berlaku untuk setiap MOAD: identifikasi driver luar, identifikasi struktur inner, tanyakan apakah keduanya skala bersama.

Skor Lonjakan: Memprioritaskan Temuan Anda

Bukan semua defek yang dikonfirmasi memerlukan perbaikan segera. MOAD dalam perpustakaan dengan 10.000 dependan hilir memiliki skor lonjakan lebih tinggi daripada MOAD yang sama dalam alat internal pribadi.

Skor lonjakan = speedup × in-degree. Speedup: seberapa banyak lebih cepat perbaikan berjalan pada skala produksi khas? In-degree: berapa banyak paket atau layanan hilir yang akan mewarisi perbaikan secara otomatis ketika upstream menggabungkannya?

MOAD-0001 yang dikonfirmasi dalam pemecah dependensi Maven Apache, berjalan pada grafik 50.000 node, dengan 1.000+ plugin Maven hilir yang mewarisi perubahan secara otomatis: skor lonjakan sangat tinggi. Perbaikan ini milik depan antrian Anda.

MOAD-0001 yang dikonfirmasi dalam alat CLI single-user tanpa dependan: skor lonjakan mendekati nol. Layak diperbaiki, tetapi tidak mendesak.

Node workaholic vs. glutton. Node dengan betweenness tinggi & speedup tinggi adalah workaholic: menangani aliran kritis & akan membuang antrian hilir ketika dibuka. Perbaiki hanya setelah mengonfirmasi kapasitas hilir. Node dengan out-degree tinggi & speedup rendah adalah glutton: mengonsumsi semua yang diberinya & tidak merasakan rasa sakit. Menambal workaholic tanpa staging kapasitas hilir menciptakan MOAD-0005 (kawanan mengamuk) pada skala infrastruktur.

Factory DAG: pola node workaholic & glutton

Anda telah mengonfirmasi MOAD-0001 di dua tempat: (A) resolver dependensi dalam alat build dengan 200.000 proyek aktif yang bergantung padanya, berjalan pada grafik 10.000-node dependency trees; (B) utility grafik dalam pipeline data internal di satu perusahaan, berjalan pada grafik 50-node. Bandingkan skor lonjakan mereka. Mana yang Anda perbaiki terlebih dahulu, & langkah apa yang Anda ambil sebelum mengungkapkan?

Scan ke Merge: Pipeline MOAD

Defek yang dikonfirmasi dengan skor lonjakan tinggi bergerak melalui pipeline. Setiap tahap menghasilkan artifact. Tidak ada tahap yang opsional.

scan    → candidate list (grep output, static analysis results)
ticket  → defect description (MOAD number, location, complexity analysis)
patch   → code change (data structure swap, primitive adoption)
test    → unit test (O(1) proof: time the fix at N=100 and N=10,000)
UNDF    → public disclosure post (undefect.com, public domain)
disclose → CVE or CWE reference if security-relevant
PR      → upstream pull request with patch + test + UNDF link
merge   → maintainer acceptance; fix propagates via version bump

Setiap artifact memberi makan tahap berikutnya. Patch tanpa test tidak dapat diverifikasi. Test tanpa pengungkapan tidak dapat menyebar ke instance lain dari pola yang sama. Pengungkapan tanpa PR upstream meninggalkan perbaikan dalam fork.

Post MOAD (UNDF) adalah tahap yang paling banyak engineer lewati. Mereka memperbaiki defek, mengirimkan PR, & menganggap diri mereka selesai. Tetapi perbaikan tanpa post bernama berarti setiap engineer di masa depan yang mengalami pola yang sama harus menemukan kembali masalah & perbaikan secara independen. Post MOAD menutup loop pengetahuan: itu menamakan pola, menunjukkan metode deteksi, & link ke patch. Peneliti di masa depan menemukan perbaikan dengan mencari nama pola.

Planet patching dalam skala. Perbaikan MOAD-0001 tunggal dalam perpustakaan yang banyak digunakan menyebar ke setiap proyek yang mengimpornya. Post MOAD memastikan bahwa engineer dalam proyek yang tidak akan pernah upgrade perpustakaan itu masih mempelajari perbaikan. Kedua jalur berjalan secara paralel.

Menulis Tiket Defek

Tiket defek yang baik menjawab lima pertanyaan:

1. Di mana: file exact, class, function, & line range
2. Apa: tipe struktur data & operasi terhadapnya
3. Mengapa: analisis kompleksitas (O(N²) atau lebih buruk, dengan N didefinisikan)
4. Dampak: input apa yang memicu perilaku kasus terburuk, & pada skala apa
5. Perbaiki: struktur data atau primitive untuk disubstitusi

Tiket yang menjawab semua lima self-contained: maintainer yang tidak pernah membaca analisis Anda dapat mereproduksi temuan Anda & memverifikasi perbaikan Anda. Tiket yang melewati (3) atau (4) memerlukan maintainer untuk mengulangi analisis kompleksitas Anda sebelum mereka dapat menggabungkan. Gesekan itu mengurangi probabilitas merge.

Kredibilitas compound. PR pertama yang mencakup tiket jelas, patch yang well-targeted, & test benchmark digabungkan. PR kedua dari penulis yang sama ditinjau dengan gesekan lebih sedikit. PR ketiga ditinjau oleh maintainer yang menggabungkan dua pertama. Reputasi dalam open source adalah buku transaksi artifact: setiap patch yang diterima mengumpulkan kepercayaan untuk PR berikutnya.

Tulislah tiket defek minimal untuk MOAD-0001 yang Anda harapkan untuk menemukan dalam perpustakaan grafik. Sertakan: (1) nama file/function yang masuk akal, (2) struktur data & operasi, (3) pernyataan kompleksitas, (4) skenario dampak khas, (5) perbaikan.

Membaca Kandidat Nyata

Berikut adalah kandidat MOAD-0001 nyata dalam Python. Bacalah & selesaikan protokol triase.

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

Pertanyaan triase:

1. Struktur data apa `seen`?
2. Operasi apa yang berjalan terhadapnya pada baris 6?
3. Apakah `seen` tumbuh dengan ukuran input?
4. Apakah loop yang mendorong panggilan rekursif juga tumbuh dengan ukuran input?
5. Apakah ini MOAD-0001 yang dikonfirmasi atau positif palsu?
Kerjakan lima pertanyaan triase untuk kode ini. Kemudian tulislah perbaikan satu baris & jelaskan mengapa itu tidak mengubah output fungsi.

Patch Anda

Defek yang dikonfirmasi dengan skor lonjakan tinggi memerlukan patch lengkap: perbaikan kode, test yang membuktikan peningkatan, & outline post MOAD.

Test harus test performa, bukan test kebenaran. Test kebenaran lolos sebelum & sesudah perbaikan — itu intinya; output tidak berubah. Test performa pada dua ukuran input membuktikan peningkatan:

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')

Sebelum perbaikan, waktu elapsed tumbuh kuadrat dengan n. Setelah perbaikan, tumbuh linier. Cetak keduanya & sertakan angka dalam deskripsi PR Anda.

Outline post MOAD mencakup: nama pola, substrat (resolver dependensi Python), metode deteksi (grep untuk in seen di mana seen dimulai sebagai []), perbaikan, & link ke PR Anda. Post ini menuju undefect.com sebagai public domain. Engineer di masa depan yang mencari 'Python list membership in loop slow' akan menemukannya.

Anda telah mengonfirmasi & menambal MOAD-0001 dalam alat packaging Python yang populer. Sebelum Anda membuka PR, apa tiga hal yang Anda sertakan dalam deskripsi PR, & mengapa masing-masing penting bagi maintainer?