Kiedyś, na początku mojej komercyjnej kariery, zadawałem podobne pytania co ty tutaj. Szukałem "normalnej" firmy, w której nie ma "gównianego kodu" i przerośniętych "biznesowych kobył". Później zrozumiałem, że realia prawie każdego projektu są takie, że w kodzie tworzy się skomplikowana sieć powiązań, często cyklicznych, a to z kolei powoduje, że ciężko modernizować kod krok po kroku. W Sabre pracowałem nad projektem legacy i nasz team lead, spoko koder w miarę ogarniający system, próbował rozciąć przerośnięte moduły "common" czy tam jakiś "core" i chyba na własną rękę siedział nad tym tygodniami i się poddał.
Hakowanie systemu to chętnie wybierana droga na skończenie zadania, bo wydłużanie terminów dla wprowadzenia szerokich aktualizacji jest mało prawdopodobne jeśli nie mamy dobrego alibi. Wymagania systemów ewoluują i ciężko wymyślić architekturę, która będzie optymalna na wiele lat czy nawet miesięcy naprzód. Obecnie pracuję w systemie opartym o mikroserwisy i te sprawdzają się nieźle. Mikroserwisy są na tyle małe, że np wymianę biblioteki do dostępu do bazy danych (z Lift Mappera na Slicka 3) w pewnym mikroserwisie zrobiłem w ciągu jednego sprintu przy okazji rozwiązywania problemu z wydajnością. Wymiana warstwy dostępu do bazy danych we wszystkich mikroserwisach naraz zajęłaby pewnie wiele miesięcy i ciężko byłoby przekonać do tego zarząd.
Zakładasz też, że problem dotyczy tylko Javy, a prawda jest taka, że problem dotyczy wszystkich dużych projektów. Duże zwykle były rozwijane przez wiele lat, więc logiczne że nie dało się ich stworzyć w technologiach, których jeszcze nie było, więc jeśli nie były aktualizowane to są przestarzałe. Liczne powiązania w kodzie uniemożliwiają stopniową aktualizację architektury. Nawet migracja z Pythona 2 na Pythona 3 w Linuksowych dystrybucjach była bolesna i chyba nawet takie Ubuntu dalej nie przeniosło się całkowicie na Pythona 3 - mimo, że mają sporo programistów.
Moim zdaniem problem leży w programistach właśnie, a nie w zarządach. Zarząd nie jest w stanie określić czy pomysły programistów są słuszne. Nie można zaprzestać rozwoju projektu na wiele miesięcy, bo zmiany na rynku sprawią, że produkt przestanie spełniać wymagania klientów i regulatorów. Rozwój musi odbywać się płynnie, a zarząd musi widzieć, że zmiany przynoszą jakąś korzyść. Jak na razie najlepszym rozwiązaniem dla aplikacji biznesowych jest według mnie architektura mikroserwisów komunikujących się po REST/ JSON. Dzięki takiemu podejściu:
- nie ma wielkich sieci powiązań w kodzie, bo wymagałoby to tworzenia rozległych API dla mikroserisów, a to jest bardziej upierdliwe i czasochłonne niż zaprojektowanie powiązań przyzwoicie,
- odpowiedzialności są dobrze podzielone między mikroserwisy, gdyż zła segregacja odpowiedzialności poskutkowałaby koniecznością przesyłania niepotrzebnie dużej ilości danych między mikroserwisami,
- można aktualizować stosy technologiczne mikroserwisów niezależnie - są one powiązane jedynie ustandaryzowanym protokołem tekstowym do którego zawsze i wszędzie jakieś sensowne biblioteki się znajdą,
W skrócie - problem leży w programistach, którzy nie potrafią tworzyć systemów, które można płynnie (po kawałku) modernizować.