Jugar juntos en Factorio es la mejor entrevista técnica que hemos hecho

Últimamente se han roto muchas copias en torno a entrevistas técnicas. Obviamente, invertir un árbol binario en una placa tiene poco que ver con las habilidades prácticas de un programador real. El primitivo Fizzbuzz sigue siendo la prueba más eficaz. Como resultado, la atención a los proyectos de código abierto ha aumentado, pero resultó que este tampoco es un indicador muy bueno , porque la mayoría de los profesionales no tienen tiempo para ellos.



Hoy tenemos la entrevista de codificación más efectiva en nuestra empresa; por lo general, se trata de algún tipo de tarea durante unos días en la que se le pide al candidato que corrija un error o implemente una pequeña función. Esto no es bueno porque lleva mucho tiempo y la persona puede obtener ayuda externa (o buscar en Google si la función es lo suficientemente común). Por otro lado, algunas grandes empresas han duplicado el número de entrevistas (y algoritmos) de pizarra, sometiendo a los futuros ingenieros a horas de sesiones de programación en línea con distintos niveles de vigilancia invasiva.



Todas estas técnicas de entrevista no coinciden con una métrica muy simple: jugar a Factorio juntos... Pasar por todo el ciclo de Factorio es un indicador casi perfecto de qué tan bien está una persona resolviendo problemas técnicos comunes. Incluso puede personalizar el recorrido en función de la posición futura para comprender mejor cómo el candidato manejará su función.



Factorio?



Factorio es un juego de automatización. Este tráiler probablemente sea la mejor presentación , pero esencialmente su trabajo es construir una planta automatizada capaz de lanzar un cohete al espacio.



Comenzando desde cero. Extrae mineral de hierro y piedra a mano, construye una fundición para fundir el mineral en placas de hierro, a partir de la cual puede fabricar un taladro automático de combustible sólido. Puede recoger el mineral de hierro del taladro de forma independiente y ponerlo en la fundición, pero es más eficiente utilizar un transportador automático. Luego, puede usar el hierro resultante para hacer otro taladro que automatice la extracción de carbón. Luego se construye un transportador para recolectar carbón y un transportador para transferirlo a la perforadora. Esta pequeña fábrica produce placas de hierro que se pueden usar para hacer un tercer taladro y comenzar a extraer mineral de cobre, lo que le permite fabricar placas de cobre, y a partir de ellas puede hacer alambre de cobre, que es necesario para una bomba sumergible. Combinado con una caldera de vapor y una máquina de vapor, esto nos da nuestra primera electricidad.Se puede utilizar para un centro de investigación y la invención de nuevas tecnologías como una máquina de ensamblaje. Una vez que desbloquee las máquinas de ensamblaje, puede usar el cable hecho a mano para crear una máquina de ensamblaje que fabricará automáticamente esos cables.



Al final, desbloquearás trenes, robots y sistemas logísticos que te ayudarán a lidiar con la creciente complejidad logística del juego. Bueno, al final podrás lanzar un cohete al espacio.



Elección de dirección



El juego comienza sin gol y casi sin dirección. El programador principal debe poder aprender la interfaz de usuario y definir un objetivo, y luego desarrollar un plan para lograrlo. Se espera que el junior complete correctamente las tareas establecidas por el desarrollador principal. Se supone que el aprendiz debe trabajar con un mentor, pero el junior debería poder solucionar los problemas subyacentes con su código por sí mismo antes de pedir ayuda al senior. Middle debe poder trabajar de forma independiente tan pronto como se le asigne una tarea, pero no se espera que haga diseño arquitectónico.



Las expectativas específicas se pueden formular de la siguiente manera:



  • Por lo general, el alumno debe poder colocar un plano y conectarlo a otra cosa, como un depósito de mineral.

  • , . , .

  • , ( ) .

  • , , .




El aspecto más importante del desarrollo de software es el trabajo en equipo. Esto significa coordinarse con otras personas, satisfacer las necesidades de los proyectos de otras personas y colaborar con el equipo, en lugar de trabajar por su cuenta cuando se niega a cambiar su diseño para ayudar a integrarse con el trabajo de otra persona. Naturalmente, estas situaciones surgen todo el tiempo en Factorio, porque los planos estándar se limitan al espacio físico. Como resultado, debe estudiar cuidadosamente las acciones de otras personas y, a veces, ajustar su diseño para que se ajuste a los límites de tamaño o adaptarse a los dibujos de otras personas que ocupan más espacio del esperado.



