Jak przemówić współpracownikom, że tight coupling jest zły?

Jak przemówić współpracownikom, że tight coupling jest zły?
JU
  • Rejestracja:około 22 lata
  • Ostatnio:23 dni
  • Postów:5042
0

No właśnie. Próbuję już na różne sposoby, ale spotykam się ze ścianą (przecież działa). Jak byście przemówili do współpracowników, żeby przekonać ich do tego, że loose coupling jest zdecydowanie lepszym podejściem*?

*pomijam rzeczy typu wbudowane systemy operacyjne i inne, gdzie tight coupling może być sensowny.

AL
on może być sensowny tam gdzie może być sensowny (bo wynika np. z wydajności), to nie musi być OS/bare metal (mówię to jako człowiek którym w tym pracuje). A to że embeddowe rzeczy piszą często elektronicy bez pojęcia o innej strukturze danych jak tablica kojarzący interfejs z wtyczką, to niestety duży problem. Ale wcale nie reguła.
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
4

Jak macie tight coupling to w jaki sposób piszecie testy?


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
JU
Hehe... Chyba nawet nie wiedzą o czym mówię, gdy używam zestawienia "testy jednostkowe" ;)
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:12 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
7

Aż musiałem wygooglać co to tight coupling XD
Jakie macie objawy tego że macie tight coupling ?
I na co te objawy chcesz zmieniać?
Jak chcesz je leczyć?
No bo jakbyś mi na review powiedział Masz tight coupling, zmień na loose coupling to bym chciał żebyś wytłumaczył i na przyszlość był precyzyjniejszy przy robienu review :D


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 1x, ostatnio: KamilAdam
JU
Po to zadałem to pytanie ;)
KamilAdam
Ale ja dalej nie wiem czym jest według ciebie tight coupling :D Konkrene sytuacje musisz przedstawić żeby można było byśleć nad konkretnymi rozwiązaniami. Inaczej to tylko teoretyczne dywagacje :)
JU
Np. wszędobylskie singletony pobierane za pomocą makr (C++); , właściwie żadnych abstrakcji
Pipes
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 3 lata
  • Postów:459
5

U nas w pracy niektóre części były bardzo mocno ze sobą powiązane zanim przyszedłem i dyskusje były takie:

  1. Łatwiej będzie debugować, bo jak się wysypie to zawężamy sobie możliwości gdzie się wysypało
  2. Łatwiej będzie przepisać, bo nie będzie takiego strachu, że się wysypie. Jak się jednak wysypie to patrz pkt 1
  3. Łatwiej będzie czytać, bo jak kod jest luźno powiązany, przeważnie logika jest lepiej uporządkowana

O testach nic nie mówiłem, do tego doszliśmy dopiero po czasie i wtedy to był zachwyt, że istnieją testy jednostkowe :)

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:3 dni
  • Lokalizacja:Wrocław
10

Z moich obserwacji wynika, że ciężko przekonać ludzi lubiących pływanie w szambie do tego, że może istnieć lepsze życie.
Ogólnie najpierw chyba sobie trzeba wyrobić jakiś taki respekt - np. naprawić srogi fakap, aby w ogóle zaczęli słuchać, a potem powoli można przemycać różne drobne rozwiązania. Jak się przemyci ich odpowiednio dużo, to ciężko będzie wrócić do stanu poprzedniego. Tylko to wymaga czasu i cierpliwości, które nie każdy ma.
No i z tym loose też bym uważał, żeby czasem nie wyszło zbyt loose. ;)


Po dopracowaniu rozwiązania każdy będzie mógł założyć własny drzewiasty wątek.
JU
Na razie jest tak tight, że oddychać nie można ;)
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 9 godzin
  • Postów:3277
1

Zmiana czegokolwiek w mocno powiązanym projekcie powoduje zmianę działania w przypadkowych miejscach tego systemu. Ale przekonywanie będzie ciężkie, do takich rzeczy trzeba dojrzeć, zwykle przez kilkukrotne przywalenie w ścianę na pełnej prędkości ;)

Charles_Ray
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 7 godzin
  • Postów:1873
0

Pokaż konsekwencje takie sposobu uprawiania kodu, tak jak zasugerował @KamilAdam


”Engineering is easy. People are hard.” Bill Coughran
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:5 minut
  • Postów:8397
1
Juhas napisał(a):

No właśnie. Próbuję już na różne sposoby, ale spotykam się ze ścianą (przecież działa). Jak byście przemówili do współpracowników, żeby przekonać ich do tego, że loose coupling jest zdecydowanie lepszym podejściem*?

