Ultimamente, muitas cópias foram quebradas em torno de entrevistas técnicas. Obviamente, inverter uma árvore binária em uma placa tem pouco a ver com as habilidades práticas de um programador real. O Fizzbuzz primitivo
ainda é o teste mais eficaz. Como resultado, a atenção aos projetos de código aberto aumentou, mas descobriu-se que esse
também não é um indicador muito bom , porque a maioria dos profissionais não tem tempo para eles.
Temos a entrevista de codificação mais eficaz em nossa empresa hoje - geralmente é algum tipo de lição de casa por alguns dias em que o candidato é solicitado a corrigir um bug ou implementar um pequeno recurso. Isso não é bom porque leva muito tempo e a pessoa pode obter ajuda externa (ou google se o recurso for comum o suficiente). Por outro lado, algumas grandes empresas dobraram o número de entrevistas no quadro branco (e algoritmos), submetendo os futuros engenheiros a horas de sessões de programação online com níveis variados de vigilância invasiva.
Todas essas técnicas de entrevista não correspondem a uma métrica muito simples: jogar Factorio juntos... Percorrer todo o ciclo do Factorio é um indicador quase perfeito de como uma pessoa está resolvendo problemas técnicos comuns. Você pode até personalizar a jogada com base na posição futura para entender melhor como o candidato desempenhará sua função.
Factorio?
Factorio é um jogo de automação. Este trailer provavelmente será a melhor introdução , mas essencialmente seu trabalho é construir uma planta automatizada capaz de lançar um foguete ao espaço.
Começando do zero. Você extrai minério de ferro e pedra manualmente, constrói uma fundição para fundir o minério em placas de ferro, a partir da qual você pode criar uma perfuratriz automática para combustível sólido. Você pode coletar independentemente o minério de ferro da broca e colocá-lo na fundição, mas é mais eficiente usar um transportador automático. Em seguida, você pode usar o ferro resultante para fazer outra broca que automatiza a mineração de carvão. Em seguida, um transportador é construído para coletar o carvão e um transportador para transferi-lo para a perfuratriz. Essa minúscula fábrica produz placas de ferro que podem ser usadas para fazer uma terceira broca - e começar a extrair minério de cobre, que permite fabricar placas de cobre, e a partir delas pode-se fazer fio de cobre, necessário para uma bomba submersível. Combinado com uma caldeira a vapor e máquina a vapor, isso nos dá nossa primeira eletricidade.Pode ser usado para um centro de pesquisa e invenção de novas tecnologias, como uma máquina de montagem. Depois de desbloquear as máquinas de montagem, você pode usar o fio feito à mão para criar uma máquina de montagem que fabricará automaticamente esses fios.
No final, você desbloqueará trens, robôs e sistemas de logística que o ajudarão a lidar com a crescente complexidade logística do jogo. Bem, no final você será capaz de lançar um foguete ao espaço.
Escolha de direção
O jogo começa sem objetivo e quase sem direção. O programador líder deve ser capaz de aprender a interface do usuário e definir uma meta e, em seguida, desenvolver um plano para alcançá-la. Espera-se que o júnior conclua corretamente as tarefas definidas pelo desenvolvedor líder. O trainee deve trabalhar com um mentor, mas o júnior deve ser capaz de corrigir problemas subjacentes com seu código por conta própria antes de pedir ajuda ao sênior. Middle deve ser capaz de trabalhar de forma independente assim que receber uma tarefa, mas não se espera que ele faça o projeto arquitetônico.
As expectativas específicas podem ser formuladas da seguinte forma:
- O trainee geralmente precisa ser capaz de colocar um projeto e conectá-lo a outra coisa, como um depósito de minério.
- , . , .
- , ( ) .
- , , .
O aspecto mais importante do desenvolvimento de software é o trabalho em equipe. Isso significa coordenar com outras pessoas, atender às necessidades dos projetos de outras pessoas e colaborar com a equipe, em vez de trabalhar por conta própria quando você se recusa a alterar seu design para ajudar na integração com o trabalho de outra pessoa. Naturalmente, essas situações surgem o tempo todo na Factorio, porque os projetos padrão são limitados ao espaço físico. Como resultado, você precisa estudar cuidadosamente as ações de outras pessoas e, às vezes, ajustar seu projeto para caber dentro dos limites de tamanho ou adaptar-se ao desenho de outras pessoas que ocupou mais espaço do que o esperado.
Se o jogador se retrai para dentro de si mesmo, começa a fazer tudo sozinho ou silenciosamente resolve problemas, isso irá rapidamente provocar a ira da equipe pelos mesmos motivos que os colegas estão zangados com os programadores cowboy. Felizmente, Factorio tem um equivalente embutido
git blame
: ele mostra o último jogador a mudar qualquer entidade. Assim, se alguém colocou uma muleta e não informou a equipe sobre o problema, então, quando essa muleta finalmente quebrar, todos saberão de quem é a culpa. Se você quer vencer, você tem que trabalhar junto com seus companheiros de equipe.
Depurando
A depuração é uma das principais habilidades de um programador. Este é talvez o paralelo mais óbvio entre o Factorio e o desenvolvimento de software real. Algo pode estar muito longe da origem real do problema. A capacidade de descobrir rapidamente um problema real é uma habilidade crítica, e o processo de raciocínio é quase idêntico a rastrear a causa de uma falha real do programa. Se o selecionador parar de funcionar, você deve primeiro verificar os fluxos de saída. Em seguida, verifique qual ingrediente está faltando na entrada. Em seguida, rastreie o ingrediente pela fábrica para descobrir onde ele é produzido. E repita o processo uma e outra vez, até enjôo.
A depuração no Factorio fica complicada rapidamente. Assim que você constrói uma refinaria de petróleo, você se engaja no craqueamento, onde há três tubos diferentes na saída (óleo combustível, óleo diesel e gás de petróleo associado), e se algum deles por algum motivo estagnou, então toda a refinaria pára de funcionar.
Houve momentos em que a planta inteira parou porque você começou a pesquisar algo que não exigia a ciência amarela. Com isso, você deixou de usar quadros de drones, que não eram mais abastecidos com motores elétricos, onde era usado lubrificante, para a produção do qual era retirado óleo combustível. Como resultado, o tubo de saída da refinaria parou, o que fez com que ficasse sem gás de petróleo associado (petrolium), o que interrompeu a produção de plástico. Como resultado, a produção do fio vermelho de sinal foi interrompida - e toda a fábrica estava fora de serviço. Jogadores experientes antecipam esses cenários e implementam o craqueamento de óleo com auto-equilíbrio para garantir que o sistema esteja sempre equilibrado. Tal planta irá parar apenas se o tubo de saída com o gás associado estiver bloqueado.Se um bom programador recebe uma refinaria quebrada, ele geralmente pode rastrear o problema até a origem, entender o que aconteceu e tentar encontrar uma solução rapidamente. Por outro lado, se uma pessoa simplesmente coloca alguns tanques novos no solo sem um bom motivo (ela tem certeza absoluta de que o lubrificante sempre será necessário), então este é um grande sinalizador vermelho nos métodos de resolução de problemas em seus programas.
Situações como essa permitem que o Factorio imite com precisão as interdependências complexas com as quais os programadores normalmente lidam. A dificuldade aumenta à medida que novos conceitos são adicionados à jogabilidade. Isso é muito semelhante ao aumento na complexidade de camadas adicionais de abstração na depuração de um travamento que poderia ter ocorrido nas profundezas de uma das estruturas que você está usando.
Revisão de código
Freqüentemente, o design original precisa ser ajustado para melhorar o desempenho ou o rendimento. Bons programadores não só aceitarão críticas a seus projetos, mas também as levarão em consideração em trabalhos futuros. Se eles discordarem da mudança, eles fornecerão uma explicação específica para que a equipe possa refletir com mais precisão sobre os prós e os contras da mudança proposta.
Resistir ao feedback sem um bom motivo é uma bandeira vermelha bem conhecida. Além disso, o programador que está relutante em aceitar as alterações propostas e se recusa a ajustar projetos futuros de acordo, causa cautela. Como resultado, ele terá que ser constantemente lembrado da necessidade de aderir a alguma forma padrão de resolver o problema. Ao mesmo tempo, a pessoa não explica por que não gosta do método proposto. Isso é potencialmente uma bomba-relógio para uma organização porque, sem supervisão, ele pode rapidamente acumular dívidas técnicas com seus colegas. Esse tipo de problema é quase impossível de entender em uma entrevista tradicional, apenas durante um estágio.
Estilo de codificação e estruturas
Deixar de seguir o conselho é apenas parte de um problema muito maior quando o programador é incapaz de se integrar adequadamente à estrutura existente. Existem muitas maneiras de construir uma fábrica em Factorio, e cada uma requer métodos de construção padrão. O não cumprimento dos padrões paralisa rapidamente a fábrica inteira, muitas vezes de maneiras sutis que não são óbvias para o desenvolvedor incauto.
O projeto do transportador de correia principal inclui de 4 a 8 transportadores, divididos em duas seções (para transportadores subterrâneos). Ele é colocado no centro da fábrica e toda a produção ocorre perpendicularmente à correia. Este projeto se baseia em várias regras, cuja violação pode levar ao caos completo. Primeiro, você deve sempre usar um separador na saída da esteira. Você nunca deve redirecionar uma fita inteira: espaço vazio para outra fita significa que você perderá um pipeline inteiro de recursos, mesmo após uma atualização. Em segundo lugar, todas as fábricas devem escalar perpendicularmente ao transportador principal. A falta de escala rapidamente resultará em um grande desperdício de espaço ou na incapacidade de dimensionar a linha de produção porque ela está cercada por outras linhas de produção.
Rede logística
Existem diferentes formas de construir redes logísticas. O mais fácil é com baús de suprimentos passivos. Mas há outro método - baús de armazenamento de filtro, que resolve o problema do lixo. Ambos os métodos requerem a colocação correta das restrições nos lugares certos. Os baús de suprimentos passivos geralmente são limitados pelo espaço do peito. Você precisa colocar um manipulador nas arcas de armazenamento para conectar a arca à rede de logística. E forneça pelo menos N itens antes de instalar o manipulador. Se você esquecer essas etapas, enormes recursos serão desperdiçados. Se um programador se esquece constantemente dos limitadores de saída, é um sinal de que uma pessoa é descuidada com o desempenho em aplicativos reais.
Em outros casos, a equipe pode usar projetos pré-concebidos, como um projeto de reator nuclear ou uma fábrica de drones robóticos (fábrica de robôs). Eles podem ser extremamente difíceis, mas se você fizer um esforço e descobrir, eles economizam muito tempo. Cuidado com os candidatos que não desejam personalizar um novo elemento na fábrica simplesmente porque não podem rastrear lógicas de controle complexas. Ou quem desiste de tentar descobrir o algoritmo para o funcionamento de tal planta, apesar das vantagens óbvias dos drones em relação aos transportadores. Projeto de planta de drones abaixo do ideal, fonte
Multithreading
Os trens em Factorio são um análogo direto do multithreading: um trem é um thread de execução, e cada interseção ou parada do trem é um lugar na memória onde dois threads podem escrever potencialmente ao mesmo tempo. Os semáforos são bloqueios (ou mutexes). Todos os bugs da malha ferroviária se manifestam da mesma forma que a condição da corrida no software, pois são literalmente a condição física da corrida. Todas as compensações se aplicam aqui também - bloquear por muito tempo diminui a taxa de transferência. O projeto impróprio de semáforos geralmente causa deadlocks, assim como no software, porque o resultado final é uma dependência de intertravamento cíclico. O impasse mais comum é quando um trem é muito longo e bloqueia inesperadamente um segundo cruzamento enquanto espera para entrar no primeiro.Esta segunda interseção impede a saída de outro trem, evitando que a primeira interseção seja desbloqueada.
O número de trilhos na rede ferroviária corresponde ao número de núcleos da CPU. É difícil dimensionar um único trilho para mais do que algumas faixas porque a capacidade de todo o sistema é rapidamente limitada, mesmo com áreas de espera. O projeto mais comum é um projeto de duas faixas, com uma faixa de cada lado. É aqui que surgirão problemas de capacidade, quando for necessário descarregar trens constantemente. Portanto, as grandes redes ferroviárias têm um mínimo de quatro faixas, com as duas mais externas atuando como vias de desvio para evitar cruzamentos sempre que possível.
Problemas de semáforo nesses sistemas podem se manifestar em uma quantidade fantástica de tempo. Um único semáforo perdido na mesma rede ferroviária causou um impasse depois de funcionar corretamente por duas semanas . Da mesma forma, em programas, a condição de corrida só pode aparecer uma vez por mês, quando a alta simultaneidade de threads surge sob carga pesada.
Dimensionamento
Tal como acontece com o software, o dimensionamento da produção da Factorio apresenta novos desafios ao projeto do blueprint original e muitas vezes requer uma revisão completa para maximizar a produtividade, com a instalação de módulos de produtividade e módulos de velocidade com beacons. Os transportadores tornam-se um gargalo de desempenho mesmo na velocidade máxima da correia, forçando maneiras de dividir as estruturas para que mais correias possam ser inseridas posteriormente ou para dividir as fábricas em módulos.
Gerenciar a própria rede logística torna-se um desafio logístico no final do jogo devido ao número de problemas que as redes de drones expansivas causam. Normalmente, você precisa começar a segmentar a cadeia de suprimentos e usar trens para transportar mercadorias entre os segmentos ou criar caixas de pedidos e suprimentos que irão transferir mercadorias através das fronteiras.
No final do jogo, o gerenciamento do trem requer uma mudança da arquitetura push para a arquitetura pull, porque a arquitetura push não pode lidar com alta largura de banda. Isso inevitavelmente leva ao uso da função Train Limit e ao aprendizado de como usar redes lógicas para codificar a lógica básica para que a estação solicite um trem somente quando estiver realmente pronta para preenchê-lo completamente com recursos, em vez das táticas de jogo usuais em o início do jogo, quando um monte de trens recebe simplesmente o comando para ir. para o ferro. O novo esquema minimiza o número de trens e, ao mesmo tempo, garante que todas as estações da rede sejam atendidas.
Muitas vezes acontece que as restrições nas linhas de entrada para a máquina de montagem e os limites de velocidade do manipulador exigem um redesenho das fábricas ao redor, assim como a computação de alta velocidade requer o conhecimento dos gargalos na CPU. Esses gargalos quase nunca são um problema até que você alcance uma certa escala, mas depois disso eles começam a limitar o desempenho.
Microsserviços e módulos
Eventualmente, as fábricas tornam-se tão grandes que precisam abandonar um projeto simples com uma correia transportadora principal ou projeto espaguete e mudar para uma estrutura mais escalável. Para atingir o mega nível, as fábricas geralmente usam um sistema de trem ou um sistema modular que corresponde aproximadamente a microsserviços ou arquitetura de plug-in.
A megabase baseada em trens é às vezes referida como um projeto de "quarteirão", em que os trens ao redor dos blocos da fábrica controlam todas as entradas e saídas. Desta forma, cada bloco individual é isolado de todos os outros, uma vez que todas as entradas são "limpas" no sentido de que vêm da rede ferroviária. Isso é quase idêntico à arquitetura de microsserviços (sobre HTTP) ou comunicação entre processos (IPC), com potenciais problemas semelhantes devido a atrasos de I / O, uma vez que os resultados não podem ser recebidos o tempo todo, eles devem ser enviados em "pacotes" ou trens sobre a rede ferroviária.
A arquitetura modular tenta manter alguma semelhança com o transportador principal, mas, em vez disso, separa as correias na fábrica e usa blocos modulares que aceitam entradas e saídas padrão. Às vezes, isso pode ser feito inteiramente com drones, mas geralmente os materiais precisam ser transportados por longas distâncias por correia transportadora. Isso é muito semelhante ao sistema de módulo para um aplicativo monolítico, com as mesmas vantagens e desvantagens.
Esses megabases representam a camada superior do servidor Factorio padrão. Claro, existem muitos mods que tornam o jogo muito mais difícil.
Sistemas distribuídos
Exploração do espaço é uma versão completamente reformulada do Factorio para a colonização do espaço. Aqui, os planetas têm recursos limitados, exigindo que os jogadores colonizem outros mundos e usem foguetes para transferir recursos entre os planetas. Devido ao grande atraso na entrega de materiais entre os planetas, a coordenação dessas bases leva a problemas semelhantes a um sistema de banco de dados distribuído globalmente. Mesmo na rede lógica, você tem que lutar com a latência, porque o sistema automático perde de vista os elementos que são lançados, mas ainda não alcançaram o planeta de destino. Se isso não for levado em consideração, haverá consultas duplicadas para todos os elementos necessários. Os sistemas distribuídos enfrentam exatamente o mesmo problema ao tentar garantir a consistência entre os nós.
Resultado
Em geral, a indústria de software não tem ideia de como encontrar e contratar os melhores desenvolvedores. Provavelmente tocar Factorio juntos foi a melhor entrevista técnica que já fizemos. E isso nos confunde muito . Esta entrevista é totalmente impraticável, levando mais de 20 horas no modo multiplayer pela primeira vez, ou 8 horas para uma equipe de jogadores experientes. O que pode ser aprendido com isso? Não sei. Certamente não podemos mudar para o Factorio como método de entrevista - é melhor dar lição de casa ao candidato.
Mas isso é melhor do que uma entrevista no quadro branco.