Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Produktywność i flow pracy Pythonistów

Produktywność i flow pracy Pythonistów

Sebastian Buczyński

August 30, 2024
Tweet

More Decks by Sebastian Buczyński

Other Decks in Technology

Transcript

  1. • Architekt @ Sauce Labs • Trener / Konsultant @

    Bottega IT Minds • Szkolę głównie z testowania, Czystej Architektury i mikroserwisów • Lubię memy • Bloguję @ breadcrumbscollector.tech • Adwokat inżynierii oprogramowania w świecie Pythona whoami
  2. Mierzenie produktywności jest trudne • Liczba napisanych linii kodu =

    ☠ • Liczba commitów = ☠ • Liczba zrobionych zadań w sprincie = ☠
  3. Łatwo zauważyć, że coś jest nie tak Trudniej jest poprawić

    Bilety do kina dla osoby, która zrobi najwięcej commitów
  4. Przykład #1 Przykład #2 Pętle zwrotne (ang. feedback loops) Czas

    wykonania zautomatyzowanego zestawu testów Czekanie na przetestowanie zadania Stan przepływu (ang. f low) Klarowność celów i zadań Przerwania (np. częste spotkania, długie czekanie na CI) Ładunek kognitywny (ang. cognitive load) Ilość kroków potrzebna do wdrożenia zmiany na produkcję Postrzegana złożoność kodu, z którym pracuję
  5. Przykład #1 Przykład #2 Pętle zwrotne (ang. feedback loops) Czas

    wykonania zautomatyzowanego zestawu testów Czekanie na przetestowanie zadania Stan przepływu (ang. f low) Klarowność celów i zadań Przerwania (np. częste spotkania, długie czekanie na CI) Ładunek kognitywny (ang. cognitive load) Ilość kroków potrzebna do wdrożenia zmiany na produkcję Postrzegana złożoność kodu, z którym pracuję
  6. Przykład #1 Przykład #2 Pętle zwrotne (ang. feedback loops) Czas

    wykonania zautomatyzowanego zestawu testów Czekanie na przetestowanie zadania Stan przepływu (ang. f low) Klarowność celów i zadań Przerwania (np. częste spotkania, długie czekanie na CI) Ładunek kognitywny (ang. cognitive load) Ilość kroków potrzebna do wdrożenia zmiany na produkcję Postrzegana złożoność kodu, z którym pracuję
  7. Cykl wytwarzania oprogramowania 6. Utrzymanie 5. Testowanie / integracja 4.

    Implementacja 3. Projektowanie 2. Analiza 1. Planowanie
  8. Implementacja Praca z kodem • edytory • formatery • lintery

    • adnotacje typów + type checkery • asystenty AI
  9. Zastosowanie adnotacji typów w Pythonie • Wychwytywanie błędów (z type

    checkerami) • Baza dla bibliotek opierających się o adnotacje • https://github.com/typeddjango/awesome-python-typing • Podpowiedzi w IDE
  10. Czego używać? • Formater - ruff - zastępuje blacka i

    isorta, niedorzecznie szybki • Linter - … • Type checker - …
  11. Czego używać? • Formater - ruff • Linter - ruff

    - zastępuje f lake8, -- f ix, niedorzecznie szybki • Type checker - …
  12. Czego używać? • Formater - ruff • Linter - ruff

    • Type checker - ruff https://github.com/astral-sh/ru ff /issues/3893
  13. Czego używać? • Formater - ruff • Linter - ruff

    • Type checker - pyright / mypy*
  14. Receptura nr 2: Podczas zapisu pliku { "language_overrides": { "Python":

    { "format_on_save": "on", "formatter": { "external": { "command": "bash", "arguments": [ " - c", "ruff check -- f i x -- stdin - f i lename {buffer_path} | ruff format -- stdin - f i lename {buffer_path}" ] } } } } }
  15. Receptura nr 3: Ręczne uruchamianie po zakończeniu etapu pracy (Make

    f ile) # Makef i le qa: ruff check . - - extend - select I - - f i x ruff format . mypy - - strict - - enable - incomplete - feature=NewGenericSyntax . pytest tests/ # konsola make qa
  16. Receptura nr 3: Ręczne uruchamianie po zakończeniu etapu pracy (nox)

    # noxf i le.py import nox from nox import Session @nox.session def lint_and_f i x(session: Session) - > None: session.run("ruff", "check", ".", " - - extend - select", "I", " - - f i x") . . . # konsola nox - - no - venv - s lint_and_f i x
  17. Asystenty AI • Github Copilot • Tabnine • AWS CodeWhisperer

    • … (+ specjalne edytory, plus modele dostępne tylko w formie czatu, itp.)
  18. Asystenty AI 2. doskonałe zastosowania • Wiesz co chcesz napisać,

    ograniczeniem jest tempo pisania • Nie pamiętasz jak coś dokładnie zrobić w popularnym narzędziu
  19. Czy warto? Jeszcze jak![1][2] 1. W fazie eksploracji przeszkadza 2.

    Halucynacje! Type hinty dają lepsze podpowiedzi
  20. Testowanie - metryki dla produktywności • Ile czasu wykonuje się

    cały zestaw testów? • Do 5 minut - 🥰 • 15 minut - próg bólu🤕 • … • …
  21. Testowanie - metryki dla produktywności • Ile czasu wykonuje się

    cały zestaw testów? • Do 5 minut - 🥰 • 15 minut - próg bólu🤕 • Ile czasu mija do uruchomienia pierwszego testu jednostkowego? • …
  22. Testowanie - metryki dla produktywności • Ile czasu wykonuje się

    cały zestaw testów? • Do 5 minut - 🥰 • 15 minut - próg bólu🤕 • Ile czasu mija do uruchomienia pierwszego testu jednostkowego? • Ile % testów możesz uruchomić lokalnie? • Im więcej, tym lepiej
  23. Proponowana strategia testowania Bo trzeba zacząć od konkretu • Zacznij

    od testu wysokiego poziomu, np. akceptacyjny na poziomie API • Dodawaj testy niższego poziomu, jeśli bardziej się opłacają • *Dołóż monitoring syntetyczny lub testy z UI jeśli musisz
  24. Testy nie powinny boleć* *jeśli bolą, to problem jest z

    kodem testowanym • Testy komponentu A • Testy komponentu B • (Mało) testów end to end 3 podzstawy uruchomione równolegle
  25. class Subscription: def __ init __ ( self, bill_date: date,

    term: Literal["monthly", "annual"] ) -> None: ... def cancel(self) -> None: ... def pause(self) -> None: ... def resume(self) -> None: ... def next_bill_date(self, today: date) -> date | None: ...
  26. Wskazówka 1/2: Napisz parę przykładów def test_paused_subscription_has_no_next_bill_date() -> None: subscription

    = Subscription(date.today(), "monthly") subscription.pause() assert subscription.next_bill_date(date.today()) is None def test_paused_subscription_can_be_resumed() -> None: subscription = Subscription(date.today(), "monthly") subscription.pause() subscription.resume() assert subscription.next_bill_date(date.today()) is not None
  27. Powtarzalność (tzw. reproducible builds) • Poetry ✅ • pdm ✅

    • Pip-tools ❌ (problemy z podbiciem paczek przy warstwach zależności) • Pipenv - 🤷