wtorek, 19 lutego 2013

zatrudniamy webdeva, cz. 2

W zeszlym tygodniu nasza firma zaprosila dwoch kandydatow na moje stanowisko wydelegowanych przez agencje. Babka z Hiszpanii, facet z Meksyku. Jako, ze to byl moj pierwszy tydzien w pracy po chorobie nie bylam zapoznana z tematem. Udalo mi sie nawet rzucim okiem w CV.

Babka sensowna, z frontendowym doswiadczeniem, wygladalo ze pasuje. Facet wydal mi sie dziwny, zajmowal sie developerka backendu, administrowaniem serverami luínuxowymi i pisaniem aplikacji na telefony komorkowe. Nasi dwaj backendowcy odebrali to calkiem inaczej. Po rozmowie z facetem, jak na skrzydlach przylecieli zeby dac mu test i juz prawie witali go w teamie. Oczywiscie na moje 'ale', ze facet nie ma slowa o frontendzie w CV, zostalo zakrzyczane, ze przeciez uzywal mobile jquery w swoim projekcie... I ze jak ktos uzywa biblioteki napisanej w JS to musi znac JS...

No coz, chwile pozniej przezylam szok. Jakims cudem udalo im sie zaprosic oboje kandydatow nie tylko na ten sam dzien, ale i na te sama godzine. Babke posadzili przy komputerze, dali kartke z zadaniem i zaprosili faceta na interview. Patrzylam na to lekko zaskoczona. Interview w sprawie stanowiska dla webdeva przeprowadzali: project manager i dwaj backend developerzy. No coz. Doszlam do wniosku, ze tak ma byc, nie potrzebuja mnie przeciez, zeby sprawdzic pozioom wiedzy kandydata.

Babka posadzona przy tescie walczyla z linuxem, wieszajacym sie nano i myszka ergonomiczna (ktora dla osoby niewprawnej w jej uzywaniu jest koszmarem). Oczywiscie przy zapraszaniu na rozmowe nikt nie spytal o srodowisko, w jakim najchetniej pracuje kandydat, bo skoro nasi backendowcy pracuja na linuxie, to reszta swiata tez musi. Pierwsze zadanie dosc proste, ot wczytac plik csv i cos tam z danymi zrobic w php. Tylko po co frontendowcowi umiejetnosc wczytywania plikow csv w php? Niewazne. Drugie zadanie - ten sam plik csv tylko wczytac go w jquery i wyswietlic w html. Do tego nie zdazyla dotrzec. Nano zwiesilo jej terminal, trzeba bylo wszystko restartowac. Po 15 minutach panowie wrocili z rozmowy z kandydatem, posadzili go przy kompie i zabrali panienke na rozmowe.

A ja z koleznka wybralam sie do sklepu po cos na obiad. Jak wrocilam Meksykanin wciaz biedzil sie nad zadaniem, babka zniknela. Po skonczeniu pierwszego zadania kandydat trafil na rozmowe z nasza dyrektor zarzadzajaca, po czym posadzili go do drugiego zadania. Moi backendowcy byli coraz mniej szczesliwi. Poziom ich euforii siegnal gruntu w momencie, gdy facet objasniajac jak zrobil zadanie drugie rzucil haslem odnosnie jakiesj funkcji w jQuery ze on nie wie jak to dziala. Pelna zalamka.

Koniec koncow dowiedzialam sie, ze babka uciekla. Nie czula sie komfortowo z niedzialajacym linuxem i praca z backendem.

cdn...

niedziela, 17 lutego 2013

zatrudniamy webdeva...

Jako, ze odchodze z koncem marca z mojej obecnej firmy, wlasnie zaczela sie polka zwiazana z zatrudnieniem kogos na moje miejsce. Ale zacznijmy od poczatku.

Radosna nowine przekazalam mojemu szefowi w tygodniu poprzedzajacym swieta. Oczywiscie mailowo, bo przez 3 dni nie moglam go zlapac osobiscie. Zlozylam w sekretariacie papier, wyslalam mu maila i zadowolona usiadlam za biurkiem. 3 miesiace wypowiedzenia w perspektywie.

Pozniej byly swieta, na 3 dni po nowym roku nie bralam urlopu chcac miec go wiecej na koniec marca. Tak wiec przydreptalam do pracy i dziarsko wzielam sie za zadania z jiry. Moj szef zaprosil mnie na rozmowe, na ktorej dosc dokladnie wypytal mnie co to za firma (toz to nie tajemnica, umowe mam podpisana, to moge mu powiedziec :P), jakie warunki (i nawet nie o finanse pytal, tylko o czas pracy, bo z racji posiadania przedszkolaka w domu czasami siedze dluzej, a czasami wychodze wczesniej i gnam na zlamanie karku do przedszkola, zeby ja odebrac przed 17). W koncu padlo sakramentalne pytanie, czy moga cos zrobic, zeby mnie zatrzymac. Z lekkim usmiechem odpowiedzialam, ze chyba nie bardzo, bo juz podpisalam umowe. Przyjal do wiadomosci

