Pytanie:
Jak rozmawiać z kierownictwem o kodzie „genialnym”?
NonCreature0714
2018-04-26 13:23:44 UTC
view on stackexchange narkive permalink

EDIT:

Dziękuję wszystkim za wspaniałe rady, komentarze i opinie.

Okazuje się, że w tej sytuacji nikt nie był „złym gościem”. Rada, którą tu otrzymałem, pomogła mi w ponownym skontaktowaniu się z poprzednim kierownikiem projektu. Okazuje się, że moja firma, bez wyraźnego powodu, otrzymała wczesną „w fazie rozwoju” wersję kodu. Stara firma przesłała nam wersję gotową do produkcji i, jako wisienka na wierzchu, publicznie pochwaliła mnie za efektywną inżynierię wsteczną niekompletnego produktu na taką głębokość, na jaką miałem.

TL; DR

Odziedziczyłem projekt. Krótko mówiąc, kod, który mam utrzymywać, jest zły. Tak zły, w rzeczywistości produkt jest nie tylko niekompletny, ale niefunkcjonalny i działa od lat.

Jak komunikuję się z kierownictwem w sposób, który nie jest żenujący do nich w sposób, który nie sprawia, że ​​wyglądam na leniwego lub głupiego, że wartościowy produkt jest w opłakanym stanie?


Wyjaśnienie: to pytanie a dług techniczny

To pytanie wiąże się z podważeniem długotrwałych przekonań na temat produktu bez popełnienia samobójstwa zawodowego.

Zamiast zajmować się wyłącznie zadłużeniem technicznym, jest następujący: kierownictwo sugeruje, że być może kod jest tak złożony, że nie mogę go zrozumieć, i zakłada, że ​​błędy są zamierzone; że pierwotny programista jest tak meta, że ​​to, co wygląda na błędy, jest w rzeczywistości przejawem geniuszu.

Być może jest to kolejny powód, dla którego nie Jeśli chodzi o dług techniczny, różnica między kodem „genialnym” a długiem technicznym jest taka że kierownictwo informuje, że nie powinienem zmieniać kodu „genialnego”, a kod „geniuszu” nie jest długiem technicznym: to tajemna czarna magia. Chciałbym, żeby kierownictwo uważało to za dług techniczny. Zamiast tego nie robią tego.

Kierownictwo nie przejmuje się bezpośrednio czasem, kosztami ani pieniędzmi –– chociaż to pewna obawa.


Szczegóły

Przez większość czasu nie denerwowałbym się informując o tym kierownictwo. Niestety, długa kolejka prac konserwacyjnych wykonywanych przez ludzi, z których niektórzy mieli niewielkie doświadczenie w programowaniu, którzy tylko „dotykali” kodu wystarczająco długo, aby dodać łatkę tu czy tam, a następnie przejść dalej, przez lata namalowała obraz kierownictwa że projekt jest tylko o jeden krok gotowy do produkcji.

Niestety, tak nie jest. Krótka lista problemów w genialnym kodzie , na które natknąłem się w bazie kodu ~ 1,5 Gb, to ...

  • Są ta sama funkcja, te same nazwy zmiennych o tym samym zakresie w całej bazie kodu (w języku, który tego nie obsługuje).
  • Funkcje są zdefiniowane, ale nigdy nie są wywoływane.
  • Niesprawne zmienne użycie i inicjalizacja.
  • Niezgodne wersje używanych bibliotek.
  • Zakodowane na stałe identyfikatory URI i adresy IP bez dokumentacji, co robią.
  • Losowo żądane trasy API które nic nie zwracają lub bełkot; które nie są wtedy używane.
  • Zakodowane, niezaszyfrowane hasła i prywatne klucze SSH.

Powinienem dodać, że kiedy zacząłem nad nim pracować, nawet się nie skompilował. A kiedy udało mi się to skompilować, nie udało się runtime.

To koszmar.

Problem w tym, że kierownictwo otrzymało zapewnienie od kogo go odziedziczyło, a także od poprzednich programistów „gung-ho”, że „działa, ”Więc zainwestowaliśmy w to dużo… A teraz pieniądze są przekazywane na mnie. Chcą, żeby był w produkcji za około 2 miesiące.

Kiedy sugeruję, że poprzedni programiści mogli nie być do końca szczerzy lub nie do końca rozumieli produkt, kierownictwo wysyła mieszane sygnały: „po prostu zrób to” i „dlaczego jeszcze nie jest to zrobione” ... i „my” nie jestem pewien, czy to kiedykolwiek zadziałało ”na„ działało, kiedy je otrzymałeś ”i„ nigdy nie widzieliśmy, jak działa ”na„ jest już w produkcji ”.

[EDYCJA: wklejono większość następny akapit w sekcji TL; DR.]

Kierownictwo zasugerowało również, że być może jest to tak skomplikowane, że nie mogę go zrozumieć, i założył, że błędy są zgodne z projektem; że oryginalny programista jest tak meta, że ​​to, co wygląda na błędy, jest w rzeczywistości przejawem geniuszu. To prawda, nie jestem geniuszem, i może tak jest: czemu przedstaw moje poprzednie spostrzeżenia na temat bardzo fundamentalnych kwestii, które znalazłem.

Być może polityka jest ważniejsza niż mój poziom.

