
Selezione per in Yandex continua. Si svolge in cinque aree: backend, ML, sviluppo mobile, frontend e analisi. In questo blog, in altri blog su Habr e oltre, è possibile trovare molta informazione su come si svolge il tirocinio. Ma molto di questo processo rimane un mistero per chi non lavora in azienda. E se si guarda dalla prospettiva dei responsabili dello sviluppo, emergono ancora più domande. Come condurre correttamente un tirocinio, come massimizzare l'utilità reciproca con il tirocinante, come riuscire a conoscerlo in tre mesi e insegnargli tutto ciò che è necessario per continuare a lavorare?
Abbiamo preparato questo articolo in cinque. Presentiamoci: Ihnat Kolesnychenko del servizio tecnologie di calcolo distribuiti, Misha Levin del servizio intelligenza artificiale di Market, Denis Malykh del servizio sviluppo applicazioni, Serёzha Berezhnoy del dipartimento sviluppo interfacce di ricerca e Dima Cherkasov del gruppo sviluppo antifrode. Ognuno di noi rappresenta il proprio settore di tirocinio. Siamo tutti responsabili, abbiamo bisogno di tirocinanti e abbiamo una certa esperienza nel lavorare con loro. Lasciateci raccontare qualcosa di questa esperienza.
Colloqui prima del tirocinio
I candidati affronteranno diversi colloqui tecnici. Il successo in un colloquio dipende in misura minore dalle soft skills (abilità comunicative) e in maggiore misura dalle hard skills (competenze in matematica e programmazione). Tuttavia, i responsabili valutano entrambe le cose.
Ihnat:
Anche se una persona è molto brava, ma assolutamente non comunicativa, non potrà applicare tutte le proprie competenze. Su questo, chiaramente, prestiamo attenzione, ma non è un motivo per non prendere qualcuno per un tirocinio. In tre mesi tutto può cambiare, e inoltre, la tua prima impressione potrebbe rivelarsi errata. Se tutto è corretto, sarà necessario spiegare alla persona e cercarle altri team. Per i tirocinanti, la comunicazione non è affatto un fattore chiave. Le competenze professionali sono di gran lunga più importanti.
Denis:
Mi piacciono le persone che raccontano storie — in senso buono. Una persona che può descrivere come lei e il suo team abbiano affrontato eroicamente qualche imprevisto è interessante. Inizio a fare domande aggiuntive quando emerge una storia del genere. Ma questo accade raramente, se semplicemente si chiede «raccontami qualcosa di interessante sui tuoi progetti».
Un candidato una volta ha pronunciato una frase straordinaria che ho persino annotato: «Ho evitato con successo di affrontare compiti noiosi».

Poiché c'è poco tempo per comunicare, l’intervistatore cerca di ottenere informazioni utili sul candidato ogni minuto della riunione. È fantastico se lo stagista ha già pensato a quali dettagli della propria esperienza (non presenti nel curriculum) potrebbe condividere. Deve essere un racconto breve e pertinente.
Denis:
Faccio attenzione se una persona afferma di aver provato molti linguaggi e approcci. Le persone con una visione più ampia tendono a trovare soluzioni più eleganti in situazioni difficili. Ma questo è un vantaggio ambiguo. Si può raccogliere informazioni superficiali senza apprendere nulla di concreto.
Il tempo per le storie descritte da Denis di solito è riservato solo all'ultima intervista. Fino ad allora è necessario dimostrare le conoscenze fondamentali e pratiche che costituiranno la base del lavoro futuro. E, naturalmente, sarà necessario scrivere codice su una lavagna o su un foglio di carta.
Misha:
Verifichiamo la conoscenza della teoria della probabilità e della statistica matematica. Controlliamo se la persona ha esperienza con le metriche, con gli algoritmi di machine learning, con l'ottimizzazione dei loro parametri, con il riaddestramento, ecc. Ci aspettiamo che la persona possa scrivere codice a un livello sufficiente per essere un analista.
Denis:
Coloro che si presentano ai colloqui conoscono principalmente le lingue: qui a Ekaterinburg abbiamo una buona scuola per le lingue di base e buoni istituti. Ma, a dire il vero, un candidato per uno stage con buone competenze tecniche è un caso raro, almeno nella nostra epilsona. Ad esempio, Swift. In questo linguaggio è molto complesso lavorare con le stringhe e ci sono poche persone che possono lavorarci con facilità. Tali persone attraggono subito l'attenzione. Spesso propongo durante i colloqui una questione relativa all'elaborazione delle stringhe. E nel mio tempo ho avuto solo una persona che, senza indugi, è riuscita a scrivere un codice Swift di questo tipo su un foglio. Dopo di ciò, andavo in giro a raccontare a tutti che finalmente qualcuno era riuscito a risolvere questo problema in Swift su un foglio.
Verifica degli algoritmi durante il colloquio
Questo è un argomento a parte, poiché i candidati si pongono ancora la domanda: perché valutiamo sempre la conoscenza degli algoritmi e delle strutture dati? Anche i futuri sviluppatori mobili e frontend passano questo esame.
Misha:
Durante il colloquio diamo sempre un compito algoritmico. Il candidato deve pensare a come implementarlo in Python, preferibilmente senza errori. È importante capire come testare il proprio programma e correggerlo autonomamente.

