piątek, 31 marca 2017

Dzień 23.

  Na razie dzień zaczął się całkiem nieźle. Co prawda, musiałem ze 2 razy poprawiać rzeczy, które wydawały się zgodne z założeniami, ale zawartość bazy jednak była trochę zaśmiecona, więc musiałem dodać trochę więcej ifów w widokach twiga i metodzie __toString() w jednej encji. Zamknąłem, a w zasadzie oddałem "do odebrania" wszystkie swoje zadania i pierwszy raz zdarzyła się chwila, że czekam na nowe, więc mam czas napisać ten kawałek tekstu. Aktualizacja pewnie znacznie później, gdy rozgrzebię nowe zadania. Na razie poprawił mi się humor, bo wreszcie mam jakieś małe sukcesy w sensownym czasie. :)

  Czekając na nowy zestaw zadań, poczytałem sobie różne mądre rzeczy i poszedłem na obiad. Po powrocie jeszcze nie było ustaleń, aż nadeszła ta chwila. Wrócił PM z programistą, usiedli koło mnie zaczęli przedstawiać mi funkcjonalność, którą mam dodać do projektu. Obok siedział akurat główny architekt, więc zapytał o numer issue i sam zaczął czytać. Porozmawialiśmy z PM-em co i jak i zaczęło się robić zabawnie, bo włączył się architekt. Najpierw do programisty, który robił dla mnie opis techniczny z pretensją, że sam nie rozumie co tu niby jest napisane i że niedokładnie. Czy mogę sobie dodać encję o nazwie "Dupa" i wstawić gdziekolwiek w projekt, czy może jednak by mi łaskawie napisali dokładniej. Dalej było, że to jest za duże zadanie dla mnie i powinno być rozdzielone na mniejsze, gdzie ja powinienem dostać prostsze kawałki, a te trudniejsze powinien dostać kolega, który robił opis zadania z PM-em i wtedy było by najbardziej optymalnie. Gdzieś tam jeszcze padło cos o kodzie w stylu: "Bo tak piszecie ten kod i opisy zadań, że później Piotrek siedzi 4 h i myśli, po czym zaczyna kurwić, że nic nie rozumie z tego co napisaliście.". Chwilę później pojawił się w zadaniu komentarz od PM-a, że drugi kolega ma rozpisać dokładniej pewne rzeczy. Ja się w tym czasie zająłem tym, co nie wymagało jakoś dużo myślenia, czyli zmiany w widokach we front-endzie typu dodanie przycisku i ikonki dla niego i dopisanie kawałka obsługi. Po drodze miałem jakieś literówki i niby proste zadanie, ale dodając do tego debugowanie, zeszło mi prawie 2 h.

  Tego dnia, wystawiłem też pierwszą w życiu fakturę, gdyż założyłem własną działalność gospodarczą (wymóg Urzędu Pracy, który mi dofinansował kurs) w grudniu 2016.

Dzień 22.

  Nie bardzo miałem wczoraj czas na pisanie, więc piszę na szybko przed pracą dnia kolejnego. Wreszcie udało się rozwikłać problem, nad którym siedziałem ostatnie 3 dni. Potrzebna była konsultacja PM-a i seniora, bo pewne części tego systemu są niezrozumiałe. Po przeskoczeniu tego etapu i zrozumieniu wreszcie jak to jest napisane, udało mi się zakończyć zadania. Za godzinę miałem też zrobione następne, bo polegało głównie na copypaście, zmianie nazw zmiennych i przetestowaniu. Zająłem się więc kolejnym zadaniem. Kolejna zmiana wyświetlania adresu. Prosta sprawa, bo tylko parę ifów w widokach. Skończyłem w godzinę (po drodze oczywiście znowu wynalazłem błąd, który byłem pewien, że nie jest spowodowany moimi zmianami w kodzie, ale i tak przeszkadzał i siał wątpliwość, plus wywalał mi Apache'a, którego musiałem restartować). Zabrałem się za czwarte zadanie, które powstało w międzyczasie zmian wyświetlanego adresu i.. tutaj znowu zonk. Zatrzymałem poprzedni merge request i sprawa jest do dogadania, bo wychodzi na to, że będę robił poprawki w poprawkach, bo niektóre założenia są niedokładne.


środa, 29 marca 2017

Dzień 21.

  Nie chce mi się za wiele pisać, bo dzisiaj to się już wkurwiłem. Albo się cofam w rozwoju, albo dostałem za trudne zadanie. Wydaje się, że to proste, bo tylko tylko dodanie nowych selectorów do filtra, tylko że wszystkie pozostałe i cały system jest inaczej zaprojektowany, więc praktycznie muszę robić nową funkcjonalność. Znowu parę godzin walenia głową w mur i gadanie do gumowej kaczki nie pomogło. Skorzystałem w końcu z pomocy kolegi, który pisał dużo w tym systemie i wciąż pamięta (skorzystałem nie dlatego, że nie chciałem wcześniej, tylko nikt nie ma dla mnie czasu), ale on też odkrywał, że pewnie rzeczy mi nie zadziałają, bo były inaczej zaprojektowane, więc muszę robić pewne fragmenty prawie od zera. Po drodze jeszcze zauważyłem bug, który później uznano za feature, ale ja myślałem, że to w moim kodzie jest błąd, bo niby czemu mi nagle znika 60 obiektów, które za pierwszym razem się wyświetlają, a później po nałożeniu filtrów znikają. Przy czyszczeniu ich stanów też się więcej nie pojawiają. Okazało się, że nie wszystko w tych filtrach się resetuje do wartości, które zwrócą wszystkie obiekty, ale to odkryłem dopiero w logach Symfony, gdzie znalazłem zapytanie do bazy, przekleiłem do phpmyadmina i przeanalizowałem, gdy się ładnie pokolorowało, wraz z zaciemniającymi obraz aliasami.

wtorek, 28 marca 2017

Dzień 20.

  Wczoraj wydawało mi się, że coś nie działa w filtrach, które poprawiałem i na pytanie PM-a powiedziałem z czym jest problem i zacząłem mu pokazywać i ... nagle się okazało, że te filtry jednak działają. Na wszelki wypadek jeszcze trochę poklikałem, ale skoro działa to zostawiłem i wziąłem się za drugą część wczorajszego działania. Wydawało się, że będzie prosto, bo miałem wskazówki gdzie i co dodać, a wczoraj już to miałem obcykane. Patrzę w kod i coś mi nie bardzo pasują porady, w których encjach dodać nowe pole. Analizuję dalej i przestało mi się podobać miejsce, w którym klient zażyczył sobie dodanie checkboksa, bo był on wykorzystywany dopiero w trzecim kroku tego pseudo-formularza, więc stwierdziłem, że nadmiarowy kod, tylko po to, żeby przekazać stan tego checkboksa dwa kroki dalej. No to ustalam z PM-em, że to bez sensu i dodam ten checkbox dopiero w ostatnim kroku, czyli zatwierdzeniu formularza. Zabrałem się za dodanie checkboksa, skopiowałem sobie wczorajsze rozwiązanie i pierwsza niespodzianka. Tamto było przystosowane do FormBuildera, a tutaj formularz był na sztywno w htmlu. Gorzej, później się okazało, że jego obsługa też nie jest po stronie Symfony, tylko jest dodatkowy kontroler w JavaScripcie, który przekazuje wybrane parametry. Sam do tego niestety nie doszedłem, ale pokazał mi to kolega, który sporo pisał w tym projekcie. Dalej doszło do grzebania w back-endzie, gdzie miała powstać główna funkcjonalność, czyli masowe ustawienie true na obiektach, które biorą udział w innej operacji. W operacji, która jest oderwana od głównego wątku, bo przygotowuje tylko ustawienia, które następnie uruchamiane są z crona, bo mogą trwać bardzo długo. Od razu pomyślałem, że przemielenie tysięcy obiektów w pętli źle się skończy, wiec na wszelki wypadek spytałem seniora czy dobrze myślę, że muszę dodać nowa metodę do repozytorium. Później jeszcze coś pogrzebałem i znowu doszedłem do etapu tłuczenia głową w ścianę. Powtarzające się nazwy encji z różnymi przyrostkami zaczęły mi się dwoić i troić przed oczami i przestałem rozumieć co się dzieje. W międzyczasie senior gadał z kolegą, który to pisał i razem coś tam ustalili, a ja dowiedziałem się wreszcie gdzie powinienem dodać nowy kod, a kolega, który to pisał miał mi pokazać palcem coś innego. Efekt był taki, że wciąż się męczyłem, więc poprosiłem kolegę o pomoc. Wymieniliśmy się wiedzą, bo ja chwilę wcześniej rozwiązywałem mu jakiś problem na serwerze linuksowym. Koniec końców, kolega siadł ze mną i podpowiadał mi pewne rzeczy. Niestety przy zapytaniu przy użyciu QueryBuildera zaczęły się problemy i oddałem klawiaturę. Kolega poprzeglądał kod i zaczął przeklinać. Stanęło na tym, że zamiast QB napisał zapytanie w czystym SQL-u i tu już było trochę mniej poprawek. Gdy okazało się, że działa, resztę kodu z prostymi ifami dopisałem sam i rozszerzyłem funkcjonalność na przyszłość, bo wcześniej pytałem PM-a o trzeci przypadek działania, który nie został jeszcze ustalony/wymyślony. Zajęło mi to wszystko z 7 h, a miało być proste, jak zawsze, zwłaszcza, że rano powiedziałem PM-owi, że pewnie zajmie mi to ze 2 h, ale wtedy jeszcze nie znałem czekających mnie niespodzianek...

  Był to więc dzień z epizodem "Co ja tu robię? Trzeba było zostać ninją.", ale na szczęście jakoś się udało. Udało się też wyjść o normalnej porze z pracy, więc poszedłem na siłownię, po tygodniowej przerwie i chociaż ciężko mi się było zebrać, to się opłaciło. Ćwiczę sobie powoli martwy ciąg, czego kiedyś nie umiałem i wszyscy się bali tego ćwiczenia, bo można sobie zrobić krzywdę, ale zrobiłem spory research i nawet osoby, które niby znają się na kulturystyce pokazują czy opisują różne bzdury. Tak więc zacząłem jak ostatnio, na rozgrzewkę 40 kg plus sztanga. Dołożyłem akurat kolejne 10 kg, gdy poszedł ktoś z pytaniem czy może dołączyć. Było bardzo dużo ludzi, więc się nie dziwię, że nie znalazł wolnego sprzętu, także ochoczo się zgodziłem. Dla niego, na moje oko, był to jednak ciężar bardziej na rozgrzewkę (widać było po budowie, że już ćwiczy trochę), ale powiedział, że wystarczy, bo miał wypadek na nartach, więc dużych ciężarów nie potrzebuje. Nie potrzebuje, ale i tak założył w sumie 60 kg po chwili i pytał czy zdjąć, gdy przyszła moja kolej. No i jak to bywa w takich sytuacjach... ja nie dam rady? Potrzymaj mi piwo. Zrobiłem 5 powtórzeń z sztangą plus 60 kg, a moja twarz nabrała różnych odcieni purpury. Nic mi nie pękło i chociaż czuję mięśnie w odcinku lędźwiowym, to i tak jest lepiej niż po pierwszym razie z mniejszym o 20 kg ciężarem, gdy poprawiałem technikę. Tak, przy poprawnej coś sobie naciągnąłem i bolało mnie z miesiąc, hehe.


Dzień 19.

  Coś mi się przysnęło przedwcześnie, więc opisuje ostatni dzień rano dnia następnego. W sumie nie ma co pisać, bo dzisiaj nie było żadnych rewelacji. Rano z 1,5 h spędziłem na czytanie maili, komentarzy do kodu, wyjaśnienia i ustalenia z PM-em, typu czemu zrobiłem coś dynamicznie, skoro mówiłem, że statycznie będzie prościej. Okazało się, że dynamicznie też nie było tak źle, a senior powiedział, że jestem uparty i kto w sumie podjął decyzję o dynamiczności. Pokazałem to w kodzie i że nie pisałem tego godziny, a nawet gdyby, to i tak były to moje darmowe nadgodziny.

  Resztę dnia spędziłem na kolejnym zestawie zadań z nowego projektu. Dodanie nowego atrybutu do istniejącej klasy, migracja, a później wykorzystanie go w kontrolerach i widokach. Na końcu okazało się, że zrobiłem refactor i cofnąłem połowę zmian, bo znalazłem abstract controller, gdzie ten kawałek kodu pasował. Kolejna poprawka to jakieś filtry i do tego też jest osobna encja, w której musiałem dodać nowy atrybut, migrację itd. Tym razem znowu trochę mieszania w back-endzie i we froncie, bo jak czegoś nie widzę, to znaczy że muszę szukać w kontrolerach javascriptowych. Coś mi się tam sypało z wyświetlaniem, ale to przez ślepotę i ręczne pisanie getterów i setterów zamiast skorzystać z PHPStorma, który by to zrobił za mnie. Wolę na razie, żeby nie zrobił, bo później nic nie będę umiał napisać bez IDE. Poprawki w filtrze zadziałały, poprawki w wyświetlaniu też, tylko aplikowanie tego filtra z nowym atrybutem jakoś nie działa, więc nad tym będę siedział od rana dnia następnego. Nie skończyłem też dwóch ostatnich podpunktów, więc to też plan na jutro.


P.S. Mój główny architekt gra w Arkadię, jeżeli czytają mnie znajomi arkadyjczycy. :)

