Jak przekonać zespół do nowego podejścia

Jak przekonać zespół do nowego podejścia

Wątek przeniesiony 2019-01-15 14:17 z Nietuzinkowe tematy przez somekind.

LM
  • Rejestracja:ponad 9 lat
  • Ostatnio:6 miesięcy
  • Postów:21
0

Mam około 3 letnie doświadczenie jako dev (w różnych projektach, z różnymi technologiami i architekturami). Niedawno dołączyłem do projektu, w którym pracują też starsi devowie (po 6,7,8 lat doświadczenia).
Jednak cały system, moim zdaniem, wymaga zmian, ponieważ w chwili obecnej jest bardzo ciężko zarządzalny, z perspektywy nowej osoby, która ma kilka większych projektów opartych na mikroserwisach za sobą.
Nasz system to taki monolit, nieznający czegoś takiego jak SOLID i unit testy. Chciałbym zacząć od stworzenia nowego podejścia do nowych funkcjonalności - czyli w skrócie, nowe moduły piszemy już jako osobne mikroserwisy, wprowadzamy CQRS, DDD w fomire light (żeby nikogo nie przerazić bo się zniechęcą) no i przede wszystkim testy. Może nie potrzebujemy ekstra skalowalności, ale przede wszystkim opanowanie chaosu który wprowadza dynamika nowych funkcjonalności. Dużo się interesuje nowoczesną architekturą, pracowałem w jednym projekcie gdzie to naprawdę dobrze działało i mam pewne doświadczenie.
Niestety często spotykam się z uwagami takimi jak: "a po co to potrzebne", "zawsze tak robiliśmy i jest dobrze", "ja nie wiem czy to zadziała".
Moje pytanie brzmi: jak przekonujecie ludzi do swoich pomysłów? :)

M9
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:8
3

Taaaaa, DDD fajnie brzmi, problem tylko taki ze malo kto umie, a jeszcze mniej wie o co w tym tak na prawde chodzi, ale kazdy sie chwali ze robi w DDD, smiech na sali :D trafilem na artystow co twierdzili ze robia w DDD a robili zwyklego malego cruda

axelbest
Pracowałem z seniorami co móżdżyli po kilkadziesiąt godzin waląc rozkminy czy dana funkcja "musi/ma/może" coś robić - po kilku miesiącach wdrażania tego gónva, okazało się że system wypierdziela się przy podstawowych operacjach :)
Aventus
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
9

Czyli rozumiem że Twoim zdaniem mikroserwisy to uniwersalne rozwiązanie? Tam gdzie spotyka się monolit w negatywnym sensie tego określenia, Ty jako naturalne rozwiązanie z automatu podajesz mikroserwisy?

Zdaję sobie sprawę z tego z jakimi problemami się zmagasz- programiści nie przykładający wagi do jakości kodu, brak testów, zapewne paranoiczne nastawienie do perspektywy większych zmian. Tyle tylko że opierając się na Twojej wypowiedzi Ty wcale nie wupadasz dużo lepiej, bo idziesz w drugą stronę skrajności.

Może nie potrzebujemy ekstra skalowalności, ale przede wszystkim opanowanie chaosu który wprowadza dynamika nowych funkcjonalności.

To da się osiągnąć bez żadnego przeinzynierowania. Skoro jak sam napisałeś skalowalnosc nie jest problemem to powiedz proszę- jakie konkretne motywy stoją za wprowadzeniem architektury opartej o mikroserwisy? A konkretnie- jakie w kontekście tego konkretnego projektu zalety przeważą nad wadami w postaci konieczności komunikacji sieciowej, de facto brak transakcyjnosci wspartej przez infrastrukturę (zakładam że skoro teraz jest monolit, to i transakcje), zapewnienie spójności danych (a konkretnie eventual consistency)?

