Jak zachować produktywność, radząc sobie z wyjątkowo źle napisanym kodem?

63

Nie mam dużego doświadczenia w pracy w branży oprogramowania, samouku i uczestnictwa w open source przed podjęciem decyzji o podjęciu pracy. Teraz, kiedy pracuję dla pieniędzy, muszę również poradzić sobie z nieprzyjemnymi rzeczami, co oczywiście jest normalne.

Ostatnio przydzielono mi dodawanie rejestrowania do dużego projektu SharePoint, który jest napisany przez programistę, który oczywiście uczył się kodować w zadaniu. Po 2 latach współpracy klient przeniósł się do naszej firmy, ale szkoda została wyrządzona, a teraz muszę jakoś zachować ten kod.

Nie żeby kod był zbyt trudny do odczytania. Pomimo problemów - każdy projekt ma jedną klasę z kilkoma skopiowanymi metodami, ogromne ifzagnieżdżenia, systemy węgierskie, niezakłócone połączenia - wciąż jest czytelny.

Jednak okazało się, że jestem absolutnie bezproduktywny, mimo że pracuję nad czymś tak prostym, jak dodawanie rejestrowania. Zasadniczo muszę tylko przejść krok po kroku i dodać kilka wywołań śledzenia. Jednak idiotyzm kodu jest tak denerwujący, że zmęczyłem się w ciągu 10 minut od uruchomienia . Na początku dodawałem usingkonstrukcje, zmniejszałem zagnieżdżanie poprzez odwracanie if, zmieniłem nazwy zmiennych na czytelne nazwy - ale projekt jest duży i ostatecznie się poddałem. Wiem, że nie jest to zadanie, które powinienem wykonywać, ale przynajmniej zmniejszenie bałaganu dało mi jakąś nagrodę psychologiczną, abym mógł kontynuować. Teraz sztuczka przestała działać i nadal mam 60% mojej pracy do wykonania.

Zacząłem odczuwać bóle głowy po pracy i nie odczuwałem już satysfakcji, którą zwykłem uzyskiwać - co zwykle pozwalało mi kodować przez 10 godzin bez przerwy i wciąż czułem się świeżo.

To nie jest tylko jeden wielki rant, bo naprawdę mam pytanie:

Czy istnieje sposób, aby utrzymać produktywność i nie walczyć z wiatrakami?

Czy istnieje jakaś sztuczka psychologiczna, która pozwala skupić się na zadaniu, zamiast myśleć jakie to głupie ?” Za każdym razem, gdy widzę kolejną sprytną sztuczkę poprzedniego programisty? Problem z dodawaniem rejestrowania polega na tym, że tak naprawdę muszę zrozumieć, co robi kod, a to rani mój mózg w nieprzyjemny sposób.

Dan
źródło
Notacja węgierska nie jest zła, przeczytaj oryginalny artykuł, aby zobaczyć, o czym mówił :)
Woot4Moo
14
Wiem, że węgierski nie jest zły. Właśnie dlatego napisałem Systems węgierski, a nie Apps węgierski (oryginalny). Nie widzę sensu w używaniu węgierskiego systemu w języku C #, ponieważ ma świetny system typów i IDE. Posiadanie 10 zmiennych w tym samym zakresie, od których wszystkie zaczynają się, objjest zniechęcające, ponieważ jest w zasadzie nieczytelne.
Dan
2
Chciałbym móc zadać to pytanie więcej niż jeden głos!
o6tech
9
Wydmuchuję parę, zadając zrzędliwe pytania na stosie, które sprawiają, że jestem oceniany.
Erik Reppen

Odpowiedzi:

32

Przykro mi to mówić, ale nie wszystkie prace są pełne słońca i przepychu. Większość zadań programistycznych polega na takich pracach pogrzebowych. Smutne ale prawdziwe.

