views:

753

answers:

22

I'm working on a tool that will output an interface and a couple classes implementing that interface. My output isn't particularly complicated, so it's not going to be hard to make the output conform to our normal code formatting standards. But this got me thinking: how human-readable does auto-generated code need to be? When should extra effort be expended to make sure the generated code is easily understood by a human?

In my case, the classes I'm generating are essentially just containers for some data related to another part of the build. No one should ever need to look at the code for the classes themselves, they just need to call the various getters it provides. So, it's probably not too important if the code is "clean". However, what happens if you're generating code that has a decent amount of logic in it?

+14  A: 

I think it's just as important for generated code to be readable and follow normal coding styles. At some point, someone is either going to need to debug the code or otherwise see what is happening "behind the scenes".

Scott Dorman
You got the most votes, so you get to be the accepted answer. :)
Herms
It not a popularity contest ;-) but it is a short and correct answer +1
Johan
A: 

It's quite possible that somebody in the future will want to go through and see what your code does. So making it somewhat understandable is a good thing.

You also might want to include at the top of each generated file a comment saying how and why this file was generated and what it's purpose is.

Mattias
+3  A: 
Anders Sandvig
I'm not sure obfuscating it is a good way to discourage people from "hacking" it. I just stuck a big comment at the top of the file saying that the code is regenerated at build so changes will be lost.
Herms
Good or not, I speak from personal experience. I have several times observed developers "hacking" generated code instead of changing the generator implementation because they didn't understand the code generator and were too lazy to spend time learning it.
Anders Sandvig
Even people who do understand the code generator are sometimes too lazy to update, recompile and rerun it.
Anders Sandvig
cartoonfox
If the code is automatically generated, any changes will be destroyed in the next build, assuming you don't check in generated code, so your point is moot, the "rogue" developer will only be able to make changes on his own copy of the system, which is useful many times, like when trying to debug the generated code.
Juan Mendes
A: 

Generally, if you're generating code that needs to be human-modified later, it needs to be as human-readable as possible. However, even if it's code that will be generated and never touched again, it still needs to be readable enough that you (as the developer writing the code generator) can debug the generator - if your generator spits out bad code, it may be hard to track down if it's difficult to understand.

Adrian
A: 

I would think it's worth it to take the extra time to make it human readable just to make it easier to debug.

Jacksonh
+1  A: 

I would say that it is imperative that the code is human readable, unless your code-gen tool has an excellent debugger you (or unfortunate co-worker) will probably by the one waist deep in the code trying to track that oh so elusive bug in the system. My own excursion into 'code from UML' left a bitter tast in my mouth as I could not get to grips with the supposedly 'fancy' debugging process.

TK
A: 

Generated code should be readable, (format etc can usually be handled by a half decent IDE). At some stage in the codes lifetime it is going to be viewed by someone and they will want to make sense of it.

Ron Tuffin
A: 

I think for data containers or objects with very straightforward workings, human readability is not very important.

However, as soon as a developer may have to read the code to understand how something happens, it needs to be readable. What if the logic has a bug? How will anybody ever discover it if no one is able to read and understand the code? I would go so far as generating comments for the more complicated logic sections, to express the intent, so it's easier to determine if there really is a bug.

David Thibault
A: 

Logic should always be readable. If someone else is going to read the code, try to put yourself in their place and see if you would fully understand the code in high (and low?) level without reading that particular piece of code.

I wouldn't spend too much time with code that never would be read, but if it's not too much time i would go through the generated code. If not, at least make comment to cover the loss of readability.

Vargen
+1  A: 

You will kill yourself if you have to debug your own generated code. Don't start thinking you won't. Keep in mind that when you trust your code to generate code then you've already introduced two errors into the system - You've inserted yourself twice.

There is absolutely NO reason NOT to make it human parseable, so why in the world would you want to do so?

Adam Davis
Sure there's a reason. It can take more time to write the generator such that it outputs readable code. Depending on the extra effort, and the usage of the output, it may not be worth spending the extra effort.
Herms
But were not talking 100% beautiful code, the level should be readable code. A big difference there!
Johan
A: 

If this code is likely to be debugged, then you should seriously consider to generate it in a human readable format.

Romain Verdier
+2  A: 

Yes it does. Firstly, you might need to debug it -- you will be making it easy on yourself. Secondly it should adhere to any coding conventions you use in your shop because someday the code might need to be changed by hand and thus become human code. This scenario typically ensues when your code generation tool does not cover one specific thing you need and it is not deemed worthwhile modifying the tool just for that purpose.

Sklivvz
A: 

There are different types of generated code, but the most simple types would be:

  1. Generated code that is not meant to be seen by the developer. e.g., xml-ish code that defines layouts (think .frm files, or the horrible files generated by SSIS)
  2. Generated code that is meant to be a basis for a class that will be later customized by your developer, e.g., code is generated to reduce typing tedium

If you're making the latter, you definitely want your code to be human readable.

