Jak zachęcić kolegę, by pisał czyste funkcje?

Jak zachęcić kolegę, by pisał czyste funkcje?
dedicated
  • Rejestracja:około 6 lat
  • Ostatnio:3 minuty
  • Postów:160
0

Hej.

Piszę w pythonie. Mam w projekcie mniej doświadczonego kolegę, który pisze nieczyste funkcje.
Chcę go przekonać, by to zmienił. Mam jednak problem, bo całą moją argumentację można by zawrzeć w kilku zdaniach:

"Ziom! Kod jest wtedy elegancki. Zanim zacząłem tak pisać, miałem mnóstwo problemów.
Niestety, nie pamietam już, co to były za problemy. Teraz po prostu ich nie ma, bro!"

Na 90% taka argumentacja go nie przekona.

Ważne! Nie szukam argumentacji logicznej. Z moich obserwacji wynika, że logika rzadko kiedy kogoś do czegoś przekonuje.
Szukam za to inspiracji. Np. jakiegoś nagrania na YT, gdzie ktoś podaje zajebiste przykłady i mówi o czystych funkcjach z pasją w oczach.

Ma ktoś może jakiś pomysł?

[EDIT] Albo inaczej. Co Was przekonało do pisania czystych funkcji?

edytowany 2x, ostatnio: dedicated
S4
nieczyste funkcje. :)
Miang
trzeba wezwać księdza i poswięcić
S4
Ja myślę, że na egzorcyzmy już za późno. Tu tylko poradzą oni https://www.youtube.com/watch?v=m9We2XsVZfc
SL
  • Rejestracja:około 7 lat
  • Ostatnio:8 minut
  • Postów:866
5
  • Łatwiejsze czytanie kodu: tylko input i output się liczy
  • Mniejsza szansa na zepsucie czegoś
  • Testy są banalne tj. assert foo(x) == y
  • można łatwo cachować jak jest taka potrzeba
  • kod jest łatwy do przeniesienia gdzieś indziej: trzeba tylko przenieść tą funkcję i funkcje wołane przez nią
  • nie trzeba myśleć o concurrency
randomize111
  • Rejestracja:prawie 4 lata
  • Ostatnio:prawie 2 lata
  • Postów:137
2

Powiedz że kod będzie non-Pythonic ;)

Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
8

Dlaczego chcesz go przekonać?


AS
Bąrdzo mądre pytanie.
S9
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
1

Ale python generalnie z tego co wiem średnio pasuja czyste funkcje do Pythona. Python nie wspiera efektywnie niemutowalnych kolekcji, jest sterowanie logiki przez wyjątki itp.


S4
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:1268
0

A możesz napisać, o jakiego rodzaju nieczystości chodzi?

Miang
i zdjęcia niech pokaże ;)
S4
oooo, tego bym się po pani nie psodziewał.
Mjuzik
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Postów:710
1

W zależności jakie to nieczystości, ale ciągłe komentarze na code review. Ustalacie standard i się go trzymajcie :)

KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:8 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
3
dedicated napisał(a):

[EDIT] Albo inaczej. Co Was przekonało do pisania czystych funkcji?

To że od globalnego/zmiennego stanu mieszało mi się w głowie

S4t napisał(a):

A możesz napisać, o jakiego rodzaju nieczystości chodzi?

Ja obstawiam że chodzi o pisanie Pure function:

In computer programming, a pure function is a function that has the following properties:[1][2]

  • the function return values are identical for identical arguments (no variation with local static variables, non-local variables, mutable reference arguments or input streams), and
  • the function application has no side effects (no mutation of local static variables, non-local variables, mutable reference arguments or input/output streams).

Thus a pure function is a computational analogue of a mathematical function. Some authors, particularly from the imperative language community, use the term "pure" for all functions that just have the above property 2[3][4] (discussed below).


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
ledi12
  • Rejestracja:ponad 5 lat
  • Ostatnio:20 dni
  • Lokalizacja:Wrocław
1

Stwierdzenie, że ktoś piszę "nie czysto" jest IMO bardzo generalnym stwierdzeniem.


Robię http response status cody w martwych ciągach
szatkus1
Termin "czysta funkcja" ma dość konkretne znaczenie.
KamilAdam
Termin "czysta funkcja" ma dość konkretne znaczenie tak, nawet definicje z wikipedii wkleiłem powyżej
IK
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 2 lata
1
dedicated napisał(a):

[EDIT] Albo inaczej. Co Was przekonało do pisania czystych funkcji?

W krótkiej perspektywie - testowanie, w dłuższej - utrzymywanie projektu.

dedicated
  • Rejestracja:około 6 lat
  • Ostatnio:3 minuty
  • Postów:160