Wykonujesz ważną pracę, nawet jeśli jest nudna do tego stopnia, że ​​patrzysz, jak farba wysycha. Jest to ważne z dwóch powodów: 1. Dodaje bardzo potrzebne logowanie do dużego systemu, aby gdy coś pójdzie nie tak, będziesz mieć narzędzie, które pomoże ci go znaleźć. i 2. Zapoznanie się z bazą kodu, dzięki czemu jeśli coś pójdzie nie tak, możesz wskoczyć i naprawić.

Zasadniczo tworzysz tutaj własną siatkę bezpieczeństwa. Glamory, nie, ale ważne tak!

Biorąc to pod uwagę, jak należy się motywować? Kiedy w pracy mam odrętwiające zadanie, wyznaczam sobie cele. Zakończ wykonywanie zadania x do końca tygodnia. Jeśli osiągnę swój cel, nagradzam się. Nowa restauracja, którą chcę wypróbować? Idź w piątek wieczorem, jeśli skończę. Właśnie wyszedł nowy film? Zobacz to w weekend, jeśli skończę.

Rozmawiam z moim przełożonym i powiadamiam go, gdzie jestem i jak robię postępy, dlatego jestem odpowiedzialny. Jeśli powiem im, że skończę do piątku, czuję się bardziej skłonny zrobić to do piątku b / c Powiedziałem im, że to zrobię.

Miej wiarę, że kiedy wykonasz to zadanie i wykonasz je dobrze, na czas i zgodnie z budżetem, który ludzie zauważą, a kiedy pojawi się ten gówniany nowy projekt, twoje imię może zostać zasugerowane jako ten, który je dostanie. :)

Tyanna
źródło
Szczególnie podoba mi się punkt dotyczący motywacji w piątek. To zabawne, że bieżąca wersja planowana jest również w piątek. Myślę, że warto dodać, że motywacja wdzięczności jest wzruszająca. Musisz upewnić się, że ktoś będzie ci wdzięczny za twoją pracę, albo zmienić to, nad czym pracujesz. Szczere „dziękuję” często cofa niespokojne godziny.
Dan
1
@gaearon - Cieszę się, że sugestie są dla Ciebie pomocne. Przebranie się przez ciężką pracę z dobrym poziomem motywacji ostatecznie się opłaci. W zeszłym roku w mojej obecnej pracy musiałem zrobić coś podobnego do tego, co robisz. W tym roku otrzymałem zupełnie nową aplikację do pisania od zera. Ludzie zauważą, co robisz i jak dobrze pracujesz.
Tyanna
3
-1 Po co łączyć życie zawodowe z życiem osobistym? To brzmi podobnie do konsekwentnego utrzymywania nadgodzin -I didn't finish my under-estimated task by Friday - so I need to stay at home and feel bad.
Vorac
@Vorac ~ Powiedziałem, że to właśnie robię, aby się zmotywować. Każdy jest inny. I zapewniam cię, że nie pracuję OT konsekwentnie. Znajdź coś, co Cię motywuje i skorzystaj z niego. Uważam, że nagroda materialna działa najlepiej, gdy mam zadanie, którego nie chcę wykonywać.
Tyanna
1
@IntegrityFirst ~ Dla mnie tak. Spóźnię się, by dokończyć moją listę rzeczy do zrobienia. Poświęcę swój czas, aby mieć pewność, że go trafię. Moja uczciwość wobec siebie i moich współpracowników polega na dokończeniu czegoś, kiedy mówię, że to zrobię. Ale jeśli odkryję, że czegoś nie można zrobić w czasie, który powiedziałem, zmieniam plan i daję znać mojemu przełożonemu. A jeśli skończę trochę późno, film / restauracja będzie tam w przyszłym tygodniu. :)
Tyanna,
30

Zachowaj plik fragmentów kodu kandydata do przesłania na thedailywtf.com. Nawet jeśli tak naprawdę nie zamierzasz ich przesyłać, daje to jasną stronę znalezienia kodu, który jest nawet gorszy niż średnia.

