Take the 2-minute tour ×
Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. It's 100% free, no registration required.

So, there are a bunch of questions appearing asking is X evil, is Y evil.

My view is that there are no language constructs, algorithms or whatever which are evil, just ones which are badly used. Hell, if you look hard enough there are even valid uses of goto.

So does absolute evil, that is something which is utterly incompatible with best practice in all instances, exist in programming? And if so what is it? Or is it just bad programmers not knowing when something is appropriate?

Edit: To be clear, I'm not talking about things programmers do (such as not checking return codes or not using version control - they're choices made by bad programmers), I mean tools, languages, statements, whatever which are just bad...

share

locked by Thomas Owens Aug 21 '13 at 15:07

This question exists because it has historical significance, but it is not considered a good, on-topic question for this site, so please do not use it as evidence that you can ask similar questions here. This question and its answers are frozen and cannot be changed. More info: help center.

closed as not constructive by Mark Trapp, bigown Dec 28 '10 at 23:30

As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center for guidance.If this question can be reworded to fit the rules in the help center, please edit the question.

21  
Null is evil! The Billion Dollar Mistake programmers.stackexchange.com/questions/22912/… –  Amir Rezaei Dec 21 '10 at 14:51
22  
@Amir Resaei, null is necessary if you cannot know the value at the time the reecord is inserted! The ways to gert around using nulls are far worse. –  HLGEM Dec 21 '10 at 14:53
4  
@HLGEM: Can you share how alternatives like Haskell's "Maybe" are "far worse"? –  LennyProgrammers Dec 21 '10 at 14:57
24  
200 rep cap per day is truly evil. –  user8685 Dec 21 '10 at 15:07
4  
@HLGEM: This might be true for current SQL-databases, i thought we were talking about programming languages. –  LennyProgrammers Dec 21 '10 at 15:27
show 18 more comments

40 Answers

up vote 47 down vote accepted
  1. Magic numbers.
  2. Implicitness is inherently evil, and here's the reason why:
share
8  
1. there are reason to have them. 2. Type inference in Haskell is a type of implicitness that I love. –  Matt Ellen Dec 21 '10 at 14:57
1  
+1 for magic numbers, bane of my life at a very big company. Also, "lost in the distant past" reasons for scaling by 1000 instead of 1024, leading to an enormous overhead in a critical loop that everyone was scared to eliminate because they didn't know what else would be affected. –  geekbrit Dec 21 '10 at 15:01
7  
Meh, implicitness is very neat sometimes. Explicitness is for assembly-programmers. –  Macke Dec 21 '10 at 18:57
6  
Re #2: I see what you did there...Sorry about the downvotes from people who I'm guessing didn't get the joke. –  Larry Coleman Dec 21 '10 at 19:05
5  
@Larry, I got the joke. I just disagree. –  JSBձոգչ Dec 21 '10 at 21:44
show 3 more comments

What does the FAQ mean by "such and such is evil"?

It means such and such is something you should avoid most of the time, but not something you should avoid all the time. For example, you will end up using these "evil" things whenever they are "the least evil of the evil alternatives." It's a joke, okay? Don't take it too seriously.

share
add comment

There is no true evil in programming.

<rant>

The reason so many people think that there are evil things is that it is pounded into their heads when they first take their programming classes. "Don't use goto! Always normalize your databases! Never, ever use multiple inheritance!" These are hammered in because these "evil" practices are so easily abused, not because they are inherently bad. There are so few uses of them that you can get away with saying "never" at first. What is truly evil is saying, "There is no reason to consider anything that is not a 'best practice'", because there is always a place where that very way is perfect.

</rant>

share
10  
+1 - Best practice is a generalisation and for all generalisations there will be exceptions. –  Jon Hopkins Dec 21 '10 at 14:47
1  
++ I second your rant. Bravo! –  Mike Dunlavey Dec 21 '10 at 14:50
3  
+1: A while back, I added a new goto to some C code I was working on that already had a bunch of them. It was quicker than refactoring it. I told my wife, who's also a programmer, and she asked, "Honey, are you okay? Do you have a fever?" I'm currently working on some code where another guy wrote a C goto that jumps into the middle of a loop. I'd never write it myself, and I curse inwardly every time I see it, but it meets the ultimate test: it works. –  Bob Murphy Dec 21 '10 at 16:23
1  
+1 - I worked on some C code right out of school where "goto exit" or "goto error_exit" was used often. I have to say it made for cleaner looking code than, having multiple return statements. My motto is that everything has it's place. (even singletons ;-) ) –  eSniff Dec 22 '10 at 1:48
1  
@JonHopkins -- which is why I much prefer to talk of "good practices". –  Richard Dec 22 '10 at 9:43
show 4 more comments

Code in your native language (not English), write documentation in your native language. And then outsource the project to an Indian company.