sobota, 25 marca 2017

Weekend

Sobota

  Z okazji weekendu, wszedłem sobie do wanny, do której zabieram tablet, gdzie mam jakieś apki z kursami, żeby poszerzać wiedzę. Pomyślałem, ze dokończę kurs z jQuery, który przyda mi się jako powtórka i oto efekt:



  Szkoda, że tydzień temu byłem w weekend zajęty poprawianiem strony fundacji i nie skończyłem tego kursu, bo przydałby mi się w minionym tygodniu i nie musiałbym się zastanawiać i szukać rozwiązań, które i tak znałem, ale gdzieś uciekły z głowy.

Niedziela

  Po męczącej sesji jogi, obiedzie, drzemce i kolacji, postanowiłem zajrzeć do projektu, który rozpocząłem jakiś czas temu. Google przysponsorował parę tysięcy miejsc na podstawowym kursie Androida i udało mi się na niego dostać. Trochę to ostatnio zaniedbałem, bo miałem braki czasowe, a teraz mając pracę to już tym bardziej. Do końca kursu zostały 2 tygodnie i pewnie nie zdążę zrobić aplikacji końcowej ani wykazać się aktywnością, za którą mają nagradzać awansem do dalszego etapu kursu, ale przynajmniej zrobiłem drugą "aplikację", która jest wymagana. Nazywają to "single screen app", ale ciężko to nazwać aplikacją, bo w zasadzie jest to front-end napisany w XML-u, no ale to dopiero początki. Także zrobiłem aplikację typu business card dla mojej fundacji i nawet udało mi się zrobić klikalne linki z numerem telefonu i adresem strony. Adres niestety nie przenosi do map, ale pewnie się kiedyś dowiem jak się to robi.



Następny rozdział kursu to robienie aplikacji interaktywnych, więc zobaczymy co mają na myśli, po jakiekolwiek wstęp do programowania zaczyna się dopiero w następnych lekcjach, które wcześniej nie były dostępne dla kursantów, ale znalazło się tam dużo ludzi, którzy skończyli cały kurs w tydzień albo dwa, bo wcale nie byli początkujący, co widać po ich kodzie, a kurs był zaplanowany na ponad 3 miesiące.


P.S. Ktoś mi na forum kursu podsunął rozwiązanie, które składało się z jednej zmiany po stronie XML-a i dopisanie prostej klasy do MainActivity.java i teraz po kliknięciu adresu, otwiera się mapa Google z tym adresem, więc fajnie. :)


Dzień 18.

  W piątek byłem już tak zmęczony po pracy, w której znowu siedziałem z godzinę dłużej, że odłożyłem napisanie tej relacji o jeden dzień, bo wczoraj już mi oczy krwawiły, mimo że je zakrapiam od chyba 2 tygodni. Smogu nie ma (do tej pory na niego dość mocno reagowałem), ale coś musi być w powietrzu, bo mam zapalenie spojówek, a kurz w pracy mi też nie pomaga. Niby przychodzi tam raz na tydzień jakaś pani, która przeleci mopem podłogę, ale zaczynam odczuwać szczypanie na dłoniach, a to już znak, że stężenie kurzu przerasta mój tolerowany poziom.

  Dzień w pracy zaczął się od tego, że musiałem uzupełnić coś, czym miałem się przedtem nie przejmować, czyli statusy dnia, które czyta prezes. Oczywiście wypatrzył, że ode mnie nie dochodzą, więc były jakieś podniesione głosy wczoraj, więc dzisiaj się dowiedziałem jak to ma wyglądać i uzupełnić "wpisy" za miniony tydzień. I tutaj z pomocą przyszedł mi swój własny blog, bo szybciej mi przypomniał co robiłem, niż gdy miałbym to wygrzebać z głowy albo z GitLaba. Od tego drugiego zacząłem, ale nie potrafiłem na szybko odnaleźć potrzebnych mi informacji, więc przeskoczyłem do czytania bloga i szybciej poszło. Tego się nie spodziewałem, ale byłem zadowolony, że po raz pierwszy mi się przydał, a liczę, że jeszcze się to powtórzy, gdy będę szukał jakichś rozwiązań, które tu opisałem.
  Następnie było już jako zawsze. A w sumie to gorzej niż zawsze, bo tym razem nad analizą siedziałem z 5 h, a kodowałem pewnie przez 2 h i to przy pomocy kolegi, który znał ten projekt. Po paru godzinach analizy, zaciąłem się w jednym miejscu, więc mi podpowiedział co gdzie jest, bo pamiętał. Znowu trochę rozgrzebałem, ale okazało się, że to co na "papierze" wydaje się proste, bo tylko dodanie wyświetlania jednej linijki tekstu, od strony back-endu wymagało poważniejszych zmian. W zasadzie była to nowa funkcjonalność, bo stara, podobna wykorzystywała trochę inny mechanizm i ponoć ma być usunięta. Ja musiałem dopisać nowy end-point i minimum poprawek we front-endzie (tekst plus odpytywanie back-endu co 10 s o aktualizację stanu). Do tego chwila testu, czy działa i czy czasem event nie przenosi się w inne miejsca, bo ponoć się tak zdarza, gdy strona nie jest przeładowywana, tylko odświeżana dynamicznie. W poniedziałek dopytam, czy zostawić ten tekst jaki jest, coś ostylować, czy przekazać do dalszej pracy dla front-endu.

  Przy okazji ciekawostka, bo nie do końca byłem pewien co do pisowni jednostek miar po liczbach, gdyż najczęściej zdarzało mi się je sklejać z liczbą, ale gdy napisałem "co 10 s o" zaczęło mi to brzydko wyglądać. Brzydko, nie brzydko, ale poprawnie co można sprawdzić tutaj.

czwartek, 23 marca 2017

Dzień 17.

  Dzisiaj klasycznie, 3 albo 4 godziny grzebania w projekcie, żeby znaleźć jakąś pierdołę, której poprawienie zajęło chwilę. Przy okazji, próbowałem rozwiązać ze dwa inne znalezione po drodze problemy, ale było jak zawsze, że nie było tego w zleceniu, to może później się tym zajmiemy. Moja zmiana miała coś zmieniać w jednym widoku, ale fakt, że było to w metodzie __toString() obiektu, wpłynie też na inne elementy projektu, więc szukałem trochę czasu kogoś do pomocy i przegadania, co z tym dalej. W efekcie, poprawkę wysłałem wraz z merge requestem, ale jeszcze jutro mamy testować.
  Grzebiąc w projekcie wynajduję coraz to nowe problemy, więc albo rosnę na testera, albo mnie wyrzucą z pracy. ;) Kolejna zaproponowana przeze mnie zmiana i chęć sprawdzenia czegoś jak wygląda "na produkcji" skończyła się niby pochwałą za pomysł, ale i kolejnym odkładaniem w czasie. Muszę się chyba nauczyć, że jak widzę jakiś problem, to nie naprawiam go od razu, tylko odkładam na później. Nawet mi Project Manager powiedział, żebym sobie założył zeszycik z odkrytymi błędami i je później zgłaszał...
  Może i to zabawne, ale chwilę później, gdy chciałem sprawdzić jedno podejrzenie co do skryptu odpalanego z crona, wywaliła mi się aplikacja. Po drodze usunąłem brancha, który został zmerdżowany (rany, nawet nie wiem jak to słowo napisać w polglishu), ale zrobiłem pulla na głównej gałęzi wraz z moimi poprawkami wcześniejszymi, więc powinno działać. Znowu się zastanawiam co źle zrobiłem, że się projekt wywala. Paczam sobie na procesy i load w systemie i cos jest nie tak. Restartuję apache'a, ale nie pomaga. Restartuję apache'a i mysqla i coś się poprawiło. Powtarzam test z mniejsza ilością danych i jest ok. Zaznaczam trochę więcej i znowu się coś sypie. Zaglądam do logów Symfony, a tam coś cały czas mieli, chociaż zamknąłem aplikację. Sprawdzam rozmiar a log ma już prawie 180 MB. Znowu jakieś restarty i teraz wrzucam terminal z logiem na drugi monitor i powoli klikam. Kliku klik i jeb! Znowu mi sypie jakimiś śmieciami na ekran i muszę restartować serwisy. Gdzieś tam dojrzałem rosnące cyferki i zaczęło mi to pasować do id obiektów w bazie. Wracam do front-endu i przyglądam się checkboksowi "zaznacz wszystko". Skoro na stronie jest paginacja i wyświetla się tylko 10 pozycji na raz, to taki checkbox do zaznaczania wszystkiego, jak do tej pory zaznaczał mi wszystko, ale na danej stronie. Tutaj się przyglądam uważnie i widzę tekst o liczbie zaznaczonych pozycji. Liczba ponad 42000 w chwilę uświadamia mi, co się zaczęło dziać z moją bazą i webserwerem. Napisałem do PM-a z pytaniem, czy klient jest świadomy co się dzieje po kliknięciu tego checkboksa i że grozi to katastrofą.
  Oczywiście wszystko mi się zaczęło sypać w momencie, gdy miałem się zacząć wdrażać w nowe zadanie i znowu szukać co i gdzie się dzieje w tym projekcie... Wyłączyłem komputer i poszedłem w cholerę, bo znowu coś się sypie nie z mojego powodu, a ja się martwię, że to moje zmiany coś popsuły...

  Nieco wcześniej, na przerwie w kuchni, rozmawiałem z nową koleżanką i okazało się, że kończyliśmy ten sam kurs programowania, tylko ona nieco wcześniej. Jednak jej szukanie pracy prawie nic nie zajęło i praca ją sama znalazła tuż po kursie, a mnie zajęło to parę miesięcy. Co ciekawe, pracowała w firmie, która i do mnie się odezwała, tylko niestety mnie nie proponowali stanowiska programisty, więc im podziękowałem. Może nawet tak źle nie wyszło, bo koleżanka nie była z nich zbyt zadowolona.

  Ze spraw przyziemnych, a więc nie związanych z programowaniem, przewróciłem się na schodach do metra i nie wiem jak to się stało. Posiedziałem chwilę zamroczony, zastanawiając się, co się właściwie wydarzyło i czy mogę się ruszać, ale otrzepałem się i poszedłem dalej. Pomogła mi jedna kobieta, bo reszta ludzi mnie po prostu ominęła. Pewnie to normalne, że nagle w połowie zejścia ktoś siada na dupie. Być może to kwestia pogody i ciśnienia, bo słyszałem takie doniesienia, a w pracy, gdzie muszę wchodzić 2 piętra po kręconych schodach na górę do wieży programistów i schodzić tyleż samo do kuchni, też miewałem dzisiaj wrażenie, że jakoś niepewnie się czuję, chociaż na co dzień śmigam po tych schodach dziarskim krokiem w ramach ćwiczeń fizycznych.
  Miałem też w pracy sytuację, która mnie wkurzyła, bo mi zawracali dupę w momencie, gdy miałem głowę pełną ośmiornicy kodu, a senior widząc moje wkurzenie, postanowił mnie rozbawić przysyłając zdjęcie uśmiechniętego kotka. Nosz, Kumar jego mać, nienawidzę zdjęć kotów w internecie! Humor mi się poprawił dopiero, gdy zrobiłem kawałek swojego zadania, a gdzieś kątem ucha usłyszałem rozmowę seniora z PM-em o planowaniu pracy oraz że juniorzy sobie na razie nieźle radzą, więc puściłem porozumiewawcze spojrzenie i 2 x 👍 do drugiego miniona, erm, juniora, a w sumie juniorki.

