Compétences larges ou étroites : les compétences en génie logiciel démystifiées

Publié: 2022-03-11

Chaque ingénieur logiciel a un ensemble de compétences composé des différentes compétences qu'il a acquises. Un ensemble de compétences est « profond et étroit » si vous avez maîtrisé une ou deux compétences et rien d'autre ; c'est « large et superficiel » si vous pouvez faire un peu de tout sans être expert dans aucun domaine.

La plupart d'entre nous se situent quelque part au milieu avec quelques compétences solides, quelques compétences moyennes et beaucoup de lacunes. Dans cet article, j'aimerais discuter du spectre large et profond et affirmer que se rapprocher de l'extrémité large profiterait à la plupart des programmeurs.

Compétences de l'ingénieur logiciel : représentation graphique d'un ensemble de compétences

La largeur et la profondeur sont, bien sûr, relatives. Par exemple, vous pourriez être un expert en développement Web, ou simplement en développement Web côté client, ou simplement en JavaScript. Toutes ces compétences sont « profondes et étroites » dans un certain sens, mais la dernière est beaucoup plus étroite que la première.

De plus, les compétences « profondes et larges » et « superficielles et étroites » sont toutes deux possibles : la première signifie que tout le monde veut vous embaucher, et la seconde signifie que vous n'avez encore rien appris de significatif. Comme ils ne sont pas très courants, ils ne valent pas non plus la peine d'être discutés en détail.

Types de compétences et d'ensembles de compétences d'ingénieur logiciel

Profond et étroit

Avoir des compétences approfondies signifie que vous êtes un expert dans au moins un domaine.

Prenez SQL : Disons que vous savez tout sur la théorie des bases de données relationnelles ; les avantages et les inconvénients de MySQL, PostgreSQL, Oracle et SQLite ; comment optimiser les requêtes ; quand et comment dénormaliser une base de données, etc. Les clients qui recherchent cette compétence spécifique voudront vous embaucher dès que possible, et avec raison. Vous serez immédiatement opérationnel et offrirez de la valeur comme peu d'autres pourraient le faire.

Cependant, si le projet s'étend ou change de manière significative, vous serez remplacé ou complété par des programmeurs avec les compétences qui vous manquent. Même sans changements majeurs, seriez-vous en mesure de suggérer des changements architecturaux ? Le client pourrait être mieux loti avec une base de données NoSQL ou pas de base de données du tout, mais votre expertise étroite pourrait vous biaiser contre ces options peu familières.

Large et peu profond

D'autre part, si vous êtes un généraliste qui n'est pas un expert du domaine, vous aurez besoin de temps pour accélérer les nouveaux projets avant d'atteindre une productivité maximale.

Pour donner un exemple, vous devez peut-être faire un projet Python et vous n'avez jamais utilisé ce langage auparavant. Pourtant, vous en avez probablement entendu parler (dynamique, interprété, multi-paradigme) et votre expérience avec d'autres langages facilitera grandement la transition.

Le code que vous écrivez initialement n'est peut-être pas Pythonic (avec des tuples, des compréhensions ou des générateurs), mais vous saurez par où commencer. Vous progresserez régulièrement et vos modules bien factorisés seront faciles à améliorer par la suite. Votre large perspective sur la technologie vous donnera des idées que d'autres pourraient manquer.

Lorsque le projet change, vous serez un atout pour votre équipe plutôt qu'un handicap.

Compétences dans le monde réel

En termes géographiques, les compétences étroites ressemblent à de hautes montagnes et les compétences larges à des plateaux. En utilisant cette analogie, les compétences typiques sont susceptibles de comporter quelques montagnes, une colline ici et là et beaucoup de plaines.

Représentation graphique des montagnes, des collines et des plaines

Un programmeur aléatoire peut être doué pour SQL et Python, OK pour la programmation Web et les algorithmes, et vraiment inquiet pour la plupart des autres choses, comme les vidages de mémoire, les serveurs OAuth ou les applications natives. Un tel programmeur devrait continuer à exploiter ses domaines d'expertise, tout en trouvant et en comblant les lacunes dans les connaissances.

Cette stratégie est susceptible de les servir au mieux au fil des ans.

Pourquoi les programmeurs doivent diversifier leurs compétences

De nombreux projets nécessitent des compétences non liées combinées de manière imprévisible. Alors que des ingénieurs largement qualifiés pourraient contribuer utilement à la plupart d'entre eux, l'ensemble des compétences d'un expert correspondra aux exigences précises de peu d'employeurs. Ce n'est pas nécessairement un problème à court terme, car vous n'avez besoin que d'un seul emploi pour payer les factures.

Toutefois…