L'esperienza con gli algoritmi è utile per tre motivi. In primo luogo, sarà ovviamente necessaria per compiti algoritmici - che non si presentano frequentemente, ma comunque capitano. In secondo luogo, lo sviluppatore sarà in grado di risolvere problemi relativi agli algoritmi in modo più efficace, anche se non richiedono di addentrarsi negli algoritmi stessi (e ce ne sono già parecchi). In terzo luogo, se non ti hanno insegnato algoritmi all'università, ma sai comunque come lavorarci, questo ti caratterizza come una persona curiosa e migliora la tua reputazione agli occhi dell'intervistatore.
Denis:
La maggior parte dello sviluppo mobile consiste nel "trasferimento di JSON". Ma ogni sei mesi ci sono casi in cui sono necessari gli algoritmi. Ora sto disegnando belle mappe per Yandex.Weather. E in una settimana ho dovuto implementare l'algoritmo di smoothing, l'algoritmo di Sutherland-Hodgman e l'algoritmo di Martinez. Se una persona non sapesse cosa sia una hash map o una coda prioritaria, rimarrebbe bloccata a lungo con questo e non saprebbe neanche se ce l'avrebbe fatta senza aiuto esterno.
Gli algoritmi sono la base dello sviluppo. Sono ciò che aiuta un programmatore a essere un programmatore. Non importa cosa fai. Sono necessari anche in progetti semplici, dove il lavoro principale consiste nel "trasferire JSON". Anche se non scrivi tu stesso gli algoritmi, ma usi implicitamente alcune strutture dati, è meglio comprenderli. In caso contrario, le tue applicazioni funzioneranno lentamente o in modo errato.
Ci sono programmatori che sono entrati nello sviluppo in modo accademico: hanno frequentato l'università, hanno studiato onestamente per cinque anni e hanno ricevuto una specializzazione. Conoscono gli algoritmi perché sono stati istruiti. E quindi, la sola conoscenza degli algoritmi non caratterizza affatto la visione di un individuo; questa deve essere verificata in altro modo.
E ci sono i self-taught, tra cui includo anche me stesso. Sì, formalmente ho un'istruzione IT, un diploma di ingegnere informatico. Ma i self-taught hanno imparato a programmare "nonostante tutto". Non avevano un programma universitario. Di solito non conoscono gli algoritmi, perché non si sono mai trovati nella necessità di studiarli. E quando una persona del genere comprende gli algoritmi, significa che ha dedicato tempo a studiarli. Dopo aver finito l'università, ho capito di avere delle lacune nei fondamenti degli algoritmi: il fatto è che la mia specializzazione era pratica. Sono andato e ho studiato i corsi online dell'Università di Princeton, molto noti grazie a Robert Sedgewick. Ho compreso e completato tutti i compiti. E quando qualcuno racconta una storia simile a un colloquio, mi interessa subito; nasce il desiderio di lavorare con lui o almeno continuare la conversazione.