Pracuje nad jednym z najwazniejszych projektow frontendowych od dosc dlugiego czasu. I jeszcze kilka miesiecy sie na to zejdzie. Projekt polega na przedarcie sie przez gaszcz warunkow w kodzie php, ktory produkuje kod html i js, i zmiane html i js na cos, co sie pieknie nazywa responsive design. Cel jest dosc prosty, bez tworzenia subdomeny dla urzadzen mobilnych dac dwa layouty w jednym. Pracy tyle, ze czasami to juz mi sie nie chce. Ale jestem na finishu, wiekszosc zrobiona. Przynajmniej dla jednej podstrony.

Na poczatku stycznia okazalo sie, ze:
a) nasz CEO znika na urlop wychowawczy do konca marca
b) nasza dyrektor zarzadzajaca wraca z macierzynskiego, ale tylko na jeden dzien w tygodniu, ale za to bedzie pod mailem i telefonem!
c) nikomu sie nie spieszy z zatrudnieniem nowej osoby na moje miejsce (przeciez maja tyle czasu).

I owszem napisalismy oferte i wywiesilsmy ja na naszej stronie. I sobie wisi, porawie w sumie niewidoczna. Moja propozycja umieszczenia oferty na LinkedIn czy innym Xing wywolala entuzjazm (co to jest 150€ za miesiac wiszenia ofertty w porownania do prowizji, jaka agencje pobieraja) i na entuzjazmie sie skonczylo.

Mamy juz luty. Poki co nie mamy zadnego konkretnego kandydata. Mimo olbrzymich kosztow dyrektor zarzadzajaca sie zlamala i dala zlecenie agencjom.

cdn...

czwartek, 7 lutego 2013

lamanie zasad widzialnosci zmiennych w JavaScript

W poscie zasieg zmiennych (scope) w JavaScript opisalam jak wyglada widocznosc zmiennych w JavaScript. Podstawowa regula jest dosc jasna. Konkretny zasieg jest ograniczony przez funkcje. To co jest w srodku moze korzystac z tego co jest na zewnatrz, ale to co jest na zewnatrz nie ma dostepu do tego co jest w srodku.

var abc = "abc";

function xyz() {
  var def = "def";
}

console.log(abc);
console.log(def);

Wykonanie powyzszego kodu wyswietli abc oraz blad: ReferenceError: def is not defined. Zmienna def zostala zdefiniowana ze slowkiem var, przez co nie jest zmienna globalna, tylko lokalna we wlasnym scopie oraz scopach wewnetrznych. Z zewnatrz jej nie widac. Takie podejscie nazywamy zakresem statycznym lub leksykalnym (lexical scope). Tak na prawde o tym, gdzie sa jakie zmienne i jaki maja zasieg mozemy sie dowiedziec analizujac kod programu.

To na tyle powtorzenia. Czy istnieje sposob na udostepnienie zmiennych z wnetrza funkcji do globalnej przestrzeni nazw? Sprawdzmy.

Zalozmy, ze mamy taka strukture:

var a = "a";

function foo1 () {

  var b = "b";
  console.log(b);

  function foo2 () {

    var c = "c";
    console.log(c);

    console.log(b);

  }
}

foo1();
foo2();

Zasieg globlany wie o istnieniu zmiennej a i funkcji foo1. Reszta jest przed nim ukryta o czym swiadczy blad: ReferenceError: foo2 is not defined. Naszym celem jest wyciagniecie foo2 i jej zawartosci na swiatlo dzienne czyli do globalnej przestrzeni zmiennych.

Przede wszystkim zeby to zrobic musimy zmienic troszke podejscie. Statyczna prezentacja zakresow widzialnosci zmiennych nam tu nie pomoze. Do problemu trzeba podejsc dynamicznie!! Jedno z wielu rozwiazan podalam w poscie funkcje w JavaScript, part 5 - funkcje moga zwracac funkcje:

var a = "a";

function foo1 () {

  var b = "b";
  console.log("foo1 " + b);

  return function () {

    var c = "c";
    console.log("foo2 " + c);
    console.log("foo2 " + b);
  };
}

var foo2 = foo1();
foo2();

