Pourquoi est-il préférable pour un programmeur de concevoir l'algorithme avant de commencer à écrire le code?

12

Un algorithme approprié aide-t-il vraiment à améliorer la qualité et, finalement, l'efficacité d'un programme?

Peut-on encore produire un programme de bonne qualité sans l'algorithme?

Un algorithme approprié est-il un MUST dans la programmation moderne?

Jervis
la source
5
Par définition, il existe un algorithme, même s'il est si mauvais qu'il est bon .
5
Je n'ai pas d'autre choix que de pilonner du code plutôt que de trop réfléchir. La plupart du temps, il n'y a pas d'algorithme glorieux selon les normes; J'essaie juste de polir une merde puante;)
Job
13
Je ne peux pas croire que ce soit une question sérieuse. Voir en.wikipedia.org/wiki/Algorithm
Steven A. Lowe
2
Le titre est raisonnable, mais le texte de la question l'est moins. Je pense qu'il demande si l'algorithme doit être cloué avant que l'on puisse commencer à écrire du code réel.
Greg
9
Je dis non ... il vaut toujours mieux conduire sans but jusqu'à ce que vous trouviez votre destination par accident ou à court d'essence.
jmq

Réponses:

29

Je pense que cette question appelle une perspective historique.

À l'époque "d'antan" (dont je ne suis pas un témoin personnel, ce n'est donc que ma reconstruction de cette époque - n'hésitez pas à me corriger si vous avez vécu les choses différemment) L'espace matériel et les performances étaient nuls par rapport à aujourd'hui. Donc, tout ce que les gens écrivaient devait être très efficace. Ainsi, ils devaient réfléchir et rechercher pour inventer les meilleurs algorithmes pour atteindre les performances spatio-temporelles nécessaires pour faire le travail. Un autre facteur était que les développeurs travaillaient principalement sur ce que vous pouvez appeler l' infrastructure : systèmes d'exploitation, piles de protocoles, compilateurs, pilotes de périphériques, éditeurs, etc. Tout cela est beaucoup utilisé par beaucoup de gens, donc les performances font vraiment une différence .

De nos jours, nous sommes gâtés d'avoir un matériel incroyable avec des processeurs multicœurs et des gigaoctets de mémoire, même dans un ordinateur portable de base (diable, même dans un téléphone mobile). Ce qui signifie naturellement que dans de nombreux cas, les performances - donc l'algorithme - ont cessé d'être le problème central, et il est plus important de fournir une solution rapidement que de fournir une solution rapide. OTOH, nous avons des tas de frameworks qui nous aident à résoudre les problèmes et encapsulent un grand nombre d'algorithmes en même temps. Donc, même lorsque nous ne pensons pas aux algorithmes, nous pouvons très bien en utiliser beaucoup en arrière-plan.

Cependant, il y a encore des domaines où la performance compte. Dans ces domaines, vous devez toujours réfléchir à vos algorithmes avant d'écrire du code. La raison en est que l'algorithme est le centre de la conception, déterminant un grand nombre de structures de données et de relations dans le code environnant. Et si vous découvrez trop tard que votre algorithme ne se met pas à l'échelle correctement (par exemple, il est O (n 3 ), il avait l'air bien et rapide lorsque vous l'avez testé sur 10 éléments, mais dans la vraie vie, vous en aurez des millions), il est très difficile, sujet aux erreurs et prend du temps pour le remplacer dans le code de production. Et les micro-optimisations ne vont pas vous aider si l'algorithme fondamental n'est pas adapté au travail.

Péter Török
la source
1
Quelle réponse. J'ai le privilège de vous avoir ici !!!
Jervis
5
De plus, l'ordinateur était beaucoup plus cher que le programmeur, il était donc logique de faire travailler le programmeur plus dur!
2
Vous avez raison de dire que ce que nous optimisons a changé. Mais nous devons maintenant manipuler des systèmes beaucoup plus complexes que les gens à l'époque. Un manque de réflexion sur la planification, l'organisation et la maintenance vous tuera toujours.
btilly
1
@btilly, je conviens qu'il est très important de planifier à l'avance (autant que possible - mais pas plus) et de penser à la maintenance à l'avance. Cependant, cela ne signifie pas nécessairement passer beaucoup de temps sur la conception d'algorithmes. Par exemple, si une fonction est exécutée une fois par mois et prend une heure pour se terminer, il est probablement exagéré de passer des jours sur le réglage de l'algorithme, même si vous parvenez à réduire son temps d'exécution à 10 minutes. Les avantages ne justifient tout simplement pas le coût.
Péter Török
2
Deux choses: Premièrement, l'algorithme peut déterminer dans quelle mesure le programme évolue, et c'est souvent important. Deuxièmement, de nombreux logiciels sont exécutés en parallèle sur les serveurs de nos jours. Cela signifie que, si le programme Z est modifié pour s'exécuter deux fois plus vite, celui qui l'exécute a besoin de moitié moins de serveurs Z.
David Thornley
14