Ihnat:
Quando interviste un tirocinante, in un certo senso ti aspetti anche di più che da un sviluppatore esperto. Si tratta della capacità di risolvere problemi algoritmici, scrivere in fretta almeno un codice corretto. Un candidato per uno stage è ancora all'università. Letteralmente un anno fa gli hanno parlato degli algoritmi nei dettagli. Ci si aspetta che possa riprodurli. Se la persona è sensata e ha seguito attentamente le lezioni, saprà semplicemente tutto, attingendo dalla memoria.
Quali compiti risolve un tirocinante
Di solito, il programma di tirocinio può essere pianificato e discusso durante i colloqui finali. All'inizio del lavoro, il tirocinante può ricevere compiti di formazione, i cui risultati non saranno utilizzati nella produzione. Inoltre, è poco probabile ricevere tali compiti. Spesso vengono assegnati progetti reali dal backlog, cioè considerati meritevoli di attenzione, ma non prioritari e "distaccabili" - in modo che la loro realizzazione non influisca su altri componenti. I responsabili cercano di distribuirli in modo che il tirocinante possa familiarizzare con diverse parti del servizio, lavorando in un ambiente insieme ad altri membri del team.
Ihnat:
Questi sono compiti estremamente utili. Forse non aumenteranno l'utilizzo del cluster del 10%, non faranno risparmiare un milione di dollari all'azienda, ma renderanno felici centinaia di persone. Ad esempio, abbiamo attualmente un tirocinante che gestisce un nostro cliente per avviare operazioni sui nostri cluster. Prima dell'avvio, l'operazione deve caricare alcuni dati sul cluster. Di solito questo richiede 20-40 secondi, e prima avveniva silenziosamente: lo lanciavi nella console e aspettavi, guardando lo schermo nero. Il tirocinante è arrivato e in due settimane ha creato una funzionalità: ora è visibile come i file vengono caricati e cosa sta succedendo. Da un lato, il compito non è difficile da descrivere, ma dall'altro c'è molto da esplorare, quali librerie controllare. La cosa più piacevole è che l'hai fatto, è passata una settimana e ora è sui cluster, e le persone lo stanno già usando. Scrivi un post nella rete interna e ti dicono grazie.

Misha:
I tirocinanti preparano modelli, raccolgono dati per essi, inventano metriche e conducono esperimenti. Gradualmente, iniziamo semplicemente a dare loro più libertà e responsabilità: verifichiamo se se la cavano. Se sì, passano al livello successivo. Non presupponiamo che un tirocinante sappia già fare tutto quando arriva. Il responsabile lo aiuta a orientarsi, fornendo un link a una risorsa interna o a un corso online.
Se il tirocinante dimostra di essere all'altezza, potrebbe ricevere qualcosa di prioritario, importante per il dipartimento o per altri servizi.
Dima:
Il nostro stagista attualmente sta lavorando su rafforzamenti hardcore dell'antifrode. Si tratta di un sistema che combatte vari tipi di abuso e frodi nei servizi di Yandex. Inizialmente pensavamo di dargli compiti non molto complessi e non troppo rilevanti per la produzione. Cerchiamo di pianificare in anticipo i compiti dello stagista, ma qui abbiamo visto che la persona "brucia", risolvendo rapidamente e bene le questioni. Alla fine, abbiamo iniziato a incaricarlo di avviare l'antifrode per i nuovi servizi.
Inoltre, c'è una piccola possibilità di ricevere un compito che i colleghi non avevano affrontato prima a causa del suo volume.
Dima:
C'è un vecchio sistema e ce n'è uno nuovo, ancora non completato. È necessario effettuare il trasferimento da uno all'altro. In prospettiva, si tratta di un progetto importante, anche se con alta incertezza: è necessario comunicare molto, leggere codice legacy poco comprensibile. Durante l'ultimo colloquio, abbiamo onestamente detto allo stagista che il compito era complesso. Lui ha risposto che era pronto, è entrato nel nostro team e ce l'ha fatta. Si è rivelato avere qualità non solo da sviluppatore, ma anche da manager. Era disposto a girare, informarsi, seguire.
Mentoring dello stagista
Lo stagista ha bisogno di un mentore per immergersi nei processi. Questa è una persona che è a conoscenza non solo dei propri compiti, ma anche di quelli dello stagista. Con il mentore c'è una comunicazione regolare, a cui è sempre possibile rivolgersi per un consiglio. Il mentore può essere il responsabile del gruppo (se è un gruppo ridotto) o qualcuno tra i colleghi, membri permanenti del team.
Ihnat:
Cerco di avvicinarmi almeno ogni giorno, chiedendo come va allo stagista. Se vedo che è bloccato, cerco di aiutarlo, domandando qual è il problema e scavando insieme a lui. È chiaro che questo mi sottrae energie e rende il lavoro dello stagista meno efficace nel complesso — anche io sto impiegando il mio tempo. Tuttavia, questo gli permette di non rimanere bloccato in nulla e ottenere risultati. E comunque è più veloce di quanto se lo facessi io stesso. Da solo impiegherei circa 5 ore per il compito. Lo stagista lo farà in 5 giorni. E sì, trascorrerò 2 ore in questi 5 giorni per comunicare con lui e aiutarlo. Ma almeno 3 ore le risparmierò e allo stagista farà piacere sapere che qualcuno gli ha dato una mano. In generale, è necessario semplicemente comunicare intensamente, osservare cosa fa la persona, non perdere il contatto.