Peter Taylor
źródło
Chciałbym móc jeszcze raz głosować. Okazało się to naprawdę świetną sugestią, odkąd odkryłem, że ci faceci przechowują swoje dzienniki zmian w plikach konfiguracyjnych aplikacji, tuż przed rzeczywistymi ustawieniami.
Dan
24

Byłem w podobnej sytuacji, której zadaniem było oczyszczenie dużej części źle napisanego, masowo skopiowanego i wklejonego kodu.

Aby utrzymać moją motywację i zdrowie psychiczne, napisałem skrypt o nazwie current_scoreLOC, który zliczał LOC w projekcie (który stale się zmniejszał, ponieważ eliminowałem powielanie i przestawiałem się na lepsze algorytmy) i porównywałem go z LOC, kiedy zaczynałem. Ilekroć byłem zniechęcony lub sfrustrowany górą kodu, z którą miałem do czynienia, bieganie current_scoredawało mi poczucie namacalnego postępu i przypominało mi, jak wiele już osiągnąłem. Fajnie było zobaczyć, jak wysoki wynik mogłem znieść, radząc sobie ze szczególnie złym fragmentem kodu.

Poszukałbym podobnych wskaźników, które można łatwo napisać, aby dać poczucie postępu i zmienić je w rodzaj gry. Linie kodu (po prostu uruchom wc -l), cykliczność złożoności (która powinna spaść, kiedy czyścisz te paskudne zagnieżdżone „ifs”), linie kodu, które zostały dotknięte przez ciebie zamiast twojego poprzednika (myślę, że FishEye może ci to powiedzieć 10 USD) itp. Możesz nawet napisać skrypt Perla bez większych problemów, aby policzyć liczbę bloków kodu, które nie mają jeszcze instrukcji rejestrowania.

Josh Kelley
źródło
Używam SourceMonitor
UmNyobe
13

Widziałem tę książkę zalecaną: Efektywna praca ze starszym kodem , ale na szczęście nie musiałem go czytać.

Tak jak robisz, popraw to, czego potrzebujesz, aby zrozumieć kod i pamiętaj, że reanimujesz system, który się opłaci, gdy będziesz go utrzymywał.
Miejmy nadzieję, że powinno to pomóc Ci w drodze do domu.

StuperUser
źródło
2
Ta książka jest o refaktoryzacji istniejącego kodu, aby można go było przetestować; Nie sądzę, żeby to bardzo pomogło w motywacji.
Billy ONeal,
2
Dobra uwaga @Billy ONeal, ale posiadanie testowalnego kodu i powiązanych wskaźników może wskazywać postęp, który może być motywujący.
StuperUser
1
Przeczytałem tę książkę. Zdecydowanie warte przeczytania. Uznałem, że WEWLC jest motywujące tylko dlatego, że miło było wiedzieć, że jest ktoś, kto rozumie dokładnie te frustracje, które miałem, i opracował skuteczne sposoby ich złagodzenia.
Jason Swett
1
Ta książka jest trochę stara i przestarzała. Jeśli go nie przeczytałeś, dlaczego go polecasz?
BЈовић
1
@StuperUser Gdy czytam, mogę powiedzieć, że jest przestarzały i może dostarczyć użytecznych porad początkującym użytkownikom.
BЈовић
6

Spróbuj podzielić projekt na części. Każdego dnia dowiedz się, jak działa określony fragment. Próbowanie zrozumienia wszystkiego naraz jest prawdopodobnie tym, co cię stresuje.

Szczycimy się ulepszaniem projektu. Czy możesz porozmawiać z innymi programistami? Pomaga stać przy chłodziarce i dyskutować / śmiać się z najnowszej logiki, którą znalazłeś. Staram się to robić, aby zachować radosną atmosferę w pracy.

