Sviluppatore “senior”

L’industria del software si muove alla velocità della luce.

Come sviluppatori software siamo costantemente bombardati da notizie di nuove tecnologie, nuovi framework, nuovi linguaggi, nuovi paradigmi, nuovi modelli organizzativi, nuovi modelli di sviluppo, nuovi modelli di deployment, nuovi modelli di testing, nuovi modelli di integrazione, nuovi modelli di delivery, nuovi modelli di monitoraggio, etc.

Una valanga travolgente di innovazione che non da segni di rallentamento.

È questa l’arma a doppio taglio nelle mani di uno sviluppatore software. Da una parte abbiamo a che fare con infinite opportunità di crescita e il prospetto di non annoiarci mai. Dall’altra parte, siamo sempre alla rincorsa della “next big thing” e, per quanto ci sforziamo di stare al passo con i tempi, siamo sempre inesorabilmente un passo indietro.

In questo contesto così dinamico, cosa significa essere uno sviluppatore “senior”?

Facendo un parallelo, se per esempio dovessimo dare una definizione di un profilo “senior” nell’industria aeronautica, potremmo pensare al ruolo del capitano.

Il capitano di un aereo è un profilo che è responsabile di tutti gli aspetti del volo, del velivolo, dei passeggeri e del personale di bordo. È un profilo che può sicuramente contare su diversi anni di studio, una grande esperienza (esplicitamente espressa in ore o miglia di volo). È sicuramente un percorso lungo che richiede tanta dedizione, ma anche un percorso piuttosto chiaro e standardizzato e che probabilmente non ha avuto significative variazioni negli ultimi 40 anni…

Possiamo trovare una definizione simile anche in ambito software?

Dipende!

In questo capitolo cercheremo di esplorare cosa significa essere senior in ambito software. Discuteremo cosa può e deve offrire un senior al suo team e alla sua azienda, dagli aspetti più tecnici (hard skills) a quelli più umani (soft skills).

Ma prima di imbarcarci in questo viaggio, è importante puntualizzare che non esiste una definizione canonica di “senior”: ogni azienda, ogni team e ogni individuo hanno la propria definizione.

La nostra esplorazione sarà contaminata dalle opinioni e le esperienze personali degli autori e lo spirito di questo capitolo non è quello di offrire una guida assolutamente corretta su come diventare senior in dieci mosse, ma piuttosto essere un piccolo almanacco di buone pratiche per ispirare coloro che ambiscono a diventare senior e per coloro che sono già riconosciuti come tali e sono alla ricerca di spunti per migliorarsi.

Senior? Si, ma quanto?

Immaginiamo per un attimo di essere il CTO di un’azienda in forte crescita. Abbiamo costruito un prodotto grazie al supporto di un’azienda di consulenza esterna, ma adesso è fondamentale portare lo sviluppo in-house e costruire un team interno per poter rendere l’azienda stabile e raggiungere i prossimi obiettivi di crescita.

Quello che ci serve in questa fase è un team di sviluppatori senior che possa costituire la base attorno alla quale costruire e far crescere un team più ampio e variegato di professionisti del software.

Iniziamo a pensare a come scrivere una job spec - ovvero una descrizione dell’offerta e del ruolo - per la ricerca di questi sviluppatori senior. Cosa dovremmo scrivere? Cosa dovremmo cercare? Come definiamo il profilo che stiamo cercando?

Non abbiamo ancora scritto il titolo del profilo ricercato e siamo già in preda ad un blocco creativo. Forse è il caso di andare a sbirciare cosa fanno le aziende concorrenti o altre aziende leader nel mercato del software…

Dopo una breve ricerca online, ci troviamo ad avere compilata una lista di possibili ruoli che sembrano essere sinonimi di senior: Sviluppatore Senior, Sviluppatore Staff, Sviluppatore Principal, Architetto del software, Sviluppatore Mago, Sviluppatore Barbabianca, Sviluppatore Unicorno, Rockstar, Ninja, Guru…

OK. Sembra quasi che stiamo cercando di creare un gruppo di appassionati di Dungeons and Dragons più che un team di sviluppatori software… ci serve una pausa!

Dopo aver preso un caffè e aver fatto un giretto in giardino, torniamo alla scrivania e riprendiamo a ragionare su cosa stiamo cercando. Decidiamo di ignorare i vari titoli visti online e di concentrarci sul valore che stiamo cercando di portare all’interno della nostra azienda.

Cosa ci serve? Cosa ci aspettiamo da questi sviluppatori senior?

Un senior dovrebbe essere qualcuno che sia in grado di far progredire progetti e persone. Qualcuno che, con le proprie competenze, possa moltiplicare la produttività aziendale. Si, un “moltiplicatore di forze”, questo è quello che ci serve!

Non vogliamo un eroe solitario in grado di scrivere migliaia di righe di codice al giorno e di produrre tanto quanto dieci sviluppatori! Piuttosto cerchiamo un individuo che sappia giocare di squadra e che sappia valorizzare e massimizzare le competenze e le esperienze di tutti i membri del team.

Ok, facile a dirsi… ma, nella pratica, di quali competenze, compiti e responsabilitá stiamo parlando? Quale dovrebbe essere l’attitudine di questo profilo senior?

Gli anni di esperienza

Una delle caratteristiche chiave che è possibile riscontrare nella maggior parte delle offerte di lavoro nel mercato del software è il numero di anni di esperienza.

“Ricerchiamo professionista volenteroso con 5 anni di esperienza con React.js”.

Oppure piú genericamente: “Ricerchiamo professionista con almeno dieci anni di esperienza nel settore dello sviluppo software”.

Questo tipo di frasi sono così comuni da sembrare quasi banali e ogni tanto riescono anche a rubare qualche sorriso.

Ecco un esempio simpatico. Sebastián Ramirez (anche conosciuto come @tiangolo), famoso per aver creato il web framework FastAPI, postò un tweet menzionando un annuncio di lavoro nel quale si cercava un professionista con 5 anni di esperienza proprio con FastAPI. Beh, lui stesso, benché creatore e massimo esperto di FastAPI, non era idoneo per quell’opportunità in quanto aveva creato FastAPI solo 2 anni prima e non aveva ancora acquisito i 5 anni di esperienza richiesti!

Ah, se solo potessimo tornare indietro nel tempo!