Juste pour signaler quelque chose:

Un algorithme est en soi une solution générale étape par étape de votre problème. Donc, si vous avez résolu le problème, vous avez en fait utilisé un algorithme.

Le point le plus important ici est que vous devez utiliser des algorithmes pour résoudre le problème, d'une manière ou d'une autre. La plupart du temps, il est préférable de réfléchir à votre problème avant de passer au codage - cette phase est souvent appelée conception. Mais combien et de quelle manière allez-vous le faire dépend de vous.

De plus, vous ne devriez pas mélanger le concept d'algorithme avec des organigrammes (je soupçonne que cela se passe ici). Les organigrammes ne sont qu'une représentation graphique qui peut être utilisée et a été utilisée dans les anciens jours pour illustrer un algorithme. Il est à peu près obsolète de nos jours.

ÉDITER:

Il existe en effet de nombreuses façons de représenter un algorithme et le code du langage de programmation lui-même en fait partie. Cependant, bien souvent, il est beaucoup mieux ou plus facile de ne pas résoudre tout le problème en même temps, mais juste un plan, puis de remplir les blancs au fur et à mesure.

  • Mon préféré ici est le pseudo-code, et uniquement pour couvrir un aperçu abstrait général de l'algorithme en question - c'est ridicule d'entrer dans les détails avec le pseudocode , c'est à cela que sert le vrai code.

  • Mais le vrai code peut être utilisé pour le contour. Par exemple, les gens de TDD aiment concevoir l'algorithme comme ils codent, et comme ils ne peuvent pas tout résoudre en même temps, ils conçoivent un aperçu de l'exécution du programme en code réel, et utilisent des objets fictifs (ou des fonctions, des méthodes .. .) sous forme d'espaces à remplir ultérieurement.

  • Les diagrammes d'activité UML semblent être une incarnation moderne d'organigrammes à l'ancienne avec une notation ajoutée pour les nouveaux trucs comme le polymorphisme et le multithreading. Je ne peux pas vraiment dire à quel point c'est utile, car je ne les ai pas beaucoup utilisés - je le mentionne simplement pour être complet.

  • De plus, si vous basez votre algorithme sur la commutation entre les états, un diagramme d'état est très utile.

  • En règle générale, tout moyen que vous devez simplement esquisser l'idée derrière un certain algorithme est une bonne façon de procéder.

Goran Jovic
la source
Il existe différentes façons de présenter son algorithme, que recommandez-vous? Et pourquoi?
Jervis
@Jervis: Voir ma mise à jour, j'ai énuméré certains d'entre eux.
Goran Jovic
Où est le lien?
Jervis
4

Une bonne analogie est que vous devez connaître une recette avant de commencer à cuisiner. Ok, vous pouvez le modifier au fur et à mesure, mais vous devez toujours savoir ce que vous voulez faire avant de commencer. Si je veux faire un ragoût d'agneau, je ferai des choses très différentes que si je veux faire une miche de pain.

Zachary K
la source
Algorithme = idées ???
Jervis
Algorithme == recette !!
Mais différents chefs ont des façons de cuisiner différentes selon la même recette.
Jervis
Bien sûr, quand je fais cuire du pain, ça sort différemment de quand ma femme fait du pain. Mais les parties de base sont les mêmes (farine, eau, levure, sel)
Zachary K
il y a aussi des magasins où vous pouvez simplement acheter une miche de pain faite par un boulanger professionnel
jk.
3

Le code implémente des algorithmes. Essayer d'écrire du code sans avoir conçu l'algorithme, c'est comme essayer de peindre une maison avant la construction des murs. Les algorithmes sont un "MUST" depuis le début de la programmation.