PS. Znienawidzone kocisko od seniora wygląda tak. Nie, nie dawaj lajka!



środa, 22 marca 2017

Dzień 16.

  Rozpocząłem od grzebania w back-endzie, bo już wczoraj wiedziałem mnie więcej gdzie. Poprawka była w miarę prosta, bo polegała na zmianie repozytorium, z którego będą pobierane dane. Przeklikałem trochę, żeby sprawdzić czy działa przenoszenie między różnymi obiektami, a przy okazji znalazłem jakiś błąd, który zgłosiłem i będzie do naprawienia później, poza oficjalnym zamówieniem klienta. A znalazłem błąd dlatego, że myślałem, iż to moja poprawka coś popsuła, a tym czasem problem jest gdzieś indziej i nie aktualizuje się jedno pole, mimo iż powinno być puste. W ten sposób nie mogłem odnaleźć swojego obiektu wpłaty, który był przenoszony do innego rodzaju darczyńcy. Nagle ślady po tych wpłatach były w 3 innych obiektach, a ona sama była tylko w jednym. Wiedziałem już, że to nie moja wina, więc przestałem się na razie przejmować, a kolega na Slacku zasugerował, w której metodzie może być błąd.
  Nadszedł czas próby, a więc kolejny typ obiektu, gdzie ostrzegano mnie, że wpłaty dla niego są inaczej rozwiązane. Oczywiście okazało się, że po przeniesieniu obiektu wpłaty do tegoż obiektu darczyńcy, zaczęły się problemy z wyświetlaniem, a "zły duch Symfony", jak nazywam tego duszka, który wyskakuje podczas błędów pokazał mi, że brakuje jednego pola. Sprawdziłem co i jak i poprosiłem o poradę techniczną. W międzyczasie było krótkie spotkanie statusowe z PM-em i zaraz później poszliśmy do głównego architekta, żeby przedstawić problem i pogadać o rozwiązaniach. Skończyło się wymuszonym ustawianiu tego pola na wartość 1 przy przenoszeniu w jedną stronę, a w drugą zachowywała się automatycznie. Problem rozwiązaliśmy (bo sam tylko kawałek napisałem) w sposób taki, że sprawdzaliśmy czy obiekt przenoszony jest (a w zasadzie to !jest) instanceof obiektu rozszerzonego i jeśli nie był to tworzyliśmy obiekt rozszerzonego typu, gdzie po zmianach w jego konstruktorze robiliśmy kopię obiektu podstawowego (rozszerzony dziedziczył po klasie podstawowej) i dodawaliśmy na sztywno ustawione na 1 wspomniane dodatkowe pole. Troszkę mi się "pozajączkowało" (pojęcie autorstwa mojej polonistki z podstawówki) przy tym kopiowaniu atrybutów, bo było ich sporo i skopiowałem o jeden za dużo, dzięki czemu wpłaty uległy cudownemu rozmnożeniu, ale nie było z nimi żadnych relacji z darczyńcą, więc pieniądze niejako spadły z nieba, a już szczególnie, że to projekt dla klienta, który jest organizacją katolicką zajmującą się redystrybucją donacji. :)

  W międzyczasie jeden kolega chciał skorzystać z moich skilli administracyjnych, bo zainstalował wreszcie Linuksa, tylko coś mu nie działało wchodzenie do MySQL-a na konto roota bez hasła. Ja na szczęście od razu ustawiłem sobie hasło, bo już widziałem jak się kończy domyślne ustawienie braku hasła na koncie roota w MySQL-u. W domu też musiałem walczyć z tym, że przy domyślnej instalacji było coś nie tak, więc już swoje zmarnowałem na grzebanie po sieci. U mnie skończyło się to przestawieniem jakiegoś pluginu do autentykacji, tyle że ja mogłem się do swojej bazy zalogować, a kolega nie bardzo. Jako, że to była świeża instalacja i nie miał tam żadnych danych, postanowiłem spróbować innego sposobu. Odinstalowałem wszystkie paczki mysql-server-*, mysql-common z opcją --purge, usunąłem /etc/mysql/ oraz przede wszystkim wszystkie bazy z /var/lib/mysql. Po tej operacji ponowiłem instalację paczek mysql-server*  i wtedy, gdy pojawiło się okienko z pytaniem o hasło roota, kazałem mu na moich oczach coś tam ustawić, a później sprawdzać czy może się logować na konto roota w MySQL ze zwykłego konta użytkownika przez: mysql -uroot -p. Na szczęście zadziałało i więcej o nic nie pytał.
Gdzieś tam po drodze odezwał się jeszcze inny kolega, który również miał problemy, ale jemu się udało dodać zwykłego użytkownika i jakos mu to działało. Wspomniał coś o "jakichś tam socketach", ale nie wiedział bardzo o co chodzi. Ten pierwszy, który mnie prosił o pomoc też przeczytał o socketach, ale też nie rozumiał czego od niego chcą. Okazuje się, że można być programistą i nie wiedzieć co to socket. Wyjaśniłem na szybko, a w razie czego sobie doczytają, skoro nie zastanawiali się nigdy jak ten mysql-client z terminala działa, skoro nie podają numeru portu. Z resztą, może nigdy  nie pisali kodu, który musiał się łączyć z bazą na innej maszynie, tylko wszystko było lokalnie.

  Skończyłem poprzednie zadanie z przenoszeniem między różnymi obiektami i wziąłem się za nowe w tym samym projekcie. Klasyczne zadanie typu "zajmie Ci to góra godzinę, bo to prosta poprawka w wyświetlanym formacie". No pewnie, to zawsze są proste zadania, a później się okazuje, że żeby wygenerować PDF-a, muszę odpalić specjalnie dopisany skrypt do symfoniowego app/console i jakimś cudem ten skrypt się wywala i wypluwa z siebie losowe zipy. Także zanim się zaczęło grzebanie w zadaniu, trzeba było przejrzeć skrypt, posprawdzać gdzie przestaje działać (die("Boom!");) i rozgryzać co się stało, skoro wszystko pasuje do dokumentacji tej biblioteki. Ktoś gdzieś w sieci napisał, że też miał taki błąd przy aktualizacji do php5.6, ale jego rozwiązanie zupełnie tutaj nie pasowało. Zrobiliśmy wreszcie jakiś quickfix, który zadziałał, ale bez rozumienia czemu tak się w zasadzie dzieje, bo tu by już trzeba było głębiej grzebać w bibliotece, a na to już było późno, bo i tak nadgodziny robiliśmy powoli.

  Na koniec jeszcze czekała mnie poprawka w README.MD od tego projektu i skoro poprzednią zrobiłem przez interface www GitLaba, to teraz chciałem zrobić to samo (na GitHubie tak robiłem, bo było szybciej i był od razu podgląd czy markdown dobrze działa). Usłyszał to architekt i powiedział, żebym więcej tak nie robił, bo kiedyś coś im się tak rozsypało i że mam to robić lokalnie, a w PHPStormie mam podgląd i powinno wystarczyć. Średnio wystarcza, bo podgląd tabelek nie działa. No ale zrobiłem to lokalnie. Tylko, że bezpośrednio w gałęzi develop, bo nie chciałem w tym celu robić oddzielnego brancha i merge requesta. Po wykonaniu pusha, ze zdziwieniem zobaczyłem, że nie ma znanej mi już informacji, że mam kliknąć w link i zgłosić merge request. Jutro czekam na komentarz, że nie pracujemy na gałęzi develop i jestem niegrzecznym chłopcem. O 19.30 i informacją, że za 10 minut wszyscy mają wyjść z firmy, już ciężko się myśli i pamięta o rzeczach, do których jeszcze nie ma się wyrobionych nawyków.


wtorek, 21 marca 2017