Komentarze nie służą do rozszerzonej dyskusji;ta rozmowa została [przeniesiona do czatu] (https://chat.stackexchange.com/rooms/76617/discussion-on-question-by-noncreature0714-how-to-talk-to-management-about-geniu).
@Law29 Myślę, że to, na co zwracasz uwagę, dotyczy tego: kierownictwo myślało, że otrzymuje ** tylko ** produkt konserwacyjny gotowy do produkcji, zamiast tego dostał coś, czego nawet nie da się utrzymać.
Jesteś programistą, czy możesz popełnić samobójstwo w karierze, mówiąc ludziom, że ich kod jest śmieciem?Jestem prawie pewien, że musisz wspomnieć o niepopularnych opiniach politycznych lub społecznych, aby zniszczyć swoją karierę jako programisty.
Dziewiętnaście odpowiedzi:
user44108
2018-04-26 14:05:03 UTC
view on stackexchange narkive permalink

Nie jest to kodowanie „genialne”, jeśli nie może nim zarządzać nikt poza oryginalnymi programistami (jeśli pamiętają, co zrobili i dlaczego).

Wniosek jest taki, że ci geniusze weszli do kodu -base, dodał ich zmiany, przetestował je jednostkowo bez większego względu na to, czy ich kawałek geniuszu przeszkodził w kawałku geniuszu innego gościa i całkowicie go złamał. I zgaduję (z nastawienia gung-ho), że nie ma dokumentacji zmian ani zaktualizowanej dokumentacji funkcjonalnej, więc nikt nie wie, jakie zmiany zostały wprowadzone, przez kogo, w jakim celu, ani kto je podpisał.

I to jest linia, którą kierujesz do zarządzania

To może być genialne, ale nie da się go utrzymać.

Na razie wszystko, co możesz zrobić, to w jakiś sposób sprawić, by działało przed upływem terminu, a następnie przeanalizować, jak to działa, i umożliwić jego konserwację etapami.

Jeśli naprawdę nie można zmusić do pracy przed rozpoczęciem produkcji, to Ty musisz wydać „No Go” i podać przyczyny. Miejmy nadzieję, że kierownictwo zrozumie i opóźni wdrożenie.

Zignoruj ​​w tym politykę - na tym polega praca twojego kierownika. Po prostu powiedz mu fakty i pozwól mu uporać się z opadem.

Komentarze nie służą do rozszerzonej dyskusji;ta rozmowa została [przeniesiona do czatu] (https://chat.stackexchange.com/rooms/76635/discussion-on-answer-by-snow-how-to-talk-to-management-about-genius-code).
„Użyłem tej dokładnej linii podczas dzisiejszego spotkania, a kierownictwo od razu było otwarte i zadawało dobre pytania._NonCreature0714_ (OP) - świetnie!Dzięki temu możesz również uniknąć utraty twarzy przez kierownictwo, jednocześnie udzielając odpowiedzi!
„przetestowali je w jednostce” Mam wrażenie, że przeceniasz to, co zrobili.
`@ignoreCodeCoverageStart` {rzeczywisty kod}` @ignoreCodeCoverageEnd` ;-)
Ralph Bolton
2018-04-26 18:06:48 UTC
view on stackexchange narkive permalink

Zgodnie z ogólną zasadą kierownictwo „chce rozwiązań, a nie problemów”. W związku z tym stwierdzenie „w kodzie są zakodowane na stałe sekrety” jest problemem, podczas gdy „Napraw błąd regulacyjny dotyczący zakodowanych na stałe sekretów: 0,5 dnia” jest rozwiązaniem.

Odpowiednia ocena zajmie mi kilka godzin kod i udokumentuj wszystkie rzeczy, które chcesz zmienić / naprawić, aby uczynić z niego „minimalny opłacalny produkt”. Jeśli istnieją jakieś obiektywne narzędzia do analizy statycznej, które mogą Ci w tym pomóc, to tym lepiej - 100 problemów związanych z bezpieczeństwem w Code Climate lub czymkolwiek innym jest trudniej dyskutować niż Twoja profesjonalna opinia. Jednak twoja opinia się tutaj liczy i próbujesz dokonać uczciwej oceny.

„Minimalny opłacalny produkt” (MVP) to termin nieco subiektywny. To naprawdę do Ciebie, abyś zrobił tyle, ile wystarczy, aby uruchomić coś w wersji produkcyjnej i pozwolić niektórym lub wszystkim proponowanym użytkownikom przyjrzeć się temu. Administrator systemu może co godzinę uruchamiać kroczące ponowne uruchamianie, a przez cały kod mogą być zakodowane na stałe konfiguracje i wpisy tajne, ale dopóki nie pokaże niewłaściwej osobie danych konta bankowego, jest gotowy do pracy. Później naprawisz wszystkie błędy, problemy i słabe praktyki.

Teraz masz listę (zaległości), którym musisz nadać priorytet. Szacunki są trudne, ale spróbuj oszacować, ile pracy prawdopodobnie będzie wymagał każdy element. Upewnij się, że oznaczysz to wszystko jako szacunki, a nie zobowiązanie.

Zapisz wszystko na piśmie - zacznij od jednego lub dwóch akapitów podsumowania problemów i rozwiązań. Następnie pełny „backlog” (z czerwoną linią, poniżej której znajdują się zadania, które możesz wykonać po przejściu do produkcji). Na koniec dodatki ze statyczną analizą kodu lub cokolwiek innego, co masz.

Następnie zarezerwuj trochę czasu ze swoim szefem i innymi osobami, które są naprawdę, odpowiednio istotne (uwzględnij wystarczającą liczbę osób, ale nikt, kto nie jest w 100%, nie musi tam być). Dołącz swój raport jako „przed przeczytaniem” do zaproszenia na spotkanie. Przedstaw swoje spostrzeżenia (podsumowując - nie więcej niż 10-15 minut rozmowy) i czekaj na pytania. Odnieś się do swojego raportu, podając jak najwięcej odpowiedzi.

Na koniec poczekaj na decyzję. To, jak reaguje twoje kierownictwo, jest ważne. Jeśli zdecydują się zainwestować w zaproponowane przez Ciebie rozwiązania, wszystko będzie dobrze. Jeśli zdecydują się tego nie robić, ponieważ zamierzają zastąpić rozwiązanie czymś innym, to jest w porządku. Jeśli próbują skłonić Cię do zrobienia czegoś „tanio” lub „szybciej”, niż proponowałeś, powinieneś dokładnie rozważyć swoje stanowisko, ponieważ proszą o nierealistyczne rzeczy i nie są przygotowani do zapewnienia im odpowiednich zasobów albo - to zwykle znak, że nie zdecydują się nagle na inwestycję, gdy kod znajdzie się w produkcji.

OP mówi, że podstawa kodu to 1,5 GB.Jeśli naprawdę jest to 1,5 GB przyrostu kodu, „prawidłowe oszacowanie” kodu nie zajmie kilku godzin, zajmie to większą część roku.
@Mark Punkt odniesienia: całe jądro Linuksa - rozwijane przez 25 lat, z obsługą dziesiątek platform i tysięcy urządzeń - to około 900 MB kodu źródłowego i 25,3 miliona linii.A baza kodów OP jest o około 60% większa niż ta…
Podoba mi się ta odpowiedź niż Snow.Śledź wszystkie raporty kompilacji, zwłaszcza te, które zostały skompilowane po raz pierwszy.Zapytaj poprzedniego gościa, jak skompilował, aby upewnić się, że nie robisz nic złego.Zidentyfikuj, które problemy są poważnymi problemami, które uniemożliwiają działanie kodu, i poważnymi problemami, które nie uniemożliwiają działania, takie jak niezaszyfrowane hasła lub elementy twarde.nie mów, że to nie zadziała, bo wyjdzie tak, jakbyś nie chciał, żeby to działało.ale pokaż, JAK możesz sprawić, że to zadziała.Tak jak powiedział @Ralph „chcę rozwiązań, a nie problemów”.wymień problemy, które są niezbędne, aby był w PROD.
OP prawdopodobnie zawiera stosy obrazów w tym 1,5 GB.Nie ma mowy, że to wszystko kod.
Zasada Sherwooda dotycząca szacowania czasu: Dokonaj jak najlepszego oszacowania, uwzględniając wszystkie rzeczy, które Twoim zdaniem mogą pójść źle.Podwój tę liczbę i użyj następnej większej jednostki.Trzygodzinna praca zajmuje 6 dni ....
„o ile nie pokaże niewłaściwej osobie danych konta bankowego” - dla tych, którzy śledzą wiadomości z Wielkiej Brytanii, jest to szczególnie aktualny komentarz.TSB właśnie podjął próbę wdrożenia nowego systemu informatycznego i nie sądzę, aby ktokolwiek spierał się z opisem „to nie był pełny sukces”.Jednym z zarzutów jest to, że właśnie to uczyniło (może to nie być poprawne i po prostu pokazywało powiązane informacje, a nie bezpośrednie relacje użytkowników - ale biorąc pod uwagę, że konsekwentnie kłamią co do powagi sytuacji, nie zrobiłbym tego)stawiam na to).
Nadużywasz „minimalnego opłacalnego produktu”.
Pracując po obu stronach, mogę powiedzieć, że to jest poprawna odpowiedź.Nigdy nie narzekaj na rzeczy bez jasnego sposobu ich rozwiązania, przez co wyglądasz na nieudolnego.Jeśli narzekasz, pamiętaj, aby poprzeć swoje opinie solidnymi uzasadnieniami i bardzo solidnym planem, w przeciwnym razie będziesz tylko marudzić w oczach kierownictwa.Wiem, że to subtelna różnica, ale bardzo ważna.
@EdmundReed wdrożenie naszego kodu w narzędziu do sprzedaży symulacji fizyki to 670 MB.100 MB na bazy danych (baza cenowa to ponad połowa tego).Cały GUI, dołączone obrazy to około 10 MB.Mogę w to uwierzyć, zwłaszcza biorąc pod uwagę ilość zbędnego kodu.
@SherwoodBotsford O rany, więc przeprojektowanie strony, które zakładamy, że zajmie cały rok, zajmie w rzeczywistości dwie dekady: O
Brzmi nieźle ...
@ESR oszałamiająco, było!W rzeczywistości zawierał małe jądro Linuksa z zastrzeżonymi konfiguracjami ... i kilka zmodyfikowanych plików open source.Jeśli chodzi o kod niezwiązany z jądrem i kod niezależny, projekt prawdopodobnie zawierał około 300 MB wewnętrznego oprogramowania deweloperskiego.Całkiem fascynująca rzecz, ale trudna krzywa uczenia się.(Nie zwracaj uwagi na wszystkie błędy i martwy kod).
Tschallacka
2018-04-26 17:02:06 UTC
view on stackexchange narkive permalink

Z praktycznego punktu widzenia:

Twoje kierownictwo nie wie nic o kodzie. To magiczne pudełko, które działa. Obiecano im to, prawdopodobnie widzieli prezentację na ten temat. Rzecz jest prawdziwa. Chcą tego. Zapłacili za to i teraz to musi działać.

Spotkałem się z tym, że musisz „obchodzić” zarządzanie, a nie włączać je do projektu lub podejmowania decyzji. Nie rozumieją twoich problemów, twoich potrzeb lub tego, co jest dobrą praktyką.
Zwykle nie obchodzi ich, jak długo to działa. Całość można napisać na nowo, o ile z pozoru wygląda jak rzecz.

Proponuję potraktować to jako nowy projekt.

  • Przeanalizuj, jaki powinien być cel tego przedsięwzięcia.
  • Sprawdź, czy możesz stworzyć coś w czystym kodzie.
  • Używaj złego kodu tylko jako odniesienia, aby dowiedzieć się, co o nim dyskutowano i jak powinien on funkcjonować w teorii.
  • Odzyskaj użyteczny kod, przerób go na coś praktycznego.
  • Zakoduj wszystko w sposób przejrzysty przez dwa miesiące.
  • Kiedy skończysz, powiedz kierownictwu, gotowe, coś działa.
  • W okolicznościach nie wspominaj, że stary kod został „zeskrobany”. Po prostu powiedz, że odnowiłeś go, aby dostosować go do specyfikacji.

Kierownictwo patrzy na czarną skrzynkę i mówi „hurra”.