Może najpierw wypadało by pomyśleć nad rozbiciem tego monolitu w monolit modularny- tu też będziesz mógł zastosować DDD. Oczywiście zdajesz sobie sprawę że DDD to nie tylko kod i nie tylko programiści?

Ja rozumiem że w dzisiejszych czasach ludzie jak słyszą "monolit" to dostają ataku paniki, ale to mało obeznani ludzie są.


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
edytowany 1x, ostatnio: Aventus
dymul
Post bardzo wartościowy, popraw tylko tę spójność ewentualną bo kłuje w oczy strasznie. Eventually nie znaczy ewentualnie a raczej ostatecznie.
Aventus
@dymul: dzięki, zmienione na angielski. Tak chyba najlepiej.
LM
  • Rejestracja:ponad 9 lat
  • Ostatnio:6 miesięcy
  • Postów:21
0

Motywy są takie, że projekt już został dość mocno podzielony na różne zespoły deweloperskie, rozwijające różne funkcjonalności. Mikroserwisy dadzą nam spore korzyści - każdy taki zespół będzie miał większą elastyczność (osobne wdrożenie, osobne review, może nawet osobne zasoby produkcyjne w przyszłości).
No i oczywiście, zdaję sobie sprawe że DDD to nie tylko kod i programiści - dlatego też napisałem w wersji light. Chodzi mi głównie o umiejscowienie modelu domenowego w centrum systemu i nie mieszania tego z infrastrukturą + porządne testy.
@Aventus masz rację, że łatwo pójść w drugą strajność - tego nie chcę. Dlatego właśnie planuje to zrobić na spokojnie, zacząć od czegoś małego, zobaczyć jak działa i jak się przyjmie.
Do tego, myślę że CQRSy pomogą nam w zakresie podzielenia odpowiedzialności - będzie to pewne wymuszenie na programistach tworzenie interfejsów opartych na zadaniach, do tego pojedyncza odpowiedzialność w kodzie. Myślę, że pominiemy pewne elementy, nie będziemy na przykład wykorzystywać zewnętrznego systemu kolejkowego - komendy mogą być synchroniczne. Za to integracja modułów w oparciu o eventy, w kontekście dużego, podzielonego zespołu to bardzo przydatna sprawa. Zdaje też sobie sprawę z wad takich jak eventual consistency, ale w przypadku naszego systemu nie musimy się tym aż tak przejmować - nie jest to nic na tyle krytycznego.

LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:8 minut
  • Postów:8398
2

Mikroserwisy dadzą nam spore korzyści - każdy taki zespół będzie miał większą elastyczność
(osobne wdrożenie, osobne review, może nawet osobne zasoby produkcyjne w przyszłości).

No to przy robieniu taska wdróż na próbę te mikroserwisy do tego, co robisz aktualnie. Łatwiej przekonać zespół, żeby ci pozwolili zrobić taska jak chcesz (albo postawić ich przed faktem dokonanym), niż żeby zmieniali cały projekt. A przy większym projekcie i tak ciężko wszystko przepisywać od razu. Poza tym - skąd wiesz, że w tym projekcie w ogóle będzie się dało łatwo zaimplementować i zintegrować mikroserwisy? Skąd wiesz, że w tym projekcie to będzie dobra idea? Musiałbyś to i tak sprawdzić na małą skalę, zamiast robić ryzykowne zmiany na cały projekt.

Nasz system to taki monolit, nieznający czegoś takiego jak SOLID i unit testy.

Nie system, tylko ludzie, którzy go pisali co najwyżej nie znają/nie chcą stosować SOLID ani nie piszą testów.

Co do testów, to przecież możesz przy okazji pisania nowych modułów pisać je z testami, oraz przy okazji każdego ruszenia starego modułu, dopisać do niego kawałek testu. Zasada skauta.

wprowadzamy CQRS

Tzn. w którym miejscu? To nie jest pattern, który się wrzuca wszędzie.

, DDD w fomire light

