web-dev-qa-db-fra.com

Dois-je comprendre les algorithmes et les structures de données pour être appelé programmeur?

Cela fait six ans que je code. Codage dans toutes sortes de choses comme ActionScript, JavaScript, Java, PHP, Ajax, XML HTML, ASP, etc. J'ai utilisé des tableaux, des cartes, des listes liées, des ensembles, etc. et partout où je travaillais, des gens comme moi. Mais chaque fois que je suis interviewé, il est très probable que les gens me posent des questions sur les hachages, les arbres, les piles et les files d'attente. Certaines questions portent sur la jonglerie avec certains algorithmes de tri. Je ne sais pas si je devrais vraiment les connaître ou devrais-je arrêter de m'appeler programmeur. Il y a quelque chose en moi qui me dit aussi que même si les gens qui me posent toutes ces questions me choisissent, ils ne me feront jamais travailler ces choses. Suis-je vraiment obligé de savoir tout cela?

38
sushil bharwani

Si tout ce que vous savez faire est d'écrire du code de colle, vous pouvez vous appeler un singe de code. Beaucoup de code de colle doit être écrit et vous pouvez gagner votre vie décemment en tant que singe de code. Pour vous appeler un vrai programmeur TM et faire confiance lorsque le code doit être écrit à partir de zéro, vous devez connaître les algorithmes, les structures de données, la gestion de la mémoire, les pointeurs, le langage d'assemblage, etc. et comprendre comment utiliser ces connaissances pour évaluer les compromis.

80
dsimcha

ceux qui ne connaissent pas l'histoire sont condamnés à la réinventer

33
Steven A. Lowe

Eh bien, travailler dans un langage comme JavaScript rend cela assez obsolète, car un tableau est un mélange entre un vecteur, un hachage et un arbre et peut être utilisé comme une pile ou une file d'attente. Il est très peu probable que vous ayez besoin ou que vous puissiez implémenter une structure de données en JavaScript qui surpasse la classe Array. C'est également le cas en PHP.

Pour Java OTOH, il y a une différence. Je suppose que la bibliothèque standard de Java vous fournit toutes les infrastructures dont vous avez besoin. Cependant:

  1. Vous devez connaître et distinguer ces infrastructures de données et comprendre comment elles fonctionnent dans différentes situations afin que vous puissiez choisir la bonne.
  2. En Java, il n'est pas absolument improbable que vous souhaitiez éventuellement écrire votre propre implémentation pour une table de hachage pour obtenir une meilleure vitesse dans certains cas très spécifiques (par exemple, si les clés que vous souhaitez gérer remplissent certaines contraintes spéciales qui permettent l'optimisation).

En ce qui concerne les algorithmes de tri, il n'est pas nécessaire de les connaître ou de les comprendre, car il n'est pas nécessaire d'en implémenter un seul. Cependant, si un tel algorithme vous est fourni, vous devriez pouvoir le comprendre et le mettre en œuvre.

Deux choses sont sûres:

  1. Vous pouvez faire carrière en tant que programmeur sans compter sur de telles connaissances.
  2. Cela très certainement ne vous fera pas de mal de les connaître.

Les structures de données et les algorithmes sont simplement une chose, c'est bon à comprendre. Et c'est quelque chose d'extrêmement clair et formalisé et donc assez banal par rapport aux subtilités de l'ingénierie des applications ou des systèmes. Ils ne sont qu'une petite pièce du puzzle, mais ils sont faciles à saisir - si vous êtes prêt à investir du temps.

Donc non, vous n'en avez pas besoin, mais ce ne serait que pour votre avantage de les connaître.

30
back2dos

Cela pourrait être une occasion où il peut y avoir une distinction sémantiquement significative entre "programmeur" et "ingénieur logiciel". Dans ce contexte, en particulier, nous constatons que vous avez une connaissance de plusieurs langages de programmation et des technologies associées et que vous pouvez les utiliser pour produire les résultats souhaités. Il s'agit d'une belle définition opérationnelle de "programmeur informatique".

