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


37

Cela fait six ans que je code. Coder dans toutes sortes de choses comme ActionScript, JavaScript, Java, PHP, Ajax, XML HTML, ASP, etc. J'ai utilisé des tableaux, des cartes, des listes chaînées, des ensembles, etc., et partout où j'ai travaillé, 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 sont sur jongler avec certains algorithmes de tri. Je ne sais pas si je devrais vraiment les connaître ou devrais-je cesser de me traiter de 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. Suis-je vraiment obligé de savoir tout cela?


10
Cela dépend du lieu où vous travaillez et du nom du programmeur.
Tim

1
Oui, sans adjectifs négatifs.
Duros

Réponses:


79

Si tout ce que vous savez faire, c'est écrire du code collé, vous pouvez vous appeler un singe de code. Beaucoup de code de la colle doit être écrit et vous pouvez gagner sa vie comme un singe de code. Pour vous appeler Real Programmer 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.


6
Wow, je m'attendais à peu près à ce que cela soit rejeté dans l'oubli par des personnes excessivement politiquement correctes pour avoir utilisé le terme "code singe".
Dimim

15
"logiciel simian" est toujours la terminologie préférée
STW

3
Je ne suis pas totalement d'accord. Le type de logiciel qui est écrit "à partir de zéro" affecte grandement qui est capable de l'écrire. Certains logiciels nécessitent intrinsèquement moins de sophistication (ou plus) que d’autres.
Nick Spreitzer

8
+1, 20% parce que je suis d'accord, 5% pour "Real Programmer TM" et 75% pour avoir appris le langage d'assemblage et vouloir faire valoir que cela en valait la peine
Carson Myers

3
La plupart des travaux existants ne nécessitent que des «singes de code». Il est normal que les personnes occupant des emplois de «singe de code» aient tendance à oublier toutes ses connaissances antérieures, se faisant ainsi un peu plus de «singe de code» chaque jour, malgré son potentiel. :(
cag

32

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


75
En fait, ceux qui ne connaissent pas l’histoire sont condamnés à la réinventer en utilisant des méthodes O (N 2) ou O (N 3) au lieu d’utiliser des méthodes bien connues en O (N log N) qui sont suffisamment âgées pour acheter de l’alcool à tout prix. États.
John R. Strohm

@ John ROFLMAO - trop vrai!
Steven A. Lowe

3
.... sont condamnés à le réengager

30

Bien, travailler dans un langage tel que JavaScript rend cela assez obsolote, puisqu'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 données dont vous avez besoin. Toutefois:

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

En ce qui concerne les algorithmes de tri, il n'est pas vraiment nécessaire de les connaître ou de les comprendre, car il n'est pas nécessaire de les implémenter soi-même. Cependant, si un tel algorithme vous est donné, vous devriez pouvoir le comprendre et le mettre en œuvre.

Deux choses sont certaines:

  1. Vous pouvez faire une carrière de programmeur sans vous fier à de telles connaissances.
  2. Cela ne vous fera certainement pas de mal de les connaître.

Les structures de données et les algorithmes sont simplement une chose qu'il est bon de comprendre. Et c'est quelque chose d'extrêmement clair et formalisé et donc assez trivial comparé aux subtilités de l'application ou de l'ingénierie des systèmes. Ils ne sont qu’un petit élément du puzzle, mais ils sont faciles à comprendre - si vous êtes prêt à investir un peu de temps.

Donc non, vous n'en avez pas besoin, mais ce serait uniquement pour votre bénéfice de les connaître.


13

Cela pourrait être une occasion où il peut y avoir une distinction sémantiquement significative entre «programmeur» et «ingénieur logiciel». Dans ce contexte, plus précisément, nous constatons que vous connaissez plusieurs langages de programmation et technologies associées et que vous pouvez les utiliser pour obtenir les résultats souhaités. C’est une définition opérationnelle précise de «programmeur informatique».

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

Souvent, mais pas tous les jours, mon travail consiste à trouver une solution à des problèmes complexes pour lesquels il n’existe aucune solution évidente, rien qui ne soit directement pris en compte par les caractéristiques du cadre que j’utilise ou les capacités du langage que je travaille. avec. Pour cela, je dois analyser le problème et trouver une solution. Ce processus s’applique parfois à l’architecture à grande échelle.

Bien qu’une bonne compréhension de ces problèmes plus profonds soit nécessaire pour faire ce genre de travail, cela ne suffit pas . En d'autres termes, il ne suffit pas de savoir comment une table de hachage fonctionne ou pourquoi un tri de tas a de bonnes caractéristiques de performances pour être un architecte de systèmes ou un ingénieur en chef. C'est le point de départ logique, et à partir de là, vous pouvez commencer à creuser plus profondément, à voyager plus largement et à acquérir l'expérience nécessaire pour aborder des problèmes plus vastes.

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

Si vous voulez progresser dans votre carrière et que vous en avez la passion essentielle, vous devez embrasser ces sujets aussi étroitement que possible. Si vous avez du temps pour travailler dessus, avec 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 le tri rapide. Le sentiment d’excitation et de découverte a jalonné le cap pour le reste de ma vie, et je ne saurais en être plus reconnaissant. Maintenant, je ne peux pas imaginer faire autre chose que d’être un ingénieur en logiciel.

Bonne chance avec tout ce que vous choisissez.


2
Il y a toujours des solutions évidentes. Ils ne font que cesser de fonctionner lorsque les exigences changent;) Je ne pense pas qu'une connaissance approfondie des algorithmes et des structures de données constitue un préalable indispensable à un bon ingénieur en logiciel. C'est juste que vous en voyez rarement un sans, car ce qu'un bon ingénieur en logiciel a, c'est une soif insatisfiable de connaissances.
back2dos

