web-dev-qa-db-fra.com

Est-ce que quelque chose dans la programmation véritablement mal?

Donc, il y a un tas de questions qui apparaissent demandant est x le mal, c'est y mal.

Mon point de vue est qu'il n'y a pas de constructions linguistiques, d'algorithmes ou autre que ce qui est diabolique, juste ceux qui sont mal utilisés. Enfer, si vous avez l'air assez fort, il y a même tilisations valides de goto .

Donc, le mal absolu, c'est quelque chose qui est totalement incompatible avec les meilleures pratiques dans tous les cas, existent dans la programmation? Et si oui, qu'est-ce que c'est? Ou est-ce que ce sont juste de mauvais programmeurs ne sachant pas quand quelque chose est approprié?

Edit: Pour être clair, je ne parle pas de choses que les programmeurs font (tels que ne pas vérifier les codes de retour ou n'utilisant pas le contrôle de la version - ce sont des choix fabriqués par des programmeurs méchants), je veux dire des outils, des langues, des déclarations, tout ce qui est juste mauvais...

41
Jon Hopkins

Les armes à feu ne tuent pas les gens, les gens tuent des gens.

De la même manière, Dev-outils ne sont pas diaboliques, les choses que font les programmeurs avec eux pourrait être.

58
guiman

Est-ce que quelque chose dans la programmation véritablement mal?

Absolument. Défaut d'utiliser votre cerveau et réfléchissez à ce que vous faites et pourquoi vous faites, c'est la racine de tout Programmation Evil.

36
Greg D

Handlers d'exception générique vide I.e.:

catch(Exception ex)
{
}

Je ne doute pas que quelqu'un puisse me donner un cas d'utilisation valide - mais pour être honnête, il va être sérieusement créatif ... et à tout le moins que vous avez besoin d'une explication.

25
Murph

Je peux peut-être retourner la question autour et demander s'il y a quelque chose dans la programmation qui est Absolument et parfaitement bien? Si vous ne pouvez pas penser à une chose (je sais que je ne peux pas), le concept de mal est aussi aussi boueux.

Il existe des comportements courants qui conduisent à des erreurs, malentendus et à d'autres confuses générales - mais de dire que la fonction de langue x est intrinsèquement mal consiste à admettre que vous ne comprenez vraiment pas le but de la fonctionnalité X.

Il y a des comportements courants qui peuvent économiser beaucoup de chagrin d'amour et éviter de malentendus - mais de dire que la fonction de langue y est intrinsèquement bonne est d'admettre que vous ne comprenez pas complètement toutes les implications de l'utilisation de la fonctionnalité Y.

Nous sommes un peuple de compréhension finie et des opinions fortes - une combinaison dangereuse. L'hyperbole n'est qu'une façon d'exprimer nos opinions, d'exager les faits jusqu'à ce qu'ils deviennent fiction.

Néanmoins, si je peux éviter les comportements qui conduisent à des problèmes et de poursuivre les comportements qui les évitent, je pourrais juste être un peu plus productif. À la fin de la journée, c'est ce dont il s'agit.

19
Berin Loritsch

La seule chose qui me vient à l'esprit est la suivante:

#DEFINE TRUE FALSE
#DEFINE FALSE TRUE

Mais encore une fois, c'est juste une vieille mauvaise utilisation hehe.

13
Kyle Rozendo

Je pense que vous réfléchissez à la peau, aux auto-updateurs qui s'assoient perpétuellement dans la Systray, les applications que les associations de fichiers de détournement et d'autres paramètres du système sont droites.

Avec des sites Web flash-seulement.

11
whatsisname

tout ce qui arrive au travail juste par accident est intrinsèquement maléfique.

Considérons le programme C suivant C, qui s'effectue réellement fonctionner sur ma machine, à l'aide des options de compilateur par défaut:

#include <stdio.h>
int main(int argc, char *argv[]) {
   char string[10];
   int y;
   for (y=0; y<10; string[12]++) {
      printf("%d\n", y);   
   }
}

Rien, vraiment rien ne pourrait jamais excuser la façon dont ce programme augmente le comptoir de boucle. C'est juste un effet indéfini qui arrive à faire la bonne chose sur ma machine, mon compilateur, mes options par défaut.

10
user281377

Facile, IBM Rational Clearcase est une atrocité.

8

Donc, le mal absolu, c'est quelque chose qui est totalement incompatible avec les meilleures pratiques dans tous les cas, existent dans la programmation?

Bien sûr que non. C'est comme demander si quelque chose dans ma boîte à outils est mal. Mon marteau est un excellent "bon" pour moi, à moins que mes quatre ans ne lui apportent la main dessus.

7
AJ Johnson

Le mal d'aujourd'hui était d'hier parfait. C'est l'évolution.

6
Heath Lilley

Ne pas être trop sérieux, mais ...

Nous avons des vues très myopiques sur le "mal". Les personnes qui tuent beaucoup d'autres personnes sont mauvaises. Les personnes qui volent des autres sont perverses. Chaque pays (que je sache) a du mal dans leur passé. Certains voudraient le nier.

Y a-t-il du mal dans la programmation? Nous préférons que les programmeurs innocents voudront penser "pas vraiment". Cependant, une fois que j'ai eu une conversation avec l'inventeur d'une base de données hiérarchique largement utilisée, sur ce sujet même. Vous voulez savoir qui était l'un des meilleurs clients? La police secrète de la Pologne communiste.

Y a-t-il du mal au monde maintenant? Tu paries. Et utilisent-ils des programmeurs? Tu paries.

6
Mike Dunlavey

NULL est la racine du mal !

https://softwareengineering.stackexchange.com/questions/22912/null-References-Le-billion-dollar-mistake-Closed

L'erreur de milliards de dollars : J'appelle ma faute d'un milliard de dollars. C'est l'invention de la référence null en 1965. À ce moment-là, je concevais le premier système de type complet pour les références dans une langue orientée objet (Algol W). Mon objectif était de faire en sorte que toute utilisation de références soit absolument sûre, avec la vérification effectuée automatiquement par le compilateur. Mais je ne pouvais pas résister à la tentation de mettre dans une référence nulle, simplement parce que c'était si facile à mettre en œuvre. Cela a conduit à d'innombrables erreurs, vulnérabilités et accidents système, qui ont probablement provoqué une douleur et des dommages de milliards de dollars au cours des quarante quarante ans. Ces dernières années, un certain nombre d'analyseurs de programme tels que Prefix et Prefast dans Microsoft ont été utilisés pour vérifier les références et donner des avertissements s'il ya un risque qu'ils peuvent être non nuls. Des langages de programmation plus récents tels que les spécifications ont présenté des déclarations pour des références non nulles. C'est la solution que j'ai rejetée en 1965. C.A.R. HOARE, 2009

6
Amir Rezaei

Copier-coller code.

Si vous ne démolez pas lorsque vous faites cela, vous n'êtes pas un véritable programmeur.

6
egarcia

Je trouve personnellement la phrase de Donald Knuth: "L'optimisation prématurée est la racine de tout mal" comme la première chose diabolique de la programmation. Dans un point de vue expiratif (qui dit que j'ai échoué pour cela).

En fait, la phrase dit quelque chose comme: N'essayez pas de comprendre le problème dans un environnement particulier, un PC particulier ou un ensemble d'utilisateurs avant d'entrer dans le problème.

5
user11341

Aucun outil n'est intrinsèquement mal. Son existence peut être totalement stupide pour tous sauf un cas d'utilisation unique, mais cela ne le fait pas mal. Il met le résultat de décider de la bonne utilisation sur le programmeur.

3
Bob Roberts

Qu'est-ce que le FAQ affront-il par "tel est le mal"?

Cela signifie que vous devez éviter la plupart du temps, mais ce que vous devriez éviter tout le temps. Par exemple, vous finirez par utiliser ces "mauvaises" choses chaque fois qu'ils sont "le moins mauvais des alternatives diaboliques". C'est une blague, d'accord? Ne le prenez pas trop au sérieux.

3

Le code redondant est très très mauvais.

Eh bien, je pensais que Microsoft est/était considéré comme mal et maintenant récemment Oracle est la chose la plus mauvaise dans le monde .

3
Uwe Keim

Je sais que j'ai dit que je ne ferais pas un post mais je vais écrire une réponse. Autant que tout le monde dit non, il n'y a pas de maux, je dirai oui, il y a des maux absolus

SETJMP/LONDJMP est pur mal.

3
user2528

Code dans votre langue maternelle (non anglais), écrivez la documentation dans votre langue maternelle. Puis externaliser le projet à une entreprise indienne.

C'est mal pour toi!

P.s.: Pour le compte rendu, c'est arrivé, et les Indiens ne l'ont pas trouvé très drôle.

2
Demian Kasier

Bien que tout outil puisse être tilisé pour le bien et le mal, certains outils sont mal parce qu'ils surprennent souvent les programmeurs qui ne les utilisent pas fréquemment.

Je considère l'opérateur de changement de droite non signé (>>>>) dans Java mal (étonnamment inapproprié) lorsque vous travaillez avec des entiers plus courts que 32 bits.

Dites que vous avez un octet B avec valeur -1.

byte b = -1;  // binary: 1111 1111

L'opérateur de changement de droite non signé déplace les zéros dans les bits les plus à gauche. Donc, on suppose un changement de 7 pour résulter 1.

b >>>= 7;  // binary: 0000 0001 ?

Mais plutôt cette opération ne fait rien du tout. B est toujours -1.

Même tous les 25 quarts suivants ne font rien:

byte b = -1;
for (int i = 0; i < 25; ++i) {
    b >>>= i;
    System.out.println(b); // always outputs -1
}

Cela se produit parce que b>>>=7 Traduit grossièrement à

                                  1111 1111

1) the byte gets widened to a 32 bit int to make shifting possible
    1111 1111 1111 1111 1111 1111 1111 1111

2) the shift happens
    0000 0001 1111 1111 1111 1111 1111 1111