Si el jugador se retrae en sí mismo, comienza a hacer todo él mismo o soluciona los problemas en silencio, esto provocará rápidamente la ira del equipo por las mismas razones por las que los colegas están enojados con los programadores de vaqueros. Afortunadamente, Factorio tiene un equivalente incorporado git blame



: muestra el último jugador en cambiar cualquier entidad. Por lo tanto, si alguien se puso una muleta y no informó al equipo sobre el problema, cuando esta muleta finalmente se rompa, todos sabrán quién tiene la culpa. Si quieres ganar, tienes que trabajar en estrecha colaboración con tus compañeros.



Depuración



La depuración es una de las principales habilidades de un programador. Este es quizás el paralelo más obvio entre Factorio y el desarrollo de software real. Algo puede romperse muy lejos de la fuente real del problema. La capacidad de resolver rápidamente un problema real es una habilidad fundamental, y el proceso de pensamiento es casi idéntico al de rastrear la causa de una falla real del programa. Si el recolector deja de funcionar, primero debe verificar los flujos salientes. Luego verifique qué ingrediente falta en la entrada. Luego, rastree el ingrediente a través de la fábrica para averiguar dónde se produce. Y repita el proceso una y otra vez, hasta que sienta náuseas.



La depuración en Factorio se complica rápidamente. Tan pronto como construyas una refinería de petróleo, te involucrarás en el craqueo, donde hay tres tuberías diferentes a la salida (fueloil, combustible diesel y gas de petróleo asociado), y si alguna de ellas por alguna razón se estancó, entonces toda la refinería. deja de funcionar.



Ha habido momentos en que la planta entera se detuvo porque empezaste a investigar algo que no requería ciencia amarilla. Como resultado, dejó de usar marcos de drones, que ya no se suministraban con motores eléctricos, donde se usaba lubricante, para cuya producción se tomaba fuel oil. Como resultado, la tubería de salida de la refinería se detuvo, lo que provocó que se quedara sin gas de petróleo asociado (petrolio), lo que detuvo la producción de plástico. Como resultado, se detuvo la producción del cable rojo de señal y toda la fábrica quedó fuera de servicio. Los jugadores experimentados anticipan tales escenarios e implementan el craqueo del aceite autoequilibrado para garantizar que el sistema esté siempre equilibrado. Tal planta se detendrá solo si la tubería de salida con el gas asociado está bloqueada.Si un buen programador recibe una refinería averiada, por lo general puede rastrear el problema hasta la fuente, comprender lo que sucedió e intentar encontrar una solución rápidamente. Por otro lado, si una persona deja caer un par de tanques nuevos en el suelo sin una buena razón (está absolutamente seguro de que el lubricante siempre será necesario), entonces esta es una gran bandera roja sobre los métodos para resolver problemas sus programas.



Situaciones como esta permiten a Factorio imitar con precisión las complejas interdependencias con las que suelen lidiar los programadores. La dificultad aumenta a medida que se agregan nuevos conceptos al juego. Esto es muy similar al aumento de la complejidad de las capas adicionales de abstracción en la depuración de un bloqueo que podría haber ocurrido en las profundidades de uno de los marcos que está utilizando.



Revisión de código



A menudo, el diseño original debe modificarse para mejorar el rendimiento o el rendimiento. Los buenos programadores no solo aceptarán críticas a sus diseños, sino que también las tendrán en cuenta en trabajos futuros. Si no están de acuerdo con el cambio, brindarán una explicación específica para que el equipo pueda reflexionar con mayor precisión sobre los pros y los contras del cambio propuesto.



Resistirse a los comentarios sin una buena razón es una señal de alerta bien conocida. Además, el programador que se muestra reacio a aceptar los cambios propuestos y se niega a ajustar los proyectos futuros en consecuencia, debe ser cauteloso. Como resultado, tendrá que recordarle constantemente la necesidad de adherirse a alguna forma estándar de resolver el problema. Al mismo tiempo, la persona no explica por qué no le gusta el método propuesto. Esto es potencialmente una bomba de tiempo para una organización porque, sin supervisión, puede acumular rápidamente deudas técnicas para sus colegas. Este tipo de problemas son casi imposibles de comprender en una entrevista tradicional, solo durante una pasantía.



Estilo de codificación y marcos



No seguir los consejos es solo parte de un problema mucho mayor cuando el programador no puede integrarse correctamente en la estructura existente. Hay muchas formas de construir una fábrica en Factorio y cada una requiere métodos de construcción estándar. El incumplimiento de los estándares paralizará rápidamente toda la fábrica, a menudo de formas sutiles que no son obvias para el desarrollador desprevenido.



