O wyrażeniach regularnych. Podstępna różnica pomiędzy find i matches

Wyrażenia regularne to jedno z zagadnień dzielących programistów. Są tacy, którzy je uwielbiają i ci, którzy szczerze ich nienawidzą.

Sama zaliczam się do pierwszej grupy, być może z powodu upodobań lingwistycznych (wyrażenia regularne ≈  języki regularne ≈ automaty skończone). Wyrażenia regularne pozwalają na bardzo zwięzły i precyzyjny zapis warunków wyszukiwania, które – gdyby ograniczyć się do tradycyjnych konstrukcji zawartych w danym języku programowania – mogłyby zająć wiele linii. Po stronie minusów należy zapisać trudność zrozumienia dłuższych wyrażeń regularnych, zwłaszcza, jeśli są dziełem kogoś innego.

W tym wpisie chcę podzielić się swoją niedawną przygodą optymalizacyjną. W najbliższym czasie (czyli przed końcem roku) wrzucę jeszcze stary tekst o pułapkach, w które można wpaść pisząc wyrażenia regularne w Javie oraz nowy o tym, jak regeksy mogą przydać się nieprogramistom w ich codziennych zadaniach.

Do rzeczy.

Napisałam ostatnio kod analizujący treść stron internetowych. Mniejsza z tym, po co to robił. Stanowił część większej całości (moduł mavenowy) i podobnie jak reszta kodu korzystał m.in. z Javy 8 i biblioteki JSoup. Napisałam masę testów jednostkowych, testowałam na kilkuset stronach… Jednak prawdziwa próba ognia miała nadejść kilka dni po oddaniu przeze mnie projektu, podczas uruchomienia pełnego łańcucha przetwarzania na kilkudziesięciu (kilkuset?) tysiącach stron.

W pięciu przypadkach mój kod zawiesił się na ponad dobę.

Naprawa, kiedy już do niej zasiadłam zajęła mi niecałą godzinę. Co się okazało? W kilku miejscach w moim kodzie użyłam metody Element::getElementsByAttributeValueMatching i dałam się zwieść nazwie. Na swoją obronę mam to, że Javadoc też wprowadza w błąd. Otóż wyobraziłam sobie, że gdzieś w głębinach metoda wywołuje metodę Matcher::matches, dlatego szukany przeze mnie fragment otoczyłam znakami ".*" przed i po właściwym wzorcu.

Skoro już wszystko się zapętliło, zajrzałam do środka, a tam:

Podstawowa różnica pomiędzy wspomnianą już Matcher::matches a Matcher::find jest taka, że matches szuka pełnych dopasowań (cały łańcuch znaków musi pasować do wzorca), a find zadowoli się dopasowaniem w środku łańcucha znaków (i może takich dopasowań zwrócić wiele).

Czyli jeśli nasz wzorzec ma postać "[abc]e", to find dopasuje go do łańcucha "cel", w przeciwieństwie do metody matches:

Jeśli dodam na początku i na końcu wzorca uniwersalne symbole ".*" (uzyskując ".*[abc]e.*") to również metoda matches uzna, że mamy dopasowanie:

Jednak jednak użyjemy metody find przy odpowiednio złożonym i zagnieżdzonym wyrażeniu regularnym z opcjonalnymi elementami i przy odpowiednio długim tekście, pojawi się tyle możliwości dopasowania wyrażenia do łańcucha znaków, że wejdziemy na obszar tzw. Catastrophic Backtracking (katastrofalne nawracanie?).

Moja poprawka sprowadziła się, oczywiście, do usunięcia czterech znaków: ".*" z początku i końca wyrażenia przekazanego jako argument metodzie Element::getElementsByAttributeValueMatching.

Jaka z tego nauczka? Rutynowo zaglądać w cudzy kod, niestety.

PS. Polecam krzyżówki regeksowe: Regex Crossword.

W ramach Strajku Kobiet: 5 mitów na temat aborcji

3 października, dzień Ogólnopolskiego Strajku Kobiet, to zarazem mój pierwszy dzień w nowej pracy. Strajk popieram całym sercem, ale zamierzam stawić się w pracy, bo nie zapracowałam jeszcze na takie zaufanie moich szefów. Próbowałam podpytać dział HR o plany związane ze strajkiem, założywszy (po seksistowsku), że będzie to najbardziej sfeminizowana sekcja firmy. Niestety, HR-y będą tego dnia w zagranicznej delegacji… Być może uda mi się dotrzeć na Plac Mickiewicza w ramach przedłużonej przerwy.

Postanowiłam dołączyć do akcji poprzez, prywatnego w końcu, bloga. Ktoś go przecież (jeszcze) czyta. Dla osób, które nie rozumieją, dlaczego wredne baby nie zgadzają się na proponowane zmiany w prawie, omawiam tu pięć mitów na temat aborcji, z którymi spotykam się najczęściej. Początkowo wybrałam siedem, ale odrzuciłam dwa związane głównie z religią i polityką, bo o fakty tu chodzi, a nie o wiarę i jątrzenie.

1. Istnieją zwolennicy aborcji

To największa bzdura i potężna manipulacja. Kobiety, które w poniedziałek protestują, nie są zwolenniczkami aborcji. Nikt nie jest zwolennikiem aborcji, tak samo jak, przy zachowaniu proporcji, nikt nie jest zwolennikiem amputacji. Żadna kobieta nie zachodzi w ciążę po to, żeby zrobić sobie aborcję. Żaden lekarz nie studiuje medycyny ciesząc się, że będzie usuwał płody albo odpiłowywał ludziom nogi. A jednak są okoliczności, w których taki zabieg jest po prostu najlepszym, jeśli nie jedynym możliwym wyjściem.

Jak większość moich koleżanek i kolegów, jestem zwolenniczką prawa do aborcji, prawa wyboru. Jak większość moich koleżanek i kolegów, mam nadzieję, że nigdy nie stanę wobec tego wyboru i nie będę z tego prawa korzystać.

Autor: Tomek Pastuszka
Autor: Tomek Pastuszka

2. Z każdego zarodka powstaje dziecko

Nie, nie i jeszcze raz nie. Po pierwsze, według badań, nawet 50% ciąż kończy się poronieniem, z czego większość (80%) ma miejsce w pierwszym trymestrze – nierzadko zanim kobieta zorientuje się, że w ogóle jest w ciąży.

Po drugie, zarodki potrafią rozwinąć się w twory niemające zbyt wiele wspólnego z człowiekiem w znanej nam postaci. Z zarodka może na przykład powstać zaśniad groniasty, pięknie opisany na blogu Patolodzy na klatce. Chciałam wrzucić bardzo wymowne zdjęcie takiego „dziecka”, ale widok nie dla każdego byłby znośny (a przecież niektórym rośnie to w środku!), dlatego zostawiam tylko link. Przygoda z zaśniadem może kończyć się nawet chemioterapią.

