Why I hate tomcat
Everyone uses tomcat, and nobody believes the tiny minority of us who hate it. Tomcat sucks, plain and simple. For such an important piece of infrastructure, you’d like to think that smart people who know a thing or two about good java code were involved. So, in an attempt to prove my point, I will discuss a single class in Tomcat, and we can all have a look at how brilliant the code is. I specifically picked a class that was written by ‘important’ people, just to ensure you idiots know not to trust these monkeys ever, ever again. This is just ONE class, there are many many worse ones.
The class we’ll look at is Tomcat’s DefaultServlet, written by Remy Maucherat (jboss monkey now, I believe) and Craig youknowwho.
Where does one start, really? Any intern at my company who writes code like this would earn a serious ‘talking to’. It’s in fact probably wiser to just take them out back and shoot them, doing both them and the world a favour. Alas, opensores has no such safeguards, and both of these wankers are alive and well, still defecating out huge reams of code in the community’s general direction.
So let’s get started. The first issue is the fact that everywhere, Throwable is caught. Yes, even Error type exceptions are caught. Things that god and Sun never intended for applications to even try to handle, tomcat will (silently) catch and ignore. After all, when you run out of memory, best thing to do is keep going right?
We also have methods that happily check for exception message strings (search for broken pipe), so I’d advice you to never use that string in any of your own exceptions. The comment around that bit of code is also particular amusing. The exception is caught, next comment says //ignore it, and the next line? You guessed it, throw the exception!
If you’ve ever wondered what the urge to chew off your own face feels like, then look no further than the parseRange and copyRanges methods. It’s like the authors fell off the antipattern tree and hit every branch on the way down, while somehow also managing to do things to exceptions that’d make your mother blush. We have returning concrete collection types when an interface will do, a million random exit points halfway through the method, using exceptions for logic flow rather than…well…exceptions. Hell, copyRanges even RETURNS an exception (which is ignored, sometimes). Come on Craig, you work at Sun, just go down the hall and for fuck’s sake, ask someone to explain exceptions to you. You’re bound to find SOMEONE who understands the very basics.
At no point in the code is any stream closed in a finally clause, needless to say.
The pain goes on and on, and never really ends with this class. We have an impressive ignorance of how basic numeric handling in java works, as evidenced by // To avoid 0.0 for non-zero file, we bump to 0.1. We also have renderSize and displaySize, both of which do equally fucked up shit.
Ok, so maybe these kids don’t know the basics of elegant java code, that’s fine, many people don’t. At least they know idiomatic usage of java, right? They understand things like naming methods, idempotent methods, and so on. Haha, right. Calling validate on a range can have an interesting side effect of modifying the end of that range. Cool huh? You could avoid that ludicrous I’m-too-fucking-stupid-to-know-how-to-keep-it-valid-so-I’ll-guard-against-it approach by just having a length() method, that is calculated based on start and end. Anything that reduces the amount of work you people need to exert can only be a good thing, given your intellectual capacity.
This code is so abysmally bad in fact that I know of at least one person (this is NOT a joke) who uses it in interviews, asks people to identify all the things wrong with it. These are potential employees who I’m sure would be paid a lot less than Craig or Remy, but had they the same coding ability, wouldn’t be allowed in. The whole thing would make a fine contribution to dailyWTF, I’m sure.
Of course, I’m sure the tomcat fanboys would quickly whip out their collective penis and wave it about angrily. After all, it’s still popular, right? Who cares if the code is ugly, it does its job! Who cares if it’s riddled with inefficiencies, is confusing to read, can’t be maintained or picked up easily, or a million of those criteria that real developers actually care about, even though nobody else does? You’re right, nobody cares. Tomcat is a great example of how good code is, as I’ve always insisted, irrelevant.
April 20th, 2006 at 11:03 am
First, I’d like to say, I am first.
Second I’d like to say that I have seen some pretty nasty stuff in Swing as well.
Ways to avoid this:
1) Hire smart programmers (too hard to find)
2) Set up an env. where code reviews are valued
3) Use tools like PMD etc. to track problems so you can rub peoples nose is there crappy code
4) Use pair programming, training, study groups to constantly grow the ability and knowledge of your team
April 20th, 2006 at 11:09 am
You should have seen the 0.8 version of Struts. It was damn awful. It would always throw exceptions away. We had to use AspectJ so we would know what exception were being thrown. It got a lot better but this was not due to Craigy.
Here is my fav code from the DefaultServlet….
try {
value = getServletConfig().getInitParameter(”debug”);
debug = Integer.parseInt(value);
} catch (Throwable t) {
;
}
try {
value = getServletConfig().getInitParameter(”input”);
input = Integer.parseInt(value);
} catch (Throwable t) {
;
}
try {
value = getServletConfig().getInitParameter(”listings”);
listings = (new Boolean(value)).booleanValue();
} catch (Throwable t) {
;
Not only do they catch Throwable, but they just throw the damin exception away.
Let’s say I accidentily types ture isntead of true. Instead of getting a nice exception to let me know it did not work. It just fails silently.
This code is horrible.
April 20th, 2006 at 11:15 am
Then there are the webframeworks (ugh!).
Thanks for writing this. I find myself gritting my teeth over the din of Tomcat fanboys constantly. It’s really too much to expect people to know how to code when so much of programming’s “install tomcat” and later wonder why things get worse.
A series of exposes like this would be an eye opener for those of the opensorse faith.
April 20th, 2006 at 11:26 am
I’m biased, but just wanted to say most products have awful code somewhere, and we would very gladly welcome any cleanup or other contribution you care to make: http://issues.apache.org/bugzilla is open ;)
April 20th, 2006 at 12:03 pm
Well I must say don’t use that code as example how to code good java… But as said every application has its parts of bad code even the commercial ones!
So as remark to ‘Struts sucks to’ bad code is not just a problem in open source community, it is a general coding problem… open source or commercial products
April 20th, 2006 at 12:34 pm
There’s never any excuse for this type of shit. It always boils down to pure unadulterated laziness. Either the culprit is too lazy to do it right or they are ignorant of how to do it right, but too lazy to learn how. (BTW if you are too stupid to realize your ignorance then you don’t belong in the business, you belong in the burger flipping business, ignorance isn’t a bad thing, it can be addressed as needed, stupidity is).
I’ve spent too much time cleaning up this kind of feces to have any patience for it, open source, commercial, or otherwise.
I like to garden at home. I don’t just run out there and take a crap on the dirt, throw down 5 bags of nitrogen and fling seeds in the air screaming like an enraged fornicating gibbon. I take the time to research and learn the right ways to do it because I want success not shit. There are plenty of resources out there on the right way to do things, gained by many years of past trial and error, whether its gardens or programming. Why can’t so many developers take the time to learn to do their freaking jobs?
April 20th, 2006 at 12:51 pm
LOL over this entire thread
April 20th, 2006 at 12:54 pm
I can cope with ugly code if it’s going to make things ultrafast! But it sure isn’t going to be fast here. To do a directly listing, they:
- create the listing in a StringBuffer statements
- copy that to a byte array
- copy from that inputstream into another byte buffer, 2k at a time
- copy from that byte buffer to the ServletOutputStream
Yuck.
April 20th, 2006 at 1:16 pm
Wow - you actually linked to something. I believe this is the first I’ve ever seen on the bile blog. I dig this post as I’m hoping to do a Tomcat vs. Jetty Smackdown in the near future. I’m defending Jetty, so if you want to rag on that sucker, it might help the other guy out.
April 20th, 2006 at 1:19 pm
You can shit on the code all you want, but I have to say the indentation is unimpeachable.
April 20th, 2006 at 1:20 pm
Hey, if you’re looking for the truly insane stuff, check out WebappClassLoader (#findResourceInternal(String, String), line 1853 of 2335 (!) in 5.5.16).
What it’s doing is to unpack all files in all archives sequentially until it finds the file it’s searching for. Think about the implications when loading a large application, say, one with 20 MB worth of JARs.
“// Extract resources contained in JAR to the workdir” my ass.
April 20th, 2006 at 2:11 pm
> if (log.isDebugEnabled())
> log.debug(”getResource(” + name + “)”));
For fucks sake just put the goddamn isDebugEnabled() check in the bloody log.debug() method!
> /**
> * Get the lifecycle listeners associated with this lifecycle. If this
> * Lifecycle has no listeners registered, a zero-length array is returned.
> */
> public LifecycleListener[] findLifecycleListeners() {
> return new LifecycleListener[0];
> }
Ever heard that bad documentation is worse than no documentation??
I have to stop now before I spoil my diner.
April 20th, 2006 at 2:38 pm
It will probably come as no surprise that I regularly used the Tomcat source base to brainstorm and test out code inspections for inclusion into IntelliJ IDEA. There are indeed some deep and stupid waters flowing through that project. The amazing thing is that it somehow seems to work most of the time.
April 20th, 2006 at 2:56 pm
Yup, I do the same thing with PMD and CPD - try dredging around Azureus and you’ll find some interesting stuff. 200 lines of copy/pasted code, all that sort of thing, good times…
April 20th, 2006 at 3:14 pm
As much as I love reading Hani’s bile, I’m more amused by all of the morons who get worked up into frenzy and feel the need to join in.
April 20th, 2006 at 4:02 pm
Not to defend those particular pieces of code - they are bad, all right, or “controversial” to say the least, I couldn’t help but pointing out though that most of those were probably written in the early days of tomcat, and, as more and more “mission critical” sites start running it, the developers probably become more and more reluctant on changing something so fundamental (like, the servlet that serves “all the static resources”).
April 20th, 2006 at 4:25 pm
That OutOfMemoryError’s bitten us a number of times.
What I find a little troubling about Tomcat devs is that they refuse to accept bugs. A colleague of mine had to suffer through this just to get an obvious bug accepted:
http://www.nabble.com/yet-another-tomcat-goes-stable-and-I-still-have-to-make-a-custom-package-t1318004.html
This response on the mailing list from a while back has the same theme as this post:
http://mail-archives.apache.org/mod_mbox/tomcat-dev/200511.mbox/%3C003901c5e0f128ef2ab00100a8c0@helen%3E
April 20th, 2006 at 4:46 pm
Sure, Tomcat is nothing to put on a pedastal but what server do you recommend? I’ve worked with Weblogic and Websphere which cost a great deal of money and they are absolute fucking garbage. I honestly can’t figure out how they get away charging money for this fucking crap. I got so tired of filling bugs against WLS that I just gave up. (They don’t fix them anyhow even across major versions!) It would be easier to teach Britney Spears particle physics. Their code quality is ass, of course you have to use Jad to figure that out (which I of course wouldn’t do because that’s wrong and stuff).
Please, oh please, oh Great One…share with us which server is worthly because I sure as fuck can’t find it. Given that they all suck, I just assume use Tomcat or JBoss (for full J2EE stack). At least that way I’m not paying them to fuck me up the ass.
April 20th, 2006 at 4:51 pm
THAT’S why you hate Tomcat ?!?
I thought it was something important, like it didn’t work or something.
The reason I use Tomcat is that it installs when I click the little button. And then it uninstalls later. That’s very good.
I figure that if the other ‘containers’ out there require so much more fucking around to install, they must be more poorly designed and the companies making them must suck.
I mean, if you had control of your product build process, you would have the product on a CD or in an install package, just like Tomcat.
See, if you couldn’t do that, there would be no way you could be sure that you were testing a specific build target back home at the ranch. Right ? If your testers had to download several pieces of crap, and then install them in the right order, and then configure them with the right magical values, which you may or may not have documented correctly for them, you would be pretty sure that each of those poor bastards would be testing a slightly different set of software. And that would consume lots of valuable tester time, anyway.
So obviously you would have that CD or package if you were a professional development company.
And then of course that would be the way you distribute your cool new software to users, because you would save money yet again by reusing the packaging.
And the only reason you WOULDN’T do it that way is because … well … because you didn’t have control over your build process.
And in that case you would suck.
And because you would suck, your software would suck, and would fail at strange times, and would cost too much, and you would not be able to provide correct documentation - because, after all, you could not be sure what you had built in any release.
Oddly enough, that idea seems to have some value - the kind of awkward semi-integrated collections of things that IBM and Oracle keep pumping out are, indeed, hard to install, hard to configure, hard to use, and do, indeed, exhibit odd failure modes, and are, indeed, accompanied by strange approximations of documentation.
Ah … huh. Well, that was strange. I wonder why God made me write that ?
< < dailyWTF >>
What ?!? Is this a bileFeature I don’t know about ? More bileContent ? Where is it ? Tell me now !!!
April 20th, 2006 at 4:59 pm
You know, I think this is just sour grapes. You’re just jealous that you can’t support the community through instructional examples like this with your own code.
April 20th, 2006 at 5:00 pm
Hani code ! Hani code ! Hani code !
April 20th, 2006 at 6:17 pm
>> if (log.isDebugEnabled())
>> log.debug(”getResource(” + name + “)”));
>
>For fucks sake just put the goddamn isDebugEnabled() check in the bloody log.debug() method!
Uhh… sorry 85.81.63.45, but you’re about as stupid as the guys that wrote DefaultServlet in the first place; this snippet of code is one of the few things they managed to get right. Perhaps you should go apply for that burger flipping job too?
April 20th, 2006 at 6:34 pm
Well, Mister (aka, 212.158.207.146) You just spoiled his dinner.
Apparently the guy is not a programmer, rather an architect, “a cute guy who always makes me laugh” when he talks about code. Thanks.
PS: It’s 85, for Christ’s sake! Gotta love those numbers.
April 20th, 2006 at 6:52 pm
To “85.81.63.45″ that is upset by this:
> if (log.isDebugEnabled())
> log.debug(”getResource(” + name + “)”));
[whistle...] you should be embarrassed! The whole idea is to save on the string building calls.
The goddamn isDebugEnabled() check _is_ inside the bloody log.debug() method. I promise!
April 20th, 2006 at 7:09 pm
>[whistle...] you should be embarrassed
The guy is never embarrassed. That’s the whole point of Hani’s post. ;-)
April 20th, 2006 at 7:44 pm
hi 85.81.63.45/Julius,
The reason log.debug() is enclosed within a isDebugEnabled() is to prevent
a) string building calls
b) AND possibly more expensive calls to other methods.
If this was C/C++, one could use the pre-processor, but java doesn’t easily give ways to hide them. One way would be to do bytecode re-writing (which identifies log.debug() calls) and then encloses them within if (log.isDebugEnabled() calls)
BR,
~A
April 20th, 2006 at 9:39 pm
re: drifting off topic about log.debug() etc
Another way would be to pass the individual pieces of the string to the logger and let it assemble them IFF isDebugEnabled(). A debug() signature using something like Formatter would do it.
April 20th, 2006 at 11:11 pm
>> if (log.isDebugEnabled())
>> log.debug(”getResource(” + name + “)”));
>The goddamn isDebugEnabled() check _is_ inside the >bloody log.debug() method. I promise!
I think he’s suggesting that the log.debug() method contain a check for log.isDebugEnabled()……not that that makes any more sense…
April 21st, 2006 at 12:46 am
Excellente!! Hani my man, you’ve just given me the ‘example code’ I was looking for to put in my company’s coding standards document.
I’m going to add that this code formed part of the ‘Reference Implemenation’ of the Servlet Spec. Correct me if I’m wrong
Muahhhhhaahahahaha
April 21st, 2006 at 3:52 am
You know what would be really cool? If you tried to modify the code to clean it up, and say throw those exceptions, that other irrelevant parts of tomcat would break.
Genius hani. Keep it up!
April 21st, 2006 at 7:47 am
Forget the exceptions.. check out all those missing semicolons!
April 21st, 2006 at 10:33 am
>>For fucks sake just put the goddamn isDebugEnabled() check in the bloody log.debug() method!
But I am sure that you realize that having the external “if” avoids parameter evaluation, while putting it inside does not…
April 21st, 2006 at 10:56 am
Alas, that’s the beauty of opensource
A. The software seems to work (mostly :-)
B. You can see how it can be improved
C. If you really care you can fix it
D. even the ‘know it alls’ don’t know it all… Which is almost amusing as hani’s bile…
April 21st, 2006 at 1:53 pm
Every let’s pull our penises!
April 21st, 2006 at 11:09 pm
This might be a silly question, but does anybody know of any projects that “model” good design and coding techniques? Even if they are snippets which don’t accomplish anything, it would nice to see how to handle various situations. I used to refer back to the JDK, but that proved to be more of a lesson in bad practices. Anything on the Sun website is equally as useless. Design patterns are helpful, but don’t cover the general rules we should all get in the habit of enforcing in every class or method we compose. For instance, proper exception handling, making use of interfaces and always validating input (granted these are simple, but still useful to people new to development).
If I’m way off here, feel free to respond to me in true bile comment form by attacking me personally. :)
April 22nd, 2006 at 10:28 am
1.
> if (log.isDebugEnabled())
> log.debug(”getResource(” + name + “)”));
2.
>[whistle...] you should be embarrassed! The whole idea is to save on the string building calls.
[fart...] #2 is right in general, but arguably the code (#1) has a fairly minor overhead for ’string building calls’.
It also won’t compile.
It (specifically) is not in the linked file too.
Or maybe it is but I couldn’t find it.
Hah! So everyone’s an idiot. And now it smells in here.
April 22nd, 2006 at 9:30 pm
Sam, have you had a look at Resin? It’s inexpensive, and IMHO, very good quality, too.
April 23rd, 2006 at 1:00 am
How do you control the start-up sequence of Tomcat webapps? Thanks.
April 23rd, 2006 at 5:35 am
This is the beauty of open source - the code is reviewed!
“Any intern at my company who writes code like this would earn a serious ‘talking to’.” Yeah, right. I doubt there is code audit of all code written, or even a small fraction of the code written.
The thing is, very few people will see closed source code, because of this you never know the quality of closed source code, and often it’s worse than the above examples.
April 23rd, 2006 at 11:59 pm
I would be fired if I wrote code that bad. True, very little of my code is seen prior to being put into production. But eventually someone else in my company is going to have to look at it, and then they would know my shame.
I wonder if the principal authors of tomcat are employed, and if so if the rest of their work is as poor.
As for the comment on the beauty of open source, I think you are wrong. That tomcat code has been there a long time. Either it wasn’t reviewed, it was reviewed only by very poor programmers, or the leaders of the project refused to allow anyone to fix it.
April 24th, 2006 at 5:07 pm
Smoke signal bad, make eyes hurt.
Oog think pigeon look nice. But pigeon bad, smell too much. OK, nobody perfect.
Oog use tomcat. Oog know tomcat work. Fate say tomcat bad, but what Fate know ?
Oog like Fate.
April 26th, 2006 at 10:42 am
Dear Fate,
I think you’ve missed the spirit of open source altogether. So let me enlighten you:
1. Open Source is great because it’s free. My guess is that you haven’t paid one cent in order to use Tomcat.
2. Open Source is great because you have a chance to correct mistakes that others made. My guess is that you haven’t made one single attempt to send in a patch or make a valid contribution to the Tomcat project.
3. Open Source is great beacuse there are often several forums where you can give constructive critizism about the code without enduldging in attacks on individuals. Ever tried that approach?
What open source projects do you participate in? Where can we view the (no doubt perfect) code that you’ve written?
Perhaps I’m wrong. Perhaps you really are contributing to Tomcat. And perhaps you have good answers my questions. If not, I suggest you puke your bile acid on someone else.
April 26th, 2006 at 11:08 pm
Hani is very involved in OpenSource projects. But so what if he is not, crap is crap. Craig is very dominant in his influence on corporate developers. This was a great post.
April 27th, 2006 at 9:25 am
This was a great post.
No, if this post was great, Hani would have suggested a good or -not so bad- server to trust on. If it doesn’t exist, it’s time for you the smart guys to write one and earn a lot of $$
April 27th, 2006 at 2:00 pm
[Trackback] To add to the beautiful Why I hate Tomcat, here’s another subtly w0rng example of resource usage in Tomcat:
protected ObjectInputStream openDeserializeObjectStream(byte[] data) throws IOException {
ObjectInputStream ois = null;
…
April 27th, 2006 at 4:06 pm
About the whole isDebugEnabled flap. Sure you can use this to optimize performance critical code, but this should be done carefully and only after benchmarking, profiling, etc. Littering all your code with that is a terrible practice. 99% of the time it won’t make a damn bit of difference. I could not even find that in the source cited, so who knows what context it was in, but as far as I know this DefaultServlet is just used to render directory listings. It’s not as if the directory listings have to be rendered blazingly fast! Man, what a misplaced priority. I could certainly see this in connection management and IO code…but for directory listings? Give me a break.
April 28th, 2006 at 10:02 pm
Well, what does one expect, when “official” example code on java.sun.com sports gems like this:
Vector v = new Vector();
v = someMethodReturningVector();
I’m sure the guy who wrote this has never heard of generic types or interfaces, let alone ever looked into the docs of - in this case - the collection API.
And then the compiler spat out that annoying “variable v might not have been initialized”-message, so well, now he’s initializing it… yuck.
How shall inexperienced developers learn about language principles and decent coding practices when such basic stuff is f…d up like that inside of example code published by the very creators of the language? If I didn’t know better, I’d expect code from a company trying to advertise their language to be a stronghold of best practices ;o)
April 30th, 2006 at 5:45 am
Both the tomcat code quoted and earlier version Struts seem to be done by the same person.
April 30th, 2006 at 7:07 am
huh? have you tried how stringent apache foundation’s quality assurance is (ah, yes, documents suck, but the components do not). If you hate tomcat, what else would merit your recommendation then? major java ee servlet containers are derivatives, in one way or another, of tomcat.
by implicitly saying tomcat sucks, then you must be abhoring web frameworks, IoC containers and plain Java EE in general.
this blog post, sir, is definitely a nice comment magnet. cheers.
May 2nd, 2006 at 10:00 am
> > if (log.isDebugEnabled())
> > log.debug(”getResource(” + name + “)”));
> For fucks sake just put the goddamn
> isDebugEnabled() check in the bloody log.debug()
> method!
I have to respond to this because it’s one of my pet peeves. Why would you “put the goddamn isDebugEnabled() check in the bloody log.debug() method”? What’s the benefit of doing this? You save 25 characters in the source code per debug invocation (are you that short on disk space?) You save one line per invocation (and yes, more code now fits on a screen… but if you’re really that concerned with fitting more code on a screen, you could concatenate those two lines into one). As far as upside, that’s it - a teeny, tiny, itty-bitty microscopic iota of prettierness (in a sea of ugly).
Now, the down side of “putting the goddamn isDebugEnabled() check in the bloody log.debug() method”. Every time this line of code is hit, three strings need to be concatenated, and a function needs to be invoked - just to determine that the strings didn’t need to be concatenated and the function invoked. For every single debug statement (which were so plentiful that adding the “goddamn isDebugEnabled() check” was so painful that it impacted your ability to read the code).
Now you’re supposed to quote Knuth and say “Premature optimization is the root of all evil”, because I’m sure what Knuth meant when he said that was “Write deliberately slow code that you know wastes time and memory for absolutely no benefit whatsoever just so you can go back and change it when the profiler tells you that you have, in fact, written deliberately slow code that you knew wasted time and memory”.
May 3rd, 2006 at 10:33 am
This is just more evidence for my belief that there is no (non-trivial) software product or module that contains fully ‘clean’ code.
Hani I appreciate your pain but the problems with this code pale in comparison to what I have to work with on a daily basis. It’s not that impressive to me. The code you link to is crappy, yes, but the code I work with is the result of a guess, test, guess development methodology.
May 4th, 2006 at 1:02 am
My wise friend,
How you can tackle about broken pipe exceptions tell me.
I worked on the same on WebLogic & our each appliation have to be handle this exception.
:-)) I think this is good to no throw exception.
May 4th, 2006 at 6:55 pm
It is a shame that this site still hosting an article with som much swearing words.
I though all Java developers are professional, but here is an exception.
It would be great if teh author or someone rewrites this article.
May 10th, 2006 at 11:54 am
I can understand having to grep for the broken pipe exception and trapping it. That exception occurs whenever someone closes their web browser or navigates to a different page while a file (say, an image or video) is in the process of downloading. If you don’t trap it, your log is littered with errors and lusers get angry.
But yeah, everything else is absolutely awful.
May 17th, 2006 at 1:15 pm
tjeeh, i was just disgusted by tomcat because it started up so slow and went jetty a while ago. When i see that DefaultServlet code i cannot believe my eyes man, throw away throwables????????
July 5th, 2007 at 3:06 am
I think the author has personal problems with the coders of specified class. Because no bad code deserve such bad words and swearings.
July 6th, 2007 at 12:35 pm
Would you people get over the use of foul language? The man curses. Accept it and stop wasting my time with your puritanical whining. Also, anyone who derides the author for using (correctly spelled) vulgarities while they post in the most vulgarly misspelled English should devote their time to reading a dictionary rather than this blog.
July 21st, 2007 at 3:44 pm
Why is it most programmers have the most absolute terrible manners? I’m right, he’s right, name calling, etc.,
Heck I’ll code things the way I like to, and if other programmers dont like it, well that just doesn’t bother me.
I’ve never had a client that complained about my coding practices, and they are the ones who pay me, therefore, they are the only ones that matter. They could care less how it’s built, they want it today. And if I have to fix or work on someone else’s code, I just do it. I get paid the same.
There’s always some coder out there that will bad mouth code, whether it’s perceived to be correct or not.