Learn by failing

Błędy i wnioski wyciągnięte po 2 latach pracy z React

Bartosz Szczeciński

20.02.2019

@btmpl

medium.com/@baphemot

https://szczecinski.eu

O mnie

- PHP dev -> JS dev, ponad 17 lat doświadczenia

- Administrator Reactiflux

- Technical writer

- React Evangelist

O projekcie

- zadanie: przepisać monolityczną aplikację wykonaną w JSP na React

- początek: październik 2016

- migracja w etapach - use-case po use-case

 

W liczbach

 

- 9 połączonych projektów

- 40+ FE developerów, 5 krajów, 2 strefy czasowe

- największy zespół: 11 FE developerów

Dynamiczny rozwój

- brak wzorców i wytycznych narzuconych przez React jest zarówno polem popisu dla architektów, jak i pułapką dla developerów

- ciągła ewolucja możliwości, dobrych praktyk oznacza, że kod dużo szybciej staje się "legacy"

  mixins -> HoC -> render props -> React Hooks ...?

Szum komunikacyjny / FUD

- React Hooks

- React Fiber

- React Suspense

- React Suspense for data fetching

- React Fire

Mnogość wyboru

O ile React jest naszym podstawowym wyborem, o tyle biblioteki "dodatkowe" przychodzą i odchodzą wraz z supportem i oczekiwaniami społeczności

 

  react-test-utils -> Enzyme -> react-testling-library

  react-router -> @reach/router? navi?

  react-datepicker -> react-dates

  lodash -> ESNext

Trendy

Rozwiązanie CSS ewoluowało wraz z projektem

- pliki .css - problem z generowaniem CSS (zagnieżdżenia)

- pliki .less i CSS modules - problem z nadpisywaniem styli

 

 

 

 

- styled-components - problemy z tworzeniem zbyt dużej ilości komponentów (divitis)

Zmiany decyzji

Zewnętrzne biblioteki:

- proof of concept - zebranie pełnych wymagań od Product Ownera i wykonanie PoC dostępnych bibliotek; zestawienie za i przeciw - po roku zmiana wymagań...

 

- abstrakcje - tworząc komponenty pośrednie, eksponujące tylko tą część API, którą potrzebujemy, umożliwiamy zmianę implementacji bez przepisywania aplikacji

Mnogość danych

Zewnętrzne dane:

Praca z nieustannie zmieniającym się API (również przepisywanym z monolitu na MS). Ciągłe modyfikowanie API komponentów / kształtu Redux store.

Testy

- 75% test coverage = pisz głupie testy byle tylko podnieść coverage%

- testowanie nie tego co trzeba

https://www.youtube.com/watch?v=aHYtZsoXs2w

Testy

- archaiczny stack (karma + mocha + chai + chrome) = słaba wydajność, błędy w coverage, długie czasy działania uniemożliwiają TDD

Testy

react-testing-library

"ograniczone" Enzyme wymuszające dobre praktyki

Testy

Zmiana stacku:

- jest

- js-dom

- jeszcze trochę chai (spy)

 

Benefity:

- testy działają 10 razy szybciej

- testy w js-dom = nie uruchamiasz Chrome = 2GB wolnego

- watch mode

- refactoring = <3

Walka z narzędziami

- globalne (na całą organizację) wymagania dot. standardu kodu oznaczają walkę z niektórymi zwyczajami w JS:

  - inny układ klamer (one true brace style),

  - długość linijki (java)

  - nazwy modułów

 

- utrudnianie życia

  developerowi

Przydatne narzędzia

Prettier

Husky

Optymalizacja aplikacji

- 9+ oddzielnych aplikacji

- 2+ widgety

- każde z nich może być

  uruchamiane niezależnie

  lub wraz z innymi aplikacjami

  na tej samej stronie WWW

Współdzielenie kodu

- 9+ aplikacji = 9 oddzielnych chunków z Reactem

- 2+ widgety = 2 dodatkowe chunki z Reactem

 

  3+ pliki .js z tym samym kodem na każdej stronie

Webpack DllPlugin

Analiza plików aplikacji

lodash

moment.js

Duża ilość komponentów

- wiele aplikacji = wiele komponentów

- wiele komponentów w wielu aplikacjach = więcej miejsc

  do sprawdzenia czy "ktoś nie zrobił już guzika?"

- więcej wersji guzika = legacy code = większy koszt

  utrzymania

Zapomnij o /src/components

"Komponenty utworzone w katalogu /src/components to komponenty, których nie miałem jeszcze czasu wrzucić do NPM"

- Abraham Lincoln, 2018

Własne repozytoria

Dokumentowanie

Dokumentowanie

Bycie na bieżąco

Technologia nie stoi w miejscu, a kto nie idzie do przodu ten się cofa.

 

W jaki sposób wprowadzać nowe technologie i rozwiązania na projekcie, w którym pracuje wiele developerów o różnym poziomie wiedzy?

Bycie na bieżąco

Proof of Concept

- wykaż, jakie plusy przyniesie zmiana technologii / procesu

  - dla Product Ownera ("szybciej, taniej, mniej błędów")

  - dla użytkowników ("szybciej, częściej, łatwiej")

  - dla developerów ("mniej fuckupów, mniej boilerplate")

 

- wykaż, jak zmieni się kod na skutek wprowadzenia

  Twojej sugestii

  - screenshot z diff przed i po

  - ilość kodu, którego nie trzeba będzie pisać

Bycie na bieżąco

Workshop i knowledge-sharing

- jeżeli to możliwe, organizuj wewnętrzne szkolenia dla

  developerów

- wsparcie w onboardingu dla nowych członków zespołów

- dokumentacja, komentarze, code review

- knowledge-sharing poza zespół

Bycie na bieżąco

Samodoskonalenie

- obserwuj i otaczaj się ludźmi mądrzejszymi i DUŻO mądrzejszymi od ciebie; zwalcz syndrom impostora

- śledź nowinki

  - This Week in React

    https://reactstaticpodcast.netlify.com/episode/week0

  - This Week in /Reactjs

    https://reactstaticpodcast.netlify.com/episode/week0/

  - React Polska

    https://facebook.com/profile.php?id=972937362726271

  - Reactiflux

    https://www.reactiflux.com/

Eksperymentuj!

Nawet jeżeli to co napiszesz

jest tak złe, że Dan w skali "how bad is it" ocenia to na "11/10" to nauczyłeś się czegoś nowego.

Dzięki :)

Pytania?

Bartosz Szczeciński

20.02.2019

@btmpl

medium.com/@baphemot

https://szczecinski.eu

Learn by failing

By btmpl

Learn by failing

  • 400