Pacze i nic nie wim

SONY DSC

Ciężkiego czasu ciąg dalszy. Mam dużo pracy, sporo zupełnie nowych rzeczy do przyswojenia w szybkim tempie i w związku z tym nasilił się stres. Momentami muszę powalczyć o dobre samopoczucie, pozytywne nastawienie i motywację do dalszej nauki. Nie żeby zaraz kryzys, staram się tak wszystko układać żeby mieć poczucie że mimo wszystko idę do przodu i cieszyć się z postępów. Po prostu chwilowo (?) mam jeszcze więcej na głowie niż zazwyczaj.

Na takie zmęczenie materiału i zwątpienie w sens i możliwość osiągnięcia założonych celów mam wypracowany pewien patent. Pomysł jest taki, żeby mimo braku czasu nie rezygnować, lecz wręcz przeciwnie, mocniej angażować się  w zadania konstruktywne, ale znacznie bliższe strefie komfortu (czytaj: po prostu przyjemne:)). Tym razem udało mi się znaleźć wyjątkowo wdzięczne zajęcie. Wspominałam tu już o nowym miejscu dla dzieci, które powstało blisko miejsca gdzie mieszkamy.  Miejsce nazywa się Mini Świat i jest urocze pod każdym względem i z każdego punktu widzenia – dzieci, rodziców, no może mniej sąsiadów, bo tradycyjnie z parkingiem słabo:)

Dodatkowe punkty Mini Świat zbiera w takim burym sezonie, bo jest wymarzonym miejscem żeby wyjść z domu na krótki spacer z perspektywą, dla każdego coś miłego, zabawy albo pysznej kawuuuusi. Cudny konept na trudne rodzicielskie chwile gdy za oknem ciemno i ponuro a wokół wszystko wskazuje na to że po prostu trzeba wyjść z domu. Oj bywa. Wygon – marzenie. A zdjęcia jak lubię – mięciutkie, z małą głębią ostrości, niemal bez lampy, za to w doborowym towarzystwie:)

Koniec tego dobrego, teraz tematycznie. Z gruba, będzie o open source’ach. Kilka dni po wysłaniu pull requesta do mojego drugiego ćwiczebnego projektu “first-timers-only” przyszła informacja “merged”. Drobiazg, a cieszy. Czas byłby zabrać się za kolejny temat, no ale tu wskakuje problem za krótkiej doby. A ta jest ostatnio po brzegi wypełniona uporczywymi próbami zrozumienia o co chodzi w tym kodzie (a właściwie jego fragmentach), z tymi stubami, mockami, patchami itp. Pacze, pacze i nic nie widzę. Frustracja. Co prawda dziś, pod kierunkiem mojego mentora udało mi się wysłać do recenzji jeden poprawiony plik (git upload!), ale jakaś ta satysfakcja nienachalna. Szło to wszystko jak po grudzie, na niemal każdym etapie potrzebowałam pomocy, nie lubię. To znaczy wsparcie bardzo doceniam i jestem za nie niezwykle wdzięczna, ale przydałoby się jakieś poczucie sprawczości. A tu gęstwina prawie-całkiem-niezrozumiałego kodu, depot tools i vim (nie, nie wim). O, dowcip mi się wyostrza:) Niby powoli tu i ówdzie coś zaczyna mi świtać, ale nieśmiało. Bardziej by się chciało.

A propos dowcipów, mój mentor następująco mailowo podsumował moje dzisiejsze wyczyny: “Jak wygenerować losowy ciąg znaków? Posadzić nowicjusza przed vimem i kazać mu wyjść.”

Pięć sposobów na to jak wykorzystać czas, którego się nie ma

SONY DSC

Dobra wiadomość jest taka, że mimo problemów z czasem udało mi się na chwilę wrócić do EarlyBirda, czyli mojego małego programu dla birdwatcherów. Fajnie, bo po pierwsze dzięki niemu znowu nauczyłam się czegoś nowego, a po drugie cieszy mnie że działam zgodnie z planem (dotyczy założenia, że owszem, chcę ogarnąć projekty open source’owe, ale chciałabym też czasem, jak mawiał klasyk, być poetą i wiersz sobie napisać).