Dzień 15.

  Zaczęło się poważnie, bo na firmowym Slacku napisał do mnie senior, który dzień wcześniej się znowu próbował ze mnie nabijać. Napisał, że absolutnie nie próbuje powiedzieć, że jestem głupi i że to wszystko żarty, ale jeśli mnie obraził to przeprasza. Odpowiedziałem, że znam się na takich żartach i sam się wychowywałem wśród ludzi, którzy nieustannie sobie docinali, ale wszyscy wiedzieli, że to nie jest do końca złośliwe, tyle że z czasem takie zachowania wchodzą w krew, więc staram się tego od wielu lat oduczyć, bo czasem takie żarty trafiają na przewrażliwionych ludzi i robi się przykro. Na koniec dodałem, żeby się nie przejmował, bo nikt kto nie umie nagrać płyty DVD nie jest w stanie mnie obrazić. :>

  Od rana grzebałem w nowym projekcie, który dostaliśmy dzień wcześniej. Znowu jakaś pierdółka, typu trzeba dodać <select> z jakimiś opcjami i to oczywiście jest proste, tylko przebicie się przez Symfony i znalezienie zależności znowu zajęło mi ze 2h. HTML-a ogarnąłem w miarę szybko, ale już dynamiczną obsługę tego okienka musiałem trochę pomęczyć, bo JS i jQuery uczyłem się przez tydzień, plus napisanie projektu, który to ze sobą łączy przez RESTful API. Zajrzałem do swojego kodu z tego projektu i oczywiście tam było wszystko jasne, a tutaj ponownie zastanawiałem się co się dzieje i jak te parametry są przekazywane. W międzyczasie było spotkanie statusowe z PM-em i jakoś chwilę później mnie olśniło jak to wszystko ma działać. Znowu doszedłem do etapu, że 3h analizy i 2 linijki kodu... Resztę czasu spędziłem na poprawianiu widoków dla pozostałych obiektów i trochę zabawy z jQuery, żeby ustawiać <option> w zależności od encji, dla której jest wyświetlany widok. Najpierw zrobiłem w prosty sposób, ale w międzyczasie PM wpadł na pomysł, że tak będzie fajniej, więc musiałem poprawiać poprzedni kod. Zrobiłem pewnie ponad 10 commitów do repozytorium.

  Porobiłem trochę testów i wszystko działało. Poza back-endem, no ale tego się można było spodziewać. Zajrzałem do opisu zadania i było tam wspomniane gdzie szukać problemów, więc jutro od rana pewnie będę w tym grzebał, ale na razie doczytałem, że jeszcze jedną rzecz we froncie trzeba zrobić (czyszczenie drugiego inputa z wynikami wyszukiwania, jeśli zmieniła się wartość w pierwszym okienku). Kawałek napisałem, poprawiłem poprzedni kod, żeby nie dublować zapytań przez jQuery i nagle słyszę swoje imię, ledwo przebijające się przez muzykę w słuchawkach. Zdejmuję i pytam o co chodzi. Padło pytanie czy do mnie dotarło, że za 2 minuty wychodzimy z pracy. No więc cóż, znowu musiałem zostawić rozgrzebany kod, ale już raczej niewiele w tym froncie zostało. Dobrze, że podszedł do mnie ze 2 lub 3 razy w ciągu dnia, kolega który dużo w tym projekcie napisał, więc mi wskazał parę miejsc i nie musiałem się przeklikiwać przez dziesiątki plików. On też rozwiązał mój problem, czemuż to zmiany w kontrolerze po stronie JS nie chcą mi działać. Padło magiczne hasło Gulp i konieczność jego instalacji (lecz oczywiście najpierw NodeJS, żebym mieć npm, żeby mieć Gulpa.. Doh!) oraz odpalania po każdej zmianie w plikach .js. Trzeba będzie poczytać o Gulpie, chociaż na razie wystarcza mi wiedza, żeby go uruchamiać po zmianach, a on już resztę sam zrobi.

Gulp oczywiście nie zadziałał ot tak od razu, mimo instalacji z repozytoriów Ubuntu. W skrypcie uruchomieniowym była linijka:
 #/usr/bin/env node
a w systemie binarka od NodeJS, nazywała się... nodejs, więc musiałem ręcznie ten skrypt poprawić. Gdybym nie miał linuksowego doświadczenia, pewnie znowu bym przeklinał, że cos nie działa. Ot tak jak koledze wczoraj przestał wstawać system. Podchodzę a tam busybox i initramfs. Pytam co zrobił, że doprowadził do takiego stanu, a on na to, że tylko dropa bazy w MySQL-u. No to grzebię tam i patrzę, uszkodzony system plików, więc naprawa, restart i działa. Nie wiem jak drop bazy może wysypać filesystem, ale jak widać wszystko jest w tych czasach możliwe. Poszedłem się coś napić, wracam, a kolega, że teraz sieć mu nie działa. No, psia mać, samo z siebie? Koniec końców mu to naprawiłem, ale dziwne rzeczy się tam działy i może nie do wszystkiego się przyznał co robił. 

Miałem tu być w końcu programistą, prawda? ;)

PS. Zwolennikiem Linuksa w wersji serwerowej i tak pewnie długo jeszcze zostanę, ale udało mi się zrobić takie ciekawe zdjęcie w autobusie:


Oczywiście chodzi o tablicę z rozkładem jazdy, która się popsuła i prosi o naciśnięcie dowolnego klawisza, a nie o blondynkę, ale każdy tu znajdzie coś dla siebie.


poniedziałek, 20 marca 2017

Dzień 14.

  Rano próbowałem pogrzebać we front-endzie jednego projektu, ale trochę zapomniałem jak się pisze pewne rzeczy, więc za długo mi to szło. Dostałem polecenie, żeby to już olać i zająć się nowym projektem. Wrzucono mnie i nową koleżankę do nowego projektu, więc było spotkanie z PM-em, który opowiadał co i jak, aż zrobiła się 13.00. Koleżanka dostała klasyczne zadanie, czyli "zainstaluj sobie system, niech będzie to Linux Mint 18", więc tylko czekałem w napięciu aż coś się zacznie sypać. Zaczęło się dosyć szybko, bo już przy próbie bootowania świeżo nagranej płyty (żeby nie było, że znowu cos nie tak z pendrive'em itd.). Zajrzałem tam, nie startował nawet GRUB, więc powiedziałem, że za te podśmiechujki głównego architekta, że nie umiem zainstalować sobie Linuksa, ja się teraz będę śmiał, że on nie umie nagrać płyty. Coś tam w międzyczasie kombinowali z przepinaniem zewnętrznego napędu, aż w końcu ruszyło, bo zawołali mnie, żebym pomógł przy podziale na partycje. Pomogłem, zainstalowało się. Podszedłem sprawdzić jak wygląda pierwsze uruchomienie i było ok, Cinnamon się nie zawiesił. Na wszelki wypadek kazałem jej zrestartować parę razy komputer, bo u mnie to raz działało a raz wisiało. U niej zadziałało kilkukrotnie, więc mogła sobie doinstalowywać inne rzeczy. W tym komputerze była inna płyta główna niż w tych, w których mieliśmy problem i inna karta graficzna. Może jeden z tych elementów wpłynął na to, że tym razem instalacja i działanie było bezproblemowe. Poza pierwszym bootowaniem płyty instalacyjnej, ale później pan architekt mówił coś, że ta płyta chyba się źle nagrała, więc dopiąłem swego i przedrzeźniałem go, że nie umie nagrywać płyt. Teraz już zawsze będę tak odbijał piłeczkę, jak usłyszę, że taki ze mnie mechanik od mercedesów a z maluchem sobie nie mogłem poradzić!

  Od dzisiaj też pewnie będą śmichy-chichy ze mnie i ekspresu do kawy, bo nawet prezes podjął temat i mi docinał, że niezły buffer overflow zrobiłem. Do tej pory, gdy parzyłem kawę (Jessicka jest wiecznie poza pracą i tylko stoi jej puste krzesło i komputer przy wejściu), wsypywałem dwie zawartości młynka do ekspresu (ręcznie mielimy kawę, bo ekspres z tych tańszych) , bo jedna byłaby raczej za słaba, ale nie był to pełny młynek. Kolega, który był przy mnie powiedział, że zawsze widział, ze ludzie wsypują do młynka kawę z usypaną górką. No to zrobiłem z górką. Szkoda, że chwilę później mnie wołali na dół, że coś stało się z ekspresem. No cóż, ulało się trochę temu ekspresu i musiałem sprzątać. Później się dowiedziałem, że ten młynek z górką usypaną z kawy, który "ludzie robią" to był tylko jeden... :)

  No nic, po obiedzie w postaci kebabu i sprzątaniu kuchni, wróciłem wreszcie do zajęć programistycznych. Ściągnąłem projekt i zależności, uruchamiam i od razu error do kolegi Ajaksa. Zaglądam, a biedaczek ma jakieś kłopoty z bazą, którą wcześniej wgrałem (gdy już dostałem z zewnątrz, bo ta w builderze projektu się sypała przy imporcie). O dziwo, dane się wyświetlają, ale i tak co chwila error. Sprawdzam o co chodzi, a tam nie podoba mu się (w sumie to nie Ajaksowi tylko back-endowi) grupowanie danych przy selectach. Pytam wokół czy ktoś coś i architekt na hasło "strict" kojarzy, że była jakaś zmiana w MySQL-u. No więc szukam zmiany, stosuję i poprawiam readme.md w projekcie. Okazało się, że w wersji 5.7, którą mam wraz z system zmieniono pewne rzeczy, a jak je sprytnie odmienić, najlepsze rozwiązanie znalazłem tu:

How to Disable Strict SQL Mode in MySQL 5.7

  Dobrałem się wreszcie do projektu, przejrzałem trochę plików i akurat podszedł kolega, który ma być dla nas supportem w tym projekcie i momentalnie mi wskazał, gdzie w encji są ograniczenia, których szukam. Wcześniej tego na oczy nie widziałem, więc pewnie nawet bym tam nie zajrzał, także kolejna ciekawostka w moim rozwoju. Poprawiłem encje, "popsułem" bazę, bo były constrainty i zaczęło działać. Teraz tylko wypadałoby to zrobić zgodnie ze sztuką, więc potrzebowałem diffa do migracji bazy i tutaj miałem kolejną niespodziankę, bo wygenerował się pusty. Miałem więc okazję, żeby pobawić się różnymi komendami php app/console doctrine:migration:xxx i zobaczyć jak to działa, bo do tej pory używałem tylko doc:schema:update. Przy okazji dowiedziałem się, że można operować skrótami komend w konsoli Symfony. Gdy dostałem pierwszy raz info od seniora, żeby zrobić doctrine:mig:mig -n, pomyślałem że po prostu nie chciało mu się pisać doctrine:migration:migrate, ale kolega powiedział, że można nawet d:m:m napisać, ale mig:mig jest zabawniejsze i łatwiej zapamiętać. Zaczęło się od tego, że polecił mi komendę app/console d:d:d, ale nie sprawdzaj jej, drogi Czytelniku! To taka sama zła komenda, jak w jednym mądrym poradniku o pisaniu skryptów w Bashu, gdzie jako przykład użycia przełączników podano komendę: rm -rf /. Autora tego poradnika, ktoś powinien mocno uderzyć w głowę...


P.S. Nowej koleżance poleciłem od razu instalację PHP w wersji 5.6, poza 7.0, który jest z systemem, bo trafi tak jak ja na starszy projekt i będzie się zastanawiać co się dzieje. Wystarczy, że teraz jej projekt nie ruszał, a to była tylko kwestia uprawnień do cache'a i logów. Polecana wersja i repozytorium znajduje się tutaj:

Ondřej Surý

Przy okazji podmieniłem domyślną wersję PHP w systemie:

update-alternatives --set php /usr/bin/php5.6

Pamiętać też należy, żeby przełączyć moduły w Apache'u. Teraz robi się to przez:

