Cet article sera particulièrement utile aux ingénieurs novices, ainsi qu'à ceux qui souhaitent cultiver le leadership en ingénierie, rechercher la croissance et atteindre de nouveaux sommets. Les candidats découvriront également ce que l'on attend d'eux lors des entretiens techniques et les critères de sélection retenus lors de ces entretiens.
Il existe différentes approches pour définir l'ensemble de compétences requises pour un programmeur. Les exigences varient en fonction de l'entreprise, du projet et de l'équipe avec laquelle vous travaillez. Le plus courant définit un programmeur « expérimenté » comme celui qui non seulement connaît la théorie, mais travaille avec succès sur de vrais problèmes pratiques ; sait trouver des solutions à des problèmes non standards.
Apparemment, tous les programmeurs expérimentés ont une caractéristique importante en commun : la capacité de rechercher des informations pertinentes. Il existe d'autres qualités importantes telles que l'amour de la programmation et le désir de travailler. Si quelqu'un n'a aucune envie de travailler, même une expérience et un talent impressionnants seront inutiles. Au travail, j'ai croisé des gens qui connaissaient bien la technologie, mais qui hésitaient à travailler.
Les compétences de base du programmeur impliquent une bonne mémoire, la capacité de se concentrer et d'apprendre de nouvelles technologies et une pensée logique. En bref, un programmeur expérimenté doit avoir un "cerveau vivant" qui fonctionne bien. Vous ne pouvez pas continuer sans cela. Ces caractéristiques importantes déterminent votre propension à programmer en tant que profession depuis l'enfance.
Le reste des caractéristiques que je vais décrire peut être divisé en deux catégories : les connaissances techniques et les traits personnels. Si les connaissances techniques peuvent être acquises dans diverses formations, et cours et affinées dans la pratique, les qualités personnelles (ou soft skills) ne sont pas si faciles à acquérir si elles vont à l'encontre de la nature d'une personne. Dans tous les cas, les programmeurs expérimentés font leur propre chemin et apprennent beaucoup dans ces deux domaines.
Il est clair qu'un programmeur expérimenté connaît bien une ou plusieurs technologies et quelques frameworks. Mais, avant de maîtriser une technologie particulière, le programmeur acquiert des connaissances sur l'architecture de base des systèmes et des réseaux, les structures de données et les algorithmes ; l'administration système et l'informatique en général. Les administrateurs système et DevOps suivent ce chemin. En termes de programmation en tant que telle, il est important de comprendre les structures de données et les algorithmes, les abstractions de la technologie et les principes de la POO.
Après avoir appris un certain langage, un programmeur étudie les frameworks et les bibliothèques. Ce sont des abstractions supérieures qui en unissent de plus petites. Pour les développeurs Frontend, il s'agit de React, Angular et Vue.
Les points suivants décrivent le fonctionnement interne du «cerveau vivant» d'un programmeur idéal
🔴 Compréhension approfondie de la technologie et recherche de la meilleure approche
Un programmeur expérimenté doit connaître plusieurs technologies et appliquer les meilleures approches. Cette connaissance n'est pas superficielle mais maîtrisée dans la pratique. Une approche systématique vous permet d'avoir une vue d'ensemble du projet ; percevez-le dans son ensemble plutôt que partiellement, puis choisissez la meilleure approche pour son développement. Les notions de productivité et d'efficacité sont parfois confondues. Vous pouvez terminer le projet rapidement, mais faites de nombreuses erreurs et le débogage prendra plus de temps qu'un processus de développement minutieux étape par étape.
La vitesse n'est pas toujours un signe de qualification d'ingénieur senior. Au lieu de cela, l'orientation vers les résultats est une caractéristique intégrale. L'efficacité des actions et des mouvements pèse plus que de nombreuses lignes de code et de vitesse. Trouver une approche de développement de projet où la qualité et la rapidité sont équilibrées relève du pouvoir d'un ingénieur expérimenté.
🔴 Rester attentif à l'UX
Une bonne habitude d'un programmeur est d'être constamment attentif à l'expérience de l'utilisateur - en pensant à quoi ressemblera le programme du point de vue de l'utilisateur et s'il sera pratique et clair.
Vous n'avez pas besoin d'être un concepteur pour prédire comment une fonctionnalité fonctionnera. Il sera également utile de maîtriser les tests de code pour éviter les erreurs dans le processus de développement.
🔴 Engagement dans le processus technique
Suivre le processus technique peut être considéré comme une bonne habitude pour tout programmeur, en particulier pour un programmeur expérimenté. C'est une nuance cruciale. Avant de modifier une variable ou une fonction, vous devez vérifier où elle est utilisée.
Vous devez vous plonger dans la documentation technique ; cela aidera à éviter les erreurs stupides et à économiser du temps et les nerfs du responsable technique. Eh bien, les personnes expérimentées le savent et enseignent aux autres 🙂
🔴 Écrire du code lisible avec lequel les autres peuvent facilement travailler
Cette compétence découle de la précédente. Il sera facile pour tout le monde de travailler sur le projet étant donné que le processus technique est suivi à la lettre. N'oubliez pas que d'autres peuvent également travailler avec votre code, par conséquent, écrivez comme si vous l'aviez fait vous-même. Votre « béquille » peut rebondir. Il est préférable de tester et de refactoriser régulièrement votre code, de réfléchir à ce que vous appelez des variables et des fonctions, et de penser aux autres.
Choisir la bonne technologie pour le projet est une compétence cruciale. Les programmeurs expérimentés insistent parfois pour utiliser des technologies auxquelles ils sont habitués même lorsque le reste de l'équipe aura du mal avec. Au lieu de cela, vous devez prendre des décisions qui tiennent compte de toute l'équipe ; consulter, discuter et coordonner vos actions avec les autres.
🔴 Analyse qualitative et développement de l'architecture
Pour analyser et comprendre qualitativement l'architecture, vous devez connaître la théorie et avoir suffisamment d'expérience pratique. Un ingénieur senior est capable d'effectuer une analyse complète des exigences et de développer une architecture logicielle avec une mise en œuvre efficace à différents niveaux.
Dans le même temps, il est essentiel de trouver un équilibre entre la lisibilité du programme et l'efficacité du développement. Pour éviter les problèmes au stade de la planification, un programmeur expérimenté connaît différentes technologies et est capable de choisir la bonne.
🔴 Capacité à expliquer schématiquement
Pour les programmeurs expérimentés, et en particulier pour les responsables techniques, la capacité d'expliquer graphiquement des informations sur les principes de la technologie et à l'aide de schémas simples est une compétence très utile.
Des tableaux, des graphiques et des diagrammes offrent une vue globale de la technologie et du projet. L'approche du système de visualisation simplifie le travail de toute l'équipe. De cette façon, les responsables techniques peuvent transmettre une image complète aux autres.
🔴 Créer un flux de travail efficace
Les ingénieurs expérimentés font la distinction entre les performances de l'équipe et les leurs. Pour booster l'efficacité de l'équipe, ils construisent un workflow ou choisissent de nouvelles technologies, comme le déploiement automatique.
De plus, ils essaient d'encourager les autres programmeurs de l'équipe à en savoir plus et à analyser leurs erreurs lors de la revue de code.
Un programmeur expérimenté est bien conscient de l'importance d'atteindre les objectifs commerciaux et est capable d'équilibrer la mise en œuvre et la qualité du code. Après tout, si vous vous plongez dans la qualité du code, une tâche peut prendre un mois et vous pouvez continuer à refaire les choses jusqu'à vos derniers jours, amenant l'ensemble du projet à la perfection. Mais pour que l'entreprise se développe, vous devez trouver un équilibre entre la qualité et les exigences des clients.
Il y a des programmeurs qui se concentrent uniquement sur les tâches commerciales et remplissent leur code avec des « béquilles ». J'avais l'habitude de travailler sur un projet, qui a dû être complètement arrêté après 2 ans de développement car chaque nouvelle fonctionnalité prenait un mois à mettre en œuvre. Il était tout simplement impossible de travailler avec ce « ragoût » d'approches et de technologies. C'est ainsi que le désir de faire plus vite mène à de tristes résultats.
Je connaissais des programmeurs qui se sont penchés sur la qualité du code et qui sont restés bloqués sur une tâche pendant 2 mois. Honnêtement, j'ai été surpris qu'ils aient gardé leur emploi. Finalement, la tâche s'est avérée insurmontable. Cela signifie que trouver un équilibre est vital.
Le perfectionnisme me tient à cœur. Cependant, il doit y avoir une approche saine sans exagérer les choses. Habituellement, les gens ne changent pas. Même lors des entretiens, je remarque de telles personnes et je comprends que travailler avec elles sera difficile.
Les points suivants mettent en évidence les avantages d'un perfectionnisme sain
🔴 Capacité à travailler en équipe
Par défaut, il est clair que les joueurs d'équipe sont valorisés dans n'importe quel projet. Cela témoigne de leur nature non conflictuelle et de leur capacité à assumer leurs responsabilités, à communiquer et à être fiables.
Vous pouvez avoir votre propre opinion et toujours écouter les autres.
🔴 Confiance dans les tâches complexes
Les programmeurs expérimentés sont confiants, mais pas têtus. Ils n'ont pas peur des tâches difficiles, car ils ont déjà atteint un certain niveau d'expertise et possèdent des connaissances techniques suffisantes, leur permettant de faire face aux complexités.
Les ingénieurs expérimentés peuvent planifier un projet sous différents angles, fournir de bons conseils et rester axés sur les résultats, du développement du cadre au codage. Ces personnes sont très appréciées dans l'équipe; c'est un plaisir de les rejoindre dans des batailles professionnelles. Vous pouvez toujours apprendre quelque chose.
🔴 Désir constant de se développer et de trouver les informations nécessaires
Encore une fois, les ingénieurs expérimentés connaissent bien plusieurs cadres et sont capables de travailler avec de nombreuses technologies. Et pour cela, vous devez constamment évoluer et rechercher des opportunités d'apprendre de nouvelles choses en dehors du travail. Les personnes expérimentées apprennent rapidement et saisissent les nouvelles tendances nécessaires à leur travail. Certains ingénieurs pensent qu'il suffit d'apprendre de leurs propres erreurs. En effet, dans la pratique, on acquiert beaucoup de connaissances, mais il faut les approfondir en se basant sur les expériences des autres. Aujourd'hui, il y a suffisamment d'informations en ligne, vous pouvez vraiment apprendre beaucoup de choses.
Probablement, maîtriser le domaine d'un projet serait un avantage supplémentaire. Par exemple, si vous êtes dans un projet Fintech, vous devez comprendre la valeur du logiciel d'un point de vue commercial et connaître certains processus fonctionnels dans ce domaine.
🔴 Capacité à garder l'équilibre
Lorsqu'un projet est en cours de développement, diverses situations imprévues peuvent survenir et des bugs peuvent apparaître. Ils prennent par surprise les programmeurs inexpérimentés et les coincent. Les ingénieurs expérimentés savent que tout doit être résolu avec la tête froide car paniquer et crier n'aideront pas. Bien que, peut-être, les bogues aient été causés uniquement par des facteurs humains.
Un programmeur expérimenté trouvera une solution alternative tout en maintenant l'équilibre. Il est plus facile de trouver une solution non standard à un problème calmement qu'émotionnellement.
🔴 Capacité à partager ses connaissances et à donner son avis
Idéalement, les programmeurs expérimentés partagent leurs connaissances avec les autres ; participer à des webinaires, des conférences et des hackathons. Partager les connaissances d'un livre ou de la théorie de quelqu'un d'autre est une chose, et apporter votre propre expérience - vos «douleurs» passées - en est une autre. Le réseautage est vraiment utile, même si certains pourraient ne pas l'apprécier.
Un programmeur expérimenté sait à quel point il est important de donner son avis sur le travail des autres. Cela donne aux professionnels juniors l'occasion de comprendre leurs domaines de croissance potentiels, ce qu'il faut corriger et les erreurs à éviter.
Une rétroaction opportune est une question de gestion transparente et de communication efficace. C'est bien si les programmeurs occupant le poste de chef d'équipe comprennent et pratiquent cela.
🔴 Capacité à admettre ses erreurs
Une autre bonne caractéristique d'un programmeur expérimenté est d'admettre ses erreurs. Cette capacité signifie que l'on sait prendre ses responsabilités. Les erreurs sont l'occasion d'apprendre une leçon et d'acquérir une expérience précieuse pour l'avenir. Au lieu de porter la responsabilité des bogues de quelqu'un d'autre, le responsable technique peut donner des informations utiles lors de la révision du code et indiquer comment résoudre un problème spécifique.
Les programmeurs expérimentés ne jetteront certainement pas un junior "sous le bus" et pointeront du doigt la faute du débutant. Toute l'équipe travaille, et chacun a son domaine de responsabilité. Quelqu'un qui s'amuse a un impact sur toute l'équipe. Garder cela à l'esprit facilite l'établissement de relations de confiance et transparentes.
Les échecs peuvent être à la fois techniques et humains. Par exemple, si un employé ne se rend pas régulièrement au travail, c'est un facteur humain.
Quant aux pannes techniques importantes, je n'en ai pas rencontrées, car je n'ai pas souvent travaillé avec des programmeurs en dessous du niveau Senior. De toute évidence, les échecs possibles des ingénieurs seniors et juniors se situent dans des dimensions différentes.
J'appellerais cela un échec d'envoi de code à un référentiel sans exécuter de test. Il est préférable d'automatiser ce processus, comme cela se fait dans notre entreprise. Un autre échec est le code 'béquille'. Parfois, il y a un désir de faire du code rapidement, mais si ce processus accéléré dégrade la qualité, cela deviendra apparent à l'avenir.
Il existe différentes approches de la qualité du code. Les principes SOLID doivent absolument être pris en compte. Si vous faites une fonction polymorphe, vous devez vous assurer qu'elle ne casse pas les zones où elle est déjà utilisée. Lorsque vous apportez des corrections au code, vous devez tenir compte des conséquences et de la manière dont elles vous affecteront en général.
Ne pas suivre le processus technique est un échec du programmeur. Dans le cadre de mon équipe, il s'agit de créer des demandes d'extraction, d'exécuter un test de qualité de code, de mener des tests fonctionnels et de vérifier les tâches que vous effectuez vous-même. Si vous suivez le processus technique conçu dans l'entreprise, les échecs seront minimisés. Cependant, je dois admettre que toutes les entreprises ne disposent pas de processus correctement configurés, ce qui peut également être une condition préalable à de futurs échecs.
En général, je pense que les échecs des Seniors viennent de la paresse, et les échecs des Juniors viennent de l'inexpérience et de l'inattention. Les erreurs des juniors font surface là où on s'y attend le moins. Le travail d'un Junior, en tant que tel, est un échec continu au début, qui doit être constamment corrigé. Mais c'est à ça que servent les juniors.
La paresse de Senior donne l'impression d'être habitué à un processus et de lui faire confiance, en pensant « eh bien, je réglerai ça plus tard ». Souvent ça ne finit pas toujours bien, mais ça finit quand même mieux que dans le cas de Junior🙂
Les programmeurs inexpérimentés peuvent être identifiés en deux étapes : premièrement, lors d'un entretien, et deuxièmement, et pire encore, pendant le travail, si vous avez raté le "faker".
Questions qui m'aident à évaluer l'expérience d'un programmeur :
Il s'agit de la première partie des questions qui aident à déterminer le degré de connaissance d'une personne et les perspectives de collaboration. Si un candidat est confus à ce stade, les choses ne feront qu'empirer.
Il arrive qu'un programmeur ait 5 ans d'expérience et connaisse bien 10 technologies, mais lorsque vous posez des questions de base de cette liste, il se peut qu'il n'y ait pas de réponses. La même chose est susceptible de se produire avec une série de questions du bloc suivant.
Lors des entretiens technologiques, je ne donne pas de tâches algorithmiques complexes, car l'entretien est toujours stressant, et je détesterais l'aggraver. Même si un développeur a l'habitude de travailler avec certaines technologies, oublier comment effectuer certaines tâches est normal ; personne n'est parfait. La profondeur des connaissances et la résolution rapide des problèmes sont les éléments sur lesquels il faut se concentrer.
Dans l'ensemble, nous évaluons à la fois les soft skills et les hard skills lors des entretiens. Le bloc technique de questions diffère selon la technologie et le projet.
Certains programmeurs ont des mentors qui fournissent des conseils et des orientations. Je n'avais pas tout ça. J'ai étudié par moi-même et j'ai trouvé les informations nécessaires par moi-même. Bien que j'aie obtenu un diplôme en cybernétique économique et connaissais déjà les bases, en lisant la philosophie de Java, il était difficile de comprendre la nouvelle abstraction.
À un moment donné, les cours Java Rush m'ont beaucoup aidé; tout s'expliquait facilement et je pouvais pratiquer tout de suite. Mais il ne s'agit pas de l'avant.
C'est ce qui m'a aidé à devenir programmeur. J'ai étudié le reste de la documentation technique officielle et recherché des informations dans des cours vidéo gratuits. C'en était assez pour moi.
En même temps, c'est une erreur de penser que l'obtention d'un diplôme dans un cours ouvrira la porte à une entreprise informatique. Sans connaissance, ce morceau de papier est inutile. Suivre des cours pour obtenir un diplôme n'a aucun sens.
Dans une certaine mesure, vous pouvez obtenir des informations structurées, mais vous devez vous en souvenir et elles doivent être la base et le début de votre croissance future. L'une des caractéristiques d'un bon programmeur est la capacité de trouver des informations de qualité.
Si vous pouvez le faire, tout ira bien. Mais si vous vous attendez à ce que quelqu'un l'épelle pour vous, alors vous vous trompez. Je recommanderais le développement personnel et la navigation dans les cours en ligne disponibles. Et si vous travaillez déjà en tant que programmeur, vous pouvez suivre les cours Udemy, ceux dont vous avez besoin pour votre travail.
Plus un développeur acquiert d'expérience, plus il se rend compte de l'importance du développement dans le domaine du leadership en ingénierie. Et cela ne concerne pas seulement les ingénieurs qui gèrent déjà des équipes ; mais aussi de ceux qui sont toujours au courant des tendances, apprenant de nouvelles choses et développant de manière globale leurs compétences techniques et générales pour partager leurs connaissances et leurs compétences avec les autres.