Fort de ses 20 ans d’expérience, un ingénieur qui utilise le pseudonyme Antirez, évoque les qualités qui, selon lui, pourraient faire la différence dans la productivité des développeurs.
Les capacités de développement : implémenter une partie d’un programme
Une des limites les plus évidentes, ou forces, d'un développeur s’observe durant l’implémentation d'une partie d'un programme : une fonction, un algorithme ou autre. Étonnamment, la capacité d'utiliser des constructions impératives de programmation de base très efficacement afin de mettre en œuvre quelque chose n’est pas aussi répandue que l’on pourrait le penser, d’après son expérience. Il explique que dans une équipe, il a parfois observé des programmeurs très incompétents, qui n'étaient même pas au courant de l’existence d'un simple algorithme de tri, fournir plus de travail que des programmeurs diplômés qui étaient extrêmement compétents en théorie, mais très pauvres en pratique et en implémentation de solutions.
L’expérience: correspondance de modèles
Par expérience, il entend l'ensemble de solutions déjà explorées pour un certain nombre de tâches récurrentes. Un développeur expérimenté sait éventuellement comment faire face à une variété de sous-tâches. Cela évite à la fois beaucoup de travail de conception, mais surtout, constitue une arme extrêmement puissante face aux erreurs de conception, qui font partie des plus grands ennemis de la simplicité.
Concentration : temps réel VS temps hypothétique
Le nombre d'heures passées à écrire du code n’a pas de sens s’il n’est pas associé à la qualité du temps. Le manque de concentration peut être généré par des facteurs internes et externes. Les facteurs internes sont la procrastination, le manque d'intérêt dans le projet à portée de main (vous ne pouvez pas bien faire des choses que vous n'aimez pas), le manque d'exercice / bien-être, un manque de sommeil. Les facteurs externes sont des réunions fréquentes, des environnements de travail sans bureaux réels, des collègues qui interrompent souvent, etc. Il semble naturel que le fait d'essayer d'améliorer l'attention et de réduire les interruptions ait un effet non marginal sur la productivité de la programmation. Parfois, afin de se concentrer, des mesures extrêmes sont nécessaires. Par exemple, je ne lis que des e-mails de temps en temps et je ne réponds pas à la plupart d'entre eux.
Sacrifice du design : tuer 5 % pour obtenir 90 %
Il arrive que la complexité soit engendrée lorsqu'il n’y a pas de disposition à reconnaître qu'un objectif non fondamental d’un projet compte pour beaucoup dans la complexité d’un design. Ou alors rend difficile d’atteindre un objectif important. Il est très important pour un concepteur de reconnaître toutes les parties d'un design qui ne représentent pas des victoires faciles, c'est-à-dire, il n'y a pas de proportionnalité entre l'effort et les avantages. Un projet qui est exécuté afin de maximiser la production va se concentrer exactement sur les aspects qui comptent et qui peuvent être mis en œuvre dans un délai raisonnable. « Par exemple, lors de la conception de Disque, un courtier de messages, à un certain moment, j'ai réalisé qu'en fournissant un plus gros effort sur les commandes pour les messages, tous les autres aspects du projet pourraient être considérablement améliorés : la disponibilité, le langage de requête et l'interaction des clients, la simplicité et les performances ».
Simplicité
Afin de comprendre ce qu'est la simplicité, il a estimé qu’il est utile de vérifier comment la complexité est souvent générée. « Je crois que les deux principaux facteurs de complexité sont la réticence à effectuer des sacrifices de conception et l'accumulation d'erreurs dans l'activité de conception ».
Si vous pensez au processus de conception, chaque fois qu'un mauvais chemin est emprunté, nous sommes de plus en plus loin de la solution optimale. Une erreur de conception initiale, entre de mauvaises mains, ne générera pas une refonte du même système, mais conduira à la conception d'une autre solution complexe pour faire face à l'erreur initiale. Le projet devient donc plus complexe et moins efficace à chaque étape fausse.
La façon dont la simplicité peut être obtenue est de raisonner en termes de petites « preuves de concept », de sorte qu'une grande quantité de designs simples puissent être explorés dans l'esprit du programmeur, afin de commencer à travailler à partir de quelque chose qui semble être la solution la plus viable et directe. Plus tard, l'expérience et les capacités personnelles de conception permettront d'améliorer la conception et de trouver des solutions sensées pour les sous-modèles qui doivent être résolus.
Cependant chaque fois qu'une solution complexe est nécessaire, il est important de raisonner longuement sur la façon dont la complexité peut être évitée, et ne continuer dans cette direction que si aucune meilleure possibilité n’est trouvée, même en considérant des alternatives complètement différentes.
Perfectionnisme, ou comment tuer votre productivité et biaiser vos conceptions
Le perfectionnisme se décline en deux variantes : en tant que culture d'ingénierie consistant à atteindre la meilleure performance possible mesurable dans un programme, mais aussi en tant que trait de personnalité. « Dans les deux cas, je vois cela comme l'un des plus grands obstacles empêchant un développeur de livrer rapidement ». Le perfectionnisme et la peur des jugements externes peuvent influencer le design, ce qui va se traduire par de mauvais choix afin d'affiner un design uniquement en fonction de paramètres psychologiques ou trivialement mesurables. Dans de telles conditions, des éléments comme la robustesse, la simplicité, la capacité de livrer dans le temps ne sont souvent pas pris en compte.
Connaissances : quand la théorie vient à la rescousse
Lorsque les développeurs font face à des tâches complexes, les connaissances sur les structures de données, les limites fondamentales de calcul, les algorithmes non triviaux qui conviennent très bien à la modélisation de certaines tâches vont avoir un impact sur la capacité à trouver un design approprié. Être un « super-expert de tout » n'est pas nécessaire, mais être au moins conscient d'une multitude de solutions possibles pour un problème l’est certainement.
Bas niveau : comprendre la machine
Un certain nombre de problèmes dans les programmes, même en utilisant des langages de haut niveau, découlent de la mauvaise compréhension de la façon dont l'ordinateur va effectuer une tâche donnée. Cela peut même conduire à la nécessité de reconcevoir et de réimplémenter à nouveau à partir de zéro un projet parce qu'il ya un problème fondamental dans les outils ou les algorithmes utilisés. Une bonne compétence de C, la compréhension de la façon dont les processeurs fonctionnent et des idées claires sur la façon dont le noyau fonctionne et comment les appels système sont mis en œuvre, peuvent sauver des mauvaises surprises de dernière étape.
Compétences de débogage
Il est très facile de fournir une énorme quantité de travail afin de trouver des bogues. Être bon dans le déchiffrement des états d’un bogue, associé à la capacité à le corriger par un ensemble rationnel d’étapes et également écrire un code qui est peu susceptible de contenir trop de bogues, peut avoir un grand effet sur l’efficacité d’un développeur.
Source : billet Antirez
Et vous ?
Partagez-vous son point de vue ?
Quels sont les points qui vous semblent les plus pertinents ?
Avez-vous d'autres éléments à rajouter dans la liste ?
Quels sont les atouts qui permettraient de booster la productivité d'un développeur ?
Un ingénieur partage son point de vue
Quels sont les atouts qui permettraient de booster la productivité d'un développeur ?
Un ingénieur partage son point de vue
Le , par Stéphane le calme
Une erreur dans cette actualité ? Signalez-nous-la !