Praktyki w Empirice pokazane w radiu i telewizji.

Nasz program praktyk dla studentów wrocławskich uczelni został doceniony przez lokalne media Radio Wrocław i TVP Wrocław.

 

W siedzibie Empirica najpierw gościliśmy ekipę Radia Wrocław. Tematem był program praktyk dla studentów wrocławskich uczelni organizowany przez naszą firmę we współpracy ze stowarzyszeniem IT Corner. Radio przeprowadziło wywiady nie tylko z naszym zarządem, ale także z pracownikami pilotującymi program stażowy jak i z samymi stażystami. A było o czym rozmawiać, gdyż studenci biorący udział w naszym programie praktyk zostają wrzuceni od razu na głęboką wodę. W odróżnieniu od stażu w większości korporacji nie mają do czynienia z błahymi zadaniami wspierającymi pozostałych pracowników, lecz na trzy miesiące stają się częścią prowadzonych w firmie projektów. A projekty dotyczą rozwoju jednego z najbardziej zaawansowanego systemów w branży IT w Polsce jak i jego międzynarodowych wdrożeń. To nie jest praktyka, który polega na parzeniu kawy lub wyciąganiu papieru z zaciętych drukarek. Stawiamy na sprawdzenie umiejętności studentów w zadaniach, z którymi będą się mierzyć w pracy zawodowej i najlepsi z nich mają szansę na dostanie oferty dołączenia do naszego zespołu na stałe.

 

Pozwolimy sobie zacytować część audycji “Aleksandra Sieradzka, studentka politechniki po doświadczeniach z dużymi korporacjami postawiła na staż we wrocławskiej małej firmie IT zrzeszonej w klastrze przedsiębiorstw informatycznych ITCorner. I to był strzał w dziesiątkę.” Nie śmiemy dyskutować z opinią Oli, chociaż nasze zdanie o korporacjach jest w 100% zbieżne.

 

Kilka dni po wizycie Radia Wrocław, odwiedziła nas lokalna stacja telewizyjna TVP Wrocław. Zainteresowanie mediów naszym programem praktyk zaczyna powodować, że zarówno nasi pracownicy jak i studenci odbywający u nas staż, powoli zaczynają się czuć jak celebryci. Na szczęście jeszcze się tak nie zachowują i dalej podchodzą do swoich obowiazków zupełnie poważnie. Telewizja była zainteresowana programem praktyk organizowanym przez naszą firmę wraz ze stwowarzyszeniem IT Corner dla studentów Politechniki Wrocławskiej. Wywiady przeprowowadzone przez ekipę telewizyjną, dotyczyły nie tylko codziennej pracy w naszej firmie, ale także tego czym różni się praca w małej ale prężnej lokanej firmie, od pracy w dużej zagranicznej korporacji. Okazuje się, że nie tylko nasi pracownicy są świadomi przewagi możliwości jakie oferują im lokalne i ambitne startupy, ale całkiem świadomi tego byli także nasi stażyści.
Jesteśmy dumni nie tylko z naszych studentów i wysiłku jaki wkładają w swoje codzienne obowiązki, ale także z tego, że nikt w firmie nie wydawał się obecnością kamer speszony. Praca jak co dzień, business as usual. Młodzież mamy naprawdę imponującą. Szacuneczek!

 

Więcej o wizytach Radia Wrocław i TVP Wrocław w Empirice:

telewizja wrocław staż empirica

telewizja wrocław staż empirica praca programista

Empirica internationally

Empirica as a company specializes in trading software development for capital and cryptocurrency markets. We help hedge funds with our low latency Algo Trading Software and trading algorithms and crypto trading bots developement. We help market makers with Liquidity Engine – market making software, and wealth managers with Robo Advisor, portfolio management software. We also support crypto exchanges in software development of their platforms.

More on algorithmic trading can be found on our English website.

Java 8 – co nowego i co ciekawego?

Autor: Patryk Stopyra, Software Developer, Empirica S.A.

Java Development Kit 8 jest jedną z najważniejszych aktualizacji języka rozwijanego przez Oracle. Niesie ona za sobą przede wszystkim istotne zmiany na poziomie syntaktycznym wprowadzając wyrażenia znacznie upraszczające zapis logiki programu. Jest to ważne zwłaszcza dla deweloperów oprogramowania rozwijających projekty zespołowe. Ze względu na liczbę istotnych zmian – usystematyzujemy je, dzieląc na 4 dziedziny.

java

 

Język

Najbardziej zauważalną dla programisty zmianą w języku Java w wersji 8 są wyrażenia lambda (λ). Są to funkcje anonimowe, swą nazwę czerpiące z rachunku lambda opracowanego przez A. Churcha i S.C. Kleenego w latach 30-tych XX-go wieku w celu reprezentacji i badania algorytmów. Jak w języku Java zrealizowano wyrażenia lambda? Wykorzystano już istniejące struktury semantyczne – odtąd anonimowa implementacja interfejsu posiadającego jedną metodę może być zastąpiona przez wyrażenie lambda – oraz dodano operator ->. Samo wyrażenie ma następującą postać:

(arg1, arg2, …) -> { instr1; instr2; ... }

Wykorzystując więc zestaw przekazywanych argumentów maszyna wirtualna wykonuje blok instrukcji, który w istocie jest ciałem anonimowej metody. Zapis ten można skrócić jeszcze bardziej: jeśli przyjmujemy tylko jeden argument możemy pominąć nawiasy po lewej stronie operatora ->, zaś jeśli program wykonuje tylko jedną instrukcję możemy nie zamieszczać nawiasów po prawej stronie operatora ->. W efekcie dla przykładowego interfejsu:

interface SomeListener {
    void actionPerformed(SomeEvent e);
}

