W skrócie: to zależy
W szczegółach
Czy potrzebujesz oczyszczonych, błyszczących rzeczy?
Są tu rzeczy, na które trzeba uważać, i musisz określić granicę między tym, co jest realnym, wymiernym zyskiem, a tym, co jest twoją osobistą preferencją i potencjalnym złym nawykiem dotykania kodu, który nie powinien być.
Mówiąc dokładniej, wiedz o tym:
Jest to anty-wzorzec i zawiera wbudowane problemy:
- to może być bardziej rozciągliwe , ale to nie może być łatwiejsze do rozszerzenia,
- to nie może być prostsze do zrozumienia ,
- na koniec, ale zdecydowanie nie tylko tutaj: możesz spowolnić cały kod.
Niektórzy mogą również wspomnieć o zasadzie KISS jako odniesienie, ale tutaj jest to sprzeczne z intuicją: czy zoptymalizowany sposób jest prosty, czy przejrzysty? Odpowiedź niekoniecznie musi być absolutna, jak wyjaśniono w dalszej części poniżej.
Zasada YAGNI nie jest całkowicie ortogonalna w stosunku do drugiego problemu, ale pomaga zadać sobie pytanie: czy będziesz go potrzebować?
Czy bardziej złożona architektura naprawdę stanowi dla Ciebie korzyść, poza tym, że wygląda na łatwiejszą do utrzymania?
Napisz to na dużym plakacie i powieś obok ekranu, w kuchni w pracy lub w sali spotkań deweloperów. Oczywiście istnieje wiele innych mantr, które warto powtórzyć, ale ta konkretna jest ważna, gdy próbujesz wykonać „prace konserwacyjne” i odczuwasz potrzebę jej „ulepszenia”.
To naturalne, że chcemy „ulepszyć” kod, a nawet dotknąć go, nawet nieświadomie, kiedy go czytamy, aby go zrozumieć. To dobra rzecz, ponieważ oznacza to, że jesteśmy przekonani i staramy się lepiej zrozumieć elementy wewnętrzne, ale wiąże się to również z naszym poziomem umiejętności, naszą wiedzą (jak zdecydować, co jest lepsze, czy nie? Cóż, zobacz sekcje poniżej ...) i wszystkie nasze założenia dotyczące tego, co uważamy za oprogramowanie ...:
- tak naprawdę
- faktycznie musi zrobić
- w końcu będzie musiał to zrobić,
- i jak dobrze to robi.
Czy to naprawdę wymaga optymalizacji?
Wszystko to mówiło, dlaczego w ogóle „zoptymalizowano”? Mówią, że przedwczesna optymalizacja jest źródłem wszelkiego zła, a jeśli widzisz nieudokumentowany i pozornie zoptymalizowany kod, zwykle możesz założyć, że prawdopodobnie nie postępował zgodnie z Regułami optymalizacji, nie wymagał on wysiłku optymalizacyjnego i że był to po prostu zaczyna się zwykła deweloperka. Po raz kolejny, być może to teraz twoja rozmowa.
Jeśli tak, w jakim zakresie staje się to do przyjęcia? Jeśli zachodzi taka potrzeba, limit ten istnieje i daje ci miejsce na ulepszenie rzeczy lub na twardą linię, by zdecydować się na to.
Uważaj również na niewidzialne cechy. Możliwe, że twoja „rozszerzalna” wersja tego kodu również zwiększy ilość pamięci w czasie wykonywania, i zapewni jeszcze większy statyczny ślad pamięci dla pliku wykonywalnego. Błyszczące funkcje OO wiążą się z nieintuicyjnymi kosztami, takimi jak te, i mogą mieć znaczenie dla Twojego programu i środowiska, w którym ma działać.
Mierz, mierz, mierz
Jako ludzie Google teraz chodzi o dane! Jeśli możesz wykonać kopię zapasową danych, jest to konieczne.
Jest taka nie tak stara opowieść, że za każdy 1 USD wydany na rozwój będzie towarzyszył co najmniej 1 USD na testowanie i co najmniej 1 USD na wsparcie (ale tak naprawdę, to znacznie więcej).
Zmiana wpływa na wiele rzeczy:
- może być konieczne wyprodukowanie nowej wersji;
- powinieneś napisać nowe testy jednostkowe (zdecydowanie, gdyby ich nie było, a twoja bardziej rozszerzalna architektura prawdopodobnie pozostawia miejsce na więcej, ponieważ masz więcej powierzchni na błędy);
- powinieneś napisać nowe testy wydajności (aby upewnić się, że pozostaną one stabilne w przyszłości i zobaczyć, gdzie są wąskie gardła), a te są trudne do wykonania ;
- musisz to udokumentować (a większa rozszerzalność oznacza więcej miejsca na szczegóły);
- Ty (lub ktoś inny) będziesz musiał dokładnie przetestować go w ramach kontroli jakości;
- kod (prawie) nigdy nie jest wolny od błędów i musisz go obsługiwać.
Dlatego nie tylko zużycie zasobów sprzętowych (szybkość wykonywania lub wielkość pamięci) należy zmierzyć, ale także zużycie zasobów zespołu . Oba należy przewidzieć, aby określić cel docelowy, który należy zmierzyć, uwzględnić i dostosować w zależności od rozwoju.
A dla twojego menedżera, oznacza to dopasowanie go do obecnego planu rozwoju, więc komunikuj się o tym i nie wdawaj się w wściekłe kodowanie krowa-chłopca / łodzi podwodnej / black-opsa.
Ogólnie...
Tak ale...
Nie zrozumcie mnie źle, ogólnie rzecz biorąc, byłbym zwolennikiem wyjaśnienia, dlaczego to sugerujecie, i często to zalecam. Ale musisz zdawać sobie sprawę z długoterminowych kosztów.
W idealnym świecie jest to właściwe rozwiązanie:
- sprzęt komputerowy z czasem staje się lepszy,
- z czasem kompilatory i platformy uruchomieniowe stają się lepsze,
- otrzymujesz prawie idealny, czysty, łatwy w utrzymaniu i czytelny kod.
W praktyce:
możesz to pogorszyć
Potrzebujesz więcej gałek ocznych, aby na to spojrzeć, a im bardziej ją skomplikujesz, tym więcej potrzebujesz gałek ocznych.
nie możesz przewidzieć przyszłości
Nie możesz z absolutną pewnością stwierdzić, czy kiedykolwiek będziesz go potrzebować, nawet jeśli „rozszerzenia”, których będziesz potrzebować, byłyby łatwiejsze i szybsze do wdrożenia w starej formie, a jeśli same wymagałyby superoptymalizacji .
z punktu widzenia zarządzania stanowi ogromny koszt bez bezpośredniego zysku.
Włącz to do procesu
Wspominasz tutaj, że jest to niewielka zmiana i masz na myśli pewne konkretne problemy. Powiedziałbym, że w tym przypadku zwykle jest OK, ale większość z nas ma również osobiste historie o drobnych zmianach, prawie modyfikacjach po chirurgicznym uderzeniu, które ostatecznie zamieniły się w koszmar utrzymania i prawie nie dotrzymały terminów lub wybuchły, ponieważ Joe Programmer nie widział z powodów stojących za kodem i dotknął czegoś, co nie powinno być.
Jeśli masz proces radzenia sobie z takimi decyzjami, pozbawiasz ich osobistej przewagi:
- Jeśli przetestujesz wszystko poprawnie, będziesz wiedzieć szybciej, jeśli coś się zepsuje,
- Jeśli je zmierzysz, będziesz wiedział, czy się poprawiły,
- Jeśli go przejrzysz, dowiesz się, czy to zniechęca ludzi.
Pokrycie testowe, profilowanie i gromadzenie danych są trudne
Ale, oczywiście, twój kod testowy i metryki mogą mieć problemy z tymi samymi problemami, których starasz się unikać w swoim prawdziwym kodzie: czy testujesz właściwe rzeczy i czy są one właściwe na przyszłość i czy mierzysz właściwe rzeczy?
Jednak ogólnie rzecz biorąc, im więcej testujesz (aż do określonego limitu) i mierzysz, tym więcej danych zbierasz i tym bardziej jesteś bezpieczny. Zły czas na analogię: pomyśl o tym jak o prowadzeniu samochodu (lub o życiu): możesz być najlepszym kierowcą na świecie, jeśli samochód się zepsuje lub ktoś zdecyduje się zabić, wjeżdżając do twojego samochodu swoim własnym, swoim umiejętności mogą nie wystarczyć. Istnieją zarówno czynniki środowiskowe, które mogą cię uderzyć, jak i błędy ludzkie.
Recenzje kodu to testy korytarza zespołu programistów
I myślę, że ostatnia część jest tutaj kluczowa: wykonaj recenzje kodu. Nie poznasz wartości swoich ulepszeń, jeśli stworzysz je solo. Przeglądy kodu to nasze „testy korytarza”: postępuj zgodnie z wersją prawa Linusa Raymonda, zarówno w celu wykrycia błędów, jak i wykrycia nadmiernej inżynierii i innych anty-wzorów, oraz aby upewnić się, że kod jest zgodny ze zdolnościami twojego zespołu. Nie ma sensu mieć „najlepszego” kodu, jeśli nikt inny nie jest w stanie go zrozumieć i utrzymywać, a to dotyczy zarówno tajemniczych optymalizacji, jak i 6-warstwowych projektów architektonicznych.
Jako słowa końcowe pamiętaj:
Wszyscy wiedzą, że debugowanie jest dwa razy trudniejsze niż napisanie programu. Jeśli więc jesteś tak sprytny, jak tylko możesz, pisząc go, jak to będzie kiedykolwiek debugować? - Brian Kernighan