Como obtive várias ofertas de trabalho de engenheiro de software ao mudar de outra indústria

Weihe Wang Blocked Unblock Seguir Seguindo 8 de janeiro SD lindo

Mudar de emprego não é fácil, muito menos mudar para outro setor.

Hoje em dia, obter ofertas de emprego de empresas de software de topo exige um esforço considerável e muita sorte. Vindo da área de teste de software embarcado, tive a sorte de obter várias ofertas como engenheiro de desenvolvimento de software. Eu quero compartilhar a jornada com aqueles que também querem seguir uma carreira na indústria de software florescente.

Motivação

Minha motivação na semeadura é a falta de satisfação no trabalho em meu trabalho anterior como engenheiro de teste de software. A maior parte do meu trabalho envolve a criação de ambientes complexos para realizar testes em equipamentos de telecomunicações. Eu não diria que foi um trabalho fácil porque ter certeza de que a condição de teste foi cumprida demandou muito esforço. Mas para mim o que sempre faltava era a palavra mágica: Design.

Sem a oportunidade de participar do processo de design, sempre senti que estava testando uma caixa preta. Se alguma coisa der errado, não se tem idéia sobre a causa do problema nem sobre a possível solução. Como uma pessoa que está sempre curiosa sobre como as coisas funcionam, uma privação piorou com o passar dos anos.

Por outro lado, como engenheiro de software, você teria a oportunidade de projetar um produto de baixo para cima. Você seria capaz de criar recursos que melhorem drasticamente o desempenho de um serviço. Tendo tomado cursos de estruturas de dados e algoritmos na escola, ocorreu-me que eu poderia ter a chance de trabalhar como engenheiro de software também.

Preparação e Dedicação

O mercado de trabalho da indústria de software é altamente competitivo. Como profissional experiente, eu não estava competindo apenas com dezenas de milhares de novos alunos, mas também com engenheiros de software experientes que trabalham na indústria há anos. Achei que precisava trabalhar no seguinte para ter sucesso:

  • Um ótimo currículo com projetos de desenvolvimento de software em tecnologias populares
  • Estrutura sólida de dados e conhecimento de algoritmos
  • Sistemas distribuídos conhecimento de design e melhores práticas

Estrutura de Dados e Algoritmos

Comecei a trabalhar em estruturas de dados e algoritmos de cerca de um ano atrás. Eu escolhi o Python como minha principal linguagem de programação pelos seguintes motivos.

  • Python é uma das linguagens mais populares do mundo, então quase certamente seus entrevistadores também conhecem bem a língua.
  • A biblioteca padrão de coleções fornece suporte completo para várias estruturas de dados necessárias para resolver problemas de algoritmo, e elas são úteis para serem usadas.
  • Os programas em Python são significativamente mais curtos do que outros idiomas, como Java, portanto, são mais adequados para o espaço limitado em quadros brancos.

Como primeiro passo, examinei todos os algoritmos básicos e criei um conjunto de modelos para codificar rapidamente em um ambiente de entrevista. Outro benefício é que, para algoritmos complicados, como a classificação topológica , a pessoa tende a ignorar alguns pequenos passos ao escrever em um quadro branco. Por exemplo, você pode ter um modelo de algoritmo de pesquisa abrangente que pesquise a menor distância da origem ao destino por apenas cerca de 15 linhas em Python .

Com esses modelos e cerca de cem horas de práticas, consegui resolver cerca de 200 perguntas de nível médio no Leetcode .

Mas ainda tive algumas dificuldades em resolver problemas de nível difícil. Colocando-os juntos, os seguintes tipos de problemas são mais desafiadores para mim.

  • Programação dinâmica : às vezes os subproblemas são bem difíceis de se pensar.
  • Algoritmo da janela deslizante : como escolher e manter a invariância na janela.
  • Problemas de design: satisfazer toda a complexidade do tempo é complicado.
  • A construção da chave para alguns problemas exigiu a estrutura de dados da tabela de hash.