a2dismod php7.0 oraz
a2enmod php5.6

Można też ręcznie bawić się z symlinkami, ale w sumie powoli przekonuję się do używania tych komend.

Skończę ten wpis i zaraz to samo robię na domowym systemie, żebym nie miał niespodzianki jak przyjdzie pracować zdalnie.

niedziela, 19 marca 2017

Dzień 13.

  Wreszcie udany dzień! Raz tylko zaczepiłem seniora o jakąś bzdurę. Napisałem od razu dobrze metodę do pobierania danych, ale błąd był gdzie indziej (literówka). Grzebiąc i kombinując poprawiłem dobrze napisany kod na źle i dalej już poszło. Senior mi wycofał większość zmian, wróciliśmy do mojego kodu z początku i działało. Znowu mi się głupio zrobiło, ale przynajmniej teraz kojarzyłem, że problemem była literówka w konstruktorze tej metody w innym pliku.
  To był jeden z czterech podpunktów tego zadania, a dalej poszło już całkiem zgrabnie. Dodanie nowego atrybutu do encji (to co parę dni temu musiałem cofać) i poprawka w formularzach do edycji danego zlecenia, wraz z testami czy to dobrze działa z każdego miejsca tego CRM-a.
  Ostatnim elementem była poprawka w kodzie, który zaznaczone obiekty z formularza eksportował do formatu Excela. Tu znalazłem 4 pliki pisane przez kolejnego kolegę z firmy, bo tam się dużo nazwisk przewija w komentarzach, więc każdy się już z tym męczył w pewnym momencie. Ten fragment wymagał ode mnie głównie obejrzenia pliku wynikowego i dodaniu odpowiednich kolumn w plikach do konwersji.
  Została jeszcze jedna rzecz do omówienia, ale zostawiliśmy to na później, bo ten projekt, który miał się skończyć tydzień temu i wreszcie miał być czas dla mnie, jakoś uparcie nie chce działać i się skończyć. Także pozostała mi jeszcze zabawa z JS, który będzie dynamicznie zmieniał pola w tych formularzach, ale to po dogadaniu szczegółów z seniorem, bo już raz się źle zrozumieliśmy i jak w tym słynnym obrazku, klient chciał huśtawkę a ja mu zacząłem robić karuzelę. :)



  Nie znalazłem tego obrazka w wersji z karuzelą, ale ten przedstawia problem.



Dzień 12.

  Ciągnie się za mną ten nieszczęsny projekt ze źle nazwanymi encjami i jeszcze gorzej tabelkami, które je reprezentują. Po co nazwać tabelę w bazie tak samo jak encja, skoro można dodać coś od siebie, albo przestawić kolejność słów. Udało mi się wreszcie dokończyć jedno z zadań. Metoda jeszcze wczoraj działała, a dzisiaj przestała. Senior naprowadził mnie na przyczynę. Okazało się, że przestało działać, bo zmieniłem branch, gdyż miałem dwa rozgrzebane i cofnęły mi się zmiany w kodzie, a nie wszystkie nadpisałem...

  Później dostałem dość proste zadanie (pewnie 15 minut dla kogoś, kto ogarnia), ale mnie zajęło ze 3h, z czego godzinę doinstalowywałem php5.6 i je konfigurowałem, bo projekt z php7 domyślnie zainstalowanym z systemem, po prostu nie działał. W zadaniu miałem wyłączyć jeden punkt api i w to miejsce wstawić odpowiedź w jsonie z paroma danymi. W sumie banał jak na to patrzę po fakcie, ale z głowy bym nie napisał, a dokumentacja i Stackoverflow zawiódł ponownie. Później znowu wróciłem do "ulubionego projektu", gdzie miałem rozgrzebane zadanie. I już prawie witałem się z przysłowiową gąską, ale kazali mi iść do domu, bo wychodziła ostatnia osoba, która ma klucze do firmy. Jak patrzę ile czasu mi takie pierdoły zajmują, to mam nadzieję, że już niedługo będę się mógł z tego śmiać, że jak mogłem nie wiedzieć jak pobrać dane z obiektu, którego jeden z atrybutów jest kolekcją innych obiektów... Ale przy tak durnym projekcie i nazwach wszystkiego co się w nim znajduje może nie będę się śmiał, tylko jeszcze bardziej przeklinał niż teraz.

Dzień 11.

Znowu się zastanawiałem czy nie jestem na to za głupi, bo najpierw nie mogłem sprawdzić stanu checkboksa po stronie back-endu znanymi mi i znalezionymi w sieci sposobami, a później, gdy już dostałem rozwiązanie i się zawstydziłem, nie potrafiłem sobie poradzić z dokumentacją i innym problemem. Niby czytałem różne dokumentacje przez lata i jakoś to ogarniałem, a jednak dokumentacja do Symfony mnie zaskakuje. Co prawda, było to coś nowego, a więc korzystanie z QueryBuildera, czyli takiego niby ułatwienia zamiast pisania własnych własnych zapytań w DQL-u, ale wszystkie przykłady były na prostych obiektach (w materiałach z kursu też były podstawy, które pozwoliły mi tylko zacząć). Gdy doszło do zrobienia zapytania na dwóch encjach z dwoma warunkami to już się zapętliłem. W końcu mi senior pokazał jak się tam robi join na dwóch encjach, bo w rezultacie tego mi zabrakło, ale i tak mi było głupio, że poświęciłem ze 2 albo 3 godziny na 5 linijek kodu. Za to dowiedziałem się jak korzystać z var_dumpa w Symfony, tak żeby go sensownie podejrzeć, bo jakoś z kursu tego nie wyniosłem i pamiętam, że var_dumpy kończyły się białym ekranem. Okazało się, że w devtoolsach w przeglądarce trzeba zajrzeć do zakładki network i tam kliknąć w request, a następnie podgląd, bo Sf przy dumpie podczas POST-a, po prostu nic nie robi, jakby się nie kliknęło w przycisk w ogóle (przynajmniej w tym projekcie, bo tam jest ajax we front-endzie). To mnie bardzo uszczęśliwiło, bo wreszcie zobaczyłem co się dzieje z danymi, które obrabiam i nie jestem jak dziecko we mgle, które na oko coś tam programuje. Dzięki temu sprawdziłem czy poprawka pętli foreach, którą napisałem 2 dni temu, a która mogła przy większej ilości danych zalać pamięć, po zamianie na zapytanie w bazie w repozytorium danej encji, po prostu działa jak trzeba. To był drugi raz, gdy się tego dnia uśmiechnąłem i krzyknąłem: Niech żyje var_dump! A propos, zamiana var_dumpa na print_r, żeby ładniej wyglądało skończyła się tak, że przerywało mi muzykę, a podgląd w devtoolsach pojawiał się po 10 sekundach, więc trzeba na to uważać.

Dzień 10.

  Większość dnia zastanawiałem się co ja tutaj robię, bo przestałem rozumieć projekt, nad którym siedzę od tygodnia. Po prostu jest tak fatalnie zaprojektowany, że nic tam nie jest oczywiste i widząc encje o nazwach: DayOrder, CustomerOrderDay i jakieś inne kombinacje tych trzech słów, po prostu miesza mi się w głowie i chyba sobie to rozrysuję ponownie. Na dzisiaj miałem zaplanowane 2 podpunkty. Jeden z nich miał być na "15 minut dla kogoś kto wie co robi, więc zrób to w godzinę". Efekt był taki, że mi się ta godzina rozciągnęła do 6h, po czym senior przyszedł do mnie, popatrzył, pogrzebał i powiedział, że jest tak źle zaprojektowana baza, żebym to zostawił i zrobił inny punkt, a on nad tym w domu posiedzi, bo klient już zaczął mocniej naciskać. Z tym drugim "wystarczy dodać checkbox", skończyło się na razie tak, że 1,5 h dodawałem durny checkbox, bo żadne z rozwiązań nie działało jak trzeba. Nauczyłem się za to jak to jest przeskakiwać między branchami w gicie ("O kurwa! Gdzie jest mój cały kod z wczoraj?!"), bo trzeba szybko wycofać zmiany i zająć się czymś innym.

  Miałem też dzisiaj towarzystwo małej debuggerki, którą kolega przyprowadził do pracy, ale postanowiła wdrapać się do mnie na kolana i domagać drapania.




  Drapanie jej, pomagało mi w uspokojeniu umysłu i analizie, ale czekam teraz jaki mi zrobi code review, bo jak widać patrzyła ze sporym zainteresowaniem.


Dzień 9.

  W weekend postanowiłem przypomnieć sobie Symfony od zera. Zrobiłem jakiś prosty projekt z encjami typu Autor i jego Książki. W miarę wszystko rozumiałem. Przychodzę do pracy, patrzę w ten kod i znowu mam zaćmienie. Mówię o tym architektowi, a on na to, że niestety ta baza jest źle zrobiona i ogólnie projekt taki sobie, na kupionym gotowym mechanizmie. Kończę wreszcie wersje back-endową, która miała proste zadanie, aby usunąć wszystkie zaplanowane zamówienia klienta. Niby proste, ale nazwy encji kompletnie nic mi nie mówią, chociaż wstępnie sobie rozrysowałem co i jak.

  Teraz zaczyna się nowa bajka, czyli okienko z potwierdzeniem, czy aby na pewno chcemy to wszystko usunąć. No to kombinacja jak się modal window robi w Bootstrapie. Trochę grzebię w gotowym kodzie, ale ten który jest obsługuje głównie tabele. Muszę dodać własny plik javascript i zrobić obsługę klikania tego przycisku. Zaczynają się schody z podpięciem tego do front-endu, bo są jakieś pliki zmyłkowe, które wyglądają na prawidłowe. Jednak zmiany w nich nic nie dają i dowiaduję się, że ten katalog jest dla front-endowców, ale w sumie mam tam nie grzebać, tylko poprawić twiga. To było wręcz oczywiste, gdyby nie to, że już grzebałem wcześniej w tym katalogu i wszystko wyglądało ok. Robię w końcu ten przycisk, ale oczywiście nie reaguje mi na potwierdzenie, że został kliknięty, bo zostało to wyłączone. Szukam jak zrobić klika na tagu <a> z poziomu jQuery. Żaden znaleziony przykład tego nie pokazuje. Przychodzi architekt i mówi, żebym nie robił żadnych klików z jQuery, bo to zły pomysł i problem rozwiązuje przez window.location.href, którym po prostu przeładowuje kawałek strony. Działa, więc się nie czepiam, zwłaszcza, że i tak poszedł do domu. Commit, push i też do domu, bo już wyganiają (klucze do firmy ma tylko kilka osób, więc jak wychodzą to wyganiają resztę). Lekko nie jest, a jeszcze 2 punkty mam w tym zadaniu do zrobienia, więc znowu będę się męczył z tymi encjami. Szkoda, że tak późno tę pracę dostałem, bo po takiej przerwie bardzo opornie mi to idzie, a na kursie było w miarę ok. W każdym razie, wiedza się przydaje i jeszcze ani razu nie było komentarza, że jak mogłem nie znać takich podstaw. Także nie mogę narzekać na wartość wiedzy wyniesionej z kursu.

  Rozmawialiśmy też sobie z panem architektem na wyższym poziomie abstrakcji, rozdzielania różnych warstw oprogramowania i dlaczego gettery i settery to zło. To było dość ciekawe, chociaż ponad podstawową wiedzę, którą reprezentuję, ale brzmiało sensownie w kwestii usprawnienia procesów, chociaż takiego frameworka chyba jeszcze nie ma.

