Nel corso degli anni, il mondo dello sviluppo software ha assistito a numerosi cambiamenti, evoluzioni e rivoluzioni.
Dai primi linguaggi come Fortran e Lisp fino all’odierna varietà di librerie, framework e linguaggi come React, Vue, Svelte, Qwik, Astro, Python, JavaScript, Go, Rust, etc. gli sviluppatori hanno sempre avuto davanti a sé una scelta cruciale: quale linguaggio o tecnologia adottare per i loro progetti.
Con l’aumentare delle opzioni tra le quali scegliere è sempre più complesso capire se scegliere lo strumento in base al progetto da realizzare o mantenere lo stesso per migliorare la propria efficienza con il linguaggio e ridurre i tempi di sviluppo.
In questa prospettiva, si affronta il dibattito se sia più vantaggioso per gli sviluppatori specializzarsi in una specifica tecnologia o mantenere una mentalità aperta per adattarsi facilmente a nuove sfide e opportunità. Emergono dunque visioni contrapposte: da una parte, c’è chi sostiene l’importanza della verticalizzazione, ovvero diventare esperti in un determinato linguaggio o framework; dall’altra, c’è chi crede che ciò che conta veramente sia il mindset e la capacità di problem solving, indipendentemente dal linguaggio o framework utilizzati.
Questa interrogazione non è semplicemente accademica o retorica, riflette un dilemma reale che influisce sulla carriera, sullo sviluppo personale e sul successo dei progetti software.
L’importanza della verticalizzazione
Chi sostiene l’importanza della verticalizzazione ritiene che diventare uno specialista in un determinato linguaggio o framework sia fondamentale per diventare un bravo sviluppatore. Essere un esperto in un determinato settore può offrire maggiori opportunità di carriera e un vantaggio competitivo rispetto ad altri sviluppatori.
La verticalizzazione, dunque, viene vista come una strategia per distinguersi e avere successo nel campo dello sviluppo software
Il ruolo del mindset
Dall’altra parte della discussione, c’è chi ritiene che il linguaggio o il framework utilizzato non siano così cruciali come il mindset e la capacità di problem solving di un programmatore.
Queste competenze trasversali permettono di adattarsi facilmente a nuove tecnologie e problemi complessi, indipendentemente dal contesto specifico.
Il mindset giusto consente di affrontare sfide in maniera creativa e innovativa, stimolando la crescita e l’apprendimento continuo.
Inoltre, capacità come la comunicazione, la collaborazione e la gestione del tempo sono considerate fondamentali per il successo di uno sviluppatore.
Competenze tecniche VS soft skills
La discussione, vista da una prospettiva più ampia, si sviluppa anche sulla contrapposizione tra competenze tecniche e soft skills.
Mentre alcune persone ritengono che le competenze tecniche siano la base imprescindibile per diventare un bravo programmatore, altri mettono maggior enfasi sulle soft skills.
Le competenze tecniche sono legate alla conoscenza approfondita di un linguaggio di programmazione o di un framework specifico, mentre le soft skills riguardano la capacità di comunicazione efficace, la gestione del tempo, il lavoro di squadra e la capacità di adattarsi ai cambiamenti.
La combinazione ideale tra verticalizzazione e mentalità
C’è poi una terza fazione, che riconosce l’importanza di entrambi i punti di vista, promuovendo dunque una combinazione ideale tra verticalizzazione e mentalità.
Essere esperti in un determinato linguaggio o framework offre una solida base tecnica, che può essere arricchita da un mindset aperto e flessibile.
Questo approccio consente di sfruttare al meglio le competenze tecniche acquisite, adattandole a diversi contesti e sfide.
Una mentalità orientata al problem solving e all’innovazione arricchisce la verticalizzazione e permette di essere versatili e agili nello sviluppo di soluzioni tecniche.
La combinazione di competenze specifiche e competenze trasversali può rappresentare un punto di forza per i programmatori.
L’opinione degli esperti
La verità è che questo dibattito non è nuovo.
Sin dai primi giorni dell’informatica, gli sviluppatori hanno discusso se fosse più cruciale per il loro mestiere imparare a fondo un linguaggio specifico o coltivare una mentalità adattabile e orientata alla soluzione.
Con l’avvento di nuovi paradigmi di programmazione, l’espansione del cloud computing e l’evoluzione dell’intelligenza artificiale, la questione è diventata ancora più pertinente.
Non so quanti caffè, birre o cocktail siano stati consumati in discussioni appassionate su questo tema, a volte penso che sia una delle discussioni più frequenti dopo `è nato prima l’uovo o la gallina? `
Anch’io, inizialmente molto schierato su un fronte, con il passare degli anni e l’accumulo di esperienze lavorative, ho iniziato a riconsiderare e ad apprezzare i punti di vista opposti, schierandomi tra i non schierati.
Ho coinvolto degli esperti del settore per esplorare la complessità di questo dibattito, portando alla luce opinioni diverse e riflettendo su come, forse, la sintesi tra questi due approcci possa forgiare sviluppatori più completi e preparati a navigare l’ecosistema digitale in continua evoluzione di oggi.
Soumaya Erradi – Lead Software Developer @ Scaling Parrots
Su questo tema in realtà ho due convinzioni che sono contrastanti
La prima è che conoscere un linguaggio o un framework non ti fa esperto del tema, se io so usare bene angular non vuol dire che sono una brava front end developer … ci sono concetti di programmazione che vanno imparati prima di buttarsi su un framework e senza dei quali non potrai mai capire fino in fondo il framework.
La seconda è che avere una conoscenza generale senza una specifica specializzazione ha poco senso, ti trovi ad essere una persona poco spendibile. Ci sono `fullstack` che sanno fare tutto ma in realtà non sanno fare niente davvero bene.. secondo me è fondamentale specializzarsi almeno in una cosa e coltivarla davvero bene, perché non credo che possa piacere davvero tutto allo stesso modo.
Francesco Sciuti – CEO @Devmy
Non credo possa esistere qualunque tipo di linguaggio che possa essere utile (o importante) senza che chi sviluppi abbia il giusto mindset e la giusta competenza per sfruttarlo al meglio.
Mio nonno andò a Parigi da Catania (negli anni ’50!) con una 500…beh, si poteva fare perché aveva il giusto mindset! 🤣
A parte la battuta, è fondamentale che usando un’astrazione si abbia anche chiara la consapevolezza di ciò che succede sotto il cofano, anche un po’ per apprezzare quanto lavoro è stato fatto per noi e quanto quindi possiamo goderne.
Gabriele Santomaggio – Staff Software Engineer @ VMware
Nel mio ambito, e ci tengo a precisare nel mio ambito, il linguaggio è una parte molto importante, ma non la fondamentale. Gli ambiti però possono essere diversi, il contesto lavorativo fa sicuramente la differenza!
Ci sono situazioni in cui è necessaria la verticalizzazione estrema, ti faccio un esempio: se tu sviluppi sul kernel di Linux, hai delle necessità così specifiche e così dettagliate per le quali non hai tempo né disponibilità mentale per guardare altre cose.
Più ci rifletto e più sono convinto che, anche nel caso della verticalizzazione, senza il giusto mindset, la capacità di ascoltare ed analizzare non potrai fare davvero la differenza.
Penso che, se dovessi identificare il vero errore, lo troverei nella superficialità! ci tengo dunque a sottolineare una mia convinzione: non importa che tu sia frontend, backend, leone o gazzella … studia e approfondisci!
Gregorio Palamà – Senior Cloud Engineer & DevOps @ Lutech
Sono sinceramente molto schierato, per me il linguaggio non fa la differenza, ma è il mindset che conta.
Mi rendo conto che, quando cerco di spiegare il mio punto di vista, si arriva sempre alla conclusione che comunque è fondamentale diventare esperto di uno specifico linguaggio; sono d’accordo ma con una specifica condizione: la verticalizzazione deve essere gestita con la possibilità di sfruttare ciò che si conosce per poter passare agilmente ad altri contesti e dunque poter raggiungere l’obiettivo anche con altri strumenti.
Quest’opinione ha radici solide, il primo esemprio risale addirittura alle olimpiadi di informatica quando ho utilizzato C++ invece di Pascal, dunque un linguaggio diverso da quello che conoscevamo sia io che gli altri concorrenti. Questa scelta mi ha consentito di sfruttare la logica e risolvere correttamente arrivando alla vittoria.
Luca Micieli – Head of Engineering @ Xtream
Competenze orizzontali, di software engineering e di best practices di programmazione sono spesso più importanti della conoscenza di uno specifico linguaggio.
Ovviamente ci sono alcune particolari applicazioni che possono giovare o necessitare di un particolare linguaggio con certe caratteristiche importanti per lo scopo. Inoltre i linguaggi cambiano, ne arrivano di nuovi, e spesso molti concetti (o addirittura elementi di sintassi) vengono portati da uno all’altro.
Soprattutto se si parla di linguaggi general purpose tipo Java, C#, python, JavaScript/TypeScript la cosa importante è conoscere le basi della buona programmazione e sceglierne uno, in modo da conscerlo a fondo.
Se dovessi riportarlo a tre schematiche domande:
– Penso che per alcuni ambiti specifici servano dei linguaggi precisi?
direi di sì!
– E’ più importante conoscere le basi delllo sviluppo rispetto alla conoscenza del linguaggio? sì!
– E’ anche importante conoscerne bene uno per fruttarlo al meglio e non essere qualunquisti? sì!
Paolo Insogna – Node.js TSC Member
Nella nostra industria è fondamentale il mindset. Senza alcun dubbio. Contrariamente a quello che si pensa, le tecnologie vanno e vengono, le persone no.
Con un po’ di impegno si può, a seconda dei casi, apprendere velocemente un nuovo linguaggio, un nuovo framework o un nuovo tool.
Il processo di apprendimento è decisamente accelerato se la persona ha una mente agile, conosce le similitudini (ad esempio, praticamente qualunque linguaggio ha l’if statement) tra le varie tecnologie.
Anche i processi di design o di debugging beneficiano enormemente dalle passate esperienze e dall’agilità e flessibilità del developer.
Infine, anche saper fare le giuste scelte per il lavoro è di vitale importanza per l’esecuzione del progetto. Ogni applicazione necessita del tool ad hoc, il Santo Graal esiste solo per Indiana Jones.
Ne consegue, quindi, che un bravo developer conosce più tool o tecnologie possibili con tutti i loro pro e contro.
Nella mia esperienza la scelta di una tecnologia secondo solo le scelte personali dello sviluppatore o del team sfortunatamente ha sempre portato con sé risultati che spesso potevano essere referenziati solo con il termine di `catastrofe`.
Il Linguaggio Universale dello Sviluppo Software
Dai vari dialoghi emerge una verità inconfutabile: le competenze trasferibili sono il vero cuore pulsante dell’efficacia di un programmatore. Queste abilità, che trascendono i confini dei linguaggi e degli ambienti di sviluppo, rappresentano il toolkit fondamentale che ogni sviluppatore dovrebbe coltivare.
Vediamo quali sono le competenze che possono influenzare il lavoro quotidiano di uno sviluppatore:
- Risoluzione dei problemi: Ogni progetto software punta a risolvere un problema specifico. La capacità di scomporre un problema complesso in parti gestibili, analizzarlo da diverse angolazioni e applicare soluzioni creative è fondamentale. Tale approccio al problem solving è valido e applicabile a prescindere dal linguaggio di programmazione utilizzato.
- Pensiero critico: È essenziale cercare di condurre una valutazione critica di requisiti, specifiche e soluzioni possibili per garantire l’alta qualità dello sviluppo software. Gli sviluppatori devono sapersi interrogare sulle proprie scelte, considerare i potenziali trade-off e prendere decisioni informate, una competenza che rimane costante a prescindere dalle tecnologie utilizzate.
- Apprendimento continuo: Il settore tecnologico è in perpetuo cambiamento, con nuovi linguaggi, framework e paradigmi che emergono regolarmente. La capacità di apprendere in modo efficiente, rimanere al passo con le novità e adattarsi velocemente agli strumenti emergenti è cruciale. Questa mentalità aperta e questa sete di conoscenza sono trasferibili e benefiche in ogni contesto di sviluppo.
- Comunicazione efficace: Che si debba spiegare un concetto tecnico a un membro non tecnico del team, di documentare il proprio codice o di collaborare con altri sviluppatori, avere ottime abilità comunicative è indispensabile. La chiarezza, la precisione e l’efficacia nella comunicazione sono fondamentali per il successo di progetti complessi e per forgiare relazioni professionali durature.
- Lavoro di squadra e collaborazione: Sviluppare software è tipicamente un processo collaborativo, con il contributo di diverse persone con diversi ruoli e competenze. Sapersi integrare efficacemente in un team, mostrare flessibilità e fornire supporto ai colleghi sono abilità trasferibili che elevano significativamente il contributo personale dello sviluppatore all’organizzazione.
Conclusione
Il dibattito sul ruolo dei linguaggi di programmazione nella formazione di un buon developer non è destinato a concludersi presto.
Ciò che è certo è che abbiamo a che fare con un ecosistema digitale dinamico e in continua evoluzione, in cui la capacità di apprendere e adattarsi, unita a una solida comprensione dei principi, sarà sempre più preziosa.
Dalle opinioni viste in precedenza, possiamo dunque cogliere il suggerimento a coltivare un’ apertura mentale, la capacità di apprezzare e apprendere da qualsiasi background tecnologico, e non precludere alcuna strada ma sapere come navigare il labirinto di parole e codici peri una carriera prospera.