Czy powinniśmy trwać przy pracowniku, który nadal pisze zły kod po wielu latach? [Zamknięte]

13

Zadaję to pytanie programistom C ++, ponieważ: a) Tylko programista C ++ może ocenić zalety techniczne przykładów; b) Tylko programista wyczuje temperament innego programisty, który pisze taki kod.

HR i dyrektorzy są świadomi, że istnieje problem, ponieważ widzą dowody w terenie. To moje wezwanie, czy dajemy programiście więcej czasu. Wiele błędów jest na bardzo podstawowym poziomie - moje pytanie (do programistów) brzmi: czy ktoś, kto twierdzi, że jest starszym programistą C ++, powinien mieć wątpliwości co do próbki obecnego kodu. Osoby niebędące programistami - nawet osoby spoza programowania w C ++ - nie mogą na ten temat oceniać.

W tle powierzono mi zadanie zarządzania programistami w ugruntowanej firmie. Mają jednego programistę, który specjalizuje się we wszystkich kodowaniach C ++ (od zawsze), ale jakość pracy jest fatalna. Przeglądy i testy kodu ujawniły wiele problemów, z których jednym z najgorszych są wycieki pamięci. Deweloper nigdy nie testował swojego kodu pod kątem wycieków, a ja odkryłem, że aplikacje mogą przeciekać wiele MB przy zaledwie minucie użytkowania. Użytkownik zgłaszał ogromne spowolnienia, a jego zdanie brzmiało: „to nie ma ze mną nic wspólnego - jeśli odejdą i zrestartują się, wszystko znowu będzie dobrze”.

Dałem mu narzędzia do wykrywania i śledzenia wycieków, i usiadłem z nim przez wiele godzin, aby zademonstrować, w jaki sposób używane są narzędzia, gdzie występują problemy i co zrobić, aby je naprawić. Minęło 6 miesięcy, a ja wyznaczyłem go do napisania nowego modułu. Przejrzałem go, zanim został zintegrowany z naszą większą bazą kodu i z przerażeniem odkryłem to samo złe kodowanie, co poprzednio. Niezrozumiałe jest to, że niektóre kodowanie jest gorsze niż amatorskie. Na przykład chciał klasy (Foo), która mogłaby wypełnić obiekt innej klasy (Bar). Zdecydował, że Foo będzie zawierać odniesienie do Baru, np .:

class Foo {
public:
    Foo(Bar& bar) : m_bar(bar) {}
private:
    Bar& m_bar;
};

Ale (z innych powodów) potrzebował też domyślnego konstruktora dla Foo i zamiast kwestionować swój początkowy projekt, napisał ten klejnot:

Foo::Foo() : m_bar(*(new Bar)) {}

Tak więc za każdym razem, gdy wywoływany jest domyślny konstruktor, wycieknie pasek. Co gorsza, Foo przydziela pamięć ze sterty na 2 inne obiekty, ale nie napisał niszczyciela ani konstruktora kopii. Tak więc każda alokacja Foo przecieka 3 różne obiekty i możesz sobie wyobrazić, co się stało, gdy Foo zostało skopiowane. I - robi się coraz lepiej - powtórzył ten sam wzór w trzech innych klasach, więc nie jest to jednorazowy poślizg. Cała koncepcja jest błędna na tak wielu poziomach.

Czułbym więcej zrozumienia, gdyby pochodziło to od nowicjusza. Ale ten facet robi to od wielu lat i przez ostatnie kilka miesięcy bardzo skoncentrował się na szkoleniach i poradach. Zdaję sobie sprawę, że przez większość czasu pracował bez mentoringu i recenzji, ale zaczynam czuć, że nie może się zmienić. Moje pytanie brzmi: czy uparłbyś się przy kimś, kto pisze tak ewidentnie zły kod?

