Uma ampla visão geral das entrevistas em Python. Dicas e truques

Olá pessoal!


Brevemente sobre você. Sou matemático por educação, mas programador por profissão. No campo do desenvolvimento desde 2006. Embora, desde que começaram a estudar programação na escola, comecei a escrever meus primeiros programas e jogos na escola (aproximadamente, desde 2003). Aconteceu que eu tive que aprender e trabalhar em várias línguas. Se você não levar em consideração as palestras universitárias sobre C, C ++, BASIC, Pascal e Fortran, eu realmente trabalhei com Delphi (mais de 6 anos), PHP (mais de 5 anos), Incorporado (Atmel + PIC por cerca de 2,5 anos) e da última vez Python + um pouco de Scala. Claro, você também não pode ficar sem bancos de dados.


Para quem é este artigo? Para todos que, como eu, queriam (ou desejam) encontrar um emprego decente e bem remunerado, com um projeto interessante, uma equipe legal e todo tipo de guloseimas. E também para aqueles que querem aumentar seu nível de conhecimento e habilidade.


Como surgiu este artigo? Após 3 semanas de entrevistas, pesquisas, estudos, noites sem dormir (muitas vezes passava por possíveis reviravoltas na cabeça, opções de resposta etc.), recebi muitas ofertas. Os dois primeiros tiveram que ser rejeitados, porque o prazo para tomar uma decisão terminou e eu estava aguardando ofertas de outros escritórios. Como resultado, tirei um dia específico para decidir e esperei pelos resultados das entrevistas atuais e passadas. Honestamente, minha escolha foi bastante complicada, porque as opções entre as quais eu escolhi eram geralmente muito atraentes. Em geral, decidi priorizar a direção do desenvolvimento, e não as condições e o projeto. Mesmo depois que a decisão (e a proposta) foi tomada, outros continuaram a chegar (mas para mim isso já não era importante).


Antes de cada entrevista, eu cuidadosamente preparei + contei esses lugares, as respostas para perguntas das quais eu não sabia ou não me lembrava, ou não descobri até o fim.


Apreciei perguntas que poderiam realmente mostrar minha compreensão (ou mal-entendido) de alguns conceitos fundamentais. Infelizmente, essas perguntas podem ser contadas nos dedos das duas mãos.


No final, decidi que valia a pena coletar toda essa experiência e compartilhá-la com outras pessoas.


Obviamente, essas perguntas não esgotam o conhecimento que todo desenvolvedor experiente deve ter. Parece-me que algumas coisas na prática raramente são usadas para perguntar constantemente sobre elas. Além disso, provavelmente não me engano se disser que mais de 90% das perguntas são pesquisadas de maneira elementar por 10 a 30 segundos.


Combinei algumas perguntas em uma - para economizar tempo e espaço.
Também no final do artigo, darei links que me pareceram mais interessantes.


Conteúdo


Teoria geral
  • A primeira pergunta na maioria das entrevistas é: "O que é o SOLID?" Sinceramente, nunca consegui me lembrar da descriptografia completa dessa abreviação, então expliquei com minhas próprias palavras ou pedi ao meu interlocutor que sugerisse pelo menos nomes em inglês e depois decifrei. No começo, pareceu-me que o interlocutor me entenderia e aceitaria uma variante de respostas, mas, por alguma razão, em dois casos, os caras decidiram que eu não sabia a resposta para essa pergunta (é melhor não comentar mais sobre isso (um pouco de rublo)). Pessoalmente, uma vez confundi Injeção de Dependência com Inversão de Dependência.


  • A segunda pergunta típica: "O que é REST?" e depois depois de "O que é Restfull?" ou "Quais são as condições básicas".
    Você pode encontrar sua resposta. Pessoalmente, eu prefiro essa opção .


  • O que é HTTP? Que métodos ele tem?


  • Quais métodos HTTP são idempotentes e quais não são?


  • Gostei de uma pergunta sobre HTTP que nunca havia encontrado na prática e, portanto, não sabia. Suponha que você tenha uma lista bastante grande de páginas de URL (como áudio ou vídeo) que precisam ser baixadas para o disco. Mas para cada um deles, você precisa verificar se há espaço suficiente no computador para esses arquivos. Como usar o HTTP (quais métodos)?
    A resposta correta é o método HEAD (leia sobre isso). Pessoalmente, dei uma resposta que o interlocutor nem ouviu falar (ou esqueceu) e uma rápida pesquisa mostrou que eu também estava certo (como opção). Eu indiquei que usaria o método GET, mas para não baixar o arquivo inteiro, indicaria o parâmetro Range com uma etapa mínima. Embora isso funcione apenas se o servidor enviar um parâmetro Accept-Ranges diferente de zero na resposta. Estou escrevendo isso para o fato de que essa pergunta mostra apenas se eu trabalhei com essa tarefa ou não. Uma segunda pesquisa dará uma resposta exaustiva.


  • Qual é a diferença entre autenticação e autorização? Honestamente, fiz imediatamente uma pergunta retórica: "por que você perdeu outra identificação?". Com isso, tentei deixar bem claro ao interlocutor que estava ciente dessas questões.


  • Qual é a diferença entre HTTP e HTTPS?


  • O que é um token CSRF?


  • Quais formatos de dados você conhece além de JSON, XML?
    Existem muitos deles, então não vou me limitar a uma lista específica.


  • O que é SOAP?
    Pergunta maluca. Eu não gosto disso. Por que perguntar o que é usado uma vez no nunca, ou certamente não no meu projeto?


  • Quais padrões de design você conhece?
    Google para ajudá-lo;)


  • Em uma das entrevistas sobre desenvolvimento de baixo nível, muito foi perguntado sobre algoritmos.
    Em geral, é desejável entender pelo menos aproximadamente o que é O-big ao avaliar a complexidade dos algoritmos. Também é provavelmente desejável conhecer os algoritmos básicos: pesquisa simples, pesquisa binária, classificação, classificação rápida, trabalho com árvores (largura e profundidade). Um conhecido me aconselhou a ler o maravilhoso livro "Algoritmos de Grokay. Aditya Bhargava". Não achei que fosse possível explicar coisas bastante complicadas de maneira tão bonita e simples. É lido em uma respiração (honestamente)! Eu o recomendo para quem, como eu, não se considera um algoritmo. Apenas sem palavras!



