Dois-je continuer à investir dans des structures de données et des algorithmes? [fermé]


28

Ces jours-ci, j'investis massivement dans les structures de données et les algorithmes et j'essaie de résoudre certains casse-tête de programmation.
J'essaie de coder et de résoudre avec Java et Clojure.

Suis-je en train de perdre mon temps? dois-je investir davantage dans des technologies et des frameworks que je connais déjà afin d'acquérir des connaissances plus approfondies (les tenants et les aboutissants) et pouvoir coder avec eux plus rapidement?

En étudiant les structures de données et les algorithmes, vais-je devenir un meilleur programmeur ou ces sujets ne sont-ils importants que pendant les années collégiales?


5
Avec quelles structures de données et algorithmes travaillez-vous? Sur quels puzzles de programmation les utilisez-vous?
oosterwal

Je travaille / je travaille encore sur des tables de hachage, des cartes, des tas, des graphiques, des arbres et les algorithmes associés (traverser, hacher, rechercher, insérer, supprimer et certains algorithmes de tri). Les puzzles proviennent des compétitions TopCoder et Google Code Jam.
Chiron

Réponses:


24

Il est tout à fait possible de consacrer la majeure partie / la totalité de votre carrière à un travail important et utile, avec une connaissance minimale des algorithmes et des structures de données.

Le niveau minimum de connaissance des algorithmes et des infrastructures de données, pour réussir, vous obligera à:

  • être au courant de la plupart d'entre eux (y compris en lire occasionnellement de nouveaux à mesure qu'ils sortent)
  • savoir où trouver de bonnes implémentations éprouvées et fonctionnelles
  • être capable de comparer les algorithmes et leur utilité
  • pouvoir en copier correctement un à partir d'un exemple open-source dans votre environnement spécifique, avec un peu de peaufinage

Il n'y a pas de * maximum * . Si vous le souhaitez, vous pouvez porter votre étude au niveau du doctorat et au-delà. Son utilité est directement liée au type d'emplois qui vous intéressent et au type de travail que vous trouvez le plus intéressant et le plus gratifiant.

Cela dit, à titre indicatif (mais pas absolu), plus le langage, le cadre et l'application sur lesquels vous travaillez seront bas, plus gourmands en ressources et moins automatisés, plus le niveau de compétence requis sera élevé aux algorithmes et aux structures de données. Par exemple, implémenter l'algorithme d'Ukkonen dans l'assemblage signifiera probablement, mais pas nécessairement, une maîtrise de l'algorithme et des structures de données impliquées.

Dans votre situation spécifique, passant d'un environnement de développement Java à un travail sur les iO, toutes choses étant égales par ailleurs, attendez-vous à une demande légèrement plus élevée sur votre compréhension générale des algorithmes et des structures de données. Vous voudrez pouvoir exécuter efficacement sur un appareil avec moins de ressources disponibles. Attendez-vous également à ajouter quelques nouvelles catégories à votre arsenal - plus particulièrement, vous voudrez en savoir plus sur la gestion de la mémoire.


2
Tout à fait d'accord. Je n'ai presque jamais à traiter directement d'algorithmes car la grande majorité de ceux nécessaires sont déjà inclus dans les bibliothèques de base. Mais je serais en difficulté si je ne comprenais pas suffisamment les caractéristiques de performance pour choisir l'algorithme ou la structure appropriée pour un cas d'utilisation particulier. OP, à moins que vous ne vouliez travailler dans des algorithmes, vous pouvez obtenir un retour sur investissement beaucoup, beaucoup , bien meilleur pour le temps passé à apprendre d'autres bibliothèques et outils et techniques.
quentin-starin

1
Ugh, écrire l'algorithme d'Ukkonen en Python est déjà assez difficile, je peux même commencer à imaginer le faire en assembleur.
rjzii

2
Cela relève du point «comparer les algorithmes», mais je voulais juste préciser que vous devez connaître le compromis entre la complexité de l'espace et du temps. De nombreux algorithmes couramment utilisés sur les ordinateurs de bureau en raison de leur vitesse peuvent ne pas être réalisables sur iOS car ils nécessitent de grandes structures de données.
Karl Bielefeldt

3
Je ne suis pas d'accord. La raison simple est que lorsque quelqu'un passe du temps à apprendre les algorithmes ou la conception ou l'architecture, il ne s'agit pas seulement de savoir quand / où il va l'utiliser. Cela rend simplement la personne plus intelligente et il pourrait utiliser l'apprentissage tout en résolvant d'autres problèmes. Cela encourage également le sentiment de faire les choses de manière optimale. Par exemple. il n'y a peut-être pas d'algorithme fait à la main pour tout, mais comme vous savez beaucoup de choses, vous pourriez venir avec quelque chose d'exceptionnel par vous-même.
Geek

14