davidhaskins
źródło
Tak, pracuję po kawałku i już nad tym pracuję od jakiegoś czasu, więc mam ogólne pojęcie o każdym komponencie. Mimo to niewiele to pomaga, ponieważ to małe elementy logiczne, które zwykle wymagają czasu, aby je zrozumieć - i denerwuję się, kiedy zdaję sobie sprawę, że metoda 30-liniowa, nad którą spędziłem 10 minut, może być w rzeczywistości napisana w dwóch liniach. Jeśli chodzi o firmę, niestety jestem jedynym programistą w tym projekcie i obecnie pracuję w biurze klienta, więc nie ma z kim naprawdę rozmawiać.
Dan
@gaearon - Co uniemożliwia Ci wdrożenie rozwiązania 2-liniowego? Musisz dowiedzieć się, jak wykonać to, co masz za zadanie, problem z kodem można rozwiązać później, gdy nie będzie Cię w biurze klienta. Powinieneś zachować swoje notatki na temat tego, co zrobiłeś, jak coś działa, abyś mógł wrócić później i zaimplementować zmiany, aby umożliwić przeglądanie kodu i testowanie integracji.
Ramhound
@gaearon ah-ha! Jesteś jedynym programistą. Więc facet przed tobą był jedynym programistą. Możesz uciec od wszystkiego, gdy jesteś jedynym programistą (jak zauważyłeś od swojego poprzednika). Należy o tym pamiętać, szukając następnej pracy. ;)
davidhaskins
@Ramhound Założę się, że nie będzie żadnych recenzji kodu. Założę się, że nie będzie żadnych formalnych testów integracji. Pracowałem na tych stanowiskach kilka razy. Zasadniczo ludzie chcą tylko kodu, który działa wystarczająco dobrze i chcą go tak szybko, jak to możliwe. Wyjaśnianie „najlepszych praktyk” przypomina rozmowę ze ścianą, IMHO.
davidhaskins
@Ramhound, nie ma testów dla tego projektu i nie chcę ponosić odpowiedzialności za zniszczenie systemu ze względu na czystszy kod. Istnieje wiele przypadków, w których obecny kod sugeruje połknięcie wyjątków lub opiera się na innych rodzajach złego zachowania, co nie jest oczywiste. Nawiasem mówiąc, jest to jeden z powodów, dla których dodałem rejestrowanie.
Dan
6

Rób obszerne notatki, aby uporządkować pytania, przemyślenia i zrozumienie systemu. To zadziałało dla mnie cudownie, gdy mamy do czynienia z dużymi starszymi systemami. Pomaga krystalizować twoje zrozumienie, pomaga ułożyć otwarte pytania w słowa, a ponieważ twoje myśli są już zebrane, ułatwia spontaniczne komunikowanie się z innymi na temat problemów / pytań / pomysłów / itp.

Jako przykład, kiedy przeglądam fragment kodu, będę stale robić notatki dla siebie. To jest moja rozmowa ze sobą. Sam akt pisania pomaga wyjść z większej ilości myśli i pomaga mi lepiej zrozumieć sytuację. Po chwili mogę mieć Eurekę i muszę narysować mały schemat z „większym obrazem” na papierze, aby zilustrować to, co właśnie pomyślałem lub jakie elementy właśnie złożyłem. Zawsze robię to tylko na papierze, pozbywając się wszelkich zakłóceń komputera. To pozwala mi być bardziej metodycznym i przemyślanym na temat tego, co robię.

Jest to w zasadzie wygodny sposób na ciągłą rozmowę z ekspertem domeny :)

Doug T.
źródło
3

Wiem, że możesz czuć się bezproduktywny, ponieważ patrzysz na to z perspektywy „Dodam tylko rejestrowanie”, podczas gdy w rzeczywistości dodajesz rejestrowanie i robisz dużo refaktoryzacji. Twój przełożony prawdopodobnie zna sytuację z kodem. Każdy może teraz tego nie docenić, ale kiedy pojawi się prośba o dodanie naprawdę interesującej i wymagającej funkcji, z przyjemnością wyczyścisz kod.