„Przeanalizuj, jaki powinien być cel tej rzeczy”.Jak możesz to zrobić bez zgody kierownictwa?Czy nie wymagałoby to dostępu do ludzi, których albo nie ma, albo którzy oczekują zgody kierownictwa, aby odpowiedzieć na tego rodzaju pytania.
Zakłada się, że rzecz można zbudować w dwa miesiące ze złej specyfikacji, co wydaje się nieco optymistyczne.
Muszę powtórzyć tutaj @Erik.Problem polega na tym, że bierzesz na siebie odpowiedzialność, co jest szlachetne, ale lepiej bądź cholernie pewien, że możesz to zrobić na czas lub cała sprawa wygląda na twoją winę, a nie na ludzi, którzy powiedzieli, że zadziałało, gdy nie.t na pierwszym miejscu.
1,5 GB to dużo, to prawda, wymaga dużo smaru łokciowego ... ale op może również się rozpocząć, a po 2 tygodniach powiedzmy, że dwa miesiące jest nierealne ze względu na specyfikacje RODO, których nie ma w obecnym kodzie.Żartuję, ale tak zwykle zaczynam.Dzięki czystej podstawie, w której możesz po prostu wstawić rzeczy z projektu jako martwe zwłoki, z których pobierasz kończyny, zrekonstruuj je w celu wyczyszczenia kodu, może to działać niesamowicie szybko, w przeciwieństwie do naprawiania zepsutej rzeczy.Po prostu idź krok po kroku.
Obliczenie na odwrocie serwetki (3 LOC / godzinę, 80 znaków w wierszu itp.) Pokazuje, że projekt o wartości 1,5 GiB to zaledwie 3000 osobolat.Jeśli OP ma rację co do wielkości (co mam wątpliwości), zakończenie przed emeryturą jest optymistyczne ...
To spokojna gadka ;-).Ale trzeba gdzieś zacząć.I być może gdzieś jest pula czystego kodu, którego można użyć.A ile z tego 1,5 GB to biblioteki zewnętrzne, obrazy i szablony, testy jednostkowe i inne rodzaje kłopotów.
+1!Jeśli alternatywą jest założenie, że problem można naprawić w ciągu dwóch miesięcy z powodu złej specyfikacji, zaryzykuję każdą szansę, aby napisać to od nowa.Branie odpowiedzialności za problem to postawa dojrzała.Kod, który masz, nie jest tak ważny, jak problem, który masz.Czas spędzony na zrozumieniu kiepskiego, niesprawdzonego kodu może być stratą.Czas spędzony na zrozumieniu problemu nigdy nie istnieje.
@Euphoric Jeśli kierownictwo oczekuje, że będziesz utrzymywać projekt i przygotowywać go do produkcji, ale nie daje Ci środków do analizy celu projektu, coś jest naprawdę nie tak ...
Tak ... jeśli jest zgodne z opisem, to nie jest możliwe.Jedynym realistycznym celem jest próba odwzorowania postaci PO.OP powinien skupić się na tym, aby dużo się wyspać, zdrowo się odżywiać, poprawiać swoje CV, higienę, portfolio i tak dalej.Również @CandiedOrange ma świetny argument.Spróbuj zrozumieć problem i znajdź rozwiązanie.Wtedy do Ciebie należy decyzja, co zrobić z tymi informacjami.Biorąc pod uwagę to, co wiemy o sytuacji… Kto na to zasługuje…?
„Twoje kierownictwo nie wie nic o kodzie”.dokładnie jak ta lista
gnasher729
2018-04-26 14:00:41 UTC
view on stackexchange narkive permalink

Jeśli powiesz, że kod to śmieć, kierownictwo ma dwie możliwości: zaufać lub zwolnić. Brak zaufania i utrzymywanie Cię w projekcie nie jest racjonalnym wyborem.

A jeśli nie rozumiesz kodu, ponieważ jest zbyt sprytny (widziałem kod, którego nie chciałem zrozumieć, ale nie ma kodu, którego nie rozumiem), to kod ten musi być oddalony.

Jakie działania polecasz we współpracy z kierownictwem?
„Widziałem kod, którego nie chciałem zrozumieć, ale nie ma kodu, którego nie mógłbym zrozumieć”. Nie lekceważ potęgi * genialnego * nieudokumentowanego kodu.Czasami zrozumienie kodu, który chciałbyś napisać samemu od podstaw, zajmuje Ci wystarczająco dużo czasu.
Oprócz @PierreArlaud, czasami „genialny” kod jest tak okropny, że aby go naprawdę zrozumieć, trzeba zrozumieć rzeczy, których programista nawet nie rozumiał.Pracowałem nad projektem, w którym stosunkowo prosta funkcjonalność odwoływała się do setek innych obiektów z tysiącami połączeń i zawierała przypadkowe błędy zakleszczenia.Muszę więc nie tylko zrozumieć, co programista * pomyślał *, że zrobił ... ale co * faktycznie * robi ... i była to * prosta * aplikacja kilku tysięcy LOC.
Chciałbym zauważyć, że w niektórych krajach zwolnienie pracownika jest niedozwolone.To prawda, profil PO wskazuje, że znajdują się w USA, gdzie strzelanie jest możliwe (i łatwe, nawet).Jednak generalnie może się zdarzyć, że firma chciałaby cię zwolnić, ale po prostu nie może.
@PierreArlaud: Przez lata zdarzyło mi się to kilkakrotnie;przynajmniej raz okazało się, że genialny kod został napisany przeze mnie (a potem zapomniany) przeze mnie
@NPSF3000 Opisujesz „kod, którego nie chcę zrozumieć”.
@FabioTurati hmmm.Wtedy powinno być możliwe znalezienie pracy, a potem po prostu udawanie, że ktoś pracuje, ale w rzeczywistości nie pracuje i nadal otrzymywać wynagrodzenie?
@SargeBorsch W moim kraju (Włoszech) ten problem jest notorycznie plagą.Krótko mówiąc: jeśli Twoja firma przyłapie Cię na kradzieży, może Cię zwolnić.Jeśli istnieją możliwe do udowodnienia problemy finansowe, mogą cię zwolnić.We wszystkich innych przypadkach nie mogą cię dotknąć.Oczywiście jest to bardziej złożone, ale w tym tkwi sedno.
@FabioTurati to prawdopodobnie jeden z powodów, dla których * doradztwo * stało się ostatnio tak popularne w takich krajach;) Jeśli pracownik nie jest zatrudniony przez klienta, dla którego pracuje, to prawo pracy nie obowiązuje w ten sam sposób i można go odwołać z projektu.
@gnasher729 Tak więc znane wartości dla zajętego bobra kończą się na 4. Istnieje 28 maszyn ze stanami * 5 *, które zachowują się nieregularnie.To jest na tokarce z 2 symbolami.* Nikt * nie rozumie, co robi tych 28 maszyn (gdyby to zrobiły, wiedziałyby, czy się zatrzymały).Najdłużej zatrzymująca się maszyna Turinga z 6 stanami produkuje na taśmie ponad 10 ^ 10000 1 $.Jeśli nie widziałeś kodu, nie możesz go zrozumieć, nie szukasz wystarczająco uważnie.
Fałszywa alternatywa.Jak myślisz, dlaczego zarząd nie wie, że kod to śmieci?Niemniej jednak zależą od tego, a zadaniem PO jest uporanie się z tym.Może nawet oni nie oczekują, że odniesie sukces, ale po prostu rozdawanie, bo sprawy wyglądają na trudne, nie są tym, czego oczekujesz od inteligentnego pracownika.
SethWhite
2018-04-26 19:38:05 UTC
view on stackexchange narkive permalink

Czas rozwinąć swoje techniczne umiejętności pisania. Utwórz raport. Krótko wyjaśnij, że za 2 miesiące produkt nie będzie opłacalny. Następnie zaproponuj rozwiązanie lub rozwiązania w swoim raporcie i oszacuj termin i zalety / wady tych podejść. Na przykład:

„Opcja 1: całkowite przepisanie. Moje wstępne szacunki są takie, że zajmie to 11 miesięcy, ale pozostawi nam solidną, funkcjonalną i łatwą w utrzymaniu bazę kodu ”. (na marginesie, powodzenia w uzyskaniu akceptacji, każdy programista na świecie, który przychodzi do nowego projektu, chce napisać całkowicie od nowa)

„Opcja 2: rzuć więcej programistów na ten problem. Będziemy potrzebować X więcej programistów, aby udostępnić to za 2 miesiące. Będzie to kosztować więcej i stracimy czas poświęcony na inne projekty, ale (prawdopodobnie) wydostaniemy to z domu ”.

„ Opcja 3, pracuję najciężej i staram się, jak jak najwięcej. Nie sądzę, żebym mógł ukończyć cały produkt, ale oto przykład MVP, który moim zdaniem może zrobić. Czy są jakieś funkcje, które chciałbyś, abym nadał wyższy priorytet niż te, które tutaj przedstawiłem? ”

I tak dalej.

Następnie krótko opisz jako dodatek (w laika) problemy, które nam opisałeś, i rozważ dostarczenie referencji, abyś miał pewną wiarygodność w swoich argumentach.

Chodzi o to, aby natychmiast przedstawić rozwiązania, aby Twoi menedżerowie mogli nadać temu produktowi priorytet. Czy mogą czekać dłużej? Czy też muszą przeznaczyć na to więcej zasobów. Bądź rozsądny i profesjonalny.

Zredagowane, aby skupić się bardziej na oferowaniu rozwiązań zamiast krytykowania kodu, zgodnie z poniższymi komentarzami.

Jest tu podstawa dobrego pomysłu, ale (jak zbadano w innych odpowiedziach) skupianie się na subiektywnej jakości kodu, takiej jak nazwy funkcji, nie będzie miało wpływu na zarządzanie, kiedy prosisz ich o wprowadzenie 9-miesięcznegoopóźnienie uruchomienia.
@LightnessRacesinOrbit Nie chodzi o krytykę kodu.Celem krytyki kodu jest ustalenie potrzeby alternatywnych rozwiązań, a następnie dostarczenie potencjalnych rozwiązań.To przekonujący esej, jeśli wolisz.Kierownictwo przejrzy krytykę, ale rozważy rozwiązania.Żadne z rozwiązań nie powinno brzmieć: „Sprawię, że produkt będzie opłacalny za 2 miesiące”
Z tym na pewno się zgadzam.Aby jednak bronić powodów, dla których napisałeś raport i stawiając wyzwanie (w przeciwieństwie do „robienia po prostu tego, o co prosili”, co oczywiście byłoby ich preferencją), będziesz chciał przedstawić znacznie lepsze powody niż kod subiektywnyjakość (która, dobra lub zła, w ich oczach „możemy naprawić później”).To, że baza kodu nawet się nie kompiluje bez hakerów, jest dobrym powodem.
Podoba mi się ta odpowiedź, ponieważ w porównaniu z wieloma innymi, skupia się ona na pozytywnych, konkretnych rzeczach do zrobienia, zamiast lamentować nad losem programistów w piekle konserwacyjnym.Inną rzeczą byłoby sprecyzowanie potrzeby zatrudniania jednego z oryginalnych programistów na X dni w celu przekazania know-how, aby przyspieszyć działanie.
W przypadku opcji 2 polecam przeczytanie Miesiąca mitycznego człowieka, w którym wyjaśniono, dlaczego dodanie większej liczby zasobów początkowo spowalnia projekt i może nie cofnąć czasu.Zakładasz, że każdy nowy zasób będzie nadawać na tej samej długości fali co PO, nie będzie miał własnych opinii, programu politycznego (dźgnij w plecy PO i obiecuj kierownictwu, że może wykonać swoją pracę, podczas gdy PO nie może) i niebyć kolejnym „genialnym” programistą.
@CJDennis Opcje były głównie przykładami.Mam nadzieję, że OP ma lepszy wgląd w sytuację i może przedstawić bardziej szczegółowe plany niż ten, który przedstawiłem.
user86403
2018-04-26 18:19:47 UTC
view on stackexchange narkive permalink