Non. Si vous débutez, essayez de vous familiariser avec des choses comme la programmation d'interface utilisateur et tout cela vous retient. Finalement, vous devez vous y rendre et apprendre des cadres plus larges ... comment utiliser les structures de données et les algorithmes qu'AUTRES personnes ont écrits. Lorsque vous débutez, il est bon de s'en tenir aux problèmes de portée limitée.

Les algorithmes et les structures de données sont fondamentalement la base de tout, même si vous n'écrirez probablement jamais l'un des vôtres une fois que vous aurez passé le stade de débutant. Les connaître, ou du moins les avoir connus, fera de vous un meilleur développeur au final. Vous saurez quand et pourquoi les utiliser car vous saurez COMMENT ils fonctionnent. De plus, rendre vos algorithmes et structures de données génériques afin qu'ils puissent fonctionner avec n'importe quel type ou type avec l'interface X EST vraiment quelque chose que vous utiliserez pour le reste de votre carrière.

Je vois trop de gens sauter dans des choses comme Qt qui finissent par poser des questions qui ne montrent aucune connaissance du C ++ (par exemple). Ils essaient de sauter trop d'étapes et à la fin cela leur prend plus de temps pour apprendre. Je dirais que tu es sur la bonne voie.


Je fais de la programmation Java professionnellement (étant employé, je veux dire) depuis 2007. Maintenant, je vais (au moins j'espère) faire du développement iOS.
Chiron

9

Vous ne perdez pas votre temps.

Si, au cours de votre travail, vous devez utiliser un outil ou un cadre que vous n'avez pas utilisé auparavant, vous l'apprendrez et vous l'utiliserez.

Cependant, si vous devez utiliser une structure de données ou un algorithme que vous n'avez pas utilisé auparavant, il est probable que vous ne saurez même pas qu'il existe, et vous résoudrez votre problème en utilisant une technique horriblement sous-optimale qui prend beaucoup plus l'effort et les échelles terriblement.

Ce que j'essaie de dire, c'est le genre de choses que vous n'apprendrez pas seulement en faisant, vous devez l'apprendre en apprenant , soit dans une situation académique, soit par un investissement personnel d'effort, car vous êtes en train de faire maintenant.


6

Dans la pratique, sachez quelles sont les structures de données disponibles, quelles sont leurs caractéristiques de complexité, où en obtenir de bonnes implémentations et où vous conservez votre copie d' Introduction aux algorithmes pour consulter les détails plus tard.


1

Si c'est ce qui vous rend heureux, vous devez absolument vous y tenir. Si vous craignez de ne pas appliquer suffisamment de théorie, envisagez un projet lourd en théorie. Créez un petit langage de programmation, comme Potion , à partir de zéro. Une implémentation complète utilisera des tables de hachage, des graphiques, des arbres et un large éventail d'algorithmes. Si cela semble intéressant, vous pouvez approfondir l'optimisation, la génération de code natif ou l'extensibilité utilisateur.

Vous deviendrez un meilleur programmeur lorsque vous restez intéressé et concentré, pas lorsque vous travaillez sur des projets qui semblent pratiques mais un peu ennuyeux.

Au fond du terrier du lapin, Dorothy!


1

J'ai passé beaucoup de temps à pirater en C / C ++ avec OpenGL. Je connais assez bien les langages et l'API ... et je suis devenu un développeur et programmeur raisonnable à cause de cette expérience. Cela dit, les connaissances algorithmiques réelles nécessaires pour résoudre les différents problèmes rencontrés ne sont que vraiment en mesure de comprendre.

Parlant d'expérience personnelle, se concentrer sur la création d'applications va être une perte de temps si vous ne connaissez pas la théorie derrière les domaines problématiques qui se rapportent à ce que vous essayez de construire.

Pour de nombreux types de logiciels différents, ces domaines découleront des principes fondamentaux que vous apprendrez en étudiant les algorithmes, en plus de leur propre théorie spécifique basée sur une niche (par exemple, l'algèbre linéaire en infographie, la théorie des nombres / informations en cryptographie, etc.).

Vous n'avez pas nécessairement à devenir un sorcier en informatique derrière tout, mais faire ce que vous faisiez au moment de ce post est un chemin très, très nécessaire pour descendre au moins une fois dans votre parcours de programmation - indépendamment du fait que ils ne sont pas autodidactes.


0

Je suppose que si vous ne les connaissez pas bien, vous ne trouverez aucune raison de les utiliser. Il me semble que je leur trouve tout le temps des utilisations. Mais je dois admettre qu'avec les améliorations apportées aux génériques au cours de la dernière demi-douzaine d'années, le besoin de rouler le vôtre se produit de moins en moins fréquemment. Cela ne supprime toujours pas les avantages de savoir comment et quand les utiliser et ils peuvent grandement simplifier le code autrement compliqué.

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.