użytkownik94986
źródło
15
Jeśli już widziałeś, że pisze zły kod, dlaczego pozwoliłeś mu pisać swoje gówno przez 6 miesięcy bez nadzoru?
Billy McNuggets
4
IMO, kiedy widzisz, że ktoś przez jakiś czas robi złą robotę, NIE MOŻESZ pozwolić mu pracować samemu, nawet jeśli to tylko debugowanie / naprawa. Jeśli wolisz go trzymać w swoim towarzystwie, MUSISZ go nadzorować i PO zobaczeniu, czy nadal otrzymujesz od niego złe wyniki. Pozwolenie mu pracować samemu przez 6 miesięcy bez patrzenia na niego to złe zarządzanie.
Billy McNuggets
3
@ user94986 Następnie, jeśli spędzasz z nim czas, tłumacząc mu, że jego nawyki są złe, powinieneś go obserwować, a jeśli nic się nie zmieni, nie czekaj 6 miesięcy, aby z nim porozmawiać.
Billy McNuggets
4
Jeśli nie sądzi, że wycieki pamięci stanowią problem, nie ma sensu uczyć go, jak ich unikać, i udzielać narzędzi pomagających w tym. Głównym problemem może być to, że nieprawidłowo rozumie cele i wymagania dotyczące produktu.
maxim1000
2
To pytanie wydaje się być nie na temat, ponieważ dotyczy tego, czym właściwie jest doradztwo prawne w dziedzinie HR, które w najlepszym wypadku jest dla nas problematyczne.
Inżynier świata

Odpowiedzi:

22

Radzę skonfrontować go z tym konkretnym przykładem i zobaczyć, co mówi. Jeśli zaprzecza, że ​​jest coś złego w kodzie, obawiam się, że niewiele możesz zrobić. Jeśli zaakceptuje, że popełnił błąd (nawet jeśli jest w tym defensywie), to przynajmniej jest miejsce na poprawę. Jeśli poświęcisz czas i wysiłek na ulepszenie go, wtedy ty lub starszy programista będziecie musieli go usiąść i wspólnie kodować, aż wszystkie te tendencje zostaną spłaszczone (bądź przygotowany na poświęcenie tej osoby przez co najmniej 1 miesiąc).

Zły programista, z którym zwykle mogę pracować, ale programista, który nie może się poprawić, nie mogę.

Neil
źródło
12
+1 za „Zły programista, z którym zwykle mogę pracować, ale programista, który nie może się poprawić, nie mogę”.
Tak, chciałbym też powiedzieć facetowi, że to dość poważne. Wygląda na to, że nie powiedziano mu ani nie przyznał, że od lat istnieje problem. Przyjdź do rozmowy, aby wskazać przykłady rzeczy, których nie powinien był robić, i jak wpłynęło to na jakość aplikacji. Jeśli nadal nie chce odgadnąć problemu ze swoim kodem, prawdopodobnie pozwolę mu odejść. I pewnie nie dałbym mu dużo czasu na zebranie się, gdyby to zrobił. Zdecydowanie musisz podkreślić, że jego przyszłość w firmie jest zagrożona i że brakuje mu dość krytycznych umiejętności dla programisty C ++.
Erik Reppen
@ErikReppen Zgadzam się, ale myślę też, że programiści mogą być najbardziej upartymi typami ludzi na ziemi. Jeśli naciskasz zbyt mocno, może on zaprzeczyć wszelkim problemom ze swoim kodem po prostu z powodu defensywy. Myślę, że ważne jest podkreślenie powagi sytuacji, ale nadal starałbym się z nim współczuć. „Zauważyłem ten mały błąd. Czy zdarzyło ci się go również złapać? Czy podejrzewasz, że popełniłeś ten sam błąd w innych obszarach twój program? ”
Neil
@Neil Jedyną drogą przez ścianę upartego jest kopnięcie w tyłek. Mówię z doświadczenia jako uparta strona tego równania. To powiedziawszy, jeśli to pierwszy raz, kiedy usłyszał o problemie z jego kodem, tak, poszedłbym trochę bardziej miękko, ale wygląda na to, że przynajmniej raz próbowali przekazać problem
Erik Reppen
@ErikReppen Może, ale ryzykujesz, że on kształtuje się tylko po to, żeby cię zdjąć. W takim tempie możesz równie dobrze powiedzieć „Uformuj się, albo zostaniesz zwolniony”. Przynajmniej takie podejście sprawdza, czy ma świadomość swoich błędów.
Neil
18