That's evil for you!

P.S.: For the record, it happened, and the Indians didn't find it very funny.

share
1  
Maybe they should have conducted business in such a way that they understood that before they took on the project... –  Merlyn Morgan-Graham Dec 22 '10 at 1:01
show 1 more comment

When the deadline is near, and requirements change, design changes, and you spend 16 hours in office, that is evil.

share
add comment

I agree with the c++ FAQ on this:

[6.16] Will I sometimes use any so-called "evil" constructs?

Of course you will!

One size does not fit all. Stop. Right now, take out a fine-point marker and write on the inside of your glasses: Software Development Is Decision Making. "Think" is not a four-letter word. There are very few "never..." and "always..." rules in software — rules that you can apply without thinking — rules that always work in all situations in all markets — one-size-fits-all rules.

In plain English, you will have to make decisions, and the quality of your decisions will affect the business value of your software. Software development is not mostly about slavishly following rules; it is a matter of thinking and making tradeoffs and choosing. And sometimes you will have to choose between a bunch of bad options. When that happens, the best you can hope for is to choose the least bad of the alternatives, the lesser of the "evils."

You will occasionally use approaches and techniques labeled as "evil." If that makes you uncomfortable, mentally change the word "evil" to "frequently undesirable" (but don't quit your day job to become an author: milquetoast terms like that put people to sleep :-)

share
add comment

I'm gonna turn this around and say that while there's no absolute evil, there are tools and constructs which make it more plausible for our feeble humans with such a limited skull size to make mistakes than others.

So I'd say you could talk about the evilness of a construct based on how likely people are to make mistakes with it. Sure you can cut bread with a knife or with a chainsaw with blades as grip, but one is more likely to cause damage than the other, even though you may be able to pull it off with enough care.

share
add comment

Visible side-effects in unexpected places.
In .Net, examples would be ToString(), Equals() / GetHashCode(), property getters, and implicit conversions.
(To be clear, I'm talking about something more than lazy instantiation or logging code)


throw new Exception(ex.Message);

Explanation

share
add comment

I personally find Donald Knuth's phrase: "premature optimization is the root of all evil" as the first evil thing in programming. In an expirienced point of view (that says that i have failed for this).

Actually, the phrase says something like: Don't try to understand the problem in a particular enviroment, particular PC or set of users before you get in deep into the problem.

share
add comment

I think there are evil things in programming, but I don't use the term pejoratively.

Evil is when code pretends to behave in one way, but in reality behaves in a very different fashion, and in a way that hurts a unenlightened rational programmer. I often refer to this as a type of "Magic." Magic is anything who's functionality is "hidden" from the programmer, and it comes in different styles.

Example: in Scheme the functions "car" and "cdr" could be implemented using functions only, however, they are not. Instead they are implemented at a lower level imperatively because that runs faster on most computers. I'd call this "white magic." Its not evil, but its definitely magic.

By comparison the unique number NAN in Javascript is not equal to any other number... even itself. This is "black magic." I don't want to get into a discussion of why you have NAN in Javascript (or why you have both Infinity and NaN), but you can see why a such a simple concept would be useful to a language with only floating point numbers. However, having a constant number which cannot be tested for in the same way as other constant numbers is not something one would expect. Fortunately Javascript provides isNAN to help solve this issue, but if you are unaware of NaN's unique property you might write the following code and get burned:

if(x == NaN) 

or if you're clever you might try the following with the same results

if(x === NaN)

I joking refer to this as getting "mana burned" (it is magic afterall...).

I realize there are good reasons why you want things which are not numbers to be automatically equal to themselves, but you have to remember that for IEEE floating point numbers NaN has a specific bit sequence and it is similar to other numbers in this respect. If you treat Javascript NaN the way you might treat an IEEE floating point NaN you are liable to get burned. This is both deceptive and frustrating, the former being the reason I refer to this as Evil.

Then again, its possible people think otherwise...

share
1  
+1 - code should be transparent. –  Michael K Dec 22 '10 at 15:02
show 1 more comment

The only thing that springs to mind is this:

#DEFINE TRUE FALSE
#DEFINE FALSE TRUE

But once again, that's just plain old misuse hehe.

share
3  
does this macro makes everything FALSE and TRUE into TRUE? –  Display Name Dec 22 '10 at 10:19
2  
@bold: I actually ran into that some years ago; thanks to some garbled macro definitions, both TRUE and FALSE wound up evaluating to the same value (0, IIRC). Made for an interesting afternoon. –  John Bode Dec 22 '10 at 17:29
1  
@bold Or is it the other way around? –  muntoo Mar 30 '11 at 22:44
add comment

Increasing the total cost of the system for insufficient benefit. It could be too much copying and pasting, too complex an architecture, or using pricey but ineffective commercial products. Generally speaking all software techniques are aimed at reducing the total cost of a system, and if we end up with a overly expensive system then we have done wrong.

share
add comment

Redundant code is very very evil.

share
add comment

Though any tool can be used for good and evil, some tools are evil because they often surprise programmers who don't use them frequently.

I consider the unsigned right shift operator (>>>) in Java evil (surprisingly improper) when working with integers that are shorter than 32 bit.

Say you have a byte b with value -1.

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

The unsigned right shift operator shifts zeroes into the leftmost bits. So one assumes a shift by 7 to result in 1.

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

But instead this operation does nothing at all. b is still -1.

Even all of the following 25 shifts do nothing:

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

This happens because b>>>=7 roughly translates to

                                  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

You would have to replace

b >>>= i;

by

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

to make it work as 'expected'.

share
1  
i dont know java but why is this evil? are you saying it should only be used on ints and byte isnt an int? I find >>> a but weird since i know it as D's unsigned shift right which should not result in a -1. –  acidzombie24 Dec 21 '10 at 21:52
show 3 more comments

Copy-paste code.

If you don't itch when you are doing that, you are not a real programmer.

share
2  
Implicit in the answer: all real programmers have made copypasta anyway, so they know how it feels... –  comingstorm Feb 10 '12 at 19:23
add comment

Yes, there is plenty of evil to be had. For example:

Type1 variable1 = function12()
variable5 = variable1.myMethod(variable1+aGlobal);
variable2.otherMethod(anotherGlobal);
share
add comment

I'm surprised no one has floated Globals as a true evil. No better way to be programming in an environment about which you have no idea of the parameters and virtually no control over what happens to them. Chaos! I have a strict ban on the use of global variables in all of my coding.

share
6  
Find me a non-trivial application that doesn't have globals. Oh they're wrapped up and neater and protected and in a class and in a framework and generally better... but if there's just one for the application its a pretty much global. Where the issue is is with use of inappropriately scoped variables. –  Murph Dec 22 '10 at 9:23
2  
Global variables don't deserve such a bad reputation. Like @Murph said, some things are global. The file system is global (all processes use the same); your process is global to all the threads; the memory is global (another process can use up your memory and crash you while he safely use memory parachute); the user himself is global (think in terms of UI design). It's not wrong to model something inherently global as global variables -- or Singleton, or Service Locator or maybe Registry. –  kizzx2 Dec 22 '10 at 18:09
show 1 more comment

I know i said i wouldnt make a post but i'll write one answer. As much as everyone else says no there are no evils i'll say yes there are some absolute evils

Setjmp/LongJmp is pure evil.

share
1  
+1 I have yet to see a proper use case for Setjmp/LongJmp. –  Oliver Weiler Dec 22 '10 at 1:26
4  
try/finally/catch+throw are implemented via Setjmp+LongJmp. –  comonad Dec 22 '10 at 10:41
3  
SetJmp+LongJmp can be used to realize CPS (Continuation passing style) via Tail Calls using languages/compilers without PTC (Proper tail calls). It is an optimized version of trampolining.see en.wikipedia.org/wiki/Tail_call#Through_trampolining and en.wikipedia.org/wiki/Continuation#Kinds_of_continuations –  comonad Dec 24 '10 at 9:19
1  
Even more evil than setjmp/longjmp is using setjmp/longjmp to implement a poor man's super lightweight threading library (as I've seen done way back in the DOS days). Delightfully evil code! :-) –  Brian Knoblauch Jul 17 '12 at 12:45
show 19 more comments
So does absolute evil, that is something which is utterly incompatible with best practice in all instances, exist in programming? And if so what is it?