Pomyślałam sobie, że skoro standardowo birdwatching odbywa się w weekendy, warto zautomatyzować proces wysyłania e-maili (na przykład w każdy piątek). I znalazłam fajne i bardzo proste rozwiązanie, w zasadzie sprowadzające się do jednej liniki:

schedule.every().friday.at('12:00').do(main)

W wolnej chwili myślę co dalej.  Pewnie dobrze by było zróżnicować treść rozsyłanych komunikatów w zależności od pogody (np. panie, panowie, temperatura jutro spadnie poniżej minus 15 stopni, śpimy dłużej) albo zarejestrowanych wcześniej obserwacji (nieciekaaaawe) albo listy “must have” (nie pojawiło się ostatnio nic co nas szczególnie interesuje, odpuszczamy) itp. A może dodać jakąś zupełnie inną funkcjonalność, może sklep?:) Koleżanki i koledzy, jutro wielka mgła, a tu właśnie jest taka fajna lornetka…. Czego by tu się jeszcze nauczyć?:)

A czasu jest niewiele ponieważ:

  1. próbuję ogarnąć cokolwiek w temacie usuwania stubów w tym projekcie. Gąszcz, pajęczyna, czarna magia. Ale walczę. Gdyby miało się to mnie lub komuś innemu na coś kiedyś przydać, to na stopniowe rozjaśnianie tematu, poza oczywiście wgryzaniem się w sam kod, pomaga mi tentententen pan.  Oraz ta dokumentacja.
  2. rozpędzam się z “projektem junior”. O tym jeszcze pewnie niedułgo napiszę.
  3. w swojej aktualnej pracy zawodowej przeżywam sezon raportowy oraz przełom “roków” == overflow.
  4. dzieci wróciły do placówek po świątecznej przerwie i adaptacja przebiega odlegle od marzeń. Mamoza absolutna. Ale i na to jest sposób. Wczoraj udało mi się uzyskać spokojne pół godzinki kosztem (z braku drukarki) popełnienia uprzednio kolorowanki z jedynie słuszną Krainą Lodu. Tzn. ja rysuję kształty, córka koloruje. Podobny do siebie jest tylko bałwanek, pińdzioszki niechcący odzieram z powabów, ale co tam. Mam tę moc i lecę. Nie, nie pokażę.:)
  5. naprawiam swój zepsuty kręgosłup. Rehabilitacja to rzecz żmudna i na ogół nudna, ale mi przydarzają się epizody żywcem wzięte z innej specjalizacji. Ostatnio na przykład obok mnie kobieta ze wzrokiem mętnym i nieobecnym, ruchem monotonnym  wyciera ścierką ścianę. Z mojej drugiej strony mocno skoncentrowany facet z całej siły napiera na ścianę nośną wyraźnie starając się ją przesunąć. Żeby nie było – ja przed lustrem wykonuję ćwiczenie o wymownej nazwie “cumel”, czyli jednocześnie zasysam swój kciuk i próbuję go sobie z wyrwać z ust. A przez całą długość sali spaceruje ruchem zombi starszy facet w spranej koszulce Metalliki o wyglądzie, gdybyż to tylko było możliwe, KurtCobain.datetime.now(). Ręce ma związane niebieską taśmą do ćwiczeń, która przeciągnięta nad jego głową nadaje mu zaskakujący nieco wygląd Matki Boskiej Seattle’owskiej. Wesoło mamy.

A w Nowym Roku jest sukces, testy i przyjemności

SONY DSC

Tak więc udało się! Mały kroczek dla ludzkości, ogromny dla mnie:)

Zgodnie z planem znalazłam na GitHubie kilka pythonowych open issues otagowanych “first-timers-only”, łatwych, a jednak o zróżnicowanym poziomie trudności. Napisałam do maintainerów pytając czy pomoc wciąż jest im potrzebna (z komentarzy i komunikatów “merged” wynikało, że kilka osób zaangażowało się  wcześniej w rozwiązanie poszczególnych problemów). Zaskoczyło mnie jak szybko dostałam potwierdzenie i równocześnie zachętę do działania. Na pięć moich zapytań cztery odpowiedzi otrzymałam dosłownie w ciągu kilku godzin.