Sembrerà ridicolo, ma è invece indicativo di quanto le offerte di lavoro abbiano requisiti assolutamente irrealistici e di quanto spesso si enfatizzino gli anni di esperienza con determinate tecnologie piuttosto che le competenze acquisite.

Ok, tornando al punto, quanti anni servono per essere un senior? O ancora, qual è l’età minima richiesta per poter essere considerati degli sviluppatori senior?

Queste sono due delle domande più fuorvianti da porsi nel mondo software, per quanto incredibilmente comuni!

Perché?

Beh, ritornando a indossare gli abiti del nostro fantomatico CTO, assumeremmo qualcuno solo perché è stato dieci anni seduto ad una scrivania a guardare lo schermo di un computer o lo assumeremmo perché è in grado di contribuire alla risoluzione di specifici problemi di business?

È vero che aver investito più tempo in certe attività potrebbe significare aver avuto più occasioni per imparare ed eccellere in una data disciplina. Ma il mondo software è una disciplina così complessa ed in continuo cambiamento in cui l’equazione “tanto tempo = grandi competenze” diventa una semplificazione troppo banale e rischiosa.

Nella mia carriera ho avuto la fortuna di lavorare con dei colleghi giovani ma brillanti, in grado di comprendere a fondo problemi tecnici e di business e in grado di dare un grandissimo contributo al team in cui lavoravano.

Mi è anche capitato di lavorare con colleghi con tanti anni di esperienza e anche grosse aziende sul CV che invece si sono limitati a fare il minimo indispensabile e, quando coinvolti nella risoluzione di problemi complessi, mostravano serie lacune sia tecniche che di comprensione del business.

Certo, queste sono estremizzazioni e non sono sicuramente la norma. Il punto è che non bisogna assolutamente puntare né agli anni di esperienza né all’età, ma piuttosto mirare alle competenze acquisite e alla capacità (e volontà) di continuare ad acquisirne di nuove.

Le competenze

Se non è una questione di anni di esperienza sul campo su cosa dobbiamo concentrarci?

Se definiamo un senior come qualcuno in grado far progredire progetti e persone, ci saranno sicuramente delle competenze necessarie al fine di poter raggiungere questi obiettivi.

Queste competenze non sono esclusivamente tecniche ma anche non tecniche o di comunicazione. Uno sviluppatore senior deve saper familiarizzare con piú linguaggi di programmazione, framework, database, architetture software, etc, ma deve anche avere ottime capacità comunicative, di leadership, di business e problem-solving.

A volte le skill non tecniche possono risultare anche più importanti di quelle prettamente tecniche, perché non importa solamente quello che sai, ma soprattutto come tu sia in grado di trasmetterlo permettendo agli altri di sfruttare il tuo sapere, come condividere la tua esperienza, sbloccare situazioni difficili e rendere il gruppo di lavoro autosufficiente e produttivo.

L’attitudine al comando è altrettanto importante, in quanto è responsabilità del senior quella di fare da tutor ai junior della squadra, dirigere i vari gruppi del progetto e prendere le scelte tecniche più difficili. Ed è suo anche il compito di motivare la squadra, assegnare i compiti in modo efficace e fare da guida e supporto all’occorrenza.

Un’altra capacità indispensabile per lo sviluppatore senior è la propensione alla risoluzione dei problemi. Uno sviluppatore senior deve essere in grado di pensare in modo critico, analizzare problemi complessi e trovare soluzioni creative. Dovrebbe essere a suo agio all’interno di situazioni poco chiare e non ancora definite, pronto ad adattarsi ad ogni nuovo sviluppo.

In fin dei conti, l’ingegneria del software non è altro che risoluzione di problemi!

Tuttavia, i problemi non sono sempre di natura tecnica, specie all’interno delle organizzazioni più strutturate, dove sono presenti interlocutori con esperienze diverse e di differente formazione. In questo contesto i problemi possono essere comunicati nel modo sbagliato e mutare di frequente. Per questo diventa fondamentale contribuire alla comprensione dei problemi che si stanno riscontrando, formulare e condividere gli obiettivi e guidare la squadra di lavoro nella giusta direzione; competenze cruciali, queste, che possono avere un impatto enorme. Per questo, a volte, la migliore soluzione da un punto di vista strettamente tecnico non è necessariamente la migliore soluzione per una data azienda.

Un senior dovrebbe essere in grado di riconoscere queste situazioni e di abbandonare soluzioni tecnicamente ottimali in favore di soluzioni piú adatte alla squadra e alle circostanze di business.

Un esempio estremo potrebbe essere quello di uno sviluppatore capace di scrivere codice di basso livello e iper-ottimizzato per un dato obiettivo. Questo approccio potrebbe limitare l’accesso al progetto a pochissimi individui con competenze simili. Quante aziende hanno veramente l’esigenza di produrre codice così ottimizzato? Spesso è più conveniente puntare all’agilità e alla possibilità di iterare e sperimentare velocemente.

Le competenze tecniche da sole non bastano a comprendere tutte le sfaccettature di un progetto e a trovare soluzioni che soddisfino tutte le necessità di business e spesso i migliori compromessi possono essere trovati con il giusto equilibrio di competenze sia tecniche che di business.

Il profilo a “T”

Concentriamoci un attimo sulle competenze tecniche. Dopotutto, visto come funziona il settore del software oggigiorno, questo è il primo aspetto sul quale uno sviluppatore viene valutato! Se non si è in grado di dimostrare delle competenze tecniche adeguate alle aspettative, allora si avranno pochissime chance di emergere ed ottenere un’offerta di lavoro o una promozione!

In qualità di sviluppatore senior, possedere competenze tecniche che coprano diverse aree è fondamentale. Per essere uno sviluppatore senior di successo è essenziale avere un profilo a “forma di T” (o T-Shaped profile), che si concretizza nel saper padroneggiare una specifica competenza pur possedendo solide e ampie basi in altre aree.

Immagina di disegnare una “T”, la linea verticale rappresenta una profonda conoscenza in una specifica area tecnica. Più questa linea è lunga più si è raggiunta una padronanza della specifica area tecnica. Invece, la linea orizzontale rappresenta una vasta conoscenza in tante altre aree, non necessariamente una conoscenza approfondita ma sufficientemente sviluppata da fornire i mezzi per poter spaziare tra gli argomenti piú disparati durante una conversazione tecnica.

Questo tipo di profilo permette al singolo individuo di poter contribuire in modi diversi ad un progetto pur essendo esperto nella propria area di specializzazione primaria: avendo competenze diverse, i profili a T consentono una collaborazione efficace con membri di lavoro, aprendo la strada ad un processo di sviluppo con maggiori probabilità di successo.

