Det finns många olika orsaker och det är egentligen samma sak som en dåligt snickerijobb.
Första rent självklara orsaken så kan såklart utövaren vara dålig/slarvig.
Men ofta man har ett problem. Det finns femhundraelvamiljarder sätt att lösa problemet på, vissa sätt är alltid korkade, andra beror på en mängd faktorer som det exakta problemet, vilken kompetens/verktyg arbetarna besitter och hur man tror framtiden utvecklas. Sedan kan man stöta på buggar i de verktyg man använder och det gäller att ha väl kännedom om dem redan innan man påbörjar.
Ett problem är att en seniorutvecklare idag kostar runt 1500kr/h och måste ha 100% faktueringsgrad. Det blir väldigt snabbt dyrt. Och ens lösningar består mycket av copypaste kod. Man kan då få en lösning som inte helt är optimerad för ens lösning, hade man själv lagt ner 8h extra på att skriva en själv så hade den blivit bättre. Men vill kund betala 12 000kr extra för detta? Det beror på, är det en funktion som inte används så ofta nej. Och även om man kan tycka denna engångskostnad är liten så stöter man på samma dilemma hela tiden.
*edit*
Snickare har för övrigt liknande dilemma. De kan göra mycket själv, men börja inte ge sig på att tillverka skräddarsydda möbler och annat som finns färdigt om ni inte har en otrolig köpkraftig kund.
*edit2*
Exempel på frågeställning vad som är en bra lösning.
Jag har utvecklat en mängd verktyg helt på egen fritid. Vissa av dessa verktyg körs helt singeltrådat förutom guit såklart.
Jag kan supersnabbt ändra foreach till for Parallel.ForEach och få säg 20% bättre prestanda. Jag kan gå in i iodelen och anpassa den och säkerligen få upp prestandan flera hundra procent.
Men vilken lösning är bäst? Jag har i mitt fall kommit fram till det enkla singeltrådade, då det är så otroligt enkelt att felsöka och underhålla. Verktygen börjar från ett ställe, skulle det bli något fel så kan man så enkelt felsöka därifrån. -Jag får indata från 3:e part som kan innehålla konstigheter.
Multitrådade lösning med ökad prestanda kräver dessutom mycket mer utvecklingstid.
*edit3*
Ett annat problem har varit att anpassa saker till gammal hårdvara. Jag har struntat i stöd för sämre än fullhd hur länge som helst och användare av ett sämre mobiler/laptop har klagat. Och man har svarat dem att så här mycket kostar det att bygga om för din hårdvara, det blir billigare för er att köpa ny telefon/laptop.
Och nej i alla miljöer är det inte bara ändra lite layout. Så kostnaden för att stöda 1600*900 upplösningen uppskattar man kanske till 100 000kr.