Wybrałam najłatwiejszy temat (zgodnie z ideą literówek – chodzi o to by najpierw przejść proces pull request (PR) i oswoić się z nim, a dopiero później blokować się rzeczywistymi problemami z kodem).

I jak to zwykle bywa – problemy które wydawają się głęboko czarnomagiczne po krótkiej analizie zaczynają powoli nabierać wyrazu. Mój issue był naprawdę prościutki (chodziło o mechaniczne dopisanie zmiennych do komunikatu, który ma być wyświetlany użtkownikowi). Ale zrozumienie intencji zarządzającego projektem chwilę mi zajęło.  Postępowałam zgodnie z informacjami zawartymi w README.md, CONTRIBUTING.md i INSTALLATION.md, zainstalowałam wszystkie potrzebne pakiety, uruchomiłam program na roboczym serwerze i przygladnęłam się jak działa. Jak dla mnie fajnie, że program jest zwięzły i nieskomplikowany (choć tematyka blochchain jest dość gęsta:). Dzięki temu nie utknęłam w gąszczu kodu i nawet zyskałam poczucie że cokolwiek z tego rozumiem. A, i zarządzający projektem to niesamowicie pomocny i otwarty gość. To naprawdę czysta przyjemność zetknąć się z takim podejściem podczas pracy.

Idą za ciosem, wprowadziłam również zmiany do kolejnego projektu. Czy te zmiany == ulepszenia, to się dopiero okaże, bo jeszcze czekam na reakcję maitainera. Póki co zabrałam się za czytanie kolejnego kodu. Tym razem sprawa jest ciekawsza, bo dotyczy uzupełnienia dokumentacji projektu tak, by stała się bardziej zrozumiała dla początkujących użytkowników. A junior to, jak wiadomo, moja specjalność:) Przy czym spowodowanie by kod stał się bardziej czytelny obejmuje również/głównie opracowanie przykładów. A więc, wyzwanie!

I już myślałam, że na tym poziomie trudności pozostanę, gdy swój pomysł zgłosił mój Mentor. Tym samym stężenie czarnej magii osiągnęło poziom krakowskiego smogu. Otóż zajmiemy się usuwaniem stubów i nadpisywaniem ich przez mock i fake w tym programie. Testy, wiedziałam że mnie to kiedyś dopadnie. Niewiele póki co rozumiem, choć bardzo się staram:) Ale o tym już następnym razem….

Dla poprawy nastroju znalazłam zajęcie znacznie bliższe mojej strefy komfortu. Niedaleko mnie powstało miejsce dla dzieci. Magiczne, przecudne, pomysłowe, pastelowe i drewniane. I z pyszną kawką dla rodziców. I temu cudnemu miejscu robię zdjęcia do wykorzystania na stronę www, facebooka, do identyfikacji wizualnej itp. Mam wielką radość i satysfakcję że w jakiś sposób mogę włączyć się i pomóc rozwinąć się naprawdę świetnej inicjatywie. Niechaj się dzieje!

Projekt “Open”

PICT0528

No to czas na powrót do codzienności po świątecznym obżarstwie i relaksie! Taki żarcik, bo na szczęście wyjatkowego obżarstwa nie zaznałam, a relaks wyłącznie tego szczególnego typu kiedy człowiek wraca po świętach do pracy i czuje przyjemny spokój i ciszę:)  Choć faktycznie tym razem był powód do świętowania, bo mój kręgosłup znów pozwala mi na urocze tete-a-tete z laptopem. Swoją drogą, żartów nie ma, trzeba się faktycznie pilnować i uwalniać od złych nawyków, bo przydługie posiady z kompem są po prostu groźne. I tu filmik ku własnej przestrodze.

