Moja ogólna zasada jest taka, że kiedy muszę coś zrobić po raz trzeci, nadszedł czas albo napisać mały skrypt, aby to zautomatyzować, albo przemyśleć moje podejście.
W tym momencie nie tworzę pełnowymiarowego „narzędzia”, tylko mały skrypt (zwykle bash lub python; perl też by działał, a nawet PHP), który automatyzuje to, co robiłem wcześniej ręcznie. Jest to w zasadzie stosowanie zasady DRY (lub zasady Single Source Of Truth, która jest w istocie tym samym) - jeśli musisz zmienić dwa pliki źródłowe w tandemie, musi być jakaś wspólna prawda, którą dzielą, i że prawda musi być rozłożona na czynniki pierwsze i przechowywana w jednym centralnym miejscu. Wspaniale jest, jeśli możesz rozwiązać to wewnętrznie przez refaktoryzację, ale czasami nie jest to wykonalne i właśnie tam pojawiają się niestandardowe skrypty.
Później skrypt może ewoluować w pełnowartościowe narzędzie, ale zwykle zaczynam od bardzo konkretnego skryptu z dużą ilością zakodowanych w nim rzeczy.
Nienawidzę pracy z pasją, ale również mocno wierzę, że jest to oznaka złego lub niewłaściwego projektu. Bycie leniwym jest ważną cechą programisty i lepiej być takim, w którym przechodzisz przez wiele czasu, aby uniknąć powtarzalnej pracy.
Jasne, czasami saldo jest ujemne - spędzasz trzy godziny na refaktoryzowaniu kodu lub pisaniu skryptu, aby zaoszczędzić godzinę powtarzalnej pracy; ale zazwyczaj bilans jest dodatni, tym bardziej, jeśli weźmie się pod uwagę koszty, które nie są bezpośrednio widoczne: awaria człowieka (ludzie są naprawdę źli w powtarzalnej pracy), mniejsza baza kodów, lepsza konserwowalność dzięki zmniejszonej redundancji, lepsza dokumentacja, szybsza przyszłość programowanie, czystszy kod. Więc nawet jeśli saldo wydaje się teraz ujemne, baza kodów będzie się dalej rozwijać, a to narzędzie, które napisałeś do generowania formularzy internetowych dla trzech obiektów danych, będzie nadal działać, gdy będziesz mieć trzydzieści obiektów danych. Z mojego doświadczenia wynika, że równowaga jest zwykle szacowana na korzyść chrząknięcia, prawdopodobnie dlatego, że powtarzalne zadania są łatwiejsze do oszacowania, a tym samym niedoszacowane, podczas gdy refaktoryzacja, automatyzacja i abstrakcja są postrzegane jako mniej przewidywalne i bardziej niebezpieczne, a zatem przeszacowane. Zazwyczaj okazuje się, że automatyzacja wcale nie jest taka trudna.
A potem istnieje ryzyko, że zrobi się to zbyt późno: łatwo jest refaktoryzować trzy zupełnie nowe klasy obiektów danych i napisać skrypt, który generuje dla nich formularze internetowe, a kiedy to zrobisz, łatwo jest dodać 27 dodatkowych klas, które pracować również ze swoim skryptem. Ale jest prawie niemożliwe, aby napisać ten skrypt, gdy osiągniesz punkt, w którym istnieje 30 klas obiektów danych, każda z ręcznie napisanymi formularzami internetowymi i bez żadnej spójności między nimi (inaczej „wzrost organiczny”). Utrzymanie tych 30 klas za pomocą formularzy jest koszmarem powtarzalnego kodowania i półautomatycznego wyszukiwania z zastąpieniem, zmiana typowych aspektów zajmuje trzydzieści razy tyle, ile powinna, ale napisanie skryptu, aby rozwiązać problem, który byłby przerwą na lunch bez zastanowienia, kiedy projekt się rozpoczął, jest teraz przerażającym dwutygodniowym projektem z przerażającą perspektywą miesięcznego następstwa polegającego na naprawianiu błędów, edukowaniu użytkowników, a być może nawet rezygnacji i powrocie do stara baza kodów. Jak na ironię napisanie 30-klasowego bałaganu trwało dłużej niż czyste rozwiązanie, ponieważ przez cały czas mogłeś jeździć w wygodnym skrypcie. Z mojego doświadczenia wynika, że zbyt późne zautomatyzowanie powtarzalnej pracy jest jednym z głównych problemów w długotrwałych dużych projektach oprogramowania. ponieważ mogłeś cały czas jeździć na wygodnym skrypcie. Z mojego doświadczenia wynika, że zbyt późne zautomatyzowanie powtarzalnej pracy jest jednym z głównych problemów w długotrwałych dużych projektach oprogramowania. ponieważ mogłeś cały czas jeździć na wygodnym skrypcie. Z mojego doświadczenia wynika, że zbyt późne zautomatyzowanie powtarzalnej pracy jest jednym z głównych problemów w długotrwałych dużych projektach oprogramowania.