Skip to main content
Wróć do bloga

Inżynierska dyscyplina: Jak eliminujemy dryf cech planowych w rozrastającym się kodzie SaaS

Rob, CEO & Founder4 min czytania

Po co ten artykuł

To wpis transparentnościowy ze strony operatora, nie pitch sprzedażowy. Chcemy, żeby kupujący z rynku EU mid-market — CTO, szefowie inżynierii, recenzenci compliance — widzieli, jak prowadzimy nasz kod, ponieważ to rozsądny sygnał, jak będziemy obchodzić się z ich danymi.

Konkretnie: gdy produkt SaaS ma wiele poziomów cenowych i wiele flag funkcji, dryf cech planowych jest realną klasą błędów, która może wpływać na to, co klienci widzą i za co płacą. Zamykamy ją mechanicznie. Oto wysokopoziomowy zarys.

Problem: rozproszone sprawdzenia poziomów planu z czasem się rozjeżdżają

Większość rozrastających się baz kodu SaaS gromadzi sprawdzenia poziomów planu w wielu miejscach — w renderingu bramek cenowych, w UI rozliczeń, w komponentach scoringowych, w zaplanowanych zadaniach mailowych. Każde sprawdzenie koduje tę samą intencję: „czy poziom tego klienta obejmuje funkcję X?".

Typowy wzorzec wygląda jak hardcodowana lista nazw poziomów porównywana z poziomem użytkownika. Jest poprawny w dniu, w którym powstał. Miesiące później dodawany jest nowy poziom. Nowy poziom powinien też odblokować funkcję — ale inżynier dodający poziom nie wie, ile równoległych sprawdzeń istnieje, rozproszonych po komponentach pisanych przez różne osoby w różnym czasie.

Jedno sprawdzenie zostaje zaktualizowane. Kilka nie. Klient na nowym poziomie:

  • Widzi funkcję na niektórych stronach
  • Nie widzi jej na innych
  • Dostaje zubożony zaplanowany e-mail, bo sprawdzenie kwalifikowalności w zadaniu cron nie zostało zaktualizowane

To dzieje się po cichu. Żaden wyjątek nie zostaje rzucony. Żadna linia logu nie odpala. Klient po prostu doświadcza niespójnego zachowania — czasem płacąc za funkcję, której nie może w pełni używać.

Przeprowadziliśmy audyt tej klasy dryfu podczas pracy porządkowej w tym kwartale i skonsolidowaliśmy każdą taką bramkę za jedną funkcją wyprowadzającą. Lint opisany poniżej zapewnia, że pozostaje skonsolidowana w miarę dodawania nowych funkcji.

Rozwiązanie: flagi możliwości wyprowadzane po stronie serwera

Logika cenowa żyje w jednym kanonicznym pliku konfiguracyjnym — jednym źródle prawdy, gdzie każdy poziom deklaruje, jakie możliwości obejmuje. Kształt, w abstrakcji:

poziomSredni: {
  features: {
    rozszerzonyRaporting: true,
    integracje: true,
    // każda możliwość zadeklarowana raz, tutaj
  },
}

Nasz uwierzytelniony endpoint użytkownika wyprowadza flagi boolean z tego rejestru, a każda powierzchnia konsumująca odczytuje wyprowadzoną flagę zamiast robić własne porównanie poziomu. Dodajesz nowy poziom? Aktualizujesz jeden plik. Flaga propaguje się wszędzie automatycznie.

Mechaniczna obrona: linting w pre-commit

Jedno źródło prawdy pomaga tylko wtedy, gdy inżynierowie faktycznie z niego korzystają. Napisaliśmy więc lint pre-commit, który skanuje bazę kodu w poszukiwaniu hardcodowanych wzorców list planów o kilku znanych kształtach i odrzuca commity, które je wprowadzają.

Blokuje commit, jeśli znajdzie się jakikolwiek zabroniony wzorzec, z zamkniętą listą dozwolonych wyjątków dla rzadkich uzasadnionych odstępstw, wymagającą ludzkiego uzasadnienia. Nieznane tagi listy dozwolonych wyjątków są odrzucane.

Lint jest idempotentny i szybki — kilkaset plików skanowanych w czasie poniżej sekundy. Działa obok naszych innych guardraili commit-time. Gdy commit zostaje odrzucony, inżynier dostaje praktyczną informację zwrotną w lokalizacji problemu.

Korzyść dla klienta: poprawny dostęp, brak nieoczekiwanych bramek

Widoczny rezultat dla naszych klientów:

  • Poprawny dostęp do możliwości: każdy płacący klient widzi dokładnie te możliwości, które obejmuje jego poziom — nie mniej, nie więcej.
  • Spójna postawa rozliczeniowa: scentralizowane wyprowadzanie zapobiega temu, by jedna część systemu obejmowała poziom w naliczanym zadaniu, którą inna część wyklucza.
  • Przewidywalne downgrade'y: nasz standardowy okres karencji po obniżeniu planu stosuje się jednolicie do każdej możliwości, ponieważ ten sam resolver efektywnego poziomu napędza każdą bramkę.

Czego to jest częścią

Nasz proces inżynierski opiera się na listach kontrolnych zamknięcia, dokumentach plan-of-record oraz utrzymywanym rejestrze wniosków. Praca nad spójnością cech planowych to jeden z wielu podobnych niezmienników, które utrzymujemy mechanicznie — bramki recenzji na dokumentach prawnych, parytet locale, wiring dostępności, dyscyplina promptów na powierzchniach AI i tak dalej.

Publikujemy tego rodzaju wpis, ponieważ kupujący B2B z UE w 2026 mają prawo pytać „jak naprawdę to prowadzicie?" zanim podpiszą Umowę o Powierzeniu Przetwarzania Danych. Odpowiedź dla nas: świadomie, z mechanicznymi obronami i papierowym śladem decyzji.

Jeśli oceniasz HumanKey do swojego stosu intelligencji ruchu, nasze Powierzenie Przetwarzania Danych, Ocena Skutków dla Ochrony Danych, Lista Sub-Procesorów oraz Samoocena DORA są publiczne. Zacznij od tego, czego najpierw potrzebuje Twój zespół compliance.

Bezpłatna wersja próbna, bez karty kredytowej, snippet instaluje się w mniej niż dwie minuty.

Poznaj Swój Ruch AI

Zacznij śledzić crawlery AI odwiedzające Twoją stronę. Bezpłatnie do 1000 weryfikacji miesięcznie.

Rozpocznij za darmo
Inżynierska dyscyplina: Jak eliminujemy dryf cech planowych w rozrastającym się kodzie SaaS | Blog HumanKey