Ale do rzeczy, czyli mały update. Ostrożnie przymierzam się do tematu kontrybuowania w projektach open source’owych. Ostrożnie, bo moją czujność wzmogły reakcje Ludzi Dobrze Znających Się Na Rzeczy – mówię na co się porywam i widzę w odpowiedzi uważny a jednocześnie pełen troski i niedowierzania wzrok. Gdyby umiał mówić pewnie byłoby to coś w rodzaju “kobieto, ach na co ci to, kompoty warz!” I komentarz, tym razem słowny: “wiesz, tylko nie zrażaj się, bo to takie… specyficzne jest”.

Aby więc przestać się czuć w tym temacie jak moja koleżanka na obrazku, zabrałam się do tematu metodycznie. Po pierwsze, podążając za ideą “first-timers-only” znalazłam potencjalne źródło problemów do rozwiązania.  37 issues do przeglądnięcia i stwierdzenia czy na tym etapie w którymkolwiek z nich mam coś do powiedzenia. Na chwile zwątpienia mam w zanadrzu prezentację Kenta C. Doddsa,  który bardzo fajnie działa na rzecz oswajania zielonych w temacie open source z procesem PR. Dla równowagi, uświadamia też właścicieli/koorynatorów projektów jak ważne jest ułatwianie juniorom zdobywania pierwszych szlifów oraz mocno promuje dobre praktyki w tym zakresie. Po drugie skorzystałam z zasobów pana Kenta przerabiając krótki tutorial dotyczący procesu PR (ach czemuż, czemuż pan Kent zadaje się głównie z JavaScriptem? Pewnie nie słyszał o Pythonie). Przy okazji, doceniłam side-effect swojego bootcampu, gdzie zarówno prework, jak i poszczególne egzaminy odbywały się z wykorzystaniem GitHuba i pull requestów. Gdyby jednak zaistaniała potrzeba, sam GitHub oferuje oczywiście kompletną informację “How to contribute to Open Source”. A, mam jeszcze jedno zestawienie projektów, które są otwarte na nowicjuszy. Może nie tak uroczo obrane z ości jak pierwsze źródło, ale też wygląda nieźle. Zawiera zbiory (w podziale na języki) projektów wybranych pod kątem “awsome for beginners”.  W tej sytuacji no excuses – teoria opanowana, gdybym, dajmy na to, chciała coś pull-requestować to przynajmniej formalnych głupot nie narobię. Chyba. Więc może następny wpis to wreszcie będzie jakaś success story. Muszę tylko znaleźć podobną skalę trudności issue co pan Kent będący młodym programistą. Jak wspominał w swojej prezentacji, jego pierwsza kontrybucja polegała na usunięciu literówki popełnionej w komentarzu. Ale w Javie:)

A gdyby tak prosto nie było, znalazłam bardziej uchwytną formę odwdzięczenia się społeczności za dotychczas doznane dobro, czyli tłumaczenie kursów udostępnionych na Courserze.

Hello GitHub!

DSC05713

Kilka dni po ustaleniach dotyczących zarządzania czasem i zadaniami mam następujące wnioski:

  1. pomysł sam w sobie nie jest głupi, co najwyżej patrz punkt 2,
  2. na ogół nie jestem w stanie wygospodarować tyle czasu ile bym chciała / sobie założyła,
  3. nie zmienia to faktu że punkt 1,
  4. jeśli nie mam wystarczającej ilości czasu, to raczej należy zredukować okres przeznaczony pierwotnie na poszczególne obszary niż rezygnować z któregoś z nich,
  5. oznacza to jeszcze bardziej precyzyjne zarządzanie, bo trzeba przewidzieć, że  danego dnia należy przejść w tryb metasamoograniczenia:),
  6.  brakuje mi narzędzi.