La surspécialisation est risquée. Mettre vos œufs dans le même panier peut convenir si vous pouvez prédire l'avenir mieux que tout le monde, mais cette capacité est rare et sans rapport avec les compétences techniques. Considérez la demande de compétences en programmation Windows dans notre millénaire. Ou posez-vous la question : beaucoup d'entre nous auraient-ils pu deviner les trajectoires respectives d'Android, Flash, Nokia ou Blackberry il y a dix ans ?

Enfin, les meilleurs employeurs accordent une grande importance à la diversité des compétences. Facebook n'affecte pas les nouvelles recrues aux équipes avant six semaines après leur démarrage. Google encourage les transferts internes et gère plusieurs programmes de rotation. Même si vous aimez travailler à la pige, garder vos options ouvertes ne vous fera pas de mal. Si vous envisagez de travailler pour ces entreprises, vous devrez être au moins un peu généraliste.

En supposant que vous soyez convaincu et que vous vouliez diversifier vos compétences, comment feriez-vous cela ?

Comment diversifier et améliorer les compétences techniques

Vous pouvez échanger de l'argent contre des compétences :

  • Acceptez un taux inférieur lors de la transition vers un domaine inconnu. Si vous êtes 75% aussi productif que d'habitude, une réduction de salaire temporaire de 25% n'est que juste. Vous le remonterez bien assez tôt.
  • Faites un travail de démonstration non rémunéré avec les compétences que vous souhaitez tout en postulant pour des emplois qui en ont besoin. S'il s'avère que vous n'êtes pas prêt pour le changement, c'est quand même une leçon utile à apprendre.

Vous pouvez également échanger du temps contre des compétences :

  • Contribuer à un projet open-source. Vous obtiendrez des conseils et une validation, vous redonnerez à la communauté et vous serez peut-être remarqué par des employeurs ou des collègues potentiels.
  • Faites un projet personnel pour la joie, l'inspiration et un changement par rapport au travail quotidien. Par exemple, j'ai cloné le jeu Snake pré-smartphone tout en apprenant React.

Vous devez rechercher des opportunités d'apprentissage, mais vous ne pouvez pas le faire constamment. Pour mon projet d'entretien Toptal, j'ai utilisé Node.js et Backbone, avec lesquels je n'avais pas beaucoup d'expérience. C'était amusant, mais le rythme d'apprentissage requis ne pouvait pas être maintenu pendant des mois.

Idéalement, vous alternez entre de longues périodes de stabilité (avec une production et des revenus stables) et de brefs intervalles pendant lesquels vous vous mettez au défi d'apprendre quelque chose de nouveau. La fréquence à laquelle vous effectuez ce dernier dépend de plusieurs facteurs, tels que vos compétences actuelles, la demande du marché et vos objectifs personnels.

Pourquoi la largeur est bonne pour les employeurs

En ce qui concerne les employeurs, des compétences approfondies seront toujours requises dans certains scénarios :

  • Lorsqu'il y a peu de confiance ou d'engagement de temps entre l'employeur et l'employé.
  • Lorsque des résultats catastrophiques (comme des incidents de confidentialité ou de sécurité) sont probables.
  • Lorsque des compétences ésotériques sont requises.
  • Lorsque les délais sont urgents et non négociables.

Pourtant, de nombreux projets ne cochent aucune de ces cases et leurs responsables du recrutement devraient envisager des ingénieurs compétents. De nombreuses compétences techniques, telles que les tests et la documentation du code, et toutes les compétences non techniques (comme la communication) sont transférées. La résilience est importante même lorsque les produits ne changent pas complètement ; si la pièce que vous avez embauchée pour les stands, un généraliste peut travailler sur la priorité la plus élevée suivante.

Représentation graphique d'un employeur choisissant un développeur avec des compétences larges et superficielles plutôt qu'un développeur avec des compétences approfondies et étroites

Compte tenu de l'importance des compétences étendues, nous devrions encourager les développeurs à se diversifier, et nous devrions communiquer l'importance des connaissances étendues aux employeurs qui peuvent être trop axés sur les « années d'expérience » dans divers domaines et compétences.

L'objectif final est un historique de clients satisfaits ; en plus des compétences générales et techniques, cela prouve la capacité de l'ingénieur à faire la transition vers des domaines inconnus. C'est aussi une forte incitation pour les pigistes à ne pas s'aventurer dans de nouveaux domaines avant d'être prêts à le faire.

Trouver le bon équilibre

Lorsque les compétences générales sont sous-évaluées, certains bons développeurs sont inactifs et certains bons projets manquent de personnel ou dépassent le budget. Exiger une adéquation parfaite des compétences, c'est comme exiger un travail sur site, en ce sens qu'il est plus difficile de faire correspondre l'offre (main-d'œuvre qualifiée) avec la demande (travail gratifiant).

Rien de tout cela n'est un argument contre l'expertise du domaine ; cela comptera toujours et sera généreusement récompensé. Nous devons simplement garder à l'esprit que les compétences générales comptent également plus qu'il n'y paraît.