Moje pytanie brzmi: czy uparłbyś się przy kimś, kto pisze tak ewidentnie zły kod?

Nie. Zwolniłbym każdego profesjonalnego programistę C ++, który nie posiadał podstawowej wiedzy na temat zarządzania pamięcią.

Jeśli jest to ktoś pochodzący z Javy, C # lub czegoś innego, dałbym im trochę swobody, ale to czysta niekompetencja.

Telastyn
źródło
9
Nie rozumiem, jak można odpowiedzieć na tę odpowiedź. Zwolnienie kogoś nie jest sprawą, którą należy lekceważyć.
Florian Margaine
3
@FlorianMargaine - Jasne, ale wydaje się, że to oczywisty przypadek. Ile kosztuje ten pracownik utraconej sprzedaży z powodu wycieków pamięci lub luk w zabezpieczeniach? Ile straconego czasu na testowanie / naprawianie tego badziewia? Ile kosztuje ich OP? Jak bardzo cierpią inni programiści z powodu jego samej obecności ? O ile pracownik nie ma absurdalnej wiedzy na temat domeny (lub szantażu), nie ma sposobu, aby jego wymiana była bardziej kosztowna.
Telastyn
1
@FlorianMargaine, ten typ pracownika nie jest wystarczająco zwolniony, utrudnia firmie naprawienie długu technicznego. Na dużych czerwonych światłach jest napisane: „Nie dbają o to, więc dlaczego mielibyśmy?”. Wiesz, co powiedziałby pracownik, którego tak naprawdę chcesz? „... ale mnie to obchodzi, więc muszę udać się do miejsca, które to robi”. Złych już to nie obchodziło, więc pozostają w twoim biurze. MUSISZ usunąć osoby, które obniżają produktywność, bardziej niż przyczyniają się. Nie jest to wybór podjęty pochopnie, jednak tak naprawdę jest to wyraźna linia, brak działania jest wyraźnym działaniem.
JM Becker,
13

Nie możemy odpowiedzieć na szerszą część twojego pytania. Mianowicie, powinieneś zatrzymać lub zwolnić tego pracownika. Zwolnienie pracownika jest trudne, ale jest to decyzja niezależna od społeczności takiej jak ta.

Zaktualizowałeś swoje pytanie, aby ograniczyć odpowiedzi do programistów C ++. Dla mojego tła / kwalifikacji: Obcinam zęby w C i mogę pisać w C ++, C # i Javie. I lubię ścigać się w wyścigach między wątkami, ponieważ uważam, że to dobra zabawa. Tak, trochę mnie kręci.

Twoja odpowiedź i decyzja dotyczy tego: to, czy ktoś może się zmienić, zależy od osoby i tego, czy chce się zmienić.

Ale zacznijmy od kilku pytań:

  1. Czy zapytałeś go o kod i przykład, o którym wspomniałeś? Jakie było jego zdanie na temat recenzji?
  2. Czy w ciągu tych 6 miesięcy podałeś mu szczegółowe informacje na temat rozumienia manipulacji pamięcią i upewnienia się, że w jego kodzie nie ma wycieków pamięci?
  3. Czy dostarczyłeś dość częste informacje zwrotne w ciągu tych 6 miesięcy, aby wskazać, czy robił postępy?
  4. Czy wyraźnie wołałeś, że jego stary sposób kodowania nie jest już akceptowalny w nowym kodzie?

Musisz upewnić się, że możesz odpowiedzieć „tak” na wszystkie te pytania. Jeśli nie, nadal spoczywa na tobie ciężar dowodu na komunikację z nim.

Jego odpowiedź na twoją ostatnią recenzję będzie najbardziej wymowna.