Je me considère comme un ingénieur logiciel. Dans la plupart des aspects quotidiens de mon travail, je fais probablement les mêmes choses que vous. J'utilise le langage informatique et les technologies connexes pour produire le résultat souhaité. Cependant, j'ai une compréhension des structures de données et des algorithmes, et je considère que la connaissance est un fondement fondamental de ma capacité à faire beaucoup plus.

Souvent - mais pas tous les jours - mon travail consiste à trouver des solutions à des problèmes complexes pour lesquels il n'y a pas de solutions évidentes, rien qui soit directement abordé par les caractéristiques du cadre que j'utilise ou les capacités du langage que je travaille avec. En cela, j'ai besoin d'analyser le problème et de trouver une solution et parfois ce processus entre dans le domaine de l'architecture à grande échelle.

Bien qu'une excellente compréhension de ces problèmes plus profonds soit nécessaire pour effectuer ce genre de travail, ce n'est pas suffisant. En d'autres termes, il ne suffit pas de savoir comment fonctionne une table de hachage ou pourquoi un tri en tas possède de bonnes caractéristiques de performance pour être architecte de systèmes ou ingénieur principal. C'est le point de départ logique, et à partir de là, vous pouvez commencer à creuser plus profondément et à voyager plus largement et à acquérir l'expérience qui est également nécessaire pour résoudre les problèmes plus vastes.

Je suppose que pour répondre à votre question, vous devez vous demander: "Qu'est-ce que je veux être? Où vais-je aller avec ma carrière?" Si vous vous contentez de continuer à faire ce que vous faites, vous voudrez peut-être simplement apprendre suffisamment de structures de données et d'algorithmes pour passer à travers les questions d'entrevue largement arbitraires auxquelles vous êtes confronté.

Si vous voulez évoluer dans votre carrière et que vous avez la passion qui est essentielle, vous devez aborder ces sujets aussi étroitement que possible. Si vous avez du temps pour les travailler, un esprit ouvert et un véritable enthousiasme, vous trouverez des choses merveilleuses et excitantes. Je n'oublierai jamais le jour où j'ai compris quicksort. Le sentiment d'excitation et de découverte a ouvert la voie pour une grande partie du reste de ma vie, et je ne pourrais pas être plus reconnaissant pour cela. Maintenant, je ne peux pas imaginer faire autre chose que travailler comme ingénieur logiciel.

Bonne chance avec tout ce que vous choisissez.

13
Adam Crossland

Cela dépend à quoi servent les emplois. Ce genre de choses sont des questions d'entrevue assez standard, mais elles sont également assez peu imaginatives et ne se rapportent probablement pas du tout au travail - certainement pas un travail utilisant les technologies que vous énumérez.

Pour moi, les questions d'entrevue sont un bon juge pour savoir si vous avez obtenu un diplôme en informatique (et vous vous en souvenez) plutôt que n'importe quelle mesure de la capacité ou des connaissances générales en programmation.

Je suggère que soit vous appreniez ce genre de choses pour pouvoir passer l'entretien, soit vous acceptiez simplement que demander n'importe où ces choses n'est pas pour vous, mais non, vous n'avez pas besoin de les connaître pour vous appeler programmeur.

12
Jon Hopkins

Grande question. Javascript ou Java ou VC++ sont des langages de programmation super intelligents où vous n'aurez jamais besoin de créer une liste liée ou une table de hachage à partir de zéro. Mais vous devez toujours avoir la possibilité de décider quand en utiliser un sur l'autre, les pénalités de performance et les bonus s'accumulent, etc.

J'ai interviewé beaucoup de programmeurs API alias des singes de code, et dans la plupart des interviews, ils n'ont pas réussi à concevoir des systèmes qui sont performants et évolutifs. Conclusion: connaître des tonnes d'API vous donnera le pain, mais pour le beurre, vous devez commencer par les bases de l'informatique.

6
Fanatic23

J'ajouterai "oui, bien sûr, vous pouvez toujours vous appeler programmeur". Mais quel genre de programmeur voulez-vous être? Je pense que les meilleurs programmeurs ont au moins quelques bases sur les bases théoriques. Ils savent pourquoi ils ont choisi une structure/un algorithme de données particulier ainsi que les compromis qui vont avec. Je m'attends à ce que tout développeur que j'interviewe ait au moins une compréhension de base, même s'il n'utilise pas le même jargon (bien que ne pas connaître le jargon signifie qu'il vous sera plus difficile de communiquer avec d'autres développeurs).

