Pomagasz młodym programistom pokonać swoje niedociągnięcia? [Zamknięte]

15

Jakie są twoje wspólne słabości do młodszych programistów, którzy dołączają do twojego zespołu lub z którymi musisz współpracować? Oczywiście są niedoświadczeni, więc nie można oczekiwać, że będą wiedzieli wszystko, ale jakich umiejętności często brakuje w niewytłumaczalny sposób - i w jaki konkretny sposób możemy im pomóc w rozwijaniu tych brakujących umiejętności?

Nie mam na myśli umiejętności interpersonalnych, takich jak „słuchanie rad”, mam na myśli kwestie techniczne, takie jak (jeśli dotyczy):

  • „nigdy nie korzystałeś z SQL?”

  • „nigdy nie napisałeś testu jednostkowego?”

  • „nie wiesz, jak korzystać z wiersza poleceń systemu Unix?”

Rzeczy, które nie oczekują - Chciałbym usłyszeć wasze spostrzeżenia i technik nauczania nowych programistów ominąć tych konkretnych braków.

Andrew M.
źródło
13
Jedna najbardziej irytująca rzecz: ciągłe pytanie o to, co jest irytujące. :-)
Jerry Coffin
12
Nie sądzę, że powinieneś być zirytowany, gdy ludzie nie wiedzą rzeczy, których oczekujesz od nich. Ważne jest to, że chcą się uczyć =)
koenmetsu,
Tak zgadzam się z @KoMet jeśli masz chęć nauczyć się słuchać myślę, że ważne :)
MalsR
8
Nie podoba mi się to pytanie, ma niewłaściwą mentalność dla programisty. WSZYSTKO JESTEŚMY RAZEM tym nowicjuszem i każdego dnia jesteśmy nowicjuszami. NIGDY nie irytowałbym się na kogoś, kto czegoś nie wie. Wydaje się, że w grę wchodzi zbyt wiele arogancji ...
Darknight
3
Och, zamknięte, BRAVO. Przeczytałem sześć wskazówek, które są subiektywnymi subiektywnymi pytaniami i to spełnia je wszystkie. Szczerze mówiąc, niekonstruktywna część jest zajęta ciałem zamykającym wątek, na który 13 osób odpowiedziało już tylko dlatego, że źle zrozumieli pytanie. To po prostu rzeczywistość, że starsi programiści czasami będą rozczarowani umiejętnościami młodszych programistów, to pytanie ma na celu jedynie znalezienie wzorów w tym rozczarowaniu, abyśmy mogli lepiej uniknąć trudności. Ignorowanie uzasadnionych skarg i krytyki nie przynosi korzyści nikomu i nie ma nic wspólnego z arogancją.
Andrew M,

Odpowiedzi:

25

Nie wiem, co to jest kontrola wersji lub jak z niej prawidłowo korzystać .

Jeden z młodszych programistów, który był w mojej firmie od kilku miesięcy, musiał nauczyć się bardzo podstaw Subversion. To sprawiło, że zacząłem się kulić ... cały czas sprawdzała kod w celu realizacji projektów ... i nie miała pojęcia, co robi ...?

sevenseacat
źródło
4
Żenada? Ma szczęście, że wciąż ma pracę.
Rein Henrichs,
2
Wydaje się, że jest to bardziej kwestia „nieświadomości tego, czego nie wiesz” lub „nie przyznania się do tego, czego nie wiesz”. Czy poprosiłaby o pomoc od samego początku, czy byłaby to w ogóle wielka sprawa?
Michael McGowan
1
ouch, to brzmiało jak ja haha, do niedawna nie wdrożyliśmy kontroli wersji i dołączyłem do firmy jako nowy grad, nauczyłem się trochę na temat kontroli wersji i subwersji na uniwersytecie, ale nigdy wcześniej jej nie implementowałem.
Sufendy,
1
„To narzędzie do tworzenia kopii zapasowych, prawda? Używasz go do zapisywania kodu każdego wieczoru?”
David
2
To jedna wielka rzecz, której prawie nigdy nie uczą cię w szkole
Elijah Saounkine,
23

Niewystarczające zadawanie pytań