*pomijam rzeczy typu wbudowane systemy operacyjne i inne, gdzie tight coupling może być sensowny.

Czy w ogóle da się ich przekonać? Czy ich podejście wynika z nieopierzenia czy z betonu?

Jeśli z nieopierzenia, to możesz podejść z entuzjazmem, jakiś lightning talk o tym, slajdy, pokazywanie, w jaki sposób zrefaktorowałeś dane moduły, żeby były niezależne, co ci to dało itp.

Jak z betonu, to nic się nie da zrobić.

Inna sprawa - czym się przejawia ten tight coupling, a w jaki sposób chcesz, żeby się przejawiał loose coupling?

Bo można przesadzić w drugą stronę i iść w cargo cult wydzielania wszystkiego tylko dlatego, że można (Hello World enteprise edition), a potem robi się ileś warstw abstrakcji i overengineering. Czasami gorszy, ale prosty kod jest lepszy od lepszego, ale bardziej pokomplikowanego (ale to zależy od konkretnej sytuacji).


edytowany 1x, ostatnio: LukeJL
JU
Jest wszędzie mnóstwo singletonów, niczego nie da się testować, sporo God Classes itd. System pisany od ponad 20 lat.
YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:36 minut
  • Postów:2364
0

@Juhas: jaki konkretnie (istniejący) problem rozwiążesz przekonując współpracowników do swoich racji?

JU
  • Rejestracja:około 22 lata
  • Ostatnio:23 dni
  • Postów:5042
0
yarel napisał(a):

@Juhas: jaki konkretnie (istniejący) problem rozwiążesz przekonując współpracowników do swoich racji?

Chociażby wstęp do unit testów. Ale nie wiem jak gadać, żeby ich przekonać do zmiany czegokolwiek. No bo przecież "działa", to po co ruszać?

piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 9 godzin
  • Postów:3277
1

@Juhas: To przekonuj ich do pisania UT, do "loose coupling" przekonają się sami. Tylko wszystko zależy od tego z kim pracujesz. Jeżeli z ludźmi nawykłymi do defekowania kodu i przekazywania tego testerom, bo może poprawka trafi na kogoś innego, to będzie ciężko. Może być jeszcze ciężej, jak już te testy zaczną pisać :D

YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:36 minut
  • Postów:2364
1
yarel napisał(a):

@Juhas: jaki konkretnie (istniejący) problem rozwiążesz przekonując współpracowników do swoich racji?

Chociażby wstęp do unit testów. Ale nie wiem jak gadać, żeby ich przekonać do zmiany czegokolwiek. No bo przecież "działa", to po co ruszać?

Czyli Waszym konkretnym problemem jest brak wstępu do unit testów? Drążąc temat, posiadanie wstępu do unit testów jaki problem rozwiązuje? ;-)

Powinieneś dotrzeć do tego jaki faktycznie macie problem i pokazać jak loose coupling go rozwiązuje/upraszcza rozwiązanie.

Odbiorcą takiej argumentacji nie muszą być koledzy z zespołu odpowiedzialni za tworzenie kodu, tylko ten kto nimi zarządza/wykłada kasę i ma możliwość zdefiniowania wymagań jakościowych na kod i ich wyegzekwowanie. W ten sposób nie musisz przekonywać wszystkich, a tylko osobę decyzyjną.

Alternatywnie... ludzie uczą się na przykładach, więc możesz sam pisać "dobry kod" i jak ktoś będzie gadał o jakimś problemie, to możesz napomknąć, że miałeś podobny i rozwiązałeś go bardzo szybko, bo miałeś unit testy i loose coupling, ewentualnie ktoś podejrzy Twój kod i zrobi copy&paste ;)

Miang
czyli nowy ma lecieć kapować do kierownika i napuszczać go na zespół? albo będzie miał przechlapane albo zrobi karierę w zarządzaniu
YA
@Miang: "Jesteś u dyrektora za tight coupling!" :D Dorośli jednak rozmawiają o problemach i szukają rozwiązań, a przynajmniej powinni.
Miang
@yarel: powinien porozmawiać bez narzucania swojego zdania z kolegami bo moze sie okazać że w tym przypadku mają rację
YA
@Miang: dlatego zanim weźmie się za usprawnianie, powinien zrozumieć co usprawnia i jaki będzie z tego zysk. Jeśli koledzy nie rozumieją problemu i zysku, to może kierownik zrozumie.
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:3 dni
  • Lokalizacja:Wrocław