Python
  • O que é o PEP8? Como você se sente sobre ele?


  • Quais padrões de programação você conhece e como eles podem ser implementados?


  • Quais são as opções para implementar o modelo Singleton em python?
    Também aconselho você a entender as desvantagens da implementação por meio do decorador (especialmente para testes). A maneira mais elegante e versátil, é claro, através de metaclasses.


  • Decoradores.
    Eu acho que será útil ler e entender:



  • Como o python implementa métodos públicos, privados e estáticos?


  • O que são metaclasses?
    Eu aconselho você a ler completamente isso ou aquilo .


  • Eles não perguntaram, mas eu aconselho a ler sobre as diferenças fundamentais entre a segunda e a terceira versões (pelo menos 2,7 e 3,4).


  • O que é novo ()? E como é diferente de init ()? Em que sequência eles são executados?


  • Quais programas você conhece para verificar o estilo do código? Quais são os prós e os contras deles?
    Pessoalmente, trabalhei com pylint, pychecker, mas nomeei três principais: pychecker, pylint, pyflakes, porque li sobre eles antes disso =) A propósito, aqui está a versão mais recente, que detalha as ferramentas para analisar o código Python .


  • Como você testa o código? O que está zombando?
    Pessoalmente, uso tox, unittest, nariz ou assisto o que Travis diz. Sobre o google simulado melhor.


  • Em relação aos testes, gostei das seguintes perguntas:


    • o que fazer se a função em teste usar uma conexão remota com serviços externos, que às vezes vê um erro de tempo limite, 404 e similares?
    • E se a função em teste demorar muito tempo para executar operações repetidas dentro dela? Por exemplo, dentro do ciclo é de 1..1000000, onde algo é lido, escrito e calculado.
      Eu aconselho você a ler sobre o patch.

  • O que você conhece estruturas de dados em python? Quais são mutáveis ​​/ imutáveis?
    Pessoalmente, agora sei que existem muitos deles. Além dos típicos (dict, lista, conjunto, tupla), não deixe de ler sobre frozen_set, default_dict, orders_dict (não é mais relevante para novas versões) e o que mais estará no escritório. Dock (sim, comece com ele).


  • Como funciona uma tabela de hash (dicionário)? O que são colisões e como lidar com elas?
    Eu acho que para posições altas faz sentido saber.


  • Onde a pesquisa será mais rápida, onde está a pesquisa e por que: ditar, listar, definir, tupla?


  • Como os valores dos argumentos são passados ​​para uma função ou método?


  • O que é um gerador? Qual é a diferença de um iterador?
    Existem artigos mais curtos, mas gostei deste . Há muitas coisas que não podem ser totalmente reveladas em respostas curtas ao fluxo de pilha.


  • O que é compreensão de lista / ditado?


  • Não consigo formular uma pergunta específica, por isso aconselho a ler sobre introspecção (usando dir (), dir , hasattr (), getattr ()), nome incorreto.


  • Qual é a diferença entre sublinhados simples (_) e duplos (__)?
    Uma resposta exaustiva está aqui .


  • O que é um GIL? Que problemas ele tem?


  • O que é MRO? Qual é a diferença entre MRO2 e MR3 (problema de diamante)?
    Inicie o google e você mesmo entenderá tudo.


  • O que é e qual é a diferença entre as classes de estilo antigo e novo?


  • O que você sabe sobre o Threading. Threading vs Multiprocessamento?
    Aconselho que você leia e experimente você mesmo - http://effbot.org/zone/thread-synchronization.htm . O artigo é um pouco antigo, mas oferece um bom entendimento.


  • Você já trabalhou com assíncio? Qual é a sua característica?
    Eu recomendo ler artigos sobre Python assíncrono e sentir você mesmo.


  • O que é coletor de lixo (gc)? Quais são seus prós e contras?
    Eu acho que tudo o que é necessário para uma resposta está descrito aqui .


  • Por que você precisa de aipo?


  • O que é assíncrono / aguardado, para que serve e como usá-los?


  • Existe uma função:


    def f(sum, l=[]): l.append(sum) print(l) 

    O que será exibido na tela:


     l = [1] f(10) // [10] f(10) // [10, 10] f(10, l) // [1, 10] f(10) // [10, 10, 10] print(l) // [1, 10] 


