La maggior parte degli attuali programmatori ha ricevuto la propria formazione presso università. Nel tempo questo cambierà, ma per ora la situazione è tale che le buone risorse nelle aziende IT provengono comunque dalle università. In questo post, Stanislav Protasov, direttore delle relazioni universitarie di Acronis, condivide la sua visione sulle caratteristiche della formazione universitaria per i futuri programmatori. Docenti, studenti e chi li assume possono trovare utile qualche consiglio sotto il tag.
Negli ultimi 10 anni ho insegnato matematica, algoritmi, linguaggi di programmazione e apprendimento automatico in diverse università. Oltre al mio attuale incarico in Acronis, sono anche vice capo del dipartimento di Informatica teorica e applicata all'MFTI. Dalla mia esperienza presso buone università russe (e non solo), ho raccolto alcune osservazioni sulla formazione degli studenti nelle discipline informatiche.
La regola dei 30 secondi non funziona più
Sono certo che vi sarete imbattuti nella regola dei 30 secondi, che afferma che un programmatore dovrebbe capire lo scopo di una funzione dopo aver dato un'occhiata al suo codice. È stata formulata molto tempo fa, e da allora sono emersi numerosi sistemi operativi, linguaggi, hardware e algoritmi. Scrivo codice da 12 anni, ma relativamente di recente ho visto il codice sorgente di un prodotto che, a prima vista, mi è sembrato come un incantesimo magico. Oggi, se non si è immersi nel campo, la regola dei 30 secondi smette di funzionare. In caso contrario, non vi basteranno neanche 30, ma neppure 300 secondi per capire cosa sta succedendo.
Ad esempio, se volete scrivere driver, dovrete immergervi in questo campo, leggere migliaia di righe di codice specifico. Con questo approccio allo studio della materia, il professionista sviluppa una 'sensazione di flow'. Come nel rap, dove la sensazione di una buona rima e di un ritmo corretto si manifesta senza una razionalizzazione specifica. Allo stesso modo, un programmatore ben preparato può facilmente riconoscere codice inefficace o semplicemente di scarsa qualità, senza entrare nei dettagli per capire dove è stata violata la correttezza stilistica o dove è stato utilizzato un approccio non ottimale (ma spiegare questa sensazione può essere piuttosto difficile).
La specializzazione e la crescente complessità portano al fatto che la laurea triennale non consente più di esplorare tutte le direzioni in modo sufficientemente approfondito. Ma proprio a questo livello di istruzione è necessario acquisire una visione d'insieme. Solo dopo, durante il master o al lavoro, sarà necessario trascorrere del tempo per immergersi nella problematica e nella specificità del campo di studio, imparare il gergo, i linguaggi di programmazione e il codice dei colleghi, leggere articoli e libri. A mio avviso, solo in questo modo l'università può “allenare la barra” per il futuro. .
Quale linguaggio di programmazione è meglio insegnare in università?

Con mia grande gioia, i docenti universitari hanno già rinunciato a cercare la risposta giusta alla domanda: “Su cosa è meglio programmare?”. Le discussioni su cosa sia meglio — C# o Java, Delphi o C++ — sono praticamente svanite. L'emergere di un gran numero di nuovi linguaggi di programmazione e l'accumulo di esperienza pedagogica hanno portato alla comprensione nell'ambiente accademico che ogni linguaggio ha la sua nicchia.
Il problema dell'insegnamento utilizzando un linguaggio di programmazione piuttosto che un altro ha smesso di essere prioritario. Non importa quale linguaggio venga utilizzato nel corso. L'importante è che il linguaggio sia sufficientemente espressivo. Il libro “” è una buona illustrazione di questa osservazione. In questa pubblicazione già diventata un classico, tutti gli esempi sono forniti in Java — un linguaggio senza puntatori, ma con Garbage Collector. È difficile che qualcuno possa sostenere che Java sia la scelta ottimale per scrivere codice parallelo ad alte prestazioni. Ma per spiegare i concetti esposti nel libro, il linguaggio si è rivelato adatto. Un altro esempio è di Andrew Ng, insegnato nel linguaggio Matlab nell'ambiente Octave. Oggi si potrebbe scegliere un altro linguaggio di programmazione, ma qual è, in sostanza, la differenza, se ciò che conta sono le idee e gli approcci?
Più pratico e vicino alla realtà
Allo stesso tempo, negli ultimi anni, le università hanno visto un aumento significativo del numero di professionisti. Se in passato i programmi universitari russi venivano criticati per essere scollegati dalla realtà, oggi non possiamo più dire lo stesso per l'istruzione IT. Dieci anni fa, nelle università c'erano pochissimi docenti con esperienza pratica nel settore. Ora, sempre più spesso, nei corsi specifici le lezioni sono tenute non da docenti di informatica a tempo pieno, ma da specialisti IT praticanti, che insegnano solo 1-2 corsi durante il loro tempo libero. Questo approccio si giustifica in termini di preparazione qualitativa del personale, aggiornamento dei corsi e, naturalmente, ricerca di potenziali dipendenti per le aziende. Non credo di rivelare un segreto dicendo che supportiamo il dipartimento base all'Università Statale di Mosca e stiamo costruendo relazioni con altre università anche per preparare studenti che possano iniziare la loro carriera in Acronis.
Matematico o programmatore?