Musisz podważyć reputację magicznego doodla.

Nie możesz im powiedzieć, że to jest do bani, ponieważ wtedy poczują się głupio i zdecydują, że ty jesteś głupi, aby mogli wrócić do czucia się mądrze.

Jeśli już to skompilowałeś, pominęłbym to. To była okazja, aby odkurzyć magiczny wystrój, ale teraz, kiedy go naprawiłeś, nie chcesz narzekać.

Zacząłbym od zakodowanego na stałe, nie- zaszyfrowane hasła. Przyprowadź ich do kierownictwa i zwróć uwagę, że może to spowodować wiele problemów. Napraw hasła i przejdź dalej.

Niewywołane funkcje i bełkotliwe API mogą poczekać. Jeśli tak naprawdę nic nie robią, prawdopodobnie nie mogą też niczego zepsuć . Przeniósłbym się do adresów IP lub bibliotek.

Kiedy znajdziesz problem z magicznym rysunkiem, poinformuj kierownictwo, a następnie powiedz im, jak go naprawiłeś . Z biegiem czasu Ty staniesz się ich magicznym wystrojem, co jest świetną rzeczą.

Wywołania API, które nic nie robią, mogą wiele zepsuć, jeśli API zwraca błąd lub pusty wynik i nie jest obsługiwane.Oczywiście zależy to od konkretnego przypadku użycia i języka.
To prawda, ale chcę podkreślić, że należy argumentować za rzeczami, które są absolutnie zepsute, a nie tylko okropnym pomysłem w sposobie przechowywania haseł.Problemy z uruchomieniem go mogą nadal być przydatne, jeśli można je wykorzystać do przeciwstawienia się twierdzeniom, że działało.Jeśli jeszcze tego nie robisz, prowadź dziennik rzeczy, które uważasz za zepsute, i informuj swoich menedżerów za pośrednictwem medium, takiego jak e-mail, gdzie nie można odmówić odbioru.Nie pozostawianie miejsca na dwuznaczność jest ważne, ponieważ ludzie, z którymi masz do czynienia, albo zaprzeczają, albo wprawiają cię w upadek.
@sdenham Jeśli OP używa kontroli wersji (co mam nadzieję, że byłoby to oczywiste), możliwość pobrania kopii przed dotknięciem kodu i wykazania, że zawodzi, powinna wystarczyć do udowodnienia tego, chociaż takt w tym przypadku prawdopodobnie będzienajważniejszy.
To bardzo dobra rada +1.Bardzo niewiele osób chce usłyszeć rzeczy, które sprawiają, że czują się oszukani lub powiedziano im, że otrzymali coś, co nie było tak dobre, jak obiecano.W takiej sytuacji ten, kto powie im prawdę, stałby się problemem ...
Stilez
2018-04-27 04:58:50 UTC
view on stackexchange narkive permalink

Umieszczenie problemów, które widzisz w ustrukturyzowanej formie, związanej z ich praktycznym wpływem na biznes, bardzo Ci pomoże:

Przemyśl problemy i dowody, które możesz znaleźć, i pogrupuj je w ten sposób :

  1. Obserwacje, które sugerują, że jeśli zostanie wprowadzony na rynek, nie będzie używany i wykaże luki . Nie można go skompilować. W kodzie są błędy logiczne. Dane wejściowe nie są sprawdzane. Dane nie są przetwarzane w sposób zapewniający wysokie prawdopodobieństwo braku korupcji. Brakuje aspektów bezpieczeństwa, a dane mogą zostać wyeksportowane / zhakowane. Nie można zagwarantować, że kluczowe funkcje będą działać z dobrego powodu, lub możesz pokazać kilka, które wypróbowałeś z nich, często nie działają zgodnie z przeznaczeniem. Takie rzeczy.
  2. Obserwacje sugerujące, że mogą istnieć problemy, które nie ujawnią się podczas testów, ale niosą ze sobą znaczne ryzyko problemów, jeśli zostaną wprowadzone na rynek . Podobnie jak powyżej, ale nr 1 to rzeczy, które znalazłeś, jest to dowód, który sugeruje, że należy spodziewać się / przewidywać / uważać znaczące nierozpoznane problemy za znaczące ryzyko. Na przykład, jeśli masz ustalone przypadki związane z nieprawidłowym przetwarzaniem w niektórych przypadkach walidacji danych, sugeruje to, że mogą istnieć inne przypadki i nie są znane, co może prowadzić do utraty / uszkodzenia danych. Jeśli zastosowali znane, przestarzałe / wątpliwe podejście do jednego problemu, oznacza to, że zrobili to samo w innych kwestiach. Jeśli baza danych podlega warunkom wyścigu / aktualizacjom niepodzielnym w jednym obszarze, sugeruje to ogólnie, że może to być problem w kodzie. A jeśli jest to wielu użytkowników, ale przetwarzanie po stronie serwera nie pozwala na subtelne zderzanie danych wejściowych / procesów wielu użytkowników, sugeruje to, że może spaść pod odpowiednim obciążeniem.
  3. Obserwacje sugerujące, że oryginalna załoga oszukała kierownictwo (celowo lub nie, a może po prostu nie będąc siłą i zbyt łatwo ją pominąć / zignorować: mogła to być wina kierownictwa, a nie ich!). W tej chwili poprzednia załoga jest darem od Boga dla kierownictwa, ponieważ dostarczyła lśniący produkt. Masz do nich wątpliwości, ponieważ mimo że jest to świetny produkt, nie jesteś szczęśliwy, nie możesz sprawić, by działał, nie rozumiesz itd. Ale jeśli masz obserwacje, które bezpośrednio zaprzeczają temu, co powiedzieli, stajesz się ten, który wie, co się dzieje, a but zwraca się przeciwko nim. Twoja praca staje się wtedy łatwiejsza. Na przykład, jeśli powiedzieli kierownictwu, że projekt ma odpowiednie zabezpieczenia interfejsu webUI i zauważysz miejsca, w których nie sprawdzili poprawności danych wejściowych / skryptu krzyżowego / wstrzyknięcia SQL, lub kierownictwo uważa, że ​​projekt poradzi sobie z pewną istotną rzeczą i możesz konkretnie pokazać, że może czego nigdy nie mógł zrobić, możesz pokazać kierownictwu, że zostali oszukani.
  4. Obserwacje, z których wynika, że ​​po wprowadzeniu na rynek zwykłe poziomy realizacji / oczekiwań / usług będą niepraktyczne / niewykonalne lub koszty będą znacznie wyższe niż oczekiwano . Na przykład, jeśli kod jest zbyt słaby lub brakuje w nim aspektów związanych z debugowaniem, wtedy gdy klient ma problem, nie będzie praktycznego sposobu śledzenia błędów, a naprawienie problemu może zająć tygodnie, a nie godziny. Jeśli kod jest powtarzany, oznacza to, że zmiany walidacji lub ulepszania struktur danych nie można wykonać „tylko w jednym miejscu”. Jeśli jest nieudokumentowany lub ma złą strukturę, wówczas próby jego ulepszenia lub ulepszenia będą bardzo utrudnione, ponieważ nie będzie praktycznego sposobu na dokonanie znaczącego rozwoju i upewnienie się, że wszystko się nie zepsuje, w przeciwnym razie sprawdzenie pęknięcia zajmie tyle czasu, że być nieekonomiczne. Jeśli to zły bałagan, to gdy pojawią się na rynku, będą polegać na tobie osobiście za każdym razem, gdy pojawi się problem; Ponieważ nie możesz zagwarantować, że będziesz tam w weekendy i 23:00 tylko z powodu jakiegoś terminu klienta, w którym wystąpił błąd, lub możesz wpaść w autobus, co zrobią? Jeśli dane można przesuwać, ale wymagają one nadmiernej ręcznej uwagi, wówczas w produkcji wsparcie może nie być w stanie skalować, aby to zapewnić lub zagwarantować, że będzie wystarczająco proste, więc błędy przetwarzania mogą być większe ryzyko. Jeśli zależy to od konkretnych platform, a te platformy nie są jasno zarządzane w kodzie, wówczas zmiany na platformach (aktualizacje systemu Windows, wersje przeglądarek, wersje bibliotek) mogą być niewykonalne w zwykłych lub komercyjnych ramach czasowych lub naprawienie tego, co zepsują, może być złożone , przez co klienci nie mogą obsługiwać ani używać swoich platform zgodnie z oczekiwaniami.
  5. Spostrzeżenia, które Cię po prostu denerwują . To twoja praca. Jeśli nie mieszczą się w powyższych kategoriach, napraw je najlepiej, jak potrafisz w wolnym czasie. Problemem kierownictwa są pierwsze 4 elementy powyżej, a nie to.