3
Martijn Verburg

La connaissance des algorithmes vous permet de dire en toute confiance comment vos choix vont échelle! Je considère personnellement que cela est nécessaire pour être programmeur senior

2
user1249

"Si vous voulez être un bon programmeur, vous programmez tous les jours pendant deux ans. Si vous voulez être un programmeur de classe mondiale, vous pouvez programmer tous les jours pendant dix ans, ou vous pouvez programmer tous les jours pendant deux ans et suivre un cours d'algorithmes. . "

-Charles E. Leiserson

Bon conseil de l'analyse des algorithmes par Charles E. Leiserson - MIT

2
milan-j

Vous êtes peut-être un bon programmeur en ce moment, mais la connaissance de la structure des données, des algorithmes et la connaissance d'autres sujets en informatique aideraient certainement beaucoup à vous améliorer de plusieurs façons:

  • Vous pourrez peut-être être plus efficace et plus rapide à faire les choses. Même les gens qui ont déjà un diplôme en informatique et connaissent beaucoup de ces sujets auraient tendance à se tenir au courant des dernières avancées afin de s'améliorer.

  • Cette connaissance sera également utile, si dans une moindre mesure, par exemple si vous passez du programmeur à la gestion plus tard, car vous seriez toujours en mesure de mieux comprendre les aspects techniques des projets avec cette connaissance.

  • Bien sûr, la structure des données et les algorithmes sont souvent demandés lors des entretiens, c'est donc une raison de plus pour laquelle il pourrait être utile de les connaître.

1
aditya

Cela dépend du projet: je suis ingénieur en informatique et je travaille comme analyste programmeur.

J'ai passé beaucoup de temps à travailler dans la conception (tests, doc, conception de code). Mais, lorsque je trouve un bug (ou de mauvaises performances) ou que je dois coder une nouvelle structure de données (parce que l'exigence est très NOUVELLE pour l'application), je dois comprendre où est le problème dans l'algorithme et je dois le corriger ( Je l'ai fait pas très bien, alors :))

Les algorithmes classiques et les structures de données sont une sorte de "modèle de dictionnaire" dans le monde du développeur.

Quelques excellents liens:

1
alepuzio

Vous mentionnez des hachages, des arbres, des piles, des files d'attente et des algorithmes de tri. Eh bien, les technologies que vous avez mentionnées sont principalement liées aux pages Web et aux scripts Web. Vous devez absolument comprendre les arbres à tout le moins, afin de bien travailler avec le DOM. Mais si le script est tout ce que vous devez faire, vous êtes probablement d'accord. Vous n'aurez pas besoin de la plupart des outils du métier pour un vrai programmeur. Mais c'est parce qu'il y a une grande différence entre le jonglage de chaînes qui compose la plupart des scripts Web et ce que la plupart d'entre nous considèrent comme des "programmes d'écriture".

Je travaille avec des hachis et des arbres pratiquement quotidiennement, et j'empile et fais la queue moins souvent mais assez souvent. Le tri est fondamentalement un problème résolu; à peu près n'importe quelle langue a un tri rapide intégré dans la bibliothèque standard, une méthode de tri sur les types de collection de base, etc., mais vous devez savoir dans quelles circonstances les performances du tri rapide peuvent se dégrader gravement et les bonnes stratégies pour retarder le tri.

Si je ne connaissais pas ces principes et comment ils fonctionnent, je pourrais probablement pirater des solutions de codage qui fonctionnent, mais ce ne seraient pas des solutions de très bonne qualité. Ils s'exécutaient lentement, étaient difficiles à lire et difficiles à modifier, à réutiliser ou à étendre. Donc, si vous voulez apprendre à être un bon programmeur, vous devez absolument lire vos algorithmes et vos structures de données. Ils amélioreront vraiment la qualité de votre code.

0
Mason Wheeler