4
piotrpo napisał(a):

@Juhas: To przekonuj ich do pisania UT, do "loose coupling" przekonają się sami.

Raczej stwierdzą, że nie da się pisać UT i nie będą tego robić.


Po dopracowaniu rozwiązania każdy będzie mógł założyć własny drzewiasty wątek.
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 9 godzin
  • Postów:3277
5
yarel napisał(a):

Odbiorcą takiej argumentacji nie muszą być koledzy z zespołu odpowiedzialni za tworzenie kodu, tylko ten kto nimi zarządza/wykłada kasę i ma możliwość zdefiniowania wymagań jakościowych na kod i ich wyegzekwowanie. W ten sposób nie musisz przekonywać wszystkich, a tylko osobę decyzyjną.

Jak do tej pory nie piszą UT, to "osoba decyzyjna" nie dostrzega korzyści, więc jak jeden nowy oszołom jej powie, że trzeba pisać testy, a 5 innych powie, że nie trzeba to zgadnij jaka będzie decyzja? Ktoś to spaghetti napisał, zakładam, że nie OP, więc dodatkowo tamci siedzą dłużej w projekcie "i wszystko działa".

Alternatywnie... ludzie uczą się na przykładach, więc możesz sam pisać "dobry kod" i jak ktoś będzie gadał o jakimś problemie, to możesz napomknąć, że miałeś podobny i rozwiązałeś go bardzo szybko, bo miałeś unit testy i loose coupling, ewentualnie ktoś podejrzy Twój kod i zrobi copy&paste ;)

Podziwiam twoją pozytywistyczną wiarę w człowieka i zdolność do zmiany. Programiści są leniwi, niestety najczęściej w głupi sposób i zamiast coś zrobić, żeby później mieć mniej pracy, to wolą tego nie robić, bo później jakoś to będzie. Dlatego nie pomyślą 10 minut nad zaplanowaniem pracy i później tracą kilka godzin bo nie pomyśleli. To samo dotyczy pisania testów, zapoznania się z dokumentacją, czy przeczytania ze zrozumieniem historyjki.

somekind napisał(a):

Raczej stwierdzą, że nie da się pisać UT i nie będą tego robić.

Też zakładam taki rozwój sytuacji. Tu trzeba nabyć trochę wprawy, nauczyć się pisać testowalny kod, poczekać trochę na korzyści i je dostrzec. Niby oczywiste, że przyzwoite testy są wygodniejsze niż debugger i prinf("dupa"), ale praktyka pokazuje, że nie dla każdego.

FG
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 3 lata
  • Postów:29
4

Loose coupling daje pewną elastyczność, ale jednoczesnie wnosi dodatkową złożoność - czy się przyda to zależy w sumie od potrzeb.

MOŻLIWOŚCI:

Z mojej perspektywy oznacza to, że jest większa szansa na to, że będę tworzył rozszerzenia (pisał nowy kod bez edycji istniejącego). Natomiast, gdy kod za bardzo nie idzie roszerzać no.. cóż, wtedy pozostaje modyfikowanie, a modyfikacja to nie tylko wstawianie nowych lini, ale również edycja i wpływanie na to co wcześniej działało.

Zatem na pierwszy rzut oka loose coupling:

  • zwiększa szanse na pisanie nowego kodu
  • zwielokratnia szansa na ponowne użycie istniejącego kodu (kompozycja)
  • zmniejsza szanse na popsucie czegoś co działa

Oczywiście rozszerzenia mogą mieć także strategiczny wydźwięk, mogę dzięki nim jeden komponent zastąpić drugim. Np. teraz robię naiwną implementację, a za jakiś czas wracam i podpinam inny komponent, który wykonuje swoją pracę lepiej. Albo kupuje gotowy komponent, a z czasem gdy warunki nie będą korzystne to przechodzę do konkurencji lub robię własny. Nie mniej to otwiera bardziej furtkę i możliwości dla kadry zarządzającej niż samych programistów.

Programiści będą bardziej cenić fakt, że w ogóle pewne rzeczy będą mogli przetestować. To logika rozumowanie jest następująca spokój jest lepszy niż frustracja, a testy są lepsze niż debuggowanie.

OGRANICZENIA:

Wspomniałem wcześniej o dodatkowej złożoności. Gdzie ona się więc ukrywa?

