Wdałem się ostatnio w dyskusję z _13th_Dragon odnośnie celowego pisania „głupiego” kodu i ciekawi mnie Wasza opinia na ten temat.
Co było zarzewiem dyskusji — czy kod scanf("%d%d",&a,&b)
nie stałby się lepszy, gdyby zapisać go jako scanf("%d %d", &a, &b)
. W mojej opinii — tak, gdyż ta nadmiarowa spacja pomiędzy %d
powoduje, że od razu widać, że funkcja oczekuje dwóch rozdzielonych intów i nie trzeba wiedzieć, jak działa parser, żeby widać było, że jest to poprawny zapis i że nie skończy się tak, że będzie próbował jakoś na siłę podzielić wczytywany ciąg znaków na dwie liczby ani nie zrobi czegoś równie dziwnego. W opinii _13th_Dragona jest to głupie, bo jest to w dokumentacji, a „[c]zytanie dokumentacji - robisz raz, zaś dodawanie zbędnej spacji przez całe życie”.
Ja uważam, że kod się powinno właśnie, w miarę możliwości, pisać możliwie „głupi”. Oczywiście jeśli ma to mieć skutki praktyczne — mniejszą wydajność, mniejszą elastyczność, dłuższą kompilację, cokolwiek — to wtedy te czynniki mogą przeważyć, ale przy braku innych przesłanek (lub ich miałkości, typu „oszczędzę dziesiątą część sekundy na pacnięcie klawisza”) im mniej wystarczy wiedzieć, żeby kod przeczytać i zrozumieć, tym lepiej. Bo czytać go będą różni ludzie, w tym i zmęczeni ludzie, mniej doświadczeni ludzie, czy ludzie pod presją czasu. I, ogólnie, zdarzało mi się żałować, że byłem „sprytny” i coś napisałem w mniej oczywisty sposób (który, rzecz jasna, dokumentacja wyjaśniała; ale udało mi się o tym zapomnieć); natomiast nigdy nie żałowałem, że zrobiłem coś zbyt prosto.
_13th_Dragon uważa inaczej. Dla niego taki kod jest nieprofesjonalny, bo powinniśmy się uczyć i pamiętać, wiedzieć coraz więcej; a nie zostawać w tyle.
Czy chciałbym pracować z kimś, kto nie wie, co robi poniższy kod?
r=y^((x^y)&-(x<y));
Nie, nie chciałbym. Ale pewnie będę. A co więcej, to mogę być kiedyś ja sam, jak mi się będzie spieszyć, jak będę po zarwanej nocce, albo klepał nadgodziny. I wolę mieć kod, który jest „głupi”, niż ryzykować, że ktoś to przeoczy, albo że będzie tracił czas, żeby się zastanowić, czy to minimum, czy maksimum.
I tak samo uważam o kodzie, który potrzebuje dokumentacji. Jak mogę, to piszę jawnie nazwy argumentów do funkcji, by nikt nie tracił czasu, żeby wiedzieć, czy w findPathThroughPoint
kolejność to source, midpoint, destination
, czy może source, destination, midpoint
, czy jakakolwiek inna; tylko wywołam to sobie jako findPathThroughPoint(source=(0, 0), midpoint=fire_target1, destination=fire_target2)
.
Waszym zdaniem — przesadzam, czy raczej ma to sens?