Czytałem artykuł w Wikipedii na temat Douglasa McIlroya i znalazłem cytat, który wspomina
„Prawdziwym bohaterem programowania jest ten, który pisze negatywny kod”.
Co to znaczy?
Czytałem artykuł w Wikipedii na temat Douglasa McIlroya i znalazłem cytat, który wspomina
„Prawdziwym bohaterem programowania jest ten, który pisze negatywny kod”.
Co to znaczy?
Odpowiedzi:
Oznacza to redukcję linii kodu poprzez usunięcie redundancji lub użycie bardziej zwięzłych konstrukcji.
Zobacz na przykład tę słynną anegdotę oryginalnego zespołu programistów Apple Lisa:
Gdy zespół Lisa naciskał na sfinalizowanie swojego oprogramowania w 1982 r., Kierownicy projektów zaczęli wymagać od programistów składania cotygodniowych formularzy raportujących liczbę napisanych linii kodu. Bill Atkinson pomyślał, że to głupie. W tygodniu, w którym przepisał procedury obliczania regionu QuickDraw, aby był sześciokrotnie szybszy i 2000 wierszy krótszy, umieścił na formularzu „-2000”. Po kilku tygodniach menadżerowie przestali prosić go o wypełnienie formularza i chętnie się zgodził.
Cytat Billa Gatesa wzdłuż linii mierzenia produktywności programisty liniami kodu jest jak mierzenie postępów budowy samolotów według wagi.
Chciałbym dodać, że wskaźnik LOC zachęca do używania zbyt długich języków i świadomie wymyśla koło, aby osiągnąć limit.
Kiedy byłem w liceum - i tak, mieliśmy komputery w latach 70., choć musieliśmy je ze skór zwierzęcych przy użyciu kamiennych noży - jeden z nauczycieli matematyki przeprowadził konkurs programistyczny. Reguły były takie, że wygrywającym programem byłby ten, który wygenerował poprawne wyjście, i który miał najmniejszy iloczyn linii czasu wykonania kodu. Oznacza to, że jeśli twój program wziął, powiedz 100 linii kodu i działał przez 5 sekund, twój wynik wynosił 500. Jeśli ktoś inny napisał 90 linii kodu i biegł przez 6 sekund, jego wynik to 540. Niski wynik wygrywa, jak golf.
Uderzył mnie jako świetny system punktacji, nagradzający zarówno zwięzłość, jak i wydajność.
Ale zgłoszenie, które technicznie spełniało kryteria wygranej, zostało zdyskwalifikowane. Problem polegał na wydrukowaniu listy wszystkich liczb pierwszych mniejszych niż 100. Wpis zdyskwalifikowany wyglądał mniej więcej tak (większość uczniów używała wtedy języka BASIC):
100 print "2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61,"
110 print "67, 71, 73, 79, 83, 87, 89, 91, 97"
Student, który napisał ten wpis, zauważył, że nie tylko był on krótki i bardzo wydajny, ale algorytm powinien być oczywisty dla każdego, kto ma choćby minimalną wiedzę na temat programowania, dzięki czemu program jest bardzo łatwy w utrzymaniu.
Ma język w policzek. Jeśli kosztuje Cię N $ za średnią kodowaną linię, wówczas kodowanie „linii ujemnych” z pewnością wygrywa.
Oznacza to, jako praktyczna rada, że mały kod, który wykonuje zadanie, jest znacznie lepszy niż duży kod, który robi to samo, a wszystkie inne rzeczy są równe.
Pisanie tego samego programu w mniejszej ilości kodu jest celem każdego.
Jeśli program wziął 200 LOC do kodowania, a ja piszę w 150, napisałem -50 LOC. Więc napisałem negatywny kod.
Odpowiedź Thilo jest prawdopodobnie najdokładniejsza z historycznego punktu widzenia, ale metafora „kodu ujemnego” może również obejmować wydajność i wykorzystanie pamięci - nagradzanie wysiłków w celu odroczenia wykonania lub przydzielenia czegoś, dopóki nie będzie ono faktycznie potrzebne.
Ta mentalność „odwlekania się z płaceniem” wytworzyła takie nieprzyzwoite aksjomaty, takie jak „nic nie robić jest zawsze szybsze niż robienie czegoś”, „najszybszy kod to kod, który nigdy się nie wykonuje”, i „jeśli możesz go odłożyć wystarczająco długo, może nigdy nie będziesz musiał tego robić ”(odnosząc się do odroczenia kosztownych operacji, dopóki nie będzie to faktycznie wymagane)
Jedną z technik realizacji negatywnego kodu jest podważenie wstępnych założeń i definicji problemu. Jeśli możesz przedefiniować domenę problemu / wejściową tak, że „lepki problem nr 3” jest kategorycznie niemożliwy, nie musisz tracić czasu ani kodu na zajmowanie się lepkim problemem nr 3. Wyeliminowałeś kod, optymalizując projekt.