Pomyśl, że znajomy chce poczęstować Cię ciastem swojej żony, ale zanim to zrobi wyciąga koło, kręci nim i rzuca ciasto w szprychy twierdząc, że tak małe porcje to łatwiej idzie przełknąć.

Myślę, że mniej więcej tak to widzą to inni programiści, którzy nie są przekonani do loose coupling. Oni jak czytają kod nie potrafią interpretewać tego zapisu, bo nie widać już scenariusza procedury jaką wcześniej realizował program. Tak posiekany kod ma dla nich wątpliwą wartość, ponieważ na czytanie i modyfikację muszą poświęcić więcej czasu, by skleić w głowie obraz jaki wynika ze skoków po 5 czy 10 plikach.

Ponadto w projektach IT jedyne co jest pewne to zmiana. Jeśli biznes robi stosunkowo świeży produkt i jesli postawnowi ostrzej skręcić to jak to później rzutuje na interfejsy? No cóż.. wtedy to jest kruche, rozszerzania zmienia się w modyfikację i pracy jest wiecej niż mniej.

Argument dotyczący testów jest wątpliwy, ponieważ testy bez loose coupling też da się pisać. Po prostu mamy wolne/ciężkie testy, ale z tego co widze to mało programistów woli małe testy na mockach. Ludzie wolą pisać integracyjne testy, by sprawdzić czy to działa na bazie z prawdziwego zdarzenia.

Natomiast jak ktoś lepi cruda w oparciu o gotowe ramy to przeważnie nie musi się tym zbytnio przejmować, bo ramy na ogół dostarczają różne implementacje do typowych zadań od IO, a te da się w zasadzie przepinać poprzez zmianę konfiguracji.

Na minus z mojej strony to jakieś skrajne rozwiązania do jakich prowadzi loose coupling to typu kontener zależności. Taki twór to dodatkowa wiązka magii, psucie stacktrace i możliwość napotkania nietypowych błedów.

Loose coupling zwraca się częściej, gdy projekt zależy od innych serwisów (zwłaszcza tych zewnetrznych), ale wtedy nie musisz nikogo przekonywać, ponieważ człowiek sam dojdzie do wniosku, że przydałaby się jakaś udawana implementacja i sposób na jej podmianę.

LUŹNE PRZEMYŚLENIA:

Tak pół żartem, pół serio to gdybym używał loose coupling w każdym projekcie to wiem, że można tak łatwo utrudnić pracę innym programistom. Dużo osób nie radzi sobie z tym, bo nie widzą pełnego projektu, zadania będą robić wolniej, a przetrwają tylko Ci, którym takie podejście po prostu pasuje (mniejszość). Natomiast mi to daje renomowaną podstawę, by zachęcić ("zmusić") kogoś do pisania kodu bardzo małymi porcjami, bo wtedy lżejszy jest code review i większa szansa, że ktoś odważy się napisać test obejmujący przypadki brzegowe.

edytowany 2x, ostatnio: fgh
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:3 dni
  • Lokalizacja:Wrocław
4
piotrpo napisał(a):

Tu trzeba nabyć trochę wprawy, nauczyć się pisać testowalny kod, poczekać trochę na korzyści i je dostrzec. Niby oczywiste, że przyzwoite testy są wygodniejsze niż debugger i prinf("dupa"), ale praktyka pokazuje, że nie dla każdego.

No właśnie. Myślę, że jeśli komuś debuger i dupowanie na ekranie nie utrudnia życia, i sam nie wpadł na to, aby spróbować inaczej, a do tego ma wiele lat doświadczenia, to nic z takiego kogoś już nie będzie.
Wbrew wizji forsowanej przez scrum-coachy tego forum, nie każdego da się przekonać.


Po dopracowaniu rozwiązania każdy będzie mógł założyć własny drzewiasty wątek.
GH
  • Rejestracja:prawie 4 lata
  • Ostatnio:około 3 lata
  • Postów:811
4

Skoro wszystko działa, to nie masz żadnych argumentów. Po zmianie podejścia też będzie wszystko działać, ale przedtem wielu ludzi będzie musiało się wysilić. A po drodze jeszcze może coś przestać działać.

Więc zadajmy sobie pytanie, czy naprawdę chcesz rozwiązać jakieś konkretne problemy, czy to tylko tak dla zasady.

edytowany 1x, ostatnio: Ghost_
Miang
problem nie bycia traktowanym jako samiec alfa ;)
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 9 godzin
  • Postów:3277
4

