Charakterystyczną cechą systemów legacy jest wysoki poziom trudności ich dalszego rozwoju czy modyfikacji aktualnej funkcjonalności, połączony często z niską wydajnością i ergonomią użytkowania. Składa się na to szereg przeplatających się wzajemnie czynników.
Niska jakość kodu
Długa historia systemu oznacza, że kod rozwijany był przez lata przez różne zespoły, o różnych kompetencjach i często na zasadzie „łatania”, bez głębszej analizy i dbałości o logiczną spójność czy optymalizację. Prowadzi to najczęściej do nieakceptowalnego obniżenia szybkości działania aplikacji oraz mocno komplikuje diagnostykę pojawiających się problemów.
Skomplikowane zależności
Lata spontanicznego rozwoju skutkują zanikiem modułowości, czyli jasno określonej funkcjonalności modułów i relacji między nimi. Trudno identyfikowalne zależności pomiędzy obszarami funkcjonalnymi systemu wymagają poświęcenia często nieprzewidywalnej ilości zasobów na ich analizę, niezbędną przed wprowadzeniem zmian (impact analysis). Upraszczając — trudno przewidzieć, jakie, mniej lub bardziej ukryte, błędy pojawią się w różnych miejscach aplikacji, jeżeli zmienimy coś w jednym z nich.
Skomplikowany interfejs użytkownika
Trudność modyfikacji systemu powoduje, że zmiany wprowadzane są często na zasadzie „doklejania” kolejnych elementów (pól, przycisków), bez zachowania kontekstu, konsekwencji nazewniczej i spójności z istniejącą logiką aplikacji. Dochodzi również do sytuacji, w której — z braku dedykowanej funkcjonalności — podejmowane są decyzje o stosowaniu obejść, w postaci wprowadzania istotnych danych w polach komentarzy lub innych do tego nieprzeznaczonych. Poza zmniejszoną czytelnością aplikacji i zwiększoną podatnością na błędy użytkowników, powoduje to utrudnienia, m.in. w raportowaniu czy integracji z innymi systemami.
Ograniczona dostępność interfejsu użytkownika
Dość typową cechą oprogramowania starszej generacji jest interfejs użytkownika, który — jeśli nawet działa w przeglądarce internetowej — realizowany jest w sposób statyczny, dostosowany zawartością i rozmiarem do z góry założonej rozdzielczości monitorów. Wyklucza to lub znacząco utrudnia wykorzystanie go na, popularnych obecnie, różnego rodzaju urządzeniach mobilnych. Oczywiście, ciągle można spotkać jeszcze bardziej uciążliwe rozwiązania, opierające się o tzw. „grubego klienta”, czyli specjalne oprogramowanie instalowane i konfigurowane na stacjach roboczych użytkowników, co jeszcze bardziej ogranicza jego dostępność.
Przestarzała lub źle zastosowana technologia
Niektóre starsze technologie nie oferują kluczowych mechanizmów — lub oferują je w sposób nieefektywny — niezbędnych do zapewnienia wysokiej jakości tworzonych aplikacji. Dobrym przykładem jest brak automatycznych mechanizmów kontroli spójności danych (tzw. database constraints), co sprawia, że każda zmiana w kodzie wiąże się z ogromnym ryzykiem wprowadzenia błędów. Błędy te mogą prowadzić do trudnych do wykrycia zaburzeń logiki danych, a w konsekwencji — do poważnych, trudnych do przewidzenia zagrożeń biznesowych, takich jak nieprawidłowo działające usługi czy błędy w rozliczeniach z klientami.
Niska dostępność specjalistów
Ze względu na wiek zastosowanych technologii oraz długi czas życia systemów, dostępność posiadających odpowiednią wiedzę specjalistów jest bardzo ograniczona, a ich usługi — kosztowne.
Konkluzja
1. Trudności z implementacją nowych wymagań biznesowych jako bezpośredniej modyfikacji systemu legacy.
2. Nieefektywność i ograniczone bezpieczeństwo użytkowania systemu legacy.