Dzień 8.

  Poprawkę w kodzie w końcu znalazł mi główny architekt. Okazała się być durna i we front-endzie, ale ja nie umiałem tego zdebugować. Coś mi na szybko pokazał, ale połowy nie zapamiętałem, bo za szybko się przeklikuje przez to IDE. To była kwestia braku atrybutu "value" w tagu <option> i formularz się nie walidował wracając do back-endu.
  Dostałem kolejne 3 punkty do zrobienia. Przycisk do kasowania czegoś tam i i jego obsługa "od tyłu". Okazuje się, że po przerwie niewiele pamiętam już z Symfony i średnio ogarniam, a jeszcze nazwy obiektów/encji w tym projekcie są takie, że nie wiem o co chodzi. W weekend czeka mnie powtórka Symfony, bo miałem problem z napisaniem prostego kontrolera.

Dzień 7.

  Cały czas grzebię w tym projekcie w Sf2. Poznaję powoli jak robić formularze, w których są zagnieżdżone kolejne fragmenty formularzy, w których są zagnieżdżone... Niestety rozszerzony formularz wciąż nie chce działać, dane POST-em idą do back-endu, ale tam już nic się nie dzieje. Miało być proste dodanie kolejnego adresu do klienta. Piszę różne dziwne rzeczy związane z "address". Parę godzin później dochodzę do wniosku, że klasa Address i atrybut address w niej, to nie jest dobry pomysł, bo zawęził mi pole widzenia. Okazało się, że address to tylko nazwa ulicy, a cały obiekt zawiera, ulicę, kod, miasto, a nawet godziny składania zamówień. Wróciłem do punktu zero.

  Od siebie dodałem komentarz, ze do tej pory pisałem kod samodzielnie, więc przynajmniej kojarzyłem jak zaprojektowałem encje, a teraz się muszę bawić prawie w reverse engineering, żeby do czegokolwiek dojść, a to już wyższa szkoła jazdy się robi.

Dzień 6.

  Tego dnia zauważyłem, że część faktów z dnia 5. robiłem w zasadzie w dniu 6., więc gdzieś mi umknął jeden dzień, bo raz nie miałem siły pisać na bieżąco i robiłem podsumowanie po trzech dniach.

  Zabrałem do pracy wszystkie projekty i prezentacje z kursu, więc czasem do nich zaglądam, a to się przydaje, bo zamiast pisać sobie swój kod od zera, gdzie wiem co i jak, tutaj dostaję jakiś kobyły rozgrzebane przez paru ludzi, gdzie analiza tego jest mocno wstrząsająca i czuję się jak dziecko w podstawówce, które składa literki, żeby czytać całe wyrazy.

  Dowiedziałem się też ciekawostki od głównego architekta:
 "A wiecie, że pornhub jest napisany w Symfony2? Chwalili się niedawno, że przenieśli cały kod."
  Po czym wpadł na pomysł, że napisze własny agregator, gdzie będą różne filmiki z różnych stronek tego typu, a on będzie zarabiał na reklamach. Dam znać jak każe coś robić juniorowi. 


Dzień 5.

Śni mi się rozwiązanie problemu z Symfony, niestety później okazuje się, że błędne. Drugi sen poprawia mi problem z MySQL-em. Niestety również nie działa. Zaczynam podejrzewać, że coś się popsuło w pliku CSV. Biorę jeszcze raz źródłowy plik od kolegi. Importuję - działa. No rzesz, Kumar jego mać, tyle czasu i roboty w plecy. Poprawiam strukturę tabeli, importuję dane. Zaczynam się zastanawiać jak wypełnić te brakujące dane. Gadam z architektem, który mówi, że koleś który projektował tę bazę jest debilem i przez to mamy teraz tyle kombinowania. Uczę się robić skomplikowane update'y na bazie, które wypełniają kolumnę na podstawie zgodności innych kolumn w dwóch tabelach. Działa. Za kolejnym razem, nawet rozumiem co się dzieje i piszę to zapytanie prawie z głowy. Czyszczę tabelki z dodatkowych kolumn i przywracam do pierwotnych założeń. Wracam do problemu z Sf i formularzem, który nie chce się wysyłać. Przeglądam cały front-end i nie widzę tam problemu, chociaż to było podejrzenie. W back-endzie uczę się od nowa jak robi się obsługę formularzy. Dostaję info, żeby czytać coś o osadzonych kolekcjach formularzy . Zupełna nowość. Coś tam przegrzebuję, mniej więcej zaczynam rozumieć jak to działa. Mam podejrzenie, ale będę o nie pytał dnia następnego. Do jutra miałem skończyć całość. Uznaję to za żart. Po drodze wpada zlecenie na najbliższy czas, że trzeba napisać skrypt dla pana "informatyka" w firmie, która ma wrażliwe dane, przez co nie mogą nam ich dać, ale ichniejszy admin, nie umie tego zrobić. Tu liczę, że przyda mi się znajomość pisania skryptów w Linuksie. Gdzieś tam po drodze pada tekst: "będziesz pewnie u nas juniorem, ale damy Ci trochę zadań administracyjnych". No pewnie, że mogę za jedną pensje robić dwa etaty.

Dzień 4.

Grzebię w projekcie w Symfony, w którym udało mi się naprawić jedną rzec. Przejrzałem cały back-end wydawał się ok, więc poszukiwania we froncie. A tam jakby mechanikowi od malucha dali mercedesa, bo piardyliard pluginów w JS. Nim się przebiłem przez plugin od kalendarza a następnie od dat, to chwila minęła. W końcu znalazłem błąd w kodzie, który pisał kolega z frontu. Ot, literówka w formacie daty, gdzie zamiast "YY" albo "YYYY" do wyświetlania daty, było "YYY" i rok zamieniał się w 0007 zamiast 2017. Niestety nie rozgryzłem dlaczego psuło się tylko przy konkretnym ustawieniu kalendarza (zakres vs wybrane dni). Grzebię przy kolejnym problemie, ale nagle wpada zlecenie, że te dumpy MySQL-owe, które ostatnio robiłem, muszę poprawić i wypełnić kolumny, do których będą później relacje odpowiednie. Rozrysowujemy z architektem co i jak i biorę się do pracy. Poprawiam dwie tabele, do których dodaję nowe kolumny, które przydadzą mi się później. Importuję dane z CSV, które dostałem wcześniej. Jest ok, dopiero przy trzeciej tabeli coś przestaje działać. Nie mogę nic zaimportować. Robię różne cuda, lecą godziny nic nie działa. Idę do domu. W międzyczasie mam ocenić ile mi to jeszcze zajmie. No niestety, ale to nie ten poziom jeszcze, żebym umiał wycenić swój czas. Z doświadczeniem pewnie się nauczę, ale na razie różne bzdury trwają dość długo.

Dzień 3,5.

  Ano 3,5, bo zostałem "trochę" dłużej w pracy, gdyż pół godziny przed wyjściem zarobiony senior postanawia, że mam sobie jednak zajrzeć do projektu z kolejnego zadania. Jakiś CRM w Symfony, w którym pojawiają się różne błędy. Zaglądam do tego projektu i nie mam pojęcia co się dzieje. Dobrze, że robiłem małą powtórkę z Sf2 przed przyjściem do pracy, to przynajmniej wiem, gdzie te katalogi i do czego. Skaczę po plikach, szukam czemu w kalendarzu zamiast 2017 pojawia się 0017. Wszystko jest ok wg mojej skromnej wiedzy. Sprawdzam dalej, ale do bazy też się źle zapisuje. Po drodze słyszę, że problem może być we front-endzie, który źle przekazuje dane. Patrzę na te widoki a tam od cholery jakichś bibliotek javascriptowych i pluginów. Chwilowo olewam. Słyszę, że w sumie to nie muszę z nimi siedzieć, bo oni i tak zostaną póki nie skończą tego pilnego projektu. Mówię, że teraz jak to rozgrzebałem to i tak zostanę, bo do poniedziałku zapomnę i będę 2h w plecy. W końcu robię testy "manualne", czyli klikam co popadnie i sprawdzam kiedy się ta data pojawia w złej formie i czy zawsze. Otóż nie zawsze. Robię notatki na poniedziałek. Usypiam komputer i zbieram się do wyjścia. Jest po 20.00. Słyszę ponownie, że normalnie to tak nie wygląda i tylko teraz jest chaos i w przyszłym tygodniu na pewno ktoś się mną zajmie. Zobaczymy.
Po miesiącu ma się okazać czy się do czegoś nadaję i czy mi kupią licencję na PHPStorma.

Dzień 3.

  "Dostaniesz od P. na pendrive'ie dokumenty w CSV i trzeba je wrzucić do MySQL-a, zrobić dumpy z insertami i wrzucić do projektu.". Dostaję pendrive, kopiuję dokumenty i przeglądam. Mam wspomnienia z pracy w supporcie z klientami, którzy nie rozumieją o co się ich prosi i na prośbę o konkretny plik, wrzucają cały katalog i szukaj sobie człowieku sam. Poza plikami csv, są tam jakieś inne chgw do czego. Czytam opis projektu, ale nie rozumiem. Przychodzi senior i pokazuje skąd te dane się wzięły i gdzie je wrzucić oraz które kolumny nas interesują. Oczywiście nie mam pojęcia jak CSV wrzucić do MySQL-a i to tylko wybrane pola. Senior mówi, żebym sobie skrypt napisał, który mi to przemieli i wrzuci do bazy. Nawet mi napisał kawałek. Dwie zagnieżdżone pętle, które przerobiły plik wejściowy na wielowymiarową tablicę. No fajnie, ale co bym nie wpisał w ciele foreach-a to jakieś głupoty dostaję i się zawieszam. W międzyczasie poduczam się jak się robi zapytania do bazy używając PDO, bo tego w sumie nie robiliśmy na kursie, poza jednym razem, więc kompletnie nie pamiętam. Działa mi select, więc wracam do pętli... i w niej pozostaje. W zasadzie to było na koniec poprzedniego dnia, więc jeszcze wieczorem myślę nad problemem i przypominam sobie, że gdzieś widziałem jakieś info o wrzucaniu CSV do MySQL-a. Próbuję najpierw po staremu obrobić te pliki komendami z Linuksa, ale też mi coś nie idzie, a nie mam czasu dalej szukać, bo dane są na ASAP. Sięgam do Stackoverflowa i manuala do MySQL-a. Trochę kombinuję i okazuje się, że można taki plik wczytać bezpośrednio komendami z bazy, tylko trzeba podać odpowiednie parametry. Na pierwszym pliku działa, więc robię kolejne. Przy ostatnim moje zapytanie do bazy ma z 50 razy powtórzone słowo "@dummy" przy wskazywaniu komórek z Excela, które mnie nie interesują, ale działa i wynik jest zadowalający. Przeglądam, robię dumpy z insertami.

  Dostaję info, że mam sobie zrobić nowego brancha, commita i merge requesta. Robię. Trochę za dużo, bo sam sobie zatwierdziłem tego requesta (pierwszy raz w GitLabie, więc nie bardzo wiedziałem co się dzieje), ale senior mówi, żebym zostawił to już w spokoju, skoro nie było żadnych błędów, tylko następnym razem mam jeden raz klikać na zielony guziczek. Robię też dokładną instrukcję jak dokonałem tej konwersji (będzie poniżej). Senior zadowolony, bo już na rozmowie kwalifikacyjnej słyszałem od PM-a, że lubi dokumentację. Wpada też prezes mówiąc, że bardzo mu się podoba moje rozwiązanie, bo podszedłem do tego z innej strony, ale też skutecznie. Rumienię się i mówię cicho: "dziękuję".