@fgh: Dla mnie pojęcie loose coupling jest wpisane w programowanie obiektowe i bezpośrednio wynika z single responsibility principle, IoC (jako idei, nie kontenerów do wstrzykiwania zależności), open-close principle.
Jeżeli ktoś woli pracować z klasami, które nie wiadomo co robią, składającymi się z metod również robiących wszystko, sterowane zmiennymi dostępnymi z dowolnego miejsca, bez wydzielonego publicznego API klasy, bo kod w "kawałkach" jest dla niego nieczytelny to ścieżki myślenie takiej osoby są dla mnie zagadką. Jak ten kod został napisany, że trzeba do niego zaglądać? Zaglądałeś kiedyś do kodu jakiejś dobrze napisanej biblioteki, czy jednak wystarczy, że wiesz co ta biblioteka robi i jak ją wywołać i co dostajesz na wyjściu? Problem w tym, że żeby zastosować takie podejście, trzeba przez chwilę pomyśleć - zastanowić się co ma robić jakiś moduł, zdefiniować jego zewnętrzny interface, podzielić odpowiedzialności na klasy, dopisać testy i zająć się właściwą implementacją. I rzadko kiedy takie podejście wymaga więcej pracy. Zwyczajnie wymaga pomyślenia przez chwilę na początku i wpojenia sobie odpowiednich nawyków. Każdą funkcjonalność da się zakodować w postaci jednej metody, tylko jak ktoś tak woli, to ja wolę z nim nie pracować.

Zobacz pozostałe 3 komentarze
KamilAdam
Głównym nurtem jest nie pisanie testów jednostkowych a mówienie że się pisze :D
piotrpo
Ja się nie znam na modzie i trendach. Są natomiast rzeczy, które ułatwiają mi programowanie. Wiem, że sa ludzie lubujący się w pisaniu np. metod na 5000 linii, ale nie chcę takich mieć w moim projekcie.
FG
@somekind: masz jakieś wątpliwości?
somekind
@fgh: tak, mam wątpliwości co jest głównym nurtem. A nawet nie wątpliwości, co po prostu tego nie wiem.
FG
Praktycznie wszystko co mało odważne/ryzykowane. Tematy nad którymi długo już nie myśli i których wybór nie oznacza wprost jakiś drastycznych konsekwencji w pracy. Przykładowo w korpoświecie to java, spring, oop, baza oracle, a poza korpo to javascript / php + postgresql. Gdybym miał rzucić motto obrazujące główny nurt to najlepiej hasłem: miliony much nie mogą się mylić.
stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:4 minuty
2

Swoja droga to na to moze juz byc po prostu za pozno. Teraz to pewnie wiekszosc projektu by trzeba bylo zaorac.


λλλ
YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:36 minut
  • Postów:2364
1
piotrpo napisał(a):
yarel napisał(a):

Odbiorcą takiej argumentacji nie muszą być koledzy z zespołu odpowiedzialni za tworzenie kodu, tylko ten kto nimi zarządza/wykłada kasę i ma możliwość zdefiniowania wymagań jakościowych na kod i ich wyegzekwowanie. W ten sposób nie musisz przekonywać wszystkich, a tylko osobę decyzyjną.

Jak do tej pory nie piszą UT, to "osoba decyzyjna" nie dostrzega korzyści, więc jak jeden nowy oszołom jej powie, że trzeba pisać testy, a 5 innych powie, że nie trzeba to zgadnij jaka będzie decyzja? Ktoś to spaghetti napisał, zakładam, że nie OP, więc dodatkowo tamci siedzą dłużej w projekcie "i wszystko działa".

Jak powie, że "piszmy testy", to słaba argumentacja (różnie dobrze może powiedzieć "przepiszmy wszystko od zera") :-). Bo jaki problem to rozwiązuje (gdzie zysk?) i czyj to problem?
Jeśli nie jest to problem programistów, to są słabą grupą docelową do ewangelizacji. Kierownik też może mieć to głęboko w poważaniu, ale klient już niekoniecznie. Więc chcąc zmienić kierunek, trzeba iść do właściwego "udziałowca"/"orędownika zmiany" z odpowiednią siłą przebicia. Nie ma tu znaczenia, czy to będzie UT, coupling, technologia etc.

