Le concept de complexité informatique est-il important pour les développeurs de logiciels? [fermé]

11

J'avais l'impression que les notions de temps et de complexité de la mémoire sont un incontournable pour les diplômés des cours de compsci, mais après avoir étudié l'ingénierie, je n'ai aucune connaissance si c'est le cas. J'ai récemment été surpris d'interviewer des diplômés d'un collège local qui ne connaissent même pas le concept. Je suppose que ma question est:

Le concept de complexité informatique est-il important pour les développeurs de logiciels? Et devrait-il être enseigné dans les cours de premier cycle?

Muhammad Alkarouri
la source
1
Pour expliquer la question à l'aide d'un exemple: les diplômés que j'ai rencontrés ne savent pas ce que cela O(n^2)signifie.
Muhammad Alkarouri
1
Question connexe intéressante: programmers.stackexchange.com/q/20832/6184
Muhammad Alkarouri

Réponses:

12

Dans la plupart des universités, je suppose (j'espère!) Que la complexité du temps et de la mémoire fait définitivement partie de leurs cours.

Or, ces «complexités» sont un sujet très élastique. Si les gens devraient vraiment connaître toute la théorie comme "ZPP est la classe de complexité des problèmes de décision qui peuvent être résolus sans erreur sur une machine de Turing probabiliste en temps polynomial." et ce genre de choses est discutable. Personnellement, je considère que ces théories avancées ne sont pas pertinentes pour le développement de logiciels.

Au contraire, je considère que chaque développeur doit être conscient de la complexité spatio-temporelle des structures de données et des algorithmes qu'il utilise.

dagnelies
la source
8

De nombreux débutants souffrent d'obsession de la micro-optimisation. Apprentissage comp. la complexité oriente les étudiants vers une manière beaucoup plus pratique d'estimer les performances et l'évolutivité, selon mon expérience.

mpartel
la source
6

D'après ce que j'ai vu, il semble que la notation big-O et la complexité du temps et de la mémoire soient beaucoup soulignées dans l'enseignement formel de l'informatique ... mais étant autodidacte, cette perception est basée sur l'audition et la lecture de ce que les personnes ayant de telles formations Dire et écrire.

Bien que je pense que les idées et les concepts généraux sont importants, je ne crois pas que leur formalisation (comme la notation big-O et la terminologie variée) soit aussi importante, sauf à des fins de communication. Ce n'est pas parce que quelqu'un n'est pas familier avec la notation formelle et la terminologie qu'il ne peut pas voir comment et pourquoi un algorithme serait plus rapide qu'un autre dans un cas particulier. Les gens peuvent voir que le temps pris pour rechercher un arbre binaire équilibré se rapporte au logarithme en base 2 du nombre de nœuds sans d'abord se renseigner sur la théorie de la complexité dans un sens formel, s'ils comprennent comment l'arbre fonctionne et ont une compréhension raisonnable de haute mathématiques à l'école. Il est important de savoir quand prêter attention à la complexité et à l'utilisation de la mémoire, et à considérer les cas typiques et les pires, mais ... mais certaines personnes ne le font pas.

La notation et la terminologie deviennent importantes pour la communication. Ils donnent un bon moyen de transmettre une quantification des performances d'un algorithme à quelqu'un d'autre. Parce qu'il revient fréquemment dans les articles et les explications, il est utile d'en avoir au moins une compréhension vague afin qu'ils soient plus faciles à suivre.

Alors oui, les concepts sont importants (mais moins quand les ressources et le temps sont importants mais que les données ne le sont pas). Mais bien que les concepts soient importants, leur formalisation n'est souvent pas si importante - et il faut se rappeler que la notation et la terminologie ne sont pas les mêmes que les concepts eux-mêmes.

Éditer:

Je ne prétendrais pas comprendre les concepts avec autant de détails que quelqu'un qui a étudié formellement, mais beaucoup d'idées générales ont tout simplement du sens. Je pense vraiment qu'il est utile d'étudier officiellement cela, mais une partie de cette valeur peut encore exister sans.

En ce qui concerne l'introduction des concepts (en dehors de l'étude formelle), je pense qu'un bon début est d'encourager les gens à réfléchir à la quantité de mémoire disponible des structures de données, aux étapes des algorithmes et à la façon dont ces choses changent avec différentes données.

Cela aide également à considérer des situations hypothétiques et des changements, comme considérer ce qui se passe si un arbre est équilibré par rapport à ce qui se passe s'il est aussi déséquilibré que possible, ou combien de niveaux dans l'arbre la plupart des nœuds seraient, ou combien de nœuds supplémentaires il peut maintenez si la profondeur est augmentée d'un niveau. Cette façon de penser est généralement utile aux programmeurs de toute façon, pas seulement quand on regarde la complexité; et s'il est appliqué à la réflexion sur la façon dont les algorithmes et les structures de données fonctionnent dans des circonstances différentes, il va naturellement dans le même sens qu'un examen plus formel de la complexité.

