Przewidywanie przyszłości ma niewiele wspólnego z wprowadzeniem abstrakcji. Poza tym wielu myli abstrakcję z przekierowaniem.
Abstrakcje się stosuje kiedy ma ona sens i kiedy jej wprowadzenie upraszcza projekt tu i teraz. Dobry programista potrafi tworzyć sensowne abstrakcje nawet jeśli mają tylko jedno użycie, a słaby często właśnie tworzy bezładna kupę błota, nawet jeśli użyć jest N. Abstrakcja to jest podstawowe narzędzie walki ze złożonością. Większość dużych projektów staje się trudna do rozwoju przez niedobór abstrakcji, a nie nadmiar. Ewentualnie przez mocno cieknące abstrakcje.
Konkretny przykład - jest sobie indeks bazy danych. Indeks to taka struktura, która mapuje klucze na offsety we właściwym pliku danych. Indeks jest pewnego rodzaju abstrakcja, bo zachowuje pewne niezmienniki niezależnie od tego jakie typy danych indeksuje. Np. należy spodziewać się, że offset odczytany z indeksu będzie mniejszy niz rozmiar pliku danych (indeks jak i plik są niemutowalne).
Teraz ktoś wymyślił, że z jednego serwera na drugi serwer prześle kawałek pliku z danymi oraz indeks. No ale po pokawałkowaniu pliku danych offsety w indeksie przestają się zgadzać z plikiem danych, bo dane się przesunęły. Więc co zrobił programista uber-senior z 20 lat doświadczenia? Dołożył flagę "plik był kopiowany od offsetu X do offsetu Y" i w miejscu użycia offsetu z indeksu (tj. po odpytaniu indeksu) dopisał kod poprawiający offset, tak aby nadal był w zakresie.
I tak całą abstrakcję indeksu szlag trafił. I nie ważne, że indeks jest użyty na razie jeden raz, nie ma duplikacji kodu i kod działa. Teraz jednak przy każdym nowym użyciu musisz wiedzieć, czy był kopiowany czy nie. Odkładanie poprawiania takich baboli do drugiego lub trzeciego użycia (tak, bo wtedy wyszłaby dopiero duplikacja kodu) to bardzo poważny błąd. Mniej w kodzie taki jeden wtf na każde 3 klasy i powodzenia w utrzymaniu go.