Aiutare i programmatori junior a superare le loro carenze? [chiuso]


15

Quali sono le tue lamentele comuni sugli sviluppatori junior che si uniscono al tuo team o con i quali devi lavorare? Ovviamente sono inesperti, quindi non puoi aspettarti che sappiano tutto, ma quali abilità spesso sono inspiegabilmente mancanti - e come, in particolare, possiamo aiutarli a sviluppare queste abilità mancanti?

Non intendo competenze interpersonali come "ascoltare consigli", intendo questioni tecniche come (se applicabile):

  • 'non hai mai fatto SQL?'

  • "non hai mai scritto un test unitario?"

  • 'non sai come usare una riga di comando Unix?'

Le cose che non aspetta - mi piacerebbe sentire le vostre osservazioni e le tecniche per insegnare nuovi programmatori per superare queste carenze specifiche.


13
L'unica cosa più irritante: chiedere costantemente cosa è irritante. :-)
Jerry Coffin

12
Non penso che dovresti essere irritato quando le persone non sanno cose che ti aspetteresti che sappiano. L'importante è che siano disposti a imparare =)
koenmetsu

Sì, d'accordo con @KoMet se hai la volontà di imparare ad ascoltare, penso sia importante :)
MalsR

8
Non mi piace questa domanda, ha una mentalità sbagliata per uno sviluppatore. C'è stato tutti una volta che newbie, e ogni giorno ci sono un newbie a qualcosa. Non mi irriterei MAI per qualcuno che non sa qualcosa. Sembra che ci sia troppa arroganza in gioco ....
Darknight

3
Oh, chiuso, BRAVO. Ho letto le sei linee guida costruttive domande soggettive e questo soddisfa tutte. Francamente, la parte non costruttiva è occupata a chiudere un thread a cui 13 persone hanno già risposto, solo perché hanno frainteso la domanda. È semplicemente una realtà che gli sviluppatori senior a volte saranno delusi dalle capacità degli sviluppatori junior, questa domanda cerca solo di trovare modelli in questa delusione in modo da poter meglio evitare le difficoltà. Ignorare legittime lamentele e critiche non giova a nessuno e non ha nulla a che fare con l'arroganza.
Andrew M,

Risposte:


25

Non sapere cos'è il controllo versione o come utilizzarlo correttamente .

Uno degli sviluppatori junior che è stato nella mia azienda da diversi mesi di recente ha dovuto imparare le basi di Subversion. Mi ha davvero fatto rabbrividire ... ha controllato il codice per vivere progetti per tutto il tempo ... e non aveva idea di cosa stesse facendo ...?


4
Imbarazzante? È fortunata che abbia ancora un lavoro.
Rein Henrichs,

2
Sembra che si tratti più di "non sapere ciò che non sai" o di "non ammettere ciò che non sai". Aveva chiesto aiuto fin dall'inizio, sarebbe stato un grosso problema?
Michael McGowan,

1
ahi, sembrava proprio come me ahah, non abbiamo implementato il controllo della versione fino a poco tempo fa, e mi sono unito all'azienda come nuovo laureato, ho imparato un po 'di controllo della versione e cose di sovversione all'università, ma non l'ho mai implementato prima.
Sufendy,

1
"Questo è lo strumento per il backup, non è vero? Lo usi per salvare il tuo codice ogni sera?"
David

2
È una cosa importante che non ti insegnano quasi mai a scuola
Elijah Saounkine

23

Non fare abbastanza domande

So che sono giovani, mi aspetto che commettano errori e non conoscano le cose. Così tanti fottuti reali avrebbero potuto essere evitati semplicemente facendo una domanda invece di assumere qualcosa. Onestamente, non posso essere infastidito abbastanza.

Avevo tonnellate di domande quando ho iniziato - chiedendogli di salvarmi il culo in diverse occasioni. Diavolo, ho ancora un sacco di domande ... Mi piace solo pensare che siano domande migliori ora.


Accidenti ... quasi la stessa risposta che ho postato, ci vai circa 5 secondi prima.
quick_now

2
"sei fastidioso !! Sono impegnato qui, non riesci a pensare da solo?" se sei sfortunato !! haha
Sufendy,