programista może zastąpić zapis jego implementacji:

mysteriousComponent.addSomeListener(new SomeListener {
    @Override
    void actionPerformed(SomeEvent e) {
        System.out.println(“Action occured: “ + e);
    }
});

bardziej zwięzłą i czytelną formą:

mysteriousComponent.addSomeListener(e -> System.out.println(“Action occured: “ + e));

Zastosowane w ten sposób wyrażenie lambda definiuje jedyną metodę interfejsu stając się w istocie anonimową implementacją interfejsu – i to właśnie sposób w jaki programista powinien je postrzegać.

Co więcej, dzięki nowemu słowu kluczowemu default (o którym za chwilę) deweloper może używać wyrażeń lambda nawet dla bardziej złożonych interfejsów.

Naturalnym jest, iż wyrażenia lambda zwracają wartość. I w tym przypadku można zastosować kompaktową notację. Następujący kod:

(x, y) -> {return x + y;}

jest równoważny z:

(x, y) -> x + y

Należy mieć więc na uwadze, że wyrażenie zwraca wartość pojedyńczej instrukcji jaką wywołuje (chyba, że wywołuje metodę o typie void).

Wyrażenia lambda znajdują doskonałe zastosowanie m.in. w operacjach na strumieniach. Te (opisane dalej) również są nowością najświeższej wersji języka

Java, w której trafiły do biblioteki standardowej.

Nowe słowo kluczowe default pozwala zapwnić domyślną implementację metod interfejsów, co ułatwia tworzenie wyrażeń lambda opartych na tychże interfejsach. Metod z domyślną implementacją nie trzeba już nadpisywać. Tworząc więc interfejs którego wszystkie metody są domyśle prócz jednej, zależącej od kontekstu wykorzystania interfejsu, uzyskujemy perfekcyjny fundament pod wyrażenie lambda. W docelowym miejscu wystarczy (w postaci takiego wyrażenia) zapewnić implementację jedynej metody nieposiadającej implementacji domyślnej. Jest to niewątpliwy ruch języka Java w stronę wielokrotnego dziedziczenia.

Kolejną istotną dla dewelopera zmianą jest możliwość przekazywania referencji do metod. Dotąd w języku Java możliwe było jedynie przekazywanie wartości zmiennych i referencji do nich. Nowością syntaktyczną w JDK 8 jest natomiast operator :: pozwalający na przekazywanie referencji do zaimplementowanych już metod. Na przykład:

Math::max, Math::abs

Ta zmiana jest również de facto konsekwencją wprowadzenia wyrażeń lambda. Czyni ona kod czytelniejszym, gdyż pozwala (zamiast wielokrotnej implementacji identycznych wyrażeń) w jednym miejscu zdefiniować odpowiednią metodę i odwoływać się bezpośrednio do niej z wielu miejsc. Mając klasę, w której zaimplementowaliśmy pewien sposób reakcji na zdarzenia:

class Controller {
    static void reactOnEvent() {
        …
    }
}

Możemy zastąpić kod:

mysteriousComponent.addSomeListener(e -> Controller.reactOnEvent());

przez:

mysteriousComponent.addSomeListener(Controller::reactOnEvent);

Dodatkowo bytecode tak zdefiniowanego listenera różni się od wykorzystującego wyrażenia lambda. Nie zawiera on całej definicji Listenera lecz krótszą bezpośrednią referencję do metody reactOnEvent. Referencje do metod (nawet niestatycznych) programista może przechowywać jako zmienne wykorzystując klasy z biblioteki standardowej java.util.function.

Oprócz nowości syntaktycznych, Java 8 wprowadza również kilka udoskonaleń istniejących już wcześniej mechanizmów. Na pozór niezauważalną dla dewelopera zmianą jest ulepszenie inferencji typów. W obecnej wersji język jest w stanie w niektórych przypadkach typów generycznych sprowadzić automatycznie klasę obiektu do klasy niższej, jeśli tylko nie ma to skutków ubocznych. Przytaczając przykład z dokumentacji Oracle, w metodach przyjmujących listę obiektów typu String nie musimy już stosować konstrukcji:

Collections.<String>emptyList()

w celu pozbycia się niejednoznaczności i zaakceptownaia pustej listy jako adekwatnej dla metody z argumentem listy obiektów typu String. W JDK 8 możemy wywołać:

Collections.emptyList()

zaś sam kompilator, odkrywszy, że nie ma to skutków ubocznych – przystosuje listę do typu wymaganego przez metodę.

Zapewne chcąc sprostać rosnącej popularności weryfikacji formalnej oraz programowania kontraktowego, środowisko odpowiedzialne za rozwój języka Java wzbogaciło go o nowe adnotacje oraz rozszerzyło zakres miejsc w kodzie w których te mogą zostać wykorzystane. To właśnie adnotacje takie jak @NonNull, @Readonly, @Regex, itp. pełnią w języku Java rolę kontraktów. Programista może je teraz stosować w praktycznie dowolnym miejscu:

List<@NonNull MysteriousObject>, matches(@Regex String s)

Statyczne analizatory programu potrafią wykorzystać takie adnotacje jako dyrektywy automatycznej weryfikacji kodu, na ich podstawie badając poprawność założeń programisty. Nowe adnotacje, rozsądnie wykorzystane i połączone z automatyczną ich analizą pozwalają zwiększyć czytelność kodu. Niefortunnie jednak ich nadmiar potrafi sam kod zaciemniać, ułatwiając pracę z nim komputerowi ale utrudniając innym deweloperom zespołu autora. Dlatego warto tę funkcjonalność stosować z umiarem, mając przede wszystkim na uwadze czytelność tworzonego algorytmu.