Pomogą Ci one dopasować techniczną i praktyczną perspektywę do perspektywy biznesowej. Jeśli potrafisz wykazać, że istnieją problemy w pierwszych 4 powyższych kategoriach i jasno je przedstawić, będziesz na dobrej drodze do rozwiązania swojego problemu - pokazując im dobre powody, dla których to ich problem, a nie twój brak

Jeśli umieścisz taką listę razem i wygląda ona atrakcyjnie, utwórz prezentację, przedstaw ją im i przeprowadź ich przez przykładowe problemy - w tym określony kod lub fragmenty przepływu danych, które ilustrują ten punkt.

Twoja prezentacja

Aby była skuteczna,

  • Znajdź innego programistę, któremu ufają - lub poproś o pozwolenie na przyprowadzenie kolegi na jeden dzień - i mieć kogoś, kto jest gotów cię wesprzeć. W ten sposób to nie wszystko, co mówisz; masz kogoś, kto może powiedzieć: „Tak, pokazał mi ten kod i przepraszam, nie przesadza z powagą”.
  • Spodziewaj się, że będziesz musiał trochę się uczyć - krótko. Nie są programistami, ale mają zdrowy rozsądek. „Dlatego używamy ustrukturyzowanego kodu, dokładnie tak, abyśmy mogli wykonać każde zadanie tylko raz, wyodrębnić części i mieć pewność, jak elementy oddziałują na siebie. Ale ci faceci nie, spójrz tutaj , tutaj i tutaj . Problem polega więc na tym, że w ich kodzie nie możesz zobaczyć, jak elementy oddziałują na siebie, lub jeśli występują błędy logiczne lub niespójności i nie można być pewnym, że niezależne części są naprawdę niezależne lub co trzeba zmienić gdzie indziej, jeśli coś wymaga zmiany, a nawet że będzie się zachowywać pod obciążeniami w świecie rzeczywistym, jak podczas testowania. Zakładając, że możemy to realistycznie przetestować, a także naprawić to w mniej niż 3 lata pełnoetatowej pracy zespołu dziesięciu osób, co jest wątpliwe. Właśnie dlatego profesjonaliści programują ostrożnie - ponieważ znamy w przeciwnym razie wpływ na biznes byłby poważny ”.
  • Spodziewaj się presji lub przymusu, aby powiedzieć, że nie jest tak źle. Mów otwarcie. - Przepraszam, cokolwiek ci powiedzieli, najwyraźniej nie jest to prawdą. Doceniam to, że jest to szok, ale jako profesjonalista, tak też jest. Powiedz im: „Nie, to nie jest praca wysokiej jakości, jest to niedbała praca przestępcza i okłamywano cię do końca”. (Tak, możesz powiedzieć, że dla podkreślenia, to nie tak, że mówisz, że są przestępcami !!) Powiedz „Tak, przepraszam, ale jestem pewien”.
  • Podaj szczegółowe informacje. Jeśli powiesz po prostu „klucze SSH są w postaci zwykłego tekstu”, to świetnie dla kogoś na twoim poziomie i widzisz to tak jak ty. Dla kierownictwa znajdującego się pod presją i wierzącego, że jest świetny i dlaczego tak się dzieje, jest to zbyt mało szczegółowe. Zamiast tego: „Klucze szyfrowania używane do blokowania panelu konfiguracyjnego klienta dla użytkowników zdalnych są przechowywane w niebezpieczny sposób, w sposób, który każdy z niewielką wiedzą graniczy z kryminalnym niechlujstwem. (Ponownie, tak, możesz powiedzieć, że dla podkreślenia nie tak, jak mówisz, że są przestępcami !!) . Jeśli spojrzysz tutaj (OK, nie mogą śledzić kodu, ale pobierają kod i i tak wskazują na ten fragment , ze względu na wiarygodność) zobaczysz, że klucz jest przechowywany w otwartym formacie. Nie wykonali nawet podstawowego szyfrowania z lat 90. Umieść to w Internecie, a dane klienta / użytkownika zostaną zhakowane, gdy tylko ktoś uzna, że ​​jest wart 10 to zajmie minut. " Pokaż im „Ponad tutaj , tutaj i tutaj możesz zobaczyć rutynowe wywołanie systemowe [API], które może, ale nie musi, nie działać w różnych przypadkach, ponieważ podano niepoprawne dane dla połączenia ”. Powiedz im: „To są podstawowe, fundamentalne błędy. Tak jest wszędzie”. Pokaż im „W tym module używają tej biblioteki, ale ponad tutaj używają tej biblioteki. Ale producent wyjaśnia, że ​​te dwie biblioteki nie są w rzeczywistości zgodne. Nigdy, przenigdy nie powinny być używane w tym samym kodzie, ponieważ mogą one pozostawić nieprawidłowe dane / mogą uszkodzić dane / ponieważ wynik jednej z nich będzie przetwarzane nieprawidłowo / uszkodzone / niewłaściwie obsługiwane, jeśli zostały przekazane drugiej stronie. " W ten sposób, aby mogli to zrozumieć i dostrzec znaczenie. Powiedz im: „Czy mogę to naprawić? Cóż, innymi słowy, jeśli ten kawałek jest tak okropny, jak myślisz, jak realistyczna jest ponowna instalacja całej infrastruktury bezpieczeństwa dla projektu w mniej niż 6 miesięcy?” Takie podejście. Pokaż im to.
  • Wybierz wstępnie przemyślane rozwiązanie. Co byś zrobił na ich miejscu? W rzeczywistości wybierz 3 rozwiązania i zalety / wady / przybliżone szacunki ich wpływu. Nigdy nie zapominaj, że opcje „nic nie rób” lub „mimo wszystko kontynuuj” to opcja , uwzględnij to (wraz z zaletami / wadami / zagrożeniami) również na swojej liście.
  • Daj im czas być zszokowanym, zdenerwowanym, zaprzeczającym i winnym. To ludzkie i oni też mają presję. Spodziewaj się, że to się wydarzy i albo usiądź, zaakceptuj ich szok, poprowadź ich obok niego, przypomnij im delikatnie, że poszukiwanie winy i autopsja mogą poczekać; w rzeczywistości nie rozwiązują problemów firmy. Bądź ich doradcą.
  • W razie potrzeby po chwili powiedz po prostu „Mam kilka propozycji rozwiązań. Żadne nie są idealne - idealnym byłoby, gdyby ten bałagan nie istniał. Ale są wykonalne. To był ciężki Poświęćmy 10 minut / Czy możemy spotkać się ponownie po krótkiej przerwie na kawę / po obiedzie / Mam spotkanie, spotkajmy się później, aby skupić się na rozwiązaniach i co robimy, aby to naprawić. ” Umieszczając to w osobne spotkanie po mentalnej „zmianie scenerii” - nawet po drugiej stronie przerwy na kawę - bardzo pomoże.
  • Mówienie, że masz rozwiązania, często może trochę poczekać, aż nastąpią pierwsze eksplozje, ponieważ ludzka reakcja często polega na zignorowaniu lub zaprzeczeniu potrzebie na wczesnych etapach. Dopiero gdy rozproszą część swojego zdenerwowania (jeśli są tego typu), warto to powiedzieć, ponieważ u tak wielu ludzi po prostu nie usłyszą tego, jeśli jest to powiedziane, gdy nadal są w gorącym, gniewnym, zawstydzonym trybie winy. Jeśli to nie jest problem, przejdź bezpośrednio do rozwiązań po wyjaśnieniu powagi / ryzyka uderzenia, jeśli uważasz, że słuchają.

Ostrożnie unikaj wszystkiego, co mogłoby sugerować, że jesteś perfekcjonistą lub robisz nie więcej niż minimum dla rentowności rynku. W tym momencie nic więcej niż to, co najważniejsze, nie jest priorytetem.

Przemyślane rozwiązania i prezentacja

Jeśli chodzi o wstępnie przemyślane rozwiązanie, moje byłyby dodatkowe zasoby. Jeśli ci nie uwierzą, i tak wszystko jest martwe (zakładając, że masz rację). Oprogramowanie się zatankuje, a skojarzenie cię spali: szukaj nowej pracy, zaczynając teraz. Ale jeśli po twojej prezentacji ci uwierzą, martwią się lub oczekują, że ty to naprawisz, przyniesie to twoją korzyść.

Ponieważ potrzebujesz zespołu . Powiedz coś takiego:

„Przepraszam, ale 1,5 G takiego kodu, bez podstaw i dokumentacji, zajmie około roku zrozumienie, może 5 lat, aby naprawić. Może przepisanie zajmie będą potrzebne i możemy zapisać to, co można ponownie wykorzystać, może tylko części GUI, podstawowe koncepcje przepływu danych, aby nie odkrywać na nowo koła, a następnie przerobić zaplecze i wszystko inne. ”

„ moim zdaniem pierwszym priorytetem jest ocena. Widzę, że jest źle, ale jak bardzo i jakie jest minimum, aby można było bezpiecznie rozpocząć produkcję? ” [odzwierciedla ich najwyższe obawy]

„Jak widzę, musimy wiedzieć, że w ciągu 4 do 6 tygodni - powiedziałbym, że 3 tygodnie, ale to główny zadanie samo w sobie i wymaga przeglądu linia po linii. Od 4 do 6 tygodni z zespołem 3-osobowym, a dowiemy się, jak duże są szkody ”. [Jeśli nie możesz lub jest zbyt duży, zastąp to, co jest rozsądne]

