Questions d'entretien pour les développeurs




 Question 1

Parlez-nous un peu du dernier projet sur lequel vous avez travaillé.  A-t-il été complété avec succès ?  Expliquez comment vous avez contribué à son succès et comment vous avez surmonté les obstacles que vous avez pu rencontrer.

Reponse:

Cette question devrait vous donner un aperçu de la contribution globale du candidat au projet, de ses compétences en gestion et de la façon dont il travaille avec une équipe, ainsi que de son interaction avec la gestion du projet et les autres parties prenantes.  Les projets logiciels sont presque toujours confrontés à des obstacles et à des complications, et être capable d'identifier les obstacles, de résoudre les problèmes rapidement et efficacement et de faire le travail correctement et dans les délais est un attribut clé pour un ingénieur/développeur logiciel.

Question 2

Parlez d'un moment où vous avez dû prendre une décision cruciale pendant la production.  Qu'est-il arrivé?  Comment l'avez-vous géré ?

Reponse :

Cette question devrait vous aider à juger si un candidat est capable de penser par lui-même, d'analyser et d'évaluer les problèmes rapidement et clairement et de reconnaître la relation la plus logique entre les idées.

 Les penseurs critiques ont souvent aussi un état d'esprit exploratoire qui peut conduire à l'innovation et à l'amélioration des systèmes et processus de production.

Question 3

Comment expliqueriez-vous les API aux parties prenantes non techniques ?

Reponse :

Être capable de bien communiquer est l'une des compétences les plus importantes qu'un candidat puisse avoir.  Une question comme celle-ci vous donnera une idée de la façon dont le candidat gère les conversations les plus difficiles ou les plus complexes.

 Un candidat pourrait répondre ainsi :

 Une API (Application Programming Interface) peut être utilisée pour un système basé sur le Web, une bibliothèque de logiciels, du matériel informatique et un système d'exploitation ou de base de données.  Il s'agit d'un ensemble de règles (code) et de spécifications que les logiciels peuvent suivre pour communiquer.  En termes simples, il fonctionne comme une interface entre différents programmes et facilite leur interaction.

 Bien que cette réponse soit suffisamment précise, elle peut apparaître comme "juste plus de tech-speak" pour un public non féru de technologie.  Une meilleure réponse serait :

 "API" est un terme très générique - il peut être utilisé dans toutes sortes de contextes de programmation : sites Web, applications mobiles, logiciels de bureau et même systèmes d'exploitation (par exemple, Windows, macOS ou Linux).  C'est une spécification sur la façon dont un logiciel peut être utilisé par d'autres logiciels.

 C'est un peu mieux : il y a moins de ton académique, et une certaine précision a été échangée contre des termes légèrement plus pertinents comme « site Web » plutôt que « système Web » et « logiciel de bureau » plutôt que « bibliothèque de logiciels ».  Cependant, cela devient encore trop technique dans la mesure où il doit avoir un aparté pour définir les systèmes d'exploitation, avec lesquels le public peut ne pas être familier.

Comparez cela avec :

 Une API indique aux programmeurs comment automatiser un produit, des applications Web comme Twitter jusqu'à Windows lui-même.  Par exemple, je pourrais utiliser l'API de Twitter pour récupérer les tweets les plus récents de notre entreprise, puis les afficher sur notre site Web.  De cette façon, notre spécialiste des médias sociaux peut simplement tweeter, sans avoir à toujours prendre des mesures supplémentaires pour copier le tweet sur notre site Web.

 Ici, la réponse passe par trois aspects clés du sujet :

 Qu'est-ce que c'est, en termes très pertinents : tout le monde a entendu parler des programmeurs, de Twitter et de Windows.

 Ce qu'il fait, à l'aide d'un exemple concret.  Ici, l'exemple utilise à nouveau des concepts familiers : tweeter et afficher quelque chose sur un site Web.

 Pourquoi c'est bénéfique, en s'appuyant sur l'exemple et en soulignant la différence « avant et après » : cela fait gagner du temps et permet aux employés de se concentrer davantage sur la créativité plutôt que sur la monotonie.

 Cela devrait vous donner une idée de ce qu'il faut rechercher, mais n'hésitez pas à choisir un terme technique plus familier que "API", le cas échéant.  La communication est une chose, mais ce serait définitivement un signal d'alarme si la réponse de votre candidat n'était même pas correcte !

Question 4

Voici un défi de programmation simple.  Pourriez-vous tenter de le résoudre ?

 Exemple de question 1 (période plus courte) : Écrivez une fonction pour calculer le nième nombre de Fibonacci.

 Exemple de question 2 (période plus longue) : Écrivez une fonction qui prend la position actuelle d'un chevalier sur un échiquier et renvoie une liste préliminaire de mouvements possibles que le chevalier pourrait effectuer.  (C'est-à-dire que les positions actuelles des autres pièces ne sont pas fournies, vous ne pouvez donc pas vérifier si vous capturez des pièces du côté du chevalier ni rendre son roi vulnérable à la capture.)