Le dispute che un tempo si sviluppavano attorno ai linguaggi di programmazione sono passate a un livello filosofico. Ora a discutere sono i cosiddetti “programmatori” e “matematici”. In linea di principio, queste scuole potrebbero svilupparsi in due programmi educativi distinti, ma l'industria ancora non distingue bene tali sfumature, e da un'università all'altra abbiamo un'istruzione simile con un leggero orientamento diverso. Questo significa che sia per lo studente sia per l'azienda in cui lavorerà, sarà necessario completare il puzzle delle conoscenze con pezzi mancanti.
L'arrivo nelle università di professionisti che scrivono codice industriale in diversi linguaggi offre agli studenti competenze di sviluppo di maggiore qualità. Essendo ben familiari con le implementazioni delle librerie standard, i framework e le tecniche di programmazione, i programmatori praticanti stimolano negli studenti la voglia di scrivere codice di qualità, farlo rapidamente e in modo efficiente.
Questa abilità utile, tuttavia, a volte porta alla nascita di 'inventori di biciclette'. Gli studenti programmatori pensano così: “che cosa mi costa scrivere altre 200 righe di buon codice, che risolva direttamente il compito assegnato?”.
I docenti che hanno ricevuto una formazione matematica classica (ad esempio, facoltà di matematica o matematica applicata) lavorano più frequentemente in ambienti quasi scientifici o nel campo della modellazione e analisi dei dati. I "matematici" vedono i problemi nella sfera dell'informatica in modo diverso. Operano principalmente non con il codice, ma con algoritmi, teoremi e modelli formali. Un importante vantaggio dell'approccio matematico è la chiara comprensione principiale di ciò che può e non può essere risolto e come farlo.
Pertanto, i docenti di matematica parlano di programmazione con un'inclinazione verso la teoria. Gli studenti che provengono dai "matematici" tendono a proporre soluzioni ben pensate e teoricamente più avanzate, ma, di norma, non ottimali dal punto di vista del linguaggio e, spesso, semplicemente scritte in modo approssimativo. Tali studenti considerano il loro obiettivo principale quello di dimostrare la capacità di risolvere tali problemi in linea di principio. Tuttavia, l'implementazione può lasciare a desiderare.
I ragazzi, cresciuti in scuole o nei primi anni da programmatori, portano con sé una "bellissima bicicletta", che, tuttavia, di solito non funziona in modo troppo efficiente asintoticamente. Essi, al contrario, non si pongono l'obiettivo di teorizzare in profondità e cercare nei libri di testo soluzioni ottimali, preferendo un codice elegante.
In diverse università, durante i colloqui, di solito vedo quale "scuola" sta alla base della loro formazione. E quasi mai ho incontrato un equilibrio ideale nell'istruzione di base. Da bambino, nella mia città, era possibile prepararsi per le olimpiadi di matematica, ma non c'erano circoli di programmazione. Ora, invece, nei circoli i bambini imparano a programmare in Go e Python, che sono "alla moda". Pertanto, già a livello di ammissione all'università ci sono discrepanze negli approcci. Ritengo che sia importante mantenere entrambe le competenze all'università, altrimenti entrerà in azienda o uno specialista con una scarsa base teorica, o una persona che non ha imparato e non desidera scrivere codice di alta qualità.
Come si può "allenare la barra trasversale" per i futuri