Un buon modo per costruire il profilo a T è quello di iniziare a sviluppare il tuo tratto verticale, ovvero quello che alla fine diventerà il tuo punto di forza! Concentrati per un po’ su una singola area. Ovviamente è meglio preferire delle aree tecniche per le quali ci si senta particolarmente propensi e per le quali si abbia un grosso interesse. Più qualcosa ci appassiona, più è facile stare al passo con l’innovazione e trovare il tempo per sperimentare ed imparare.

Quando pensi di avere raggiunto la padronanza di una data competenza tecnica, allora potrai espandere la tua conoscenza partendo da lì, sviluppando così il tratto orizzontale. Esci fuori dalla tua comfort zone ed esplora argomenti correlati. Questi argomenti dovrebbero auspicabilmente arricchire le tue conoscenze pregresse e permetterti di contribuire in modo più esteso ai vari aspetti dello sviluppo di un prodotto software.

Se, ad esempio, diventassi esperto nello sviluppo di API REST, potresti voler approfondire i database o lo sviluppo front-end, in quanto l’insieme di queste competenze ti permetterebbe di avvicinarti ad un profilo da programmatore full-stack. Allo stesso modo, potresti anche approfondire l’argomento IaC (infrastructure-as-code) ed imparare ad implementarlo nel processo produttivo. Non limitarti a scrivere software ma cerca di capire anche cosa è necessario per portare quel software in produzione.

Il segreto non sta nel diventare un esperto in ognuna di queste ulteriori aree ma nell’apprendere quanto basta per capire le basi e per poter collaborare in modo efficace con chi, invece, le padroneggia a fondo.

Comprendere i compromessi

Ad uno sviluppatore senior serve una vasta conoscenza dei principi dello sviluppo di software, che comprende non solo algoritmi e strutture dati ma anche diversi modelli architetturali, organizzazione del codice, testing, processi di sviluppo e scalabilità.

L’idea è quella di sviluppare un pensiero critico, grazie al quale si possa essere in grado di comprendere e confrontare tecnologie, e paradigmi diversi e i compromessi che ne derivano.

Un esempio classico potrebbe essere quello di comprendere e discutere le differenze e i compromessi tra architetture monolitiche o a microservizi. O ancora i compromessi che derivano da scelte di ottimizzazione che favoriscono la memoria piuttosto che la CPU. E così via: “alta scalabilità” contro “bassa latenza”, “software generico e riutilizzabile” contro “software su misura”, “complesso ed efficiente” contro “semplice e flessibile”.

Non ci sono soluzioni corrette o sbagliate, ma solo compromessi differenti. Ed è fondamentale comprendere questi compromessi e prevederne l’effetto, sia nel breve che nel lungo termine. La domanda da farsi è “quale compromesso è quello migliore per gli obiettivi di business presenti e futuri”?

Raggiungere questo livello di maturità è tutto fuorché semplice. Sicuramente necessita di una significativa quantità di tempo investito nello sviluppare prodotti software, adottando diverse pratiche, diversi linguaggi di programmazione, framework, metodologie e così via.

Potrai ampliare le tue conoscenze solamente se saprai riconoscere che ogni scelta tecnica comporta una serie di compromessi. Ci saranno sempre aspetti positivi e negativi.

Purtroppo non esiste una formula magica per la tecnologia!

Non esiste un singolo linguaggio o framework che possa essere utilizzato per costruire qualsiasi tipo di applicazione in modo ottimale! Se hai una visione sufficientemente completa del panorama tecnologico, dovresti essere in grado di capire quale insieme di tecnologie è il piú adatto per affrontare un problema specifico. Talvolta questo significa essere in grado di mettere da parte le nostre tecnologie preferite o quelle che fanno parte delle nostre competenze primarie e che ci fanno sentire piú produttivi a livello individuale.

Ovviamente, non sempre possiamo avere una visione cristallina di ogni problema. Spesso bisogna confermare le proprie assunzioni con degli esperimenti ad hoc ed essere pronti ad essere smentiti.

Bisogna trovare il modo di lasciare margine per commettere errori, imparare dai fallimenti e provare approcci alternativi. La strada per il successo raramente è una linea retta…

Andare a caccia di bug

È risaputo che il software privo di bug non esiste; quindi, non proviamo neanche a pensare che uno sviluppatore senior possa scrivere codice senza bug!

Benché i bug siano sempre dietro l’angolo, uno sviluppatore senior deve sapere cosa fare per ridurre al minimo il rischio di creare dei bug. Analogamente lo sviluppatore senior deve sapere come individuare i bug il più presto possibile, possibilmente prima che lo facciano gli utenti.

Questo comporta sviluppare tutta una serie di competenze quali: comprendere ed approfondire i resoconti degli utenti, scrivere diversi tipi di test (unitari, di integrazione, end-to-end), individuare ed analizzare i casi limite, strutturare i log in modo che siano più facili da leggere e ricercare in caso di errori, riuscire a leggere ed interpretare varie metriche e dashboard.

Un senior dovrebbe essere in grado di fare una grande differenza e di aiutare l’intero team a scrivere un software migliore, illustrando ed educando alle migliori pratiche per il test del software.

Direi che non è troppo difficile scrivere test, ma scrivere buoni test è quasi un’arte! Per scrivere test efficaci, è necessario scrivere codice testabile. Ciò significa progettare codice modulare, privo di dipendenze e con input e output ben definiti. Quanto migliore è la progettazione del codice, tanto più facile sarà scriverne i test.

I test devono essere facili da leggere, comprendere e mantenere. Usa nomi descrittivi per i tuoi test e scrivi test che coprano una caratteristica o un comportamento specifico. Evita di testare più funzioni nello stesso test, in quanto potrebbe rendere più difficile individuare l’origine dell’errore.

Ma come imparare a fare tutto questo?! Anche qui, pratica, pratica e ancora pratica!

Inizia accettando il fatto che il codice non testato è cattivo codice (o per lo meno codice che dovrebbe tenerti sveglio la notte). Quindi cerca di capire il settore aziendale specifico e che cosa ha senso testare e come. Quale tipo di input è più rappresentativo, quale tipo di output ci si aspetta e che tipo di effetti collaterali possono verificarsi.