3. Na miejscu ciężarnej, każdy poświęciłby życie dla (minimalnej szansy) uratowania innego

Z reguły nie wrzucam wszystkich mężczyzn do jednego worka, ale tutaj trzeba. Nie wiadomo, co przyniesie przyszłość, ale do tej pory żaden mężczyzna nie znalazł się jeszcze w sytuacji, w której perspektywa kontynuacji ciąży wiązałaby się z ryzykiem jego śmierci. Z tego powodu uważam za niedopuszczalne, żeby prawem aborcyjnym zajmowali się głównie mężczyźni. Być może część z nich jest gotowa na takie poświęcenie (swoich partnerek i córek).

Ostatnio natknęłam się na świetne rozwinięcie tego tematu. Bo właściwie to istnieje sytuacja, w której każdy człowiek, w tym mężczyzna albo kobieta w wieku niereprodukcyjnym, może oddać albo narazić swoje życie, żeby ratować czyjeś – na przykład oddając swoje organy, by ratować życie dzieci, które urodziły się bez nich. A jednak nie widać kolejek osób chcących oddać płuco albo nerkę, nie wspominając już o sercu. W praktyce problem jest nawet ze szpikiem albo krwią, których oddanie jest o wiele mniej problematyczne.

Jak sądzicie, czy ustawa nakazująca obywatelom obojga płci oddawanie zdublowanych organów do przeszczepu ma szansę przegłosowania w polskim sądzie?

4. Usuwa się dzieci o takim kształcie i wielkości

Kolejna manipulacja to antyaborcyjne grafiki organizacji pro-life, które (o ile nie prezentują krwawych strzępów) pokazują kobietę na oko w dziewiątym miesiącu ciąży i sugerują, że aborcji dokonuje się na tym etapie. Aborcji na późniejszym etapie ciąży można dokonać jedynie, jeśli ciąża zagraża życiu lub zdrowiu kobiety. W przypadku ciąży powstałej w wyniku czynu zabronionego granicą jest 12 tygodni.

12072791_738297619647876_6407113363341519943_n

5. Zakaz aborcji zmniejsza liczbę zgonów i chroni życie

Obecnie w Polsce wykonuje się około tysiąca legalnych aborcji rocznie. Według szacunków zajmujących się tą tematyką organizacji (w zależności od opcji politycznej) aborcji nielegalnych jest od dziesięciu do ponad stu tysięcy rocznie. Do tego dochodzi turystyka aborcyjna do krajów, w których aborcja jest legalna.

Kobieta, która nie chce urodzić dziecka, prawie na pewno tego dziecka nie urodzi. Jeśli nie otrzyma odpowiedniej opieki medycznej, wykona aborcję chałupniczo albo skorzysta z usług niemoralnego szarlatana, ryzykując utratę zdolności reprodukcyjnych a nawet  własnego życia. Taka kobieta – martwa albo z uszkodzoną macicą – więcej obywateli na pewno nie urodzi.

Nie wiem, czy ochotę na kolejne ciąże mają matki, które ktoś zmusił do urodzenia zdeformowanych dzieci z wadami skazującymi je na śmierć kilka dni po porodzie.

Doświadczenia z całego świata uczą bez cienia wątpliwości, że delegalizacja aborcji wcale aborcji nie eliminuje, natomiast naraża życie i zdrowie tysięcy kobiet. W tym temacie polecam nagrodzony Złotą Palmą rumuński film 4 miesiące, 3 tygodnie i 2 dni.

Posłowie

Na koniec chcę się jeszcze podzielić refleksją na temat podejścia polskiego społeczeństwa nawet nie tyle do kwestii aborcji, co samej ciąży. Przez ponad 30 lat życia tutaj zdążyłam się zorientować, że dla wielu moich rodaków ciąża to nie jest stan błogosławiony ani stan fizjologiczny, ani nawet jedyna znana metoda przedłużenia gatunku. Ciąża to kara (dla kobiety) za uprawianie seksu. Najłatwiej przekonać się o tym w komunikacji miejskiej, gdzie słaniająca się na nogach ciężarna dowiaduje się od (najczęściej) tłustych starych kobiet, że nie należy się jej miejsce siedzące, bo „nie trzeba się było puszczać”. Zgodnie z tą logiką, aborcja to nic innego, jak łatwy sposób na uniknięcie (boskiej) kary. Wiadomo, żeby szaleć dalej.

PS

Polecam bardzo ciekawy wywiad z ginekologiem Romualdem Dębskim, do którego linkowałam w jednym z usuniętych punktów .

PS2

Dawno nie spotkałam się z taką ilością internetowego mansplainingu, jaką można zaobserwować w fejsbukowych wydarzeniach związanych ze Strajkiem Kobiet. „Dałyście się zmanipulować”, „w międzyczasie rząd przepchnął coś naprawdę ważnego – TTIP i CETA”. Tak, umowy TTIP i CETA są złe i przerażające. Organizujcie ile protestów się da, a ja chętnie się do nich przyłącze. Pozwólcie jednak,  że na pierwszym planie postawię bezpośrednie zagrożenie życia mojego i mojej córki.

PS3

Wyłączyłam komentarze, bo wiem, co potrafi się dziać pod wpisami na ten temat.

Eksperyment: rekrutacja (2/2)

czyli: drugie pięć z moich dziesięciu rekrutacyjnych oświeceń
czyli: nigdy więcej tą drogą

To druga część wpisu rekrutacyjnego, którego rozmiar wymknął się nieco spod kontroli. W poprzednim odcinku zdradziłam trochę informacji o pracodawcach, do których aplikowałam i przedstawiłam pierwszą połowę moich rekrutacyjnych „oświeceń”. Dotykały one tematów dość uniwersalnych. W tej części przedstawiam odkrycia bardziej osobiste oraz wyjaśniam, jak się to wszystko skończyło.

Lista 10 odkryć, ciekawostek i sensacji

Miejsca 6-10.

(to oczywiście nie jest moje zdjęcie, tylko screen z serialu Misfits)
(Ekipa przy pracy. Oczywiście nie jest to moje zdjęcie, tylko scena z serialu. Którego pierwsza połowa była całkiem niezła. Tak samo może być w przypadku tego wpisu.)

6. Facepalm. Operacja odczytu z HashMapy nie jest bezpieczna dla wątków

Miałam kilka takich technicznych eurek. Jeden rekruter na etapie programowania live wymusił na mnie użycie interfejsu funkcyjnego, dzięki czemu zrozumiałam, co w nim fajnego (można zaimplementować go jedną lambdą!). Inny przypomniał mi podstawowe fakty na temat modelu pamięci w języku, który uważam za ulubiony. Ale najbardziej wstrząsający był moment, w którym młodszy ode mnie o jakieś dziesięć lat* chłopak opowiedział mi o dziurze w moim kodzie. Wielowątkowy kod synchronizował dostęp do metody zapisującej dane w javowyom obiekcie HashMap, ale nie ograniczał odczytu. Efekt: możliwość zgubienia obiektu przy pobieraniu go z mapy, jeżeli w międzyczasie dodanie nowej wartości powoduje zmianę podziału obiektów pomiędzy kubełki. Yeah.