El diseño de la cinta transportadora principal incluye 4-8 transportadores, divididos en dos secciones (para transportadores subterráneos). Se coloca en el centro de la fábrica y toda la producción se realiza perpendicular a la cinta. Este diseño se basa en varias reglas, cuya violación puede provocar un caos total. Primero, siempre debe usar un separador a la salida del transportador. Nunca debe redirigir una cinta completa: el espacio vacío para otra cinta significa que pierde una línea completa de recursos, incluso después de una actualización. En segundo lugar, todas las fábricas deben escalar perpendicularmente al transportador principal. No escalar rápidamente resultará en una gran pérdida de espacio o en la imposibilidad de escalar la línea de producción porque está rodeada de otras líneas de producción.





Red logística



Existen diferentes formas de construir redes logísticas. El más fácil es con cofres de suministros pasivos. Pero hay otro método: los cofres de almacenamiento de filtros, que resuelven el problema de la basura. Ambos métodos requieren la colocación correcta de las restricciones en los lugares correctos. Los cofres de suministros pasivos generalmente están limitados por el espacio del cofre. Debe colocar un manipulador en los cofres de almacenamiento para conectar el cofre a la red logística. Y proporcione al menos N elementos antes de instalar el manipulador. Si olvida estos pasos, se desperdiciarán enormes recursos. Si un programador se olvida constantemente de los limitadores de salida, es una señal de alerta que una persona no se preocupa por el rendimiento en aplicaciones reales.



En otros casos, el equipo puede utilizar planos prediseñados, como el diseño de un reactor nuclear o una fábrica de drones robóticos (fábrica de bots). Pueden ser extremadamente difíciles, pero si te esfuerzas y lo resuelves, te ahorrarán mucho tiempo. Tenga cuidado con los candidatos que no quieren personalizar un nuevo elemento en la fábrica simplemente porque no pueden rastrear una lógica de control compleja. O quién deja de intentar averiguar el algoritmo para el funcionamiento de una planta de este tipo, a pesar de las obvias ventajas de los drones sobre los transportadores. Diseño de planta de drones subóptimo, fuente









Multihilo



Los trenes en Factorio son un análogo directo del multihilo: un tren es un hilo de ejecución, y cada intersección o parada de tren es un lugar en la memoria donde dos hilos pueden escribir potencialmente al mismo tiempo. Los semáforos son bloqueos (o mutex). Todos los errores en la red ferroviaria se manifiestan de la misma manera que la condición de carrera en el software, porque son literalmente la condición física de carrera. Todas las compensaciones se aplican aquí también: bloquear demasiado tiempo reduce el rendimiento. El diseño inadecuado de los semáforos suele provocar interbloqueos, al igual que en el software, porque el resultado final es una dependencia cíclica de enclavamiento. El punto muerto más común es cuando un tren es demasiado largo e inesperadamente bloquea una segunda intersección mientras espera ingresar a la primera.Esta segunda intersección evita que otro tren salga, evitando que la primera intersección se desbloquee.



El número de vías en la red ferroviaria corresponde al número de núcleos de CPU. Es difícil escalar una sola pista a más de unos pocos carriles porque la capacidad de todo el sistema se limita muy rápidamente, incluso en las áreas de espera. El diseño más común es un diseño de dos carriles, con un carril a cada lado. Aquí es donde surgirán problemas de capacidad cuando sea necesario descargar trenes constantemente. Por lo tanto, las grandes redes ferroviarias tienen un mínimo de cuatro carriles, y los dos exteriores actúan como vías de circunvalación para evitar cruces siempre que sea posible.



Los problemas de semáforo en estos sistemas pueden manifestarse en una cantidad de tiempo fantástica. Un solo semáforo perdido en la misma red ferroviaria causó una vez un punto muerto después de funcionar correctamente durante dos semanas . Del mismo modo, en los programas, la condición de carrera solo puede aparecer una vez al mes, cuando surge una alta concurrencia de subprocesos bajo una gran carga.



Escalada



Al igual que con el software, la escala de producción de Factorio presenta nuevos desafíos al diseño del plano original y, a menudo, requiere una revisión completa para maximizar la productividad, con la instalación de módulos de productividad y módulos de velocidad con balizas. Los transportadores se convierten en un cuello de botella de rendimiento incluso a la velocidad máxima de la banda, lo que obliga a dividir las estructuras para poder insertar más bandas más adelante o para dividir las fábricas en módulos.



