Ruch 0deps: Lokalne zależności i niezmienne kontrakty
Programiści często instalują setki zewnętrznych bibliotek. Nowoczesne frameworki opierają się na tysiącach zależności przechodnich (transitive dependencies). Oznacza to, że Twoja aplikacja uruchamia kod obcych osób.
Tworzy to ryzyko w łańcuchu dostaw oprogramowania (software supply chain risk).
Każda zależność zwiększa powierzchnię ataku. Może ona:
- Wprowadzać luki w zabezpieczeniach.
- Stać się celem ataków na łańcuch dostaw.
- Zostać porzucona przez utrzymujących (maintainers).
- Zmienić swoje publiczne API.
- Złamać kompatybilność wsteczną.
Ruch 0deps stawia proste pytanie: Co, jeśli Twoja aplikacja polegałaby wyłącznie na kodzie, nad którym masz kontrolę?
W modelu 0deps niezbędne zależności osadzasz bezpośrednio w repozytorium projektu. Przestajesz pobierać je dynamicznie podczas budowania aplikacji. Wszystko, co jest potrzebne do uruchomienia aplikacji, znajduje się w repozytorium od samego początku.
To podejście zapewnia:
- Powtarzalne procesy budowania (reproducible builds).
- Mniejszą zależność od zewnętrznych rejestrów.
- Zcentralizowane audyty bezpieczeństwa.
- Wyższą przewidywalność.
Główną zasadą nie jest utrzymywanie kodu w stanie statycznym. Implementacje i algorytmy muszą ewoluować, aby naprawiać błędy i poprawiać bezpieczeństwo. To, co pozostaje stabilne, to kontrakt publiczny.
Każda biblioteka udostępnia starannie zaprojektowany interfejs. Przykłady obejmują:
authenticate()createSession()verifyPasskey()
Funkcje te definiują kontrakt. Kontrakt nigdy się nie zmienia. Możesz przepisać kod, który za nim stoi, lub całkowicie wymienić bibliotekę. Reszta Twojej aplikacji nie zauważy tej zmiany.
Gdy pojawia się podatność, zazwyczaj mierzysz się z dwoma problemami:
- Naprawienie luki.
- Sprawdzenie, czy aktualizacja nie zepsuje Twojej aplikacji.
W architekturze 0deps drugi problem znika. Aktualizujesz wewnętrzną implementację, podczas gdy publiczne API pozostaje bez zmian. Twoja aplikacja nadal działa bez konieczności wprowadzania zmian w kodzie.
Izolujesz zewnętrzne integracje za pomocą wewnętrznego adaptera: Aplikacja -> Publiczny Interfejs -> Adapter -> Implementacja
Jeśli biblioteka zniknie jutro, zmieniasz tylko adapter. Żadna inna część Twojej aplikacji nie ulegnie awarii.
0deps nie sprawia, że oprogramowanie jest idealne. Zmniejsza ono ryzyka związane z łańcuchem dostaw. Zapobiega problemom takim jak złośliwe pakiety, naruszenia rejestrów czy dependency confusion.
Projekty trwają dziesięciolecia. Biblioteki i frameworki się zmieniają. Dzięki 0deps Twoja aplikacja nadal korzysta z tych samych stabilnych kontraktów, niezależnie od tego, jak ewoluuje ekosystem.