Jeśli próbował i wykazuje pewne oznaki postępu, być może musisz przejrzeć proces mentoringu. Jeśli już, może powinieneś rozważyć powiązanie go z bardziej doświadczonym programistą, aby mógł uzyskać natychmiastowe informacje zwrotne podczas podejmowania decyzji projektowych. Nie jestem fanem programowania par, ale w takim przypadku może być to bardzo przydatne. Ciągłe wysyłanie go, by wprowadzał coraz więcej poprawek do starego kodu, nie zawsze jest praktyczną drogą do nauki.

Jeśli nie próbował, musisz lepiej zrozumieć jego motywację. Czy nie zrozumiał, że musi bardziej się postarać? Czy to go nie obchodzi? Czy są jeszcze inne obszary w zespole, w których jego umiejętności byłyby lepiej dopasowane i jest tym bardziej zainteresowany? Jeśli nie chciał spróbować, musisz zrozumieć, dlaczego.

Stamtąd będziesz wiedział, czy chce się zmienić i czy może się zmienić. Brak chęci zmiany jest równoznaczny z niemożnością zmiany. Jeśli jest chęć i stopień postępu, zastanów się nad zmianą sposobu, w jaki próbujesz go zrehabilitować.


źródło
1
+1 za „Ciągłe wysyłanie go, by wprowadzał coraz więcej poprawek do starego kodu, nie zawsze jest praktyczną drogą do nauki”
Bill
+1 za ostatnie akapity. Postęp osiągnięty przez kogoś w porównaniu z wysiłkiem włożonym w ukierunkowanie, że ktoś musi wziąć pod uwagę każdą ocenę wydajności.
Marjan Venema
10

Obawiam się, że jego zły kod nie jest jedynym problemem w twoim zespole.

  1. Kto przegląda jego kod? Dlaczego wymknął się bez ostrzeżenia za zaakceptowanie kodu z luką wycieku pamięci?
  2. Dlaczego testy warunków skrajnych nie wykryły tego problemu? Czy korzystasz z nich? Jeśli tak, to dlaczego nie działają?
  3. Przez długi czas pozostawał bez opieki. Dlaczego?
  4. Nie używa narzędzi, które mu dałeś. Jak zmotywowałeś go do korzystania z odpowiednich narzędzi?

Mówisz, że był w firmie przez dłuższy czas. Zwolnienie takiej osoby rzadko jest dobrym pomysłem (chyba że jest to pracownik typu Wally). Ich wiedza o potrzebach klientów, posiadanych produktach itp. Jest często o wiele cenniejsza niż kod, który piszą.

Rozwiązania:

  • przenieś go do kontroli jakości, aby mógł dowiedzieć się, czego unikać
  • sparuj programowanie z kimś, kto potrafi wskazać jego błędy
  • rozszerzony wysiłek kontroli jakości jego kodu
  • zmuszaj go do pisania testów warunków skrajnych, jeśli zobaczy, że jego maszyna deweloperska uległa awarii po utworzeniu i zniszczeniu 10 000 obiektów, może się nauczy
  • kilka / wszystkie powyżej :)
Andrzej Bobak
źródło
3

Podjęcie decyzji o zwolnieniu każdego jest trudną decyzją dla każdego. Na twoją sytuację składa się kilka czynników:

  1. Wygląda na to, że ten programista działa w firmie od kilku lat
  2. Deweloper pisze wszystkie firmowe kody C ++
  3. Wygląda na to, że przed tobą nikt nigdy nie omawiał poziomu słabego kodu z deweloperem
  4. Jako nowy menedżer nie masz pojęcia, kto / co programista wie w / o firmie i jakie są polityczne konsekwencje zwolnienia programisty

To powiedziawszy, że spędziłeś ostatnie 6 miesięcy, pokazując programistom błąd jego sposobów, a jego nowy kod jeszcze się nie poprawił.

Na tym etapie naprawdę musisz zacząć proaktywne zarządzanie, abyś mógł to zrobić w ciągu 3 miesięcy

  • Przyzwoity programista C ++, który wie, co robi

