Jak powstrzymać pracownika od trzymania firmy jako zakładnika?
Pracuję w zespole, który pisze oprogramowanie ułatwiające pracę jednej z kluczowych jednostek biznesowych firmy. Dołączyłem do zespołu kilka miesięcy temu i dowiedziałem się, że w moim zespole jest duża rotacja dzięki jednej osobie. Ta osoba (nazwijmy ją Panem A) jest w firmie od 7 lat, jest bardzo trudna w pracy i wielokrotnie podejmuje złe decyzje celowo, aby utrzymać produkt software'owy niestabilny, trudny w utrzymaniu i rozwiązywaniu problemów. W ten sposób, gdy pojawia się problem, tylko on może go naprawić.
Odszedł z firmy kilka lat temu, ponieważ firma nie pozwalała mu na pracę w domu, ale gdy tylko odszedł, firma musiała go zatrudnić z powrotem (i pozwolić mu na pracę w 100% z domu), ponieważ oprogramowanie miało problemy i nikt nie wiedział jak je naprawić.
Mój menedżer wie o tym, ale mówi, że nie ma nic, co mógłby zrobić z Panem A.
Co mogę zrobić, aby naprawić tę sytuację? Chcę, aby oprogramowanie było nowoczesne, łatwe w utrzymaniu i stabilne.
FYI, oprogramowanie monitoruje zdarzenia, przetwarza je, a następnie podejmuje odpowiednie działania. Pan A ma:
- Celowo trzyma się z dala od nowoczesnych frameworków programistycznych;
- Pisze podstawową logikę biznesową w językach, które nie mogą być przetestowane;
- Zarcharchitekturyzował komponenty oprogramowania na 30 modułów, aby zwiększyć złożoność i problemy z certyfikacją wersji; oraz
- Zaprojektował je w sposób nieskalowalny, zapewniając brak możliwości HA (wysokiej dostępności).
Aktualizacja:
Jeśli chodzi o kod niesprawdzalny, logika biznesowa jest przenoszona z Javy do skryptów groovy osadzonych w XML. Testy jednostkowe kodu Java zostały odrzucone.
Jeśli chodzi o modułowość/złożoność, każdy moduł otrzymał swoje własne repo git i ma swoją własną wersję. Teraz tylko Pan A wie, które wersje są kompatybilne razem. Nie możesz wydać wersji 2.0 produktu i wdrożyć wszystkich modułów 2.0. Musisz wydać moduł A 2.0, który będzie współpracował z modułem B 1.0-2.0 i modułem C 1.0-1.5. Dla mnie jest to zły projekt, wszystko powinno być wydane pod jednym repo jak Spring framework (Spring 5.0 oznacza Spring-Core-5.0, Spring-Context-5.0, Spring-Web-5.0, Spring-Security-5.0, etc).
Manager mówi, że nie może nic z tym zrobić, ponieważ pan A został zwolniony na początku, ale potem, kiedy pojawiły się problemy, musiał zostać wezwany do naprawy. Więc produkt nie może być utrzymywany bez niego.
Widzę to jako mój problem, ponieważ nie chcę porzucić menedżera, ponieważ był dla mnie bardzo miły. I moim pierwszym instynktem jest rozwiązanie problemu, a nie porzucenie go, chociaż widzę, że porzucenie go byłoby naprawdę łatwe, a część mnie kusi, aby to zrobić.
Inni opuścili zespół z jego powodu, ponieważ podczas lunchu jest tym, na co wszyscy narzekają. Za każdym razem, gdy odbywa się spotkanie z panem A, ludzie wychodzą z niego potrząsając głową (przez wiele godzin).
2nd Update:
HA jest skrótem od High-Availability. W Architekturze Oprogramowania oznacza to tworzenie oprogramowania w taki sposób, że może ono być hostowane/odrzucane w środowisku produkcyjnym w sposób redundantny, więc jeśli jedna z jego instancji ulegnie awarii, druga (lub inne) może (mogą) przejąć obciążenie, co skutkuje zerowym czasem przestoju. Użytkownik końcowy nie wiedziałby nawet, że coś poszło nie tak.
Regarding: To wydaje się być normalna duża baza kodu. Nie wydaje mi się, aby to było spowodowane dużą bazą kodu, ponieważ produkt nie jest tak bogaty w funkcjonalność. Jest to system backendowy, który przetwarza dane. Inne firmy mają podobne produkty, aby zaspokoić swoje potrzeby biznesowe, są w stanie zrobić to przy użyciu nowoczesnych opcji HA/Scalable, więc nie rozumiem, dlaczego ten zespół musi zrobić to w Java 6 bez HA/Scalability.
3rd Update:
Regarding ‘Do latest versions of all modules work together?’: Niekoniecznie. Odwołuje pewne moduły w prodzie, jeśli wykryto jakiś błąd, ale odwołuje się, ponieważ pewne wersje modułów nie są kompatybilne. Tego wszystkiego można by uniknąć, gdyby wszystkie moduły były wersjonowane i wydawane razem, ponieważ wtedy cały produkt zostałby przetestowany i jako całość gwarantowałby pewną funkcjonalność. W innych firmach/projektach, w których pracowałem, właśnie w ten sposób mogły one z łatwością rozwijać i wdrażać znacznie bardziej złożone projekty.
@pipe: Nie jestem świeżo po ukończeniu szkoły. Pracowałem w różnych firmach i przy dużych projektach przez ostatnie 10+ lat i wszystko, co widzę w propozycji Pana A jest sprzeczne z konwencją i zdrowym rozsądkiem. 30 modułów (w osobnych repozytoriach) było tym, jak pierwotnie założył drzewo źródłowe. Mądry programista, który był w zespole przez rok, widział problemy z kompatybilnością i dążył do połączenia wszystkiego w jedno repo, tworząc wielomodułowy projekt maven. Ten programista zmęczył się naturą pana A., więc znalazł pracę w jednej z 5 najlepszych firm IT. Nie wymienię tej firmy, aby zachować anonimowość, ale przez 5 najlepszych firm IT rozumiem Microsoft, Google, Apple, Facebook i Amazon. Więc to deweloper nie był głupi ani nie był niekompetentny. Miał 8 lat albo doświadczenie. Pan A odwrócił tę zmianę do poprzedniego stanu, 30 modułów w osobnych repozytoriach. Więc te 30 modułów nie zostało dodanych, aby obsłużyć złożoność dużej bazy kodów. Zostały one wprowadzone, aby zapewnić, że istnieją problemy z kompatybilnością w prod. Niepotrzebna złożoność.
Więcej na temat “Dlaczego to jest twój problem?”: Kiedy rozmawiam z developerami, którzy pracują (lub mają przyjaciół, którzy pracują w) Microsoft, Google, Amazon, Facebook, Apple; Mówi się mi, że często spotykasz ludzi, z którymi trudno jest pracować. Postrzegam tę sytuację jako wyzwanie, któremu będę musiał stawić czoła wielokrotnie, gdziekolwiek pracuję, bez względu na to, jak wspaniała jest firma. Muszę więc wiedzieć, jak właściwie sobie z tym poradzić, aby nadal rozwijać się w mojej dziedzinie.
Cel (dla utrzymania tego pytania na czasie):
Zadaję to pytanie, aby wiedzieć, jaki jest najlepszy sposób radzenia sobie z takimi sytuacjami, jak ta opisana powyżej, aby osiągnąć cele przedstawione poniżej. Wierzę, że trudnych współpracowników nie da się uniknąć, więc bazując na doświadczeniu innych, być może wszyscy możemy się czegoś nauczyć.
Poprawić stabilność produktu poprzez zminimalizowanie kodu spaghetti i niepotrzebnej złożoności, zgodnie z życzeniem kierownictwa.
Uczynić go HA, zgodnie z życzeniem kierownictwa.
Wykorzystać nowoczesne frameworki i specyfikację językową (Java 6 vs Java 8), aby nowi programiści byli łatwo dostępni na rynku i mogli być produktywni szybciej.
Wyeliminować zależność od jednej osoby.