Reponse :

Proposer aux candidats un simple défi de programmation peut sembler anodin, mais il est utile pour plusieurs raisons :

 Cela vous donne l'occasion de voir à quel point ils fonctionnent sous pression.  (Il est important qu'ils le fassent devant vous - vous devez embaucher des personnes capables d'écrire du code sous stress en cas de besoin !)

 Il démontre leur base éducative.

 Cela montre simplement s'ils savent écrire du code ou non, et leur expérience.

 Selon le type de défi que vous choisissez, cela peut vous aider à différencier les compétences.  Cela aide également à démêler leur formation scientifique / mathématique et à savoir s'ils sont un penseur de haut niveau.

Question 5

Quels langages de programmation utilisez-vous ?  Quels sont les trois que vous préférez ou que vous connaissez le mieux ?

Reponse :

Cette question vous donnera une idée des connaissances en programmation du candidat, de son niveau de compétence et de sa pertinence pour votre entreprise.

 Fin 2017, GitHub, un site Web de partage de code utilisé par des développeurs du monde entier, répertoriait les dix langages et technologies de programmation les plus couramment utilisés :

 JavaScript - est un langage dynamique généralement utilisé pour ajouter de l'interactivité sur les sites Web.

 Python - est un langage puissant et polyvalent qui a gagné en popularité en 2018. Il est largement utilisé pour une gamme de tâches, notamment le développement Web, l'apprentissage automatique et l'analyse de données.

 Java - (sans rapport avec JavaScript) est un langage de programmation polyvalent utilisé pour créer des applications multiplateformes.

 Ruby - est un langage de programmation open source dynamique, orienté objet et à usage général, axé sur la simplicité et la productivité.  Il est principalement utilisé pour les applications Web, notamment via le framework MVC côté serveur Rails.

 PHP - est un langage de script open source côté serveur utilisé pour le développement d'applications Web.

 C++ - est un langage de programmation orienté objet généralement utilisé pour les systèmes d'exploitation, les jeux et les logiciels embarqués.  Il peut également être utilisé pour créer des systèmes de niveau supérieur tels que des applications de gestion de réseau et d'appareils distants.

 Les feuilles de style en cascade (CSS) sont un pilier du Web et sont utilisées pour formater le contenu des pages Web.  Les fichiers CSS aident à définir les aspects critiques (police, couleur, tailles de mise en page, espacement, etc.) ainsi qu'à maintenir une apparence continue sur plusieurs pages d'un site Web.

 C# - est un langage orienté objet développé par Microsoft.  Il est conçu pour améliorer la productivité dans le développement Web et est souvent utilisé avec des services Web basés sur XML sur la plate-forme .NET.

 Go - est un langage de programmation open source conçu pour la construction d'infrastructures logicielles complexes à grande échelle.  Il peut également être transpilé en JavaScript pour être utilisé dans le développement Web frontal, bien que ce soit un scénario moins courant pour le moment.

 C - est un langage de programmation généraliste de haut niveau.  Développé à l'origine pour écrire des logiciels système, il est aujourd'hui souvent utilisé pour développer des micrologiciels ou des applications portables.

Question 6

Selon vous, quels sont les aspects les plus importants auxquels il faut prêter attention lors de l'examen du code d'un autre membre de l'équipe ?

Reponse :

Les revues de code sont fondamentales pour le processus de développement logiciel, même lorsqu'il n'y a qu'un seul ingénieur.  En posant cette question, vous aurez une idée des connaissances et des capacités de résolution de problèmes du candidat, de son souci du détail et de sa capacité à garder une vue d'ensemble du projet.

 Voici un exemple de réponse :

 « Je recherche d'abord la sécurité, la fonctionnalité et la lisibilité.  Le code est-il simple, ou encombré, gonflé et inefficace ?  Combien de lignes de code inutile devrai-je réécrire ou supprimer ?  Je vérifie les faiblesses qui pourraient entraîner des vulnérabilités et je confirme que les exigences réglementaires ont été respectées. »

 Chacun a son propre style de codage et chaque développeur ou équipe aura des exigences spécifiques à sa base de code.  Les revues de code efficaces ont souvent des listes de contrôle.  Vous trouverez ci-dessous une liste limitée de suggestions générales que vous pourriez envisager, notamment :

 Le logiciel passe les tests automatisés et manuels

 Le code suit les conventions applicables et est facile à comprendre

 Le code n'est pas dupliqué

 Aucune variable booléenne nommée négativement

 Examiner les méthodes avec des paramètres booléens

 Les blocs de code à l'intérieur des boucles sont aussi petits que possible

 Pas de fuite de mémoire

 Mais plus important que les points exacts qu'un candidat soulève est son raisonnement pour le faire.  Méfiez-vous des candidats qui restent coincés dans le délestage des onglets par rapport aux espaces au détriment d'éléments d'ingénierie plus cruciaux : les éléments ci-dessus ne doivent pas tous avoir le même poids.