2
Silv napisał(a):

Dlaczego chcesz go przekonać?

Rzeczywiście dobre pytanie. Zdałem sobie dzięki niemu sprawę, że piszę czysto, ponieważ ... jest mniej niespodzianek.

Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
0

@dedicated: Zadałem takie pytanie, ale to niekoniecznie oznacza, że chcę lub nie chcę, byś go przekonywał. Problem postawiłbym raczej taki, że Twoje własne doświadczenia z kodem niekoniecznie muszą odpowiadać doświadczeniom kolegi. Być może on potrzebuje jeszcze nauczyć się (na błędach), jakie zalety mają czyste funkcje? A być może akurat jemu łatwiej pisać kod, w którym nie są czyste funkcje?

Ja uważam, że tak, czyste funkcje są lepsze od tych niebędących czystymi. Ale to jest moje zdanie na podstawie moich przemyśleń. Nie znam Pythona i nie wiem, jak łatwo w nim pisać czyste funkcje. Poza tym pamiętam, że dawniej… w ogóle mnie nie obchodziło, czy coś jest czystą funkcją, czy nie, bo miałem problemy z innymi aspektami programowania. Ważniejsze było, by kod w ogóle działał, i był skończony w skończonym czasie…


Manna5
  • Rejestracja:prawie 6 lat
  • Ostatnio:dzień
  • Lokalizacja:Kraków
  • Postów:639
1

Pisanie czystych funkcji nie jest wcale koniecznością. Owszem, zdarza się że rozwiązania na nich bazujące wyglądają elegancko, ale to kwestia gustu.


KamilAdam
Powiadacie mi przyjaciele, że o gusty i o smaki spierać się niepodobne? Ależ, wszelkie życie jest waśnią o gusty i o smaki
obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:dzień
5

Powiedz mu że biblia nakazuje utrzymanie czystości aż do ślubu.

dedicated napisał(a):

"Ziom! Kod jest wtedy elegancki. Zanim zacząłem tak pisać, miałem mnóstwo problemów.
Niestety, nie pamietam już, co to były za problemy. Teraz po prostu ich nie ma, bro!"

No to wytknij mu przy najbliższym znalezionym bugu w jego kodzie, pokaż mu że czyste funkcje by przed tym ochroniły, o ile to prawda. Jeśli nie znajdzie się żaden problem to nie ma problemu.

To brzmi trochę śmiesznie - bardzo wielu programistów powiela wzorce i schematy które widzieli w poprzednich projektach lub gdzieś o nich przeczytali a nie do końca rozumieją co one dają. Czasem je przenoszą z języka do języka i stosują mimo że w danym języku nie mają sensu, dorabiają sobie pracy z której nie ma żadnej korzyści. Nie wciskaj innym rozwiązań których samemu do końca nie wiesz po co stosujesz

Czyste funkcje są fajne ale stosowanie ich wszędzie uważam za fanatyzm, czasem coś po prostu jest maszyną stanową i dużo łatwiej, szybciej i czytelniej to zrobić "nieczysto"


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
edytowany 1x, ostatnio: obscurity
Miang
ale ta maszyna stanów to mi podpadła, kolega stale tego buzzwordu używa ;)
JU
  • Rejestracja:około 22 lata
  • Ostatnio:około miesiąc
  • Postów:5042
1

Opie***ol go przy wszystkich. Albo zacznij podrzucać mu arty o czystym kodzie.

koszalek-opalek
  • Rejestracja:około 9 lat
  • Ostatnio:około 2 lata
1

A ten kolega to w ogóle programista jest? :) Bo jak on pisze większość (czasem nieczystą trzeba napisać, no ale to tak z 1%) funkcji nieczystych, to jak on to potem utrzymuje?

Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:2 minuty
  • Lokalizacja:Laska, z Polski
  • Postów:10056
5
dedicated napisał(a):

[EDIT] Albo inaczej. Co Was przekonało do pisania czystych funkcji?

Długa praca z czystmi i nie czystymi, przez lata, i powolne dostrzeganie że z jednymi się pracuje fajnie, z innymi gorzej. Sam zgadnij z którymi :>

Owszem, możesz używać argumentów żeby opowiedzieć się za jednym bądź drugim, ale one rzadko są ostateczne, zawsze znajdą się powody żeby zrobić nie pure funkcje, taka ocena wynika tylko z lat doświadczenia programistycznego.

edytowany 1x, ostatnio: Riddle
AF
  • Rejestracja:prawie 18 lat
  • Ostatnio:14 dni
6
dedicated napisał(a):

[EDIT] Albo inaczej. Co Was przekonało do pisania czystych funkcji?