3) the resulting int gets narrowed to a byte again
                                  1111 1111

Vous devriez remplacer

b >>>= i;

par

b = (b & 0xFF) >>> (i % 8);     // >> would also work this time

faire fonctionner comme "attendu".

2
Robert

Je vais transformer cela et dire que, bien qu'il n'y ait pas de mal absolu, il y a des outils et des constructions qui le font plus plausible pour nos faibles humains avec un tel A taille de crâne limitée pour faire des erreurs que d'autres.

Je dirais donc que vous pourriez parler de Malles d'une construction basée sur la probabilité que les gens puissent faire des erreurs avec elle. Bien sûr, vous pouvez couper du pain avec un couteau ou avec une tronçonneuse avec des lames comme poignée, mais il est plus susceptible de causer des dommages à ceux de l'autre, même si vous pourriez être capable de le retirer avec suffisamment de soin.

2
Kenji Kina

Augmenter le coût total du système pour un avantage insuffisant. Cela pourrait être trop copier et coller, une architecture trop complexe, ou en utilisant des produits commerciaux coûteux mais inefficaces. De manière générale, toutes les techniques logicielles visent à réduire le coût total d'un système, et si nous nous retrouvons avec un système trop coûteux, nous avons mal fait de mal.

1
David Plumpton

Programmation, en soi, je pense, n'est pas intrinsèquement mal maléfique. Cependant, la programmation est très souvent une activité sociale et le respect de ceux qui vous entourent peut être très mal. Les gens oublient souvent que la plupart des codes vont être partagés avec d'autres; Principalement lu, parfois écrit aussi. Soyez-lui open source, un produit qu'une entreprise publie ou un petit morceau de correction d'un consultant est embauché, des programmes seront lus.

