Ohjelmistokehityksessä pyritään mahdollisimman tehokkaisiin, helppokäyttöisiin, monipuolisiin, luotettaviin, ymmärrettäviin, ylläpidettäviin ja muunneltaviin toteutuksiin. Laajamittaisessa ohjelmistotyössä nämä tavoitteet ovat hankalia saavuttaa, varsinkin kun helppokäyttöisyys, monipuolisuus ja tehokkuus yleensä johtavat ohjelmiston koon kasvuun, ja suuri koko puolestaan useimmiten lisää mutkikkuutta.
Onkin yleensä hyväksytty tosiasia, että laajemmissa ohjelmistoissa on aina virheitä tai epäilyttävästi virheitä muistuttavia 'piirteitä' (features), eli ohjelmistoon pesiytynyt sitkeä virhe onkin korjattu muuttamalla dokumentaatio vastaamaan ohjelmiston toimintaa. Ohjelmiston kriittiseksi kooksi sanotaan sitä rajaa, jonka jälkeen yhden virheen korjaaminen keskimäärin aiheuttaa ainakin yhden uuden virheen syntymisen. Näinollen kriittiselle rajalleen kasvaneen ohjelmiston virheitä ei kannata enää summassa ruveta korjailemaan, sillä uusia virheitä syntyy samaa tahtia. Pikemminkin on yritettävä jaotella virheet vakaviin ja vähemmän vakaviin virheisiin, ja pyrittävä ensisijaisesti korjaamaan ne, jotka todella estävät ohjelman käytön. Tällaisessa ympäristössä luonnonvalinta lopulta synnyttää virhepopulaation, joka on enimmäkseen vain hieman häiritsevä. Ohjelmiston kriittiseen kokoon vaikuttavat monet seikat kuten