JeffO
źródło
Obawiam się, że skończę przepisywanie projektu, już o tym rozmawialiśmy. Chociaż bardziej podoba mi się ta opcja, nie zwiększa produktywności w pracy nad niepotrzebnym kodem. Wiem, że rejestracja jest wymagana w następnej wersji, a potem mogę iść ze swoimi rzeczami, ale to po prostu konieczność uruchomienia tego kodu przez moją głowę doprowadza mnie do szału. Po zrozumieniu czuję się głupszy :-)
Dan
1
„nie zwiększa produktywności podczas pracy z niepotrzebnym kodem” Suuure to robi. Możesz przejść przez duże części kodu, pracując nad jego zrozumieniem, wykonując jednocześnie zadanie niskiego ryzyka (logowanie). Zdobyta wiedza ogromnie pomoże, jeśli chodzi o przepisanie. Jeśli nie ma przepisywania, spróbuj spodziewać się nagrody, którą poczujesz, gdy wyczyścisz duże ilości aplikacji, o ile lepiej baza kodu będzie dzięki konsekwentnym i wytrwałym wysiłkom.
quentin-starin
2

W tych przypadkach zwykle przepisuję sekcję kodu. Aby jeden obszar ssał mniej, a następnie dodałem rejestrowanie gdzie indziej. Następnie posprzątaj trochę kodu. Zły kod jest zły tylko wtedy, gdy go tam zostawisz.

Erin
źródło
System w dużej mierze opiera się na złych praktykach, więc aby poprawnie przepisać metodę, musiałbym przepisać cały projekt (co prawdopodobnie zrobię w końcu, ale mam pewne terminy dla bieżącej wersji).
Dan
Rozumiem, uwierz mi. Po prostu wybieram sekcję, którą mogę posprzątać, nie powodując, że moje życie staje się bolesne i posprzątam, a następnie następny obszar. Naprawianie kodu jest procesem, na który nigdy nie masz czasu, ale zawsze powinieneś znaleźć czas.
Erin
2

Gamifikuj swoją pracę. Na przykład, daj sobie 5 punktów za każdym razem, gdy zadajesz dobre pytanie na temat kodu, i 10 punktów za każdym razem, gdy na nie odpowiesz. Daj sobie odznakę za każdym razem, gdy zmienisz metodę lub dodasz nową funkcję. Gdy zdobędziesz wystarczającą liczbę punktów, otrzymasz przywileje, takie jak przerwy na kawę lub herbatniki. Po ukończeniu całego projektu masz przywilej, aby zafundować sobie coś, czego naprawdę chcesz.

Richie Cotton
źródło
0

Sztuczka polegająca na tym, aby nie nudzić się ani nie denerwować, aby zachować produktywność, polega na zaakceptowaniu tego, że kod jest źle zaprojektowany. Zaakceptowanie twojego stanowiska w kwestii zrozumienia i aktualizacji kodu pozwoli ci nie komentować „jakie to głupie”, zamiast tego spokojnie go zaakceptuj i przejdź dalej.

Kolejną sztuczką jest posiadanie dobrej rodziny, na którą można się spodziewać pod koniec dnia. Dziewczyny, przyjaciele, gry wszystko będzie działać, aby dać ci cel, aby przejść dzień i sprawić, że trudny, choć zły kod, będzie wart.

Tim
źródło
0

Pomocna może być „Efektywna praca ze starszym kodem” Michaela Feathersa.

Jeśli martwisz się zepsuciem rzeczy podczas ich zmiany, najpierw napisz kilka testów, upewnij się, że przejdą one przed i po wprowadzeniu zmian. Napisanie testu powinno pomóc ci podsumować i zrozumieć, co robi dany fragment kodu i pozwoli ci z pewnością edytować.

Stephen Paulger
źródło
Niestety jest to projekt SharePoint, co oznacza, że ​​jest prawie nie do przetestowania. W przeszłości napisałem fajne sandboxing dla SharePoint przy użyciu Microsoft Moles, ale wymaga to dużo dodatkowej pracy.
Dan