I a propos punktu 6 – potrzebowałabym aplikacji, która umożliwiałaby mi, powiedzmy wieczorem, zaplanować  kolejny dzień. Powinnam mieć możlwiość ustalenia przedziałów czasowych, które mogę przeznaczyć na Projekt Junior (zazwyczaj 4 – 6:30 rano oraz dwie / trzy luźniejsze półgodziny w ciągu dnia) tak, żeby zmieścić się w koncepcji 5 x 45 (30) minut. Poszczególnym przydziałom czasowym mogłabym przyporządkować temat / źródło z wcześniej wprowadzonej listy, skojarzonej z poszczególnym obszarem. Na kolejne dni mogłabym dostawać podpowiedzi typu “kontunuuj temat”, ale też móc wybrać coś innego z listy (ewentualnie ją uzupełnić). Ostatnią porcję czasu w ciągu dnia przeznaczałabym na szybkie podsumowanie – odznaczanie co udało się zrobić, a co niestety musi przejść na kolejny dzień. Taka możliwość, oprócz funkcji motywacyjnej fajnie porządkowałaby pracę i dawała dobry feedback co udało się dotychczas zrobić i w jakim jestem miejscu w poszczególnych tematach. A, i jeszcze na sam koniec planowanie kolejnego dnia.

No i pointa – pewnie taki program istnieje, a ja o tym nie wiem:) Mam nadzieję, że nie występuje tu syndrom zakupu butów – zwykle na tyle dokładnie wiem czego potrzebuję, a raczej czego bym chciała, że nigdy nie jestem w stanie właśnie tego kupić:) Ale, tu jest rozwiązanie – jeśli takiego narzędzia do wspierania rozwoju nie ma, to może należałoby go napisać? Szewcem nie będę, programistką – wannabe!

Btw – czy to już skrzywienie jeszcze-nie-zawodowe? Ogarniając przedświątecznie szpargały mojej młodzieży, natknąwszy się na szpeje z wizerunkiem kocicy zwanej Hello Kitty doznałam skojarzenia z GitHubem:) No w sumie…:))

Piąty element

SONY DSC

Czas na przedświąteczne porządki. Przynajmniej wirtualne, bo na tradycyjne chwilowo nie pozwala mi obniżenie przestrzeni międzykręgowych na szczycie kyphozy piersiowej:) Przyglądnęłam się krytycznie moim chaotycznym zapisom w Trello i postanowiłam nad nimi nieco zapanować. Był też już najwyższy czas na ponowne zdefiniowanie bliższych i dalszych celów, a tym samym najważniejszych aktywności i zapanowanie nad kalendarzem tak, by na każdy z tych obszarów przeznaczać systematycznie odpowiednią ilość czasu. Nie brzmi to może zbyt uroczo, ale czego się nie robi żeby zostać juniorem:) Zwłaszcza, jeśli na ten cel można realnie przeznaczyć maksymalnie 3 – 4 godziny dziennie.

Pierwszy obszar to projekty / zadania, nad którymi obecnie pracuję. Aktualnie są to zadanka algorytmiczne, TDD i projekty umieszczone na GitHubie doprowadzone do pewnego etapu, które chcę jeszcze rozwinąć. Mam na to pomysły, za to wiecznie nie mam czasu. Postanowiłam sobie, że nie porzucę ich tak brutalnie, ale regularnie będę do nich co jakiś czas wracać. Priorytet może nie najwyższy, ale wciąż w grze. W kolejce czeka zabranie się do kontrybuowania w projektach open source’owych, zacznę od wyszukiwania bugów w projektach polecanych dla początkujących typu https://github.com/MunGell/awesome-for-beginners. Jest szansa, że sprawa przyspieszy w ramach aktywności nr 5.

Drugi obszar to rozwijanie moich ekhm, programistycznych horyzontów. W tej grupie mieszczą się, patrzę na moją podręczną półeczkę, min. “Głowa do liczb” Barbary Oakley (do tej książki jeszcze wrócę, bo jest zachwycająco opytmistyczna), świeży a już bestseller “Zawód Programista” Macieja Aniserowicza no i nadambitne (oczywiście dla mnie) “Zrozumieć programowanie” Gynvaela Coldwinda. Poza półeczką aktualnie mam jeszcze “na podorędziu” kurs o algorytmach Khan Academy https://pl.khanacademy.org/computing/computer-science/algorithms/binary-search/a/implementing-binary-search-of-an-array, podcasty i vlog DevStyle https://devstyle.pl oraz fascynujący kurs “Internet History, Technology and Security” https://www.coursera.org/learn/internet-history/home/welcome.