Yes; the standard C library function gets(). It's evil enough that the C standards committee has officially deprecated it, and it is expected to be gone from the next version of the standard. The mayhem caused by that one library call is scarier than the prospect of breaking 30+ years' worth of legacy code -- that's how evil it is.

share
8  
gets() takes a single argument, which is the address of a buffer. Characters are read from standard input into the buffer until a newline is seen. Because all it receives is the address of the buffer, gets() has no idea how big the buffer is. If the buffer is sized for 10 characters and the input stream contains 100, those extra 90 characters are written to the memory immediately following the buffer, potentially clobbering the stack. As a result, it's a favored malware exploit. It is unsafe and insecure by design. –  John Bode Dec 22 '10 at 15:28
show 1 more comment

Everything has it's own valid use, or it wouldn't be implemented. Things are called evil because people do not use it in a safe or proper manner. Consider this...

Is a sword evil? Nope. Just because someone may try to use a sword in a hospital does not mean it is evil. Is a can opener evil? Nope.

Everything has it's proper use. Hence, no evil.

share
add comment

Easy, IBM Rational ClearCase is an atrocity.

share
add comment

The only thing 'evil' is thinking that certain programming things are 'evil'. Various approaches - use this technique, dont use that statement, use this methodology, dont use that language, use this 'best practice', etc - are opinions.