Jak wspomniano na wstępie dobre opanowanie wyrażeń lambda, referencyjności metod i innych zmian pojawiających się w syntaktyce ósmej wersji języka Java jest podstawą do tworzenia bardziej przejrzystego i funkcjonalnego kodu. Natomiast w pracy zespołowej jest kluczem do szybszego rozumienia algorytmów innych programistów i tworzenia jednoznacznie interpretowalnego kodu.

Biblioteka standardowa

Jak przy każdej aktualizacji wiele ciekawych zmian pojawiło się również w bibliotece standardowej języka Java. Warto się im przyjżeć, ale zostanie to zrobione bardziej pobieżnie gdyż aktualizacje te, choć istotne, nie są aż tak przełomowe jak wyżej opisane unowocześnienia samego języka.

Pierwszym dużym postępem jest wprowadzenie do języka standardowej implementacji strumieni. Te (tylko bez kontroli typów) znane są dobrze programistom Pythona. Z punktu widzenia dewelopera strumień jest bardzo atrakcyjną konstrukcją. Nie magazynuje danych, lecz przepuszcza je kolejno korzystając z kolekcji, tablicy bitów, pliku czy innego źródła. Jest łatwy do implementacji, rozszerzania i dokonywania innych modyfikacji: praca na strumieniu opiera się na konstrukcji nazywanej pipeline, ze względu na swoje podobieństwo do rurociągu. Po pozyskaniu strumienia możemy wykonywać na nim kolejne operacje nieterminalne, wykorzystując schemat budowniczego (możemy stosować filtry, mapowanie elementów, itp.; każda metoda dodająca nieterminalną operację do strumienia zwraca nowy, zmodyfikowany strumień). Na końcu dodajemy operację terminalną, np. forEach():

collectionOfComponents.stream()
    .filter(c -> c instanceof JButton)
    .filter(c -> c.isVisible(true))
    .forEach(c -> c.setActive(false));

W efekcie otrzymujemy pipeline zbudowany z łatwo wymienialnych segmentów. Ponadto natura strumieni jest leniwa, tzn. nie podejmują kolejnego działania bez zakończenia przetwarzania poprzedniego elementu w strumieniu. Dzięki temu w wypadku metod w rodzaju znajdź pierwszy, znajdź jakikolwiek nie musimy przetwarzać wszystkich danych, lecz możemy przerwać gdy ostatni segment z powodzeniem zakończy pracę. Co ciekawe strumienie są szybsze od standardowej iteracji nawet gdy wykonują operacje w których muszą zaaplikować coś do wszystkich elementów kolekcji, co jest kolejnym silnym argumentem przemawiającymza ich stosowaniem. Więcej informacji o strumieniach można znaleźć w dokumentacji java.util.stream.

Najbardziej naturalnym sposobem definiowania segmentów pipeline’u są wyrażenia lambda. Te wykorzystane w konstrukcji strumieni implementują interfejsy funkcji takie jak Consumer<T>, Function<T,R>, etc.. Można je znaleźć w paczce java.util.function. Dzięki wspomnianej wyżej zaawansowanej inferencji typów można je z powodzeniem wykorzystywać bez potrzeby wskazywania zwracanych i przyjmowanych typów explicite.

Java 8 wnosi wiele również w dziedzinie programowania równoległego. Praca ze strumieniami pozwala na natychmiastowe i bezbolesne przejście w tryb współbieżny za pomocą zmiany jednej tylko metody (stream() na parallelStream()). Mechanizm można wykorzystywać również na obiektach, nie będących thread-safe (tak długo jak długo nie próbujemy zmieniać ich zawartości, a jedynie pracować na pobranych wartościach). Oprócz równoległych strumieni czas wykonania naszego równoległego algorytmu może znacznie się zmniejszyć także dzięki wykorzystaniu nowych metod Arrays.parallelSort() (doskonale działającego dla dużych tablic) czy nowym akumulatorom (LongAccumulator, DoubleAccumulator z paczki java.util.atomic), które pozwalają na wykonywanie operacji na zmiennych z wielu równoległych wątków jeszcze wydajniej, niż w przypadku wcześniej wprowadzonych obiektów Atomic. Także ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap) doczekał się optymalizacji wraz ze standardową HashMapą – przechowywanie wartości znajdujących się pod jednym hashem w postaci zbalansowanego drzewa pozwala na zmniejszenie pesymistycznego czasu dostępu do elementu z O(n) do O(log n).

Z punktu widzenia programisty pracującego nad aplikacjami biznesowymi atrakcyjną zmianą będzie nowe API daty i czasu. Wykorzystanie go wiąże się niestety z koniecznością licznych zmian w miejscach w których używano dotychczasowych klas Date oraz Time. Niesie ono jednak za sobą wymierne korzyści oraz przewagę nad dotychczasowym, nieintuicyjnym zarządzaniem czasem. Podstawowe założenia nowego api to niemutowalność obiektów reprezentujących datę/czas (co znacząco wpływa na bezpieczeństwo kodu), wprowadzenie klasy kompozytowej łączącej funkcjonalność czasu i daty, czytelność metod, łatwość obsługi stref czasowych, konwersji oraz operacji pozyskania nowych obiektów przez przekształcenie istniejących. Przy czym implementacja ostatniego założenia nasunie wielu deweloperom na myśl dobrze sprawdzający się mechanizm mutacji obiektów klasy Calendar. Nowe klasy: LocalTime, LocalDate, LocalDateTime znajdują się w paczce java.time i warte są uwagi – ich wdrożenie niewątpliwie zwiększa niezawodność i łatwość utrzymania aplikacji biznesowych, zwłaszcza tych o potencjale globalnym.