Impara i diversi tipi e i diversi framework di test. Infine, impara quali tipi di test forniscono il maggior valore per l’azienda e ottimizza il flusso di lavoro del team per concentrarvi maggiormente su questi fattori.

Promuovere le buone pratiche

Uno sviluppatore senior dovrebbe aver sviluppato un certo grado di affinità con diversi linguaggi di programmazione e dovrebbe conoscere diversi paradigmi e le loro differenze. Ad esempio la programmazione ad oggetti (OOP) e quella funzionale; uno stile dichiarativo rispetto ad uno imperativo; differenze tra linguaggi compilati e interpretati. Possedere questo tipo di competenze può essere utile per risolvere lo stesso problema utilizzando strumenti e tecniche differenti e potendo così scegliere la soluzione che offre i compromessi più idonei per il problema in questione e per il team con cui si lavora.

Similarmente è importante avere una buona conoscenza dei design pattern al fine di riuscire a strutturare il codice in modo più flessibile, rendendo più semplici potenziali evoluzioni future.

Il codice è un elemento che dovrà evolversi con il cambiare delle esigenze del business ed è quindi importante progettare tenendo conto dell’evoluzione. I design pattern non sono una panacea ed a volte è facile abusarne e creare troppi livelli di astrazione. Un buon senior dovrebbe riuscire a trovare il giusto equilibrio tra semplicità e flessibilità.

Bisogna conoscere le buone pratiche come i principi del “Clean code” ma è anche importante non essere dogmatici, ovvero applicare tutti i design pattern e le buone pratiche solo perché possiamo farlo. Bisogna piuttosto chiedersi: “qual è il vantaggio di applicare uno specifico pattern ad un dato problema?”. Oppure “qual è il costo in termini di complessità aggiuntiva?”.

A volte, del codice semplice e imperativo, benché possa apparire poco elegante, può risultare molto efficace in termini di leggibilità. Altre volte, invece, è necessaria la struttura imposta da specifici design pattern, perché questa potrebbe rendere il codice più testabile, estendibile, configurabile, ecc.

Come sviluppatore senior, essere in grado di fornire opinioni critiche su questi temi può avere un impatto estremamente positivo sul resto del team durante sessioni di pair programming o revisioni del codice.

Quali tipi di soft skills?

Abbiamo discusso le competenze tecniche che ti daranno un vantaggio nella tua carriera e ti permetteranno di essere riconosciuto come sviluppatore senior. Ma queste da sole non ti porteranno molto lontano. È arrivato il momento di discutere delle fantomatiche “soft skills”.

Se hai ottenuto quel colloquio per quella posizione a cui tieni tanto grazie alle tue competenze tecniche, riuscirai ad eccellere e a farti assumere se sarai in grado di dimostrare di avere delle solide soft skills.

Ok, ok, ma quali sono queste soft skills? Come faccio a svilupparle? Come faccio a dimostrare di averle?

È possibile trovare online liste infinite di soft skills che includono intraprendenza, capacità di comunicazione, cura per i dettagli, attitudine al “problem solving”, leadership, negoziazione, gestione del tempo, e chi più ne ha più ne metta.

Di seguito discuteremo alcune soft skills che ritengo essere fondamentali per un senior. Non è una lista da considerare esaustiva ma piuttosto un punto di partenza per capire in quali ambiti è possibile misurarsi e migliorarsi.

Voglia di crescere

La mentalità di uno sviluppatore senior è cruciale quanto le sue competenze tecniche. Un ingegnere senior deve avere una mentalità incline alla crescita, la volontà di imparare e adattarsi e la propensione al continuo miglioramento.

Siamo tutti consapevoli di quanto velocemente si evolva il mondo del software, lo abbiamo già detto ed una situazione di disagio che viviamo tutti i giorni. L’unica arma in nostro possesso per poter sopravvivere in questo mondo è quella di essere in grado di imparare velocemente e di adattarci ai cambiamenti.

Imparare però significa anche essere a proprio agio con i fallimenti e vederli come un’opportunità per imparare. Questo significa talvolta essere disposto a correre dei rischi, provare soluzioni o tecnologie con le quali non abbiamo molta confidenza ed essere pronti a tornare indietro sui propri passi qualora quell’approccio non porti i frutti sperati.

Ogni fallimento però è un passo in avanti verso il successo, una lezione appresa che ci permetterà di non ripetere gli stessi errori in futuro e di essere più consapevoli delle scelte che facciamo.

Essere una leva attiva, saper dire “NO” e debito tecnico

Uno sviluppatore senior dovrebbe avere un ruolo molto proattivo in un’organizzazione. Non dovrebbe isolarsi in una stanza e continuare a sbattere le dita contro la tastiera. Un senior dovrebbe sapere quando è il momento di fare domande scomode e prendere in mano la situazione.

Essere in grado di fornire un punto di vista fortemente tecnico in una conversazione aziendale può avere grande impatto e informare l’azienda su quale sia la strategia migliore per andare avanti. A tutti gli effetti, un senior dovrebbe diventare un ponte tra il prodotto e la tecnologia.

Questo a volte significa che un senior dovrebbe anche sapere quando è il momento di dire NO. No a soluzioni rapide e sporche (che alla fine si ritorceranno contro) solo per rispettare una scadenza. No a piani che prevedono solo la costruzione di funzionalità su funzionalità senza considerare l’esperienza dell’utente e la stabilità a lungo termine del prodotto. No a scelte tecniche arbitrarie solo perché “abbiamo sempre fatto così ed è sempre andata bene”.

Dire NO è facile ma al tempo stesso molto difficile. Tutti possono dire NO, questa è la parte facile! Il difficile è argomentare il perché di quel NO, proporre punti di vista alternativi, trovare compromessi e disinnescare bombe a orologeria a breve o lungo termine.

Per riuscire a farlo serve un elevato livello di soft skills: devi saper comunicare in modo efficace usando le parole giuste e scegliere con saggezza le tue battaglie. Non puoi dire sempre NO a tutto o corri il rischio di essere preso per un ostruzionista scorbutico.