Dmitri
la source
Vue alternative intéressante. Pouvez-vous expliquer comment introduisez-vous les concepts? Ou comment avez-vous pu les comprendre? Cela pourrait indiquer une autre façon d'obtenir la compréhension nécessaire.
Muhammad Alkarouri
1
@MuhammadAlkarouri J'ai modifié ma réponse pour y répondre un peu.
Dmitri
4

Oui

Comprendre les bases de la complexité est important et devrait être quelque chose que vous apprenez au premier cycle. En fait, je pense qu'il est généralement abordé dans n'importe quelle classe vous enseigne sur les structures de données. Je peux comprendre que les diplômés ne comprennent pas ou ne se souviennent pas, mais je ne vois pas qu'ils n'aient pas appris les rudiments de la complexité.

Mise à jour: pourquoi est-ce important

J'étais sur une migration de base de données à un travail particulier. Nous avions un délai pour le moment où la migration devait se faire. La personne qui a écrit le script n'avait aucune connaissance de la complexité. Malheureusement, personne d'autre n'a regardé de près la logique qu'il a utilisée dans le script. Je ne me souviens pas des détails autres qu'il a utilisé une boucle doublement imbriquée au lieu d'une table de hachage. Après une semaine de fonctionnement continu du script, nous avons regardé la logique, réalisé le problème. Il a fallu quelque chose comme 5 heures pour terminer après le changement. Nous avons presque manqué la date limite pour l'achèvement de la migration car quelqu'un ne comprenait pas la complexité.

Le fait est qu'il est facile de ralentir accidentellement quelque chose qui est des ordres de grandeur plus lent, ou qui manquera toujours de mémoire avant la fin du travail. Alors que des machines plus rapides avec plus de mémoire peuvent atténuer les petites erreurs, elles ne peuvent souvent pas atténuer les problèmes de complexité.

Dietbuddha
la source
Mais encore, la question est "est-ce important?". Parce que même s'ils parcourent la liste des paires, cela signifie-t-il que le produit final ne fait pas ce qu'il devrait? Est-ce à dire que c'est lent? Cela signifie-t-il qu'ils n'ont pas effectué le travail pour lequel ils sont payés?
Yam Marcovic
Si le programme devait se terminer dans 2 jours, mais durerait à la place 2 ans, je dirais qu'ils n'ont pas accompli le travail pour lequel ils étaient payés.
dietbuddha
Le problème tel que vous l'avez décrit n'était pas tant un problème de mauvais développeur, mais plutôt un problème dans le processus de prise de décision qui a conduit un programmeur non qualifié à être en charge d'un tel programme.
Yam Marcovic
Ou peut-être un processus décisionnel qui conduit à embaucher une personne non qualifiée pour programmer en tant que «développeur de logiciels» au lieu de «développeur de logiciels junior» ou «stagiaire».
dietbuddha
3

Je trouve que demander si c'est "important ou non" est assez vague.

Vous trouverez de nombreuses personnes évangélisant sur la façon dont chaque petite parcelle de connaissance dans ce monde est strictement requise à leur avis. Mais c'est un peu inutile, car on ne peut jamais tout savoir, et on ne devrait pas s'y attendre à moins que cela aide à répondre aux exigences de son travail. Je préfère adopter une approche plus pragmatique des prérequis éducatifs, en général, à moins que ce soit une question de loisir ou de préférence personnelle arbitraire.

Est-il important pour les programmeurs qui sont censés écrire du code extrêmement efficace ou des algorithmes d'infrastructure innovants? Oui.

Est-ce important pour les programmeurs qui développent des applications Web conventionnelles? Ils peuvent s'en passer ou obtenir des implémentations efficaces dans le monde open source.

Est-ce important pour les programmeurs qui développent des interfaces graphiques pour les applications? Probablement pas, car les cadres GUI réussis résument tous ces petits détails.

C'est toujours agréable à savoir, comme n'importe quoi, mais cela n'empêche pas beaucoup (ou même la plupart) de programmeurs de simplement faire leur travail à la satisfaction de leurs employeurs.

D'un autre côté, si l'on s'inscrit à des études supérieures, à la recherche d'un enseignement fondamental et théorique, il faut s'attendre à apprendre des matières par définition plus théoriques que pratiques. À mon avis, il est essentiel que CompSci. les étudiants apprennent la complexité, tout comme il est important qu'ils apprennent le calcul.

Mais de toute façon, depuis quand CompSci. programmes enseignent aux gens comment être de bons programmeurs? Pour cela, vous avez des programmes de formation spécialisés et une expérience pratique (que ce soit le vôtre ou vos collègues programmeurs qui peuvent partager le leur avec vous).

Yam Marcovic
la source
1
La deuxième partie est probablement moins vague: doit-elle être enseignée aux étudiants de compsci au niveau BSc?
Muhammad Alkarouri
1
J'ai également modifié mon message pour répondre à cette question.
Yam Marcovic