@Afish: Pominąłeś całkowicie sens, tego co próbowałem przekazać w poprzednich postach.
Może podsumujmy miejsca w których się zgadzamy.
- Czy zgadzamy się, że zbyt ciastno połączone ze sobą moduły są trudne do zmiany (np UI i logika)?
- Czy zgadzamy się, że zbyt ciastno połączone testy z logiką, utrudniają zimanę tejrze logiki?
- Czy zgadzamy się, że wprowadzanie zmian w kodzie bez testów jest obarczone dużo większą szansą że wprowadzimy jakiegoś buga?
- Czy zgadzamy się, jedną dużą wielką klasę, lub jedną dużą wielką funkcję, edytuje się i poprawia się trudniej, niż kilka małych?
Afish napisał(a):
TomRiddle napisał(a):
Jeśli natomiatst dostajesz metodę pełną globalnego stanu, statycznych zmiennych, poukrywanych zależności, taką która miesza logikę z widokiem, albo bóg wie co jeszcze, to oczywiście że nie napiszesz go szybko; ale nie dlatego że nie da się napisać testu szybko, bo da się - ale trzeba najpierw odseparować testowaną funkcję od reszty syfu, w miarę możliwości, i to zajmuje najwięcej czasu. Samo napisanie testu jest szybkie i proste (zakładając oczywiście że wie co się robi).
Okej, czyli już wiemy, że refaktoring robimy minutę (bo to zmiana nazwy zmiennej), dobry test piszemy w minutę (jak już mamy odseparowany kod od syfu). To w takim razie jak nazywa się ten proces "zamiany syfnego kodu w kod, który można testować"? Zdajesz sobie sprawę, że uprawiasz logomachię?
No faktycznie nie mamy w środowisku rozróżnienia tych dwóch rzeczy.
Możemy je nazwać refaktor pojedynczy (np rename metody, przeniesienie jej, zmiana typów, klas, wydzielenie czegoś), i jeden taki refaktor pojedynczy (albo jednostkowy) trwa bardzo krótko; a ten drugi typ o którym mówisz,możemy nazwać "refaktor całościowy" albo "refaktor modułu lub pakietu". Fine by me; dobra nomenklatura to podstawa.
Afish napisał(a):
Właśnie o to chodzi: szybko i tanio nie oznacza najszybciej i najtaniej. Kontrolowanie długu technicznego jest ważną częścią inżynierii oprogramowania, trzeba wiedzieć, kiedy olać refaktoring, a nie wywyższać się ponad menadżera. Wszystko poniżej jest oparte na błędnym założeniu.
Sure, trzeba wiedzieć; i dla mnie rachunek jest prosty. Jeśli dany fragment będzie wymagał zmian w bliskiej lub dalszej przyszłości; to najpewnie dobrze byłoby go zrefaktorować i otestować wcześniej czy później. To jak szybko trzeba coś zrefaktorować i otestować to delikatna decyzja, i trzeba mieć dużo doświadczenia żeby zdecydować czy lepiej wcześniej, czy później.
Jeśli ten kawałek nie będzie wymagał zmian, to można go zostawić.
Jeśli nie wiesz czy będzie się zmieniał, to to jest taka szara strefa i trzeba by się zastanowić na spokojniej, czy ten fragment ma większą szansę że się zmieni w przyszłości, czy raczej nie; i podjąć decyzję nt refaktoru na podstawie tego co ustalimy (czy będzie się zmieniał czy nie), ewentualnie możemy to postpone'ować, aż będzie to bardziej pewne.
Afish napisał(a):
TomRiddle napisał(a):
No; ale co ja Ci poradzę. Ja tak robię w swoich projektach zarówno w pracy jak i prywatnie, i to jakoś działa. Także dla mnie to nie jest utopia tylko pewien konkretny (co prawda wysoki, ale konkretny) standard.
No i masz liczby potwierdzające, że refaktoring bardziej się opłaca? Jak ostatnio rozmawialiśmy, to nie miałeś żadnych danych biznesowych, tylko swoje przekonanie. Ja w swoich projektach mam konkretne liczby pokazujące, że pisanie najlepszego kodu nie jest optymalne.
Problem sprowadza się do tego, że żeby rozumieć takie rzeczy jak to czy refaktor się opłaci czy nie, musiałbyś być programistą. Jeśli jesteś niekompetentny w tej dziedzinie, to nigdy nie zrozumiesz o czym jest mowa, nie mówiąc już o podjęciu jakiejś informowanej decyzji. Więc nie przekonasz nigdy managera lub kogokolwiek nietechnicznego o tym, że warto to robić. Najwyżej możesz dać swoją opinię jako ekspert w temacie, i spodziewać się że ktoś ją weźmie pod uwagę.
Noi jeszcze jest drugi powód czemu ten argument jest bez sensu.
Na pewno widziałeś kucharzy, którzy przed każdym użyciem swojego noża machają nim parę razy na ostrzałce, żeby go przyostrzyć.Albo nawet zwykli ludzie, którzy myją kubek zaraz po użyciu, lub chowają go od razu do zmywarki, zamiast zostawić.
I teraz Twój argument wyżej, dla mnie brzmi tak jakbyś podeszedł do osoby która wkłada kubek do zmywarki i zapytał ją "Przepraszam, czy masz jakieś liczby które potwierdzają że włożenie kubka do zmywarki częściej zajmuje mniej czasu niż odkładanie ich do zlewu?". Doesn't make much sense to me.
Afish napisał(a):
Dam Ci ośmiotysięcznik w JS i nie zrobisz mi refaktoringu ani dobrego testu w minutę. Ponieważ masz jakieś niespójne definicje, to zaznaczę, że chodzi mi o zrobienie praktycznej zmiany, jak w kodzie produkcyjnym, a nie zmianę nazwy zmiennej czy napisania testu do nowej funkcji napisanej na boku.
Całościowego refaktoru na pewno. Ale mógłbym wprowadzić kilka pojedynczych refaktorów w minutę. Odpowiednia ilość takich pojedynczych krótkich refaktorów prędzej czy później doprowadzi do całościowego refaktoru.
Teraz, tak jak rozumiem, to co Ty próbujesz powiedzieć, to to że nie opłaca się robić refaktorów. Rozumiem to tak, że mówisz że dziennie warto robić 0 pojedynczych refaktorów, które na dłuższą metę będą skótkować w 0 całościowych refaktorów.
Ja sugeruję, żeby liczbę pojedynczych refaktorów w jednostce czasu, np dzień, trzymać powyżej zera. Pojedynczy refaktor zajmie krótko, minutę lub mniej, np jeden rename, jeden extract, jedna zamiana miejsc, jedno odwrócenie if
a. Możesz ich zrobić tyle na ile masz czasu, albo tyle na ile uważasz, może to być chociaż jeden, może być 10 może więcej. Ale na pewno się nie zgadzam że okej jest wejść do projektu i zrobić 0 pojedynczych refaktorów.
@Afish: Noi kolejna rzecz; która mi teraz przyszła do głowy. Być może niektórym się wydaje że refaktor, to jest zawsze zmiana z punktu A, to idealnego najlepszego kodu na świecie. Użycia wszystkich dobrych praktyk jakie istnieją, na cudo. To nie jest do końca prawda; bo to nie zawsze ma sens.
To co zawsze ma sens, to jest zrobić to, z czego aktualnie projekt mógłby skorzystać. Jeśli te dwie funkcje są cieżkie do zmiany, popraw je. Ale jeśli widzisz że np dodanie abstrakcji w tym miejscu byłoby "by the book", ale w tym miejscu nie ma sensu - nie rób tego. Mam wrażenie że niektórzy tego nie rozumieją.
Dobre refaktorowanie to nie jest zmiana projektu z tego co jest teraz na Dzieło Sztuki, tylko po prostu iteratywny proces dodawania korzystnych cech do aplikacji. Takich, które sprawią że praca z nimi będzie lepsza. Jesli uważasz że jakaś zmiana nie przyniesie korzyści, nie dodawaj jej, proste.
Jeśli widzisz klase, która powiedzmy łamie SRP na dziesiątą stronę; ale widzisz też że poprawa tego, tak że nie łamałaby jej nie doda nic dobrego do projektu; czyli nawet jakbyś to rozdzielił to i tak wprowadzanie zmian w nim nie było by tańsze, to nie ruszaj jej, nie rób refaktora tam - po co.
@Afish: Noi też trzeba wziąć kolejną rzecz, pod uwagę, która się jeszcze nie pojawiła, a mianowicie: Nie wszyscy jesteśmy równi. Nie każdy umie robić refaktor dobry; i nie każdy umie pisać dobre testy.
- Jak jesteś dobry w refaktor i testy, to dodawanie ich dla Ciebie jest szybkie i proste; a więc tanie dla firmy.
- Jeśli nie jesteś dobry w refaktor i testy, to dodajesz je powoli, i są niższej jakości, więc koszt dla firmy jest większy, a wartość niższa; dlatego że jakoś tych testów jest niższa.
Jeśli w tym temacie wypowiadają się osoby które są bardzo słabe w refaktor, to faktycznie, ciężko będzie ich przekonać że ciągłe poprawianie kodu is the way to go; ale nie rozmawiamy tak na prawdę o temacie samym w sobie; tylko o tym żeby najpierw wyedukować takiego delikwenta.
Nie znam osoby która, nauczywszy się pisać dobre testy, przestałaby je pisać; osoby które ich nie piszą to tylko takie które nie umieją tego robić, i nie doceniają ich wartości.
Podsumowując: Dla managerów, PO i firmy; refaktoring, dobra jakość kodu oraz testy są bardzo wartościowe; pod warunkiem że mają do dyspozycji programistów którzy są w stanie tanio je dodać. Jeśli takich nie mają, to refaktoring sam w sobie się nie opłaca. Tak bym podsumował moje stanowisko.
PS: Ba, powiem więcej. jeśli masz takich programistów; to jest bardzo duża szansa że oni sami z siebie ciągle robią refaktor i ciągle piszą testy. Continuous improvement, continuous refactor; i kod produktu sam z siebie, automatycznie jest wysokiej jakości i otestowany. I wcale wytwarzanie go nie zajmuje dłużej, wręcz przeciwnie.