Obszar trzeci to kilka kursów internetowych, które mnie wiecznie kuszą, min. na Pluralsight https://app.pluralsight.com/paths/skills, Udemy https://www.udemy.com/the-python-mega-course czy Data Camp https://www.datacamp.com/courses/intro-to-python-for-data-science.  Oprócz świetnie podanej piguły wiedzy mają jeszcze tę wartość, że przy okazji można podszkolić angielski.

Czwarty obszar, na który chcę wygospodarować sobie czas to wreszcie! kontakty międzyludzkie, czyli spotkania, meetupy i inne okazje do fajnego networkingu. I niniejszy blog:)

Piąta sprawa, obecnie z najbardziej napiętym grafikiem, to praca w ramach Tech Leaders.

Idea jest taka, żeby codziennie przeznaczyć 45 minut na każdy z tych obszarów. Na co dokładnie – to zależy. Od potrzeby, ilości czasu i nastroju. Tu zostawiam sobie zdrową swobodę. I będzie progres:)

Jak mierzyć poziom stresu indeksem Hirscha

SONY DSC

Niestety, skutecznie… Wracam do mojej pierwszej mockowej rozmowy rekrutacyjnej, na której miałam  wątpliwą (w moim pierwszym odczuciu) przyjemność zaznajomić się z ideą niejakiego pana Jorgego E. Hirscha. Hmmm… Zrozumienie tej koncepcji,  ułożenie sobie w głowie dokąd zmierzam i jak do tego dojść oraz przełożenie pseudokodu na składnię Pythona w warunkach stresu i pod presją czasu okazało się naprawdę niełatwe.  Poległam na ostatnim etapie, zabrakło mi czasu i umiejętności utrzymania koncentracji.  Ale uff, o dziwo mój mentor nie był bardzo niezadowolony, uznał, że jeśli ktoś dobrze myśli, to uzyskanie biegłości w kwestiach technicznych jest kwestią czasu. Więc jednak mały plus. No i angielski na plusie, bo w tym zakresie nie stwierdzilśmy trudności komunikacyjnych:)

Ja jednak byłam nieco rozczarowana, zaczęłam więc zgłębiać temat i oprócz standardowego definiowania problemu (np. https://en.wikipedia.org/wiki/H-index) znalazłam ciekawe rozwiązanie, oparte na relacji pomiędzy indeksem (w sensie pozycji na liście) a liczbą umieszczoną na liście pod tym indeksem (http://subjectguides.uwaterloo.ca/calculate-academic-footprint/YourHIndex).  Okazuje się, że indeks można łatwo ustalić poprzez znalezienie pozycji na liście, która swoją wartością dorówna lub przekroczy wartość pod nią zapisaną. Zestawienie tych podejść może wyglądać następująco (dwa pierwsze: podejście “indeksowe”, ostatnie: szukanie właściwych elementów na liście). Wszystkie zakładają, że elementy na liście są ułożone w porządku malejącym oraz nie mają pojącia czym jest złożoność obliczeniowa:).

class Solution:

    def hirsch_index(self, lst):
        result = []
        for i in range(len(lst)):
            if i >= lst[i]:
                result.append(i)
                break
        return result[0]


    def hirsch_index2(self, lst):
        i = 1
        while i < lst[i]:
            i += 1
        return i


    def hirsch_index3(self, lst):        
        ind = 1
        while len([number for number in lst if number >= ind]) - 1 >= ind:
            ind += 1
        return ind


s = Solution()
print(s.hirsch_index3([28, 22, 20, 6, 5, 4]))

Patrzę na to podejście i myślę sobie, że jest jednak problem. Załóżmy, że mamy do czynienia z wybitnym, rzadko publikującym naukowcem, którego wszystkie publikacje mają większą ilość cytacji niż ilość opublikowanych artykułów. I co wtedy? A może taka sytuacja po prostu nie może się zdarzyć w rzeczywistym świecie? Idę czytać…