4
+1 - Una sottocassa di questo non sta chiedendo risposta dopo una spiegazione. Mi ha fatto davvero incazzare quando ho spiegato un compito a un ragazzo, lui annuì, pensavo che l'avrebbe preso e sarebbe arrivato al lavoro, poi due settimane dopo torna, fa di nuovo le stesse domande , annuisce di nuovo, poi altri due settimane dopo ... Abbastanza giusto, non era un compito banale, ma per l'amor di Dio non fingere di capirlo se non lo fai. E se pensi di aver capito qualcosa, prendi appunti in modo da ricordartelo due settimane dopo.
Péter Török,

1
Alcune persone, d'altra parte, fanno troppe domande (su Stack Overflow).
BoltClock

1
@SnOrfus: Quelli non qualificati sono quelli a cui mi riferisco: P
BoltClock

14

Copia incolla, prova ed errore invece di cercare di comprendere i fondamenti di base

Molti sviluppatori junior copieranno codice che sembra vicino, quindi provano quasi casualmente diverse permutazioni di modifiche con la forza bruta fino a quando non colpiscono uno che funziona. Se non sai perché funziona, è probabile che tu stia introducendo dei bug nei casi limite che qualcuno che lo capisce dovrà ripulire in seguito.

Mantenere la loro "prima bozza" di codice

Quando uno sviluppatore esperto scrive una nuova funzione di una certa complessità, inizia con uno stub che non fa altro che compilare, quindi riscrive per aggiungere commenti pseudo-codice di alto livello per l'algoritmo globale, quindi riscrive quei commenti uno alla volta con codice effettivo, aggiungendo e rimuovendo il codice fittizio come necessario per il test, quindi riscrivendolo per rimuovere la ridondanza emersa durante l'implementazione e così via in una serie di miglioramenti successivi e incrementali.

Gli sviluppatori junior hanno la tendenza a scriverlo in un grosso pezzo, quindi eseguire un massiccio debug della forza bruta. A loro non piace eliminare una riga di codice una volta che è stata digitata nell'editor, e sono così felici di averlo finalmente fatto funzionare che non amano riprogrammare per miglioramenti non funzionali, ma sono quelli che devono fare quindi di più.


1
+1 per "copia e incolla invece di cercare di capire", anche se ovviamente questo non è un problema unico per i nuovi programmatori, ma solo per quelli cattivi. I nuovi programmatori hanno almeno la possibilità di uscirne - i ragazzi con cui lavoro che sono programmatori da decenni e ancora non lo fanno.
Tom Anderson,

Parte di ciò può anche essere una conseguenza dello stile di gestione. L'attività sta già parlando più a lungo del previsto e il gestore desidera la tua funzione domani. Ti affretti a farlo funzionare e passare rapidamente al compito successivo. Tutto è suddiviso in task card microsized, quindi non c'è tempo per refactoring o fare un passo indietro e guardare al problema più grande nel suo insieme
Jamie McGuigan,

14

Credere di essere il primo a incontrare una situazione.

Ogni problema di programmazione che affronti è stato affrontato da altri, in una forma generale. C'è così tanto da imparare da programmatori esperti. Sono abbastanza grande da ricordare la programmazione prima di Google, e mi ha fatto schifo . Era ancora peggio quando avevamo i motori di ricerca, ma non c'erano ancora molte buone informazioni sul web. La programmazione ora è molto più produttiva perché hai accesso alla conoscenza globale in pochi secondi. Le persone che non lo usano lo stanno ignorando a loro rischio e pericolo.

Modifica :

Giusto per essere chiari, io non sostenendo copia / incolla di programmazione. Sono certo, tuttavia, che è necessario rivedere le conoscenze esistenti prima di poter prendere le decisioni giuste da soli.


1
Bene, anche tu non vuoi che lo sviluppatore copi e incolli tutto il codice da alcune dubbie risorse dal Web. La ricerca è utile per ottenere alcune idee, forse risolvere alcuni problemi di comprensione fondamentale, ma mai per ottenere soluzioni pronte. Inoltre rende lo sviluppatore più stupido; forse lo rende un buon collezionista, ma non un inventore.
Elia Saounkine,

Concordo a un certo punto con Elia, copiare e incollare il codice senza avere il tempo di imparare cosa fa, non accelera le tue capacità di programmazione. Peggio ancora, prenderà il sopravvento e diventerà una cattiva abitudine.
setzamora,

