Doba ma tylko 24 godziny...
Dzisiejszy artykuł nie będzie techniczny, ale zaufaj mi, że treść w nim zawarta jest bardzo istotna w pracy programisty. Nawiązując do tytułu tej sekcji, jak zapewne zauważyłeś nie jest to może szczególnie specjalne odkrycie, że doba ma 24 godziny, chciałem nieco podkreślić fakt, że niezależnie kim jesteśmy, jakie mamy pochodzenie czy pokończone szkoły, mamy do dyspozycji taki sam zasób czasu, jak wszyscy ludzie na ziemi. Odpowiednie zarządzanie tym najważniejszym aktywem (moim subiektywnym zdaniem), którym dysponujemy potrafi przynieść kilkukrotne korzyści, gdy robi się to w odpowiedni sposób. I o tym będzie dzisiejszy artykuł, do którego zapraszam.
Planowanie to podstawa
Niby oczywiste, ale często zaczynamy prace od pobieżnego przejrzenia zadań i zabieramy się do nich od razu, co nie rzadko kończy się koniecznością zaczynania zadania od nowa po dwóch godzinach pracy, bo okazało się, że czegoś nie przewidzieliśmy i przyjęta koncepcja nie będzie działać, a my musimy przyjąć inne podejście. Zatem warto odpowiednio przygotowywać się np. tworząc listę zadań, którą chcemy zrealizować danego dnia i odpowiednio ją uporządkować według założonych priorytetów. Na samym początku określamy co mamy dziś do zrobienia, najpierw może to być po prostu lista zadań ułożona według priorytetów (czasami jakaś wprowadzana funkcjonalność jest wymagana do innego zadania) jednak zwróć uwagę, aby nie przesadzać z liczbą, bądź realistyczny i pozostaw trochę czasu na nieprzewidziane przypadki i dłuższe zadania. Jeśli wypełnisz plan po brzegi możesz koniec końców nie zrealizować go, co doprowadzi Cię do nadmiernego stresu i niepotrzebnej frustracji. Gdy listę masz gotową i chcesz przystąpić do pracy, to zalecam przed każdym z rozpoczynanych zadań zatrzymać się jeszcze przez chwilę i zastanowić się, najlepiej rozpisując zadanie na poszczególne kroki, które chcesz wykonać. Posłużmy się przykładem zadania: Stwórz komponent awatara chatu w React. Opisz wszystkie funkcjonalności, jakie będziesz potrzebować, zastanów się jak będziesz przekazywać dane, gdzie będziesz używać tego komponentu itd. Polecam pisać pseudokod - jest to abstrakcyjny opis, który nie zawiera składni ani konkretnych elementów języka programowania, pozwala na spisanie ogólnych założeń rozwiązywanego problemu. Przykładowo może on wyglądać tak:
Założenia:
Pytania do rozważenia przed rozpoczęciem:
Jakie informacje o użytkowniku będą potrzebne w komponencie awatara?
Co dzieje się, gdy użytkownik nie wczytał się prawidłowo?
Jakie parametry konfiguracyjne powinny być dostępne jako propsy?
Czy komponent będzie miał domyślną reprezentację graficzną, jeśli nie zostanie dostarczony obraz awatara?
Jakie interakcje powinny być obsługiwane przez komponent awatara?
Jak prezentować czy użytkownik jest online?
Ogólny przepływ informacji:
Komponent awatara otrzymuje dane użytkownika jako prop
user
.Jeśli użytkownik nie wczytał się prawidłowo, wyświetlamy o tym informację.
Jeśli dostarczono obraz awatara, wyświetla go w komponencie, jeśli nie to wyświetla zastępczy obraz.
Jeśli użytkownik kliknie na komponent awatara, może wywołać akcję (wyświetlenie profilu) poprzez przekazywanie funkcji obsługującej tę akcję jako prop.
Indicator będzie graficzną reprezentacją dostępności użytkownika.
Propsy:
user: obiekt reprezentujący użytkownika. Może zawierać nazwę, obraz awatara, status dostępności itp. - wymagane
onClick: funkcja obsługująca kliknięcie na komponent awatara - opcjonalna.
availabilityIndicator: wyświetlanie wskaźnika dostępności użytkownika (true/false) - opcjonalne.
Jest to oczywiście mocno uproszczony opis i na pewno nie zawierający wszystkiego co potrzebujesz, niemniej jednak tworząc taki opis, odpowiadając sobie na poszczególne pytania układasz plan do realizacji danego zadania, co jest bardzo pomocne przy ustalaniu całej koncepcji rozwiązania, które chcesz zastosować.
Technika koncentracji - Pomodoro
Pierwotnie technika Pomodoro została opracowana w latach 80. XX wieku przez Włocha Francesco Cirillo. Jest to popularna metoda zarządzania czasem, która pomaga zwiększyć efektywność pracy poprzez cykliczne przeplatania okresów skupionej pracy z krótkimi przerwami. Nazwa "Pomodoro" pochodzi od kuchennego zegara (timera) w kształcie pomidora, który był używany przez twórcę tej techniki. Autor proponował podzielenie czasu na pracę i odpoczynek za pomocą interwałów.
Zasady:
Przed rozpoczęciem pracy wybierz zadanie, nad którym chcesz pracować.
Przygotuj miejsce pracy, wyłącz wszelkie rozpraszacze i postaraj się stworzyć dogodne warunki do koncentracji (przykładowo, jeśli pracujesz w domu to poinformuj domowników, żeby Ci nie przeszkadzano), jeśli dobrze skupiasz się np. słuchając muzyki to śmiało ją włącz.
Ustaw timer na 25 minut (jeden cykl). To jest twój okres intensywnej pracy. Istnieje wiele aplikacji, które mogą Ci do tego posłużyć, ale możesz też wykorzystać standardowy timer kuchenny (najlepiej w kształcie pomidora :P).
Pracuj nad wybranym zadaniem przez całe 25 minut. Staraj się skupić wyłącznie na nim.
Po zakończeniu 25-minutowego cyklu, przerwij pracę i zrób 5-minutową przerwę.
Wykorzystaj przerwę na wstanie od biurka, rozciągnięcie się, mały spacer po pokoju lub ćwiczenia oddechowe. Nie na przejrzenie portali społecznościowych, czy sprawdzenie poczty!
Po tym, gdy 5-minutowa przerwa dobiegnie końca, rozpocznij następny cykl skupionej pracy.
Po wykonaniu 3-4 cykli pomodoro (zależnie od preferencji), zrób dłuższą przerwę trwającą 15-30 minut. W tym czasie możesz zjeść posiłek, przejść się na spacer na świeżym powietrzu lub zrelaksować się w inny sposób.
Zapisuj liczbę zakończonych cykli i przerw, aby śledzić swoją wydajność i postępy.
Jeśli napotkasz trudność w skupianiu się, wydłuż czas trwania przerw lub minimalnie skróć czas cyklu pracy skupionej. Dopasuj tę technikę pod siebie, oczywiście w ramach zdrowego rozsądku. Zwracaj uwagę na wszystko co rozprasza Cię podczas pracy i przy następnym cyklu postaraj się tego unikać.
Na koniec dnia przeanalizuj, ile cykli pomodoro udało Ci się zrealizować. To pomoże w planowaniu kolejnych dni.
Gdy sam pierwszy raz korzystałem z tej metody, to miałem mieszane uczucia, co do tego w jaki sposób ma mi to pomóc? Czasami było dla mnie frustrujące, że wykonuję zadania aż tu nagle dźwięk na przerwę, która niby potrzebuję, ale efekty przy regularnym stosowaniu tej techniki są znakomite. Tak naprawdę wydawało mi się, że ta kilkuminutowa przerwa nic nie wnosi, natomiast służy to pewnego rodzaju regeneracji umysłu, gdzie skupienie wraca ze zdwojoną siłą. Z własnego doświadczenia zauważyłem, że kluczowe jest też zapisywanie postępów, które docelowo są bardzo przydatne przy estymacji zadań, co też jest istotną umiejętnością w pracy programisty - ogólnie estymacja polega na odpowiednim określeniu czasu jaki potrzebujesz na wykonanie konkretnego zadania. Zostawiam też link to wersji online licznika pomodoro.
Unikaj multitaskingu
Pojęcie multitaskingu dotyczy wykonywania kilku zadań/czynności jednocześnie lub też szybkich i częstych zmian pomiędzy nimi. Oczywiście zdania w tym temacie będą zawsze dzieliły się na dwa obozy, tych którzy uważają, że multitasking jest znakomity i tych którzy uważają odwrotnie. Ja należę do drugiej grupy i pamiętaj, że to tylko moje subiektywne zdanie, którym totalnie nie musisz się sugerować, po prostu wyrażam opinię na dany temat. Moim zdaniem multitasking daje poczucie zwiększonej efektywności z racji ilości wykonywanych zadań, lecz uważam, że nigdy nie obejdzie się bez konsekwencji na jakości wykonywania tych zadań. Poziom koncentracji przy ciągłych zmianach drastycznie spada, a gdy osiągniesz stan skupienia i możesz zacząć pracować naprawdę produktywnie, następuje zmiana i wszystko zaczyna się od nowa. Nie rzadko też wiążę się to z dodatkowymi błędami przy nieprzemyślanych krokach jakie podejmujesz i nietuzinkowych szczegółach, które łatwo idzie pominąć. Gdy robisz kilka zadań w tym samym czasie rośnie też stres, gdyż próbując skupić się nad kolejnym przypadkiem, nagle podświadomie wpada Ci do głowy, czego zapomniałeś uwzględnić w zadaniu z którego właśnie się przerzuciłeś co destrukcyjnie wpływa na oba zadania.
Planowanie, które opisałem powyżej wyklucza się z multitaskingiem, to właśnie ono poprzez odpowiednie przygotowanie pozwala nam przewidzieć, może nie wszystkie, ale większość przypadków oraz potrzeby i ograniczenia jakie należy mieć na uwadze. Podsumowując ten temat, chciałem zaznaczyć, że piszę tutaj o multitaskingu w pracy jako programista, jeżeli chodzi o inne sytuacje życiowe to jak najbardziej są tego pozytywne strony i sam je nieraz stosuję, przykładem może być słuchanie podcastu w obcym języku, robiąc zakupy czy też jadąc autobusem, wykorzystujemy wtedy w pełni czas, robiąc kilka rzeczy: robię zakupy, osłuchuję język obcy i dodatkowo może to być podcast tematyczny, który mnie interesuje. Oczywiście, że takie sposoby mają wady, bo nie skupisz się tak na temacie podcastu, jak gdybyś siedział i tylko słuchał, natomiast w takich przypadkach możesz tylko coś zyskać, bo skoro i tak jedziesz tym autobusem do pracy czy na uczelnię to zamiast przewinąć kilka rolek czy postów, możesz czegoś się dowiedzieć lub nauczyć, lecz w przypadku pracy nad projektem zdecydowanie nie polecam wykonywać kilku zadań naraz - ktoś teraz może powiedzieć, że w pracy programisty to norma, że zadania są różne, że często przerzuca się między różnymi projektami i owszem jest tak, tylko różnica polega na tym, żeby wykonywać zadania według priorytetów i w określonej kolejności i dopiero po ukończeniu w pełni pierwszego z nich, przerzucić się na kolejne. Nie sztuka zrobić pięć zadań, które i tak będą do znaczącej poprawy, lepiej zrobić dwa, ale zaskoczyć przenikliwością i estetyką pisanego kodu. Pomijam tu przypadki kiedy nagle wpada zadanie, które ma tak wysoki priorytet, że zwyczajnie jesteś zmuszony przerwać obecne zadanie ze względu na ważność tego nadchodzącego.
Praca zespołowa i delegowanie
Często, szczególnie programistom stawiającym pierwsze kroki w pracy wydaje się, że jeśli przyblokuje ich jakieś zadanie, które mają do wykonania, to poproszenie o pomoc bardziej doświadczonych kolegów jest złym pomysłem i postawi ich w złym świetle, że nie potrafią poradzić sobie z powierzonym zadaniem. Zdecydowanie tak nie jest, zadanie nad którym siedzisz od dwóch godzin bez znacznych rezultatów mogło być rozwiązane w kilkadziesiąt sekund, gdybyś tylko poprosił o pomoc, nie ma w tym nic złego, wręcz przeciwnie, na tym właśnie polega praca zespołowa, której trzeba się nauczyć, oczywiście nie chodzi o to byś co 15 minut pytał, jak coś zrobić, lecz po przeprowadzeniu wstępnej analizy oraz debugowania, gdy nadal nie wiesz co jest przyczyną błędu, spróbuj poszukać podobnych problemów w internecie, jest niemalże pewne, że ktoś już ten problem miał. Gdy widzisz, że kręcisz się w kółko lub zwyczajnie czegoś nie rozumiesz to pytaj! Zapamiętaj jednak, że praca zespołowa działa w dwie strony, więc jeśli masz zamiar zająć czas kolegi, to spytaj czy miałby chwilę, aby zerknąć, bo masz problem z... po czym krótko i treściwie opisz przypadek. W oczywistych kwestiach możesz dostać odpowiedź bez podchodzenia do Twojego biurka. Pokazujesz w ten sposób, że szanujesz jego czas, który jest bardzo cenny. Kolejnym plusem pracy zespołowej jest udzielanie się w dyskusjach dotyczących rozwiązań, jakie mają być zastosowane w projekcie, należy uważnie słuchać jakie są pomysły na przyjęte w nim funkcjonalności, a w razie nie zrozumienia, powiedzieć że nie jest to dla Ciebie do końca jasne. Gdy od początku nie będziesz rozumieć całej koncepcji to w trakcie projektu jest bardzo prawdopodobne, że sporo zadań sprawi Ci problem. Kolejną kwestią jest, nie bać się przedstawiać własnych pomysłów, które mimo że będą zapewne często nietrafione to pozwoli Ci to na wykształtowanie umiejętności tworzenia lepszych rozwiązań, poznawanie perspektywy osób bardziej doświadczonych kreuje w Twoim umyśle bardziej restrykcyjne i przemyślane pomysły.
Drugim tematem, który chciałem poruszyć w tej sekcji jest delegowanie i nie chodzi mi o delegowanie własnych zadań komuś innemu, ale pamiętaj że nie wszystko musisz robić samodzielnie. Skoro czujesz, że brakuje Ci czasu może warto przeanalizować wszystkie rzeczy, które masz do zrobienia i zastanowić się czy na pewno to Ty jesteś odpowiednią osobą, która ma to wykonać. Przykładem może być robienie zakupów, w dzisiejszych czasach wystarczy stworzyć listę poprzez aplikację i zlecić dowóz tych produktów. Zastanówmy się przez chwilę co zyskujemy, a co tracimy. Ze strat to jedyne co mi się nasuwa to parę złotych za dowóz, zyskujemy dużo więcej, przede wszystkim czas podczas robienia tych zakupów oraz stania w kolejce, czas i koszt dojazdu w obie strony. Jakby na to szerzej spojrzeć to za parę złotych zlecasz dużo więcej niż sam dowóz, większe zakupy to nawet godzina czasu, do tego przemieszczanie się. Gdyby ktoś zaproponował Ci pracę polegająca na zrobieniu zakupów w ciągu godziny za kilkanaście złotych, zgodziłbyś się? Na to pytanie już każdy musi odpowiedzieć sobie sam. Czas, który w ten sposób zyskałeś możesz wykorzystać na chociażby dokształcanie się z tematów, w których widzisz że masz braki lub z tematów całkowicie nowych, które poszerzą Twoje kompetencje, co może zaowocować w przyszłości.
Sztuka mówienia "nie"
Czy nie zdarzało Ci się, że miałeś rozplanowany swój czas, wiesz co chcesz zrobić dzisiejszego wieczoru, aż tu nagle dostajesz wiadomość, że dziś impreza. Zostajesz wtedy postawiony w niezręcznej sytuacji, bo głupio Ci odmówić, a z drugiej strony wiesz, że chciałeś dokończyć własny projekt lub kolejny rozdział kursu, który aktualnie przerabiasz. Myślisz sobie, że w sumie możesz to zrobić w inny dzień, bo nie musisz tego robić dziś, a impreza jest wieczorem, więc zgadzasz się, przekładając swoje założone plany na inny termin, fachowo zahacza to o termin prokrastynacja, co w skrócie oznacza tendencję do przekładania spraw na później. Oczywiście z tym wieczornym spotkaniem się ze znajomymi to tylko przykład, wiele sfer naszego życia jest ważnych i zarówno potrzebujemy mieć blok na pracę/naukę, ale też na relacje międzyludzkie. To co chciałem przekazać to, to abyś zawsze wiedział, że wybierając jedno (w danym momencie) tracisz drugie, dlatego tak istotne jest planowanie, w dobrze zaplanowanym tygodniu powinno znaleźć się miejsce dla najważniejszych dla Ciebie sfer życia i ich podział na czas, jaki chcesz im poświęcić. Ułożenie planu doskonałego jest wręcz niemożliwe do zrobienia i zawsze będą jakieś nieprzewidziane sytuacje, ale to właśnie wtedy musisz już sam odpowiedzieć na pytanie: co jest dla mnie ważniejsze? Sztuka mówienia "nie" nie polega na tym, by zawsze i każdemu odmawiać wszystkiego o co zostajesz poproszony, lecz na tym by ocenić co jest pilne, a co ważne? Skoro jesteś po godzinach pracy, a dostajesz wiadomość, że dobrze by było gdybyś dostarczył raport, jak najszybciej, a Ty jesteś obecnie z rodziną na spacerze, to raport jest pilny, ale dla mnie rodzina jest ważniejsza. Pamiętaj, że każdy będzie miał swój scenariusz, a te przykłady miały na celu zaprezentować sytuacje, w których umiejętność odmawiania jest kluczowa.
Postęp i refleksja
Kolejnym ważnym tematem jest monitorowanie własnych postępów i wyciąganie wniosków z zastosowanych rozwiązań. Aby wiedzieć, że nie stoi się w miejscu, polecam w jakikolwiek sposób zapisywać własne postępy, może to być kartka papieru czy też arkusz kalkulacyjny. Jak to w ogóle robić? Tak naprawdę wystarczy, aby miało to formę zrozumiałą dla Ciebie, może to być lista opanowanych przez Ciebie umiejętności, tabelka czy też swego rodzaju roadmapa. Ważne byś zapisywał to czego nauczyłeś się w danym okresie czasu, może to być na przykład miesiąc. Na początku każdego miesiąca, zrób krótki przegląd tego, jakie postępy poczyniłeś w poprzednim, nie musi się to wiązać tylko z nowo poznanymi zagadnieniami, lecz także z obecnymi rozwiązaniami jakie stosujesz. Sprawdź wtedy jakość pisanego przez Ciebie kodu. Być może posiadasz jakieś swoje własne, starsze projekty, które stworzyłeś dawno temu i w sumie o nich zapomniałeś, warto wykorzystać taki materiał do refleksji i porównania czy to jakie podejście stosujesz obecnie jest lepsze od poprzedniego i dlaczego? co możesz jeszcze poprawić? Wielokrotnie zdziwisz się, że kod który sam napisałeś będzie Twoim zdaniem nie do przyjęcia i posiadał sporo problemów, ale to akurat może Cię tylko cieszyć, bo skoro potrafisz wytknąć błędy we własnym kodzie, oznaczać to będzie, że Twój postęp rośnie, a Ty idziesz w dobrym kierunku. Jeśli dopiero zaczynasz przygodę z programowaniem i nie posiadasz tego typu materiałów, to zabierz się za ich tworzenie. Nic tak nie uczy, jak własnoręcznie napisany projekt, potem zapisz co udało Ci się stworzyć, a za jakiś czas do tego wrócisz.
Ustal realne cele
Jedną z moich ulubionych metod, która bardzo pomaga w określaniu własnych celów jest metoda S.M.A.R.T. - co prawda w samej pracy chciałem się odnieść głównie do tego, żeby określać cele jako realne do wykonania, niemniej jednak warto ją poznać, gdyż może Ci pomóc w innych aspektach życia. Nie jest to główny temat tego podpunktu, więc tylko krótko wymienię jej zasady. Zamysł stosowania metody S.M.A.R.T polega na określaniu celów w sposób "sprytny" (smart), co oznacza, że dobrze wyznaczone cele powinny spełniać określone warunki, być sprecyzowane (specific), mierzalne (measurable), ambitne (ambitious), realne (realistic) i określone w czasie (time-bound). Możesz się tez spotkać z innymi wariantami tej metody, gdzie wymiennie używa się też warunków takich jak: istotne (relevant), osiągalne (achievable), namacalne (tangible), i dopasowuje się je do kategorii celów jakie chcemy osiągnąć. Istnieje nawet rozszerzona wersja tej metody S.M.A.R.T.E.R. wzbogacona o dodatkowe warunki: ekscytujące (exciting) oraz zapisane (recorded). Metoda ta świetnie spisuje się przy określaniu większych celów, lecz jeden z jej warunków jest szczególnie ważny przy codziennej pracy, mianowicie realność podczas tworzenia listy zadań, którą chcemy przygotować na dany dzień. Wrzucenie sobie na listę ich zbyt dużej ilości, doprowadzi Cię tylko do niepotrzebnej frustracji na koniec dnia, gdy nie osiągniesz założonych celów.
Osobiście stosuję dodatkowy podział ściśle powiązany z priorytetami, co w rezultacie idealnie się spisuje. Wiedząc, że mam do wykonania określone zadania, zazwyczaj dzielę je na trzy poziomy priorytetów: konieczne, ważne, dodatkowe. Jak nie trudno się domyśleć wskazują one po prostu kolejność ich wykonywania i zazwyczaj podział ten obejmuje 1-2 zadań koniecznych, 1-2 zadań ważnych oraz 2-4 zadań dodatkowych. Przeciętna lista składa się z reguły z około 5-6 wyznaczonych zadań, które są dopasowane pod względem czasu na ich wykonanie, po stworzeniu warto zadać sobie pytanie: czy to jest realne w dniu dzisiejszym?
Zadanie konieczne wybieram na podstawie tego co jest w danym momencie o najwyższym możliwym priorytecie lub blokuje mnie przed wykonywaniem kolejnych zadań, pracuje nad nimi tak długo dopóki ich nie rozwiążę, nawet jeśli kosztem miałoby być niezrobienie pozostałych.
Zadania ważne są jak najbardziej istotne, lecz powinny być dobrane w ten sposób, aby w razie niepowodzenia, był priorytetem dnia kolejnego (czyli powinny być ważniejsze od tych, które wyznaczamy, jako konieczne dnia następnego).
Zadania dodatkowe to z reguły mniejsze zadania, które wiem że trzeba zrobić, ale nie są mocno priorytetowe, pozwala to na wypełnienie potencjalnie wolnego buforu czasowego, gdy wcześniejsze zadania będą skończone, a dzień pracy nie dobiegnie końca.
Często będzie tak, że nie uda Ci się zrealizować założeń, ale nie przejmuj się tym - mogło to być nierealne dopasowanie - czego ustalanie przyjdzie z czasem, istotą jest aby wykonać zadania konieczne. Warto też rozpoczynając tego typu planowanie po raz pierwszy - ustalić listę zadań o dodatkowy dzień, a następnego dnia dopasować w zależności od poczynań z wczoraj, dzień dzisiejszy i co ważne od razu ustalić plan na dzień kolejny, pozwoli Ci to zachować elastyczność i precyzję budowanych planów. Pamiętaj, żeby trzymać się ustalonego przepływu pomiędzy zadaniami i wykonywać kolejne dopiero wtedy, kiedy poprzednie są ukończone w ramach zdrowego rozsądku. Zblokowanie się na zadaniu przez dłuższy czas bez postępu i mimo zastosowania zasad pracy zespołowej nie przynosi to efektu to znak, że trzeba zmienić podejście.
Priorytetyzacja zadań.
Podsumowanie
Skuteczne zarządzanie czasem jest kluczowe w pracy programisty. Planowanie, skupienie, efektywne wykorzystywanie przerw i odpowiednie wybory to umiejętności, które pozwolą Ci efektywniej pracować i osiągać zamierzone cele. Pamiętaj, że zarządzanie czasem to nie tylko kwestia pracy zawodowej, ale również dbałość o równowagę między nią, a życiem osobistym, zdrowiem, rodziną, czasem spędzonym wśród znajomych, co przekłada się na lepsze samopoczucie i efektywność w dłuższej perspektywie.