Si tratta piuttosto di saper dire “NO, MA” piuttosto che un secco “NO”: provvedere ad una valida alternativa, seppur non ottima tecnicamente o di requisiti, è parte del ruolo. A volte è necessario accettare compromessi e fare scelte che non sono necessariamente le migliori dal proprio punto di vista. Ma è importante essere in grado di riconoscere quando è il momento di dire NO e quando è il momento di accettare un compromesso. E dovresti anche essere in grado di farlo di fronte alle persone giuste e al momento giusto… Se fatto bene, questo può avere un forte impatto positivo sull’azienda e sul team. Può portare all’innovazione e creare nuove potenzialità di lavoro o vantaggi competitivi unici. Questo è un argomento che viene spesso tirato in ballo quando si parla di debito tecnico, ovvero scelte tecniche non ideali che a lungo termine possono portare a problemi di stabilità e scalabilità fino al punto di danneggiare il business. Più il tempo passa e più il debito tecnico si accumula e più sarà difficile ripagarlo.

Il debito tecnico è un argomento molto complesso e non esiste una soluzione unica per tutti i casi. A volte è necessario accettare un debito tecnico per poter rispettare una scadenza o per poter testare un’idea. Altre volte è necessario investire tempo per ripagare il debito tecnico accumulato in passato.

Le capacità di un senior dovrebbero permettergli di capire quando è il momento di accettare un debito tecnico e quando è il momento di investire tempo per ripagarlo. Inoltre, dovrebbe essere in grado di comunicare in modo efficace i rischi associati al debito tecnico e le conseguenze che questo potrebbe avere sul business. Infine, un senior dovrebbe riuscire a negoziare con i product manager e i dirigenti per trovare il giusto compromesso tra debito tecnico e scadenze.

Capire l’azienda

Per poter essere una leva attiva bisogna capire l’azienda il più profondamente possibile.

Qual è lo scopo dell’azienda? Qual è la visione nel lungo termine? Esiste una strategia chiara? Quali sono i grandi punti di forza e quali di debolezza? Chi sono i clienti? Quali sono i prodotti e i servizi offerti? Quali sono i principali concorrenti?

Un senior che sa rispondere a queste domande è in una buona posizione per utilizzare le proprie competenze tecniche per aiutare l’azienda ad avere successo.

Solo con una solida comprensione dell’azienda sarai in grado di scegliere le battaglie giuste, concentrarti su ciò che conta e di contribuire alla progettazione di sistemi che possano servire l’azienda oggi ma anche essere adattati alle esigenze future.

La Comunicazione

“La buona comunicazione è stimolante quanto il caffè nero e rende altrettanto difficile il prendere sonno poi” - Anne Morrow Lindbergh

Come ingegnere del software, le capacità comunicative sono fondamentali per il successo del riconoscimento della tua figura: devi essere in grado di comunicare efficacemente con diversi interlocutori, tra cui altri ingegneri, project manager, clienti e dirigenti. Ciò richiede un’ampia gamma di abilità comunicative, dal parlare e ascoltare allo scrivere e presentare (o farle tutte e quattro assieme).

Poiché dovrai parlare con tutti gli interlocutori, dovresti imparare a comunicare concetti tecnici a interlocutori non tecnici in un modo che sia facile da comprendere. Ciò significa anche saper ascoltare i commenti e incorporarli nel tuo lavoro. La capacità di comunicare efficacemente con gli interlocutori è essenziale per garantire che tutti siano sulla stessa lunghezza d’onda e che i progetti siano portati a termine con successo.

Un’altra importante abilità comunicativa per un ingegnere del software è quella di spiegare le incertezze e proporre idee su come affrontarle. Lo sviluppo del software è un processo intrinsecamente incerto e ci saranno sempre incognite e sfide impreviste.

Come ingegnere del software, devi essere in grado di comunicare queste incertezze in modo chiaro e conciso. Devi anche essere in grado di proporre idee su come affrontare queste incertezze e far progredire il progetto.

Inoltre, gli ingegneri del software devono essere in grado di parlare degli errori e delle lezioni apprese. È importante sottolineare che il fallimento è una parte inevitabile dello sviluppo del software ed è importante essere trasparenti sui fallimenti e sulle lezioni apprese. Ciò richiede capacità di comunicazione efficaci, compresa quella di assumersi la responsabilità degli errori e di comunicare onestamente. Inoltre, è necessario saper comunicare le lezioni apprese dai fallimenti e incorporarle nei progetti futuri. In un certo senso, un errore può anche essere visto come un investimento a lungo termine. Se questo viene comunicato bene può essere percepito in modo assolutamente positivo da parte dell’azienda e può convincere ad investire ancora di piú nella ricerca di nuove soluzioni e pratiche di sviluppo.

Le capacità comunicative sono essenziali anche per la stesura della documentazione e per le presentazioni. Gli sviluppatori devono essere in grado di scrivere una documentazione chiara che spieghi come funzionano le loro soluzioni e come devono essere utilizzate e gestite nella produzione. Devono inoltre essere in grado di fornire presentazioni che comunichino efficacemente i concetti tecnici a un pubblico non tecnico. Ciò richiede una grande capacità di scrittura e di presentazione, oltre all’abilità di semplificare argomenti complessi e renderli digeribili per il pubblico.

Una buona comunicazione può aprire molte porte e sbloccare situazioni complesse. Assicurati quindi di esercitarla il più possibile!

Supporto alla gestione

Quando sei un buon comunicatore, diventi una persona che può essere molto efficace nel supportare diverse attività di gestione. Ad esempio, nella pianificazione e nell’organizzazione degli incontri. Puoi aiutare a tenere traccia delle priorità e del debito tecnico e a suddividere i compiti difficili in parti più gestibili.

Ti trovi in una posizione unica per capire e sfruttare i punti di forza del team e per coinvolgere le persone giuste al momento giusto. Lavorando a stretto contatto con la direzione, puoi assicurarti che il tuo lavoro sia in linea con gli obiettivi aziendali generali e che gli sforzi del tuo team siano incanalati nella giusta direzione.

La pianificazione è un’altra abilità determinante per un ingegnere del software. Richiede di suddividere i progetti di grandi dimensioni in attività più piccole e gestibili, di stimare il tempo necessario per ciascuna attività e di stabilirne la priorità. Una pianificazione efficace contribuisce a garantire che i progetti siano portati a termine in tempo e nel rispetto del budget.

L’organizzazione degli incontri, come le riunioni in piedi, le revisioni informali e le retrospettive, possono offrire l’opportunità di condividere i progressi, identificare i problemi e pianificare il futuro. Come ingegnere del software, devi contribuire a guidare questi incontri e assicurarti che siano produttivi ed efficienti.