„W takim razie musimy to naprawić. Mogę zapalić świece, zastanawiając się, co zrobić , ale potrzebuję rąk na klawiaturach. Od 4 do 6 z nich, do 6 miesięcy ”.

[W razie potrzeby dodaj: „I potrzebuję do tego kompetentnego nr 2. Nie mogę przejrzeć wszystkiego, co włożyli, jedną ręką, jeśli również poruszam się po problemach i poprawkach. " ]

„To uciążliwe, że jest tak dotkliwy, ale tak właśnie jest i musimy najpierw wykopać się z dziury, a później wnieść winy i sporu sądowego. W tym celu daj mi na razie dwie osoby i budżet na kolejne 2 lub 4 za około 4-6 tygodni i zrobię to dobrze. Albo przynajmniej w minimalnym stopniu wykonalne ”. [Ponownie, jeśli nie możesz lub jest to zbyt duże, zastąp to, co jest rozsądne]

„Możesz również zapytać [nazwa kontaktu, który znają, kto jest dyrektor w jakiejś odpowiedniej firmie informatycznej], aby wysłać kogoś na jeden dzień, aby dokładnie sprawdzić mój początkowy widok, podejście i harmonogram, zanim ustalę budżet. To będzie dobre, a także uspokajające. Ale jeśli to się sprawdzi - i to będzie - wtedy musimy działać szybko, a jedyną rzeczą, która pozwoli nam zaoszczędzić czas na wprowadzanie na rynek, jest szybkie i intensywne wykorzystanie zasobów. ”

„ Moim zdaniem byłoby to rozsądne rozwiązanie . Nie możemy go wykorzystać w obecnym stanie i więcej tracimy na opóźnieniach i uszkodzeniach, niż oszczędzamy płacąc za wykonawców lub odciągając pracowników od innych prac. ”

„ Przepraszam, że przyniosę złe wieści. Dobra wiadomość jest taka, że ​​możemy wykopać się z dziury. ”

„ Pytania? ”

Doskonała odpowiedź.Jedyne, co chciałbym dodać, to podkreślenie, że Twój punkt nr 1 może zostać wykorzystany do zbudowania wiarygodności.Są to niepowodzenia, które OP może * łatwo zademonstrować * swojemu pracodawcy, przynajmniej częściowo, aby dostarczyć widocznych dowodów, że coś jest nie tak.
@jpmc26 OK.Miejmy nadzieję, że dowody nie znikną wtedy lub zostaną zwrócone przeciwko niemu.Zwykle złym pomysłem jest mówienie ludziom tego, czego nie chcą słyszeć.Na przykład, że zostali oszukani przez poprzednich facetów, którzy myśleli, że to, co zrobili, jest niesamowite.
Nacisk na konkretne zrozumiałe przykłady jest na miejscu.Jeśli nawet się nie skompilował, musieli przez jakiś czas utknąć w jakiejś kompilacji z przeszłości.Czy masz dostępną tę wersję?Jeśli tak, możesz wrócić do tego jako bazy i zmodyfikować stamtąd.Zwróć uwagę, że jakiekolwiek funkcje zostały „dodane” od tamtego czasu, nie zostały dodane.Jeśli możesz znaleźć przykłady, które według ludzi zostały dodane, ale ich tam nie ma, wzmocni to twoją pozycję.
J Fabian Meier
2018-04-26 16:42:30 UTC
view on stackexchange narkive permalink

Co chciałbym zrobić:

Umów się na spotkanie osobiście z menedżerem (Twoim szefem, kierownikiem projektu, kimkolwiek jest najbardziej odpowiedzialny za ten kod). Powiedz mu / jej miłymi, ale jasnymi słowami, że kod nie działa, a naprawienie go nie będzie kwestią tygodni. Jeśli on / ona ci nie wierzy, zaproponuj, że pokaże to innym programistom w celu uzyskania drugiej opinii.

J...
2018-04-26 16:42:02 UTC
view on stackexchange narkive permalink

To, co myślisz i co myśli kierownictwo, nie ma znaczenia. Mają produkt, który chcą dostarczyć, a Ty masz stos odziedziczonego kodu, który podjął pewną próbę stania się tym produktem.

W obecnym stanie albo działa poprawnie jako ten produkt, albo nie. Jeśli tak się nie stanie, pozostaje opracowanie planu wykorzystania posiadanych zasobów (czasu i umiejętności oraz wszelkich przydatnych składników odziedziczonego kodu) w celu wyprodukowania tego produktu. Nie warto rozwodzić się nad niedociągnięciami kodu, który odziedziczyłeś - ważne jest, aby opracować plan przekształcenia go w produkt, którym miał być.

Twoje kierownictwo chciałoby, aby wydarzyć się w określonym czasie. Albo możesz zarządzać swoim czasem, aby osiągnąć ten cel, albo nie. Jeśli nie możesz, potrzebujesz więcej zasobów i musisz ich o tym poinformować. Jeśli więcej zasobów nie jest dostępnych, należy poświęcić termin. To naprawdę takie proste. To, czego chcą od Ciebie, to plan - musisz dowiedzieć się, jak można to zrobić. Rozważanie wszystkich powodów, dla których nie można tego zrobić, nie jest konstruktywne. Tak właśnie jest - musisz sobie z tym poradzić i iść do przodu.

„potrzebujesz więcej zasobów” Podejrzewam, że za 2 miesiące żadna ilość dodanych zasobów nie będzie pomocna.Ale prawdopodobnie jestem tam daleko od celu.
@TheoreticalPerson Nie wiemy nic o projekcie ani jego stanie poza tym, co powiedział OP, co nie jest zbyt wiele.Nie sądzę, aby jakiekolwiek spekulacje na temat tego, jak osiągalny jest cel, będą bardzo przydatne.
„* Albo możesz zarządzać swoim czasem, aby osiągnąć ten cel, albo nie możesz *”.OP nie jest menadżerem, nie jest opłacany za odpowiedzialność managera, więc rozsądnie odpowiedział na to szczerze z góry „nie mogę” i pracuje od tego… zadając to pytanie na SE.„* To, czego chcą od ciebie, to plan *” cóż, nie, OP wyraźnie mówi, że komunikacja nie dociera nawet do punktu żadnego nowego planu.
To, co myśli kierownictwo - a zwłaszcza gdy jest to niezgodne z rzeczywistością - jest nie tylko istotne, ale ma kluczowe znaczenie dla problemu.
aw04
2018-04-26 18:37:54 UTC
view on stackexchange narkive permalink

Są dwie rzeczy, które chciałbym tutaj zrobić:

  1. Skonfiguruj sytuację. Jest kilka czerwonych flag, więc ważne jest, aby nie mówić nic, co mogłoby nikogo poprowadzić lub zapewnić, że wszystko będzie gotowe na czas. Pamiętaj, że problemy / stan bazy kodu są wynikiem tych, którzy wcześniej nad nim pracowali, ale jak tylko zaczniesz brać odpowiedzialność, to na tobie. Nie pozwól sobie na bycie kozłem ofiarnym.

  2. Oceń, jakie działanie produkt spełnia w obecnym stanie w stosunku do określonych wymagań biznesowych. Błąd, który popełniasz, polega na tym, że zbytnio koncentrujesz się na jakości kodu, co jest subiektywne (nie możesz teraz toczyć tej bitwy). Ludzi na wyższych szczeblach naprawdę to nie obchodzi, obchodzi ich, czy to działa, czy nie. Zrób to w sposób obiektywny. Jeśli powiedziano im, że coś działa, a nie działa, musisz być w stanie to udokumentować i zademonstrować. Od tego miejsca możesz zacząć szacować, ile czasu faktycznie potrzebujesz, i poprzeć to faktami / prawdziwymi elementami pracy.

Podsumowując: bądź szczery, bądź obiektywny, nie Nie obiecuj zbyt wiele i oceniaj na podstawie wymagań biznesowych, a nie jakości kodu. Chcesz także być postrzegany jako osoba rozwiązująca problemy, a nie twórca problemu, więc pamiętaj, aby skupić się na rozwiązaniu i dalszej drodze.

Jakość kodu może być subiektywna, ale nie jest to kwestia bez znaczenia.Ponadto większość problemów związanych z „jakością kodu” poruszonych w PO to problemy obiektywne.Kod nie kompiluje się, niekompatybilne wersje bibliotek, zakodowane na stałe / niezaszyfrowane hasła itp.
Źle mnie zrozumiałeś, myślę, że jakość kodu jest niezwykle ważna.Pytanie dotyczy jednak tego, jak komunikować się z kierownictwem, więc na tym skupiam się moja odpowiedź.OP ma już wiedzę na temat problemów z jakością kodu i mam nadzieję, że sobie z nimi poradzą.
Bycie „kozłem ofiarnym” nie jest takie złe.Prawdopodobnie nie chcesz pracować dla ludzi, którzy i tak robią takie rzeczy, więc daje ci to wymówkę, by uciec bez konieczności mówienia nikomu, jak bardzo byli do dupy.Ufaj, że ludzie, którzy trochę pracowali, dla których możesz pracować w przyszłości, prawdopodobnie wiedzą, jak te rzeczy mogą się potoczyć, i wiedzą, jak dostrzegać niekompetencję i uważać na fałszywych kozłów ofiarnych.
MonkeyZeus
2018-04-26 22:14:23 UTC
view on stackexchange narkive permalink

Przykro mi, że jestem nosicielem cynicznych wiadomości, ale ...

Gdyby to było tak genialne, nie zostałoby Ci przekazane 2 miesiące przed datą premiery, chyba że myślą, że masz tyle samo lub więcej geniuszu niż poprzedni programista.

To brzmi jak konfiguracja na wypadek niepowodzenia. Kierownictwo wie, że to bałagan, ale musi przerzucić odpowiedzialność na jakiegoś niczego niepodejrzewającego ciężko pracownika, aby mógł zrzucić winę na siebie, a nie na siebie, gdy wyższe kierownictwo zacznie prosić o aktualizacje statusu.

Chciałbym dodać, że jeśli czujesz, że jesteś skonfigurowany, używaj e-maili do opisania sytuacji, a nie tylko rozmawiaj ze swoimi menedżerami.W ten sposób, jeśli sprawy nagle staną się bardzo poważne i nieprzyjemne, będziesz miał coś do omówienia.Rozważ również przeczytanie kilku Schrijvers.
To.Ale po prostu poszukaj nowej pracy.Nie jest to takie trudne w naszej branży i daje Ci kontrolę.
Yap brzmi prawdopodobnie.To wielki sprawdzian twojej postaci.Po prostu zachowaj spokój.To twoja jedyna praca od teraz do zakończenia projektu.
To raczej komentarz niż odpowiedź.Bardzo przydatny i bardzo trafny komentarz, więc dawaj +1.Ale rozwiązanie jest po prostu implikowane, a nie wypowiadane.
DonQuiKong
2018-04-26 18:12:37 UTC
view on stackexchange narkive permalink

Jako alternatywne podejście możesz zasugerować, aby inny programista się temu przyjrzał. Dwie, trzy lub piętnaście osób, które twierdzą, że to nie działa i wkrótce może przekonać kierownictwo.

Działa tylko wtedy, gdy jest ktoś, kto nie jest zainteresowany projektem i dlatego nie musi maskować prawdy.

Ale wszyscy wcześniejsi deweloperzy powiedzieli im, że kod działa i jest w porządku.Jak myślisz, dlaczego więcej ludzi to zmieni?
Osoba trzecia, w którą nie zainwestowano, wydałaby lepszą opinię niż programista, którego praca zależy od jej uruchomienia i znajduje się w takiej samej sytuacji jak OP.
@Daniel, jeśli poprosisz o sekundę, pomysł polega na zapytaniu kogoś, kto nie musi pracować z tym kodem.
@Euphoric: Jeśli zapytasz jeszcze dziesięć (niepowiązanych) osób i wszystkie zgadzają się z pierwotną oceną, możesz zacząć się zastanawiać, czy pierwotna ocena mogła być poprawna.
Tak, zgadzałem się z tobą i próbowałem wytłumaczyć @Euphoric, dlaczego poproszenie większej liczby osób jest lepsze.
@Daniel w takim przypadku przeczytaj mój poprzedni komentarz jako „tak, dokładnie, co mówi”;)
Zibbobz
2018-04-26 18:46:09 UTC
view on stackexchange narkive permalink