Nowa Java to standardowo poprawa bezpieczeństwa. Tym razem ulepszono standardowe algorytmy zabezpieczeń opartych na haśle, generatory pseudolosowe o zwiększonej entropii, wsparcie dla bardziej zaawansowanego dostępu do zasobów http z wykorzystaniem security manager’a, ustawienie protokołu TLS 1.2 jako domyślnego po stronie klienta, zwiększono wsparcie dla systemowych schematów kryptograficznych na różnych systemach operacyjnych, dodano również klasę reprezentującą kod Base64 oraz jego dekodery w bibliotece standardowej (java.util.Base64) ułatwiającą pracę z tym popularnym kodowaniem. Są to jednak zmiany i ułatwienia o bardzo specyficznych zastosowaniach.

Ciekawą, choć dla wielu programistów niezauważalną zmianą pozostanie możliwość interpretacji obiektów reprezentujących liczby całkowite jako liczb typu unsigned. Uczyniono to przez rozszerzenie klas Integer i Long o nowe metody porównań i działań. Ulepszenie to nie wpływa na standardową interpretację tych obiektów, pozwala jednak wykonywać na nich nowe operacje. Jest to ukłon w stronę deweloperów kompaktowych zastosowań języka Java, np. w urządzeniach pomiarowych czy transmiterach oraz tych, którzy korzystają z bibliotek i protokołów utworzonych w oparciu o język C. Niewątpliwie w wielu miejscach ulepszenie to ułatwia nterpretację, jednak należy podchodzić do niego z pewną dozą ostrożności – do zastosowań krytycznych wciąż brakuje w języku Java w tej kwestii sposobów na wymuszenie jednoznacznej interpretacji obiektu Integer jako unsigned, co potencjalnie mogłoby doprowadzić do trudnych do zdiagnozowania błędów w systemie.

W najnowszej wersji języka Java nie mogło zabraknąć ulepszeń bardzo silnie rozwijanej technologii interfejsu użytkownika: JavaFX.

Modena-Windows-v1

Modena theme look & feel (fxexperience.com)

Oracle promuje przede wszystkim nowy motyw Modena, możliwość zakorzenienia komponentów Swing w aplikacji JavaFX dzięki klasie SwingNode, rozwinięty sposób zarządznia wyświetlanym tekstem, rozszerzenie opcji manipulowania grafiką trójwymiarową oraz rosnące wsparcie dla HTML5 i CSS.

Maszyna Wirtualna

Każda aktualizacja pakietu Java Development Kit niesie za sobą szereg mniejszych zmian i poprawek maszyny wirtualnej dostarczanej przez Oracle. Nowa wersja języka to okazja do większych poprawek. W najświeższej wersji maszyny wirtualnej dostarczonej wraz z 8. edycją języka pojawiły się dwa znaczące ulepszenia.

Jednym z nich są kompaktowe profile – pozwalające tworzyć mniejsze dystrybucje programów, korzystające tylko z selektywnie dobranych podzbiorów funkcjonalności maszyny wirtualnej. Takie odchudzone dystrybucje można później deployować na małych urządzeniach w których pamięć jest najbardziej krytycznym zasobem.

Drugie udoskonalenie to nowy interpreter JavaScript o nazwie Nashorn. Można wywołać go bezpośrednio z kodu programu korzystając z klasy ScriptEngine lub ewaluować za jego pomocą kod korzystając z takich narzędzi jak jjs czy jrunscript.

Narzędzia

Omawiając nowości w języku Java 8 grzechem byłoby nie wspomnieć o zmianach w narzędziach dostarczanych programiście. I jest ich kilka. Pojawiło się, wspomniane już powyżej, narzędzie jjs wywołujące interpreter Nashorn. Nowy jest także jdeps przygotowany z myślą o analizie plików class. Za pomocą polecenia java możemy teraz uruchamiać aplikacje pisane w technologii JavaFX. Z kolei narzędzie jarsigner zyskało nową opcję zarządania znakowania czasowego pliku (trusted timestamping) wykonywanego przez wskazane Time Stamping Authority. Ulepszenia doczekało się dobrze znane narzędzie javadoc służące generowaniu dokumentacji źródeł, dodano m.in. zdolność tworzenia abstrakcyjnych drzew syntaktycznych na podstawie utworzonego w programie kodu.

Również najbardziej istotne dla dewelopera narzędzie javac, zyskało swoje udoskonalenia. Może być teraz wywołane z dyrektywą -parameters wykorzystywaną do przechowywania formalnych nazw parametrów, potrafi również weryfikować zawartość javadoc’ów oraz generować pliki nagłówkowe, w której to funkcjonalności zastępuje javah.

***

Już pobieżne spojerznie na powyższe zmiany doskonale ilustruje szeroką płaszczyznę optymalizacji i ulepszania biblioteki standardowej języka Java. Świadczy to niewąpliwie o żywotności i rozwoju tego języka. Przed deweloperami wyraźnie zarysowują się główne nurty wspomnianego rozwoju – wyrażenia lambda, zwiększanie czytelności kodu poprzez podwyższanie poziomu abstrakcji i zmniejszanie jego objętości, wydajne zrównoleglanie programów, jeszcze ciaśniejsze wiązanie się języka Java z zastosowaniami wysokiego ryzyka (w tym biznesowymi). Cieszy zwłaszcza ostatnia dziedzina rozwoju – Java została przecież stworzona do zastosowań biznesowych, a rosnący poziom bezpieczeństwa języka jest jednym z gwarantów niezawodności tworzonych w nim aplikacji.

Bibliografia

D.Harel., Y.Feldman, Rzecz o istocie informatyki, Wydawnictwo Naukowo-Techniczne, Warszawa 2008

http://fxexperience.com/2013/03/modena-theme-update/

http://www.javacodegeeks.com/2013/04/arrays-sort-versus-arrays-parallelsort.html