Wiem, że są juniorami, spodziewam się, że będą popełniać błędy i po prostu nie będą wiedzieć. Tak wielu królewskich pierdół można było uniknąć, zadając pytanie zamiast czegoś zakładać. Szczerze mówiąc, nie mogę być wystarczająco prześladowany.

Kiedy zaczynałem, miałem mnóstwo pytań - zadawanie im pytań kilkakrotnie ratowało mi tyłek. Do diabła, wciąż mam wiele pytań ... Po prostu lubię myśleć, że są to lepsze pytania.

Steven Evers
źródło
Rany ... prawie ta sama odpowiedź, którą opublikowałem, idziesz za około 5 sekund wcześniej.
szybko_naz
2
„jesteś denerwujący! Jestem tu zajęty, nie możesz myśleć sam?” jeśli masz pecha !! haha
Sufendy,
4
+1 - podtekstem tego nie jest powrót po wyjaśnieniu. Naprawdę mnie to wkurzyło, kiedy wyjaśniłem młodszemu jakieś zadanie, skinął głową, myślałem, że je dostał i dostanie się do pracy, a potem dwa tygodnie później wrócił, zadaje te same pytania, znów kiwa głową, potem kolejne dwa tygodnie później ... W porządku, nie było to trywialne zadanie, ale na miłość boską, nie udawaj, że je rozumiesz, jeśli nie. A jeśli uważasz, że coś zrozumiałeś, rób notatki, aby zapamiętać to dwa tygodnie później.
Péter Török
1
Z drugiej strony niektóre osoby zadają zbyt wiele pytań (na temat przepełnienia stosu).
BoltClock
1
@SnOrfus: Ci niewykwalifikowani są tymi, o których mówię: P
BoltClock
14

Skopiuj wklej i wypróbuj i popełniaj błąd zamiast szukać podstaw

Wielu młodszych programistów kopiuje kod, który wygląda na zbliżony, a następnie prawie losowo wypróbowuje różne kombinacje modyfikacji za pomocą brutalnej siły, dopóki nie trafi na taki, który działa. Jeśli nie wiesz, dlaczego to działa, możliwe, że wprowadzasz błędy w przypadkach granicznych, że ktoś, kto to rozumie, będzie musiał później wyczyścić.

Zachowanie „pierwszego szkicu” kodu

Kiedy doświadczony programista pisze nową funkcję o określonej złożoności, zaczyna od kodu pośredniczącego, który nie robi nic poza kompilacją, a następnie przepisuje, aby dodać komentarze pseudokodowe wysokiego poziomu dla całego algorytmu, a następnie przepisywać te komentarze pojedynczo za pomocą rzeczywisty kod, dodając i usuwając fikcyjny kod zgodnie z potrzebami do testowania, a następnie przepisz, aby usunąć nadmiarowość, która pojawiła się podczas implementacji, i tak dalej w szeregu kolejnych i stopniowych ulepszeń.

Młodsi programiści mają tendencję do pisania go w jednym dużym kawałku, a następnie przeprowadzania masowego debugowania z użyciem brutalnej siły. Nie lubią usuwać wiersza kodu po wpisaniu go do edytora i są tak szczęśliwi, że w końcu udało mu się go uruchomić, że nie chcą przepisać poprawek niefunkcjonalnych, ale to oni muszą to zrobić więc najbardziej.

Karl Bielefeldt
źródło
1
+1 za „kopiuj i wklej zamiast starać się zrozumieć”, choć oczywiście nie jest to problem unikalny dla nowych programistów, tylko dla złych. Nowi programiści mają przynajmniej szansę na wyrośnięcie z tego - faceci, z którymi pracuję, którzy byli programistami od dziesięcioleci i nadal tak nie robią.
Tom Anderson,
Część tego może być również konsekwencją stylu zarządzania. Zadanie już trwa dłużej niż oczekiwano, a menedżer chce twojej funkcji jutro. Spieszysz się, aby go uruchomić i szybko przechodzisz do następnego zadania. Wszystko jest podzielone na mikroskopy kart zadań, więc nie ma czasu na refaktoryzację lub cofnięcie się i spojrzenie na większy problem jako całość
Jamie McGuigan
14