Jeśli przedstawiłeś kierownictwu stan tego kodu, tak jak my, a oni nadal są przekonani, że jest on w idealnym stanie i wymaga tylko dwóch miesięcy na dostawę ...

Ty nie mogą zmienić zdania - są już o tym przekonani. Albo, co gorsza, zdają sobie sprawę z problemu i próbują grać w ignorancję, aby móc przekazać ci pieniądze, gdy się nie powiedzie.

Wszystko, co możesz zrobić w tym momencie, jeśli chcesz pozostać zaangażowany w projekt, wszystko, co możesz zrobić, to zapiąć pasy i zrobić wszystko, co w twojej mocy, aby kod działał, aż do pracy włącznie z biegiem czasu.

Poza tym stanowczo zachęcam, abyś przećwiczył dokumentację, zarówno w kodzie, jak i poza nim, tak aby w przypadku obwiniania Ciebie o niepowodzenie w aplikacji można było przynajmniej pokaż, że wyszedłeś poza swój obowiązek, aby ocalić jak najwięcej z niego.

Miejmy nadzieję, że ktoś z kierownictwa będzie na tyle mądry, by rozpoznać ciężko pracującego programistę, który chce włożyć wysiłek w naprawienie swojego projektu katastrofy.


To powiedziawszy - ten projekt wydaje się wyjątkowo źle zarządzany. Radziłbym poświęcić trochę czasu na dopracowanie CV lub poszukanie przeniesienia w firmie do nowego projektu. Ponieważ z tego, co powiedziałeś, sprawy nie wyglądają dobrze w tym przypadku.

Socrates
2018-04-26 23:02:25 UTC
view on stackexchange narkive permalink

Przede wszystkim nie zakładaj, że kod jest tak „zły”.

Praktycznie za każdym razem, gdy widzę nowego programistę przychodzącego do projektu, wymawia go źle, bez względu na to, jak dobrze czy źle, albo kto to napisał. Kiedyś pracowałem nad produktem przez dwa lata i zatrudnili nowego wykonawcę, który powiedział mojemu szefowi, że mój kod jest bezwartościowym kodem „spaghetti” i musi zostać przepisany. Został zwolniony około 2 miesiące później z powodu braku produktywności.

Ogólnie rzecz biorąc, powinieneś oprzeć się pokusie przepisywania wszystkiego od nowa.

Spróbuj ograniczyć zmiany do tego, co jest konieczne. Nie próbujesz tutaj stworzyć Mona Lisy; zacznij robić minimum, aby osiągnąć wszystko, co trzeba. Jeśli myślisz, że oznacza to przepisanie całego projektu, prawdopodobnie jesteś problemem, a nie kodem.

Nie ma absolutnie żadnego powodu, aby zgłaszać szefowi uwagi redakcyjne dotyczące jakości kodu. Jesteś po to, by dodawać funkcjonalność, a nie być krytykiem filmowym. Zachowaj swoje opinie dla siebie, dopóki nie udowodnisz swojej wartości.

AnoE
2018-04-30 00:29:09 UTC
view on stackexchange narkive permalink

Czuję, że muszę dodać odpowiedź, ponieważ już ją zaakceptowałeś. Nie jest to do końca błędne, ale IMO trochę mija się z celem.

Zapomnij na chwilę o kodzie. Nie będzie to pierwszy ani ostatni kod p-o-s, który będziesz musiał utrzymywać. Zgodnie z sugestią, szlifuj ją, aż uzyskasz pozory działającej bazy kodu, staraj się dopasować terminy itd.

Część, która wymaga równie wielu przygotowań i troski, to Twoja własna sytuacja: Ty zbliżasz się do krytycznej fazy swojego życia, w której sam możesz iść do psów, jeśli nie będziesz uważać. Teraz, gdy opisujesz swoją sytuację, wszyscy powyżej ciebie uważają, że wszystko jest w porządku, że mają kopalnię złota i naprawdę nie ma problemu.

Kilka cytatów Już dawałeś zdawać się sugerować, że ci nie wierzą i myślą, no cóż, nie do końca źle o tobie, ale przynajmniej neutralnie; wydaje się, że nie stoisz z nimi. Nie ma znaczenia, jak zły jest kod. Jeśli to nie zadziała w terminie, będzie to Twoja wina i tylko Twoja wina. Możesz udokumentować tyle, ile chcesz, ale cytaty, które podałeś, wydają się jasne, ponieważ nie są zainteresowane argumentami i nie do końca ci wierzą.

Problem niekoniecznie polega na tym, że są złe albo po ciebie. Powszechnym problemem jest to, że ludzie na pewnym poziomie myślą zupełnie inaczej niż ludzie na innym. To żadna wina, ale często tak jest. Widzieć; tak często słyszą, jak ludzie techniczni narzekają na to, jak trudne jest jakieś zadanie lub jak zepsuta jest jakaś aplikacja, że ​​jest dla nich jak szum w tle. Nie chcą tego słuchać. W ich opinii to nie jest ważny argument. I co do tego mają rację - ich zadaniem nie jest znajomość szczegółów technicznych (a jakość kodu jest częścią szczegółów technicznych ...). Muszą wiedzieć, czego Tobie brakuje, aby osiągnąć ten cel.

Tak więc w optymalnej sytuacji miałbyś wystarczająco dużo siły, aby powiedzieć im „Potrzebuję jeszcze 3 osób i eksperta w XYZ, aby dotrzymać tego terminu”. Zapewniają to, o co prosisz, dotrzymałeś terminu i wszystko jest w porządku.

Niestety, nie widzę w Twoim poście znaku, że masz taką siłę przebicia. Wydają się być z góry ustaleni, że ty i tylko ty rozwiążesz problemy. Kiedy przegapisz termin (a zwłaszcza wtedy, gdy zaczniesz obwiniać kod), wtedy, w zależności od tego, gdzie mieszkasz, albo jest to dla ciebie nowa praca, albo przynajmniej twoja kariera w tej firmie może się skończyć.

A więc: poproś menedżera po swojej stronie, może lidera zespołu, który nadal ma korzenie techniczne. Znajdź trenera w Twojej firmie, który może porozmawiać w Twoim imieniu / z Tobą i pomoże Ci w przydzieleniu większej liczby pracowników. Ale co ważniejsze: przygotuj się na fazę skrajnego stresu, nie dlatego, że musisz pracować w nadgodzinach, ale dlatego, że możesz spotkać się z dyskusjami, które będą wydawać się Ci wyjątkowo niesprawiedliwe / bolesne i niezwykle trudne i przygnębiające . Uważaj na oznaki wypalenia, depresji lub innych syndromów stresu (na przykład: brak energii do uprawiania sportu; niemożność normalnego rozmawiania z rodziną; itp.) I pociągnij za linę, zanim odniesiesz obrażenia.

