Tous les problèmes de programmation sont-ils des problèmes d'algorithme? [fermé]

13

J'aime la façon dont "Introduction aux algorithmes" par Cormen et al. transmet des connaissances. L'une des raisons est que tout a à voir avec les problèmes de programmation et que le livre n'est pas implémenté dans un langage de programmation particulier. Cette indépendance linguistique met l'accent sur les idées en général.

Donc ma question est, comme il est dit dans le titre. Est-ce que chaque problème de programmation résoluble peut être résolu en pensant de cette manière algorithmique. Peu importe la langue, le domaine, etc.? Si oui, donnez des arguments, sinon, donnez des arguments!

Je n'ai pas implémenté de nombreux programmes complexes avec GUI, AI, Graphics, etc ... Mais ces types de problèmes sont-ils aussi une question de réflexion sur de bons algorithmes?

Wittgenstein
la source
6
Le problème le plus courant pour un programmeur, à mon humble avis, est: "oh, C'EST ce que tu voulais dire? Maintenant je comprends. Ce n'est pas ce que j'ai implémenté cependant, désolé". Est-ce un problème de programmation?
keppla
1
Cette question est très similaire.
back2dos
Vous devez faire un rapport avec le client, décrire ses exigences et sur cette base, vous devez concevoir, tester, implémenter, refactoriser, optimiser et maintenir le logiciel. Vous avez besoin d'environnements pour tester, développer, déployer, exécuter et mesurer le logiciel. Dans ce système, un algorithme individuel n'est qu'un détail d'implémentation.
inf3rno
@Keppla (plus un) ope, c'est un problème d'exigences, la cause première de tous les problèmes logiciels
Mawg dit de rétablir Monica

Réponses:

29

Cela dépend de la façon dont vous définissez "Problème de programmation".

Dans les projets du monde réel, la réponse est définitivement un NON clair. La plupart des problèmes ne sont même pas des problèmes techniques, mais des problèmes de communication, des exigences qui ne sont pas claires, etc.

Ensuite, vous avez des sujets entiers de classes de problèmes qui ne nécessitent pratiquement aucun algorithme. Par exemple, les interfaces graphiques sont souvent simples à "programmer", mais le problème réel impliqué est d'avoir une bonne conception (du point de vue de l'utilisabilité, pas seulement de l'apparence graphique).

Il y a certains domaines, où les problèmes ont tendance à être beaucoup plus algorithmiques de par la nature de ce champ. Par exemple, l'IA est un sujet primordial, où les algorithmes sont au cœur. Les graphiques peuvent nécessiter beaucoup d'algorithmes, mais cela dépend de ce que l'on entend exactement par "Programmation graphique".

En général, si le problème que vous résolvez par programme convient à une représentation mathématique, vous entrez dans la zone algorithmique. Bien sûr, ce n'est qu'un indicateur approximatif, car vous pouvez créer des modèles mathématiques pour à peu près tout. Mais pour la plupart des choses, vous n'envisageriez pas normalement de le faire.

Dernier exemple: si le problème est de créer une interface graphique qui permet de saisir des données pour des objets métier, vous ne pensez pas beaucoup aux formulations mathématiques. Si, cependant, le problème est de créer une interface graphique qui change dynamiquement et déplace des éléments en fonction d'une valeur d'importance, vous êtes beaucoup plus susceptible de vous retrouver avec un modèle mathématique et une implémentation algorithmique.

Franc
la source
2
Apparemment, cela dépend aussi de la façon dont vous définissez "algorithme". Je dirais que très peu de problèmes nécessitent de nouveaux algorithmes, mais que, comme un programme informatique ne comporte que deux parties - des algorithmes et des structures de données - tous les problèmes nécessitent des algorithmes, même si ces algorithmes sont triviaux. Un algorithme n'est pas un modèle mathématique, c'est une séquence d'instructions.
philosodad
C'est vrai dans son sens le plus strict, mais moi, pour ma part, n'accepte pas i++comme notre nouvel algorithme de suzerain .. euh ..
Frank
Et si nous ne savions rien sur l'addition. L'introduction de l'addition constituerait alors une grande innovation dans nos études d'algorithmes! Et ainsi de suite jusqu'à ce que nous rencontrions des algorithmes de plus en plus complexes.
CMCDragonkai
8

Qu'entendez-vous par problème de programmation?

Selon Wikipedia:

La programmation informatique (souvent abrégée en programmation ou codage) est le processus de conception, d'écriture, de test, de débogage et de maintenance du code source des programmes informatiques.

ce qui signifie que la programmation en général est intrinsèquement plus volumineuse que la traduction d'algorithmes via du code.

Pour vous donner un exemple, un problème de programmation que j'ai en ce moment est que je dois gérer un code source spaghetti hérité en ajoutant des tests unitaires, puis en le refactorisant . Cela implique également d'ajouter des commentaires aux bons endroits, de normaliser la capitalisation des noms, etc. Cela n'a rien ou peu à voir avec les algorithmes.

De la même manière, de nombreuses tâches de développeur ne sont pas liées aux algorithmes. Exemple: l'internationalisation. De la même manière, de nombreuses applications (CRUD, par exemple) n'utilisent pas trop d'algorithmes dans leur code source (sans parler du code sous-jacent du framework).

Maintenant, si vous supposez que dans "problème de programmation", "programmation" est synonyme de traduction d'algorithmes à travers du code, alors oui, logiquement tout problème serait un problème d'algorithme: A × n = B × nsi A = B.