La gestión de la red logística en sí misma se convierte en un desafío logístico al final del juego debido a la cantidad de problemas que causan las redes expansivas de drones. Por lo general, debe comenzar a segmentar la cadena de suministro y utilizar trenes para transportar mercancías entre segmentos, o crear arcones de suministro y solicitud que transfieran mercancías a través de las fronteras.



Al final del juego, la administración de trenes requiere un cambio de la arquitectura push a la arquitectura pull porque la arquitectura push no puede manejar un gran ancho de banda. Esto conduce inevitablemente al uso de la función Train Limit y a aprender a usar redes lógicas para codificar la lógica básica de modo que la estación solicite un tren solo cuando esté realmente lista para llenarlo por completo con recursos, en lugar de las tácticas habituales del juego en el comienzo del juego, cuando un grupo de trenes simplemente reciben la orden de ir a por el hierro. El nuevo esquema minimiza la cantidad de trenes al tiempo que garantiza que todas las estaciones de la red estén atendidas.



A menudo sucede que las restricciones en las líneas de entrada a la máquina de ensamblaje y los límites de velocidad del manipulador requieren el rediseño de las fábricas cercanas, al igual que la computación de alta velocidad requiere el conocimiento de los cuellos de botella en la CPU. Estos cuellos de botella casi nunca son un problema hasta que alcanza una cierta escala, pero después de eso comienzan a limitar el rendimiento.



Microservicios y módulos



Eventualmente, las fábricas se vuelven tan grandes que tienen que abandonar un diseño simple con una cinta transportadora principal o un diseño de espagueti y pasar a una estructura más escalable. Para alcanzar el mega nivel, las fábricas suelen utilizar un sistema de tren o un sistema modular que corresponde aproximadamente a microservicios o arquitectura de complementos.



La megabase basada en trenes a veces se conoce como un diseño de "cuadra de la ciudad", donde los trenes alrededor de los bloques de la planta controlan todas las entradas y salidas. De esta forma, cada bloque individual queda aislado de todos los demás, ya que todas las entradas son "limpias" en el sentido de que proceden de la red ferroviaria. Esto es casi idéntico a la arquitectura de microservicios (a través de HTTP) o comunicación entre procesos (IPC), con problemas potenciales similares debido a retrasos de E / S, ya que los resultados no se pueden recibir todo el tiempo, deben enviarse en "paquetes". o trenes sobre la red ferroviaria.



La arquitectura modular intenta mantener cierta apariencia del transportador principal, pero en cambio separa las correas en la fábrica y utiliza bloques modulares que aceptan entradas y salidas estándar. A veces, esto se puede lograr completamente con drones, pero generalmente los materiales deben transportarse a largas distancias mediante una cinta transportadora. Esto es muy similar al sistema de módulos para una aplicación monolítica, con las mismas ventajas y desventajas.



Estas megabases representan el nivel superior del servidor Factorio predeterminado. Por supuesto, hay muchas modificaciones que hacen que el juego sea mucho más difícil.



Sistemas distribuidos



Space Exploration  es una versión completamente reelaborada de Factorio para la colonización espacial. Aquí los planetas tienen recursos limitados, lo que requiere que los jugadores colonicen otros mundos y usen cohetes para transferir recursos entre planetas. Debido al gran retraso en la entrega de materiales entre planetas, la coordinación de estas bases conduce a problemas similares a los de un sistema de base de datos distribuido globalmente. Incluso en la red lógica hay que luchar con la latencia, porque el sistema automático pierde de vista los elementos que se lanzan pero que aún no han llegado al planeta objetivo. Si esto no se tiene en cuenta, existen consultas duplicadas para todos los elementos requeridos. Los sistemas distribuidos enfrentan exactamente el mismo problema cuando intentan garantizar la coherencia entre los nodos.



Producción



En general, la industria del software no tiene idea de cómo encontrar y contratar a los mejores desarrolladores. Probablemente jugar a Factorio juntos fue la mejor entrevista técnica que hemos hecho. Y esto nos confunde mucho . Esta entrevista es tremendamente impráctica, ya que toma más de 20 horas en el modo multijugador la primera vez, u 8 horas para un equipo de jugadores experimentados. ¿Qué se puede aprender de esto? No lo sé. Ciertamente, no podemos cambiar a Factorio como método de entrevista, es mejor darle tarea al candidato.



Pero eso es mejor que una entrevista en la pizarra.



All Articles