http://www.journaldev.com/2800/java-8-date-time-api-example-tutorial-localdate-instant-localdatetime-parse-and-format

http://www.mimuw.edu.pl/~urzy/Lambda/erlambda.pdf

http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html

https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html

https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html http://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/intro.html

https://blogs.oracle.com/java-platform-group/entry/java_8_s_new_type

http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html

http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html

 

Empirica internationally

Empirica as a company specializes in trading software development for capital and cryptocurrency markets. We help hedge funds with our low latency Algorithmic Trading Platform and trading algorithms and crypto trading bots developement. We help market makers with Liquidity Engine – market making software, and wealth managers with Robo Advisor, wealth management software. We also support crypto exchanges in software development of their platforms.

Praca w korporacji czy w startupie?

Oto 8 powodów, aby wybrać pracę w małej firmie, zamiast w dużej korporacji

 

Tak jest, na pierwszy rzut oka wydaje się, że korporacja może na starcie zaoferować całkiem niezłe warunki. I finansowe i socjalne i dorzucą jeszcze kilka modnych benefitów typu karta multisport. Ale istnieją powody, dla których wybór pracy w małej firmie lub startupie może całkowicie odmienić przebieg Twojej kariery i to w jakim miejscu znajdziesz się za 5 lub 10 lat.

 

Praca Wrocław

 

Masz ukończone studia, dyplom w ręku i kilka ofert pracy na stole. Inaczej niż pokolenie wcześniej, które padło ofiarą trochę gorszej koniunktury rynkowej – masz wybór. I musisz jakiegoś dokonać. Z jednej strony jest to oferta na niższe stanowisko w renomowanej korporacji, z marką znaną na całym świecie. Z drugiej strony jest to praca w małej firmie, która dopiero zamierza podbić świat. Widziałeś ich produkt, wierzysz w ich misję, ich podejście do pracy i życia, ale nie jesteś pewien, czy chcesz podjąć ryzyko pracy w startupie. Powoli skłaniasz się więc ku pracy w korporacji – marka, dobra płaca, benefity. Mądry wybór.

 

Na pewno?

 

Oto kilka powodów, dla których warto skorzystać z często niepowtarzalnej szansy i przyjąć ofertę pracy w start-upie.

 

  1. Będziesz mieć więcej odpowiedzialności.

Praca w małej firmie, najprawdopodobniej oznacza, że jesteś częścią … małego zespołu. W małym zespole, nikt inny w firmie nie będzie dysponował identycznym zestawem umiejętności i doświadczeń jak ty. Nikt też najprawdopodobniej nie podchodzi do rozwiązywania problemów w ten sam sposób.

Od pierwszego dnia też dostaniesz więcej odpowiedzialności. A to wymusi na Tobie bycie bardziej uniwersalnym, bardziej niezawodnym i bardziej wydajnym niż w jakimkolwiek innym projekcie dotychczas. W większej firmie, nie prędko dana ci będzie sposobność by na efektach Twojej pracy opierała się ważna część firmy. To nadaje prawdziwe znaczenie byciu integralną częścią zespołu. Dosyć ciekawe i motywujące wyzwanie zaraz po studiach, nieprawda?

 

  1. Będziesz mieć więcej możliwości.

 

Statystycznie korporacje oferują początkowo wyższy poziom zarobków niż mniejsze firmy. Ale startupy oferują inny rodzaj wynagrodzenia, którego nie masz szansy nawet posmakować w korporacjach. System motywacyjny oparty nie na pieniądzach, ale na możliwościach zdobyciu nowych umiejętności i wykorzystaniu niesamowitych możliwości rozwoju. Zdobyte doświadczenie daleko przeważa trochę niższą początkowo pensję i jest mocną podstawą do uzyskania dużo wyższych zarobków w przyszłości. Ludzie, którzy dobrze wykorzystają kilka lat w startupie, są daleko lepiej przygotowani do pełnienia ról kierowniczych i wymagających, brania odpowiedzialności za siebie, zespół czy produkt niż ich rówieśnicy, którzy od razu po studiach poszli do korporacji. Te doświadczenia dużo lepiej rokują na ciekawą i dynamiczną karierę w przyszłości, niż wąska specjalizacja w jaką wpada większość pracowników korporacji, z której w kolejnych latach bardzo ciężko im się uwolnić.

 

  1. Będziesz w stanie spróbować wielu różnych rzeczy.

 

Jednym z najpoważniejszych zarzutów jaki słyszę od kolegów, którzy po latach pracy w korporacjach dochrapali się lepszych stanowisk, jest to, że utknęli nad jednym rodzajem zadania i nie mają okazji do wypróbowania się w innych obszarach. Czy to programowanie określonej części systemu czy wypełnianie arkuszy kalkulacyjnych, w korporacji zwykle króluje podejście jeden do jednego: jednen task – jedna osoba.

Praca w startupie natomiast, będzie wręcz wymagała od ciebie przymierzania wielu różnych czapeczek, nawet takich, których nigdy byś sam się nie zdecydował przymierzyć. A konsekwencją tego jest to, że po paru latach okazuje się, że czujesz się dobry w realizacji zadań z wielu różnych dziedzin. A to poszerzy zarówno Twoje horyzonty, jak i możliwości.

 

  1. Będziesz uczyć się od prawdziwych innowatorów.

 

Ludzie, którzy rozpoczynają własną działalność gospodarczą mają inny profil zarówno psychologiczny jak i zawodowy, od tych, którzy nigdy nie próbowali zrobić czegoś całkowicie na swoim. Przedsiębiorcy są definiowani przez nieustanne patrzenie na problemy po to, by szukać dla nich innowacyjnego i oryginalnego rozwiązana. I właśnie ze względu na ich innowacyjną naturę, przedsiębiorcy są jednymi z najlepszych ludzi, od których można się uczyć. Podchodzą do problemów inaczej, stale poszukują rozwiązań i są nastawieni na to, by wydobyć jak najwięcej pozytywnych i wartościowych rzeczy z inwestycji jakimi są dla nich ich czas oraz ich praca.