7. Państwowa uczelnia to świat po drugiej stronie lustra

Startując w konkursie na adiunkta wiedziałam, że mam do czynienia z budżetówką. Zero benefitów, skromniejsze płace. Po stronie plusów, w moim wyobrażeniu: inspirujące towarzystwo mądrych ludzi, wymiana wiedzy, prowadzenie badań bez dyszących w kark terminów wdrożeń. Zakończenie tej historii relacjonuję w ostatniej części tego tekstu. Tu przedstawiam „czerwone flagi”, które mimo mojej początkowej ekscytacji i perspektywy pracy z osobami, które podziwiam i uwielbiam, odwiodły mnie od pracy w tym miejscu:

  • Flaga 1: poczta pantoflowa, zwana inaczej wiedzą plemienną. Większość istotnych informacji nie jest dostępna publicznie. Gdyby nie znajomości na wydziale, nie wiedziałabym na przykład o tym, że…
  • Flaga 2: petenci czekają w kolejce. Dzień przed kwalifikacjami podano mi godzinę. Tę samą podano pozostałym kandydatom. Było nas, nomen omen, siedmioro… Wchodziliśmy do sali w kolejności alfabetycznej. Moje nazwisko zaczyna się od litery „W”. Cień nadziei zamigotał w postaci kandydata na „Ż”, ale ponieważ akurat trwały narodziny jego dziecka, poproszono go jako pierwszego. Na czekaniu spędziłam trzy owocne godziny, podczas których moim dzieckiem opiekowała się dobrze opłacona niania. #optymalnewykorzystanieczasu
  • Flaga 3: cisza. Pomyślnego nieoficjalnego wyniku konkursu gratulowano mi jeszcze tego samego dnia, ale musiał on zostać oficjalnie zatwierdzony przez rektora. Przez kolejne półtora miesiąca instytucja, która (jak się ostatecznie okazało) zdecydowała się mnie zatrudnić, nie wystosowała żadnego komunikatu na ten temat. Nie odebrałam maila, pisma ani telefonu, mimo że podałam te dane w dokumentach aplikacyjnych, tuż obok numeru PESEL i stanu cywilnego.

8. Odkrycie personalne: patologicznie nienawidzę rozczarowywać

Pierwszy sygnał pojawił się już w styczniu, kiedy zaczęłam przepytywać potencjalne nianie. Do sprawy podeszłam biznesowo – wystawiłam ogłoszenie, przejrzałam odpowiedzi, umówiłam spotkania. W pracy regularnie prowadziłam rozmowy kwalifikacyjne – była to da mnie emocjonalnie obojętna rutyna. Okazało się jednak, że kiedy nie mogę się zasłonić firmą, sprawy mają się zgoła inaczej, .

Podczas spotkań poznałam kilka ciepłych, doświadczonych, zdeterminowanych, bezrobotnych (lub pracujących na ochronie), kobiet, spośród których wybrać mogłam tylko jedną. Było to dla mnie naprawdę trudne do zniesienia. Pod koniec modliłam się, żeby staropolskim zwyczajem kilka kandydatek bez uprzedzenia nie pojawiło się na umówionej rozmowie.

Obiecałam sobie ten temat przepracować. Zanim się jednak do tego zabrałam, ruszyłam we własne tournée rekrutacyjne. A tam czekała mnie powtórka z rozrywki.

Rozumiem, że korporacje są bezduszne. Że w razie przejściowych kłopotów (czy relokacji) większość z nich nie będzie miała wobec mnie żadnych skrupułów. A jednak nie potrafię tej przerośniętej empatii dezaktywować. Prowadząc równoległe rozmowy z różnymi firmami, które nie zdążyły nawet jednoznacznie określić swoich intencji, i tak czułam się jak zdrajca. Wcześniej wyobrażałam sobie, jak siedzę z lampką wina nad stertą propozycji. W praktyce nie potrafiłam z pokerową twarzą odpowiadać na powtarzające się pytanie „co przekonałoby panią do pracy w naszej firmie”, zwłaszcza kiedy czułam już, gdzie najbardziej mi się podoba. Ostatecznie przez to nie wszystkie procesy doprowadziłam do końca.

9. Najtrudniejsze pytanie

Jak wyżej.

Kilka razy na końcowym etapie rekrutacji usłyszałam pytanie, jaka byłaby moja wymarzona praca, albo jak firma mogłaby przygotować stanowisko dla mnie.

Od lat jednym z moich największych problemów jest to, że interesuje mnie za dużo rzeczy i w zbyt wielu dziedzinach jestem w miarę dobra. Do niedawna nazywało się to „słomiany zapał” (ewentualnie „trzymanie pięciu srok za ogon”), ale w tym roku poznałam o wiele lepiej brzmiące słowo „multipotencjalista”. Myślę, że wkrótce napiszę o tym więcej.

W każdym razie, wyobrażałam sobie, że dostanę gotowe oferty i wybiorę najciekawszą. Programowanie, prowadzenie projektów, wykładanie – chciałam zobaczyć komplet propozycji i wtedy zdecydować. Zadawane w dobrej wierze pytania o moje osobiste preferencje przymuszały mnie do przejęcia inicjatywy i dokonania wyborów, przed którymi od dawna uciekam.

10. Tygodnie maglowania pozwalają lepiej poznać samego siebie

Kolejne sztampowe i okryte niesławą pytanie rekruterów to „gdzie widzisz siebie za pięć lat?”. Plan pięcioletni próbowałam w swoim życiu stworzyć więcej niż raz. Efekt zawsze wyglądał jak pajęczyna, z masą strzałek, warunków, wyjątków i zastrzeżeń. A jednak kiedy to pytanie wróciło do mnie na sam koniec, i kiedy musiałam dokonać wyboru pomiędzy dwoma proponowanymi mi dość różnymi stanowiskami, okazało się, że tygodnie maglowania i wytrącania mnie ze strefy komfortu pozwoliły mi odkryć kilka prawd swój temat. Podczas zupełnie ostatniej rozmowy byłam już w stanie uczciwie i ze sporym przekonanie na to pytanie odpowiedzieć. Co uważam za jedną z największych wartości w całej tej przygodzie.

(to z kolei z wpisu o rekrutacji do przedszkola)
(cudze  materiały rekrutacyjne)

I żyli długo i szczęśliwie