Ovviamente gli sviluppatori senior non devono e non possono sostituire il ruolo dei project manager o dei product manager, ma piuttosto devono supportare questi ruoli e fornire la loro prospettiva tecnica per riuscire a mantenere gli obiettivi, i piani e l’esecuzione in linea con le aspettative del team tecnico.

Autonomia e attenzione alla consegna

Le ultime due soft skills su cui ci soffermeremo sono l’autonomia e l’attenzione alla consegna.

Gli sviluppatori senior hanno un ruolo prezioso nei progetti tecnici che richiedono grande dedizione e competenza. Questi progetti, come ottimizzare le prestazioni o ristrutturare l’architettura del codice, sono fondamentali per l’azienda, poiché aprono nuove possibilità di innovazione e crescita. Grazie alla loro esperienza, i senior possono apportare un contributo significativo a tali iniziative, aiutando a sbloccare il potenziale del team e dell’azienda nel suo complesso.

In base alla mia esperienza, spesso un individuo può fare progressi rapidi in progetti tecnici, dedicandosi intensamente a questa attività per un breve periodo. Tuttavia, è essenziale evitare l’isolamento dal resto del team, anche in queste circostanze.

Se stai lavorando a un progetto di questo tipo, assicurati di comunicare regolarmente con la direzione e altri colleghi senior per tenere sotto controllo i tuoi progressi, ottenere un riscontro utile e condividere le tue conoscenze.

Ma la capacità di fornire valore lavorando in autonomia non è utile solo nei progetti di ricerca, ma è anche una buona abilità da padroneggiare in generale. Nell’industria del software, è più comune lavorare con cose che non conosciamo piuttosto che con cose che conosciamo!

Ci sono sempre nuovi ambiti da esplorare, nuove sfide da affrontare e nuovi strumenti con cui confrontarsi. Pertanto, è importante essere in grado di imparare rapidamente e di aggiornarsi velocemente quando necessario. Non dovresti aspettare che siano gli altri a insegnarti e a dirti come fare certe cose, ma dovresti essere in grado di fare alcuni progressi per conto tuo, ad esempio consultando e comprendendo la documentazione e il codice esistente.

Se avessi già una vasta competenza, dovrebbe essere quasi istintivo aggiungerne altra quando necessario. Naturalmente, è giusto chiedere aiuto se ti senti bloccato, ma è anche importante cercare di fare tutto il possibile per progredire da solo, in modo da costruire il maggior contesto possibile e massimizzare il risultato del tempo speso a ricevere aiuto da altri.

In teoria, un ingegnere del software senior non ha bisogno di troppe indicazioni. È in grado di capire da solo ciò che è necessario per portare avanti le cose e di coinvolgere gli altri nel momento opportuno.

Un altro aspetto riguarda la negoziazione delle aspettative e la comprensione di ciò che significa avere successo nell’ambiente attuale.

È bene essere chiari con la direzione e con il resto del team tecnico e definire le caratteristiche del successo individuale e di squadra. Se non sai cosa ci si aspetta da te e dal resto del team, anche se pensi di fare la cosa giusta, potresti finire per non fornire il valore che ci si aspetta da te; allo stesso modo, potresti non essere in grado di aiutare il tuo team ad avere successo.

Avere un simile atteggiamento di schiettezza e chiarezza di solito mantiene l’umore più alto e aiuta a evitare le delusioni. Certo, non è sempre possibile evitare tutte le delusioni o i fallimenti. Perciò, quando il problema si presenta, potresti essere tentato di dare la colpa a qualcun altro o al sistema. Ma è invece più maturo chiedersi cosa si sarebbe potuto fare meglio, o ancora meglio: cosa si potrebbe fare in futuro per evitare che problemi simili si ripresentino.

Come posso crescere?

Se sei un ingegnere del software e vuoi aumentare le tue competenze e diventare un membro senior del tuo team, potresti chiederti quali sono i passi da intraprendere per raggiungere questo obiettivo.

Beh, non temere! Ecco 4 idee (più alcune extra) che credo ti aiuteranno nel tuo percorso.

Scendere giù di un livello

Innanzitutto, non limitarti a sfiorare la superficie delle tecnologie con cui stai lavorando. Scava più a fondo e impara a conoscere gli strati sottostanti. Probabilmente hai costruito un sito web o un’API, ma ti sei mai chiesto come funziona il protocollo HTTP? O anche come funziona il protocollo TCP e cosa succede per stabilire una connessione? Apprezzare questi dettagli ti darà una comprensione molto più ricca delle tecnologie con cui lavori ogni giorno.

Sì, se cominci a scavare diventa un pozzo senza fondo… Quindi come fare ad addentrarsi più a fondo senza perdersi?

La mia regola generale (che ho rubato/appreso dal mio amico Roberto) è quella di scendere solo di un livello più in basso alla volta, partendo dalle tecnologie con cui si ha già familiarità.

Possiamo immaginare un dato ambito tecnologico come una torre. Ogni piano della torre rappresenta tecnologie diverse, ognuna delle quali ha un livello di astrazione diverso. Ad esempio, il piano più alto potrebbe essere il livello di applicazione, il piano intermedio potrebbe essere il livello di rete e il piano più basso potrebbe essere il livello fisico. Verosimilmente il nostro lavoro ci richiede di conoscere molto bene un dato livello. Non è necessario conoscere tutti i livelli. Tuttavia, conoscere il livello immediatamente inferiore può essere molto utile per capire meglio il livello in cui lavoriamo.

Ti serve qualche esempio?

Hai già trascorso un po’ di tempo con OAuth e OpenID Connect? Probabilmente vorrai sapere cosa c’è dentro un JWT. Conosci il flusso del codice di autorizzazione OAuth e cosa succede con tutti i reindirizzamenti? Sai come funzionano gli algoritmi di firma come RSA e HMAC?

Tutti questi sono argomenti che puoi esplorare per consolidare la tua conoscenza di questo particolare ambito. Ti permetteranno di esplorare concetti più generali che potresti riutilizzare in altri ambiti. Tutti costituiscono dei validi passi in avanti per ampliare le tue conoscenze e diventare un ingegnere più completo.

Ed il modo migliore per esplorare questi piani è quello di costruire qualcosa. Puoi capire veramente qualcosa se riesci a costruirne un piccolo prototipo. Ad esempio potresti provare a decodificare un token JWT senza usare una libreria. Saresti poi in grado di andare oltre e implementare anche l’algoritmo di verifica della firma? Magari poresti anche provare a implementare un server OAuth2.0 per capire meglio come funziona il protocollo.

