DCSIMG
Beware of Evil Wizards - All Your Base Are Belong To Us

All Your Base Are Belong To Us

Mostly .NET internals and other kinds of gory details

Beware of Evil Wizards

Ten years ago, Andrew Hunt and David Thomas published the incredible book, “The Pragmatic Programmer: From Journeyman to Master”. It’s not that I like this book because it has taught me so many things; I mainly like this book because of what it has not taught me.

And one thing this book has not taught me is to use Add New Item –> “Some Amazing Technology” Class Template and then just adjust the grid on the control ever so slightly, and bam – there’s your user interface in all its glory.

Here’s what “The Pragmatic Programmer” has to say about it:

[…] Tool makers and infrastructure vendors have come up with a magic bullet, the wizard. Wizards are great. […] But using a wizard designed by a guru does not automatically make Joe developer equally expert. […] Don’t Use Wizard Code You Don’t Fully Understand.

Why is that that we developers should not rely on wizard-generated code, but it’s OK for us to rely on the operating system’s code or on the .NET Framework’s code?

[…] We’d feel the same about wizards if they were simply a set of library calls […] that developers could rely on. But they’re not. Wizards generate code that becomes an integral part of Joe’s application. […] Eventually, it stops being the wizard’s code and starts being Joe’s.

It’s funny how these words never ceased to be true. Despite the ten-year-old warning against Evil Wizards, code generation inside the development environment has become an increasingly popular technique, and not just for spiffy user interface generation. Here are two wizards I use all the time, in Visual Studio:

  • Adding a WCF service reference generates a whole bunch of proxy code into your project, and not just the bare minimum service contracts and data contracts that you would otherwise write by hand;
  • Dragging a table across a LINQ to SQL design surface generates a strongly-typed data context, an entity class for each table, relationships between entities, identity constraints and whatnot.

Ten years after “The Pragmatic Programmer”, I’m not saying that you should stop using the Visual Studio wizards to generate code for you. But if you don’t understand the code generated by the wizard even though you’re using and adapting it to your needs, you’re in for some great trouble. (Unfortunately, presenters at conferences and class teachers are often guilty of spreading the trouble.*)

The telling sign is this: If a technology were easy enough so that you didn’t have to thoroughly learn it before applying it, why would there be a wizard for generating code associated with that technology?


* The most unfortunate thing is that sometimes even we, the public speakers who show other people the power of those Evil Wizards, don’t fully understand the code being generated by them. I had the chance to witness, time and again, a presenter showing a bunch of code effected by a simple click of a button, and when something goes wrong the only resort seems to be to regenerate the whole code from scratch. Is this something you would recommend to your fellow developers?

Comments

Dew Drop – January 10, 2009 | Alvin Ashcraft's Morning Dew said:

Pingback from  Dew Drop – January 10, 2009 | Alvin Ashcraft's Morning Dew

# January 10, 2010 6:12 PM

Bill Sorensen said:

Here's an article on avoiding the evil WCF wizards: www.code-magazine.com/Article.aspx

# January 23, 2010 12:42 AM

Christian Rodemeyer said:

But sometimes you need a codegenerator, e.g. if you need WCF proxies for Silverlight and normal .NET. I think if you write your own code generator, it is not an evil wizard but just a very powerful tool.

# February 14, 2010 10:09 PM

Sasha Goldshtein said:

@Christian: The book (and my quote of it) actually considers the case of "smart" code generators. The difference from Evil Wizards is that Evil Wizards become an integral part of the application's code, and they're essentially a one-time code generation process.

# March 28, 2010 1:38 PM
Leave a Comment

(required) 

(required) 

(optional)

(required) 


Enter the numbers above: