Je dois avouer que je n'étais pas aussi fort dans les structures de données lorsque je suis sorti de l'université. Au cours de mes études sur les campus, au cours de mes études, j'ai constaté que la plupart des grandes entreprises technologiques telles qu'Amazon, Microsoft, etc. se concentraient principalement sur les structures de données. Il semble que les structures de données soient la seule chose qu’ils attendent d’un diplômé.
Pour être honnête, je me sentais mal à ce sujet. J'écris un bon code. Je respecte les schémas de conception standard du codage. J'utilise des structures de données, mais au niveau superficiel, comme dans les API exposées Java telles que ArrayList, LinkedList, etc.
Probablement à cause de mon arrière-plan Java, à l'époque, je ne comprenais l'efficacité du code et la logique que lorsqu'on parlait de programmation orientée objet, comme les objets, les instances, etc., mais je n'ai jamais approfondi le niveau des bits et des octets. Je ne voulais pas que les gens me méprisent pour mon déficit de connaissances dans les structures de données.
Alors vraiment pourquoi tout cet accent sur les structures de données?
la source
Réponses:
Non, il y a plus Par exemple, nous nous attendons également à ce que vous appreniez rapidement et que vous puissiez apprendre de nouveaux frameworks, API ou même de nouveaux langages de programmation en peu de temps. C'est un bar minimum. Une personne qui met beaucoup de temps à apprendre un nouveau framework, une nouvelle API ou un nouveau langage ne sera pas un développeur performant dans la plupart des équipes Microsoft.
Et bien sûr, nous mettons l'accent sur beaucoup d'autres aspects des entretiens que la simple connaissance brute des structures de données. Capacité à gérer des spécifications ambiguës, par exemple, ou à reconnaître des modèles de codage produisant un code non sécurisé, ou une douzaine d'autres choses. Mais la capacité à comprendre les structures de données est certainement un très grand.
Il est particulièrement vrai que les entretiens ont pour objectif de tester la connaissance des structures de données des diplômés récents en informatique. Les nouveaux diplômés, dont la plupart n'ont pas beaucoup d'expérience dans le monde réel, ne devraient pas être bons dans les mêmes domaines qu'une personne ayant quinze ans d'expérience dans l'industrie.
C'est bien que vous sachiez cela à propos de vous-même. Si vous ne pouvez pas ou ne souhaitez pas changer cela à propos de vous-même, ma recommandation est que vous ne postulez pas pour un travail qui nécessite une installation avec des structures de données.
C'est tautologique qu'un bon programmeur est un programmeur qui est doué pour créer les types de programmes à construire. Beaucoup de programmeurs travaillent sur des tâches qui ne nécessitent pas une connaissance approfondie des structures de données. Certains travaillent par exemple sur des tâches nécessitant une connaissance approfondie de la conception d'interface utilisateur. Ou la normalisation de la base de données. Ou peu importe. Ces personnes peuvent toujours être de "bons programmeurs" dans leurs domaines.
Je pose des questions sur les structures de données lors des entretiens car, dans mon équipe, les développeurs conçoivent, implémentent et manipulent des structures de données complexes, jour après jour. Hier, nous avons eu quatre heures de réunions au cours desquelles une demi-douzaine de développeurs ont expliqué les avantages et les inconvénients de l'ajout d'un seul champ booléen à un nœud d'arbre particulier. Aucune compétence de mon équipe n'est probablement plus importante que la capacité à comprendre les structures de données à un niveau profond. Il serait idiot de ne pas poser de questions d'entrevue à ce sujet, car c'est ce que nous faisons.
Cela vous empêchera certainement de trouver un emploi dans mon équipe. Mais comme je l'ai dit auparavant, la programmation est un domaine immense . Il existe de nombreux types de programmation informatique qui n'exigent pas une connaissance des structures de données.
Non, mais il est presque toujours suffisant de détecter les développeurs qui ont peu de chances de réussir chez Microsoft. Puisque c’est ce que je cherche surtout à détecter, la connaissance des structures de données est l’un des facteurs que j’ai testé au cours des entretiens.
la source
Un point important concernant les structures de données est qu’elles sont universelles et intemporelles, du moins pour des raisons pratiques. Toute personne qui a été développeur au cours des 30 dernières années devrait connaître les structures de données de base telles que des listes à liaison simple / double, des arbres binaires ou des graphiques. Si vous demandez à deux développeurs à leur sujet, vous pouvez comparer leurs connaissances en fonction de leurs réponses. On peut difficilement en dire autant des frameworks ou même des langages: si vous interrogez deux développeurs sur Rails et que l'un en sait beaucoup plus que l'autre, qu'est-ce que cela vous dit vraiment? Comme vous le dites dans la question, un développeur intelligent peut apprendre un nouveau framework assez rapidement. Tester ses connaissances actuelles n'a donc aucun sens.
Oui. Absolument. Sauf si vous voulez passer toute votre vie à écrire des applications CRUD.
Non, ce n'est pas suffisant. Mais il y a peu de choses que vous pouvez demander lors d'un entretien d'embauche qui soient suffisantes. Et je dirais que la connaissance des algorithmes est l'un des meilleurs indicateurs, du moins pour les personnes sortant de l'école, où il est impossible de poser des questions sur les expériences de travail.
la source
Cela ne doit pas paraître trop sévère, mais tout développeur à la décente sera capable de choisir un nouveau langage ou un nouveau framework dans un laps de temps relativement court.
Les structures de données sont universelles, elles constituent un élément fondamental de la science informatique: un arbre rouge-noir est fondamentalement identique, qu'il soit implémenté en Java, Python, PHP ou autre. Ainsi, plutôt que de tester des langages ou des cadres spécifiques, un employeur (du moins un employeur à la recherche de développeurs hors pair) vérifiera si vous connaissez les principes fondamentaux de la science informatique, plutôt que la moindre saveur du mois à laquelle ils s'adressent. re utilise actuellement.
(au moins, ils devraient tester les principes de base en plus de tout ce qu'ils utilisent actuellement ... inutile de faire appel à un assistant en informatique s'il n'a jamais écrit une ligne de code de sa vie)
la source
Croyez-vous que les pilotes de F1 conduisent juste des voitures rapides? Non, ils comprennent la voiture qu'ils conduisent et ils travaillent avec les mécaniciens / ingénieurs pour la régler. Bien sûr, un conducteur normal ne fait que conduire.
Vous pouvez être un programmeur normal / moyen qui écrit simplement du code. Tu ne comprends pas ce qu'il y a derrière. Vous faites avancer les choses. C'est tout, à demain.
Mais de nombreuses entreprises recherchent des développeurs F1. Les gens qui vont développer en sachant ce qui se cache derrière leur code. Des personnes qui aideront également l’entreprise à construire quelque chose de mieux.
Il est très utile de connaître les structures de données non seulement parce que vous les utiliserez souvent sous une forme "précuite". C'est aussi bien parce que vous allez créer quelque chose qui dérive de leur idée.
la source
Dans mon cours sur les structures de données, la toute première chose que le professeur a dite était: Ce cours n’est pas destiné à permettre une recherche très rapide. Nous avons ensuite passé six mois à trouver les meilleures structures de données et algorithmes possibles pour effectuer une recherche très rapide.
Pourtant, il est resté juste. Etre capable d'analyser des structures de données, d'appliquer la bonne structure de données à un problème donné ou même de créer de nouvelles structures de données nécessite de nombreuses qualités d'ingénieur:
Lorsque Amazon et Microsoft embauchent des personnes, elles ne posent pas de questions sur les structures de données car elles espèrent inventer le prochain tri rapide . Ils veulent s'assurer qu'ils embauchent quelqu'un avec les qualités mentionnées ci-dessus.
Bien sûr, il est possible d’avoir un grand ensemble de ces qualités et de ne pas aimer les structures de données. Mais si tel est le cas, il ne vous faudra pas longtemps pour devenir un expert en structures de données.
Cela étant dit, il y a toujours le problème qui
ArrayList
n'a pas tout à fait l'ampleur. Lorsque les systèmes deviennent volumineux, des solutions mieux adaptées sont nécessaires pour effectuer le travail. Et sans une bonne compréhension des structures de données, vous ne pourrez pas trouver et composer des structures et des algorithmes qui évoluent dans votre scénario concret.la source
ArrayList
, sans une bonne compréhension des structures de données, vous ne réaliserez peut-être même pas que celaArrayList
n’est pas tout à fait à l’échelle et vous devez trouver et composer des structures et des algorithmes à cette échelle.En général, les algorithmes et les structures de données sont considérés comme deux des sujets les plus «essentiels» de la programmation. En effet, il existe un énorme travail et de nombreuses recherches en informatique. Ils attirent également les programmeurs typiques du "lobe gauche" qui aiment des choses comme les mathématiques et les sciences (ce qui est un tas de programmeurs)
Cela dit, la connaissance de ces éléments peut affecter votre carrière en termes d’interview, en particulier si vous interviewez dans des lieux de travail axés sur l’ingénierie tels que Google. D’autres entreprises pourraient toutefois se soucier de cet aspect.
D'après mon expérience, les demandes en structure d'algorithme / de données peuvent parfois apparaître comme un "élitisme de programmeur" où les geeks alpha se bousculent pour montrer qui est le plus intelligent. Il est toujours bon de savoir ce qui se passe, mais il existe un grand nombre de tâches de programmation où vous n'aurez jamais besoin de savoir comment utiliser un arbre rouge / noir ou coder une recherche boyer-moore.
Je vous conseillerais d'en apprendre davantage sur les sujets si vous les trouvez intéressants et si vous avez un projet personnel où vous pouvez les bricoler, sinon vous pourrez probablement vous en passer sans eux pour l'instant.
PS Une connaissance approfondie des structures de données rudimentaires (listes chaînées, dictionnaires, hashtables, etc.) devrait être une connaissance obligatoire pour tout programmeur DS.
la source
Deux raisons.
D'une part, cela montre que vous pouvez penser au problème en termes abstraits, plutôt qu'en termes de langage de programmation spécifique. Savez-vous pourquoi une table de hachage peut être un choix meilleur ou pire qu'un arbre rouge-noir dans une situation donnée, quelle que soit l'implémentation sous-jacente?
D'autre part, il y a un nombre effrayant de personnes interrogées pour des emplois qui mentent simplement sur leur expérience et qui ont très peu de capacités de programmation, voire aucune. Les questions sur les structures de données sont un moyen rapide d'éliminer ces personnes.
la source
Ils sont fondamentaux, mais aussi, sur quoi voudriez-vous interroger les diplômés? Ils peuvent ou non avoir de l'expérience en dehors de leurs cours. Leur parcours peut avoir couvert davantage les technologies Microsoft que Java, ou inversement. Les structures de données sont un terrain d'entente.
la source
Souvent, le meilleur code évite de réinventer les structures de données de bas niveau. Ceci est particulièrement vrai dans les langages de haut niveau. J'ai remarqué une tendance aux questions de structure de données de bas niveau, même dans les emplois CRUD. YMMV, mais il semble que l’accent mis sur l’expertise scientifique en piratage informatique ait éclipsé les autres compétences qui en font un excellent développeur:
Les structures de données sont excellentes. Les structures de données sont importantes. Chaque programmeur devrait les comprendre. Cependant, nous sommes devenus obsédés par pousser ces fondamentaux hors de leur place. Ce n'est pas TOUT sur les structures de données, et dans 99% des cas, il n'est pas nécessaire de poser des questions autres que les bases des structures de données. Si vous interviewez un comptable, demandez-lui bien ce qu'est 81 divisé par 9, mais si vous continuez à demander "Quelle est la racine du cube de 98425454242412 * 4512324? ... sans calculatrice!" alors, vous effrayerez un bon pourcentage des personnes raisonnables, intelligentes, talentueuses et agréables que vous auriez pu avoir. Demandez-leur s'ils peuvent créer un modèle de données relationnel de base, s'ils peuvent utiliser les structures de tableau améliorées fournies par le cadre approprié, et leur demander s'ils peuvent expliquer quand une recherche binaire est plus rapide qu'une recherche à plat, mais il n'y a pas de raison d'aller trop loin au-delà de cela. S'ils peuvent faire ces choses, alors commencez à chercher le plus gentil, le plus professionnel et le plus créatif du groupe.
J'adore l'écriture de Joel, mais je pense que son "Java Schools" est totalement faux. Il y a beaucoup de choses qui peuvent prouver que quelqu'un est intelligent, au-delà de la maîtrise de C ++. Pensez-y, vous pouvez parler à quelqu'un pendant 10 minutes sans lui poser de questions sur l'arithmatique des pointeurs, et avoir une assez bonne idée de savoir si c'est le type qui peut faire avancer les choses et résoudre les problèmes. Nous n'avons pas besoin d'être comme ça:
Interviewer: "Parlez-moi de vos réalisations."
Coder: "Dans mon dernier poste, j'étais le développeur unique d'un système ERP personnalisé pour une entreprise financière valant un milliard de dollars. Nous avons livré des mois à l'avance, et le système est en production depuis 3 ans."
Interviewer: "Laissez-moi clarifier. Parlez-moi de vos réalisations en matière de programmation "
Codeur: "Umm ..."
Intervieweur: "Par exemple, avez-vous déjà créé votre propre liste de liens?"
Coder: "... [sortant]"
la source
Être un bon programmeur ne signifie pas être capable d'apprendre des langages et des frameworks. Il s'agit de pouvoir élaborer des solutions à des problèmes complexes. Pour que ces solutions soient efficaces et fiables, il faudra presque toujours compter sur de bons algorithmes et une utilisation appropriée des structures de données. Connaître les structures de données existantes ne suffit pas. Vous devez comprendre que les structures de données suffisent à utiliser celle qui convient pour le problème. Les listes et les cartes offrent des fonctionnalités intéressantes, mais elles entraînent des coûts, et utiliser le mauvais peut nuire considérablement aux performances de votre logiciel.
Un bon intervieweur le sait et essaie de déterminer si vous pouvez être utile à son équipe ou à son entreprise. Les langues que vous utiliserez dans deux ans peuvent être très différentes, mais le besoin d'algorithmes et de structures de données efficaces ne changera pas.
la source
Les structures de données, la complexité temporelle, la manipulation de la mémoire et les pointeurs sont tous des principes fondamentaux que toute personne qui s'appelle informaticien devrait connaître de façon innée. N'importe quel code-singe peut apprendre une langue et apprendre à l'utiliser, mais les professionnels de la CS et les étudiants doivent se distinguer, c'est savoir non seulement comment utiliser une liste chaînée ou une carte de hachage, mais POURQUOI.
Le WHY est ce qui nous distingue vraiment du script de base kiddie, du code singe et du grognement du monde informatique. POURQUOI utiliser une table de hachage au lieu d'une liste chaînée, POURQUOI ma table de hachage devrait-elle présenter une densité de cluster d'environ 0,6 à 0,8; POURQUOI devrais-je utiliser ici une liste liée de manière circulaire plutôt qu'une liste doublement liée? POURQUOI mon code devrait-il fonctionner à l'efficacité «x» dans le pire des cas et «y» dans le cas moyen?
Ces structures de données de base et cette connaissance non seulement de la façon dont elles sont utilisées (le comment devrait être dans tous les programmes), mais également de la raison pourquoi elles sont utilisées, ce qui tend à être plus que ce qu'elles recherchent dans ces cas-là.
Beaucoup d'endroits vous feront écrire le code dans un langage avec lequel vous êtes firmi, mais c'est plus une généralité, vu que C n'est vraiment plus la langua franca du monde de la programmation, et que le pseudo code structurant peut être un méli-mélo et tout. sur la place et, dans la plupart des cas avec pseudo code / code p & p pas vraiment enseigné, bas impossible à traiter.
la source
Les structures de données sont la base fondamentale de tous les programmes. Vous n'avez pas nécessairement besoin de bien les comprendre, mais vous devez absolument savoir comment ils fonctionnent.
Pourquoi? Parce que tout votre code interagit et manipule des données. Si le fichier ne peut pas être stocké dans une structure, il ne peut pas être utilisé. Les données sont comme les matériaux de construction d'une maison. Jusqu'à ce que vous le mettiez dans une structure, vous avez juste une pile inutile de planches.
Une fois que vous avez décidé sur la façon de penser et définir votre ensemble de données, alors vous pouvez commencer à l' utiliser pour faire des choses, la partie de l' algorithme classique du duo. Chaque programme que vous écrivez utilise une structure de données, bien que dans de nombreux cas, cette structure soit si simpliste qu'elle n'existe presque pas. Quelques variables pour les données d'état et nous avons terminé!
Une fois que vous dépassez les programmes triviaux, presque tout nécessite une structure de données. Que préférez-vous, un architecte professionnel qui conçoit votre gratte-ciel avec les meilleures pratiques et les mathématiques, ou un oncle joe bob qui commence immédiatement à construire?
la source
S'appuyer sur ce que dit @Pelshoff , c'est montrer que vous savez ce que vous faites. Si vous utilisez une LinkedList pour tout, cela peut indiquer que vous ne savez pas ce que vous faites ou que vous ne vous souciez pas de vous arrêter et de réfléchir au problème. En plus de cela, au moins le cours sur les structures de données que j'ai suivi aborde la théorie de base de la complexité de ces structures de données, ce qui est très important pour les grands ensembles de données. Ce serait pourquoi des entreprises comme Amazon ou Microsoft feraient une telle chose.
Avant de prendre un cours sur la structure de données, je dois dire que j’étais persuadé qu’ils n’étaient pas importants, mais au moins, je pouvais reconnaître une liste chaînée (ou ArrayList) qui n’était pas pratique ou qui comportait des inconvénients.
la source
Que vous écriviez un bon code ou non est une déclaration subjective. Il est important de savoir que le code fonctionnel ne produit pas toujours un bon code.
Cela dit, les structures de données sont importantes car elles ressemblent aux travailleurs en coulisses que vous dirigez, en tant que programmeurs. Il est vrai que vous pouvez appeler des méthodes sur une structure sans vraiment comprendre ce qu’il fait et vous pouvez utiliser une structure sans vraiment savoir comment les données sont stockées, mais connaître ces détails vous préparera mieux à comprendre quand il est approprié d’utiliser une structure. un autre.
Le fait de savoir, par exemple, que vous pouvez parcourir dans les deux sens une liste à double lien et uniquement transférer à travers une liste à lien unique peut vous aider à déterminer quelle structure est importante lors du stockage de données. Vous pouvez prendre une décision encore plus pédagogique en sachant qu’une liste à lien unique peut potentiellement entraîner une surcharge de mémoire en termes de consommation de mémoire (car elle ne contient pas de pointeur sur les éléments précédents). Par conséquent, si vous n’avez besoin que de faire une itération vers l’avant dans une liste, vous pouvez économiser de la mémoire en utilisant une structure appropriée.
Ce ne sont que de petits exemples et, finalement, si vous sentez que votre carrière se passe bien sans une connaissance intime des structures de données, alors vous n’avez peut-être pas besoin d’apprendre davantage. Comprendre ce qui se passe sous le capot, cependant, peut vraiment aider à transformer un code fonctionnel en bon code.
la source
Les structures de données sont des blocs de construction de nombreuses choses que vous voulez faire. Si vous connaissez les utilisations de chaque structure de données, ses faiblesses et ses points forts, vous pourrez facilement résoudre les problèmes.
Par exemple, nous avions l'obligation de gérer des milliers d'objets. De temps en temps, nous devons mettre à jour l'horodatage d'un objet en fonction de son ID. De temps en temps, nous devions supprimer les objets non mis à jour pendant plus de X minutes.
Si vous connaissez vos structures de données, vous pouvez facilement définir le problème. Il est également très facile de trouver une solution. Lorsqu'un programmeur ne connaissant pas assez de structures de données essayait de trouver une solution, sa solution était maladroite. Il était comme vous - intelligent, programmeur de code, capable d'apprendre rapidement les frameworks. Mais sans connaissance des structures de données, il devait inventer la roue lui-même. Plus que cela - il avait du mal à comprendre des solutions plus simples car celles-ci étaient basées sur des structures de données qu'il ne comprenait pas, telles que les arbres rouges-noirs (votre ancien TreeMap en Java).
Je dirais donc que l’important est de savoir comment et quand utiliser chaque structure de données sans avoir à y penser. Mais je ne pense pas qu’il soit possible d’y parvenir sans comprendre réellement leur fonctionnement.
la source