Przykład z życia: w zespole developerskim chcieliśmy, żeby zespół ziomków od konfiguracji dodał "2 kolumny do excela". Nie dało się, bo ten drugi zespół nie widział korzyści dla siebie, a jedynie dodatkową pracę (bo musieliby te kolumny wypełniać). Wyjaśniliśmy zespołowi testowemu, że gdyby mieli dodatkowe "2 kolumny w excelu", to byłoby im łatwiej wnioskować o poprawne dane testowe od klienta -> poprawne dane wejściowe -> mniej fałszywych błędów zgłaszanych do dev/konfiguracji (a to już to była korzyść dla zespołu konfiguracyjnego, który dostawał mniej błędów i był mniej zaangażowany w diagnostykę problemów).

  • Dla dev -> mamy 2 kolumny, które znacznie ułatwiają pracę
  • Dla test -> wiedzą o co konkretnie pytać klienta
  • Dla konfiguracji -> mniej błędów spływa z testów
  • Dla wszystkich -> mniej dyskusji

Podziwiam twoją pozytywistyczną wiarę w człowieka i zdolność do zmiany. Programiści są leniwi, niestety najczęściej w głupi sposób i zamiast coś zrobić, żeby później mieć mniej pracy, to wolą tego nie robić, bo później jakoś to będzie. Dlatego nie pomyślą 10 minut nad zaplanowaniem pracy i później tracą kilka godzin bo nie pomyśleli. To samo dotyczy pisania testów, zapoznania się z dokumentacją, czy przeczytania ze zrozumieniem historyjki.

Co do lenistwa masz rację. Dodałbym, że nie dotyczy jedynie programistów i że oprócz lenistwa, inną siłą napędową jest chęć zysku. Dla programistów zakładam copy&paste dobrego kodu wyzwalane prze lenistwo ;-) Skoro nie widzą zysku w UT, to pewnie są zbyt leniwi na edukację.

edytowany 1x, ostatnio: yarel
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 9 godzin
  • Postów:3277
2

Jeżeli ta osoba decyzyjna jest z biznesu, to pisanie dobrego kodu i pokrycie go testami jednostkowymi nie ma dla niej żadnego znaczenia. Tym bardziej nie ma to znaczenia dla klienta. Obie te osoby interesuje funkcjonalność, koszt i czas realizacji.

Unit testy są dla programistów, bo to najczęściej najszybsza droga do udowodnienia działania napisanego kodu, powstrzymuje dużą część głupot przed dostaniem się do mainline, pozwala szybko sprawdzić, czy dokonana zmiana nie powoduje jakiegoś nie przewidzianego działania i stanowi przykład użycia jakiejś części, którą się napisało, więc później im się głowy nie zawraca pytaniami.

Praktycznie każdy kto wchodził w UT podchodził do nich jak do niepotrzebnego ustrojstwa, które jest jakimś tam dziwacznym wymysłem programistycznych ewangelistów, który generuje sporo pracy, a efekty wydają się być dyskusyjne. Dopiero z czasem, zaczyna się widzieć korzyści typu czytelność kodu, mniej problemów, nikt ci nie rozwali roboty, bo "nie pomyślał, że to ma wpływ" itd. Tylko jak masz mentalnych dziadków (mogą mieć i 20 lat), którzy weszli w programowanie ileś lat temu, nauczyli się tej Javy 1.2 i uważają, ze to powinno im starczyć aż do przejścia na emeryturę, to będą się trzymać swoich pozycji jak kot kosza podczas wizyty u weterynarza.

edytowany 1x, ostatnio: piotrpo
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:12 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
0
piotrpo napisał(a):

Jeżeli ta osoba decyzyjna jest z biznesu, to pisanie dobrego kodu i pokrycie go testami jednostkowymi nie ma dla niej żadnego znaczenia. Tym bardziej nie ma to znaczenia dla klienta. Obie te osoby interesuje funkcjonalność, koszt i czas realizacji.

Niby tak, ale nie zawsze :) Miałem raz sytuację że w małej polskiej firmie produktowej zacząto pisać testy jednostkowe bo klient zarządał raportów z pokrycia testami. Oczywiście widziałem to tylko raz i była to sytuacja specyficzna bo klient też był techniczny i nasz produkt opakowywał w swój produkt i sprzedawał dalej. Ale czasem się zdarza :D

UPDATE czy mam w związku z tym jakiś wniosek? Tak, jak chce się coś zmienić to trzeba atakować tym pomysłem wszystkich :D Oczywiście jest to męczące, ale rośnie szansa że pomysł chwyci :)


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 1x, ostatnio: KamilAdam
VA
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 24 godziny
1
piotrpo napisał(a):