Jerry Coffin
la source
D'ACCORD. Peindre une maison est aussi simple qu'ABC, vous pouvez commencer à planifier sans l'existence de la maison.
Jervis
2
@Jervis: De même, vous pouvez planifier certaines parties de code sans spécifier l'algorithme pour d'autres parties (par exemple, vous pouvez décider qu'il y aura une fonction pour trier les données sans décider comment cela fonctionnera - mais vous devez décider au moment où vous écrire le code de tri).
Jerry Coffin
1
Je préfère l'analogie de peindre un tableau plutôt que de peindre une maison. Si tout mon codage était comme peindre une maison, je trouverais un autre emploi. Et peindre une image peut être itératif. Je commence souvent le prototypage en code réel avant que l'algorithme ne soit complètement clair pour moi. Le plus souvent, en fait.
Greg
3

La maîtrise de votre langue contribue à améliorer la qualité et la productivité. Et résoudre de petits problèmes algorithmiques est beaucoup plus utile pour cela que de répéter 100 fois la même chose MVC.
Bien, je suppose qu'il existe d'autres façons d'atteindre la maîtrise.

L'algorithme deviendra-t-il un MUST dans le domaine de la programmation moderne?
C'est déjà un «must», sauf si vous êtes un «php ninja» qui écrit «cool codez». Toutes les «meilleures» entreprises (Google, Amazon, etc.) testent votre expérience algorithmique en interview, et j'imagine qu'elles ne le feraient pas sans raison.

Mais pour revenir au point d'origine, vous devez constamment vous mettre au défi si vous voulez vous améliorer. Et comme les tâches normales (alias "écrire maintenant des gestionnaires CRUD pour 100 objets supplémentaires") ne fournissent pas toujours un bon défi, les algorithmes compensent cela.

Nikita Rybak
la source
1

Je dirais que vous avez besoin d'au moins une idée initiale d'un algorithme avant de commencer à coder. Vous réviserez probablement votre idée tout en codant en fonction des structures de données, etc.

Plus tard, vous pouvez réviser à nouveau le code si le profilage suggère qu'il existe un problème de performances dans ce domaine.

Richard Miskin
la source
1

La raison en est qu'il est plus rapide de corriger les erreurs avant d'avoir écrit le code erroné.

Plus prosaïquement, il y a régulièrement des différences de productivité mesurées de 10 à 1 entre les différents programmeurs. Lorsque vous regardez les programmeurs qui sont au niveau de productivité 10 fois, ils passent la plus petite fraction de leur temps à coder. Le temps de taper du code ne doit pas être le goulot d'étranglement. Au lieu de cela, ils passent une plus grande partie de leur temps à s'assurer qu'ils ont des exigences claires, à planifier, à tester, etc.

Inversement, lorsque vous regardez les programmeurs qui plongent dans le codage sans pause, ils doivent inévitablement écrire le code encore et encore car ils rencontrent des problèmes entièrement prévisibles, et le résultat final est moins maintenable et plus bogué. (Soit dit en passant, vous saviez qu'en moyenne 80% de l'argent dépensé pour le développement de logiciels est dans la phase de maintenance? Rendre les choses maintenables. Beaucoup.)

btilly
la source
Vous avez absolument raison.
Jervis
1

Généralement, les algorithmes et les structures de données d'abord, le code plus tard. Mais cela dépend beaucoup du domaine de programmation. J'avais l'habitude de faire beaucoup de choses de type mathématique appliqué et j'ai vraiment regardé le modèle de cascade alors répandu. En effet, les algorithmes de bas à moyen niveau pouvaient rarement être tenus pour acquis. Concevez une grande structure autour de l'existence de sous-systèmes non écrits, puis découvrez à la fin du jeu que les calculs pour l'un de ces sous-systèmes cruciaux ne fonctionnent pas (est instable ou autre). J'ai donc toujours pensé aux sous-systèmes les plus difficiles en premier, et s'il y avait une raison de douter, je les ai écrits et testés en premier. Mais, pour certains domaines problématiques, vous pouvez simplement avancer sans trop de planification.

Omega Centauri
la source
Je suis d'accord avec toi.
Jervis
Vous parlez ici de la différence entre la conception descendante et ascendante, qui est un problème différent. Lorsque vous "avancez", vous implémentez toujours un algorithme quelconque. Vous ne pouvez pas y penser en ces termes, peut-être parce que l'algorithme vous semble évident ou parce que vous connaissez déjà très bien le problème, mais cela ne signifie pas que l'algorithme n'est pas encore là.
Caleb
0

Concevez un algorithme en sections, puis divisez ces sections et codez chacune d'elles individuellement. De cette façon, vous pouvez mélanger les deux points de vue:

  1. Utilisez vos capacités linguistiques pour faire fonctionner l'algorithme
  2. Essayez de penser avant le code, afin que votre idée ne fusionne pas avec la langue (un jour, vous devez déplacer votre algorithme vers une autre langue et vous finirez un en spagetthi)
guiman
la source
Japper! Je sais que cet algorithme est indépendant du langage. Il est vrai que vous pouvez utiliser n'importe quel langage de programmation existant pour exprimer le même algorithme.
Jervis
0

Pour moi, c'est à peu près tout le code. Je pense que c'est vrai pour les programmeurs les plus productifs. Je peux écrire du code aussi facilement que j'écris du texte.

Autant que possible, j'essaie de capturer les exigences sous forme de tests exécutables (code). La conception n'est qu'un codage de haut niveau. Il est plus rapide et plus précis de capturer le design dans la langue cible que de le capturer sous une autre forme, puis de le traduire.

J'ai constaté que la plupart des utilisateurs ne peuvent pas examiner efficacement les exigences textuelles. Ils fonctionnent bien avec les cas d'utilisation séquentiels, mais les cas d'utilisation ne peuvent pas capturer tous les aspects de l'interface utilisateur. Le mieux est de loin de prendre une première coupe lors de l'implémentation, de laisser les utilisateurs l'essayer, d'obtenir leurs commentaires et de modifier le code en conséquence.

Kevin Cline
la source
0

Lorsque vous vous asseyez et commencez à coder, vous avez un algorithme en tête, qu'il soit "conçu" ou non.

Si vous vous asseyez et commencez à coder sans aucun algorithme complet à l'esprit, vous effectuez l'une des opérations suivantes:

1) écraser les clés au hasard. Cela produira probablement une erreur de compilation