Stworzyłam sobie następujący plan A: uczelnia w połączeniu ze zdalną pracą w polskim startupie o ugruntowanej pozycji, zajmującym się dokładnie „moją” naukową dziedziną. Plan legł jednak w gruzach przez problemy opisane w punkcie 7, a doprawione wymianą kilku maili z dziekanatem. Nie jestem gotowa na skoki ciśnienia o takiej amplitudzie.

W dalszej kolejności nie bez żalu wycofałam się także z długoterminowej współpracy ze wspomnianym startupem. Zdalny etat przestał być kuszący w zestawieniu z nową pracą mojego męża, w której spędza trzy lub cztery dni w tygodniu poza Poznaniem. Cały dzień w domu, przy biurku, cały wieczór w domu, nad śpiącym dzieckiem… Mój ekstrawertyzm potrzebuje ujścia.

W ramach mocnego planu B zgłosiłam się na finalizację rozmów do najfajniejszej z odwiedzonych przeze mnie poznańskich firm. Na szczęście się na mnie nie obrazili. W październiku, a więc już za kilka dni, zaczynam nową pracę jako Technical Product Manager w firmie z fajnym produktem, miłymi ludźmi, wygodnym biurem, w odległości 15 minut na rowerze od mojego domu. Już nie mogę się doczekać!

I mam nadzieję, że przez wiele najbliższych lat nie będę musiała kolejny raz przechodzić przez rekrutacyjną mękę.

Notatka na przyszłość

Szalenie ciekawe doświadczenie. Szansa na odkrycia na temat siebie, rynku pracy, innych ludzi. Nigdy więcej nie robić tego w ten sposób.

Przypisy

* Ponieważ dzisiaj jest to mój kolega z pracy, wiem już, że jest ode mnie młodszy o jedyne cztery wiosny.

Eksperyment: rekrutacja (1/2)

Czyli pierwsze pięć z moich dziesięciu rekrutacyjnych oświeceń.
Czyli chcę największy kawałek tortu.

O tym, że po urlopie macierzyńskim będę szukała nowej pracy, wiedziałam od dawna. Data pojawienia się na świecie mojego dziecka zbiegła się z datą relokacji biura, w którym pracowałam, z Poznania do Warszawy. Gdybyfm już miała gdzieś się przenosić, na pewno nie wybrałabym miasta oddalonego o trzysta kilometrów od domu i przyjaciół. Trzy albo osiem tysięcy –o, to byłaby zupełnie inna rozmowa.

Postanowiłam podejść do sprawy metodycznie. Nie zdawać się na przypadek, nie ograniczać się do firm, które akurat nasłały na mnie headhunterów. Skoro firmom wolno przepytywać wielu kandydatów na to samo stanowisko – kombinowałam – to ja mogę porozmawiać z wieloma firmami i wybrać najbardziej do mnie dopasowaną spośród nich. No, wiadomo, spośród tych, które będą chciały współpracować ze mną. Akcję rozpoczęłam z czteromiesięcznym wyprzedzeniem.

Przygoda była długa i obfitowała w zwroty akcji. Dowiedziałam się sporo o sobie, innych ludziach, technologii, rynku pracy IT. Poniżej krótki bilans i parę moich przemyśleń / odkryć.

Zdecydowałam podzielić ten wpis na dwie części, kiedy rozlał się na piątą stronę i dziesiąty ekran.

Bilans

Ostatecznie wdałam się w rozmowy z siedmioma (!) potencjalnymi pracodawcami. Nie zależy mi przesadnie na utrzymaniu w tajemnicy ich tożsamości, ale nie chcę, żeby ten wpis pojawił się wśród wyników wyszukiwania informacji o którejkolwiek z nich. Odpowiem na dobrze uargumentowane pytania osób, które w tej chwili same szukają pracy. Zadbałam o to, żeby moja lista była zróżnicowana, choć koncentrowałam się na stanowiskach wymagających znajomości Javy, NLP i zarządzania zespołami. Na liście znalazły się, między innymi: dwie firmy pozwalające na pracę zdalną, jedna wymagająca relokacji do innego miasta, jeden polski startup, dwaj światowi giganci, jeden znany gracz wagi średniej, jedna państwowa uczelnia, dwa software houses z ambicjami.

Wyniki rekrutacji: jedna z firm odrzuciła moją kandydaturę na ostatnim etapie rekrutacji, nie oferując żadnej informacji zwrotnej, co uważam za dość perfidne i co stanowi oczywiście bogatą podstawę do wpadnięcia w obsesję. W pozostałych przypadkach zapoznałam się z ofertą lub przerwałam rekrutację w momencie, kiedy podjęłam decyzję o przyjęciu innej propozycji. Decyzja została potem poddana korekcie… Ale o tym poniżej.

Lista (5 z) 10 odkryć, ciekawostek i sensacji

1. Rekruterzy mogą walić drzwiami i oknami, ale większość z nich i tak chce przepuścić kandydata przez wszystkie etapy rekrutacyjnego młyna

Mimo że w większości przypadków to nie ja nawiązywałam kontakt, a szukająca pracownika firma, większość z nich i tak oczekiwała, że kandydat przejdzie przez wszystkie etapy czasem bardzo złożonego rekrutacyjnego sita. W zależności od przypadku, procesy rekrutacyjne obejmowały:

  • Od jednego do pięciu spotkań testujących rozmaite aspekty umiejętności i charakteru kandydata, oczywiście z nieśmiertelnym „dlaczego wybrała pani naszą firmę?”
  • Sprawdzanie umiejętności programowania poprzez: zadania domowe, zadania na sprawdzarce, płatne mini-zadania na rzecz firmy, programowanie flamastrem na tablicy, programowanie na kartce, programowanie przy kimś (sędzia i kibic w jednej osobie), pisemne testy.
  • Sprawdzanie determinacji kandydata poprzez wymaganie własnego, rozbuchanego formatu CV.

Przy odrobinie determinacji na pewno można wynegocjować pominięcie części etapów. Tak było zresztą było przy mojej poprzedniej zmianie pracy. Czułam się na tyle dobrze tam, gdzie byłam, że nie zdecydowałabym się na udział w rozbudowanej rekrutacji do innej firmy. Decyzja zapadła wtedy po jednym spotkaniu. Więc się da.

2. Przepływ informacji pomiędzy działami HR i technicznymi często pozostawia wiele do życzenia

Zapowiedzi osób z HR nie zawsze pokrywały się z rzeczywistym przebiegiem spotkań, na które byłam zapraszana. Nie zgadzały się nazwiska osób z którymi rozmawiałam, zapowiadana długość spotkań, tematy. W najbardziej ekstremalnych przypadkach:

  • Spotkanie trwało dwie i pół godziny zamiast jednej, przez co zresztą dostałam mandat za parkowanie (anulowano mi go w końcu, ale to temat na osobną opowieść).
  • Na „luźnym, nietechnicznym spotkaniu” (upewniałam się dwa razy po wcześniejszych przygodach) położono przede mną test z programowania i baz danych.
  • Nieobecnego menedżera zespołu zastąpiono programistą – kolegą z byłej pracy. Szalenie niekomfortowa sytuacja.