Serёzha:
Il tirocinante è sempre in contatto con il proprio mentore e comunica con lui più volte al giorno. Il mentore esamina il codice, partecipa alla programmazione in coppia con il tirocinante e offre aiuto quando sorgono problemi. È esattamente in questo modo, combinando l'assistenza del mentore e compiti pratici, che formiamo i front-end developer.
Dima:
Affinché il tirocinante non si senta abbandonato, discutiamo chi sarà il suo mentore ancor prima dell'assunzione. Questo rappresenta anche un grande sviluppo per il mentore stesso: prepararsi al ruolo di team leader, verificarne la capacità di gestire sia il proprio compito sia quello del tirocinante. Ci sono incontri regolari, a cui a volte partecipo anche io, per rimanere aggiornato. Ma il mentore comunica regolarmente con il tirocinante. All'inizio spende molto tempo, ma questo è un investimento che ripaga.
Tuttavia, avere un mentore non significa che tutte le domande siano risolte attraverso di lui.
Misha:
Da noi è consuetudine che le persone che si trovano di fronte a un problema chiedano consiglio ai colleghi vicini e trovino rapidamente aiuto. Più velocemente cresce una persona, più spesso deve andare dai colleghi per scoprire qualcosa. È utile anche semplicemente conoscere i compiti degli altri per poter ideare nuove attività. Quando un tirocinante è in grado di contrattare da solo, comprendere quali siano le priorità dell'altra parte e arrivare a un risultato in team, cresce molto più velocemente di colui per il quale tutto questo deve fare un manager.
Serёzha:
Esiste documentazione, ma la maggior parte delle informazioni è dispersa nell'aria. Se riesci a assorbirle all'inizio della carriera, è un vantaggio aggiuntivo, e noi possiamo concentrare la persona su ciò che deve studiare.
Lo stagista ideale è colui che fa uno stage per alcuni mesi, diventa uno sviluppatore junior, poi semplicemente uno sviluppatore, poi un team leader e così via. Per questo ci vuole l'archetipo dell'allievo, che non ha paura di chiedere se qualcosa non è chiaro, ma è anche capace di lavorare in autonomia. Se gli viene detto che può leggere qualcosa lì, andrà, leggerà e tornerà realmente con nuove conoscenze. Può commettere errori, ma non deve sbagliare più di una, al massimo due volte nello stesso posto. Lo stagista ideale deve svilupparsi, assorbire tutto come una spugna, imparare e crescere. Chi si siede, cerca di capire tutto da solo, ci mette molto tempo, non fa domande, difficilmente si inserirà.
Fine dello stage
All'inizio del lavoro, firmiamo un contratto a tempo determinato con ciascuno stagista. Naturalmente, lo stage è retribuito, viene formalizzato secondo il Codice del lavoro russo e lo stagista ha gli stessi vantaggi di ogni altro dipendente di Yandex. Dopo tre mesi, il programma si conclude: molti stagisti vengono poi assunti a tempo indeterminato.