2) écrire du code compilable qui fait probablement tout sauf la chose que vous voulez qu'il fasse

3) écrire du code pour résoudre de petites parties du problème et en tirer parti au fur et à mesure de l'agrégation, mais sans vraiment anticiper - donc le problème est finalement résolu - mais le code n'est pas très efficace, et avec possibilité de revenir en arrière et de perdre du temps en cours de route

Donc, les gens programment généralement avec un algorithme dans leur tête. Il peut avoir été étoffé ou raisonné sur du papier ou tout autre support.

Cela peut être une bonne discipline de penser à votre attaque contre un problème loin du clavier, en particulier dans vos premiers jours en tant que programmeur. Comme d'autres réponses l'ont noté, à mesure que vous acquérez de l'expérience, vous pouvez améliorer le codage de morceaux de problème plus gérables "à la volée". Cependant, pour les problèmes difficiles ou importants, il est utile de penser et de concevoir loin du clavier: lorsque vous vous engagez avec du code, vous êtes plus susceptible de penser en termes de constructions du langage et de la façon d'aborder la tâche la plus immédiate dans le problème. Tandis que penser au problème avec, disons, un stylo et du papier, vous libère davantage de l'aspect linguistique du code et vous permet de penser à un niveau plus abstrait plus élevé.

occulus
la source
0

Vous devez cesser de considérer la construction de logiciels comme un élément fondamental de la construction de tout autre élément de valeur. Ce n'est pas. Donc, comme toute autre chose, un plan ou un design bien pensé, même succint, est toujours nécessaire.

Un algorithme approprié aide-t-il vraiment à améliorer la qualité et, finalement, l'efficacité d'un programme?

Un plan / schémas de construction approprié aide-t-il à construire efficacement une maison de qualité?

Peut-on encore produire un programme de bonne qualité sans l'algorithme?

Pouvez-vous construire efficacement une maison de bonne qualité sans un plan de construction approprié? Selon le théorème des singes infinis , probablement, oui (tout comme un million de singes tapant au hasard pour l'éternité finiront par taper les œuvres complètes de Shakespeare.

Un algorithme approprié est-il un MUST dans la programmation moderne?

Si vous ne voulez pas être un singe de code et que vous voulez vous assurer de ne pas fournir de logiciel qui ressemble et fonctionne comme de la merde, oui, c'est un must. Chaque projet que j'ai dû sauver (parce que le code ressemblait à de la merde non conservable) a invariablement commencé par une réponse négative à cette question.

En fait, la programmation moderne a été l'abandon de l'ingénieur logiciel de programmation cowboy où la planification d'une certaine sorte si un must.

Même lorsque vous avez une bibliothèque d'algorithmes et de structures de données à votre disposition (.ie. Boost en C ++ ou la bibliothèque de collections Java), vous devez savoir comment fonctionne ce truc pour l'utiliser de manière appropriée, et pour le composer en raisonnable, supérieur- algorithmes de niveau.

luis.espinal
la source
-2

Ce n'est pas mieux. Il vaut mieux ne rien "concevoir". C'est pour les gens qui n'écrivent pas de programmes. Vous savez, les personnes ayant une réelle expérience du problème à portée de main. Si vous êtes mathématicien, ingénieur ou logisticien, très bien, vous devez travailler sur le processus ailleurs. Mais ce n'est pas de la «programmation».

Mettez d'abord une sorte de test et de référence en place.

Ensuite, écrivez quelque chose, n'importe quoi. Refactorisez-réécrivez-boucle jusqu'à ce que vous manquiez de temps ou que vous ne puissiez plus vous améliorer.

Alors que beaucoup semblent penser que l'on peut faire des choses avec un ordinateur sans rien faire sur un ordinateur, je pense que c'est l'un des mythes les plus courants. Astronautismes d'architecture.

De plus, vous ne pouvez pas optimiser votre algo avant qu'il ne soit écrit.

IOW, "restez proche du métal".

Casimir Pohjanraito
la source