lub

  • Zakończyłem programistę.

Aby to zrobić, musisz jednak usiąść z programistą, wyjaśnić, co jest nie tak w piśmie / e-mailu, wyjaśnić, w jaki sposób programista może poprawić i bardzo bardzo wyraźnie stwierdzić, że jeśli oczekiwana poprawa nie nastąpi, zostanie rozwiązany w 3 miesięcy.

Musisz również jasno powiedzieć, że od tego momentu oczekuje się poprawy w pozostałej części jego pracy w firmie, a nie tylko na 3 miesiące!

Powinieneś także poinformować o tym swojego kierownika i dział HR (jeśli istnieje).

Podczas tego procesu będziesz musiał aktywnie zarządzać programistą i przeglądać zadania / kod co 1-2 dni i upewniać się, że wszystko jest w porządku, szczegółowo opisując te, które nie są, i wyjaśnić, co można zrobić, aby je ulepszyć.

Armitage
źródło
1

Albo nie masz jasności co do tego, jak poważnie traktujesz jego słabe wykonanie (tzn. Możliwe, że widzi, ile czasu spędziłeś z nim jako opcję, jeśli chce poprawić, a nie absolutną konieczność), albo ma niewiarygodnie złe podejście, które jest niezrównoważone. Jeśli nie jest jeszcze jasne dla tego programisty, że rozważasz jego pozycję w tej sprawie, musisz to wyjaśnić (zakładając, że twoje przywództwo jest w porządku z twoim upoważnieniem do rozwiązania). Szok przyniesie nadzieję na zmianę.

Jednak decyzja o zatrudnieniu ma znacznie szersze implikacje niż tylko ten facet, musisz wziąć pod uwagę wpływ na zespół. Jeśli pozwoli mu się rozwinąć jego postawa, może to oburzyć innych lub sprawić, że inni też poczują, że tego rodzaju rzeczy są w porządku. Jednak z punktu widzenia zespołu musi być absolutnie jasne, że jeśli odszedł, to z właściwych powodów i miał wiele okazji do poprawy.

Jednym z klejnotów, który podniosłem na kursie wiele lat temu, jest fakt, że ludzie z wiedzą techniczną, której inni nie mają, mogą poprowadzić kierownictwo, aby dać im luz. To źle dla zespołu. Możesz bać się utraty jedynego programisty c ++, ale można je zastąpić. Oczywiście istnieje nieodłączne ryzyko, jeśli dobrze zna wypuszczone produkty, ale często widziałem osoby z pozornie niezastąpioną wiedzą na temat produktu / wiedzy technicznej wymieniane łatwiej niż się spodziewano. Zespoły i organizacje często mogą wypełnić luki, które początkowo wydają się trudne do wypełnienia. Oczywiście, jeśli nie ma on umiejętności w języku C ++ lub wiedzy specyficznej dla organizacji, którą trudno będzie zastąpić, problem jest znacznie mniejszy!

Wayne M.
źródło
1
Podejrzewam, że ten facet byłby całkowicie oszołomiony, gdy dowiaduje się, że jego menedżer chce go zwolnić. Niektóre osoby, które musisz po prostu uderzyć w głowę deską i wyprostować, mówią im, że muszą się poprawić, inaczej zostaną zwolnieni.
HLGEM,
0

Oczywiście, że nie powinieneś. Pamiętaj, że to nie jest organizacja charytatywna, wymieniasz pieniądze na pracę. Jeśli nie trzyma swojej strony umowy, to jak każda transakcja, którą przestałbym płacić.

MetaGuru
źródło
-1

Jeśli chcesz dać mu szansę, opracuj ustandaryzowany test, który zbiera dane dotyczące wycieku pamięci. Monitoruj swoje postępy co tydzień, nalegając na zobaczenie kodu , który zmienił, i szukaj ulepszeń. Jeśli nie da sobie rady w tym momencie, zwolnij bezużytecznego inwentarza.

Jack Aidley
źródło