Classes and interfaces, no matter how "off limits" to developers you think they should be, would almost certainly fall under generated code type number 2. They will be hit by the debugger at one point of another -- applying code formatting is the least you can do the ease that debugging process when the compiler hits those generated classes

Jon Limjap
+1  A: 

The whole point of generated code is to do something "complex" that is easier defined in some higher level language. Due to it being generated, the actual maintenance of this generated code should be within the subroutine that generates the code, not the generated code.

Therefor, human readability should have a lower priority; things like runtime speed or functionality are far more important. This is particularly the case when you look at tools like bison and flex, which use the generated code to pre-generate speedy lookup tables to do pattern matching, which would simply be insane to manually maintain.

You forget about repetitive code that a lot of people cut and paste.... That code is not complex, it is just boring to write the same translation code 50 times with different names (I have seen system that does this), and the quality goes up if that code is auto generated instead.
Johan
A: 

Like virtually everybody else here, I say make it readable. It costs nothing extra in your generation process and you (or your successor) will appreciate it when they go digging.

For a real world example - look at anything Visual Studio generates. Well formatted, with comments and everything.

Marc
+2  A: 

Look up active code generation vs. passive code generation. With respect to passive code generation, absolutely yes, always. With regards to active code generation, when the code achieves the goal of being transparent, which is acting exactly like a documented API, then no.

Jesse Millikan
A: 

Generated code is code, and there's no reason any code shouldn't be readable and nicely formatted. This is cheap especially in generated code: you don't need to apply formatting yourself, the generator does it for you everytime! :)

As a secondary option in case you're really that lazy, how about piping the code through a beautifier utility of your choice before writing it to disk to ensure at least some level of consistency. Nevertheless, almost all good programmers I know format their code rather pedantically and there's a good reason for it: there's no write-only code.

A: 

Absolutely yes for tons of good reasons already said above. And one more is that if your code need to be checked by an assesor (for safety and dependability issues), it is pretty better if the code is human redeable. If not, the assessor will refuse to assess it and your project will be refected by authorities. The only solution is then to assess... the code generator (that's usually much more difficult ;))

+4  A: 

Yes!, absolutely!; I can even throw in a story for you to explain why it is important that a human can easily read the auto generated code...

I once got the opportunity to work on a new project. Now, one of the first things you need to do when you start writing code is to create some sort of connection and data representation to and from the database. But instead of just writing this code by hand, we had someone who had developed his own code generator to automatically build base classes from a database schema. It was really neat, the tedious job of writing all this code was now out of our hands... The only problem was, the generated code was far from readable for a normal human.

Of course we didn't about that, because hey, it just saved us a lot of work. But after a while things started to go wrong, data was incorrectly read from the user input (or so we thought), corruptions occurred inside the database while we where only reading. Strange.. because reading doesn't change any data (again, so we thought)...

Like any good developer we started to question our own code, but after days of searching.. even rewriting code, we could not find anything... and then it dawned on us, the auto generated code was broken!

So now an even bigger task awaited us, checking auto generated code that no sane person could understand in a reasonable amount of time... I'm talking about non indented, really bad style code with unpronounceable variable and function names... It turned out that it would even be faster to rewrite the code ourselves, instead of trying to figure out how the code actually worked.

Eventually the developer who wrote the code generator remade it later on, so it now produces readable code, in case something went wrong like before.

Here is a link I just found about the topic at hand; I was acctually looking for a link to one of the chapters from the "pragmatic programmer" book to point out why we looked in our code first.

Sven
Just run the autogenerated code trough a beautifier can make a lot of difference, then a lot of the indentions get right anyway. Then to have the code generator insert some \n (new line) is not that bad either ;-)
Johan
+1  A: 

One more aspect of the problem which was not mentioned is that the generated code should also be "version control-friendly" (as far as it is feasible).

I found it useful many times to double-check diffs in generated code vs the source code.

That way you could even occasionally find bugs in tools which generate code.

squadette
In this case the generated code isn't version controlled. It's generated as part of the build. But that is a good point. At one point the old version of the generator was creating things in a random order. Just making it sort alphabetically made thigns nicer.
Herms
A: 

It depends on whether the code will only be read by a compiler or also by a human. In addition, it matters whether the code is supposed to be super-fast or whether readability is important. When in doubt, put in the extra effort to generate readable code.

Wouter Lievens
A: 

I think the answer is: it depends.

*It depends upon whether you need to configure and store the generated code as an artefact. For example, people very rarely keep or configure the object code output from a c-compiler, because they know they can reproduce it from the source every time. I think there may be a similar analogy here. *It depends upon whether you need to certify the code to some standard, e.g. Misra-C or DO178. *It depends upon whether the source will be generated via your tool every time the code is compiled, or if it will you be stored for inclusion in a build at a later time.

Personally, if all you want to do is build the code, compile it into an executable and then throw the intermediate code away, then I can't see any point in making it too pretty.

Jon Mills