Django / balão
  • Como o serializador funciona no framework REST do Django?
  • O que é o Meta responsável no serializador?
  • Qual é a diferença de desempenho entre django e Flask (e por que)?
  • Qual é o objetivo dessas estruturas?
  • Como a autenticação funciona no django?
  • Como o django manipula (e gera) o token CSRF?

Frontend
  • O que são cookies? Por que eles são, como trabalhar com eles e onde são armazenados?
  • Um servidor pode alterar (adicionar, excluir) cookies?
  • O que é o JWT (JSON Web Token)?

SDLC
  • Agile \ scrum: tudo que você precisa saber
  • Qual é a diferença entre CI e CD? Para aqueles que estão no tanque: CI - integração contínua, CD - entrega contínua
  • Qual é a diferença entre Scrum e Kanban?
  • Que tipos de testes você conhece?
    Google de lado: testes de unidade, testes de integração, testes de aceitação etc.
  • Pergunta para os líderes da equipe (provavelmente): O que você fará se não houver testes no projeto e o cliente não quiser gastar tempo e dinheiro em seu desenvolvimento?
    Pessoalmente, apelo à lucratividade dos negócios do cliente.
  • O que é o Code Debt e como lidar com ele (viver, amar, lutar)?

Git, controle de versão, refatoração
  • Quais sistemas de controle de versão você conhece (usa)?
  • O que é o Git Flow?
    Aconselho que você apenas leia , pois isso é uma coisa documentada.
  • O que é git rebase?
  • O que é uma paleta Git Cherry?
  • Quais ferramentas você usa para revisão de código?
    Pessoalmente, sou fã do cliente web do github (ele é cheio de coisas interessantes e convenientes). Mas meu interlocutor decidiu que eu era uma bardana e me colocou menos. Pesquisei em casa no Google e vi que há um monte de software especializado muito parecido com o que usei por mais de três anos. Software como software - para um amador.
    P.S. Não gostei desse momento, pois tinha uma experiência de revisão de código longa o suficiente + precisava ler constantemente confirmações de 500 a 3000 alterações de comprimento (sim, em um dos meus principais projetos, tais confirmações eram normais) e as pessoas decidiram que, desde Eu não conheço outros utilitários - isso significa bardana.
  • O que é push forçado?
  • O que é verificação pré-confirmada?
  • O que é coesão e acoplamento de código?

Bases de dados

Para minha surpresa, as perguntas sobre esse tópico me pareciam muito simples (como na escola), exceto literalmente 2-3.


  • O que é uma transação? Que propriedades ela possui?
  • O que são níveis de isolamento de transação? Como eles são?
    Aconselho que você leia isso com atenção, pois essas são coisas fundamentais .
  • O que são transações aninhadas?
  • O que é um cursor e por que é necessário?
  • Qual é a diferença entre o PostgreSQL e o MySQL?
  • O que é o VACUUM no PostgreSQL?
  • O que é EXPLAIN? Qual é a diferença entre it e EXPLAIN ANALYZE?

Big data

Infelizmente, lembrei-me de algumas perguntas, porque minha experiência anterior em desenvolvimento de software e trabalho com bancos de dados era importante para o meu interlocutor (acho isso muito inteligente).


  • O que é o Hadoop? ... e o HDFS?
  • O que é o MapReduce e como ele funciona?
  • É possível criar muitos mapeadores e redutores (ou indicar seu número)?
  • Qual é a diferença entre Hive e HBase
  • É possível criar um índice no HBase?
  • O que é reparticionamento?
  • Qual é a diferença entre repartição e coalescência?
    Muito simples e acessível descrito aqui .
  • O que é a eleição de mestre no tratador?