Dzień 2.

Skonfiguruj sobie pocztę, masz tu dostępy do projektów, dawaj klucz publiczny ssh i przejrzyj swoje taski. Przeglądam maile pisane przez głównego architekta o 3 w nocy. Nie jest dobrze... Mam się skupić na zadaniu z wrzuceniem projektu na serwer testowy, skonfigurowanie i uruchomienie. Niektóre dane dostałem z błędem albo niejasne, ale jakoś sobie poradziłem. Generalnie miałem nie zawracać głowy, bo jakiś mega ważny projekt muszą skończyć, więc nie ma dla mnie czasu, ale to się poprawi w przyszłym tygodniu (zobaczymy). Loguję się wreszcie gdzie trzeba, konfiguruję Apache'a na oko na podstawie innego wpisu, ale okazuje się, że wyszło całkiem nieźle. Projekt do /var/www/ wrzucam przez git clone. Wchodzę przez przeglądarkę i... pusta strona. Podgląd źródła - pusto. Wchodzę przez app_dev.php. O, pojawił się pasek Symfony na dole i jakieś błędy. Za cholerę nie wiem o co chodzi. Gdzieś tam widzę info, że mam jakiś skrypt odpalić tuż po composer install. Odpalam, błąd o braku połączenia do bazy. Dobra - myślę -idę spytać jak domyślnie zakładamy bazę (szefa programistów jeszcze nie ma w pracy, ale pisze do mnie na Slacku, żebym pytał innego kolegę). Kolega nie wie. Drugi, który to słyszy, coś tam mówi, że w sumie to chyba nie ręcznie tę bazę, tylko przez komendę Symfony. Znajduję inny skrypt i jest coś o doctrine i create. Odpalam i error o braku połączenia do bazy. No kurna, przecież konfig domyślny miał być ok. Grzebię, szukam. Okazuje się, że 127.0.0.1 i localhost to nie to samo dla MySQL-a. Poprawiam konfig. Baza się zakłada. Dobra, skąd dane? Kolejne polecenie o jakiejś migracji. Widzę jakieś operacje na tabelach. Odświeżam stronę przez przeglądarkę i działa. Myślę sobie, no wszystko fajnie, tylko że na kursie robiliśmy projekty od zera, ale nie było przypadku jak zainstalować gotowy projekt i skąd wziąć do niego bazę, jak ją zainstalować w projekcie oraz że potrzebny jest composer install. Później znajduję gdzieś dokument, który dostaliśmy po kursie o instalacji projektu w Symfony na innym serwerze niż własna maszyna. Częściowo się zgadza. Dzień później się okazuje, że nie do końca...

PS. W tak zwanym międzyczasie, na Slacku, gdzieś tam po drodze padło: "Jakbyś miał problemy to spytaj X-a". Przychodzi X, więc pytam, X odpowiada, że nie wie i w sumie to nie ogarnia. Więcej nie pytam X-a. To ten sam, co nie wiedział jak bazę zakładamy. Jakieś 2 tygodnie później okazuję się, że X jest project managerem, więc w sumie nie musi tego wiedzieć.

Dzień 1.

Masz tu chłopaku komputer po poprzednim pracowniku, zaoraj go i zainstaluj sobie Linux Mint 18. Tu masz pendrive i hasło do istniejącego systemu, żeby sobie wrzucić instalkę. No to rach-ciach loguję się do zastanego systemu (Mint 17), spisuję hasło do wi-fi, wrzucam obraz na pendrive'a i instaluję. Zainstalowało się. Restart. Odpala się desktop i... cisza. Oraz ciemność. 5 minut później wyszedłem z trudem do konsoli i zabiłem wiszący proces do managera okien. Restart systemu. Uruchomił się. No to jeszcze jeden restart. Znowu wisi. Dobra, Cinnamon ma problemy, więc ściągam wersję z Mate i liczę, że będzie stabilniej. Restart. Opcja domyślna - instalator się nie uruchamia, bo nie może czegoś wczytać. Restart i wybieram opcję "compatibility mode". Dupa, znowu czegoś nie może wczytać. Sprawdzam sumę kontrolną ściągniętego obrazu, bo może coś się skopało. Wszystko ok, więc na wszelki wypadek jeszcze raz nagrywam na pendrive, tylko innym programem. Znowu te same problemy. Jeszcze inny program (wersja konsolowa, czyli po prostu dd) i wciąż te same błędy. Próbuje więc zabootować instalator z opcją "OEM manufacturer". Działa! Instaluje się nieco nietypowo, ale po to, żeby po restarcie dowolny użytkownik mógł sobie założyć konto i przejść podstawową konfigurację. Robię restart i .. jeb. GRUB wyrzuca jakieś błędy, nie umiem z głowy go zmusić do zmiany dysku czy załadowania kernela, a nie mam już działającego systemu, żeby sobie poszukać informacji. Tego się nie spodziewałem, ale jakimś cudem pomógł dwa razy "exit" i pojawiło się normalne menu z wyborem systemu do uruchomienia. Tak więc działa, ale nie może być tak, że po restarcie mi nie wstaje system, tylko muszę ręcznie przechodzić do menu. Próbuje naprawić MBR i GRUB-a znanymi i znalezionymi sposobami (w domu z ElementaryOS zadziałało). Sprawdź boot-repair.

Nic z tego, ciągle error, że nie może znaleźć jakiegoś urządzenia. Szef programistów, po paru godzinach, pyta jak mi idzie. Pokazuję jak mi idzie, na co on, że w sumie to też miał problem z tą dystrybucją na swoim laptopie i skończył tak, że zainstalował Windows i wirtualną maszynę oraz że trochę go martwią moje problemy. No mnie, kurna, też zmartwiły, bo prawie cały dzień nie mogę zainstalować systemu do pracy, a instalowałem Linuksa dziesiątki razy. Ustalamy, że instaluję najnowsze Ubuntu, bo w sumie Mint i tak korzysta z repozytoriów od Ubuntu. Instaluję, działa od razu bez problemu, ale.... GRUB mi się wywala jak poprzednio. No teraz to się wkurzyłem, że mi ten Mint coś tak popieprzył. W końcu jakoś dochodzę, że w tablicy partycji Mint ustawił pustą partycję na bootowalną i z niej próbuje startować... Przestawiłem na prawidłową i kłopoty się skończyły. Mój pierwszy dzień w pracy się skończył.


P.S. Żarciki z tego, że zainstalowałem setki serwerów z Linuksami, a miałem problemy z wersja desktopową trwają do dzisiaj. Mimo, że następny pracownik również dostał Minta 18 do zainstalowania i skończyło się tak, że ma na razie Windows, bo Mint 18 mu się sypał tak samo jak u mnie.

sobota, 18 marca 2017

Co z tym programowaniem?

Co z tą Polską?

Kontynuując poprzedni wątek (początkowo był to jeden wpis, ale gdy zobaczyłem jego długość to... sam bym go nie czytał ;) ), pomyślałem, że powrót do programowania może być jakimś pomysłem, bo jednak zawsze sprawiało mi to przyjemność. Trochę się obawiałem czy podołam ze względu na wiek, bo już miałem objawy, że nieco ciężej mi się uczy nowych rzeczy niż kiedyś, ale sytuacja była ku temu wyśmienita. Postawienie wszystkiego na jedną kartę, ale jednak z wyjściem awaryjnym, czasem się sprawdza. W pracy przy sieciach okazało się, że całkiem nieźle idzie mi praca zdalna z domu i umiem się zorganizować. Niestety szukanie tego typu pracy w obecnym zawodzie spełzło na niczym. Szukanie pracy w mieście, do którego "za pracą" wyprowadziła się moja partnerka (niszowy zawód), również nie przyniosło rezultatów i poza jedną, sensowną ofertą, mogłem tam pracować głównie przy wykładaniu towaru na półki w markecie... Jedyna firma w IT z którą tam rozmawiałem, zdecydowała się na outsourcing w Indiach, czego pewnie jeszcze pożałują, bo cytując mojego kolegę Samira z Algierii, z którym pracowałem w korpo-supporcie: "Ja nie jestem rasistą, ale Hindusi to jacyś idioci i jeszcze wspomnisz moje słowa.". Wspomniałem jakieś 3 tygodnie później, praktycznie w identyczny sposób.

Wobec powyższego postanowiłem, że programowanie to może być to, ale na studia to już nawet jeśli nie za późno, to za długo to będzie trwało. Szukając w sieci, trafiłem na kurs programowania firmy Coders Lab. Zapoznałem się z warunkami, przeliczyłem oszczędności, żeby starczyło na kurs i na życie po nim, bo nikt pracy nie gwarantował w 100%, mimo i tak wysokich wskaźników zatrudnienia absolwentów. Dowiedziałem się, że kurs taki może być dofinansowany z Urzędu Pracy i to też, chociaż nie bezboleśnie, udało mi się załatwić, więc byłem o 6000 zł do przodu na przeżycie bez pracy po kursie.
Na kursie szło mi w miarę nieźle, udało mi się zaliczyć każdy egzamin bez poprawek i otrzymać certyfikat. Jako ciekawostkę podam, że kurs zaczynało 12 osób, do końca zostało 9, a dyplomy otrzymało 7, także to nie tylko kwestia pieniędzy i tu firma podchodzi do problemu sensownie - jeśli widzisz, że nie dajesz rady i to nie jest dla ciebie, to zwracamy ci część poniesionych i niewykorzystanych kosztów, a jeśli nawet chcesz zostać do końca, ale nie zaliczasz egzaminów, to nie dostajesz papierka.

Co po kursie?

Gdy zapisywałem się na kurs, pod koniec miała być giełda pracy z partnerami firmy, która miała ułatwić absolwentom znalezienie pracy. Niestety zrezygnowano z tej praktyki i jedynie rozsyłane są CV absolwentów. Do mnie nikt z partnerów się nie odezwał (poza jednym przypadkiem, ale nie szukali młodszego programisty, a ja z przeszłością chciałem zerwać), mimo że moje CV było w miarę niezłe, bo miałem już doświadczenie w IT, a część kolegów i koleżanek z grupy (w sumie większość), przyszło z zupełnie innych branż. Uważam, że brak tych targów pracy i możliwości pogadania twarzą w twarz z ewentualnym pracodawcą to duży minus obecnej strategii firmy. Koniec końców pracy szukałem na własną rękę i różowo nie było, więc w duszy zacząłem cały ten kurs przeklinać i uczyć się zupełnie innych technologii. W dalszych wpisach okaże się, że kurs jednak nie był taki zły, bo dał potrzebną wiedzę, a dobry marketing pozwolił na to, że część pracodawców kojarzy przynajmniej firmę Coders Lab i jak się o tym wspomni i opowie o egzaminach z 5 technologii i intensywności kursu, to inaczej na człowieka patrzą, bo "nie zdawali sobie sprawy". Także kurs pod znaną marką jest lepszy, niż u Zenka w garażu. Nie, firma Coders Lab, nie płaci mi za reklamę (na razie ;) ) i były momenty, że ich przeklinałem.