3. O symetrię trudno

Nieliczne firmy pytają wprost o to, czy kandydat uczestniczy równolegle w innej rekrutacji. Robią to głównie po to, żeby potencjalny pracownik nie zrezygnował przez terminy narzucane w drugiej firmie zgodnie z zasadą „lepszy wróbel w garści”.

Właściwie nie do końca wiadomo, jaka jest dobra odpowiedź na to pytanie. (Pewnie prawdziwa). Czy to plus, że mam inne opcje i trzeba się o mnie postarać? A może minus, bo po kosztownym i żmudnym procesie mogę na koniec podjąć inną decyzję?

W tej odsłonie rekrutacyjnych przygód moje wyznanie, że prowadzę rozmowy z kilkoma pracodawcami, spośród których chcę wybrać najbardziej dopasowanego, z którym zostanę dobrych kilka lat, dawało prawie zawsze ten sam efekt. Chwila konsternacji, podziękowanie za szczerość, a następnie kompletne tej informacji ignorowanie.

4. W Poznaniu istnieją biura doskonałe

Podczas swojego krótkiego tournée napotkałam: prysznice w biurze, parkingi dla rowerów, kuchnię z darmowym jedzeniem (screen z odcinka girls), biurka z elektrycznie podnoszonymi blatami, muzykę w wc, piłkarzyki i instrumenty muzyczne (wiem, że akurat na ten temat opinie są mieszane), możliwość przyprowadzenia do pracy dziecka albo psa.

Może nie aż tak, jak u Hanny...
Może nie aż tak, jak u Hanny…

5. Mroczne widmo GitHuba

Wolne oprogramowanie jest super. Dostępność kodu prawdziwych, wdrożonych projektów jest nie do przecenienia z edukacyjnego punktu widzenia. GitHub jest także coraz częściej wykorzystywany przez portale takie jak Coursera jako miejsce, w którym uczestnicy kursów mogą wzajemnie oceniać swoją pracę w procesie peer evaluation. Jednak ta otwartość ma swoje minusy. Jeden (tylko jeden, co w sumie zaskakuje) z rekruterów skrupulatnie przyjrzał się mojej githubowej twórczości – na tyle skrupulatnie, że wytknął mi błąd z obszaru synchronizacji wątków. Jezu, co za wstyd! Na GitHubie trzymam głównie wprawki – kod, który tworzę „na poważnie” w ramach pracy rzadko kiedy jest dostępny, a po pracy lubię zająć się hobby z nieco innej dziedziny. Tak czy inaczej, chcesz czy nie, GitHub staje się oficjalną wizytówką programisty.

W następnym odcinku

Kolejne pięć odkryć, w tym kilka na własny temat, oraz informacja o tym, jak się to wszystko skończyło.

Eksperyment: rekrutacja (2/2)

Bonus: czego szukają rekruterzy

W miarę wiadomo: wiedzy, pomysłowości, umiejętności pracy w zespole i radzenia sobie z nienapotkanymi wcześniej problemami.

Podczas mojej odysei udało mi się wyciągnąć z jednego z kierowników ciekawą informację na temat wymagań, które jego firma stawia programistom. Kandydaci dostają kartkę z opisem kilku zadań i chwilę na ich przemyślenie, a potem, już w obecności pracownika firmy, muszą zaproponować rozwiązania. Jedno z zadań zawiera przydługi opis systemu, który należy zaprojektować. Według relacji, większość potencjalnych programistów bardzo pobieżnie czyta tekst, po czym ochoczo zabiera się za projektowanie. Co z tego wychodzi – wiadomo. Pięknie zaprojektowany, zgodny z wzorcami, pełen fajerwerków projekt, który nie ma nic wspólnego ze specyfikacją.

Warto mieć na uwadze.

Spring Boot: autoryzacja użytkowników w oparciu o bazę danych

O logowaniu użytkowników pisałam wcześniej w następujących postach:

Dzisiaj dodałam do mojej raczkującej aplikacji funkcjonalność logowania użytkowników zapisanych wcześniej w bazie danych.

Poniżej przedstawiam zmiany, które musiałam w tym celu wprowadzić do mojej aplikacji.

a)  Wersja podstawowa

W klasie User, która od teraz ma być nie tylko klasą przechowującą dane, ale także bazą do autoryzacji użytkowników, muszę zaimplementować interfejs UserDetails:

W klasie SecurityConfiguration opisuję nowy sposób logowania:

Brakuje mi odpowiedniej metody do pobrania obiektu użytkownika po jego nazwie (getUserByUsername) w klasie UserRepository. Do tej pory szukałam użytkowników jedynie na podstawie confirmationId (co opisałam tutaj: Aktywacja konta poprzez email). Na szczęście dzięki Spring Data nie muszę jej nawet implementować, wystarczy, że dodam następującą linię:

b) Wersja rozszerzona. Przecież ja szyfruję hasła!

W tym celu muszę zarejestrować odpowiedni bean szyfrujący:

Jego właśnie muszę użyć do zaszyfrowania hasła przy tworzeniu nowego użytkownika:

Należy też wspomnieć o nim w konfiguracji:

Klasa BCryptPasswordEncoder implementuję metodę matches z interfejsu PasswordEncoder, która sprawdza, czy hasło w czystej postaci pasuje do jego zahaszowanej wersji przechowywanej w bazie danych.

Już.

PS. Podczas testowania mój dostawca domeny i serwera zablokował mi konto email, przekonany, że ktoś się na nie włamał i rozsyła spam

Przeglądarka w Javie FX

Stanęłam ostatnio wobec następującego problemu: potrzebowałam aplikacji do ręcznej klasyfikacji stron internetowych. Chodziło o to, żeby wyświetlić użytkownikowi kolejną stronę z listy i udostępnić przycisk, który pozwoli odpowiednio ją oznaczyć.

Oczywiście Java nie jest najlepszym rozwiązaniem, jakie można tu zaproponować, ale chciałam zrobić to szybko w języku zrozumiałym dla większości zainteresowanych osób. Na Stack Overflow znalazłam kilka wątków pokazujących, jak uruchomić domyślną przeglądarkę internetową w danym systemie, ale po pierwsze przechwycenie danych z niej to wyższa szkoła jazdy, a po drugie chciałam otwierać kolejne strony w tej samej zakładce.

Z pomocą przyszła JavaFX, a dokładniej komponent WebView oparty na otwartym silniku WebKit. W tej wersji uruchomienie przeglądarki i obserwowanie zachowania użytkownika staje się dziecinnie proste. Poniżej całość kodu, który:

  • wyświetla stronę startową
  • wypisuje w konsoli kolejne strony odwiedzane przez użytkownika