Arseni Mourzenko
la source
Il y a une différence entre une tâche et un problème . Votre problème n'est pas d'ajouter des tests unitaires ou de maintenir le code hérité, c'est la solution au problème qui réside dans la base de code, pas le comportement du programme lui-même que le code représente par des algorithmes.
zxcdw du
Votre tâche, comme décrit, ne modifie pas le comportement du programme. Vraisemblablement, c'est un travail préparatoire pour d'autres changements, qui pourraient ou non impliquer des algorithmes. Je ne pense pas que quiconque soit payé pour refactoriser le code de travail toute la journée.
MarkJ
6

Je pense que la réponse est catégoriquement non . Les algorithmes ne sont que des blocs de construction dans un ensemble de compétences beaucoup plus large.

J'ai obtenu mon diplôme en CS, spécialisé en IA

Là, le problème fondamental, du moins tel que je l'ai vu, était de trouver de bonnes représentations pour l'information. Ces représentations devraient essayer d'être de bonnes correspondances avec les structures de connaissances qui sont dans la tête des gens, et devraient faciliter les types de manipulations et de modifications qui y sont faites.

En termes de programmation au jour le jour, cela signifie que le problème de base est d'identifier le langage spécifique au domaine (DSL) adapté à la situation actuelle. Il existe de nombreuses façons de créer des DSL. La programmation ordinaire, où les classes, les variables et les méthodes sont définies, crée en fait un DSL car elle vous permet de dire des choses (mapper vos structures mentales au code) que vous ne pourriez pas dire sans elles.

Les algorithmes sont également importants, mais ils ne sont qu'une partie de l'histoire.

Mike Dunlavey
la source
5

Je suppose que vous pourriez dire que tous les programmes informatiques sont des algorithmes, car vous prescrivez une séquence d'instructions pour obtenir le résultat souhaité. Cependant, certains des problèmes les plus difficiles ne sont pas liés à la communication d'un programme à un ordinateur, mais à la communication d'un programme à des humains qui testeront et modifieront le logiciel.

En d'autres termes, les ordinateurs se moquent de savoir si votre code est complètement incompréhensible pour les humains. Ils le feront très bien de toute façon. Le défi consiste à rendre le code suffisamment clair pour que tous les bogues ressortent comme un pouce endolori.

Fait intéressant, les choses techniques que j'ai apprises au collège sur les algorithmes ont longtemps été éclipsées par ce que j'ai appris par moi-même depuis lors. À ce stade, si je voulais obtenir un 3e diplôme universitaire pour m'aider dans mon travail, ce serait en composition anglaise.

Karl Bielefeldt
la source
2

La plupart des problèmes de programmation sont en fait des problèmes d'administration système.

C'est une sorte de réponse désinvolte, mais j'ai trouvé que c'est vrai plus souvent qu'on ne pourrait s'y attendre. Je ne sais pas combien de fois j'ai rencontré des échecs parce que DNS a été mal configuré sur la machine de test, un processus obsolète est toujours en cours qui accapare CPU / mémoire / ports, le programme fonctionne avec le mauvais ID utilisateur et a donc le mauvais autorisations, le disque a été partitionné de manière incorrecte et donc l'espace est épuisé, la mauvaise version du fichier de configuration a été installée, etc.

Obtenir les bons algorithmes n'est généralement qu'une petite partie du problème. Le reste du problème consiste à mettre le programme au travail pour résoudre de vrais problèmes dans le monde réel.

Marques Stuart
la source
"Obtenir les bons algorithmes n'est généralement qu'une petite partie du problème" Les problèmes sur kaggle.com NE correspondent PAS à cette description.
Gandalf
Je suis d'accord, je viens de les mettre dans la catégorie "plomberie". Travailler avec les services d'autres programmeurs, l'API et parfois les frameworks, c'est simplement connecter les choses comme quelqu'un d'autre pensait qu'elles devraient fonctionner.
JeffO
2

Je pense que oui, tous les problèmes de programmation peuvent être résolus en pensant de manière algorithmique. Après tout, un algorithme n'est qu'un ensemble d'instructions qui indique à l'ordinateur quoi faire.

Prenant certains des exemples ci-dessus

Par exemple, les interfaces graphiques sont souvent simples à "programmer", mais le problème réel impliqué est d'avoir une bonne conception (du point de vue de l'utilisabilité, pas seulement de l'apparence graphique).

En termes de programmation et même de conception, vous connaîtrez les modèles / règles qui conduisent à des conceptions GUI efficaces, conviviales et efficaces. Ces règles doivent être réduites à un algorithme qui, s'il est suivi, devrait aider à produire une interface graphique conviviale. En fait, les étapes réelles de placement des contrôles sur l'interface graphique peuvent également être réduites à un algorithme

Pour vous donner un exemple, un problème de programmation que j'ai en ce moment est que je dois gérer un code source spaghetti hérité en ajoutant des tests unitaires, puis en le refactorisant. Cela implique également d'ajouter des commentaires aux bons endroits, de normaliser la capitalisation des noms, etc. Cela n'a rien ou peu à voir avec les algorithmes.

Mais la manière dont vous envisagez d'ajouter des tests unitaires peut être décrite par un algorithme tel que

  1. Identifier un nouveau test unitaire
  2. Écrire un test unitaire
  3. Appliquer l'algorithme de normalisation de la capitalisation
  4. Appliquer l'algorithme des commentaires

Exemple: internationalisation Ceci est un parfait exemple d'une solution d'algorithme. Comme c'est le plus simple, vous recherchez un mot connu dans un dictionnaire et le remplacez par une forme de langue différente. (Bien sûr, la vraie vie implique des phrases et du contexte et l'algorithme peut impliquer des étapes pour vérifier avec des locuteurs natifs mais les bases restent vraies)

Le problème avec la plupart des réponses Oui est que les gens pensent aux algorithmes en termes de tri rapide, de tri par bulles au lieu d'un ensemble d'instructions qui réduit une description vague et verbeuse d'un problème à un ensemble de logiques / règles clairement définies.

armitage
la source