È chiaro che, in tali condizioni, uno studente sceglie semplicemente ciò che gli piace di più. Il docente, d'altra parte, trasmette solo il punto di vista a lui più vicino. Ma tutti ne trarranno beneficio se anche il codice sarà scritto bene, e sotto il profilo degli algoritmi tutto sarà chiaro, giustificato ed efficace.
- Orizzonte IT. Un laureato in Computer Science è già uno specialista formato con una solida preparazione tecnica, che probabilmente ha scelto la sua area di specializzazione. Ma nei corsi iniziali non sappiamo cosa farà. Potrebbe orientarsi verso la ricerca o l'analisi, oppure, al contrario, scrivere enormi quantità di codice ogni giorno. Pertanto, è fondamentale mostrare allo studente tutti gli aspetti del lavoro nel settore IT e introdurlo a tutti gli strumenti. È ideale se i docenti dei corsi teorici mostrano il legame con la pratica (e viceversa).
- Punto di crescita. Evitare di cadere negli estremi è nell'interesse stesso dello studente. Capire chi sei — “matematico” o “programmatore” — non è difficile. Basta ascoltare il primo istinto nel risolvere un problema: cosa hai voglia di fare — consultare il libro di testo in cerca di un approccio ottimale o scrivere un paio di funzioni che poi ti saranno utili? Da questo si può costruire la propria futura traiettoria di formazione complementare.
- Fonti alternative di conoscenza. Capita che il programma sia ben bilanciato, ma “Programmazione sistemica” e “Algoritmi” siano tenuti da persone completamente diverse, e alcuni studenti si sentono più vicini al primo docente, mentre altri al secondo. Ma anche se il professore non ti piace, questo non è un motivo per trascurare alcune materie a favore di altre. Gli stessi laureati sono interessati a trovare in sé la determinazione per lavorare con le fonti di conoscenza e non fidarsi mai di opinioni radicali come “la matematica è la regina delle scienze, l'importante è conoscere gli algoritmi” o “un buon codice compensa tutto il resto.”
Per approfondire le proprie conoscenze in teoria, è possibile fare riferimento a letteratura specializzata e corsi online. È possibile migliorare l'abilità di lavorare con i linguaggi di programmazione su Coursera, Udacity o Stepik, dove sono disponibili molti corsi diversi. Inoltre, gli studenti spesso iniziano a seguire corsi avanzati sui linguaggi se sentono che il docente di algoritmi conosce bene la matematica, ma non può rispondere a domande complesse riguardo l'implementazione. Non tutti saranno d'accordo con me, ma nella mia esperienza ha dimostrato di essere utile , dove vengono trattate sistematicamente tutte le funzionalità più complesse del linguaggio. In generale, scegliete un corso con alte valutazioni, offerto da aziende o università di prestigio.
Competenze trasversali

