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

un

gast
1 / ?
terug naar lessen

Code lezen voor groeisnelheden

Codebeoordeling voor correctheid vs codebeoordeling voor complexiteit

Codebeoordeling op correctheid vangt logische fouten op: verkeerde voorwaarden, off-by-one-indices, ontbrekende null-controles. Complexiteitsbewuste codebeoordeling vangt een ander soort defect op: code die correct werkt bij N = 100 maar catastrofaal groeit bij N = 100.000.

MOAD-0001 patroon: lijst gezien O(N²) vs set gezien O(N) — eenregelige fix


Deze les verbindt zich met een dieper onderzoek in de unhamming-cursus: Het ontbrekende hoofdstuk: Algoritmische complexiteit behandelt Big O in de context van productiefouten, & MOAD-0001: Het sedimentaire defect brengt het patroon in kaart over 60+ softwareecosystemen.


Twee controleheuristieken


Geneste lussen vermenigvuldigen complexiteit. Twee geneste lussen over N items produceren O(N²). Drie produceren O(N³). Bij beoordeling: tel eerst de diepte van lusgenesting.


Sequentiële container in een hete lus. Elke .contains(), .includes(), .find(), of in list-controle in een lus kost O(N) per controle. Over N iteraties: O(N²) totaal. Dit patroon verschijnt in productiecode in tientallen ecosystemen — de GHC Haskell-compiler, Python pip, Apache Maven, Rust Cargo, TypeScript, Godot. Dezelfde fout, verschillende codebasissen.

Beoordeling: find_duplicates

Beoordeel de volgende Python-functie op complexiteit:


def find_duplicates(items):
    seen = []
    duplicates = []
    for item in items:
        if item in seen:
            duplicates.append(item)
        else:
            seen.append(item)
    return duplicates
Voer een complexiteitsbewuste codebeoordeling uit: (a) Wat is de tijdcomplexiteit van deze functie? (b) Waarom? Identificeer de exacte regel die verantwoordelijk is. (c) Herschrijf het naar O(N).

MOAD-0001: Het sedimentaire defect

Dezelfde fout, zestig ecosystemen

Het patroon if x not in list: list.append(x) in een lus verschijnt — is verschenen — in productiecode over tientallen softwareecosystemen:


- GHC (Haskell compiler): afhankelijkheidsresolver, O(N²) bij N = 50.000 pakketten, 17-minuten builds

- Python pip: conflictresolutie afhankelijkheid

- Apache Maven: classpath-deduplicatie

- Rust Cargo: functie-unificatie

- TypeScript compiler: module-resolutie

- Godot / Redot game engine: node-graaftraversal


Geen van deze teams maakte een fout. Ze schreven correct code bij kleine N. N groeide. De code calcificeerde. Het patroon heeft een naam: MOAD-0001, Het sedimentaire defect. Sediment: correct, onschadelijk in dunne lagen. Na verloop van tijd accumuleert de lagen en verharden.


De fix

In elk geval: vervang de sequentiële container met een hash-container. Eén regel. Nul gedragsverandering bij juiste invoer. 100–1.000× versnelling bij real-world N.


De fix werkt omdat twee bewerkingen snel moeten blijven:

1. Lidmaatschapscontrole: is dit element eerder gezien?

2. Georderde uitvoer: retourneer elementen in de volgorde waarin ze verschenen (soms vereist, soms niet).


Een set handelt (1) af in O(1). Als (2) ook belangrijk is, bewaar een aparte lijst voor georderde uitvoer en een set voor de lidmaatschapscontrole. Twee gegevensstructuren, elk doet één taak.

Reageren op een beoordelaar

Een pull request repareert MOAD-0001 in de graftraversal functie van een project. Een beoordelaar merkt op:


> "Sets behouden geen invoegvolgorde — dit verandert gedrag."

Hoe reageer je? Leg uit wanneer het bezwaar van de beoordelaar van toepassing is, en wanneer niet. Stel een oplossing voor die beide bezwaren satisfieert wanneer ze wel botsen.

Het interview-analysepatroon

De verwachte opmaak

Algoritmische complexiteitsanalyse verschijnt in softwareengineer-interviews. Een sterk antwoord volgt een vierdelig patroon:


1. Geef de huidige complexiteit op — O(?) voor tijd, O(?) voor ruimte.

2. Leg uit waarom — identificeer de specifieke verantwoordelijke constructie (geneste lus, lineaire scan in lus, recursieve vertakking).

3. Stel een optimalisatie voor — noem de verandering en de gegevensstructuur of algoritme die het introduceert.

4. Geef de nieuwe complexiteit op — na de fix, wat is de tijd- & ruimtecomplexiteit?


Voorbeeld:

Code: [function that checks membership in a list inside a loop]
Current: O(N²) — `item in seen_list` is O(N) per check × N iterations
Optimization: replace seen_list with seen_set (hash set)
After: O(N) — set membership check is O(1)

Deze vaardigheid strekt zich uit buiten interviews: complexiteitsbewuste codebeoordeling, architectuurontwerp, prestatiedebugging, beveiligingsaudits. Elk systeem dat invoer van variabele grootte verwerkt, profiteert ervan.


Deze les verbindt zich vooruit naar de unhamming-cursus, die dit exacte patroon toepast op onderzoek naar productiefouten over 60+ open-sourceprojecten.

Interview: analyseer has_common_element

Pas het vierdeelige interview-format toe op deze functie:


def has_common_element(list_a, list_b):
    for item in list_a:
        for other in list_b:
            if item == other:
                return True
    return False
Geef de huidige complexiteit op, leg uit waarom, stel een optimalisatie voor, geef de nieuwe complexiteit op.