Najważniejsze linie:

  • 13: aplikacja JavaFX
  • 22: tytuł okienka
  • 24: pionowy układ elementów
  • 27: etykieta wyświetlająca aktualny url
  • 30-31: przeglądarka i strona startowa
  • 34-41: obsługa zdarzenia: załadowanie nowej strony (z lambdą!)

Fajne, prawda?

Okno aplikacji z załadowaną stroną startową
Okno aplikacji z załadowaną stroną startową

 

Maven ➝ Pivotal. Automatyczne wdrożenie w chmurze

Pisałam już o tym, jak uruchomić aplikację w chmurze Pivotal oraz jak podłączyć do niej bazę danych. W tym odcinku pokażę, jak ułatwić sobie życie i bez wysiłku wdrażać nowe wersje aplikacji zaraz po ich poprawnym zbudowaniu. Wykorzystam do tego plugin Cloud Foundry Maven (Cloud Foundry ≈ Pivotal).

Cel

Wdrożenie nowej wersji w chmurze po wydaniu jednego polecenia. Spoiler – w tym wypadku będzie to:

Realizacja celu

Plugin w pom.xml

Pierwszy tutorial, jak znalazłam w archiwach Cloud Foundry, twierdził, że pluginu nie ma w głównym repozytorium Mavena – konieczne miało być dodanie wpisu w sekcji pluginRepositories pliku pom.xml. Od tego czasu sytuacja uległa zmianie (https://mvnrepository.com/artifact/org.cloudfoundry/cf-maven-plugin) i nie trzeba już zawracać sobie tym głowy.

Konfiguracja pluginu w pom.xml

W moim wypadku wygląda tak:

Czym jest mycloudfoundry-instance? O tym poniżej.

Dane logowania

Dane logowania można podać w konsoli (ale wtedy nie będzie to wdrożenie za pomocą jednego polecenia!), w treści pom.xml (ale wtedy trafią one do systemu kontroli wersji, być może publicznego!), albo zdefiniować je w przeznaczonym dla Mavena pliku settings.xml na własnym dysku. Więcej o samym pliku settings.xml można poczytać tutaj. Szukać go należy (lub utworzyć) na jednej z dwóch ścieżek:

  • ${maven.home}/conf/settings.xml (dla całej instalacji Mavena)
  • ${user.home}/.m2/settings.xml (per użytkownik)

U mnie wpis wygląda tak:

id to nadana przeze mnie nazwa, za pomocą której mogę odwołać się do tej konfiguracji w pliku pom.xml (linia 6 w listingu z konfiguracją).

Więcej informacji

Więcej informacji na temat korzystania z pluginu można znaleźć na stronie https://docs.run.pivotal.io/buildpacks/java/build-tool-int.html.

Napotkane problemy

Wcześniej musiałam tylko raz wyklikać powiązanie pomiędzy aplikacją a usługą MongoDB (mLab). Przy wdrożeniach przez konsolę cf konfiguracja ta była zachowywana. Dlatego początkowo pominęłam definicję serwisów w konfiguracji pluginu (linie 13-21). Błąd! – baza danych była przez to „odczepiana” od aplikacji przy wdrożeniu.

Kod

Jak zwykle w GitHub.

PS.

Wiedziałam, że po zakończeniu konkursu Daj się poznać wrócę do swojego projektu, ale nie byłam pewna, czy chcę na ten temat blogować. Co mnie przekonało? To, że kiedy zapomniałam, jakie czynności należy wykonać w celu podłączenia bazy danych do aplikacji w chmurze, nie musiałam szukać daleko. Zerknęłam jedynie we własne wcześniejsze teksty! W ten sposób zostałam swoim najwdzięczniejszym czytelnikiem.

Strumienie w Javie 8

Odkrywam na poważnie Javę 8. Jestem tak zachwycona strumieniami, że aż się muszę podzielić!

Przykład (Java 8)

Zacznę od przykładu. Napisałam ostatnio taki kod:

Co robi ten fragment? Zwraca tablicę zawierającą te klucze z mapy, których wartości są większe od 0.

Dokładniej:

  1. Odwołuje się do obiektu mapy (map).
  2. Pobiera zbiór par klucz-wartość przechowywany w tej mapie (entrySet()).
  3. Zamienia ten zbiór na strumień, albo, poprawniej, odczytuje ten zbiór poprzez strumień (stream()).
  4. Filtruje strumień, pozostawiając w nim (a właściwie w nowym strumieniu) tylko te pary klucz-wartość, w których wartość jest większa od zera. Do filtrowania używana jest lambda, czyli definiowana w miejscu anonimowa funkcja zwracająca wartość typu boolean, przekazana jako parametr (.filter(entry -> entry.getValue() > 0)).
  5. Na wszystkich elementach (typu Map.Entry) pozostałych w strumieniu wykonywana jest funkcja zwracająca klucz (.map(entry -> entry.getKey())).
  6. Na samym końcu wywoływana jest metoda toArray z interfejsu Stream, do której przekazujemy generator (toArray(String[]::new)), czyli funkcję, dzięki której strumień wie, ile pamięci zaalokować. Istnieje bezargumentowa wersja tej metody, tyle że przy jej użyciu otrzymamy tablicę obiektów typu Object.

Przykład (Java 7 i starsze)

Po napisaniu tych paru linijek (ciągle mam problemy z formatowaniem takiego kodu i liczeniem linii) zaczęłam się zastanawiać, jak wyglądałby ten kod w wersji przedstrumieniowej. Musiałoby to być coś takiego:

Porównanie

Kilka różnic:

Java 7 Java 8
Definicja zadania Algorytm / opis procedury Strumień przetwarzania / deklaracja oczekiwanego wyniku
Kolejność przetwarzania Sekwencyjna Nieokreślona – może zostać poddana optymalizacji
Typy danych W niektórych miejscach, jak pętla for, trzeba je powtórzyć Kompilator jest w stanie je wywnioskować, nie trzeba ich powtarzać (np. w definicjach lambd)
Układ kodu Kod z blokami i wcięciami Łańcuch wywołań (oczywiście w przypadku bardziej złożonych lambd również trzeba stosować bloki)

Uczciwie dodam, że po stronie minusów stosowania strumieni muszę na razie dopisać debugowanie. W przypadku wystąpienia problemu, odrobinę trudniej jest mi się zorientować, co dokładnie poszło nie tak.

Czy naprawdę nie było innego wolnego słowa?

Strumieni z Javy 8 (z pakietu java.util.stream) nie należy mylić ze strumieniami służącymi do obsługi wejścia i wyjścia (z pakietu java.io). Co za geniusz wymyślił tę nazwę – nie wiem. Być może chodziło i uniknięcie jeszcze gorszego słowa „monada”.

Jeśli chcesz wyszukać w Google informacji na temat „nowych” strumieni, używaj nazwy „Java 8 Streams”.

Co się dzieje w tle?

Strumień nie przechowuje własnych danych – można uznać go za „widok” na dane pochodzące z kolekcji lub innego źródła. Podczas potokowego przetwarzania danych na przykład za pomocą kilku kolejnych operacji map, strumień nie jest modyfikowany, tylko zwracany jest wtedy nowy strumień, oferujący inne dane.

Wniosek

Wygodne. Używać.

Kiedy po raz pierwszy, w ramach prezentacji na Poznań JUG, zobaczyłam strumienie, nie byłam zachwycona. Pomyślałam sobie, że to kolejny wynalazek, który świetnie działa na wymyślonych, zabawkowych przykładach, a który okazuje się bezużyteczny w prawdziwym świecie. Nic bardziej mylnego, w pracy korzystam z nich teraz regularnie.

PS. Sklejanie Stringów

Od lat jeden z najbardziej irytujących braków w bibliotece standardowej Javy to sklejacz łańcuchów znaków. Teraz, jeśli chcesz za pomocą np. średników połączyć słowa przechowywane w kolekcji, nie już musisz pisać specjalnej funkcji ani załączać zewnętrznych bibliotek. Można tak:

Programiści i ich żony

Dawno nie było tu tyrad równościowych. Spieszę naprawić ten karygodny błąd! Uprzedzam od razu, że będzie dość osobiście.

W mrokach dziejów (na starym blogu)

Na moim poprzednim blogu sporo było uniesień. Dokładniej, to ja sporo się unosiłam 🙂 Było mi to wtedy potrzebne – zaczynając pracę w zdominowanym przez facetów zawodzie czułam się dość osamotniona. Dużo rzeczy mnie zaskakiwało i nie zawsze potrafiłam w porę reagować. Zdarzyło mi się, przyznaję, ronić łzy w firmowej toalecie. Pierwszy raz po (nie)sławnej przygodzie z quasiprogramistą… Ale to materiał na zupełnie inną historię. W każdym razie, w tamtych czasach blog pełnił dla mnie (między innymi) rolę wentyla bezpieczeństwa.

Dzisiaj (ku słońcu)

Wiele się od tego zmieniło. Po pierwsze, odkryłam, i bardzo mnie to uspokoiło, że nie jestem ani osamotniona, ani wyjątkowa. Programujących kobiet są miliony. Wiele z nich poznałam i wiele mnie inspiruje: Jessica z Abstractivate, dziewczyny z Daj się poznać (trzy spośród siedmiorga zwycięzców to kobiety), moja uzależniona od Coursery przyjaciółka Ewa, Trisha Gee., Ta ostatnia zaskoczyłą mnie kiedyś (na GeeConie) tym, że nie chciała rozmawiać o kobietach w IT. Dopiero niedawno  zrozumiałam, dlaczego, a przynajmniej tak mi się wydaje: bo kobiety nie są ułomkami i nie potrzebują specjalnego traktowania.

Po drugie, trochę wbrew kulturze i wychowaniu, nauczyłam się wreszcie asertywności. W obliczu seksistowskich uwag i nierównego traktowania, reaguję. Uprzejmie i konstruktywnie, ale ze świadomością, że upomniana osoba prawdopodobnie i tak zachowa urazę.  Zazdroszczę osobom, które w takich sytuacjach potrafią rozładować sytuację humorem. To ważny sprzymierzeniec, ale ja po przejściu w tryb obrońcy kobiecej robię się śmiertelnie poważna.

Po trzecie, po paru latach pracy w docenianym i opartym na umiejętnościach zawodzie człowiek nabiera wreszcie pewności siebie.

W związku z tym, w nowym miejscu narzekania prawie na uświadczycie. Nie znaczy to jednak, że wszystko jest w idealnym porządku i że nic nie wyprowadza mnie z równowagi. Kobiet w zawodzie nadal jest za mało (nie twierdzę, że ma być połowa, ale 5%  pewnością nie odwzorowuje rzeczywistego rozkładu predyspozycji) i nie jest to przypadek. Najbardziej martwią mnie   drobne korekty kursu, którym poddawane są kobiety (a jeszcze częściej dziewczynki) utalentowane w dyscyplinach ścisłych. „Chłopcy z reguły lepiej radzą sobie z geometrią”, żart o śwince morskiej (nie cytuję, bo jest durny, a i tak wszyscy go znają), sekcja z zabawkami „dla dziewczynek”… I potencjalna programistka zostaje nauczycielką w klasach 1-3. Z całym szacunkiem dla tych drugich.

Do rzeczy (a stereotypy się obalą, obalą)

Stereotypy to utarte wzorce, którymi posługuje się nasz mózg, by nie przekroczyć dostępnej mocy obliczeniowej. Są potrzebne. Niejednokrotnie ratowały naszym przodkom tyłki oraz pozostałe części ciała. Wobec wystającego zza krzaka pasiastego ogona, nagradzaną przez ewolucję strategią była natychmiastowa ucieczka. Czcigodny przodek nie miał czasu na gdybanie, czy może w danym wypadku nie am do czynienia z krwiożerczym tygrysem, tylko większą wiewiórką, która upaprała w błocie tylną część ciała. Pasiasty ogon = tygrys = ucieczka.

Stereotypy są niezbędne, dlatego nie widzę nic strasznego w tym, że na hasło „informatyk” przed oczami wielu pojawiają się panowie z IT Crowd. To miłe i ważne, kiedy Lego wypuszcza zestawy z kobietami-naukowcami, ale nie będę strofować swojego dziecka, jeśli narysuje szalonego naukowca lub górnika płci zgodnej z rodzajem gramatycznym.

Jest jednak granica i w tym wypadku widzę ją tam, gdzie kolejna napotkana osoba w rozmowie ze mną bez cienia refleksji i poczucia obciachu zakłada, że programista musi mieć żonę.

Jak jest?

W środowisku biznesowym powinno być oczywiste (dla wszystkich: działów HR, menedżerów, organizatorów szkoleń), że stereotyp to jedno, a życie (i korzyść finansowa) to zupełnie inna sprawa. Wygląda na to, że oczywiste to jednak ne jest. Z tej okazji dzisiaj chcę podzielić się  wspomnieniami kilku sytuacji, które ostatnio przyprawiły mnie o ból głowy.

W pracy
W pracy

Studium przypadku 1: oferty pracy

Dostaję czase oferty pracy, która wyglądają mniej więcej tak:

„Pani Justyno!

Chcielibyśmy zaproponować Panu…
Jeśli jest Pan zainteresowany…”

Koleżanko, skusiłabyś się na taką ofertę?

Przynajmniej jeden z tych tekstów został wysłany przez rekrutera płci męskiej – pana od HR. Ironia odbiła się od ściany jak groch.

Studium przypadku 2: podatki

Raz na jakiś czas przekraczam próg podatkowy. Ostatnim razem odebrałam maila od działu finansowego, w którym informowano mnie życzliwie, że mogę uniknąć podwyższenia podatku, jeśli rozliczę się z żoną.

No tak. Skoro zarabiam stosunkowo dużo, to pewnie jestem facetem i imię nie ma tu nic do rzeczy. Moja żona pewnie zarabia mniej (hello!), więc razem tego progu nie przekroczymy. Podpisane przez miłą panią z działu finansowego.  Ile wysiłku potrzeba, żeby w szablonie maila wyraz „żona” zamienić na neutralnego „małżonka”?

Studium przypadku 3: blogowanie

Należę do pewnej grupy wsparcia prelegentów i blogerów IT. Ostatnio pojawił się w niej taki oto post:

Jak udaje wam się godzić pasję z obowiązkami wobec żony i rodziny?

Problemów, a może warstw problemów, widzę tu  kilka. Czy w przypadku IT ja sama w ogóle mogę mówić o pasji? Czy ktoś, kto traktuje żonę jak obowiązek, powinien wchodzić w związek małżeński? Ale przede wszystkim: O co, u licha, chodzi z tą żoną? Dlaczego w domyśle żona informatyka ona nie ma pasji? Dlaczego ja, jako bloger i okazjonalny prelegent, jestem wykluczana z dyskusji z racji nieposiadania żony? Dodam jeszcze, że lista członków grupy jest jawna. Łatwo sprawdzić, ile wśród nich kobiet.

Pod rozwagę.

Dlaczego tak, jak jest, jest źle?

Założenie, że doświadczony programista to mężczyzna (najlepiej heteroseksualny i pozostający w uświęconym sformalizowanym monogamicznym związku) jest tyleż szkodliwe, co nieprawdziwe.

Wspólny mianownik jest tu następujący – wszyscy na tym tracą. Traci branża, w której ciągle brakuje pracowników. Tracą kobiety, spychane do gorzej płatnych zawodów. Tracą mężczyźni, skazywani na pracę w kompletnie sztucznym środowisku.

A może byśmy z tym skończyli?

Co zrobić, żeby było lepiej?

Weryfikować poglądy. Sprawdzać płeć odbiorcy maila.

Wierzyć w siebie.

Mam trochę mieszane uczucia odnośnie akcji zachęcających dziewczyny do kodowania. Wiem, że niektórzy odbierają je jako coś niesprawiedliwego, pytając, dlaczego nie ma takich pomocy dla facetów. W przedsięwzięciach tych nie chodzi jednak o parytety ani zajęcia wyrównawcze, tylko o przekonanie pań, że informatyka jest zawodem także dla nich. Zwłaszcza tych pań, którym wcześniej na różnych etapach edukacji uparcie wmawiano, że tak nie jest.

Oto garść pomocnych linków:

Pełne rozterek niewiasty zapraszam również do kontaktu ze mną.

Oświadczenie A (o pierwszym świecie)

Owszem, poruszam tu problem pierwszego świata. Jednak to, że gdzieś na świecie ludzie mają nieporównywalnie gorzej od nas, nie powinno nikogo powstrzymywać przed dążeniem do perfekcji.

Oświadczenie B (o dobrych chęciach)

Często, kiedy opowiadam którąś z moich wykluczeniowych przygód,  spotykam się z zapewnieniami, że „oskarżana” przeze mnie osoba nie miała złych intencji. Wiem. Wierzę. Ale to nic, naprawdę nic nie zmienia.

Oświadczenie C (o kobietach, którym się to nie przytrafia)

Są kobiety, które twierdzą, że problemu  nie ma. Spotkałam takich kilka – to zdecydowana mniejszość spośród znanych mi programistek. Jak to możliwe? Moim zdaniem albo mają bardzo grubą skórę (zazdroszczę!), albo wyjątkowo przyjazne środowisko pracy, albo (o zgrozo) zgadzają się na status quo i hipotezę, że po prostu mało kobiet nadaje się do naszej pracy.

PS. (o serialu)

A w ogóle, skoro mowa o kobietach-naukowcach, to uwielbiam serial Orphan Black!!! Dostępny na polskim Netfliksie.

PS2. (o „Daj się poznać”)

Być może nie wynika to jednoznacznie z tego wpisu, ale zajęłam 3. (na prawie 300!) miejsce z konkursie Daj się poznać. Jestem z tego niesamowicie dumna.

Finalistka milczy (pseudowpis statusowy)

Wraz z majem zakończył się konkurs Daj się poznać, w którym z maniakalnym uporem brałam udział od samego początku do samego końca.

Wygląda na to, że dostałam się do ścisłego finału! Lista finalistów jest dostępna tutaj, razem z linkiem do ankiety, w której można oddać na mnie głos. Byłoby mi bardzo miło, gdybym wygrała wypasione krzesło. Głosującym dam w nim posiedzieć i jeszcze podam piwo 😉

Listę moich wpisów konkursowych można znaleźć w poprzednim tekście: Podsumowanie mojego udziału w konkursie „Daj się poznać”.

Przy okazji, krótkie wyjaśnienie, dlaczego nie opublikowałam nic przez ostatni tydzień:

  1. Potrzebowałam chwili odpoczynku. Zaraz wracam. Także z projektem konkursowym, chociaż pierwszy będzie luźniejszy tekst. Roboczy tytuł to „Żony programistów”. Brzmi intrygująco? 🙂
  2. W normalnych okolicznościach jestem zadowolona z dwóch wpisów w miesiącu. Czy obserwowany ostatnio zalew treści nie był męczący także dla Czytelników? Chętnie się dowiem.
  3. Poważnie rozważam zmianę pracy (moje biuro przeniosło się do innego miasta) i biorę udział w 6!!! procesach rekrutacyjnych. Nie mogę się doczekać, żeby podzielić się uniwersalną częścią tych doświadczeń na blogu 🙂
  4. Nadal jestem na urlopie macierzyńskim, ale przyjęłam zleconko. Któremu się napuchło.
  5. Padł mi komputer. Serio. Skoro już i tak uprawiam w tym wpisie prywatę, rozwinę myśl. Wymieniłam właśnie przedpotopową stacjonarkę na laptopa (ThinkPad). W związku z tym przestał mi być potrzebny netbook. Chcę go sprzedać. Jest to lekki, wygodny i szybki Samsung z serii 900X (konkretnie NP900X3C). Oryginalnie z Windows 8, teraz działa na nim (jak marzenie) Linux Mint. Chętnych zapraszam do kontaktu.

Bardzo dziękuję za dotychczasowe wsparcie.

Do zobaczenia wkrótce!

Milsza strona programowania