Costruire prototipi è un ottimo modo per memorizzare alcuni concetti e mettere davvero alla prova la vostra conoscenza. Naturalmente, costruire richiede uno sforzo maggiore, quindi scegli con saggezza gli esercizi di prototipazione: non sarebbe pratico re-implementare oltre sessant’anni di ingegneria del software solo per il gusto di imparare!

Un video divertente che mi è piaciuto molto ultimamente è The Computer Science Iceberg. Perché mi piace così tanto? Perché è divertente, ironico e soprattutto perché illustra davvero bene l’idea di livelli graduali di astrazione e di ricerca di conoscenze fondamentali e generiche.

Divertiti

Questa è una delle mie convinzioni principali: l’ingegneria del software è una professione molto impegnativa. Non perché sia più difficile di altre professioni, ma perché le cose si muovono così velocemente che non puoi mai smettere di imparare e ti sentirai sempre indietro.

L’unica cosa che potrebbe rendere la professione un po’ più facile è una vera passione per la materia. Se sei appassionato, sarà più facile motivarti a imparare sempre cose nuove! E se non so se sono abbastanza appassionato? È comprensibile, soprattutto se sei all’inizio della tua carriera. C’è così tanto davanti a te che potrebbe essere spaventoso e persino scoraggiante.

Anche in questo caso, il mio consiglio è di orientarti verso lo sviluppo di progetti concreti. Sviluppare qualcosa ti darà un riscontro tangibile del fatto che ciò che stai imparando può essere effettivamente utile. Potresti realizzare dei progetti secondari per mettere in pratica le nuove conoscenze.

Inoltre, non dovresti essere timido nel mostrare ciò che hai costruito (e ciò che hai appreso) ai tuoi colleghi e persino ai tuoi amici al di fuori del lavoro! È probabile che riceverai un riscontro e che ti verranno in mente nuove idee e nuove cose che vorresti imparare e provare.

Ancora meglio se ti rendi conto che puoi applicare alcune di queste conoscenze al lavoro. Magari potete sviluppare un nuovo percorso all’interno dell’azienda per cui lavori, magari potresti aiutare in qualcosa che al momento viene trascurato perché nessun altro ha il tempo o le competenze, magari tutto questo può dimostrare un valore maggiore e otterrai una promozione!

Quando si applica questa mentalità di apprendimento continuo e di condivisione delle conoscenze sul lavoro, si potrebbe generare una stimolazione reciproca e ritrovarsi con un team che si diverte a imparare e a costruire insieme.

Un’altra idea per far entrare le persone in sintonia tra loro e generare una stimolazione reciproca delle idee è quella di organizzare hackathon aziendali o giornate di studio gratuite. Questi sono ottimi modi per aiutare i team ad appassionarsi a ciò che fanno, a esplorare nuove idee, a imparare cose nuove e, in definitiva, a mettere le persone in condizione di fornire più valore nel breve e nel lungo termine.

Pair programming

Il pair programming è un altro grande strumento che puoi sfruttare per dare una spinta alle tue competenze. Collaborare con il maggior numero possibile di persone all’interno dell’organizzazione è fondamentale. Anche se qualcuno è più giovane di te, può comunque avere intuizioni e prospettive che forse non avevi considerato prima. La programmazione in coppia offre una piattaforma per condividere idee e imparare gli uni dagli altri.

Allo stesso modo, non scartare il valore dell’insegnamento agli altri. Anche i membri più anziani del team possono beneficiare delle tue conoscenze e della tua esperienza. Se fai coppia con altri, puoi condividere le tue competenze e aiutare tutti a crescere e a svilupparsi.

Ho imparato tantissimi trucchi lavorando in coppia con altre persone. Anche piccole cose, come la configurazione dell’editor o del terminale. Lo so: non tutti amano la programmazione in coppia. Se questo è il caso, non preoccuparti! Ci sono altri approcci da seguire che possono comunque fornirti un feedback prezioso e aiutarti a imparare dai tuoi colleghi. Le revisioni interattive del codice e le sessioni di dimostrazione sono ottime alternative che consentono di condividere il proprio lavoro e ricevere riscontri senza dover lavorare insieme in tempo reale.

Alla fine, la cosa più importante è rimanere aperti a nuove idee e approcci. Continuando a imparare e a crescere, saresti sulla buona strada per diventare uno sviluppatore di software senior. Quindi, perché non provare a fare un po’ di pair programming e vedere cosa riesci a imparare?

Creazione di contenuti

Prima di tutto, la creazione di contenuti può assumere diverse forme: articoli, presentazioni, video, discussioni tecniche su canali social, e chi più ne ha più ne metta! E indovina un po’? Non occorre essere un esperto per condividere qualcosa di nuovo che hai imparato. Anche se sei alle prime armi con un determinato argomento, la tua nuova prospettiva può portare valore agli altri e aiutarti a confrontarti con i gente più esperta nello specifico settore.

Potresti ad esempio creare dei contenuti per dare le tue prime impressioni dopo aver provato un nuovo linguaggio di programmazione o un framework. Cosa ti è piaciuto? C’è stato qualcosa che ti ha confuso? Cosa ti è mancato rispetto alla tua precedente esperienza con altri strumenti simili?

C’è un trucco: devi farlo diventare un’abitudine. Impegnati a seguire un programma regolare e svilupperai disciplina e coerenza nella creazione di contenuti. Inoltre, più creerai, più affinerai le tue capacità di comunicazione. E lo ripeto ancora una volta: la comunicazione è un’abilità fondamentale per qualsiasi sviluppatore senior.

A proposito di comunicazione, è qui che la creazione di contenuti brilla. Come ingegneri, amiamo perderci nei dettagli tecnici, ma spiegare concetti complessi a interlocutori non tecnici può essere difficile. Creando contenuti, imparerai a comunicare i tuoi concetti in modo chiaro e coinvolgente per un pubblico più ampio. Inoltre, avrai l’opportunità di ricevere un parere sui tuoi contenuti e, se presterai attenzione, potrai migliorare ulteriormente le tue capacità comunicative.

Hai mai sentito parlare di atomic essays (saggi atomici)? Si tratta di suddividere le tue idee in parti di contenuto più brevi e mirate. Questo approccio può rendere i tuoi contenuti più coinvolgenti e più facili da assimilare, soprattutto su piattaforme social come X (Twitter), dove la brevità è fondamentale. Se non sai che tipo di contenuti creare, questo potrebbe essere un buon formato per iniziare.