Dyskusje ze współzałożycielami odnośnie rozwoju produktu czy wprowadzaniu go na rynek, obejmują w startupach często cały zespół i pozwalają spojrzeć na swoją pracę z zupełnie innej perspektywy. Innowacyjność to coś więcej niż kreatywność. To cykl akcji i reakcji, rozwiązywania problemów w nowy, pouczający sposób, sprawdzenie czy on działa, i ewentualnie rozpoczęcie cyklu od nowa. Startup różni się od korporacji tym, że przedsiębiorcy nie boją się pozwolić ludziom spróbować nowych rzeczy oraz tym, że pracują z nimi, a nie ponad nimi. Każdy startup, który odnosi sukces, ma wśród założycieli prawdziwych innowatorów, i jeśli znajdziesz właściwy startup, nauczysz się w nim bardzo dużo.

 

  1. Twoja praca zostanie zauważona (Twoje porażki też).

 

Pracując w ciężko w dużej firmie, często się zdarzy, że efekty twojej ciężkiej pracy pozostaną niezauważone przez Twojego szefa lub wręcz ignorowane. Co niestety równie prawdopodobne, ktoś inny, lepszy w niuansach korporacyjnej polityki, może sprawić, że zasługi przypisane zostaną jemu.

W startupie jest praktycznie niemożliwe, aby nie zauważyć, dobrze wykonanej pracy, albo przypisać sobie nieprawowite zasługi. Jeśli Ci się uda, mały zespół szybko to rozpozna i doceni, a cześć i chwała należeć będzie do Ciebie.

Z drugiej strony również bardzo łatwo jest zauważyć, kiedy coś zostanie schrzanione. Ale to ma także dobre strony. Pierwsza jest taka, że jest prawie niemożliwe, aby się niezauważalnie obijać. W ciągu kilku dni, twoje uniki zostaną zauważone i reszta zespołu będzie się zastanawiać, dlaczego pracuje ciężej niż musi. Świadomość tego pozwala pozostać skoncentrowanym. Drugim powodem jest to, że ze względu na to, że porażkę łatwiej jest zauważyć, masz większą motywację do tego, by nie popełniać tych samych błędów drugi raz.

Pozostań skoncentrowany, a twoje sukcesy będą dostrzeżone, a niepowodzenia zminimalizowane. A kiedy reszta zespołu mówi “Nie zrobilibyśmy tego bez ciebie”, możesz mieć pewność, że mówią poważnie.

 

  1. Będziesz pracować w niesamowitej atmosferze.

 

Wyliczmy:

– każdy dzień jest inny

– w porządku jest posiadanie własnych nawet najbardziej niepoprawnych opinii i przekonań

– zupełnie luźny dress code

– jeśli ktoś nie rzuci przynajmniej jednego dobrego żartu na godzinę, to znaczy, że jest to kiepski dzień

– każdy, kto pracuje w startupie, ma taką ogromną motywację do tworzenia nowych rzeczy

– społeczność startupowa, jest wielką i zgraną grupą. To kupa ludzi, którzy ciągle wymyślają nowe rozwiązania do starych problemów, czy też tworzą narzędzia które upraszczają w jakiś sposób innym życie. Duch przedsiębiorczości jest pozytywnie zaraźliwy.

– Można pić piwo w pracy. Ale tylko przy specjalnych okazjach 🙂

 

  1. Nauczysz się być oszczędny.

 

Praca w startupie, o ile nie macie inwestora, który zasypuje was deszczem pieniędzy, najprawdopodobniej oznacza, że nie ma miejsca na rozrzutność. Mała firma będzie szukała każdego możliwego sposobu by osiągnąć więcej robiąc i wydając mniej. Nie ma miejsca na ekstrawagancje, nie ma miejsca na fanaberie. Zamiast tego, stażysta od rozwoju biznesu będzie musiał nauczyć się jak zaprojektować i zakodować firmy blog, programista będzie czasem adminem a czasem testerem, a już na początku będzie trzeba znaleźć sposób, aby zmieścić dziewięć osób przy ośmioosobowym stole (wskazówka: wystarczy dostawić krzesło).

Ta oszczędność i odpowiedzialność za wydatki, niewątpliwie wpłynie na Twoje własne życie, i po pewnym czasie będziesz zaskoczony ile znalazłeś sposobów na spełnienie w życiu, innych niż wydawanie zarobionych pieniędzy. Zamiast tego, prawdopodobnie odkryjesz radość w tworzeniu i robieniu, niż konsumpcji. Znajdziesz radość z bycia częścią zespołu, który stara się uczynić życie innych ludzi łatwiejszym czy też bardziej zabawnym. To daje niezłego kopa aby znaleźć nowe hobby i rozpocząć kilka własnych, prywatnych projektów. W świecie startupowym wszystko się kręci wokół tego, by więcej tworzyć a konsumować mniej (może poza pizzą).

 

  1. Przekonasz się o wartości ciężkiej pracy, odpowiedzialności i poczucia wpływu.

 

Być może ważniejsze niż jakakolwiek inna rzecz przy pracy w startupie jest uświadomienie sobie, że ciężka praca, myślenie twórcze i wytrwałość są warte bardzo dużo. Po stworzeniu czegoś własnego, czegoś namacalnego i niezależnego, czegoś co można dotknąć, poczuć, lub używać, naprawdę zaczniesz doceniać sens poczucia odpowiedzialności i autorstwa.