Tylko jak masz mentalnych dziadków (mogą mieć i 20 lat), którzy weszli w programowanie ileś lat temu, nauczyli się tej Javy 1.2 i uważają, ze to powinno im starczyć aż do przejścia na emeryturę, to będą się trzymać swoich pozycji jak kot kosza podczas wizyty u weterynarza.

Tak bywa niestety, niektórzy to będą sobie starali zapewnić "dożywocie" na ciepłej posadzie specjalnie komplikując kod, infrastrukturę czy cokolwiek co ma wpływ na rozwój/wdrażanie.

Miang
i przez takie działanie rozwalą całą firmę (albo projekt jeśli to firma państwowa)
stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:4 minuty
2

Tym bardziej nie ma to znaczenia dla klienta. Obie te osoby interesuje funkcjonalność, koszt i czas realizacji.

A potem takie kwiatki:
https://tvn24.pl/biznes/z-kraju/awaria-w-credit-agricole-podwojnie-zaksiegowane-transakcje-karta-dwa-razy-taka-sama-kwota-sciagnieta-z-konta-5398292

A kto traci na tym hajs? No klient a nie programista.


λλλ
VA
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 24 godziny
0

Testy dla klienta mogą nie mieć znaczenia, ale dlaczego klient miałby tu o czymś decydować?
On zleca wykonanie czegoś, firma rzuca stawką i tyle z jego decyzyjności dotyczących sposobu wykonania - zakładając oczywiście że piszemy system sami a nie dołączamy jako dodatkowy zespół do zespołu klienta.
Pracowałem dla firmy gdzie jeden z zespołów przepisywał stary moduł. Z założenia miało być lepiej ale zaczęło się od tego, że projekt bazy zrobiła osoba po zootechnice, która bazę chyba widziała po raz pierwszy w życiu. No ale według "managementu" ona "najlepiej znała domenę" i ciężko było to programistom odkręcić. Nie wiem jak się to skończyło ale było to niewesołe.

piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 9 godzin
  • Postów:3277
1

@stivens: Skoro to jest tak ważne dla klienta, to dlaczego w materiałach marketingowych oprogramowania, które kupuję nie ma na pierwszym miejscu 97% unit test coverage? Bo to nikogo nie interesuje, chociażby z tego powodu, że związek pomiędzy UT a jakością produktu (w sensie robienia tego do czego się to pisze) jest bardzo luźny. Jeżeli już, to wynika z bardziej dojrzałego podejścia do robienia oprogramowania niż z tego, ze testy jednostkowe coś dają. Oczywiście ma to wpływ na tworzenie nowych ficzerów, czas potrzebny do wydania oprogramowania, ale jeżeli masz dobrze zorganizowane testy (nie ważne, czy ręczne, czy automatyczne), to jesteś w stanie dostarczyć działający program klientowi.

Odnosząc się do problemu z księgowaniem, to w systemach bankowych zwykle najbardziej porąbana jest integracja różnych produktów - coś tam do kart, coś tam do bankowości internetowej, na ślinę przylepione do systemu transakcyjnego. Nie sądzę, żeby w takim przypadku testy na poziomie kilku klas mogły cos pomóc.

YourFrog2
  • Rejestracja:prawie 4 lata
  • Ostatnio:około 2 lata
  • Postów:100
1

A ja zadam przewrotne pytanie. Jak testujecie to co produkujecie? Przeczytałem pół tematu i nikt nie pomyślał nawet że apke można testować inaczej niż unit testami...

Zobacz pozostałe 5 komentarzy
stivens
Ja siedze na backendzie i dla mnie UT to dodatkowo testy regresyjne. Jakby to sie mialo klikac w UI na frontendzie to by pewnie wieki zajelo. I nawet by wszystkich edge-casow nie wychwycilo bo sa np. zaleznosci od daty requestu.
stivens
Jak sobie dopisujesz np. nowa funkcjonalnosc to rzeczywiscie mozesz sobie "recznie" przetestowac ale w momencie kiedy robisz refactor albo podmieniasz implementacje no to sorry, to nie przejdzie.
stivens
Poza tym jak Ci sie UI wywali to nie wiesz czy to wina frontu czy backendu tak w pierwszej chwili :)
YourFrog2
@stivens: I to pokazuje że nie rozumiesz. Nie masz klikać ręcznie tylko napisać sobie test ale nie jednostkowy tylko tego api co poprawiłeś / zmodyfikowałeś. A w czym go napiszesz i jaką warstwę stestujesz oraz jak go sobie tam nazwiecie to NIE MA znaczenia. Jeśli w zespole masz kogoś kto wam klepie UI to znaczy że powinniście właśnie UI testować. Jeśli macie samych backendowców to testujecie endpointy. Do obu są narzędzia.
stivens
No API testy tez sa
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:3 dni
  • Lokalizacja:Wrocław
