jest natychmiastowe współtworzenie programu i jego dokumentacji opisywanie (w komentarzach i dokumentacji) założeń przyjętych podczas pisania danego fragmentu kodu (np. co do typów danych wejściowych, czy spodziewanego sposobu użycia) unikanie trudnych w analizie konstrukcji (jak instrukcja skoku, czy ewaluacja kodu w trakcie wykonania) używanie narzędzi wykrywających podejrzane fragmenty kodu (np. lint), włączenie ostrzeżeń kompilatora o napotkaniu konstrukcji będących częstym źródłem błędów (np. if(a=b)... zamiast if(a==b)...) ręczne audyty kodu

Czasem błędy wykrywa się przez wprowadzanie do programu losowych danych i sprawdzanie otrzymywanych odpowiedzi. Ponieważ typowe błędy dotyczą wielu danych, wykrywa się w ten sposób większość błędów.

Bardzo rzadko przeprowadza się dowody matematyczne programów. Nawet one nie dają jednak gwarancji poprawnego działania programu, ponieważ nie jest pewne, że model zachowania programu jest bezbłędny (jeśli ta sama osoba pisała kod i dowód, to ten sam błąd mógł się pojawić w obu), ani też, że zastosowany model matematyczny odpowiada rzeczywistości (np.