Ile czasu zajęło mi szukanie pracy?

Kurs skończyłem w połowie września, a nasze CV pewnie poszły jakieś 2 tygodnie później, bo wcześniej dawaliśmy je do oceny i ewentualnych poprawek. Chwilę też odpoczywałem, bo byłem zmęczony intensywnością pracy na kursie (7h dziennie z godzinną przerwą na obiad i parę godzin wieczorem na prace domowe, oraz brak wolnych weekendów, bo wtedy robiliśmy swoje projekty do CV) i jedyne co zrobiłem to zaktualizowałem profil na LinkedIn i czekałem kiedy odezwą się partnerzy CL. Nie odzywali się, więc sam zacząłem pracy szukać aktywniej i tutaj spotkała mnie niespodzianka, bo pracy dla juniorów za dużo nie było, a w mojej wyuczonej technologii (PHP), to nawet dla programistów z doświadczeniem za dużo ofert się nie pojawiało, a na różnych grupach programistycznych, można było poczytać wypowiedzi, że praca w tej technologii się skończyła. Mijały miesiące, a ja w tym czasie poszerzałem wiedzę i starałem się uczyć nowych rzeczy. Wreszcie w lutym odezwały się do mnie 3 firmy i zaprosiły na rozmowę. Pierwszy raz mi się zdarzyło, że po rozmowie i testach firma się do mnie nie odezwała, ale pozostałe dwie złożyły mi propozycje. W jednej z nich już po rozmowie kwalifikacyjnej usłyszałem od project managera, że on jest za, więc odpowiedziałem, że ja w sumie też, bo podobała mi się atmosfera. Umówiliśmy się na telefon następnego dnia, a 3 dni później byłem już u nich ponownie, żeby podpisać umowę o współpracy.

Jeśli więc dobrze liczę, to od października do lutego mija 5 miesięcy. Statystyki wskazywały, że będą to 3 miesiące (rozmawiałem o tym z absolwentem kursu z poprzedniej edycji oraz tak twierdził zarząd CL), ale jednak się trochę przeciągnęło.

Jak wygląda pierwsza praca młodszego programisty?

O tym w następnych odcinkach. Początkowo opisywałem każdy swój dzień pracy dla kolegów i koleżanek z kursu, ale postanowiłem przestać ich męczyć codziennym wpisem na Facebooku i przenieść tamte wpisy do tego bloga. Także pierwsze 2 tygodnie pracy pojawią się hurtem w postaci oddzielnych wpisów z jednego dnia, a kolejne postaram się prowadzić na bieżąco, dopóki będzie to ciekawa lektura. Dużo osób pyta jak wygląda taka pierwsza praca programisty bez doświadczenia, więc może i mnie się uda dołożyć swoją cegiełkę, a przy okazji opiszę kilka problemów i ich rozwiązań, które mogą się przydać nie tylko mnie.




Jak do tego doszło?


Historia odległa.


  Należy się parę słów wyjaśnień, bo moja nowa ścieżka kariery, nie jest dla mnie tak zupełnie nowa. Programowałem trochę jako dziecko. Zaczynałem na komputerze Timex 2048 (portugalska, nieco ulepszona wersja ZX Spectrum) kupionym za PRL-u w Centralnej Składnicy Harcerskiej (czemu akurat tam, to nie wiem, ale ojciec stał 3 dni w tzw. kolejce społecznej, żeby go dostać) za 106.000 ówczesnych złotych. Wtedy była to jedna z wersji języka Basic. Nie było internetu, a jedyne wydawnictwo komputerowe to gazeta "Bajtek", w której cokolwiek było o programowaniu. Miałem też książkę "Przewodnik po ZX Spectrum" autorstwa: Kuryłowicz, Madej, Marasek, z której nauczyłem się Basica, a następnie.... asemblera. Później pojawiła się też książka Rolanda Wacławka "Mój mikrokomputer ZX Spectrum", ale "przodownik" jak nazywałem tę pierwszą była moją biblią programowania tamtych czasów. Przygoda z asemblerem zaczęła się chyba od tego, że szukałem nieśmiertelności w grach, a skończyło się na kilku demach z muzyką wyciąganą z gier w wersji 128 (mowa o lepszym modelu Speccy, który miał więcej pamięci i lepszy układ muzyczny (AY-3-8910, 3 kanały muzyczne i jeden perkusyjny, zamiast wbudowanego głośniczka i jego bzyczenia).




  Później krótko miałem Commodore C-64 i coś tam grzebałem w asemblerze jego procesora, a następnie nadeszła era Amigi. Tutaj niestety się moje programowanie skończyło, bo miałem dużo mniej czasu i zaczęła się już dość wymagająca szkoła średnia - technikum elektroniczne, które miało mi dać przysłowiowy fach w ręku i własną działalność gospodarczą później. Skończyło się tak, że ja skończyłem szkołę, a w Polsce się skończyła elektronika (ponoć wina Balcerowicza) i nigdy w zawodzie nie pracowałem ani ja, ani moi koledzy, poza jednym wyjątkiem. Teoretycznie powstawały już wtedy klasy informatyczne (u mnie w szkole ten "wydział" nazywał się "maszyny cyfrowe"), ale dużo ludzi, łącznie z moimi rodzicami, twierdziło, że całe te komputery to chwilowa moda, która się skończy i trzeba mieć prawdziwy fach w ręku. Sam wtedy do końca nie wiedziałem czego chcę, a nasłuchałem się, że na studia informatyczne ciężko się dostać, bo matematyka itd., a moja matematyka po technikum nieco kulała, bo tam przykładano większą wagę do przedmiotów zawodowych. W skrócie, w ostatniej klasie technikum dołożono nam przedmiot "ekonomika", który mnie nawet zainteresował, startowałem w olimpiadzie ekonomicznej i poszedłem na modne wówczas studia z zarządzania, bo ponoć brakowało wykształconych menadżerów. Jak to się kończy pewnie wiedzą wszyscy, którzy poszli na kierunek, gdzie są ponoć braki, a po skończeniu studiów nie mają co robić. Ja wybrałem studia zaoczne, żeby nie tracić kolejnych lat, tylko zdobywać doświadczenie w pracy. Robiłem różne rzeczy, ale los i tak skierował mnie ponownie do IT i zaczynając w supporcie, dość szybko przeskoczyłem na stanowisko administratora systemów i sieci i tak spędziłem... wiele lat. Głównie jako admin linuksowy, a pozostałe rzeczy przy okazji. W iluś latach pracy, doszedłem do wniosku, że zaczynam uderzać głową w sufit i trochę mnie już przestało fascynować klepanie w kółko tych samych komend w terminalu. Zacząłem się też zastanawiać, co ja w sumie pokażę dzieciom, które spytają co zrobiłem w pracy przez te lata. Skonfigurowanych setek usług czy serwerów nie da się jakoś szczególnie pokazać i zbudować z nich portfolio, więc może trzeba było zostać rzeźbiarzem...


Historia bieżąca.

  Już jako admin zauważyłem, że większą frajdę sprawia mi pisanie skryptów w Bashu, bo przynajmniej jest to coś kreatywnego, czego efekty widać, zamiast klasycznej roboty administracyjnej. Praca admina jest jednak wyczerpująca (granie w trakcie pracy w Quake-a to jakieś stare miejskie legendy) i mimo, że podejmowałem próby nauczenia się jakiegoś języka programowania, to spełzały one na niczym, bo brak było w tym regularności i zwyczajnie czasu i siły. Jednakże dzięki temu, moja półka zawiera między innymi książki o programowaniu w: Perlu, C, C++, Javie, Ruby, z czego do niektórych nawet nie zajrzałem...

  W pewnym momencie życie potoczyło mi się tak, że wyjechałem z Polski do UK, gdzie wcale tak cudownie z pracą w IT poza Londynem nie było, a po powrocie do Polski praca mnie sama znalazła. Tym razem były to sieci oparte o sprzęt Cisco. Jednak tutaj znowu wyglądało to podobnie jak do tej pory, czyli klepanie powtarzalnych komend w odrobinę innym terminalu, a wiedzę sieciową już miałem zdobytą wcześniej. Oczywiście znowu się zdarzyła sytuacja, że trzeba było pewne rzeczy zautomatyzować, więc z radością napisałem skrypt w Expect'cie (biblioteka do TCL), który łączył się do setek urządzeń i wykonywał na nich polecenia. Taki mały (ro)bot. Praca ta jednak skończyła się, bo odszedł kluczowy klient i skończyły się zlecenia dla mojego zespołu, który został rozwiązany. Później przez pomyłkę, a raczej świadome sprzedanie mnie przez rekrutera na zupełnie inne stanowisko, zajmowałem się supportem, który bardzo źle wspominam i szybko stamtąd odszedłem. To był decydujący moment, co dalej z moim życiem...


poniedziałek, 13 marca 2017

Powitanie v0.0.1

Witam. Tak, mam prawo użyć "witam", bo witam na swoim blogu, także jeśli jesteś grammar nazi, to powinieneś być szczęśliwy. Chyba, że udowodnisz mi, że się mylę, ale wtedy i tak będziesz szczęśliwy. 😎
Nigdy nie ciągnęło mnie do pisania blogów, a wcześniej, jako dziecko, pamiętników. Do zaleceń psychologa kiedyś tam, też się nie zastosowałem. Po prostu nie każdy nadaje się do wyrażania siebie w ten sposób, a na lekkość pióra trzeba zapracować. Tak więc, blogi widywałem od dawna, jeszcze w erze błyszczących gifów, bo w Internecie (pisownia dużą literą pewnie już przeterminowana) jestem już dość długo. Nie miałem zaszczytu tworzyć go od zupełnych podstaw w Polsce, ale znam ludzi z tamtego okresu, którzy to robili. Ja w niewielkim stopniu też do tego przyłożyłem rękę, ale urodziłem się jednak trochę za późno, a niektórzy pionierzy nie mają już możliwości oglądania swojego dzieła.
Wracając do tematu, blogi widywałem, ale pasji pisarskiej w sobie nie miałem i popełniłem w życiu niewiele tekstów. Teraz jednak nastąpiła w moim życiu zmiana, którą postanowiłem udokumentować, bo z czasem się wszystko zapomina i może kiedyś będzie co wspominać i się pośmiać.
Jaka zmiana? Zmiana zawodu w wieku 42 lat. Na jaki? Na programistę. Nie za późno? To się okaże.
Więcej w następnym wpisie, bo na razie muszę rozeznać się jak posługiwać się tym narzędziem do tworzenia blogów.