Entrando nel mondo del lavoro da qualsiasi università, da una startup a una grande azienda, anche gli studenti delle migliori università si trovano poco adatti al reale ambiente di lavoro. Questo perché oggi le università “coccolano” molto gli studenti. Anche saltando molte lezioni, non preparandosi in tempo per le verifiche e gli esami, dormendo o arrivando in ritardo agli esami, chiunque può superare un esame e risuperarlo, ottenendo comunque la laurea.
Tuttavia, oggi ci sono tutte le condizioni affinché gli studenti vengano preparati alla vita adulta e all'attività professionale autonoma. Dovranno non solo programmare, ma anche comunicare. E anche questo deve essere insegnato. Nelle università esistono diversi formati per sviluppare queste abilità, ma purtroppo spesso non viene data loro sufficiente attenzione. Tuttavia, abbiamo a disposizione molte opportunità per acquisire competenze di lavoro in team.
- Comunicazione scritta in contesti professionali. Sfortunatamente, la maggior parte dei professionisti che esce dall'università non ha una chiara comprensione dell'etichetta della corrispondenza. La specificità della comunicazione nei messaggeri è cambiata con lo scambio di messaggi sia di notte che di giorno, utilizzando uno stile colloquiale e un lessico informale. Tuttavia, si potrebbe allenare la scrittura durante la comunicazione dello studente con il dipartimento e l'università.
Nella pratica, i manager si trovano spesso di fronte alla necessità di decomporre un grande progetto in compiti più piccoli. Per fare questo, è importante descrivere bene ogni compito e i suoi componenti, affinché i programmatori junior comprendano cosa ci si aspetta da loro. Un compito mal formulato porta spesso alla necessità di modifiche, e quindi l'esperienza nella comunicazione scritta aiuta i laureati a lavorare in team distribuiti.
- Presentazione scritta dei risultati del proprio lavoro. Per presentare i propri progetti di studio, gli studenti degli ultimi anni possono scrivere post su Habr, articoli scientifici e anche semplici rapporti. Ci sono molte opportunità per questo: già dal secondo anno in alcune università iniziano i lavori di corso. Si possono anche utilizzare saggi come forma di valutazione: solitamente sono più simili a un articolo di attualità. Questo approccio è già stato implementato presso la HSE.
Se un'azienda pratica un approccio flessibile nello sviluppo, è necessario presentare i risultati del proprio lavoro in porzioni più piccole, ma più frequentemente. Per questo è importante saper comunicate sinteticamente il risultato del lavoro di un singolo specialista o dell'intero team. Oggi molte aziende tengono 'revisioni' annuali o semestrali, dove i dipendenti discutono i risultati e le prospettive di lavoro. Una revisione di successo è la principale causa di avanzamenti di carriera e premi, come ad esempio in Microsoft, Acronis o Yandex. Sì, puoi essere un bravo programmatori, ma 'stando nell'angolo' anche un esperto può perdere contro chi sa presentare bene il proprio successo.
- Scrittura accademica. È importante sottolineare la scrittura accademica. Gli studenti dovrebbero familiarizzare con le regole per scrivere testi scientifici, utilizzare argomenti, cercare informazioni in diverse fonti e formattare correttamente le citazioni. È consigliabile farlo in lingua inglese, poiché nella comunità accademica internazionale ci sono molti più testi di qualità e per diverse discipline ci sono già schemi stabiliti per la presentazione dei risultati scientifici. Certo, le competenze di scrittura accademica sono necessarie anche per la preparazione di pubblicazioni in lingua russa, ma ci sono molti meno esempi di articoli moderni di qualità in inglese. Queste competenze possono essere acquisite attraverso corsi specifici, che oggi fanno parte di molti programmi educativi.
- Gestire riunioni. La maggior parte degli studenti non sa come prepararsi per le riunioni, redigere un verbale e analizzare i dati. Tuttavia, se sviluppiamo questa abilità all'università, ad esempio partecipando a progetti collettivi, possiamo evitare una perdita di tempo inutile sul posto di lavoro. Per questo è necessario un controllo sul lavoro di progetto degli studenti, per insegnar loro a condurre riunioni in modo efficace. Nella pratica, questo costa a ogni azienda un sacco di soldi: se infatti diverse persone con un alto stipendio dedicano un'ora di lavoro a una riunione, è auspicabile che ci sia un ritorno adeguato.
- Pubbliche relazioni. Molti studenti si trovano a dover parlare in pubblico solo durante la difesa della tesi. E non tutti sono pronti a questo. Ho visto molti studenti che:
- stanno di spalle rispetto agli ascoltatori,
- si dondolano, cercando di portare la commissione in uno stato di trance,
- rompono penne, matite e righelli,
- girano su se stessi,
- guardano a terra.
È normale quando una persona parla per la prima volta. Ma bisogna iniziare a lavorare su questo stress prima, con la difesa degli elaborati in un'atmosfera amichevole, tra compagni di corso.
Inoltre, la pratica standard nelle aziende è dare l'opportunità al dipendente di proporre un'idea, ottenere finanziamenti per essa, una posizione o un progetto dedicato. Ma, se ci pensiamo, è una sorta di difesa della tesi, solo a un livello più alto. Perché non allenare queste utili competenze professionali durante gli studi?
Cosa ho trascurato?
Uno dei motivi per cui ho scritto questo post è stato un articolo, . L'autore dell'articolo si concentra solo sugli svantaggi degli studenti russi, osservati dagli insegnanti stranieri. La mia esperienza di insegnamento in diverse università dimostra che il sistema scolastico e universitario russo offre una buona base. Gli studenti russi sono ben informati in matematica e algoritmi, con loro è più facile stabilire una comunicazione professionale.
Nel caso degli studenti stranieri, al contrario, le aspettative dell'insegnante russo a volte possono risultare eccessive. Ad esempio, a livello di preparazione di base in matematica, gli studenti indiani che ho incontrato sembrano simili a quelli russi. Tuttavia, a volte mancano di conoscenze specialistiche al termine della laurea triennale. Buoni studenti europei avranno probabilmente una preparazione matematica scolastica meno solida.
Se stai studiando o lavorando in un'università, puoi già iniziare a lavorare sulle competenze comunicative (le tue o quelle degli studenti), ampliando la base fondamentale e praticando la programmazione. Per questo, nel sistema educativo russo sono previste tutte le possibilità: è solo necessario saperle sfruttare correttamente.
Sarei lieto se nei commenti a questo post condividessi i tuoi link a corsi e metodi che aiutano a bilanciare l'educazione, così come altri modi per migliorare le soft skills durante gli studi universitari.
Fonte: habr.com