Question 7

Considérez-vous les tests unitaires comme essentiels ou comme une perte de temps ?

Reponse :

Chaque ingénieur/développeur qui mérite d'être considéré doit être familiarisé avec les tests unitaires.  Poser cette question vous permettra de comprendre leur attitude à son égard et le niveau de priorité qu'ils lui accordent dans leur processus de travail.  Suivent-ils le développement piloté par les tests (TDD) ou le développement piloté par le comportement (BDD), ou les tests unitaires sont-ils quelque chose qu'ils rajoutent par la suite pour des raisons de conformité au processus ou de simples apparences ?

 Généralement considérés par la plupart des professionnels de l'industrie comme une pratique exemplaire en matière de maintenance de code et de développement de logiciels, les tests unitaires font généralement partie d'une stratégie de test globale.  Ils testent les erreurs de logique et les défauts de codage, aidant à empêcher les bogues de se propager au produit fini.  De plus, parce qu'ils sont automatisés, ils empêchent les régressions, où les bogues qui avaient déjà été corrigés reviennent.

Question 8

Quelle a été votre expérience dans le cadre d'un processus de développement logiciel agile, le cas échéant ?

Reponse :

Le Manifeste pour le développement logiciel agile décrit une approche basée sur des itérations plutôt qu'un modèle en cascade.  Les exigences et les solutions sont générées grâce à la collaboration d'équipes auto-organisées et interfonctionnelles et de leurs utilisateurs finaux.  Entre autres choses, il encourage un style de planification flexible et une réaction rapide au changement.

 Savoir ce qu'un développeur pense du développement agile peut vous aider à comprendre comment il s'intégrera dans votre propre processus.  Les développeurs ouverts d'esprit qui sont également capables de voir les failles dans la façon dont les processus agiles ont été exécutés peuvent fournir des commentaires précieux pour aider la méthodologie de votre équipe à se développer et à évoluer.

 D'un autre côté, s'ils sont obnubilés par l'un de vos processus de base, il peut y avoir trop de frictions pour qu'ils restent productifs.

Question 9


Êtes-vous familiarisé avec la programmation orientée objet (POO) ?

Reponse :

La POO est une convention standard depuis plus de 20 ans et est organisée autour d'objets plutôt que d'actions, et de données plutôt que de logique.  Il est omniprésent et il est très peu probable qu'un candidat ne l'ait pas rencontré à un moment donné.

 Voici dix exemples de termes qu'ils devraient pouvoir définir :

 classe, objet (et la différence entre les deux)

 méthode (par opposition à, disons, une fonction C)

 méthode virtuelle, pure méthode virtuelle

 classe/méthode statique

 initialiseur statique/de classe

 constructeur

 destructeur/finaliseur

 superclasse ou classe de base

 sous-classe ou classe dérivée

 NB.  Certaines entreprises évitent la POO et préfèrent utiliser un langage de programmation fonctionnelle (FP) tel que Clojure.

Question 10

Veuillez expliquer la notation big-O dans les termes les plus simples.

Reponse :

La notation Big-O (symbole de Landau) est utilisée en informatique pour décrire les performances ou la complexité d'un algorithme.  Il décrit comment le temps d'exécution ou l'espace requis d'une fonction augmente à mesure que l'entrée augmente.

 Deux fonctions avec la même notation Big-O auront tendance à avoir le même taux de croissance et donc les mêmes performances relatives avec de grandes entrées.

 Par exemple, l'algorithme de tri à bulles a une complexité temporelle moyenne de O(n^2) tandis que le tri par fusion et le tri par tas ont tous deux une complexité moyenne de O(n log n).  Dans les cas moyens, le tri par fusion et le tri par tas afficheront des performances similaires alors qu'ils surpasseront tous les deux le tri par bulles.

 Les candidats doivent être en mesure de démontrer une compréhension de base des principes fondamentaux de l'analyse de complexité algorithmique big-O.

 Ils doivent savoir que les algorithmes appartiennent généralement aux classes de performances suivantes :

 Temps constant

 Logarithmique

 Linéaire

 Polynôme

 Exponentiel

 Factorielle

 Ils doivent également être en mesure d'expliquer pourquoi une opération donnée appartient à une classe de complexité particulière.