4
YourFrog2 napisał(a):

A ja zadam przewrotne pytanie. Jak testujecie to co produkujecie? Przeczytałem pół tematu i nikt nie pomyślał nawet że apke można testować inaczej niż unit testami...

Przewrotność nie polega na braku związku z tematem. Nikt nie pomyślał o testowaniu apek, bo temat nie dotyczy testowania apek, apek też nie testuje się unit testami.
To jest wręcz straszne, że takie rzeczy trzeba tłumaczyć.


Po dopracowaniu rozwiązania każdy będzie mógł założyć własny drzewiasty wątek.
YourFrog2
Chłopaki nie piszą testów i nie chcą robić interfejsów do zależności, a wy troche jak wyznawcy mówicie "musicie to robić". Do tego piłem. To straszne że takie rzeczy trzeba tłumaczyć :D Unit Testy są fajne, ja je lubie ale nie bądźcie wyznawcami że każdemu one są potrzebne i każdy musi je robić bo aplikacja będzie pełna bugów.
somekind
Zazwyczaj niestosowanie UT kończy się traceniem czasu. Nawet w CRUDach są miejsca, w których UT są pomocne, więc jeśli ktoś ma projekt bez nich, to co to jest? Hello world?
YourFrog2
UT są bez sensu dla crudów (ani tam się nic nie wstrzykuje, ani logiki biznesowej NIE MA), lepiej mieć testy UI które klikają (np dla formularzy wielostronicowych bądź z dużą ilością pól zależnych).
somekind
Dla samych operacji CRUD owszem, ale jeszcze nie widziałem projektu crudowego,w którymnnie bbyłoby chociażby jakichś helperów do przetestowania.
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
2
Juhas napisał(a):

No właśnie. Próbuję już na różne sposoby, ale spotykam się ze ścianą (przecież działa). Jak byście przemówili do współpracowników, żeby przekonać ich do tego, że loose coupling jest zdecydowanie lepszym podejściem*?

*pomijam rzeczy typu wbudowane systemy operacyjne i inne, gdzie tight coupling może być sensowny.

Nawet w ASM lepiej użyć JSR niż JMP., stosuje się wektory skoków, przerwania i relokacje.

Posługiwanie się książkowymi terminami, jeszcze do tego po angielsku, jest fajne jak ktoś Cię słucha, ale jak masz komuś kto tego nie zna udowodnić swoje racje to lepiej posługuj się terminami praktycznymi, sposobami realizacji i widocznymi gołym okiem benefitami.
Poza tym jest to termin subiektywny. W odróżnieniu od np. DRY czy YAGNI "tight coupling" określasz zwykle na review naocznie. Lepiej zgłaszać uwagi obiektywne (np. "tu będziesz miał NPE" a tam "nic nie znajdziesz gdy X"). No chyba że macie takie wyczesane CICD że wam to automatem wylicza, wtedy możesz do problemu podejść ilościowo: "jakość była X, po zmianie jest Y".

Zobacz pozostałe 27 komentarzy
stivens
@vpiotr: ale sam przeciez wyskoczyles z angielskim terminem jak sie rozproszyles :) Pisales wlasne schedulery? - czemu nie uzyles slowa planista? :P Albo proces szeregujacy zadania :D :D
stivens
@LukeJL: moim zdaniem powiazanie lepiej opisuje to zjawisko
Miang
@stivens: +1 albo wiązanie
stivens
W ogole wrocmy troche do poczatku tej dyskusji. jak by użył tego terminu po polsku to łatwiej by było uwierzyć że wie o czym mówi a nie że obejrzał na jutubie jakiś filmik i chce do wszystkie stosować to co usłyszał - czy na prawde uwazacie, ze takie szufladkowanie jest sluszne? Przeciez to jakies dziwne uprzedzenie. I jak juz zwrocilem uwage: ktos moze obejrzec tutorial po polsku. I co wtedy? :) Tez nie wie o czym mowi ale mowi po polsku.
vpiotr
czy na prawde uwazacie, ze takie szufladkowanie jest sluszne? tak
KA
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 2 lata
  • Postów:594
2

Nie warto komukolwiek coś tłumaczyc w tej branży, lepiej prace zmienic

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)