+1 Bien formulé: "Je suppose que pour répondre à votre question, vous devriez vous demander:" Qu'est-ce que je veux être? Où irai-je dans ma carrière? "
Projet de loi

12

Cela dépend à quoi servent les emplois. Ce genre de choses est assez classique, mais pas assez imaginatif et ne concerne probablement pas du tout le travail - certainement pas un travail utilisant les technologies que vous avez énumérées.

Pour moi, les questions d'entrevue sont une bonne idée de la question de savoir si vous avez obtenu un diplôme en informatique (et vous en souvenez) plutôt que d'une quelconque mesure de la capacité ou des connaissances générales en matière de programmation.

Je suggèrerais soit de vous familiariser avec ces informations pour pouvoir passer à travers l'interview, soit d'accepter le fait que demander n'importe où ce n'est pas pour vous, mais non, vous n'avez pas besoin de les connaître pour vous appeler un programmeur.


1
Merci pour votre réponse. Je vais partager avec vous une interview amusante, les personnes qui m'interviewaient avaient besoin de quelqu'un qui était bien du côté de l'interface utilisateur avec json css ajax javascript, jquery, etc. Ils m'ont demandé comment vous écririez un serveur Web. Et que se passe-t-il lorsque la sauvegarde est enfoncée dans un fichier Word
sushil bharwani

2
@sushil - Je pense que c'est le genre d'endroit où vous ne voulez pas travailler ...
Jon Hopkins

@sushil: Je suis totalement d' accord avec @Jon Hopkins. Mieux vaut être serveur en attente d’un bon travail que de prendre un travail comme celui-là. Avoir des idiots incompétents en tant que supérieurs vous rendra extrêmement frustré et vous ralentira dans votre développement personnel.
back2dos

6

Excellente question. Javascript ou Java ou VC ++ sont des langages de programmation super intelligents dans lesquels vous n'aurez jamais besoin de créer une liste chaînée ou une table de hachage à partir de rien. Mais vous devez toujours avoir la possibilité de décider quand utiliser l'une sur l'autre, les pénalités de performance et les bonus s'accumulent, etc.

J'ai interviewé beaucoup de programmeurs d'API, des singes de code, et dans la plupart des entretiens, ils ont rarement réussi à concevoir des systèmes efficaces en termes de performances et évolutifs. En bout de ligne: connaître des charges d'API vous apportera le pain, mais pour le beurre, vous devez commencer par les bases de l'informatique.


Merci beaucoup, je vais suivre vos conseils et commencer à apprendre sur ces sujets
Mahmoud Hossam

3

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


2

La connaissance des algorithmes vous permettent de dire avec confiance comment vos choix échelle ! Personnellement, j'estime que cela est nécessaire pour être un programmeur principal



1

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

J'ai passé beaucoup de temps à travailler dans la conception (tests, documentation, conception de code). Mais, quand je trouve un bogue (ou une mauvaise performance) ou que je dois coder une nouvelle structure de données (car l'exigence est très NOUVELLE pour l'application), je dois comprendre où est le problème dans l'algorithme et le corriger ( J'ai fait ça pas très bien, alors :))

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

Quelques liens excellents:


1

Vous êtes peut-être un bon programmeur en ce moment, mais une connaissance de la structure des données, des algorithmes et d'autres domaines de l'informatique aiderait certainement beaucoup à vous améliorer de nombreuses manières:

  • Vous pourrez peut-être être plus efficace et plus rapide dans vos tâches. Même les personnes qui ont déjà un diplôme en informatique et connaissent un grand nombre 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, si vous passez plus tard du programmeur à la piste de gestion, vous pourrez toujours mieux comprendre les aspects techniques des projets grâce à cette connaissance.

  • Bien sûr, on demande beaucoup de choses à la structure de données et aux algorithmes dans les entretiens, ce qui est une raison de plus pour laquelle il peut être utile de les connaître.


0

Vous parlez de hachages, d'arbres, de piles, de files d'attente et d'algorithmes de tri. Les technologies que vous avez mentionnées concernent principalement les pages Web et les scripts Web. Vous devez absolument au moins comprendre les arbres pour pouvoir bien travailler avec le DOM. Mais si tout ce que vous avez à faire est de créer des scripts, vous êtes probablement OK. Vous n’avez 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 cordes qui constitue l'essentiel du script Web et ce que la plupart d'entre nous considérons comme "des programmes d'écriture".

Je travaille quotidiennement avec des hachages et des arbres, et empile et fait la queue moins souvent, mais assez souvent. Le tri est fondamentalement un problème résolu; à peu près toutes les langues ont un tri rapide intégré à 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 leur fonctionnement, je pourrais probablement bidouiller des solutions de codage qui fonctionnent, mais ce ne seraient pas des solutions de très bonne qualité. Ils couraient lentement, étaient difficiles à lire et à modifier, réutiliser ou étendre. Donc, si vous voulez apprendre à être un bon programmeur, vous devez absolument lire sur vos algorithmes et vos structures de données. Ils vont vraiment améliorer la qualité de votre code.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.