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?
Je pense que cette question pose une certaine perspective historique.
De retour dans les "jours olden" (dont je ne suis pas un témoin personnel, il n'y a donc que ma reconstruction de cette ère - n'hésitez pas à me corriger si vous avez expérimenté les choses différemment) L'espace HW et la performance étaient nul contre aujourd'hui. Donc tout Les gens écrivaient alors devaient être très efficaces. Ainsi, ils avaient besoin de penser beaucoup et de rechercher pour inventer les meilleurs algorithmes pour atteindre les performances de l'espace/temps nécessaires pour faire le travail. Un autre facteur de ceci était que les développeurs travaillent principalement sur ce que vous pouvez appeler Infrastructure: Systèmes d'exploitation, Stacks de protocole, Compilateurs, Pilotes de périphériques, Éditeurs, etc. Tout cela est utilisé beaucoup par beaucoup de gens , alors performance fait vraiment une différence.
De nos jours, nous sommes gâtés d'avoir incroyable HW avec des processeurs multicœurs et des gigaoctets de mémoire même un ordinateur portable de base (Heck, même dans un téléphone portable). Ce qui signifie naturellement que dans de nombreux cas, les performances - ainsi algorithmiques ont cessé d'être la question centrale, et il est plus important de fournir une solution rapide que de fournir une solution rapide. OTOH Nous avons des tas de frameworks nous aidant à résoudre des problèmes, et encapsuler un grand nombre d'algorithmes en même temps. Donc, même lorsque nous ne pensons pas aux algorithmes, nous pouvons très bien utiliser beaucoup d'entre eux à l'arrière-plan.
Cependant, il y a encore des domaines où la performance compte. Dans ces zones, vous devez toujours réfléchir beaucoup sur vos algorithmes avant d'écrire du code. La raison en est que l'algorithme est le centre de la conception, déterminant beaucoup de structures de données et de relations dans le code environnant. Et si vous découvrez trop tard que votre algorithme ne réussit pas bien (par exemple, il est O (n3) Donc, il avait l'air beau et rapide lorsque vous l'avez testé sur 10 articles, mais dans la vie réelle, vous aurez des millions), c'est très difficile, l'erreur suale et prononcent du temps pour la remplacer dans le code de production. Et les micro-optimisations ne vont pas vous aider si l'algorithme fondamental n'est pas juste pour le travail.
Juste pour souligner quelque chose:
Un algorithme est lui-même une solution générale étape par étape de votre problème. Donc, si vous avez résolu le problème, vous avez utilisé en fait 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 vaut mieux penser à votre problème avant de passer au codage - cette phase est souvent appelée conception. Mais, combien et dans quelle direction ferez-vous cela dépend de vous?.
De plus, vous ne devriez pas mélanger le concept d'algorithme avec organigrammes (je soupçonne que cela se passe ici). Les organigrammes ne sont qu'une représentation graphique pouvant être utilisée et utilisée dans les plus anciens jours pour illustrer un algorithme. Il est à peu près déprécié de nos jours.
Edit:
Il existe en effet de nombreuses façons de représenter un algorithme et le code de langue de programmation est l'un d'entre eux. Cependant, assez souvent, il est beaucoup mieux ou plus facile de ne pas résoudre tout problème à la fois, mais simplement un contour, puis remplissez les blancs comme vous allez.
Mon préféré personnel Voici un pseudo code, et seulement pour couvrir un aperçu général abstrait de l'algorithme en question - il est ridicule d'entrer dans les détails avec pseudocode Quel est le code réel.
Mais le vrai code peut être utilisé pour le contour. Par exemple, les gens TDD aiment concevoir l'algorithme comme ils codent, et comme ils ne peuvent pas tout résoudre à la fois, ils conçoivent un aperçu de l'exécution du programme en code réel et utilisent des objets faillites (ou fonctions, méthodes ...) comme des blancs à remplir plus tard.
Les diagrammes d'activité UML Semble être une incarnation moderne d'organigrammes de style ancien avec une notation ajoutée pour les nouveaux trucs comme le polymorphisme et la multithreading. Je ne peux pas vraiment dire à quel point cela est utile, car je ne les ai pas vraiment utilisées beaucoup - je le mentionne simplement pour l'exhaustivité.
De plus, si vous basez votre algorithme sur la commutation entre les états, un diagramme d'état est assez utile.
Généralement, tout moyen que vous avez à Simplement esquisse L'idée derrière un certain algorithme est un bon moyen d'y aller.
Une bonne analogie est que vous devez connaître une recette avant de commencer à cuisiner. =Ok Vous pouvez le modifier à votre guise, mais vous devez toujours savoir ce que vous voulez faire avant de commencer. Si je veux faire un ragoût d'agneau, je vais faire des choses très différentes que si Je veux faire cuire une miche de pain.
Parler couramment votre langue aide à améliorer la qualité et la productivité. Et la résolution de petits problèmes algorithmiques est beaucoup plus utile pour cela que de répéter les mêmes trucs MVC 100 fois.
[.____] Bien que, je suppose qu'il y a d'autres moyens d'atteindre la fluidité.
Algorithme deviendra-t-il un must dans le domaine de la programmation moderne?
[ Toutes les "meilleures" entreprises (Google, Amazon, etc.) Testez votre expérience algorithmique en interview et j'imagine qu'ils ne le feraient pas sans raison.
Mais retourner au point d'origine, vous devriez constamment vous défier si vous voulez vous améliorer. Et comme des emplois normaux (AKA "écrivent maintenant des gestionnaires de crud pour 100 autres objets") ne constituent pas toujours un bon défi, les algorithmes compensent cela.
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 ont été un "must" depuis le début de la programmation.
Je dirais que vous avez besoin d'au moins une idée initiale d'un algorithme avant de commencer le codage. Vous allez probablement réviser votre idée pendant le codage basé sur des structures de données, etc.
Plus tard, vous pouvez réviser le code à nouveau si le profilage suggère qu'il existe une question de performance dans cette zone.
La raison en est qu'il est plus rapide de corriger des erreurs avant d'avoir écrit le code erroné.
Plus prosaïque, il y a régulièrement mesuré 10 à 1 différences de productivité entre différents programmeurs. Lorsque vous regardez les programmeurs qui sont au niveau de la productivité à 10 fois, ils dépensent la fraction la plus petite de leur temps codant en réalité. Le temps de taper du code ne doit pas être le goulot d'étranglement. Au lieu de cela, ils dépensent une plus grande fraction de leur temps pour s'assurer qu'ils disposent d'exigences droites, de planification, de test, etc.
Inversement, lorsque vous regardez les programmeurs qui plongent dans le codage sans pause, ils doivent inévitablement écrire le code encore et encore lorsqu'ils rencontrent des problèmes entièrement prévisibles, et le résultat final est moins maintenu et plus de buggy. (Incidemment, vous savez que la moyenne de 80% de l'argent consacré au développement de logiciels est dans la phase de maintenance? Faire des choses à maintenir. Beaucoup.)
Généralement algorithmes et structures de données d'abord, code plus tard. Mais cela dépend beaucoup du domaine de la programmation. J'avais l'habitude de faire beaucoup de choses de type mathématiques appliquées et j'ai vraiment regardé le modèle de cascade alors prévalant. C'était parce que les algorithmes de niveau faible à moyen pouvaient rarement être pris pour acquis. Concevez une grande structure autour de l'existence de sous-systèmes non écoulés, puis découvrez tard dans le jeu que les mathématiques pour l'un de ces sous-systèmes cruciaux ne fonctionnent pas (est instable ou autre). J'ai donc toujours pensé aux sous-titres les plus difficiles d'abord, et s'il y avait une raison de doute, j'ai écrit et l'unité testée d'abord. Mais, pour certains domaines de problèmes, vous pouvez simplement charger sans planification.
Pour moi, c'est à peu près tout le code. Je pense que c'est vrai pour la plupart des programmeurs très productifs. Je peux écrire du code aussi facilement que j'écris du texte.
Autant que possible, j'essaie de capturer des exigences en tant que tests exécutables (code). La conception n'est que de codage de haut niveau. Il est plus rapide et plus précis de capturer la conception dans la langue cible que de la 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 vont bien avec des cas d'utilisation séquentielle, mais les cas d'utilisation ne peuvent pas capturer tous les aspects de l'interface utilisateur. Le meilleur de loin, c'est de prendre une première coupe à la mise en œuvre, permet aux utilisateurs de l'essayer, d'obtenir leurs commentaires et de modifier le code en conséquence.
Lorsque vous vous asseyez et commencez à coder, vous avez un algorithme à l'esprit, que ce soit "conçu" ou non.
Si vous vous êtes assis et que vous commencez à coder sans algorithme complet, vous feriez l'une des opérations suivantes:
1) Mashing clés au hasard. Cela produira probablement une erreur de compilateur
2) écrire un code compilable qui fait probablement quelque chose, sauf la chose que vous voulez qu'il fasse
3) rédaction de code pour résoudre de petites parties du problème, et le construire lorsque vous allez de manière agrégée, mais que vous ne pensez pas vraiment que le problème est résolu - mais le code n'est pas très efficace, et avec Possibilité d'avoir à retourner et à perdre du temps sur le chemin
Donc, les gens programment généralement avec un algorithme dans leur tête. Cela peut avoir été formé ou raisonné sur du papier ou un autre moyen.
Cela peut être une bonne discipline de penser à votre attaque sur un problème à l'écart du clavier, en particulier dans vos jours précédents en tant que programmeur. Au fur et à mesure que d'autres réponses ont noté, lorsque vous obtenez plus expérimenté, vous pouvez vous améliorer pour coder quelques morceaux de problèmes plus gérables "à la volée". Cependant, pour des problèmes difficiles ou importants, la pensée et la conception du clavier sont utiles: lorsqu'ils sont engagés avec du code, vous êtes plus susceptible de penser à des constructions de la langue et de vous approcher de la tâche la plus immédiate dans le problème. Alors que penser au problème avec, dire, un stylo et un papier, vous libère davantage de l'aspect linguistique du code et vous permet de penser à un niveau plus abstrait plus élevé.
Vous devez cesser de regarder la construction de logiciels comme quelque chose de fondamentalement de la construction de toute autre valeur. Ce n'est pas. Donc, comme toute autre chose, un plan ou une conception bien pensé, quelle que soit la succincte, est toujours nécessaire.
Un algorithme approprié aide-t-il vraiment à améliorer la qualité et finalement l'efficacité d'un programme?
Un plan de construction/schémas approprié aide-t-il de manière efficace une maison de qualité?
Peut-on encore produire un programme de bonne qualité sans l'algorithme?
Pouvez-vous construire une maison de bonne qualité efficacement sans un plan de construction approprié? Selon le théorème de singe infini , probabiliste, ouais (juste comme un million de singes taper au hasard pour l'éternité de taper des œ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 souhaitez vous assurer de ne pas livrer un logiciel qui a l'air et fonctionne comme une merde, oui, c'est un must. Chaque projet que j'ai dû sauver (parce que le code ressemblait à une merde enMaintine) a été invariadifié avec une réponse négative à cette question.
En fait, la programmation moderne a été éloignée de l'ingénieur de logiciels de programmation de Cowboy où planification de quelque sorte Si un must .
Même lorsque vous avez une bibliothèque d'algorithmes et de structures de données à votre disposition (goot. Boost en C++ ou la bibliothèque de collections Java), vous devez savoir comment ce truc fonctionne pour l'utiliser de manière appropriée et à composer dans des algorithmes de niveau supérieur raisonnables.