Devo confessar que não era tão forte em estruturas de dados quando me formei na faculdade. Durante as colocações do campus durante minha graduação, testemunhei que a maioria das grandes empresas de tecnologia como Amazon, Microsoft etc. se concentrou principalmente em estruturas de dados. Parece que as estruturas de dados são a única coisa que eles esperam de um graduado.
Para ser sincero, me senti mal com isso. Eu escrevo um bom código. Eu sigo padrões de design padrão de codificação, eu uso estruturas de dados, mas no nível superficial, como em APIs expostas a Java, como ArrayList, LinkedList etc.
Provavelmente por causa do meu background em Java, naquela época, eu entendia a eficiência e a lógica do código apenas quando falado em termos de Programação Orientada a Objetos, como objetos, instâncias, etc., mas nunca me aprofundava no nível de bits e bytes. Não queria que as pessoas me desprezassem por esse meu déficit de conhecimento em estruturas de dados.
Então, realmente, por que toda essa ênfase nas estruturas de dados?
fonte
Respostas:
Não, tem mais. Por exemplo, também esperamos que você seja um aprendiz rápido que possa aprender novas estruturas, APIs ou mesmo linguagens de programação em um curto período de tempo. Essa é uma barra mínima. Alguém que demora muito para aprender uma nova estrutura, API ou idioma não será um desenvolvedor de sucesso na maioria das equipes da Microsoft.
E, é claro, há muitos outros aspectos nos quais focamos nas entrevistas, além do conhecimento bruto das estruturas de dados. Capacidade de lidar com especificações ambíguas, por exemplo, ou capacidade de reconhecer padrões de codificação que produzem código inseguro ou uma dúzia de outras coisas. Mas a capacidade de entender estruturas de dados certamente é muito grande.
É particularmente o caso que as entrevistas são tendenciosas para testar o conhecimento das estruturas de dados para recém-formados em CS. Os recém-formados, a maioria dos quais não tem muita experiência no mundo real, não devem ser bons nos mesmos tipos de coisas em que alguém com quinze anos de experiência no setor seria bom.
É bom que você saiba disso sobre você. Se você não puder ou não quiser mudar isso a seu respeito, minha recomendação é que você não se candidate a um emprego que exige facilidade com estruturas de dados.
É tautológico que um bom programador seja um bom programador para criar os tipos de programas que precisam ser criados. Muitos programadores trabalham em tarefas que não exigem conhecimento profundo das estruturas de dados. Alguns deles trabalham em tarefas que exigem um conhecimento profundo do design da interface do usuário, por exemplo. Ou normalização do banco de dados. Como queiras. Essas pessoas ainda podem ser "bons programadores" em seus domínios.
Faço perguntas da entrevista sobre estruturas de dados, porque na minha equipe os desenvolvedores projetam, implementam e manipulam estruturas de dados complexas o dia todo, todos os dias. Ontem, tivemos quatro horas de reuniões nas quais meia dúzia de desenvolvedores discutiram os prós e os contras da adição de um único campo booleano a um nó de árvore específico. Provavelmente, não há habilidade na minha equipe mais importante do que a capacidade de entender estruturas de dados em um nível profundo. Seria tolice não fazer perguntas sobre a entrevista, pois é isso que fazemos.
Bem, certamente irá impedi-lo de conseguir um emprego na minha equipe. Mas como eu disse antes, a programação é um campo enorme . Existem muitos tipos de programação de computadores que não exigem conhecimento de estruturas de dados.
Não. Mas é quase sempre suficiente detectar desenvolvedores que provavelmente não terão sucesso na Microsoft. Como é isso que eu estou interessado principalmente em detectar, o conhecimento das estruturas de dados é um dos fatores que testo nas entrevistas.
fonte
Um ponto importante sobre as estruturas de dados é que elas são universais e atemporais, pelo menos para fins práticos. Qualquer pessoa que tenha sido desenvolvedor nos últimos 30 anos deve conhecer estruturas básicas de dados, como listas de links simples / duplos, árvores binárias ou gráficos. Se você perguntar a dois desenvolvedores sobre eles, poderá comparar o conhecimento dos desenvolvedores por suas respostas. Isso dificilmente pode ser dito para estruturas ou mesmo linguagens: se você perguntar a dois desenvolvedores sobre o Rails, e um souber muito mais que o outro, o que isso realmente diz? Como você diz na pergunta, um desenvolvedor inteligente pode aprender uma nova estrutura com rapidez suficiente, portanto, testar seu conhecimento atual não faz muito sentido.
Sim. Definitivamente. A menos que você queira passar toda a sua vida escrevendo aplicativos CRUD.
Não, não é suficiente. Mas há poucas coisas que você pode perguntar em uma entrevista de emprego que são suficientes. E eu diria que o conhecimento de algoritmos é um dos melhores indicadores, pelo menos para pessoas recém-saídas da escola, onde você não pode perguntar sobre experiências de trabalho.
fonte
Para não parecer muito duro, mas qualquer desenvolvedor meio decente poderá escolher um novo idioma ou estrutura em um período relativamente curto.
As estruturas de dados são universais, são um bloco de construção fundamental da ciência da computação - uma árvore vermelha-preta é basicamente a mesma, seja implementada em Java, Python, PHP ou qualquer outra coisa. Portanto, em vez de testar linguagens específicas ou estruturas específicas, um empregador (pelo menos, um empregador que procura desenvolvedores destacados) testará se você conhece os fundamentos da ciência da computação, e não apenas o sabor do mês que eles ' está usando atualmente.
(pelo menos, eles deveriam testar os fundamentos além do que estão usando atualmente ... não adianta contratar um mago da ciência da computação se ele nunca escreveu uma linha de código em sua vida)
fonte
Você acredita que os pilotos de F1 apenas dirigem carros velozes? Não, eles entendem o carro que dirigem e trabalham com os mecânicos / engenheiros para ajustá-lo. Obviamente, um motorista normal apenas dirige.
Você pode ser um programador normal / médio que apenas escreve código. Você não entende o que está por trás. Você faz as coisas. É tudo, até o dia seguinte.
Mas muitas empresas procuram desenvolvedores de F1. Pessoas que se desenvolverão sabendo o que está por trás do código. Pessoas que também ajudarão a empresa a construir algo melhor.
É muito bom conhecer estruturas de dados, não apenas porque você as utilizará em um formulário "pré-cozido". Também é bom porque você criará algo que deriva da ideia deles.
fonte
Na minha aula sobre estruturas de dados, a primeira coisa que o professor disse foi: Essa aula não é sobre ser capaz de pesquisar muito rápido. Depois, passamos meio ano encontrando as melhores estruturas e algoritmos de dados possíveis para pesquisar muito rapidamente.
Ainda assim, ele permaneceu certo. Ser capaz de analisar estruturas de dados, aplicar a estrutura de dados correta a um determinado problema ou até criar novas estruturas de dados requer muitas qualidades de um engenheiro:
Quando a Amazon e a Microsoft contratam pessoas, elas não fazem perguntas sobre estruturas de dados porque esperam inventar a próxima seção rápida . Eles querem ter certeza de contratar alguém com as qualidades mencionadas acima.
É claro que é possível ter um grande conjunto dessas qualidades e ainda ser péssimo nas estruturas de dados. Mas, se for esse o caso, não demorará muito para você se tornar um especialista em estruturas de dados.
Dito isto, ainda existe o problema que
ArrayList
simplesmente não é bem dimensionado. Quando os sistemas crescem, são necessárias soluções melhor adaptadas para realizar o trabalho. E sem uma boa compreensão das estruturas de dados, você não poderá encontrar e compor estruturas e algoritmos que se expandem amplamente em seu cenário concreto.fonte
ArrayList
, sem uma boa compreensão das estruturas de dados, você pode nem perceber queArrayList
não é dimensionável e precisa encontrar e compor estruturas e algoritmos que dimensionam.Em geral, algoritmos e estruturas de dados são considerados dois dos tópicos mais "essenciais" da programação. Isso ocorre porque há um enorme corpo de trabalho e pesquisa sobre eles na ciência da computação. Eles também atraem os programadores típicos do "lobo esquerdo" que gostam de coisas como matemática e ciências (que são muitos programadores)
Dito isto, o conhecimento disso pode afetar sua carreira em termos de entrevistas, especialmente se você entrevistar em locais de trabalho orientados a engenharia, como o google. Outras empresas agora podem, no entanto, se preocupar com esse aspecto.
Na minha experiência, as demandas de algoritmo / estrutura de dados às vezes podem aparecer como "elitismo de programador", onde os geeks alfa estão brincando para mostrar quem é o mais inteligente. É sempre bom saber o que há por aí, mas existem muitos trabalhos de programação diferentes em que você nunca precisará saber como usar uma árvore vermelha / preta ou codificar uma pesquisa de boyer moore.
Eu recomendaria aprender mais sobre os tópicos, se você os achar interessantes e tiver algum projeto pessoal onde possa mexer com eles; caso contrário, provavelmente você pode se virar sem eles por enquanto.
PS. A proficiência em estruturas de dados rudimentares (listas vinculadas, dicionários, hashtables etc.) deve ser um conhecimento obrigatório para qualquer DS programador.
fonte
Duas razões.
Por um lado, mostra que você pode pensar sobre o problema em termos abstratos, e não em termos de uma linguagem de programação específica. Você sabe por que uma tabela de hash pode ser uma escolha melhor ou pior do que uma árvore vermelho-preta em uma determinada situação, independentemente da implementação subjacente?
Por outro lado, há um número assustador de pessoas por aí entrevistando para empregos que simplesmente mentem sobre sua experiência e têm muito pouca ou nenhuma capacidade de programação; as perguntas sobre estruturas de dados são uma maneira rápida de eliminar essas pessoas.
fonte
Eles são fundamentais, mas também, sobre o que você questionaria os graduados? Eles podem ou não ter experiência fora do trabalho do curso. Seu curso pode ter coberto as tecnologias da Microsoft mais do que Java, ou vice-versa. Estruturas de dados são pontos comuns.
fonte
Muitas vezes, o melhor código evita reinventar estruturas de dados de baixo nível. Isto é especialmente verdade em idiomas de alto nível. Percebi uma tendência para questões de estrutura de dados de baixo nível, mesmo em trabalhos CRUD. YMMV, mas parece que a ênfase na experiência dos cientistas hackers ofuscou as outras habilidades que fazem um ótimo desenvolvedor:
Estruturas de dados são ótimas. Estruturas de dados são importantes. Todo programador deve ter uma compreensão deles. No entanto, ficamos obcecados em empurrar esses fundamentos para fora do seu lugar. Não é tudo sobre estruturas de dados e, em 99% dos casos, não há necessidade de fazer perguntas além do básico das estruturas de dados. Se você estiver entrevistando um contador, pergunte a eles o que é 81 dividido por 9, mas se você continuar perguntando "Qual é a raiz cúbica de 98425454242412 * 4512324? ... sem uma calculadora!" então você estará assustando uma boa porcentagem das pessoas razoáveis, inteligentes, talentosas e agradáveis que você poderia ter. Pergunte se eles podem criar um modelo de dados relacionais básico, pergunte se eles podem usar as estruturas de matriz aprimoradas fornecidas pela estrutura relevante, e pergunte se eles podem explicar quando uma pesquisa binária é mais rápida que a pesquisa plana, mas não há muito sentido em ir muito além disso. Se eles puderem fazer essas coisas, comece a procurar o mais legal, mais profissional e mais criativo do grupo.
Adoro a escrita de Joel, mas acho que a coisa dele "Java Schools" está completamente errada. Há muitas coisas que podem provar que alguém é inteligente além de dominar o C ++. Pense nisso: você pode conversar com alguém por 10 minutos, sem perguntar sobre a aritmética dos ponteiros, e ter uma boa idéia de se eles são ou não do tipo que pode fazer as coisas e descobrir coisas. Não precisamos ser assim:
Entrevistador: "Conte-me sobre suas realizações."
Coder: "Na minha última posição, eu era o único desenvolvedor de um sistema ERP personalizado para uma empresa financeira de bilhões de dólares. Entregamos meses antes do previsto, e o sistema está em produção nos últimos 3 anos".
Entrevistador: "Deixe-me esclarecer. Conte-me sobre suas realizações na programação "
Codificador: "Umm ..."
Entrevistador: "Por exemplo, você já fez sua própria lista vinculada?"
Codificador: "... [saindo]"
fonte
Ser um bom programador não significa aprender idiomas e estruturas. Trata-se de ser capaz de criar soluções para problemas complexos. Para que essas soluções sejam eficientes e confiáveis, quase sempre dependerá de bons algoritmos e do uso apropriado das estruturas de dados. Saber que as estruturas de dados existem não é suficiente. Você precisa entender que as estruturas de dados serão suficientes para usar a correta para o problema. As listas e os mapas oferecem alguns recursos valiosos, mas têm custos, e o uso incorreto pode prejudicar significativamente o desempenho do seu software.
Um bom entrevistador sabe disso e está tentando determinar se você pode ser valioso para sua equipe ou empresa. O (s) idioma (s) que você usará daqui a dois anos pode ser muito diferente, mas a necessidade de algoritmos e estruturas de dados eficazes não será alterada.
fonte
Estruturas de dados, complexidade de tempo, manipulação de memória e indicadores são todos os fundamentos que alguém que se autodenomina cientista da computação deve conhecer de maneira inata. Qualquer macaco de código pode aprender um idioma e aprender a usá-lo, mas onde profissionais e estudantes de CS devem se destacar é saber não apenas como usar uma lista vinculada ou um mapa de hash, mas POR QUE.
O porquê é o que realmente nos diferencia do script básico infantil, do código-macaco e do grunhido do mundo da computação. POR QUE usar uma tabela de hash em vez de uma lista vinculada, POR QUE minha tabela de hash deve estar em uma densidade de cluster de aproximadamente 0,6 a 0,8, POR QUE devo usar uma lista vinculada circularmente aqui, em vez de uma lista duplamente vinculada. POR QUE meu código deve ser executado com eficiência 'x' no pior caso e 'y' no caso médio.
Essas estruturas básicas de dados e o conhecimento não apenas do COMO eles são usados (como deve ser o repritoire de todos os programadores de qualquer maneira), mas da linguagem independente de POR QUE eles são usados, o que tende a ser mais do que eles estão procurando nesses casos.
Muitos lugares farão com que você escreva o código em uma linguagem com a qual você esteja familiarizado, mas isso é mais generalizado, já que C não é mais a língua franca do mundo da programação, e estruturar pseudocódigo pode ser uma confusão e tudo mais. sobre o local e, na maioria dos casos, com o pseudo código / código p & p realmente não sendo ensinado, é impossível lidar com isso.
fonte
As estruturas de dados são a base fundamental de todos os programas. Você não precisa necessariamente ter um entendimento profundo deles, mas é absolutamente necessário saber como eles funcionam.
Por quê? Porque todo o seu código interage e manipula dados. Se o conjunto de dados não puder ser armazenado em uma estrutura, ele não poderá ser usado. Os dados são como os materiais de construção de uma casa. Até você montá-lo em uma estrutura, você tem apenas uma pilha inútil de tábuas.
Depois de ter decidido sobre a forma de pensar e definir o seu conjunto de dados, então você pode começar a usá-lo para fazer as coisas, o algoritmo parte clássico da dupla. Todo programa que você escreve usa uma estrutura de dados, embora em muitos casos essa estrutura seja tão simplista que quase não exista. Algumas variáveis para dados de estado e pronto!
Depois de ir além dos programas triviais, quase tudo requer uma estrutura de dados. Qual você prefere, um arquiteto profissional que projeta seu arranha-céu com as melhores práticas e matemática, ou o tio Joe Bob, que começa a construir imediatamente?
fonte
Para desenvolver o que o @Pelshoff diz , é mostrar que você sabe o que está fazendo. Se você usa um LinkedList para tudo, isso pode mostrar que você não sabe o que está fazendo ou não deseja parar e pensar sobre o problema. Além disso, pelo menos o curso de estruturas de dados que fiz, abordou a teoria básica e complexa das estruturas de dados que, ao lidar com grandes conjuntos de dados, é muito importante. Seria por isso que empresas como Amazon ou Microsoft fariam isso.
Devo dizer que, antes de fazer uma aula de estrutura de dados, pensei que elas não eram importantes, mas pelo menos ser capaz de reconhecer novamente quando uma lista vinculada (ou ArrayList) não é prática ou quais são as desvantagens delas.
fonte
Se você escreve um bom código ou não, é uma afirmação subjetiva. É importante saber que o código funcional nem sempre é um bom código.
Dito isto, as estruturas de dados são importantes porque são como os trabalhadores dos bastidores que você, como programador, está dirigindo. É verdade que você pode chamar métodos em uma estrutura sem entender realmente o que está fazendo e pode utilizar uma estrutura sem entender como os dados são armazenados, mas conhecer esses detalhes o preparará melhor para entender quando é apropriado usar uma estrutura sobre outro.
Saber, por exemplo, que você pode percorrer as duas direções em uma lista duplamente vinculada e somente encaminhar uma lista vinculada unicamente pode ajudar a determinar qual estrutura é importante ao armazenar dados. Você pode tomar uma decisão ainda mais educativa sabendo que uma lista vinculada individualmente pode potencialmente ter uma sobrecarga menor em termos de consumo de memória (já que não contém ponteiros para elementos anteriores); portanto, se você precisar apenas percorrer uma lista, você pode economizar memória usando uma estrutura apropriada.
Estes são apenas pequenos exemplos e, finalmente, se você sentir que está indo bem em sua carreira sem um conhecimento profundo das estruturas de dados, talvez não precise aprender mais. Porém, entender o que está acontecendo sob o capô pode realmente ajudar a transformar o código funcional em um bom código.
fonte
As estruturas de dados são componentes de muitas coisas que você deseja fazer. Se você conhece os usos de cada estrutura de dados, suas fraquezas e pontos fortes, pode facilmente resolver problemas.
Por exemplo, tínhamos um requisito para gerenciar milhares de objetos. De vez em quando, precisamos atualizar o registro de data e hora de um objeto de acordo com seu ID. De vez em quando, é necessário remover os objetos que não foram atualizados por mais de X minutos.
Se você conhece suas estruturas de dados, pode definir facilmente o problema e também é muito fácil encontrar uma solução. Quando um programador que não conhece estruturas de dados suficientes tentou encontrar uma solução, sua solução foi incômoda. Ele era como você - inteligente, programador de códigos, capaz de aprender estruturas rapidamente. Mas sem um conhecimento em estruturas de dados, ele teve que inventar a roda sozinho. Mais do que isso - ele teve dificuldade em entender soluções mais simples, pois elas eram baseadas em estruturas de dados que ele não entendia, como árvores vermelho-pretas (seu antigo TreeMap em Java).
Então, eu diria que o importante é saber como e quando usar cada estrutura de dados sem ter que pensar nisso. Mas não acho que exista nenhuma maneira de conseguir isso sem realmente entender como eles funcionam.
fonte