Unfortunately, too many developers mistake opinions for objective truth.

I cringe every time I see a question on here such as 'why is [x] considered evil?'.

share
add comment

Well, I thought Microsoft is/was considered evil and now recently Oracle is the most evil thing in the world.

share
show 1 more comment

Empty generic exception handlers i.e. :

catch(Exception ex)
{
}

I don't doubt that someone can give me a valid use case - but, to be honest, its going to be seriously creative... and at the very least you need an explanation.

share
1  
+1 I was going to add this if someone else hadn't –  Conrad Frix Dec 21 '10 at 22:22
1  
Really? "I don't care if this fails or not" is never valid, not in any possible context? Not everything done needs to be guaranteed to succeed or fail, especially in small throwaway utilities. Another case where not thinking first is the real evil. –  SilverbackNet Dec 21 '10 at 23:02
4  
I see that in legacy code All. The. Time. What's worse is that people question me when I change it. –  George Stocker Dec 22 '10 at 2:01
5  
I add a email notification in it first that sends me a "empty catch block hit" type exception, and release it to prod so I can see WHY that catch is actually there, and under what conditions it's being it. Then I fix it. –  CaffGeek Dec 22 '10 at 5:35
2  
I would vote for checked exceptions in Java :D –  Nils Dec 22 '10 at 21:05
show 6 more comments

Everything that happens to work just by accident is inherently evil.

Let's consider the following C program, which happens to actually work on my machine, using default compiler options:

#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);   
   }
}

Nothing, really nothing could ever excuse the way this program increments the loop counter. It's just a undefined effect that happens to do the right thing on my machine, my compiler, my default options.

share
5  
I think this is more inherently wrong than it is inherently evil. –  Lawrence Dol Dec 21 '10 at 18:55
3  
Mel would be proud. –  Barry Brown Dec 21 '10 at 22:12
show 4 more comments

Nothing is really evil not even weapons, yet we sometimes consider them as such. However with weapons we usually have a certain level of respect, we are very much aware of their danger and use them with caution; however there are still people too stupid to use them.

The same applies to any tool, the more difficult the consequences of abusing those tools are, the more likely people are abusing them.

In programming everything is more or less virtual, a program is a representation of our thought process and the long term consequences of not understanding something entirely or getting it slightly wrong are a lot harder to determine, then the immediate danger of death we are faced with when handling a gun.

This makes the tools we use and have at our disposal a lot harder to use but it also gives us an easy way to measure the skill of a programmer. The knowledge of when and how to use the tools you have is crucial to become a good programmer. You can always play it safe by restricting the set of tools but just to the guy to whom everything looks like a nail, eventually you will encounter something that no amount of hitting will fix.

share
add comment

Programming, per se, I think, is not inherently evil. However, programming is very often a social activity, and disrespecting those around you can be very evil. People often forget that most code is going to be shared with others; mostly read, sometimes written too. Be it open source, a product that a company is releasing, or a small piece of patching up a consultant is hired for, programs are going to be read.

That's half the reason why so many "considered harmful" articles exist, or why people say "never". Making life difficult for others is the very root of all evil. Isn't it?

share
add comment

Is anything in programming truly evil?

Absolutely. Failure to use your brain and think about what you're doing and why you're doing it is the root of all programming evil.

share
2  
+1. But s/think about/understand the implications of/ and this would be even better. –  Richard Dec 22 '10 at 9:44
show 1 more comment

Some programming instructions / style / conventions are very often misused to make terrible, evil if you will code, but in the hands of a master programmer they can be used in a very elegant fashion, good if you will.

On the other hand I know of nothing that can prevent incompetent or inexperienced programmers from from producing bad, evil if you will code even with the best tools, languages, and so on.

By avoiding often misused elements, such as goto, the hope is that mediocre programmers can avoid the evil and perhaps make it somewhat easier to write good code.

share
add comment

I think skinning, auto-updaters that perpetually sit in the systray, applications that hijack file associations and other system settings, are straight evil.

Along with flash-only websites.

share
10  
so, you're telling me Adobe is evil? –  David Murdoch Dec 21 '10 at 18:38
10  
@David: What, you didn't already know that? –  Mason Wheeler Dec 21 '10 at 18:47
8  
Worst culprit for file association hijacking is QuickTime I would say. –  Orbling Dec 21 '10 at 23:15
2  
I'm coming to the conclusion that pretty much anything that Adobe and Apple do is evil. –  Brian Knoblauch Jul 17 '12 at 12:41
show 1 more comment

Not the answer you're looking for? Browse other questions tagged or ask your own question.