Jak widac na konsoli mamy wypisane foo1 b, ktore pochodzi z wykonania foo1 podczas przypisania tego co ona zwraca do foo2. Nastepnie wywolanie foo2 wypisuje foo2 c oraz foo2 b. Czyli z poziomu zasiegu globalnego mamy dostep do "wnetrznosci" foo1. Takie pamietanie przez funkcje swojego kontekstu nazywamy domknieciem (closure).

Innym sposobem na wykorzystanie domkniecia jest operowanie na zmiennych globalnych wewnatrz funkcji. Czym rozni sie zmienna globalna od zmiennej lokalnej w JavaScript? Slowkiem var:

var a = "a";

function foo1 () {

  var b = "b";
  console.log("foo1 " + b);

  foo2 = function () { // nie ma var

    var c = "c";
    console.log("foo2 " + c);
    console.log("foo2 " + b);
  };
}

foo1();
foo2();

Tutaj tak samo jak w poprzednim przykladzie istnienie foo2 zalezy od wykonania foo1. Foo2 nie istnieje, dopoki nie zostanie utworzone w foo1 jako zmienna globalna. Tutaj tez mamy domnkniecie, nasza zmienna globalna foo2 pamieta kontekst w ktorym zostala utworzona i wyswietla prawidlowo zmienna b.

środa, 6 lutego 2013

funkcje w JavaScript, part 5 - funkcje moga zwracac funkcje

Funkcje zawsze zwracaja jakas wartosc, nawet jesli jawnie nie jest zdefiniowane return (wtedy zwracaja undefined). Funkcja moze zwrocic tylko jedna wartosc, na przyklad tablice obiektow lub... inna funkcje:

function a() {
  console.log('A!');
  return function(){
    console.log('B!');
  };
}

a();

Jak widac, funkcja a() zwraca funkcje anonimowa. W momencie, gdy wywolamy a() na konsoli wypisze sie A!, kazde kolejne wywolanie a() ponownie wypisze tylko A! na konsoli. To co jest w return nie jest wykonywane w trakcie wolania funkcji, to jest to, co funkcja zwraca. To jak sie dobrac do tego co zwraca return?

var b = a();

a();
b();

Rozwiazaniem jest przypisanie wyniku dzialania funkcji do zmiennej. W tej sytuacji wywolanie a() nadal bedzie wypisywac A!, natomiast b(), do ktorego zostala przypisana funkcja anonimowa, ktora zwraca funkcja a(), bedzie wypisywac B!.

W ten sam sposob mozna zrealizowac nadpisanie (czy przepisanie) sie funkcji. Wystarczy pod wynik dzialania funkcji a() podstawic zmienna... a:

var a = a();

a();
a();

Tylko za pierwszym razem, w momencie przypisania wykonuje sie cialo oryginalnej funkcji a() i na konsoli pojawia sie A!. Po przypisaniu, funkcja a() przy kazdym wywolaniu na konsoli pisze B!, poniewaz teraz jej cialem stala sie funkcja anonimowa zwracana przez oryginalna funkcje a().

No dobrze, wszystko pieknie, ale co jesli funkcja anonimowa zwracana przez oryginalna funkcje a() korzysta z zakresu zmiennych dostepnych w oryginalnej funkcji a()? Ot, na przyklad:

function a() {
  console.log('A!');
  var abc = "abc";
  return function(){
    console.log(abc);
  };
}

Otoz, wszystko bedzie dzialac. Dla funkcji anonimowej scope zostanie zachowany (jak i dlaczego, o tym za chwile, w innym poscie):

var a = a();

a();
a();

Przy pisaniu na konsoli zobaczymy A!, natomiast kazde kolejne wywolanie a() wypisze juz na konsoli abc.

w sprawie samowywolujacych sie funkcji

Do postu o samowywolujacych sie funkcjach dostalam komentarz, bardzo trafny zreszta. Wiec postanowilam napisac kilka slow na ten temat.

Faktem jest, ze polskie tlumaczenie self-invoking nie jest jakos specjalnie udane, ale z braku lepszego uzywamy wlasnie okreslenia samowolajaca sie funkcja. Ale tak na prawde, dziekuje Ci Anonimowy Czytelniku, za podniesienie tej kwestii, ta funkcja jest wykonywana w miejscu w ktorym zostala w kodzie wstawiona. Sama sie nie wola, jest od razu wykonywana przez przegladarke. Oczywiscie dzieje sie tak dzieki dwom parom nawiasow okraglych, z ktorych jedna para obejmuje funkcje (jako calosc) a druga wskazuje ze jest to funkcja, dzieki czemu przegladarka ja wykonuje.