Powodzenia!

(Źródło: BTDT)

rackandboneman
2018-04-29 05:16:48 UTC
view on stackexchange narkive permalink

Taka sytuacja jest typowa dla następujących zdarzeń:

W punkcie A w czasie istnieje zestaw reguł biznesowych dla procesu i jest on znany, chociaż nie jest formalnie udokumentowany (lub dokumentacja została później omyłkowo zniszczona , patrz punkt D).

W punkcie B w czasie te reguły biznesowe zostają zaimplementowane w kodzie, współpracując z tymi, którzy je znają. Istnienie kodu jest zachętą, aby nie dokumentować reguł biznesowych i zapomnieć o nich i / lub przestać dbać o to, aby nie zostały zapomniane.

W punkcie C w czasie kod jest używany, a ponieważ to działa, przez większość czasu nie ma POTRZEBY znajomości reguł biznesowych. Kod JEST obecnie de facto zbiorem reguł biznesowych.

W punkcie D w czasie krytyczna liczba osób posiadających wiedzę z punktu A odeszła z firmy, zapomniała o zasadach biznesowych lub odrzuciła istniejące dokumentacja jako przestarzała. Nikt nie zauważa.

W punkcie E kod zaczyna pokazywać defekty spowodowane zmianami w środowisku lub wymagałby zmian funkcjonalnych. Te potrzeby są omijane, a nie zaspokajane, ponieważ chociaż wszelkie rozszerzenia kodu lub poprawki można technicznie wykonać, nie ma łatwego sposobu ich TESTOWANIA, ponieważ reguły biznesowe dyktują, co należy uznać za prawidłowe dane wejściowe, a jakie dane wyjściowe są częściowo lub całkowicie nieznane.


To, co pogarsza tę sytuację, to odwieczna zagadka dotycząca dokumentacji: Ważne jest przechowywanie starej, nieaktualnej dokumentacji - jednocześnie, nie wiedząc później, czy dokumentacja, którą masz, jest nawet bardziej przestarzała niż ta, która istniała, ponieważ nikt nie wie, czy może istnieć bardziej aktualna wersja i została zgubiona lub mogła zostać zniszczona.

Kevin
2018-04-26 22:30:13 UTC
view on stackexchange narkive permalink

Czy mogę zapytać, dlaczego chcesz tu pracować? Twój projekt jest bałaganem, który sam w sobie jest zły, ale niektórzy lubią wyzwanie, jakim jest sprzątanie czegoś takiego. Prawdziwy problem polega na tym, że najwyraźniej grupie programistów pozwolono pracować nad produktem od miesięcy (1,5 GB kodu, źle czy nie, to nie jest kilka tygodni pracy), oni też najwyraźniej wszyscy opuścili ten projekt i kierownictwo było tak bardzo oddalone od projektu, że nawet nie znają jego obecnego stanu.
To są dla mnie ogromne czerwone flagi. W jaki sposób kierownictwo będzie w stanie zarządzać tobą i pozwolić ci wydajnie wykonywać twoją pracę, jeśli nie mogli tego zrobić z poprzednią grupą? Dlaczego wszyscy poprzedni programiści zniknęli? Jak będziesz się rozwijać i uczyć w tej firmie, skoro najwyraźniej nie obchodzi ich jakość kodu? Ale być może najważniejsze ze wszystkich pytanie, kto będzie twoim celem, gdy pojawią się problemy?
W obecnym stanie nie masz pewności, że nie zostaniesz rzucony pod autobus następnym razem, gdy interesariusze zażądają demo. To toksyczne środowisko i istnieje duża szansa, że ​​poprzedni programiści odeszli z tego powodu, a teraz kierownictwo próbuje to ukryć, twierdząc, że jest to `` genialny kod '' i `` już w produkcji '', wszystko, co odciągnie cię od gigantycznej sterty gnoju to jest twój odziedziczony projekt.

Jest wiele problemów, ale bardzo lubię moich menedżerów i nie myślę o nich źle;ale mają wady i nikt nie lubi czuć się oszukany.Myślę, że zostali oszukani i wykorzystali zły kod.Nie chcę być postrzegany jako zwiastun złych wiadomości ani sprzeciwić się przesłaniu, które przyjęli jako prawdziwe ... Nie bez starannie przemyślanej wiadomości.W firmie są inne produkty, które nie mają tych problemów - tylko ten, o którym mówię.
Jim G.
2018-04-27 22:55:09 UTC
view on stackexchange narkive permalink

Twój ogólny plan powinien wyglądać następująco:

  1. Architekt, który jest krokiem naprzód. (*)
  2. Oszacuj, ile czasu zajmie wdrożenie Twojej „dalszej drogi”.
  3. Spotkaj się z interesariuszami biznesowymi i przekaż im następujące informacje:
    1. Że nie możesz skompiluj / uruchom bieżący kod (jeśli to nadal prawda).
    2. To zajmie „X” dni / tygodni, aby przywrócić kod do stanu, który można kompilować / budować / uruchamiać.
    3. Że jest dodatkowa praca, poza tylko przygotowaniem kodu do kompilacji, którą musisz zrobić, aby kod był obsługiwany i rozszerzalny.
    4. Że zajmie ci to „X” miesięcy wdrożyć swoją drogę naprzód. Następnie wyjaśnij swoje dalsze działania. (**)

-

(**) Jest to najważniejsze, ponieważ będziesz potrzebować przekonać nietechnicznych interesariuszy biznesowych, że Twój plan jest solidny, wykonalny i wart zachodu.

-

(*) Oto moja rekomendacja dotycząca dalszych działań, które można rozpocząć natychmiast po tym, jak będziesz mógł skompilować, zbudować i uruchomić kod.

  1. Twórz automatyczne testy jednostkowe.
    1. Testy jednostkowe pokażą, że rozumiesz kod.
    2. Statystyki pokrycia kodu będą stale przypominać o tym, które fragmenty bazy kodu rozumiesz i które fragmenty nadal musisz sondować.
  2. Nie pozwól nikomu połączyć się z głównym gałąź bez żądania ściągnięcia, które zostało zatwierdzone przez co najmniej dwie osoby.
    1. Żądania ściągnięcia uspołecznią zmieniające się zrozumienie bazy kodu przez Twój zespół.
  3. Zachęcaj programistów do tworzenia kultury wsparcia, zwłaszcza w tym trudnym okresie.
    1. Staraj się nie tracić opanowania. Inni programiści wyczują twoją frustrację i sami mogą być sfrustrowani.
    2. Gdy programista ma trudności z jakimś podstępnym, starszym kodem, zachęć innych programistów do pomocy i razem zmierzą się z trudnym kodem, na przykład par programowanie.
RandomUs1r
2018-05-01 03:21:16 UTC
view on stackexchange narkive permalink

Tutaj Dev z pewnymi danymi wejściowymi:

Twoje obawy dotyczące kodu są w najlepszym przypadku pół-poprawne:

Istnieją te same funkcje, te same nazwy zmiennych o tym samym zakresie w całej bazie kodu (w języku, który tego nie obsługuje).

Jeśli język tego nie obsługuje, jak wygląda jego wersja? Wygląda na to, że Ci czegoś tutaj brakuje.

Funkcje są zdefiniowane, ale nigdy nie są wywoływane.

Na co to wpływa? Może został zgaszony z powodu czegoś, czego nigdy nie wdrożono? Może to do zakończenia api?

Użycie i inicjalizacja zmiennych poza kolejnością.

Jest to częste w kodzie w utrzymaniu, chociaż nie jest idealne w twojej sytuacji , znowu jest to powszechne w starszym kodzie.

Użyto niezgodnych wersji bibliotek.

Zobacz punkt 1, jak to się kiedykolwiek stało?

Zakodowane na stałe identyfikatory URI i adresy IP bez dokumentacji na temat tego, co robią.

Nie jest to idealne rozwiązanie, ale znowu, jaki ma to wpływ na dostawę?

Losowo żądane trasy API, które nie zwracają niczego lub bełkotu; które nie są wtedy używane.

Zobacz ponownie punkt 2

Zakodowane na stałe, niezaszyfrowane hasła i prywatne klucze SSH.

Zobacz ponownie nr 5

Teraz, po omówieniu tych problemów jako niewygodnych, ale trywialnych, miałbym uzasadnione obawy, że wyznaczasz jakikolwiek kierunek, przepraszam, tak właśnie jest w branży od co widziałem.

Mam jednak małą radę: potrzebujesz innego rodzaju środowiska kodowania, np. sklepu z kodami, więc poszukaj e-comma lub firmy technologicznej, w której standardy kodowania są o wiele bliżej do życia w biznesie niż powiedzmy finanse czy produkcja.

Jeśli chodzi o przedstawienie twoich obaw kierownictwu ... Podoba mi się odpowiedź Tschallackiej. Po prostu napraw to, co jest z nim nie tak, nie mówiąc o tym kierownictwu, i wyrzuć to jako doświadczenie zawodowe, które możesz następnie umieścić w CV. Myślę, że znam rodzaj zarządzania, o którym mówisz (pomijając osobiste opinie) i są po to, aby zarządzać, a nie wprowadzać innowacji, więc jeśli chcesz robić to drugie, najlepszym rozwiązaniem jest praca wokół nich.



To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...