Wielki projekt, nad którym pracuję od kilku lat, to aplikacja kontrolna (i wszystko) zaawansowanego urządzenia, stanowiącego serce jego oprogramowania układowego.
Urządzenie jest dość zaawansowane, ma więcej funkcji niż mogłem powiedzieć z pamięci, a 98% z nich jest obsługiwanych przez ten jeden ogromny plik wykonywalny. Z jednej strony program jest dość łatwy w utrzymaniu, dobrze zmodularyzowany w środku, odpowiednio udokumentowany, istnieje rozsądny podział funkcji na katalogi i pliki i tak dalej.
Ale ostatecznie wszystko jest skupione w jednej aplikacji, która robi wszystko, od zdalnej komunikacji z bazą danych, obsługi ekranu dotykowego, obsługi kilkunastu różnych protokołów komunikacyjnych, pomiarów, kilku algorytmów sterowania, przechwytywania wideo, godziny wschodu słońca i daty Wielkanocy (poważnie, i są one potrzebne do bardzo poważnych celów!) ... Ogólnie rzecz biorąc, rzeczy, które są bardzo cienko powiązane, często powiązane tylko przez niektóre dane, które przeciekają między odległymi modułami.
Można to zrobić jako kilka oddzielnych plików wykonywalnych komunikujących się ze sobą, powiedzmy, ponad gniazdami, w bardziej szczegółowym celu, może być ładowanych / rozładowywanych w razie potrzeby i tak dalej. Nie ma konkretnego powodu, dla którego jest tak wykonany.
Z jednej strony działa i działa dobrze. Projekt jest prostszy, bez utrzymywania kompilacji wielu plików binarnych. Struktura wewnętrzna jest również łatwiejsza, gdy można po prostu wywołać metodę lub odczytać zmienną zamiast rozmawiać przez gniazda lub pamięć współdzieloną.
Ale z drugiej strony, rozmiar, skala tej rzeczy po prostu mnie przeraża, mam wrażenie, że pilotuję Titanica. Zawsze uczono mnie modularyzacji, a zlepianie wszystkiego w jeden gigantyczny plik wydaje się błędne. Jednym z problemów, jaki znam, jest poważna awaria jednego (nawet nieznacznego) modułu, który powoduje awarię wszystkich - ale jakość kodu zapewnia, że tak się nie dzieje w wersjach wydanych. W przeciwnym razie separacja wewnętrzna i programowanie obronne zapewnia, że nadal będzie działało poprawnie, nawet jeśli z jakiegoś powodu połowa wewnętrznych modułów ulegnie awarii.
Jakie inne niebezpieczeństwa przeoczyłem? Dlaczego mnie to przeraża? Czy to tylko irracjonalny strach przed nieznanym? Czy robienie poważnych dużych projektów w ten sposób jest akceptowaną praktyką? Albo uspokój moje obawy, albo daj mi dobry powód do przefakturowania wersji 2.0 na wiele mniejszych plików binarnych.