As tarefas

Surpreendentemente, apenas em uma das dezenas de entrevistas me pediram para escrever código. Provavelmente porque todo mundo queria verificar o código após a parte teórica. E como as entrevistas duraram pelo menos uma hora (as mais longas - três horas!), E todas as perguntas nunca foram feitas, os caras simplesmente não tiveram tempo de verificar o código.
Além da prática, não vou aconselhar mais nada.


  1. Há um arquivo que contém palavras separadas por um espaço. Por exemplo: "abba com mãe fatura mãe com abba cachorro abba mãe com". É necessário encontrar e deduzir as três palavras que ocorrem mais frequentemente juntas (ordem não importa). Ou seja, no meu exemplo, as três palavras são "abba com mãe", "com conta mãe", "mãe conta mãe" etc. A resposta correta deve ser "abba com mother" (frequência - 3 vezes).
  2. Escreva uma função para percorrer a árvore em profundidade (em largura).
    Para que você não perca tempo - darei um link em que ambas as funções são muito bonitas e simples.
    Havia outra tarefa simples: escrever um gerador.

Perguntas e links meus

Para fins educacionais gerais, vale a pena ler os seguintes artigos:


  • "Perguntas da entrevista em Python." Eu li livros diferentes, mas por algum motivo eu adicionei apenas esses dois aos favoritos - 1 e 2 . Mas eu aconselho você a pesquisar mais no Google.
  • Likbez na digitação em linguagens de programação .
  • É uma pena que, ao discutir as bases de dados, não haja perguntas sobre o teorema da PAC. Saiba mais aqui .
  • Não sei por que o tópico microsserviços não foi abordado. Só posso supor que aqueles que me entrevistaram trabalharam pouco ou prestaram a devida atenção a eles. No entanto, se você estiver interessado, aqui está um bom artigo .
  • Também para minha surpresa, ninguém sequer fez perguntas sobre virtualização, janela de encaixe, contêineres, Kubernetes. Aconselho que você, pelo menos, lide com a janela de encaixe, pois agora existem muitas instruções passo a passo simples com explicações.
  • Links Python super úteis .
  • Zen Python nos exemplos .
  • Todo mundo que trabalha com Python, eu acho, deveria saber sobre inovações legais .
  • Poucos dos interlocutores sabiam dos dicionários em python que o próprio co-autor conta aqui .
  • Ninguém perguntou sobre o Lambda em python, mas é melhor entender o que é e com o que é comido.
  • Tipos e truques em python. O artigo é antigo, mas a maioria dos "truques" é relevante agora .
  • By the way, para os amantes de python - um resumo das últimas notícias e outros materiais .
  • Na parte da frente, recomendo que você faça uma breve palestra sobre o loop de eventos em JavaScript. Eu acho que você não sabe como realmente funciona. Eu recomendo .
  • Em relação ao lado do servidor, é aconselhável entender a diferença entre nginx e apache. A Internet está cheia de artigos. Se é realmente interessante, qual é a diferença sob o capô - aqui está um artigo com exemplos .

Conselho para todos que realmente desejam obter domínio - não tenha preguiça de repetir o código no console (seja python, DB ou outras coisas). NÃO copie, ou seja, repita. Obviamente, isso significa material novo, e não aquele que você escreve às cegas há muito tempo.


De fato, havia 3-4 vezes mais perguntas. Algo está esquecido. Mas eu trouxe os mais importantes.


Você provavelmente notou que praticamente não havia perguntas na frente. Isso é porque nós não tivemos tempo para chegar até eles, ou eram tão poucos que eu os esqueci.


A propósito, aqui está uma boa matriz de competências em várias áreas da TI. Se você tiver a oportunidade de realizar uma entrevista, aconselho que você pelo menos entenda o que precisa perguntar e em que nível, e não enfie todos na mesma barra (como costuma fazer agora) - muitas áreas diferentes se acumularam. Pessoalmente, não entendo por que exigir do front-end sênior um excelente entendimento do banco de dados, ou do profundo conhecimento do back-end sênior do mecanismo do navegador ou da interação do loop Event com o representante do navegador ou com o testador - a capacidade de encontrar o caminho mais curto de maneira equilibrada gráfico etc. Felizmente, olhando para essa matriz, você entende o que quero dizer.


Sinceramente, desejo sucesso a todos que decidirem consolidar por si mesmos e demonstrar aos outros seus conhecimentos para obter uma boa oferta interessante!


UPD:
Aqui você pode praticar entrevistas, se 4to - pramp.com. Obrigado a non_smile pelo link.

Source: https://habr.com/ru/post/pt439576/


All Articles