Co masz na myśli DDD w formie light? I czym to się wg ciebie różni od wersji normalnej?

no i przede wszystkim testy.

👍

Niestety często spotykam się z uwagami takimi jak: "a po co to potrzebne", "zawsze tak robiliśmy i jest dobrze", "ja nie wiem czy to zadziała".
Moje pytanie brzmi: jak przekonujecie ludzi do swoich pomysłów? :)

Musisz mieć dobre argumenty, dlaczego w danej sytuacji jakieś rozwiązanie techniczne lepiej się sprawdzi. Jeśli sam tego nie wiesz, nie potrafisz sam wykazać takich argumentów, to może lepiej jednak nie przepisuj tego na CQRS/DDD/mikroserwisy, jeśli masz to robić dla samej nadziei, że będzie lepiej. To pachnie cargo cultem...


somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 12 godzin
  • Lokalizacja:Wrocław
7
LagMan napisał(a):

Jednak cały system, moim zdaniem, wymaga zmian, ponieważ w chwili obecnej jest bardzo ciężko zarządzalny, z perspektywy nowej osoby, która ma kilka większych projektów opartych na mikroserwisach za sobą.

Co nazywasz "większym projektem"? Ile tych mikroserwisów miałeś?

Nasz system to taki monolit, nieznający czegoś takiego jak SOLID i unit testy.

To są jakby 2 oddzielne problemy. Monolit nie od razu musi być zły. Ile teamów iluosobowych nad tym pracuje?

Chciałbym zacząć od stworzenia nowego podejścia do nowych funkcjonalności - czyli w skrócie, nowe moduły piszemy już jako osobne mikroserwisy

A masz dobry plan jak zintegrować je z istniejącym monolitem? Jak z deploymentami?

Niestety często spotykam się z uwagami takimi jak: "a po co to potrzebne", "zawsze tak robiliśmy i jest dobrze", "ja nie wiem czy to zadziała".
Moje pytanie brzmi: jak przekonujecie ludzi do swoich pomysłów? :)

Wcale, bo to nie ma sensu. Albo ktoś od razu rozumie co się do niego mówi albo nie rozumie.
Jeśli pracujesz z ludźmi, którzy mają już kilkuletnie doświadczenie i nie stosują SOLID oraz testów jednostkowych, to wszelkie próby przekonywania ich będą dla Ciebie tylko stratą czasu i niepotrzebnym stresem.

YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:około godziny
  • Postów:2367
2
LagMan napisał(a):

Moje pytanie brzmi: jak przekonujecie ludzi do swoich pomysłów? :)

  1. Prezentacja tematu X (raz na jakiś czas mamy takie sesje edukacyjne zespołu, gdzie każdy może zaprezentować interesujący go temat, produkt, technologię. Firma wspiera takie inicjatywy przez zamówienie pizzy, hamburgerów albo jakiejś innej formy obiadowej)
  2. Dyskusja nad tematem X
  3. Zastanowienie się czy X może być zastosowane w codziennej pracy

Jak mam potrzebę przekonania kogoś do czegoś, to staram się pokazać korzyści płynące z tego czegoś, a nie operować na hasłach "jest to dobre zawsze i wszędzie, bo jest nowoczesne i każdy, powtarzam, każdy tak robi".