C'est la moitié de la raison pour laquelle il existe tant d'articles "considérés comme nocifs", ou pourquoi les gens disent "jamais". Rendre la vie difficile pour les autres est la racine même de tout le mal. N'est-ce pas?

1
pyNem

Lorsque la date limite est proche et que les exigences changent, des modifications conçues et que vous passez 16 heures de bureau, c'est du mal.

1
Manoj R

Je pense qu'il y a des choses diaboliques dans la programmation, mais je n'utilise pas le terme péjorativement.

Le mal est lorsque le code prétend se comporter d'une manière d'une manière, mais dans la réalité se comporte de manière très différente, et de manière à blesser un programmeur rationnel non éclairé. Je fais souvent référence à cela comme un type de " magie ." La magie est tout ce que la fonctionnalité est "cachée" du programmeur et il s'agit de différents styles.

Exemple: dans le schéma, les fonctions "voiture" et "CDR" pourraient être implémentées à l'aide de fonctions uniquement, cependant, elles ne le sont pas. ils sont plutôt mis en œuvre à un niveau inférieur parce que impérieusement fonctionne plus vite sur la plupart des ordinateurs. J'appellerais cette "magie blanche". Ce n'est pas un mal, mais sa magie définitivement.

En comparaison, le numéro unique Nan en JavaScript n'est pas égal à aucun autre nombre ... même lui-même. C'est "la magie noire". Je ne veux pas entrer dans une discussion sur la raison pour laquelle vous avez NAN à JavaScript (ou pourquoi vous avez à l'infini et à Nan), mais vous pouvez voir pourquoi un tel concept simple serait utile à une langue avec seulement des numéros de points flottants. Cependant, avoir un nombre constant qui ne peut pas être testé de la même manière que d'autres nombres constants n'est pas quelque chose que l'on pourrait s'attendre. Heureusement Javascript fournit isNAN pour aider à résoudre ce problème, mais si vous n'êtes pas au courant de la propriété unique de NaN vous pouvez écrire le code suivant et vous brûler:

if(x == NaN) 

ou si vous êtes intelligent, vous pouvez essayer ce qui suit avec les mêmes résultats

if(x === NaN)

Je plaisante, désignez cela comme "mana brûlé" (c'est la magie après ...).

Je me rends compte qu'il y a de bonnes raisons pour lesquelles vous voulez des choses qui ne sont pas des chiffres à être automatiquement égales à elles-mêmes, mais vous devez vous rappeler que pour les numéros de points flottants IEEE, NAN a une séquence de bits spécifique et qu'elle est similaire à d'autres numéros à cet égard. Si vous traitez JavaScript Nan comme vous pouvez traiter une nan de point flottant IEEE, vous êtes susceptible de brûler. Ceci est à la fois trompeur et frustrant, le premier étant la raison pour laquelle je me réfère à cela mal .

Là encore, ses personnes éventuelles pensent autrement ...

1
tzenes

Oui, il y a beaucoup de mal à être eu. Par exemple:

Type1 variable1 = function12()
variable5 = variable1.myMethod(variable1+aGlobal);
variable2.otherMethod(anotherGlobal);
1
Mud

Je suis tenté de dire des poursuites, mais je pense que la bonne réponse est qu'il n'y a pas d'objectif absolu, mal absolu dans la programmation. D'autre part, même les meilleurs outils peuvent être abusés.

1
Larry Coleman

Est-ce que quelque chose dans la programmation véritablement mal? Je veux dire des outils, des langues, des déclarations, peu importe

Rien sur cette liste n'est pas mal. Voici pourquoi.

Les humains ont été créés comme des êtres avec une volonté gratuite. Ils peuvent utiliser leurs pouvoirs pour aller du côté obscur ou embrasser le côté lumineux. Ce choix définit ce qui sort de leurs mains.

Maintenant, ces outils et cadres ont été créés par des personnes bienveillantes qui tentaient véritablement de rendre les choses mieux meilleures avec une bonne volonté. Par conséquent, leurs créations (réussis ou non sont non pertinentes) ne portent pas l'empreinte du mal. Au moins, ils sont neutres, mais pas malveillants.

Ensuite, ces outils entrent entre les mains d'autres personnes. Et tout ce qu'ils font avec eux dépend de ces personnes. Même un débogueur pourrait être transformé en un instrument diabolique entre les mains d'un pirate informatique qui tente de supprimer la vérification du numéro de série dans certains logiciels.

Mais il ne redéfinit aucune façon la caractéristique de l'outil. Ils sont tous bons. Certains sont plus utiles, d'autres moins. Certains dangereux, certains moins. Mais toujours, ils sont tous bons et très utiles dans certains scénarios.

Et si un programmeur par une erreur abuse un outil et provoque des dégâts, l'outil ne devient pas mal. C'est juste une erreur de programmeur, un manque de connaissances, une ignorance, peu importe. Mais sans aucune intention maléfique.

La ligne de fond est, tous les outils sont bons. Nous devons les aimer tous.

0
user8685

Il n'y a pas de mal absolu objectif.

Le problème avec des choses comme GOTO est qu'il est terriblement difficile de l'utiliser de manière non méchante. Assez pour que c'est difficile pour moi assis ici maintenant de penser à un exemple de goto qui n'est pas une odeur de code. Mais je suis prêt à accepter qu'il pourrait y avoir de telles utilisations et que le problème n'est pas l'outil lui-même mais plutôt la probabilité de son abus.

0
Dan Ray

Effets secondaires visibles dans des endroits inattendus.
[.____] Dans .NET, des exemples seraient ToString(), Equals()/GetHashCode(), getters de propriété et conversions implicites.
[.____] (Pour être clair, je parle de quelque chose de plus que l'instanciation paresseuse ou le code de journalisation)


throw new Exception(ex.Message);

(( explication

0
SLaks

Certaines instructions de programmation/style/conventions sont très souvent mal utilisées pour faire terrible, mal si vous coderez, mais entre les mains d'un programmeur maître, ils peuvent être utilisés de manière très élégante, bien si vous voulez.

D'autre part, je ne connais rien qui puisse empêcher les programmeurs incompétents ou inexpérimentés de produire de mauvaises, mal si vous coderez même avec les meilleurs outils, langues, etc.

En évitant souvent des éléments mal utilisés, tels que Goto, l'espoir est que les programmeurs médiocres peuvent éviter le mal et peut-être le rendre un peu plus facile d'écrire un bon code.

0
Jim C

Je suis d'accord avec le FAQ C++ à ce sujet:

[6.16] Est-ce que j'utiliserai parfois des constructions dits "mal"?

Bien sûr que tu le feras!

Une taille unique ne convient pas à tous. Arrêter. À l'heure actuelle, sortez un marqueur de pointe et écrivez à l'intérieur de vos lunettes: le développement de logiciels est la prise de décision. "Pensez" n'est pas un mot de quatre lettres. Il y a très peu de "jamais ..." et "toujours ..." Règles dans les logiciels - règles que vous pouvez appliquer sans réfléchir - règles qui fonctionnent toujours dans toutes les situations de tous les marchés - une taille unique - toutes les règles.

En anglais ordinaire, vous devrez prendre des décisions et la qualité de vos décisions affectera la valeur commerciale de votre logiciel. Le développement de logiciels ne concerne pas principalement les règles suivantes. C'est une question de penser et de faire des compromis et de choisir. Et parfois, vous devrez choisir entre un tas de mauvaises options. Lorsque cela se produit, le meilleur que vous puissiez espérer, c'est de choisir le moins mal des alternatives, le moindre des "maux".

Vous utiliserez occasionnellement des approches et des techniques étiquetées comme "mal". Si cela vous fait mal à l'aise, changez mentalement le mot "mal" à "fréquemment indésirable" (mais ne quittez pas votre travail de jour pour devenir un auteur: Milquetoast termes comme celui-ci mettre des gens à dormir :-)

0
Jason Baker

Rien n'est vraiment mauvais, pas même des armes, mais nous les considérons parfois comme tels. Cependant, avec des armes, nous avons généralement un certain niveau de respect, nous sommes très conscients de leur danger et les utilisons avec prudence; Cependant, il y a toujours des gens trop stupides pour les utiliser.

Il en va de même pour tout outil, plus les conséquences d'abuser de ces outils sont difficiles, plus les personnes les abusent probablement.

Dans la programmation, tout est plus ou moins virtuel, un programme est une représentation de notre processus de pensée et des conséquences à long terme de ne pas comprendre quelque chose de tout à fait ou que cela ne va pas légèrement faux sont beaucoup plus difficiles à déterminer, puis le danger immédiat de la mort que nous sommes confrontés à lors de la manipulation d'une arme à feu.

Cela rend les outils que nous utilisons et nous disposons beaucoup plus fort à utiliser, mais cela nous donne également un moyen facile de mesurer la compétence d'un programmeur. La connaissance de quand et comment utiliser les outils que vous avez est cruciale pour devenir un bon programmeur. Vous pouvez toujours le jouer en sécurité en limitant l'ensemble des outils, mais juste au gars à qui tout ressemble à un clou, éventuellement, vous rencontrerez quelque chose qu'aucune quantité de frappe ne sera corrigée.

0
DasIch

La seule chose "mal" pense que certaines émissions sont "mal". Diverses approches - Utilisez cette technique, n'utilisez pas cette déclaration, utilisez cette méthodologie, n'utilisez pas cette langue, utilisez cette "meilleure pratique", etc. avis.

Malheureusement, trop de développeurs errent opinions pour vérité objective.

Je crains à chaque fois que je vois une question ici, comme "pourquoi [x] est-il considéré comme mal?".

0
GrandmasterB