Dernièrement, de nombreuses copies ont été cassées autour d'entretiens techniques. De toute évidence, l'inversion d'un arbre binaire sur une carte n'a pas grand-chose à voir avec les compétences pratiques d'un vrai programmeur. Le Fizzbuzz primitif
reste le test le plus efficace. En conséquence, l'attention portée aux projets open source s'est accrue, mais il s'est avéré que ce n'est
pas non plus un très bon indicateur , car la plupart des professionnels n'ont pas le temps pour eux.
Nous avons l'entretien de codage le plus efficace dans notre entreprise aujourd'hui - il s'agit généralement d'une sorte de travail de quelques jours au cours duquel le candidat est invité à corriger un bogue ou à implémenter une petite fonctionnalité. Ce n'est pas bon car cela prend beaucoup de temps et la personne peut obtenir de l'aide extérieure (ou Google si la fonctionnalité est assez courante). D'un autre côté, certaines grandes entreprises ont plutôt doublé le nombre d'entretiens sur tableau blanc (et d'algorithmes), soumettant les futurs ingénieurs à des heures de sessions de programmation en ligne avec différents niveaux de surveillance invasive.
Toutes ces techniques d'interview ne correspondent pas à une métrique très simple: jouer ensemble à Factorio... Le fait de parcourir tout le cycle de Factorio est un indicateur presque parfait de la capacité d'une personne à résoudre des problèmes techniques courants. Vous pouvez même personnaliser le playthrough en fonction de la position future pour mieux comprendre comment le candidat gérera son rôle.
Factorio?
Factorio est un jeu d'automatisation. Cette bande - annonce sera probablement la meilleure introduction , mais votre travail consiste essentiellement à construire une usine automatisée capable de lancer une fusée dans l'espace.
Partir de zéro. Vous extrayez du minerai de fer et de la pierre à la main, construisez une fonderie pour fondre du minerai en plaques de fer, à partir desquelles vous pouvez fabriquer une foreuse automatique à combustible solide. Vous pouvez ramasser indépendamment le minerai de fer de la perceuse et le mettre dans la fonderie, mais il est plus efficace d'utiliser un convoyeur automatique. Ensuite, vous pouvez utiliser le fer résultant pour fabriquer une autre perceuse qui automatise l'extraction du charbon. Ensuite, un convoyeur est construit pour collecter le charbon et un convoyeur pour le transférer vers la perceuse. Cette minuscule usine produit des plaques de fer qui peuvent être utilisées pour faire un troisième forage - et commencer à extraire du minerai de cuivre, ce qui vous permet de fabriquer des plaques de cuivre, et à partir d'elles, vous pouvez fabriquer du fil de cuivre, ce qui est nécessaire pour une pompe submersible. Combiné avec une chaudière à vapeur et une machine à vapeur, cela nous donne notre première électricité.Il peut être utilisé pour un centre de recherche et l'invention de nouvelles technologies comme une machine d'assemblage. Une fois que vous avez déverrouillé les machines d'assemblage, vous pouvez utiliser le fil fabriqué à la main pour créer une machine d'assemblage qui fabriquera automatiquement ces fils.
En fin de compte, vous débloquerez des trains, des robots et des systèmes logistiques qui vous aideront à faire face à la complexité logistique croissante du jeu. Eh bien, à la fin, vous pourrez lancer une fusée dans l'espace.
Choix de la direction
Le jeu commence sans but et presque sans direction. Le programmeur principal doit être capable d'apprendre l'interface utilisateur et de définir un objectif, puis d'élaborer un plan pour l'atteindre. On s'attend à ce que le junior accomplisse correctement les tâches définies par le développeur principal. Le stagiaire est censé travailler avec un mentor, mais le junior devrait être en mesure de résoudre les problèmes sous-jacents avec son code par lui-même avant de demander l'aide de la personne âgée. Middle doit être capable de travailler de manière autonome dès qu'on lui confie une mission, mais on ne s'attend pas à ce qu'il fasse de la conception architecturale.
Les attentes spécifiques peuvent être formulées comme suit:
- Le stagiaire doit généralement être en mesure de placer un plan et de le connecter à autre chose, comme un gisement de minerai.
- , . , .
- , ( ) .
- , , .
L'aspect le plus important du développement logiciel est le travail d'équipe. Cela signifie se coordonner avec d'autres personnes, répondre aux besoins des projets des autres et collaborer avec l'équipe, plutôt que de travailler seul lorsque vous refusez de changer votre conception pour vous intégrer au travail de quelqu'un d'autre. Naturellement, de telles situations se produisent tout le temps dans Factorio, car les plans standard sont limités à l'espace physique. En conséquence, vous devez étudier attentivement les actions des autres personnes et parfois ajuster votre conception pour qu'elle corresponde aux limites de taille ou vous adapter au dessin d'autres personnes qui prenait plus de place que prévu.
Si le joueur se replie sur lui-même, commence à tout faire lui-même ou résout silencieusement des problèmes, cela encouragera rapidement la colère de l'équipe pour les mêmes raisons que les collègues sont en colère contre les programmeurs de cow-boy. Heureusement, Factorio a un équivalent intégré
git blame
: il montre le dernier joueur à changer une entité. Ainsi, si quelqu'un a mis une béquille et n'a pas informé l'équipe du problème, alors quand cette béquille se cassera finalement, tout le monde saura qui est à blâmer. Si vous voulez gagner, vous devez travailler en étroite collaboration avec vos coéquipiers.
Débogage
Le débogage est l'une des principales compétences d'un programmeur. C'est peut-être le parallèle le plus évident entre Factorio et le développement de logiciel réel. Quelque chose peut se briser très loin de la source réelle du problème. La capacité de déterminer rapidement un problème réel est une compétence essentielle, et le processus de réflexion est presque identique à la recherche de la cause d'un véritable échec de programme. Si le sélecteur cesse de fonctionner, vous devez d'abord vérifier les flux sortants. Vérifiez ensuite quel ingrédient manque à l'entrée. Ensuite, retracez l'ingrédient dans l'usine pour savoir où il est produit. Et répétez le processus encore et encore, jusqu'à la nausée.
Le débogage dans Factorio se complique rapidement. Dès que vous construisez une raffinerie de pétrole, vous vous engagez dans le craquage, où il y a trois tuyaux différents à la sortie (mazout, carburant diesel et gaz de pétrole associé), et si l'un d'entre eux pour une raison quelconque a calé, alors toute la raffinerie cesse de fonctionner.
Il y a eu des moments où la plante entière s'est arrêtée parce que vous avez commencé à rechercher quelque chose qui ne nécessitait pas de science jaune. En conséquence, vous avez cessé d'utiliser des cadres de drones, qui n'étaient plus fournis avec des moteurs électriques, où du lubrifiant était utilisé, pour la production desquels du fioul était prélevé. En conséquence, le tuyau de sortie de la raffinerie s'est bloqué, ce qui vous a fait manquer de gaz de pétrole associé (pétrole), ce qui a arrêté la production de plastique. En conséquence, la production du fil rouge de signal a été arrêtée - et toute l'usine était en panne. Les joueurs expérimentés anticipent de tels scénarios et mettent en œuvre un craquage d'huile auto-équilibré pour s'assurer que le système est toujours équilibré. Une telle installation ne s'arrêtera que si le tuyau de sortie avec le gaz associé est bloqué.Si un bon programmeur se voit attribuer une raffinerie en panne, il peut généralement retracer le problème à la source, comprendre ce qui s'est passé et essayer rapidement de trouver une solution. D'un autre côté, si une personne pose simplement quelques nouveaux réservoirs au sol sans raison valable (elle est absolument sûre que le lubrifiant sera toujours nécessaire), alors c'est un gros drapeau rouge sur les méthodes de résolution des problèmes en ses programmes.
Des situations comme celle-ci permettent à Factorio d'imiter avec précision les interdépendances complexes avec lesquelles les programmeurs sont généralement confrontés. La difficulté augmente à mesure que de nouveaux concepts sont ajoutés au gameplay. Ceci est très similaire à l'augmentation de la complexité des couches supplémentaires d'abstraction lors du débogage d'un crash qui aurait pu se produire profondément dans l'un des frameworks que vous utilisez.
Examen du code
Souvent, la conception originale doit être peaufinée pour améliorer les performances ou le débit. Les bons programmeurs accepteront non seulement la critique de leurs conceptions, mais ils en tiendront également compte dans leurs travaux futurs. S'ils ne sont pas d'accord avec le changement, ils fourniront une explication spécifique afin que l'équipe puisse réfléchir plus précisément sur les avantages et les inconvénients du changement proposé.
Résister à la rétroaction sans raison valable est un signal d'alarme bien connu. De plus, le programmeur qui hésite à accepter les changements proposés et refuse d'ajuster les projets futurs en conséquence, fait preuve de prudence. En conséquence, il devra constamment se rappeler de la nécessité de se conformer à une manière standard de résoudre le problème. Dans le même temps, la personne n'explique pas pourquoi elle n'aime pas la méthode proposée. C'est potentiellement une bombe à retardement pour une organisation car, sans surveillance, il peut rapidement accumuler des dettes techniques pour ses collègues. Ces types de problèmes sont presque impossibles à appréhender dans un entretien traditionnel, uniquement pendant un stage.
Style de codage et cadres
Le non-respect des conseils n'est qu'une partie d'un problème beaucoup plus vaste lorsque le programmeur est incapable de s'intégrer correctement dans la structure existante. Il existe de nombreuses façons de construire une usine dans Factorio, et chacune nécessite des méthodes de construction standard. Le non-respect des normes bloquera rapidement toute l'usine, souvent de manière subtile qui n'est pas évidente pour le développeur imprudent.
La conception du convoyeur à bande principal comprend 4 à 8 convoyeurs, divisés en deux sections (pour les convoyeurs souterrains). Il est placé au centre de l'usine et toute la production se déroule perpendiculairement à la bande. Cette conception repose sur plusieurs règles, dont la violation peut conduire à un chaos complet. Tout d'abord, vous devez toujours utiliser un séparateur à la sortie du convoyeur. Vous ne devez jamais rediriger une bande entière: l'espace vide pour une autre bande signifie que vous perdez tout un pipeline de ressources, même après une mise à niveau. Deuxièmement, toutes les usines doivent s'échelonner perpendiculairement au convoyeur principal. Le fait de ne pas évoluer rapidement entraînera un énorme gaspillage d'espace ou une incapacité à mettre à l'échelle la ligne de production car elle est entourée d'autres lignes de production.
Réseau logistique
Il existe différentes manières de construire des réseaux logistiques. Le plus simple est celui des coffres de ravitaillement passifs. Mais il existe une autre méthode - les coffres de stockage de filtres, qui résout le problème des déchets. Les deux méthodes nécessitent le placement correct des dispositifs de retenue aux bons endroits. Les coffres de ravitaillement passifs sont généralement limités par l'espace de la poitrine. Vous devez mettre un manipulateur sur les coffres de stockage pour connecter le coffre au réseau logistique. Et fournissez au moins N éléments avant d'installer le manipulateur. Si vous oubliez ces étapes, d'énormes ressources seront gaspillées. Si un programmeur oublie constamment les limiteurs de sortie, c'est un drapeau rouge qu'une personne ne se soucie pas des performances dans les applications réelles.
Dans d'autres cas, l'équipe peut utiliser des plans préconçus, comme une conception de réacteur nucléaire ou une usine de drones robotiques (usine de robots). Ils peuvent être extrêmement difficiles, mais si vous faites un effort et que vous le comprenez, ils vous font gagner beaucoup de temps. Méfiez-vous des candidats qui ne souhaitent pas personnaliser un nouvel élément dans l'usine simplement parce qu'ils ne peuvent pas tracer une logique de contrôle complexe. Ou qui renonce à essayer de comprendre l'algorithme pour le fonctionnement d'une telle usine, malgré les avantages évidents des drones par rapport aux convoyeurs. Conception de l'usine de drones sous-optimale, source
Multithreading
Les trains dans Factorio sont un analogue direct du multithreading: un train est un thread d'exécution, et chaque intersection ou arrêt de train est un endroit en mémoire où deux threads peuvent potentiellement écrire en même temps. Les feux de signalisation sont des serrures (ou des mutex). Tous les bogues du réseau ferroviaire se manifestent de la même manière que la condition de course dans le logiciel, car ils sont littéralement la condition de course physique. Tous les compromis s'appliquent ici aussi - un blocage trop long diminue le débit. Une conception incorrecte des feux de signalisation provoque généralement des blocages, tout comme dans les logiciels, car le résultat final est une dépendance cyclique imbriquée. L'impasse la plus courante se produit lorsqu'un train est trop long et bloque de manière inattendue une deuxième intersection en attendant d'entrer dans la première.Cette seconde intersection empêche alors un autre train de partir, empêchant le déblocage de la première intersection.
Le nombre de voies du réseau ferroviaire correspond au nombre de cœurs CPU. Il est difficile de faire évoluer une seule voie à plus de quelques voies car la capacité de l'ensemble du système est très rapidement limitée, même avec des zones d'attente. La conception la plus courante est une conception à deux voies, avec une voie de chaque côté. C'est là que les problèmes de capacité se poseront lorsqu'il sera nécessaire de décharger constamment les trains. Par conséquent, les grands réseaux ferroviaires ont au moins quatre voies, les deux extérieures servant de voies de contournement pour éviter les croisements autant que possible.
Les problèmes de feux de circulation dans ces systèmes peuvent se manifester dans un laps de temps fantastique. Un seul feu de signalisation manqué sur le même réseau ferroviaire a une fois provoqué une impasse après avoir fonctionné correctement pendant deux semaines . De même, dans les programmes, la condition de concurrence ne peut apparaître qu'une fois par mois, lorsque la concurrence élevée des threads survient sous une charge importante.
Mise à l'échelle
Comme pour les logiciels, la mise à l'échelle de la production de Factorio introduit de nouveaux défis dans la conception originale du plan directeur et nécessite souvent une refonte complète pour maximiser la productivité, avec l'installation de modules de productivité et de modules de vitesse avec balises. Les convoyeurs deviennent un goulot d'étranglement de performance même à la vitesse maximale de la bande, forçant les moyens de diviser les structures afin que plus de bandes puissent être insérées plus tard, ou de diviser les usines en modules.
La gestion du réseau logistique lui-même devient un défi logistique à la fin du jeu en raison du nombre de problèmes causés par les réseaux de drones expansifs. En règle générale, vous devez commencer à segmenter la chaîne d'approvisionnement et soit utiliser des trains pour transporter des marchandises entre les segments, soit créer des coffres de demande et d'approvisionnement qui transféreront les marchandises à travers les frontières.
À la fin du jeu, la gestion des trains nécessite de passer de l'architecture push à l'architecture pull car l'architecture push ne peut pas gérer une bande passante élevée. Cela conduit inévitablement à l'utilisation de la fonction Train Limit et à apprendre à utiliser des réseaux logiques pour encoder la logique de base afin que la gare ne demande un train que lorsqu'elle est vraiment prête à le remplir complètement de ressources, au lieu des tactiques de jeu habituelles à le début du jeu, quand un groupe de trains reçoit simplement l'ordre d'aller chercher du fer. Le nouveau système minimise le nombre de trains tout en garantissant que toutes les gares du réseau sont desservies.
Il arrive souvent que les contraintes sur les lignes d'entrée de la machine d'assemblage et les limites de vitesse du manipulateur nécessitent une refonte des usines environnantes, tout comme le calcul à grande vitesse nécessite la connaissance des goulots d'étranglement dans le CPU. Ces goulots d'étranglement ne sont presque jamais un problème jusqu'à ce que vous atteigniez une certaine échelle, mais après cela, ils commencent à limiter les performances.
Microservices et modules
Finalement, les usines deviennent si énormes qu'elles doivent abandonner une conception simple avec une bande transporteuse principale ou une conception de spaghetti et passer à une structure plus évolutive. Pour atteindre le niveau méga, les usines utilisent généralement soit un système de train, soit un système modulaire qui correspond à peu près à des microservices ou à une architecture plug-in.
La méga-base basée sur les trains est parfois appelée conception de «pâté de maisons», où les trains autour des blocs de l'usine contrôlent toutes les entrées et sorties. De cette manière, chaque bloc individuel est isolé de tous les autres, puisque toutes les entrées sont «propres» dans le sens où elles proviennent du réseau ferroviaire. Ceci est presque identique à l'architecture des microservices (sur HTTP) ou de la communication inter-processus (IPC), avec des problèmes potentiels similaires dus aux retards d'E / S, puisque les résultats ne peuvent pas être reçus tout le temps, ils doivent être envoyés en "paquets" ou trains sur le réseau ferroviaire.
L'architecture modulaire tente de conserver un semblant du convoyeur principal, mais sépare plutôt les courroies en usine et utilise des blocs modulaires qui acceptent les entrées et les sorties standard. Parfois, cela peut être entièrement réalisé avec des drones, mais les matériaux doivent généralement être transportés sur de longues distances par bande transporteuse. Ceci est très similaire au système de modules pour une application monolithique, avec les mêmes compromis.
Ces mégabases représentent le niveau supérieur du serveur Factorio par défaut. Bien sûr, il existe de nombreux mods qui rendent le jeu beaucoup plus difficile.
Systèmes distribués
Space Exploration est une version entièrement retravaillée de Factorio pour la colonisation spatiale. Ici, les planètes deviennent limitées en ressources, obligeant les joueurs à coloniser d'autres mondes et à utiliser des fusées pour transférer des ressources entre les planètes. En raison de l'énorme retard dans la livraison des matériaux entre les planètes, la coordination de ces bases conduit à des problèmes similaires à un système de base de données distribué à l'échelle mondiale. Même dans le réseau logique, vous devez lutter contre la latence, car le système automatique perd de vue les éléments qui sont lancés mais qui n'ont pas encore atteint la planète cible. Si cela n'est pas pris en compte, il y a des requêtes en double pour tous les éléments requis. Les systèmes distribués sont confrontés exactement au même problème lorsqu'ils tentent d'assurer la cohérence entre les nœuds.
Production
En général, l'industrie du logiciel n'a aucune idée de la façon de trouver et d'embaucher les meilleurs développeurs. Jouer à Factorio ensemble était probablement la meilleure interview technique que nous ayons jamais faite. Et cela nous déroute beaucoup . Cette interview est extrêmement peu pratique, prenant plus de 20 heures en multijoueur pour la première fois, ou 8 heures pour une équipe de joueurs expérimentés. Que peut-on en tirer? Je ne sais pas. Nous ne pouvons certainement pas passer à Factorio comme méthode d'entretien - tout aussi bien, donnez simplement des devoirs au candidat.
Mais c'est mieux qu'une interview sur tableau blanc.