Przejdź do treści
Jakub Zając

02 / Aplikacja do wyszukiwania atrakcyjnych ofert

ThomasSeeker

System, który zamienia ręczne przeglądanie rozproszonych ofert w zautomatyzowany proces: zbiera dane, porządkuje je i powiadamia użytkownika, gdy pojawi się okazja pasująca do jego kryteriów.

Klient
[DO UZUPEŁNIENIA / TO BE PROVIDED: dla kogo powstała aplikacja — zleceniodawca lub produkt własny]
Usługi
Tworzenie oprogramowaniaAutomatyzacja i integracjeBazy danych i dane

Przegląd

Atrakcyjne oferty mają jedną wspólną cechę: znikają szybko. Kto śledzi je ręcznie, przegląda te same źródła po kilka razy dziennie i mimo to regularnie dowiaduje się o okazji już po fakcie. ThomasSeeker odwraca ten układ — to system, który sam zbiera dane o ofertach z obszaru [DO UZUPEŁNIENIA: branża lub rodzaj ofert], porządkuje je i podaje użytkownikowi w formie gotowej do decyzji.

Zbudowałem całość: mechanizmy automatycznego pozyskiwania danych, warstwę ich przetwarzania i porządkowania, wyszukiwarkę z filtrami, system powiadomień o okazjach oraz interfejs, w którym użytkownik przegląda wyniki i zarządza swoimi kryteriami. Wszystkie elementy pracują na wspólnym modelu danych, więc oferta raz pozyskana jest od razu dostępna w wyszukiwaniu i brana pod uwagę przy powiadomieniach.

Z pozoru to aplikacja z listą ofert. W praktyce to przede wszystkim problem danych i automatyzacji: wartość produktu zależy od tego, czy pozyskiwanie działa bez nadzoru, czy dane są świeże i czy z tysięcy wpisów użytkownik dostaje właśnie te, które go interesują.

Wyzwanie

Dane o ofertach pochodzą z różnych źródeł, a każde z nich ma własny format, własne braki i własny rytm zmian. Ta sama oferta potrafi pojawić się w kilku miejscach w różnych wariantach, opisy bywają niekompletne, a struktura źródła zmienia się bez ostrzeżenia. System musiał to wszystko sprowadzać do jednego, porządnego modelu — z deduplikacją, walidacją i odpornością na zmiany po stronie źródeł. Do tego dochodzi czas: okazja odkryta po godzinach jest często bezwartościowa, więc świeżość danych była wymaganiem projektowym, nie miłym dodatkiem.

Drugie wyzwanie to trafność. System, który powiadamia o wszystkim, uczy użytkownika ignorowania powiadomień — czyli sam pozbawia się sensu. Kryteria musiały być na tyle precyzyjne, żeby sygnał docierał tylko przy realnym dopasowaniu, a całość na tyle niezawodna, żeby działać tygodniami bez ręcznej interwencji. Cisza w takim systemie ma dwa znaczenia: albo nie ma okazji, albo coś się wysypało — i użytkownik musi mieć pewność, które z nich jest prawdą.

Moja rola

Prowadziłem projekt od początku do końca jako jedyny wykonawca: zaprojektowałem architekturę i model danych, zbudowałem mechanizmy pozyskiwania i przetwarzania danych, backend z wyszukiwaniem i powiadomieniami oraz interfejs użytkownika. Odpowiadałem też za uruchomienie i utrzymanie automatyzacji — czyli za tę część systemu, która musi działać, gdy nikt na nią nie patrzy.

Rozwiązanie

01

Automatyczne pozyskiwanie danych

Dane o ofertach zbierają zadania uruchamiane według harmonogramu, osobno dla każdego źródła. Każde źródło ma własny adapter — niewielki moduł, który zna jego specyfikę i tłumaczy ją na wspólny format. Częstotliwość odpytywania dobrałem do rytmu zmian w danym źródle, z poszanowaniem jego ograniczeń: system ma zbierać dane skutecznie, ale w sposób przewidywalny i kulturalny.

02

Przetwarzanie i porządkowanie danych

Surowe dane przechodzą przez warstwę przetwarzania: czyszczenie, walidację, ujednolicanie pól i wykrywanie duplikatów, tak żeby ta sama oferta z dwóch źródeł nie występowała w systemie podwójnie. Obok znormalizowanych rekordów zachowuję dane źródłowe — gdy reguły przetwarzania się zmieniają, całą historię można przeliczyć od nowa bez ponownego pozyskiwania.

03

Wyszukiwanie i filtrowanie

Uporządkowane dane zasilają wyszukiwarkę z filtrami odpowiadającymi temu, jak użytkownik naprawdę ocenia oferty — od podstawowych parametrów po [DO UZUPEŁNIENIA: kryteria specyficzne dla rodzaju ofert]. Zestaw filtrów można zapisać jako profil wyszukiwania i wracać do niego jednym kliknięciem; te same profile są podstawą systemu powiadomień.

04