Wszystko sprowadza się do tego, czy potrafisz udowodnić, jak wygląda wejście dla funkcji, bo to pozwala na dowodzenie bądź obalanie hipotez i prostsze wnioskowanie o działaniu kodu. Czyste funkcje mają małe pole rażenia, bo zależą tylko od parametrów na wejściu, bo czysta funkcja ma wejście I (input) oraz wyjście O (output). Funkcja nieczysta ma wejście (I, S), gdzie S to stan aplikacji, potencjalnie globalny, i wyjście O. Obie funkcje dają zawsze takie samo wyjście dla tego samego wejścia, ale różnica jest w tym, że dla czystej funkcji wejściem jest jedynie I, a dla funkcji nieczystej jest to (I, S).

Teraz pytanie, co ten S właściwie zmienia? Można go przecież traktować, jako niejawnie przekazywany parametr "stan aplikacji" czy coś w tym rodzaju i z tego punktu widzenia wszystkie funkcje są czyste, bo prostu te "czyste czyste" przyjmują (I, zbiór pusty), a te "nieczyste czyste" przyjmują (I, S). Ale to zmienia bardzo dużo, bo o ile dla ustalenia I (czyli udowodnienia jakichś hipotez lub założeń) potrzebujemy zazwyczaj przeanalizować jedynie miejsce wywołania funkcji, o tyle ustalenie S jest potencjalnie o wiele trudniejsze. A to z tego względu, że o I możemy wnioskować liniowo, czyli najpierw w miejscu wywołania funkcji, potem w miejscu wywołania poprzedniej funkcji i tak dalej, przez cały stos wykonania, ale nie możemy tego samego zrobić z S, bo ten może być zmieniony zarówno przez obecną funkcję, jak i przez całą poprzednią historię wykonania. Mówiąc prościej: żeby udowodnić, że I jest takie i takie, wystarczy zazwyczaj pokazać, jak to I zostało ustawione (czyli wystarczy "przykład na dowód tezy"). Ale żeby udowodnić, że S jest takie i takie, to zazwyczaj muszę nie tylko pokazać, jak S zostało ustawione, ale też wykazać, że żadne miejsce w kodzie mi tego S nie zmieniło - czyli muszę pokazać, że nie istnieje żaden kontrargument. To może być o wiele trudniejsze, bo muszę przeanalizować o wiele więcej kodu (bo wiele funkcji ma dostęp do tego samego stanu), bo mogę nie wiedzieć, jak S jest zmieniane (czy "po ludzku", czy refleksją, czy hakami na pamięci), bo mogę nawet nie mieć dostępu do całego kodu, żeby to udowodnić (bo na przykład stan jest modyfikowany przez dynamicznie ładowaną wtyczkę, której nie posiadam).

Jeżeli potrafię trzymać w ryzach rozmiary I oraz S, to cała reszta jest już kwestią gustu i nie ma mierzalnej przewagi funkcji czystej nad nieczystą. Odpowiadając na Twoje pytanie — nie jestem przekonany do pisania tylko czystych funkcji, ale jestem przekonany, że wolę tak limitować I oraz S, żeby móc łatwo o funkcji wnioskować. Tu oczywiście do gry wchodzą umiejętności kognitywistyczne, doświadczenie i biegłość w programowaniu — dla jednej funkcji (i jednego programisty) trzy parametry wejściowe będą zbrodnią, dla innej funkcji (lub innego programisty) pięć zmiennych globalnych nie będzie żadnym problemem.

Dygresja: tak właściwie, to wszystkie funkcje przyjmują jeszcze parametr E, czyli środowisko wykonywania, rodzaj sprzętu, wypełnienie pamięci, a nawet promieniowanie kosmiczne czy elektromagnetyczne otoczenia (które chociażby zmieniło wynik wyborów w Szwajcarii). Różnica między S a E jest taka, że S kontrolujemy wewnątrz aplikacji, a E zazwyczaj nie kontrolujemy wcale, bo o ile jeszcze możemy pośrednio wpłynąć na ilość pamięci w komputerze, o tyle zakłóceń w zasilaczu już wcale nie zmienimy, za to one mogą zmienić naszą aplikację.

TS
A co powiesz o funkcjach przyjmujących świat i zwracających świat. Są czyste czy nie? Bo ja myślę, że pominąłeś problem mutowalności S. Funkcja f(I, S) -> I też może być czysta o ile wejście i wyjście jest niemutowalne.
AF
Mutowalność nie ma tu żadnego znaczenia.
TS
Maszyny stanów skończonych przekazują sobie stan jako argument. One nie mogą być funkcyjne?
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)