Wierząc, że pierwszy raz spotkasz się z sytuacją.

Każdy napotkany problem programowy został napotkany przez innych, w jakiejś ogólnej formie. Tyle można się nauczyć od doświadczonych programistów. Jestem wystarczająco dorosły, aby pamiętać programowanie przed Google, a to było do bani . Jeszcze gorzej było, gdy mieliśmy wyszukiwarki, ale w sieci nie było jeszcze tak dobrych informacji. Programowanie jest teraz o wiele bardziej produktywne, ponieważ masz dostęp do globalnej wiedzy w kilka sekund. Ludzie, którzy go nie używają, ignorują to na własne ryzyko.

Edytuj :

Żeby było jasne, nie opowiadam się za programowaniem kopiuj / wklej. Jestem jednak pewien, że musisz przejrzeć istniejącą wiedzę, zanim sam podejmiesz dobre decyzje.

Scott Whitlock
źródło
1
Cóż, nie chcesz też, aby programista kopiował i wklejał cały kod z niektórych wątpliwych zasobów z sieci. Wyszukiwanie jest dobre, aby uzyskać pomysły, być może rozwiązać podstawowe problemy ze zrozumieniem, ale nigdy nie uzyskać gotowych rozwiązań. Sprawia również, że deweloper jest głupszy; może czyni go dobrym kolekcjonerem, ale nie wynalazcą.
Elijah Saounkine,
W pewnym momencie zgadzam się z Eliaszem, że kopiowanie i wklejanie kodu bez czasu na naukę jego działania nie przyspiesza twoich umiejętności programistycznych. Co gorsza, przejmie kontrolę i stanie się złym nawykiem.
setzamora,
1
Jasne, ale @Scott nie powiedział nic o kopiowaniu i wklejaniu kodu, po prostu powiedział, nie zakładaj, że pierwszy raz spotkasz się z sytuacją, tzn. Zdaj sobie sprawę, że mogą być pewne informacje i doświadczenia, z których możesz skorzystać. Przykład: Chcę wiedzieć, czy dwa ciągi są podobne. Czy istnieje już znany algorytm rozwiązania tego problemu? Wyobraź sobie, że programista po prostu zdecydował się rozpocząć własną, nawet nie wiedząc, że odpowiedzi już istnieją.
David Conrad,
@David Conrad to prawda, punkt, jesteśmy na tej samej stronie tutaj.
Elijah Saounkine
10

Myśląc, że wiedzą wszystko.

Miałem jr. stażysta, który próbował rozwiązać wszystko za pomocą javascript. Próbował wyjaśnić kilka pojęć, ale zawsze myślał, że mógłby to zrobić lepiej. Teraz zrezygnował i pracuje nad dużym programem, który zbudował dla wydruków przy użyciu HTML zamiast technologii gotowej do drukowania, takiej jak PDF. Nie wspominając o stosie innych poważnych problemów.

Lekcja polega na zwróceniu się do seniorów o główne wskazówki na wczesnym etapie projektu, nie odchodź od architektury bez pomocy. Możesz napisać sam kod i szczegóły, ale upewnij się, że przynajmniej używasz odpowiedniej technologii.

P.Brian.Mackey
źródło
5

Rzadko denerwuję się, gdy juniorzy nie znają podstaw, nie uczą się umiejętności branżowych, takich jak SCC na uniwersytecie. Nauczanie ich to praca dla starszych deweloperów. Denerwują mnie tylko starcia osobowości. Ale najbardziej denerwują mnie starsi deweloperzy, którzy nie znają podstaw.

Craig
źródło
1
@Graig ma rację, wiele rzeczy, które denerwują nas, doświadczonych programistów, dotyczących juniorów, to rzeczy, których musieliśmy się uczyć nie na uniwersytecie, ale w środowisku komercyjnym.
Nickz
5

Nie chcą poszerzać swojej wiedzy - zamiast tego podążają ścieżką najmniejszego oporu.

Pewnego dnia stażysta wraz z grafikiem (który jest zaskakująco wykwalifikowany w programowaniu) poprosił o pomoc, ponieważ mieli problemy z implementacją czegoś w jQuery - zamknięcie może być bolesne, jeśli nie widzisz, że nadchodzi.