Se non sai su cosa creare contenuti, ecco il mio consiglio: ogni giorno, alla fine della tua giornata lavorativa, scrivi una cosa nuova che pensi di aver imparato durante la giornata. Alla fine della settimana lavorativa, rivedi i tuoi punti. Sono sicuro che per almeno uno di questi potrebbe essere un argomento da condividere e sul quale potresti creare dei contenuti.

La creazione di contenuti può aiutarti a diventare uno sviluppatore più esperto, affermandoti come personaggio di rilievo in un dato ambito, sviluppando le tue capacità di comunicazione e contribuendo alla comunità. Quindi, vai e condividi le tue conoscenze con il mondo.

Ti sorprenderai dell’impatto che avrà su di te e sugli altri!

Altre idee

Ecco alcuni altri consigli in ordine sparso che puoi aggiungere a quelli discussi sopra.

Innanzitutto, cerca sempre di mantenere un atteggiamento positivo. Quando le cose si fanno difficili, è facile scoraggiarsi e perdere di vista il quadro generale. Ma ricorda che con tempo e risorse sufficienti, i team possono superare qualsiasi sfida. Quando manca questo lusso, sono certo che esistono compromessi accettabili che possono soddisfare le esigenze di tutti.

Un’altra idea interessante per aggiornarsi ed evitare di restare troppo indietro in fatto di tecnologia o di stili di programmazione è quella di allenarsi con le “coding challenges”, ovvero esercizi di programmazione come quelli che puoi trovare su HackerRank, CodeWars o Exercism. Questi problemi spesso richiedono di scoprire o rispolverare specifici algoritmi o strutture dati. Puoi inoltre usare questi esercizi per esplorare nuovi linguaggi o metodologie. Sforzati di sperimentare diversi modi per risolvere i problemi. È un ottimo esercizio per le tue capacità di risoluzione dei problemi.

È importante supportare le idee dei colleghi, anche quando avresti fatto le cose in modo diverso. Questo tipo di atteggiamento collaborativo aiuta a creare fiducia e favorisce una cultura dell’innovazione e del lavoro di squadra. Inoltre, la prossima volta che proporrai qualcosa, sono sicuro che le persone saranno disposte a discutere e a sostenere le tue idee.

Quando si tratta di affrontare compiti difficili, non avere paura di offrirti come volontario. Che ne dici di affrontare quel refactoring di cui nessuno vuole occuparsi? Fatti avanti! Quelle parti di codice complicate e incasinate che tutti evitano? Tuffati e cerca di dargli un senso! Assumendo questi compiti impegnativi, potrai farti una reputazione di risolutore di problemi e diventare la persona di riferimento per i lavori più difficili.

Infine, come regola generale, cerca di migliorare un po’ le cose ogni volta che ne hai la possibilità. Che si tratti di documentare un processo, migliorare l’interfaccia utente di un’applicazione o snellire un flusso di lavoro, o persino correggere un errore di battitura in un file di documentazione. Ogni piccolo miglioramento è importante. Con il tempo, questi piccoli successi si accumulano e ci aiutano a diventare membri più validi del team.

Come faccio a vendermi come sviluppatore senior?

Se penso di essere uno sviluppatore senior, cosa posso fare per essere riconosciuto come tale?

Innanzitutto, inizia ad assumerti maggiori responsabilità. Cerca opportunità per dirigere progetti o fare da tutor a ingegneri junior. Condividi le tue conoscenze e la tua esperienza con gli altri e fornisci loro una guida.

In secondo luogo, cerca di avere un impatto al di là del tuo team o progetto attuale. Partecipa a iniziative inter-funzionali, contribuisci a progetti open-source o intervieni a eventi di settore. Questo tipo di attività può aiutarti ad affermarti come guida intellettuale nel tuo settore e a dimostrare la tua esperienza a un pubblico più ampio.

In terzo luogo, concentrati sullo sviluppo delle tue soft skills. In qualità di ingegnere senior, dovrai comunicare efficacemente sia con interlocutori tecnici che meno tecnici, condurre riunioni e negoziare efficacemente. Pertanto, lavora per migliorare le capacità di comunicazione, di leadership e di risoluzione dei conflitti per diventare un membro completo e rispettato del tuo team.

Un altro modo per dimostrare la tua competenza è condividere le tue conoscenze con gli altri. Scrivi post su blog tecnici, registra video didattici o intervieni a eventi interni ed esterni per mostrare la tua esperienza e dimostrare la tua volontà di aiutare gli altri a imparare.

Infine, cerca il parere dei tuoi colleghi, dei mentori e dei manager. Chiedi critiche costruttive e sii aperto a suggerimenti per migliorare.

La ricettività ai commenti consente di migliorare continuamente le tue competenze e di dimostrare il tuo impegno a crescere e ad apprendere come ingegnere senior.

In conclusione, la definizione di ingegnere software senior è complessa e sfaccettata, ma in generale implica il possesso di una profonda competenza tecnica, un’ampia conoscenza del settore e una serie di competenze trasversali che consentono una comunicazione efficace, la leadership e la risoluzione dei problemi.

Per diventare uno sviluppatore senior, è importante affinare continuamente le proprie competenze, concentrandosi non solo sulle abilità tecniche ma anche sulla comunicazione, sulla leadership e sugli aspetti di business.

Ciò potrebbe comportare il pair programming, la creazione di contenuti, la partecipazione volontaria a progetti impegnativi e la ricerca di nuove opportunità di apprendimento.

In definitiva, il percorso verso il grado di senior non è lineare e richiede dedizione, perseveranza e propensione alla crescita. Quindi, continua a spronarti per andare sempre più a fondo, per divertirti e trovare gioia nel tuo lavoro e per sforzarti sempre di avere un impatto positivo sul tuo team e sull’organizzazione.

Ma se ti sei chiesto durante la lettura se stessi descrivendo il perfetto sviluppatore senior, lascia che ti dica solo che non mi aspetto che le persone siano in grado di soddisfare ogni singolo aspetto esposto in questo articolo. Ci saranno cose in cui potrai eccellere e altre in cui sarai appena sufficiente. Fa parte della natura umana e va bene così!

Non possiamo eccellere in tutto, ma dobbiamo conoscere i nostri punti di forza e di debolezza, lavorare con il nostro team per amplificare i punti di forza e compensare le debolezze… e sforzarci di migliorare ogni giorno!