Tym, których praca nie polega na tworzeniu, lub polega na tworzeniu na polecenie innych, trudno jest zrozumieć jak wielkie znaczenie ma poczucie wpływu i wolności w tworzeniu czegokolwiek. Praca w startupie i szerzenie wieści o produkcie swojego zespołu, produkcie, który pomogło się powołać do życia, daje ogromne poczucie dumy ze swojej pracy.

Praca w startupie oznacza również, że tylko Ty i Twój mały zespół jesteście jedynymi ludźmi odpowiedzialnymi za swój sukces. U niektórych, ta świadomość może wywołać reakcję, aby wczołgać się w kąt i siedzieć tam mając nadzieję, że ktoś przyjdzie i poda im na talerzu ich wypłaty. Dla innych jest to największa motywacja jaka może być.

Bez względu na to, w jakim miejscu znajdziesz się po pracy w startupie, zwłaszcza jeśli przyjdzie Ci do głowy pomysł stworzenia własnej firmy, która naturalnie też będzie musiała być samowystarczalna, umiejętności, które nabyłeś pracując w startupie będą wspierać cię we wszystkim co robisz.

Osobiście, mając doświadczenia po obu stronach barykady (sześć lat w korpo, w tym na kierowniczych stanowiskach i dobrych kilka w dwóch startapach) nigdy nie dałbym się namówić na powrót do pracy w korporacji – zwłaszcza teraz, po skosztowaniu wolności i możliwości jakie daje praca w mniejszych firmach. Praca w startupie bardziej niż pracę przypomina wzięcie udziału w ciekawym, pełnym intelektualnych wyzwań projekcie razem z grupą świetnych ludzi, którzy po czasie zostaną Twoimi przyjaciółmi.

I właśnie dlatego korporacje muszą Cię obsypać błyskotkami w postaci różnych benefitów, byś nie myślał i nie tęsknił za prawdziwymi wyzwaniami i własnym wszechstronnym rozwojem, bo tego po prostu nie są w stanie Ci dać.

12 cech, które dobry programista posiadać powinien

Programowanie to rzemiosło czy powołanie? Co to znaczy być dobrym programistą? Na co zwrócić uwagę przy rozwijaniu własnego warsztatu? Jakie cechy pomogą programiście przy pracy w projektach?
Oto 12 umiejętności i cech, które naszym zdaniem są kluczowe, by być dobrym programistą.

Umiejętności IT

1. Podstawowe umiejętności informatyczne. istnieje zestaw umiejętności, które każdy powinien posiadać. Po pierwsze, programista musi mieć umiejętności badawczo-analityczne, umiejętność czytania ze zrozumieniem, w tym po angielsku, praktyczną wiedzę z zakresu znajomości wzorców projektowych, bibliotek i frameworków, a także umiejętność zrozumienia problemów informatycznych. Teoretycznie kluczowe mogły by być dobrze prowadzone zajęcia na uczelni, które pomagały studentom rozwijać umiejętności logicznego myślenia, twórczego rozwiązywania problemów i komunikacji. Zajęcia, oparte na pracy zespołowej, wymagałyby skutecznej komunikacji między członkami zespołu, który ma za zadanie wspólnie rozwiązać problem i wyjaśnić proponowane rozwiązanie innym słuchaczom. Niestety nasze uczelnie ciągle większy nacisk kładą na opanowanie wiedzy teoretycznej a nie na wykształcenie u młodych ludzi podstaw rozwijających u nich radzenie sobie w sytuacjach projektowych, umożliwiając przeniesienie wyuczonej wiedzy uczelnianej na grunt zawodowy.

2. Programowanie trzeba lubić. Programowanie nie jest dla osób, które naprawdę się tym nie interesują. Tylko programista, który naprawdę lubi to co robi będzie w stanie ciągle rozwijać swoją wiedzę i umiejętności. A biorąc pod uwagę tempo ciągłych zmian w obszarze języków programowania i narzędzi, ciągłe rozwijanie swojego warsztatu jest nieodłączną częścią zawodu programisty.

3. Poprawa jakości. całkiem jeszcze niedawno często dało się słyszeć wśród programistów opinię, iż testowanie nie jest zajęciem przewidzianym dla nich. Od czasu popularyzacji TDD – Test Driven Development, takie opinie to rzadkość, świadcząca raczej o małym doświadczeniu. Obecnie, programiści znają i rozumieją wartość testów, gdyż to właśnie ich nadrzędnym celem jest stworzenie poprawnie działającego systemu. Poprzez identyfikacje, wykrycie i eliminacje błędów, dążą oni do stworzenia niezawodnego kodu. Co więcej, dobry programista wie, że szkoda jest czasu na pisanie banalnych lub zbędnych testów. Zamiast tego, koncentruje się na badaniu i sprawdzaniu kluczowych elementów kodu już w trakcie ich tworzenia.
Dla doświadczonego programisty ważnym elementem poprawy jakości tworzonego kodu jest jego refaktoryzacja. Rozumie się to jako poprawianie kodu bez wprowadzania zmian w sposobie jego działania. A wysokie pokrycie unit testami jest czymś, co proces refaktoryzacji czyni niemal bezbolesnym.