Usiadłem ze stażystą i wyjaśniłem dokładnie, co poszło nie tak i dlaczego. Naprawiliśmy błąd, a następnie wskazałem kilka dodatkowych ulepszeń, które można wprowadzić („ponieważ tu jestem”), i ostatecznie przepisaliśmy funkcję winy w 10 liniach zamiast 20 i bez błędów. Po udzieleniu odpowiedzi na jakiekolwiek pytania, zadowolony, że wszystko na świecie jest OK, odszedłem.

Następnego dnia stażysta przyszedł z pytaniem, które ujawniło, że „hmm, chciał wprowadzić pewne zmiany i przepisać tę funkcję po swojemu, ponieważ trudno mi było ją zrozumieć” (w większości cofając moje ulepszenia).

Mógłby zamiast tego bardziej się postarać (zadawać dodatkowe pytania, czytać o pojęciach, o których wspomniałem) - tak krótki kod nigdy nie może być tak trudny do zrozumienia - lub skorzystać z łatwego rozwiązania. Zasmuca mnie za każdym razem, gdy widzę, że ktoś to robi.

Jon
źródło
Ciekawe, ale zastanawiam się, czy nie utrudniłeś czytania. Pamiętam, jak mój pierwszy kierownik projektu robił to kilka razy (i jestem winny również to zmienić). Chociaż jestem pewien, że z perspektywy czasu jego podejście było lepsze, po prostu nie byłem wystarczająco zaawansowany, aby zrozumieć, dlaczego i jak to działało. .
Maxim Gershkovich
3

Nie rozumiem OOP. Niestety jest to o wiele bardziej powszechne, niż większość z nas prawdopodobnie zdaje sobie sprawę.

Umiejętność tworzenia klasy, klasy abstrakcyjnej, interfejsu, a nawet znajomość polimorfizmu to jedno; zrozumienie, jak właściwie z nich korzystać na korzyść programu, to kolejna sprawa .


Jeśli chcesz tego uniknąć, znalazłem następujące pytania i odpowiedzi na nie pouczające:

Nicole
źródło
Podobnie jak na poziomie podstawowym, nie wiedzą, co masz na myśli, tworząc przedmioty, klasy i dziedziczenie? Lub bardziej zaawansowane rzeczy, takie jak używanie wzorców projektowych (trzeba przyznać, że książka GoF jest dość zawiła, choć oczywiście są też inne książki / przewodniki)
Andrew M
@Andrew Rozszerzyłem nieco odpowiedź.
Nicole,
1
I widzę odwrotność: nie umiem pisać zwykłego starego kodu procedury w C, ponieważ uczę się tylko OOP. Z drugiej strony, nie każ mi mówić o osobach, które nie uczą się pisać parserów, ponieważ powiedziano im, że wszystkie te problemy można rozwiązać za pomocą lex i yacc.
szybko_naz
1
@quickly_now To dobra uwaga writing code other ways than OOPi writing bad OOPsą to dwie zupełnie różne rzeczy. Po pierwsze, nie mam problemu.
Nicole,
Większość uniwersytetów nie uczy projektowania obiektowego. Również wiele miejsc pracy działa jak silosy, nawet z młodszymi programistami ... lub mają "starszych" programistów, którzy nie znają programowania obiektowego. Są „Senior” deweloperzy, którzy otrzymał tytuł roboczy X od lat i starszych programistów, którzy znają się na rzeczy ....
Cervo
3

Nie wiedząc, czego nie wiesz, i myśląc w ignorancji, wiesz wszystko.

(I jego bliski kuzyn, nie chcący pytać.)

Częściowo jest to kwestia organizacyjna - odpowiednia indukcja przychodząca znacznie przyczyniłaby się do uniknięcia problemów z niektórymi z tych rzeczy. Ale bardzo niewiele firm ma czas lub ludzi na nadchodzące wprowadzenie - coś, co powinno zająć od kilku dni do kilku tygodni i zabiera programistom pracę. Zamiast tego musimy zgasić pożary.

szybko
źródło
2