VA
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:35
1
  1. Zacznij od pisania unit testów, trzymania się SOLID itp. w nowych taskach, w których robisz komuś review lub, które robisz sam.

  2. Kolejny krok to rozbicie tego na mniejsze komponenty. Napisałeś "Motywy są takie, że projekt już został dość mocno podzielony na różne zespoły deweloperskie" - niech one wydzielą te grupy funkcjonalności i je rozwijają, ale idąc od razu w mikroserwisy będzie to zbyt brutalna przesiadka.

  3. Polecam też ideę community w takiej sytuacji. Raz w tygodniu miejcie wspólne spotkanie (minimum 1 członek zespołu), które trwało by z godzinkę i tam ustaljcie wspólne kroki co do commonowych tematów (jakieś commonowe paczki, generyczne skrypty budujące aplikację, decyzje co do architektury, konsultacje co do generycznego systemu CI/CD, testy integracyjne itp.). Niech tam będą wszyscy - PM, developerzy, testerzy, DevOps.

  4. Idź małymi kroczkami. Wydziel grupy tematów np.:
    a) rozbicie monolitu na X dużych klocków
    b) sposób pracy z gitem w nowym flow (git flow)
    c) sposób wersjonowania
    d) sposób korzystania z wspólnych rzeczy (np. macie jakiś wewnętrzny framework testowy, którego używają wszyscy - niech to będzie jakaś paczka)
    e) jak testować integracyjnie aplikację (macie jakieś CI?, jak wygląda deploy?)
    f) pull requesty
    g) review
    h) unit testy obowiązkowe

RM
  • Rejestracja:około 6 lat
  • Ostatnio:około 6 lat
  • Postów:4
0

Moim zdaniem najlepiej wszystko komunikować językiem korzyści... czyli, ktoś musi wiedzieć, co z tego będzie miał... dlaczego warto popierać dany pomysł. Długa kwestia to sam sposób wprowadzania nowego podejścia - najlepiej małymi kroczkami np, na małych projektach. Są też specyficzne zespoły, które np lubią wyzwania, wtedy warto więc ująć to w kontekście wyzwania... nie wiem czy nam się to uda, ale myślę, że mamy potencjał, to trudne, ale nie z takimi rzeczami radziliśmy sobie itd.

several
  • Rejestracja:ponad 15 lat
  • Ostatnio:29 minut
1

@offtop Nie jestem przekonany czy to taki nietuzinkowy temat. Anyway....

system to taki monolit, nieznający czegoś takiego jak SOLID i unit testy.

Zmień pracę.


edytowany 2x, ostatnio: several
zyxist
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 6 lat
  • Postów:101
1

Mam dwa przemyślenia:

  1. SOLID, testy itd. - zgadzam się, to jest podstawa. Myślę, że najważniejsze to zacząć to samemu robić. Reszta zależy już od sytuacji konkretnego zespołu, choć od razu Cię uprzedzę, że proces będzie trochę trwał. Jeśli jest wsparcie menedżera, można to wykorzystać np. do zabrania się za wdrażanie nowych osób i po prostu budowania bazy ludzi. W końcu masa krytyczna zacznie przeważać. Część osób pójdzie za tym, gdy zobaczy efekty, lecz musisz też się liczyć z tym, że będą osoby, które po prostu nie będą chciały i całą energię będą poświęcały na to, żeby się wykręcić. Z nimi niestety nic nie zrobisz, trzeba czekać aż same się zmęczą i odejdą. Przestrzegam natomiast przed obrabianiem d(!)y ludziom i wszelkimi nieetycznymi działaniami w kierunku kogokolwiek. Raz, że jest to po prostu nieprofesjonalne, a dwa że może się zemścić, i dobrze zresztą. Toksyczna osoba jest mimo wszystko dużo gorsza niż osoba, która ma braki w doświadczeniu.

Z doświadczenia powiem też, że jeśli trafią się osoby, które będą chętne nauczyć się czegoś nowego, to trzeba być cierpliwym i im pomagać. To, że powiecie sobie "piszemy testy jednostkowe" nie sprawi, że takim osobom od razu zacznie to wychodzić. Zdobywanie doświadczenia to proces, który może trwać nawet latami.

Inna sprawa... jeśli ktoś ma 8 lat doświadczenia i pyta się "a po co unit testy", to hmmm...

  1. Mikroserwisy, DDD, CQRS - a czy system rozwiązuje problemy, do których te wzorce zostały zaprojektowane, że proponujesz ich zastosowanie?

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)