4. Reusabliity. Po co wymyślać koło, skoro już jedno jest i działa? Życie jest zbyt krótkie, aby ciągle opracowywać kod, który rozwiązuje te same problemy. Dobry programista, w trakcie tworzenia oprogramowania analizuje, które jego części będą mogłby być wykorzystane w innych miejscach systemu lub w kolejnych projektach i tak je opakuje by proces ponownego użycia maksymalnie ułatwić nie tylko sobie, ale także swoim kolegom.
Dobry programista wkłada wiele wysiłku, aby ostatecznie stworzyć prosty i funkcjonalny system. Zdyscyplinowany inżynier myśli zarówno o procesie utrzymania, jak i ewolucji każdej linii kodu.
Natomiast dzięki projektom open source, programista nie jest zdany na siebie w trakcie procesu tworzenia oprogramowania. Wręcz przeciwnie – może budować z opracwanych przez innych klocków. A jeśli okażą się one niewystarczające, to nic nie stoi na przeszkodzie by pracować wirtualnie wraz z innymi programistami z całego świata, aby zrobić wspólnie coś jeszcze lepszego.

5. Programowanie z użyciem wielu języków. Chodzi nie tylko o to, że jeśli programista zna wiele języków programowania, jego szanse na znalezienie ciekawej pracy są większe. Chodzi przede wszystkim o to, że różne języki nadają się do rozwiązywania różnych problemów. Często jest tak, że wiążą się także z innym sposobem myślenia, który niesamowicie poszerza horyzonty.

Cechy charakteru

6. Dbałość o szczegóły. Kod bez komentarza i dokumentacji, niskie pokrycie testami jednostkowymi, hardcodowanie parametrów, nieznajomość wzorców projektowych…Tto wszysto są rzeczy, które czasem przemkną się niezauważenie w jednym czy drugim projekcie. Niemniej jednak, ostatecznie zagrażają całej karierze programisty. W dobrych zespołach, takie zachowania nie będą tolerowane, bo uderzają w jakość tworzonego produktu. Tym samym obniżają wartość pracy całego zespołu programistycznego.
Zawsze dbaj o szczegóły! Stąd już prosta droga, aby stać się naprawdę dobrym programistą.

7. Zrozumienie istoty biznesu klienta. nie rozumiesz, dlaczego rozwój i opracowanie coraz lepszego oprogramowania jest tak ważny w procesie utrzymania klientów? Koniecznie musisz rozważyć historię związaną z NASA. “To oprogramowane nigdy się nie psuje ani nigdy nie wymaga ponownego uruchomienia. Ono jest wolne od błędów. To oprogramowanie jest doskonałe – opracowane w sposób najlepszy z możliwych. Proszę wziąć pod uwagę te statystyki: trzy ostatnie wersje programu, o długości 420.000 linii kodu, zawierały tylko jeden błąd. Ostatnie jednaście wersji tego systemu zawierały łącznie 17 błędów. Komercyjne systemy o równoważnej złożoności zawierałyby ok. 5000 błędów.” Zdolność zrozumienia, dlaczego proces kodowania odbywa się właśnie w ten sposób jest kluczowy. Pozwala stworzyć produkt dla Klienta, który doceni jego wartość i funkcjonalność.

8. Ciekawość. Dla programisty stan ciekawości i zastanawiania się, dlaczego dana rzecz jest zrobiona w taki a, nie w inny sposób, jest stanem naturalnym. Wielu programistów ma podobne wspomnienia. Będąc dziećmi, często wpadali w niezłe tarapaty, rozkładając zabawki lub mniejsze czy większe urządzenia domowe. W ten sposób dowiadywali się jak coś działa.
Tworzenie oprogramowania jest procesem twórczym. Warto również podkreślić, iż wielu programistów znanych jest za swoich artystycznych zainteresowań. To właśnie wspomniana ciekawość pozwala myśleć w sposób kreatywny, niestereotypowy, w trakcie projektowaniu programów. I oczywiście zostaje jeszcze ten dreszczyk emocji: kiedy okazuje się, iż coś co zaprojektowałeś, działa! I kolejny, gdy widzisz, że używają tego ludzie.

9. Doświadczenie. Oprócz praktycznego doświadczenia, pożądaną cechą przyszłego programisty jest również wiedza z zakresu matematyki i innych nauk ścisłych. Co więcej, umiejętność dobrej organizacji pracy jest również dużym atutem. Jednocześnie, należy podkreślić, że nawet wielcy programiści są świadomi, że nie zgłębili wszystkich tajników programistycznej wiedzy i wiele jeszcze przed nimi. Dlatego umiejętność i chęć dalszego kształcenia jest niezbędna w dziedzinie, w której zmiana jest nieunikniona.

10. Dyscyplina. Nawet jeżeli programista bardzo lubi swoją pracę, nie oznacza to, że kolejny projekt może wykonać niedbale. Dbanie o szczegóły jest bardzo ważne, tak samo jak i umiejętności organizacji pracy. Duża ilość błędnego kodu zazwyczaj jest napisana przez programistów, którzy nie do końca wiedzieli o co chodzi i co mają wykonać w zleconym projekcie.

11. Cierpliwość: Błędy w kodzie są naturalne. Pomyłki w trakcie projektowania są również czymś normalnym. Niedbałe kodowanie wykonywane przez innych programistów jest częstym zjawiskiem. Stąd prosty wniosek: każdy programista zdaje sobie sprawę, iż to właśnie cierpliwość jest kluczem do osiągnięcia wymaganej jakości.

12. Praca zespołowa: Nieliczne projekty są na tyle małe i wymagają ograniczonej liczby umiejętności, aby mogły być wdrażane tylko przez jedną osobę. Nauka pracy zespołowej jest jednym ze sposobów, który może pomóc przebić się ponad stereotypowy sposób postrzegania programisty-samotnika. To właśnie praca zespołowa – czy wirtualna (ta wbrew pozorom jest trudniejsza), czy w biurze, jest podstawą sukcesu dobrego programisty. Co więcej, dobrzy programiści posiadają dobre umiejętności komunikacyjne, które są kluczowe nie tylko w rozmowach projektowych z innymi programistami. Przydaje się to także przy komunikacji z klientami, podczas opracowywania dla nich funkcjonalnych rozwiązań.