1
Certo, ma @Scott non ha detto nulla sulla copia e incolla del codice, ha solo detto di non dare per scontato che tu sia il primo a incontrare una situazione, cioè, renditi conto che potrebbero esserci alcune informazioni ed esperienze là fuori di cui puoi beneficiare. Esempio: voglio sapere se due stringhe sono simili. Esiste già un algoritmo noto per risolvere questo problema? Immagina se uno sviluppatore avesse appena deciso di iniziare a lanciare il proprio senza nemmeno essere consapevole che le risposte già esistono.
David Conrad,

@David Conrad, giusto, punto preso, siamo sulla stessa pagina qui.
Elia Saounkine,

10

Pensando di sapere tutto.

Ho avuto un jr. stagista che ha cercato di risolvere tutto con javascript. Ho cercato di spiegare diversi concetti, ma ha sempre pensato di poterlo fare meglio. Ora ha lasciato e sto rielaborando un programma importante che ha creato per l'output di stampa usando HTML anziché una tecnologia pronta per la stampa come PDF. Per non parlare di un mucchio di altri problemi importanti.

La lezione è di chiedere agli anziani una guida generale di primo piano all'inizio di un progetto, non abbandonare l'architettura senza aiuto. Puoi scrivere il codice e i dettagli da solo, ma assicurati almeno di usare la giusta tecnologia.


5

Raramente mi infastidiscono quando i giovani non conoscono le basi, non vengono insegnate competenze del settore come SCC all'università. È compito degli sviluppatori senior insegnare loro. Mi infastidiscono solo gli scontri di personalità. Ma sono molto seccato dagli sviluppatori senior che non conoscono le basi.


1
@Graig ha ragione molte cose che ci infastidiscono gli sviluppatori esperti in materia di juniors sono cose che abbiamo dovuto imparare non in un'università ma in un ambiente commerciale.
Nickz,

5

Non voler far avanzare le proprie conoscenze - prendendo invece il percorso di minor resistenza.

L'altro giorno uno stagista insieme al progettista grafico (che è sorprendentemente abile nella programmazione) ha chiesto aiuto perché si sono trovati in difficoltà nell'implementazione di qualcosa in jQuery - la chiusura può essere dolorosa se non riesci a vederlo arrivare.

Mi sono seduto con il tirocinante e ho spiegato esattamente cosa non andava e perché. Abbiamo corretto il bug, quindi ho sottolineato diversi miglioramenti che potevano essere apportati ("dato che sono qui") e abbiamo finito per riscrivere la funzione colpevole in 10 righe anziché in 20 e senza bug. Dopo aver risposto a qualsiasi domanda, soddisfatto che tutto andasse per il meglio nel mondo, me ne sono andato.

Il giorno dopo, il tirocinante ha ricevuto una domanda che ha rivelato che "um, voleva apportare alcune modifiche e riscrivere la funzione a modo mio perché ho trovato difficile da capire" (per la maggior parte annullando i miei miglioramenti).

Avrebbe potuto tentare di più, invece (fare domande aggiuntive, leggere i concetti che ho citato) - un codice così breve non può mai essere così difficile da capire - o prendere la via più semplice. Mi rattrista ogni volta che vedo qualcuno fare quest'ultimo.