Da un lato, è importante per il manager che lo sviluppatore completi il suo minimo come stagista. È proprio a questo che si mira con lo stagista, fin dall'intervista. Tuttavia, questo è solo l'inizio della storia. Per noi, lo stagista è sempre un potenziale candidato all'assunzione. Il programma minimo per il manager è individuare un tale individuo sin dall'inizio, che dopo tre mesi non sia imbarazzato da raccomandare ad altri reparti. Il programma massimo è mantenerlo nello stesso team, assumendolo. Teniamo presente che uno studente del secondo o terzo anno — anche se è diventato stagista — con l'inizio dell'anno accademico dovrà continuare gli studi all'università.
Serёzha:
In primo luogo, per noi gli stagisti sono un potenziale capitale umano. Cerchiamo di far crescere persone all'interno di Yandex, affinché si adattino perfettamente ai nostri progetti. Forniamo loro tutto, dalla cultura della comunicazione e dell'interazione nei team a conoscenze enciclopediche su tutti i nostri sistemi.
Ihnat:
Quando prendiamo uno stagista, lo valutiamo subito per inserirlo nel nostro team. E, di norma, l'unico ostacolo è la mancanza di posizioni aperte. Cerchiamo di assumere giovani stagisti. Se una persona ha cinque anni di esperienza nello sviluppo, viene in Yandex e per noi è uno stagista, purtroppo questo significa che, sebbene sia una persona in gamba, come fa a entrare in Yandex con cinque anni di esperienza, non potrà crescere fino a diventare uno sviluppatore senior. Di solito la questione riguarda la velocità: una crescita lenta nel passato significa crescita lenta anche da noi. Sì, a volte ci vuole un po' per capire che una persona non ce la fa, e questo avviene solo dopo tre mesi. Ma è piuttosto raro. In più della metà dei casi siamo disposti a incorporare le persone a tempo indeterminato. Nella mia esperienza non è mai accaduto che una persona abbia completato con successo uno stage ma non sia riuscita a superare i colloqui per una posizione a tempo pieno.
Misha:
Offriamo a tutti gli stagisti di successo l'opportunità di rimanere in azienda. Dopo lo stage, di solito, assumiamo a tempo pieno più della metà di loro. Con gli stage estivi è più complicato, perché spesso arrivano studenti, ad esempio, del terzo anno e hanno difficoltà a conciliare lavoro e studio.
Dima:
Supponiamo che lo stagista svolga ottimamente i compiti e abbia molte prospettive di crescere come sviluppatore — anche se al momento ha poca esperienza. E supponiamo che non ci siano posti disponibili per un contratto a tempo indeterminato. Allora la questione è semplice: devo andare dal mio supervisore e dirgli — ecco una persona molto promettente, dobbiamo fare il possibile per tenerla, proponiamole qualcosa, troviamo un modo per integrarla.
Storie di stagisti
Denis:
La ragazza che è venuta a fare uno stage da noi nel 2017 era originaria di Perm. Questo è a circa 400 km a ovest di Ekaterinburg. E ogni settimana veniva da noi in treno per la Scuola di sviluppo mobile. Arrivava di giorno, studiava di sera e tornava poi indietro di notte. Valutando questo impegno, l'abbiamo invitata a lavorare qui, e questa scelta si è rivelata valida.
Ihnat:
Qualche anno fa abbiamo partecipato a un programma di scambio per tirocinanti. Lavorare con ragazzi stranieri è stato interessante. Ma i tirocinanti da lì non sono più preparati di quelli, ad esempio, da SHAD o da FKN. A prima vista, l'EPFL è tra le prime 20 università d'Europa. In quel momento – come un candidato non molto esperto – avevo delle aspettative: incredibile, stiamo intervistando persone dell'EPFL, saranno super fantastiche. Ma le persone che hanno ricevuto una formazione di base sulla programmazione da noi – inclusi anche gli atenei regionali, – si rivelano del tutto competitive.
Oppure un'altra storia. Attualmente ho nel mio team un ragazzo, molto giovane, circa 20 anni. Lavora a San Pietroburgo, è venuto per uno stage. È molto bravo. Tu, come al solito, dai compiti a una persona, lui li risolve, e dopo un mese viene e dice: ho risolto, guardo, e sembra che la vostra architettura sia mal costruita. Dobbiamo rifarla. Il codice diventerà più semplice, più chiaro. Certo, l'ho dissuaso: il carico di lavoro è grande, non c'è profitto per gli utenti, ma l'idea è assolutamente sensata. La persona ha compreso un processo complesso e ha proposto miglioramenti – forse impuntati, refactoring per il sake del refactoring. Ma non appena vorranno complicare quel codice, si potrà comunque procedere con quel refactoring. Di fatto sono passati alcuni mesi e ci siamo occupati di questa questione. Ho avuto il piacere di prenderlo nel mio team. Non siamo tutti geni. È possibile venire, capire qualcosa e indicarci i nostri problemi. Questo è molto apprezzato.
Misha:
Abbiamo alcuni tirocinanti davvero ideali. Nonostante la mancanza di esperienza, riescono a vedere il compito non solo a livello tecnico, ma anche globale. Propongono miglioramenti significativi. Hanno la comprensione di come tradurre i compiti dal mondo reale in tecnico, senza perdere di vista il senso. Si interrogano sul quale sia l'obiettivo finale, se sia opportuno approfondire i dettagli ora o se si può cambiare completamente approccio al compito o addirittura la formulazione del compito. Significa che hanno un potenziale per trovarsi a livelli superiori. Per percorrere questo cammino, devono semplicemente sviluppare alcune competenze e strumenti interni. In aggiunta, avviare alcuni progetti di successo.

Fonte: habr.com