Dziwi mnie, ilu młodszych programistów stosunkowo świeżo po programie CS ma słabe algorytmy. Niewłaściwy wybór algorytmu może nie wyróżniać się na tle aplikacji biznesowych, ale przetwarzanie miliardów żądań usług internetowych dziennie ma znaczenie.

Oto pytanie, z którego korzystam, że prawie wszyscy programiści juniorów tęsknią, który podkreśla ten problem:

Napisz kod, który oblicza N-tą liczbę Fibonacciego .

Prawie zawsze wybierają najbardziej, pisząc oczywiste, ale nieefektywne

int Fib(int n)
{
    if (n == 0) return 0;
    if (n == 1) return 1;
    return Fib(n-2) + Fib(n-1);
}

Poproszony o wypowiedzenie się na temat złożoności algorytmu, zwykle otrzymuję „jest gorzej niż O (N) ... uhm ... O (N logN)”. To jest (znacznie) gorsze niż to ...

Eric J.
źródło
1
aby odpowiedzieć na pytanie dotyczące zgodności, należy znać tę formułę do obliczania liczb Fibonacciego bez rekurencji, której użyłby w pierwszej kolejności zamiast rekurencji.
P Shved
1
@Pavel: Istnieje rozwiązanie O (n) i O (1) ... w rzeczywistości Like every sequence defined by linear recurrence, the Fibonacci numbers have a closed-form solution. en.wikipedia.org/wiki/Fibonacci_number#Closed-form_expression
Eric J.
1
Nie twierdzę, że opublikowane przez Ciebie rozwiązanie jest idealne. Kwestionuję tylko znaczenie twojego pytania uzupełniającego dla takiego rozwiązania, pytania dotyczące złożoności. Co chcesz osiągnąć, zadając to pytanie i - co najważniejsze - dlaczego oczekujesz, że to, czego chciałeś, zostanie osiągnięte, biorąc pod uwagę odpowiedź na poprzednie pytanie? (Czy
wyraziłem swoje zdanie
aby wyjaśnić moją kwestię, proponuję zapytać o to, w jaki sposób można poprawić kod zamiast szacować złożoność. Jestem pewien, że niektórzy absolwenci CS zaproponowaliby memoizację lub powiedzieli, że znają formułę, ale nie chcieli jej od razu pokazać, ponieważ można by pomyśleć, że są inteligentnymi.
P Shved
W praktyce taka funkcja może zostać odkryta za pomocą profilera i zoptymalizowana poprzez dodanie pamięci podręcznej zapamiętywania. Nieefektywność jest tak naprawdę problemem tylko dla dużych wartości N. Najlepszym sposobem nauczenia juniora o takim kodzie jest zmuszenie go do przejścia przez całe wykonanie kodu za pomocą debuggera. W przypadku naprawdę dużych wartości N okazuje się, że istnieje wzór matematyczny maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/...
Jamie McGuigan
1

Wykonanie wcięcia kodu wstecznego!

Oczywiście nie jest to zbyt „typowe”. Nigdy nie mogłem uwierzyć, że to w ogóle możliwe, ale jak napisałby normalny programista

try {
    switch(action){
        case case1:
            ...
            break;
        case case2:
            ...
            break;
        default:
            break;
    }
}
catch(Exception e) {
    e.printStackTrace();
}

pisałaby jak (Boże, wciąż wydaje mi się to niemożliwe!)

            try {
        switch(action){
    case case1:
...
break;
    case case2:
...
break;
    default:
break;
        }
            }

Frustrujące, prawda?

Elijah Saounkine
źródło
Co w imię ...
Mike Speed,
1
To bardzo niesamowite !!!
javanna,
To prawie tak, jakby czytali po arabsku, hebrajsku lub chińsku, gdzie czyta się od prawej do lewej, zamiast zachodniej konwencji od lewej do prawej. Jest to w pełni poprawny sposób wcięcia kodu, ale oznacza to, że musisz ponownie wciąć cały plik w oparciu o najgłębszy poziom zagnieżdżenia i sprawia, że ​​kod jest niezgodny ze wszystkimi, którzy dzielą się odwrotną konwencją.
Jamie McGuigan,