Interessante, mi chiedo però se forse hai reso più difficile la lettura. Ricordo che il mio primo project manager lo fece un paio di volte (e che anch'io ero colpevole di cambiarlo di nuovo) Anche se sono sicuro che in retrospettiva il suo approccio era migliore, non ero semplicemente abbastanza avanzato al momento per capire perché e come funzionava .
Maxim Gershkovich,

3

Non capire OOP. Purtroppo questo è molto più comune di quanto molti di noi probabilmente capiscano.

Saper creare una classe, una classe astratta, un'interfaccia o persino conoscere il polimorfismo è una cosa; capire come usarli correttamente a beneficio del tuo programma è un altro .


Se vuoi evitare questo, ho trovato queste domande e le risposte illuminanti:


Come a livello base, non sanno cosa intendi creando oggetti, classi ed eredità? O cose più avanzate come l'uso dei modelli di design (devi ammetterlo, il libro GoF è piuttosto astruso, sebbene ci siano ovviamente altri libri / guide)
Andrew M

@Andrew ho ampliato un po 'la risposta.
Nicole,

1
E vedo il contrario: non sapere come scrivere un semplice vecchio codice procedurale in C a causa del solo insegnamento di OOP. Poi di nuovo, non farmi andare in giro a persone a cui non viene più insegnato a scrivere parser perché gli viene detto che tutti quei problemi possono essere risolti usando lex e yacc.
quick_now

1
@quickly_now Questo è un buon punto, però, writing code other ways than OOPe writing bad OOPsono due cose totalmente diverse. Il primo, non ho problemi con.
Nicole,

La maggior parte delle università non insegna design orientato agli oggetti. Inoltre, molti posti di lavoro funzionano come i silos anche con sviluppatori junior ... o hanno sviluppatori "senior" che non conoscono la programmazione orientata agli oggetti. Ci sono sviluppatori "senior" che hanno ottenuto il titolo lavorando x anni e sviluppatori senior che conoscono le loro cose ....
Cervo,

3

Non sapendo ciò che non sai, e nell'ignoranza pensando di sapere tutto.

(E suo cugino vicino, non volendo chiedere.)

In parte è una cosa organizzativa: un'induzione in entrata appropriata farebbe molto per evitare che alcune di queste cose diventino problemi. Ma pochissime aziende hanno tempo o persone disponibili per un'induzione in arrivo - qualcosa che dovrebbe richiedere da pochi giorni a poche settimane e toglie agli sviluppatori il loro lavoro. Quindi dobbiamo spegnere gli incendi.


2

Sono stupito di quanti programmatori junior relativamente freschi di un programma CS sono deboli con gli algoritmi. La scelta sbagliata dell'algoritmo potrebbe non distinguersi davvero nella linea di applicazioni aziendali, ma quando si elaborano miliardi di richieste di servizi Web al giorno, è davvero importante.

Ecco una domanda di intervista che uso che manca a quasi tutti i programmatori Junior che evidenzia il problema:

Scrivi il codice che calcola l'ennesimo numero di Fibonacci .

Quasi sempre vanno per la maggior parte a scrivere l'ovvio ma inefficiente

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

Quando mi viene chiesto di commentare la complessità algoritmica, di solito ottengo "è peggio di O (N) ... uhm ... O (N logN)". In realtà è (molto) peggio di così ...


1
per rispondere alla tua domanda sulla completezza, dovresti conoscere quella formula per calcolare i numeri di fibonacci senza ricorsione, che userebbe al posto della ricorsione in primo luogo.
P:

1
@Pavel: c'è una soluzione O (n) e una O (1) ... in effetti 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
Non sto dicendo che la soluzione che hai pubblicato sia perfetta. Sto solo mettendo in discussione la pertinenza della tua domanda di follow-up per tale soluzione, la domanda sulla complessità. Che cosa vuoi ottenere chiedendolo e, cosa più importante, perché ti aspetti che ciò che desideri sia raggiunto, data la risposta alla domanda precedente? (Ho espresso il mio punto di vista?)
P. Shved l'

per chiarire il mio punto, ti suggerirei di chiedere come migliorare il codice invece di chiedere di stimare la complessità. Sono sicuro che alcuni diplomati del CS proporranno la memoization o diranno che conoscono la formula ma non vogliono mostrarla subito perché penseresti che siano smartass.
P:

In termini pratici, tale funzione potrebbe essere scoperta utilizzando un profiler e ottimizzata aggiungendo una cache di memoization. L'inefficienza è davvero un problema solo per grandi valori di N. Il modo migliore per insegnare a un junior su tale codice è costringerlo a passare attraverso l'intera esecuzione del codice usando un debugger. Per valori davvero grandi di N, si scopre che esiste una formula matematica maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/…
Jamie McGuigan

1

Fare rientro del codice all'indietro!

Ovviamente non è molto "tipico". Non potrei mai credere che fosse nemmeno possibile, ma come scriverebbe un normale sviluppatore

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

avrebbe scritto come (Dio, mi sembra ancora impossibile!)

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

Frustrante non è vero?


Cosa in nome di ...
Mike Speed

1
È davvero fantastico !!!
javanna,

È quasi come se fossero arabi, ebraici o cinesi in cui leggi da destra a sinistra, piuttosto che la convenzione occidentale di sinistra a destra. È un modo perfettamente valido per rientrare nel codice, ma significa che devi rientrare nel rientro l'intero file in base al livello più profondo di annidamento e rende il codice incompatibile con tutti coloro che condividono la convenzione opposta.
Jamie McGuigan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.