Powiadomienia o okazjach

Każda nowa lub zmieniona oferta jest po stronie serwera porównywana z zapisanymi profilami użytkownika. Dopasowanie uruchamia powiadomienie przez [DO UZUPEŁNIENIA: kanał powiadomień — np. e-mail lub powiadomienia push], z najważniejszymi parametrami oferty i bezpośrednim przejściem do szczegółów. Użytkownik nie musi niczego odświeżać ani sprawdzać — to system pilnuje rynku za niego.

05

Interfejs użytkownika

Interfejs podporządkowałem jednemu zadaniu: szybkiej ocenie, czy oferta jest warta uwagi. Lista wyników pokazuje od razu parametry decydujące o atrakcyjności, widok szczegółów zbiera komplet informacji w jednym miejscu, a zarządzanie profilami wyszukiwania nie wymaga żadnej wiedzy technicznej.

06

Niezawodność i nadzór nad automatyzacją

Automatyzacja jest monitorowana: nieudane zadania są ponawiane, a problem ze źródłem — na przykład zmiana jego struktury — generuje alert zamiast cichej luki w danych. Awaria jednego adaptera nie zatrzymuje pozostałych ani samej aplikacji, więc pojedyncze źródło może chwilowo milczeć, ale system jako całość pracuje dalej.

Stos technologiczny

Backend i logika aplikacji

  • [DO UZUPEŁNIENIA / TO BE PROVIDED: język i framework backendu]

Automatyzacja i przetwarzanie danych

  • [DO UZUPEŁNIENIA / TO BE PROVIDED: mechanizm harmonogramowania zadań]
  • [DO UZUPEŁNIENIA / TO BE PROVIDED: narzędzia do pozyskiwania i przetwarzania danych]

Baza danych i wyszukiwanie

  • [DO UZUPEŁNIENIA / TO BE PROVIDED: silnik bazy danych]
  • [DO UZUPEŁNIENIA / TO BE PROVIDED: mechanizm wyszukiwania, jeśli odrębny od bazy]

Interfejs użytkownika

  • [DO UZUPEŁNIENIA / TO BE PROVIDED: technologia frontendu lub platforma aplikacji]

Decyzje inżynierskie

  • 01

    Rozdzieliłem pozyskiwanie danych od części serwowanej użytkownikowi — awaria czy spowolnienie któregoś źródła nigdy nie kładzie aplikacji, a użytkownik zawsze pracuje na ostatnim spójnym stanie danych.

  • 02

    Obok znormalizowanych rekordów przechowuję dane surowe. Gdy zmieniają się reguły porządkowania albo pojawia się nowy atrybut ofert, przeliczam historię z tego, co już mam, zamiast pozyskiwać wszystko od nowa.

  • 03

    Dopasowania do kryteriów liczy serwer w momencie pojawienia się oferty, a nie klient przez cykliczne odpytywanie — powiadomienia przychodzą szybko i tanio, niezależnie od tego, czy użytkownik ma otwartą aplikację.

  • 04

    Każde źródło danych stoi za wspólnym interfejsem adaptera. Dodanie nowego źródła to napisanie jednego modułu, bez zmian w rdzeniu systemu — to świadoma inwestycja w rozwój produktu.

Bezpieczeństwo i niezawodność

  • Pozyskiwanie danych zaprojektowałem odpowiedzialnie: z limitami częstotliwości, identyfikowalnym ruchem i poszanowaniem zasad korzystania ze źródeł — automatyzacja nie może działać kosztem systemów, z których czerpie.

  • Dane kont użytkowników ograniczyłem do niezbędnego minimum, dostęp do systemu wymaga uwierzytelnienia, a komunikacja z backendem jest szyfrowana.

  • Klucze i dane dostępowe do źródeł trzymam poza kodem, w konfiguracji środowiska — nie trafiają do repozytorium i można je rotować bez zmiany ani jednej linijki aplikacji.

  • Wszystkie dane przychodzące ze źródeł traktuję jako niezaufane — przechodzą walidację i sanityzację, zanim trafią do bazy i do interfejsu, więc wadliwy lub złośliwy wpis nie zagraża systemowi ani użytkownikowi.

Efekt

Ręczne przeglądanie rozproszonych źródeł zastąpił jeden, uporządkowany widok rynku — z wyszukiwaniem i filtrami, które odpowiadają rzeczywistym kryteriom decyzji.

Czas od pojawienia się oferty do momentu, w którym użytkownik o niej wie, skrócił się z rytmu ręcznego sprawdzania do automatycznego powiadomienia — a w polowaniu na okazje to właśnie ta różnica rozstrzyga.

System pracuje bez nadzoru i jest przygotowany na rozbudowę: kolejne źródła danych i nowe kryteria można dodawać bez przebudowy fundamentów.

Galeria

Inne realizacje

Porozmawiajmy o Twoim projekcie

Chętnie opowiem, jak podobne podejście sprawdziłoby się w Twoim przypadku — i czego bym uniknął.