Aplikujesz na ofertę, która wygląda, jakby ktoś napisał ją pod Ciebie: C#, .NET, dokładnie Twój stack. Po 2 tygodniach przychodzi mail: "Dziękujemy, zdecydowaliśmy się na innego kandydata". Trudno, bywa. Tyle że miesiąc później wchodzisz na portal z ogłoszeniami i widzisz tę samą firmę, to samo stanowisko i to samo ogłoszenie - świeżutkie, odnowione. I tak co miesiąc. Od roku.
To nie przypadek. To zjawisko ma swoją nazwę: ghost jobs, a po polsku mówię na nie po prostu oferty-wydmuszki. Firmy publikują ogłoszenia, choć wcale nie planują nikogo na nie zatrudnić. Sam się na to złapałem, a im dłużej obserwuję rynek, tym wyraźniej widzę, że to nie pojedyncze wpadki, tylko masowy mechanizm.
W tym artykule dowiesz się, dlaczego firmy publikują takie ogłoszenia (powodów jest więcej, niż myślisz) i jak rozpoznać wydmuszkę, zanim zmarnujesz wieczór na CV i list motywacyjny. Na koniec - bo to w końcu blog o programowaniu - pokażę Ci prosty Job Tracker w C#, który pomaga ogarnąć chaos w aplikowaniu i wyłapuje podejrzane firmy na podstawie danych, a nie przeczuć.
Wersje .NET: Job Tracker, którego kod pokazuję w dalszej części, działa na .NET 10 (Blazor) i trzyma dane w zwykłym pliku JSON. Sam model i logika wykrywania wydmuszek zadziałają jednak także na starszych wersjach: typ DateOnly jest dostępny od .NET 6, jego wbudowana obsługa w System.Text.Json od .NET 7, a wzorce z or w wyrażeniu is od C# 9.
Moja historia: to samo ogłoszenie co miesiąc
Konkretna sytuacja z mojego podwórka. Jakiś czas temu testowo zaaplikowałem na ofertę: senior .NET developer, fajny opis, technologie się zgadzały. Wysłałem CV i dostałem standardowe potwierdzenie.
Po 2 tygodniach przyszedł mail: "Dziękujemy za zainteresowanie, po analizie zgłoszeń zdecydowaliśmy się kontynuować proces z innym kandydatem". Żadnej rozmowy, żadnego zadania rekrutacyjnego, żadnego kontaktu. OK - może faktycznie ktoś był lepszy.
Tylko że mam pewien nawyk. Szkolę wielu programistów i pomagam im w znalezieniu pracy, więc na bieżąco obserwuję rynek. I co zobaczyłem? Miesiąc później - nowe ogłoszenie tej samej firmy na to samo stanowisko. 2 miesiące później - znowu. To ogłoszenie w różnych wariantach wisi do dziś.
I nie chodzi o jedną firmę. Kiedy zaczniesz świadomie przeglądać portale z ofertami, zobaczysz, że takich firm jest naprawdę sporo: te same nazwy, te same stanowiska, odświeżane w kółko. Celowo nie podaję nazw, bo nie chodzi o to, żeby kogokolwiek linczować. Chodzi o zrozumienie mechanizmu, bo jest on masowy.
Skala zjawiska: to nie teoria spiskowa
Gdyby chodziło tylko o moje obserwacje, można by to zrzucić na pecha albo frustrację. Ale ghost jobs zostały już zbadane, najlepiej na rynku amerykańskim. W ankiecie Resume Builder z maja 2024 roku (649 menedżerów odpowiedzialnych za rekrutację) aż 40% firm przyznało, że w 2024 roku opublikowało ogłoszenie bez zamiaru zatrudnienia. To ok. 4 na 10 firm.
Część rekruterów wcale się z tym nie kryje i mówi wprost: "ogłoszenie wisi, bo zawsze jesteśmy otwarci na ludzi". A w IT zjawisko dodatkowo nasiliło się po fali zwolnień i zamrażaniu rekrutacji.
Czyli to nie jest teoria spiskowa sfrustrowanego kandydata, tylko udokumentowana, powszechna praktyka. Pytanie brzmi: po co firmy to robią?
Dlaczego firmy publikują oferty-wydmuszki? 6 powodów
Powodów jest kilka i część z nich naprawdę zaskakuje. Przejdźmy po kolei.
Powód #1: baza CV "na zapas". To najczęstszy powód. Firma nie ma w tej chwili ani budżetu, ani potrzeby, żeby kogoś zatrudnić, ale chce mieć pipeline kandydatów. Kiedy ktoś z zespołu odejdzie, HR otwiera szufladę, wyciąga gotową listę i dzwoni. Ty czekasz na odpowiedź, a oni budują sobie magazyn CV. Problem? Nikt Ci nie mówi, że aplikujesz do szuflady.
Powód #2: firma chce wyglądać na rosnącą. Ogłoszenia o pracę to także marketing. Dużo otwartych rekrutacji wysyła sygnał: "rozwijamy się, mamy projekty". Działa to na klientów, na inwestorów, a nawet na konkurencję. Klient patrzy i myśli: szukają 5 seniorów .NET, widać mają kontrakty. A czasem nie mają nic, tylko dobrze wyglądają. Ogłoszenie o pracę staje się po prostu darmową reklamą.
Powód #3: stanowisko jest już obsadzone. Klasyka. Decyzja zapadła, zanim ogłoszenie poszło w świat: awans wewnętrzny albo znajomy szefa. Procedury wymagają jednak "otwartej rekrutacji", więc ogłoszenie musi powisieć - dla formalności. Ty wysyłasz CV do procesu, który skończył się, zanim się zaczął, a Twoja aplikacja od początku nie ma żadnych szans.
Powód #4: badanie rynku. Firma chce wiedzieć, ile kosztuje senior z Azure i mikroserwisami i ilu takich kandydatów jest dostępnych od ręki. Zamiast płacić za raport płacowy, wystawia ogłoszenie i zbiera oczekiwania finansowe z formularza. Twoje widełki to dla niej darmowe dane, a Ty robisz jej research za darmo.
Powód #5: sygnał dla obecnych pracowników. Ten powód jest najbardziej paskudny. Niektóre firmy wieszają ogłoszenia po to, żeby obecny zespół widział: "ciągle rekrutujemy na Twoje stanowisko". Pracownik widzi ogłoszenie i czuje, że jest zastępowalny, bo nikt tu nie jest niezastąpiony. Cyniczne? Bardzo. Ale się zdarza - to tania metoda na trzymanie ludzi w niepewności zamiast po prostu dobrze im płacić.
Powód #6: wykupione pakiety, agencje i automaty. Na koniec proza życia, która ma kilka odmian:
• Pakiety ogłoszeń. Ktoś kupił na portalu pakiet 20 ogłoszeń, wykorzystał 8, więc wrzuca cokolwiek, żeby reszta się nie zmarnowała.
• Łowienie CV przez agencje. Część agencji rekrutacyjnych wystawia "atrakcyjne oferty", których... nie ma. To przynęta, dzięki której Twoje CV trafia do ich bazy.
• Automatyczne odnawianie. Czasem to zwykłe niechlujstwo: ogłoszenie odnawia się samo i nikt nie pamięta, że projekt umarł pół roku temu.
6 powodów w pigułce. Podsumowując, oferty-wydmuszki biorą się z:
• budowania bazy CV na zapas,
• dbania o wizerunek rosnącej firmy,
• stanowisk, które już są obsadzone,
• badania rynku i widełek,
• straszenia obecnych pracowników,
• pakietów, automatów i łowienia CV.
Zauważ jedną rzecz: w żadnym z tych scenariuszy nie chodzi o Ciebie. Twoje CV może być świetne. Po prostu po drugiej stronie nie ma prawdziwej rekrutacji. I teraz najważniejsze: jak to rozpoznać, zanim zmarnujesz wieczór na aplikację?
Jak rozpoznać ofertę-wydmuszkę? 5 sygnałów ostrzegawczych
Mógłbym wkleić tu zrzuty konkretnych ogłoszeń, bo wydmuszki od razu rzucają się w oczy, ale nie chcę nikomu robić pod górkę. Zamiast tego skupmy się na sygnałach, na które warto zwracać uwagę. Wystarczy do tego portal z ogłoszeniami i LinkedIn.
Sygnał 1: data publikacji i odnowienia. Większość portali pokazuje, kiedy ogłoszenie zostało dodane. Jeśli widzisz "opublikowano 30+ dni temu" albo zauważasz, że ogłoszenie znika i wraca co miesiąc - zapala się czerwona lampka. Prawdziwa rekrutacja w IT zamyka się zwykle w kilka tygodni.
Sygnał 2: opis kopiuj-wklej. Brak nazwy projektu, brak konkretów o zespole, brak informacji, co właściwie będziesz robić. Same ogólniki: "dynamiczny zespół", "ciekawe projekty", "nowoczesne technologie". Prawdziwe ogłoszenie pisze człowiek, któremu zależy na znalezieniu konkretnej osoby - i to widać.
Sygnał 3: brak widełek. Sam brak widełek to jeszcze nie wyrok, ale w połączeniu z innymi sygnałami - mocna poszlaka. Firma, która naprawdę chce kogoś zatrudnić, wie, ile może zapłacić.
Sygnał 4: hurtownia ogłoszeń. Kliknij w profil firmy na portalu i sprawdź, ile ma otwartych pozycji. 30 otwartych rekrutacji w firmie, która według LinkedIna ma 50 pracowników? Coś tu nie gra.
Sygnał 5: LinkedIn nie kłamie. Wejdź na profil firmy na LinkedInie, otwórz zakładkę "Pracownicy" i sprawdź, kiedy ostatnio ktoś dołączył. Firma "rekrutuje" od roku, a ostatnia nowa osoba pojawiła się 14 miesięcy temu? No właśnie.
Checklista: czy to wydmuszka?
Wszystkie sygnały - plus jeden, który znasz tylko Ty, czyli własną historię aplikacji - możesz sprawdzić w kilka minut. Przejdź przez tę checklistę, zanim zaczniesz dopasowywać CV pod konkretną ofertę:
| Sygnał | Jak to sprawdzić |
| Ogłoszenie wisi albo odnawia się od 30+ dni | Data publikacji na portalu. Ogłoszenie znika i wraca co miesiąc. |
| Opis bez konkretów | Czy wiesz, jaki to projekt, jaki zespół i co będziesz robić? Jeśli nie - same ogólniki. |
| Brak widełek | Sam w sobie to nie wyrok, ale wzmacnia pozostałe sygnały. |
| Podejrzanie dużo otwartych pozycji | Profil firmy na portalu kontra liczba pracowników na LinkedInie. |
| Brak nowych pracowników od miesięcy | LinkedIn: kiedy ostatnio ktoś dołączył do firmy. |
| Odmowa bez żadnej rozmowy, a ogłoszenie wraca | Twoja własna historia aplikacji (jak ją prowadzić - za chwilę). |
3 lub więcej odhaczone punkty = prawdopodobnie szkoda Twojego czasu.
2 pytania do rekrutera. Jest jeszcze jeden trik, tym razem na etapie rozmowy - jeśli w ogóle do niej dojdzie. Zadaj rekruterowi 2 pytania:
1. "Od kiedy trwa ta rekrutacja?"
2. "Dlaczego to stanowisko jest otwarte - ktoś odszedł, czy zespół rośnie?"
Po reakcji bardzo dużo poznasz. Konkretna odpowiedź to dobry znak. Kluczenie i ogólniki - wiesz, na czym stoisz.
Strategia kandydata: co z tym zrobić?
Skoro wiesz już, skąd biorą się wydmuszki i jak je rozpoznać, czas na praktyczne wnioski:
• Nie personalizuj godzinami CV pod podejrzane oferty. Czas na dopasowanie aplikacji zostaw na ogłoszenia, które przechodzą checklistę.
• Aplikuj szeroko, ale śledź swoje aplikacje. Bez tego nie zobaczysz żadnych wzorców.
• Wracaj do ogłoszeń po miesiącu. Wydmuszki same się zdradzą, bo wrócą na portal.
• Stawiaj na polecenia i kontakt bezpośredni, a nie tylko na portale z ogłoszeniami.
Najważniejsza rada jest jednak inna: nie bierz odmów do siebie. Jak widać po 6 powodach opisanych wyżej, odmowa często nie ma nic wspólnego z Twoimi umiejętnościami.
Druga rzecz to śledzenie aplikacji. Większość ludzi aplikuje na 30-50 ofert i po kilku tygodniach traci kontrolę: gdzie poszło CV, kiedy, co odpowiedzieli, czy ogłoszenie wróciło? A to właśnie te dane pozwalają wyłapać wydmuszki. I tu dochodzimy do części dla programistów.
Job Tracker w C#: wydmuszki wyłapane na danych
Zrobiłem sobie mini Job Trackera w C# - w Blazorze, żeby ładnie wyglądał. .NET 10, dane w zwykłym pliku JSON, zero bazy danych. Wpisuję do niego każdą firmę, do której aplikowałem, jej status (odrzucili czy zignorowali) i datę za każdym razem, gdy zauważę, że ogłoszenie wróciło na portal.
Na ekranie widać tabelę wszystkich aplikacji z kolorowymi plakietkami statusów i osobną sekcję "Podejrzane wydmuszki", na której górę aplikacja sama wypycha podejrzanych. U mnie na szczycie jest GhostSoft, który mnie zignorował, a potem wrócił z ogłoszeniem aż 4 razy, a za nim Mielarnia CV i Evergreen. (To oczywiście zmyślone przykłady, zanim ktoś zapyta.)
Liczy się powtarzalność. Najważniejsza zasada tej aplikacji brzmi: 1 powrót ogłoszenia to jeszcze nie wydmuszka. Ktoś mógł odejść z zespołu - to normalna rotacja. Dlatego w trackerze jest suwak "Próg powrotów". Przy progu 2 firma Korpo Holding nie trafia na listę, bo jej ogłoszenie wróciło tylko raz. Wystarczy zejść z progiem do 1 i od razu na nią wskakuje. Czerwona flaga to powtarzalność, czyli to samo ogłoszenie wracające w kółko po kolejnych odmowach.
Model: 1 kluczowe pole. Pod maską to dosłownie kilka linijek. Model to zwykła klasa z jednym naprawdę ważnym polem:
public class JobApplication
{
public string Company { get; set; } = "";
public string Position { get; set; } = "";
public string OfferUrl { get; set; } = "";
public DateOnly AppliedOn { get; set; }
public ApplicationStatus Status { get; set; }
public List<DateOnly> RepostedOn { get; set; } = new(); /* kluczowe! */
public string Notes { get; set; } = "";
}
public enum ApplicationStatus
{
Sent, Interview, Rejected, Offer, Ghosted
}RepostedOn to lista dat powrotów, a nie jedna data. Właśnie dlatego, że sygnałem jest powtarzalność, a nie pojedynczy powrót ogłoszenia. Z kolei enum ApplicationStatus pokrywa cały cykl życia aplikacji: wysłana (Sent), rozmowa (Interview), odmowa (Rejected), oferta (Offer) albo cisza po drugiej stronie (Ghosted).
Wykrywanie wydmuszek: 1 zapytanie LINQ. Całe "wykrywanie" to ten kawałek kodu:
public static IEnumerable<JobApplication> FindLikelyGhostJobs(
List<JobApplication> applications,
int minReposts = 2)
{
return applications
.Where(a =>
a.Status is ApplicationStatus.Rejected or ApplicationStatus.Ghosted
&& a.RepostedOn.Count >= minReposts)
.OrderByDescending(a => a.RepostedOn.Count);
}Jeśli firma Cię odrzuciła albo zniknęła, a jej ogłoszenie wróciło co najmniej 2 razy (domyślna wartość minReposts), aplikacja ląduje na liście - posortowanej od najczęściej wracających. Warunek a.Status is ApplicationStatus.Rejected or ApplicationStatus.Ghosted to wzorzec z C# 9, który sprawdza, czy status ma jedną z 2 wartości, a operator && dokleja do niego drugi warunek. Parametr minReposts to dokładnie ten suwak "Próg powrotów" z interfejsu - w Blazorze wystarczy zwykły <input type="range"> powiązany z nim przez @bind.
I uczciwie: to nie żadna magia ani AI. To Ty karmisz aplikację danymi, a ona tylko liczy i pokazuje wzorzec, którego gołym okiem nie wyłapiesz.
Zapis do JSON-a. Skoro nie ma bazy danych, odczyt i zapis to kilka linijek z System.Text.Json, np.:
private static readonly JsonSerializerOptions JsonOptions = new()
{
WriteIndented = true,
Converters = { new JsonStringEnumConverter() }
};
public static List<JobApplication> Load(string path) =>
File.Exists(path)
? JsonSerializer.Deserialize<List<JobApplication>>(File.ReadAllText(path), JsonOptions) ?? new()
: new();
public static void Save(string path, List<JobApplication> applications) =>
File.WriteAllText(path, JsonSerializer.Serialize(applications, JsonOptions));Dzięki JsonStringEnumConverter statusy trafiają do pliku jako tekst ("Ghosted"), a nie jako liczby, więc plik łatwo przejrzeć i w razie potrzeby poprawić ręcznie. Typ DateOnly System.Text.Json obsługuje bez dodatkowej konfiguracji.
Twarde dane zamiast domysłów. Po 2-3 miesiącach aplikowania masz twarde dane: które firmy realnie rekrutują, a które tylko mielą CV - i do których nie warto już nigdy aplikować. Całość, z zapisem do JSON-a i statystykami, to 1-2 godziny roboty. To przy okazji świetny projekt na start, jeśli uczysz się C#: masz tu LINQ, enumy, serializację, pracę z plikami i Blazora.
Podsumowanie
Zbierzmy najważniejsze wnioski:
• Oferty-wydmuszki to realne, masowe zjawisko. Firmy publikują ogłoszenia z wielu powodów, które nie mają nic wspólnego z zatrudnieniem Ciebie: baza CV, wizerunek, obsadzone stanowisko, badanie rynku, straszak na pracowników, pakiety i automaty.
• Da się je rozpoznać: data ogłoszenia, ogólnikowy opis, brak widełek, liczba otwartych pozycji i LinkedIn. 3 lub więcej punktów z checklisty = szkoda czasu.
• Śledź swoje aplikacje. Najmocniejszym sygnałem jest powtarzalność, a prosty tracker w C# wyłapie ją za Ciebie.
• Odmowa z takiej firmy nie mówi nic o Tobie jako programiście.
Jeśli szukasz pracy w .NET albo po prostu chcesz być na bieżąco z tym, co dzieje się w ekosystemie, mam coś dla Ciebie. Prowadzę społeczność programistów .NET - jest nas już ponad 10 000. Raz w tygodniu wysyłam maila z najważniejszymi newsami ze świata .NET i C# oraz z rzeczami, które realnie warto znać - bez spamu i bez lania wody. Członkowie społeczności dostają też rabaty na moje kursy: zawsze jako pierwsi i zawsze największe.
Jeśli chcesz dołączyć, zostaw swój adres tutaj: modestprogrammer.pl/vip. Powodzenia w szukaniu pracy - i oby trafiały Ci się same prawdziwe rekrutacje :)