Depois de horas de prática, você ainda pode não encontrar uma solução para alguns problemas difíceis. No entanto, sugiro que você se concentre em questões de nível médio e, principalmente, domine os algoritmos gráficos , incluindo algoritmos para árvores binárias. Um tipo especial de árvore chamado Trie parece cada vez mais frequente em entrevistas de codificação. A principal razão é Trie é muito útil no ambiente de produção. Aqui está uma interessante criação de um liner de uma árvore Trie em Python: Trie = lambda: defaultdict(Trie)

Projeto de sistema

Eu não tinha ideia do que significa design de sistema e falhei algumas entrevistas no site por causa disso. Uma típica questão de design de sistema pede que você elabore o componente principal e o processo de design para um serviço da Web, como o feed de notícias do Facebook.

Então eu encontrei um livro chamado Designing Data-Intensive Applications . Este livro é fantástico.

Do armazenamento básico de valores-chave ao armazenamento de dados em bancos de dados; de representações de dados para propriedades ACID; De sistemas offline, como o Map-Reduce, a sistemas híbridos, como filas de mensagens, este é o livro que você precisa para entender como os sistemas distribuídos modernos são projetados e implementados.

No entanto, a engenharia de software é um negócio prático. Para aprender como funcionam os bancos de dados de gráficos, implementei um sistema de preenchimento automático usando o banco de dados Neo4j . Eu escolhi o MongoDB para armazenamento de documentos quando estava trabalhando em uma estrutura de processamento de logs, portanto me familiarizei com um dos bancos de dados noSQL mais populares.

O livro de Kleppmann, além de fazer projetos, é a chave para entrevistas de design de sistema.

Entrevista

Fracasso é a mãe do sucesso.

Eu falhei em entrevistas no local 4 vezes antes de receber minha primeira oferta.

Às vezes você resolveu todos os problemas brilhantemente, mas falhou na entrevista; enquanto às vezes você lutou em uma ou duas rodadas, mas teve sucesso no final. Há um fator incontrolável chamado sorte que pode ser crucial.

É frustrante ser rejeitado após uma entrevista no local, mas não perca a confiança e continue aplicando a outras empresas.

Algumas dicas para ter sucesso em entrevistas no local:

  • Pratique habilidades de escrita e comunicação no quadro branco.
  • Desbloqueie-se desenhando exemplos e peça dicas.
  • Invente uma solução viável e melhore-a.
  • Não se distraia se você não se sair bem em uma rodada de entrevistas no local, mantenha-o nas outras rodadas.

Bônus: Meu primeiro mês como engenheiro de desenvolvimento de software

Eu decidi me juntar a uma empresa de Internet por causa de seu ambiente de inicialização e impacto no produto.

O primeiro dia foi todo entusiasmo. Aprendi o que a equipe está fazendo e comecei a configurar o ambiente em um MacBook Pro brilhante.

A luta pela primeira semana estava usando controle de origem. Tendo usado o GitHub por mais de um ano, eu não sabia muito sobre como usar o git em linhas de comando. A chave para entender o protocolo git é considerar cada commit como um nó em um grafo de árvore. Então você pode entender conceitos como ramificações.

O Git é a principal ferramenta de desenvolvimento para aprender para desenvolvedores.

As dicas para sobreviver ao primeiro mês estão obtendo um bom ponto de "entrada" e um bom IDE para o idioma da sua base de código. Por bom ponto de entrada eu quero dizer o primeiro arquivo de origem que você começa a explorar uma vasta base de código. Ter um bom IDE torna suas pesquisas dos tipos de dados muito mais rápidas. Notavelmente, nem um único IDE funciona para todos os idiomas. Então escolha o melhor, por exemplo, PyCharm for Python.

A descoberta mais surpreendente para mim é como poucas linhas de código você precisa escrever quando implementa algum recurso. É provável que você gaste 80% do seu tempo de desenvolvedor lendo o código de outras pessoas. Isso é absolutamente importante. Você quer ter certeza de que suas alterações ou adições não quebram o código de outras pessoas. Além disso, você começa a julgar as habilidades de outros desenvolvedores pela legibilidade do código e pela suficiência de comentários.