Wed 2 Apr 2008
Finding Misery in Another Programmer’s Success
Posted by Scott Hackett under Programming
[21] Comments
I was introduced to the word schadenfreude by an episode of the Simpsons, “When Flanders Failed“. It’s a german word that means “pleasure from misfortune”. In this episode, Homer finds happiness in watching Flanders’ Leftorium shop go out of business. The Wikipedia reference to it says that the opposite meaning of schadenfreude would be “happiness in another’s good fortune,” but I think that the opposite should really mean “misery in another’s success”. This sentiment has a long, unfortunate place in software development.
![]()
My first job as “the VB guy”
I graduated with a masters in CS, and my research involved working with the Air Force on a neural network algorithm they were implementing. This was all done in C++ and by the time I graduated, I was proficient in the language. My first job was at a startup with 3 other people, where we needed to get something done very quickly and we used VB4 (the latest VB at the time) to write the entire thing. I had never worked in VB before, but I picked it up quickly and learned how to push it to the edge of what it could do, which was a lot.
I remember being blown away by how fast we could test ideas and write new parts of the system, compared to the work I had done in C++ before. VB didn’t have inheritance and of course it had its own quirky syntax, but the power of how fast you could get things done was amazing.
That project went extremely well and we got an enormous bid to continue our work. At that point, I was firmly rooted in my place as a developer of the initial product and would continue developing it. However, we needed to start writing our own device drivers for new peripherals that we needed to interface with. In came the C++ programmers, and shortly after, I became known not as the lead programmer of the main product, but rather as “the VB guy”. As the VB guy, I was always pretty far outside of the C++ clique, even though a year before I had considered myself a proficient C++ programmer.
It’s a scar I think I still carry to this day.
Any idiot can program [insert high level language]!
Anyone who has worked for a significant amount of time in VB, Ruby, Perl, or even C# and Java probably knows where I’m coming from. There is a large number of people who hate these languages purely because they allow newer, less experienced programmers to develop working code quickly. You don’t need to know what a pointer is to program any of these languages. You don’t need to know how memory is allocated for new objects, and for the most part you don’t have to be conscious of freeing it either. You don’t need to understand a lick of the Win32 API to make a working client application in VB. The list goes on and on and on…
There are also programmers who have battle wounds from debugging memory leaks from unfreed pointers. There are those that learned to program Windows applications from Petzold’s book where you wrote the WinMain function and the message loop by hand. There are programmers who learned COM by hand writing their own implementation of QueryInterface and doing their own reference counting. Many of these programmers watch in horror as new, inexperienced programmers get the same end result in a small fraction of the time because their higher level language wraps up what they’ve spent years mastering, and makes it “just work”.
Check your ego
I believe that’s where so much of today’s language bitterness comes from. All programmers strive for higher levels of abstraction and functionality, whether it’s through libraries or frameworks. However, there’s a level at which the programmers who understand what happens internally start to despise the programmers that make use of that abstraction without understanding those internals. It’s a smug, arrogant attitude that makes a developer believe that they are a better programmer, or that their language is better, because they work at a lower level. Unless you are writing your code in 1s and 0s, there is always a huge amount of “scaffolding” underneath you that you just rely on.
If you’re one of these people, get over yourself. There are both great and terrible programmers in every language. There are brilliant VB programmers and there are frighteningly bad C++ programmers out there. If you resent beginner programmers being able to write apps quickly in VB, or put together a web site quickly in Rails, then you need to seriously rethink what the point of programming is in the first place. Their success should be your happiness.
April 2nd, 2008 at 9:36 am
I am not sure that this sentiment is correct or not.
I am not saying it is wrong, I am just thinking that it depends a lot on where someone works at.
We can take the growth of the www, and the aspects (html, xml, css, javascript, lateron php etc..) are all not that difficult to understand.
Altogether they are rather complex still, but one by one they are not so complex.
I think when one contrasts these with something like C++ then I wonder why any C++ coder does not realize that complexity in itself is a problem.
It is a problem with the above combination too, but the single problems are much easier to understand than wondering about templates usage and parser happiness. It is why I predominantly write in Ruby mostly, but the biggest aspect is the human factor in it.
And I also have begun to really appreciate data as a first step to a solution. It may be awkward to say but I think if you have all the data, and if you manage to put it into a structure, you have a lot of the solution before your feet already.
I even think that tying data into .h files is not a very good solution. Nor to tie it into XML (but at least XML conquered the world…)
I think I digress here, so my point is:
I basically agree with what you wrote here. It is important to acknowledge that there are good solutions in every language, even in languages that suck. And in the long run, people will tend to use solutions that “give them more for their bucks/time” in various aspects, i.e. by using higher level languages that allow them to control a lot of things.
In fact I even believe that when someone uses i.e. python, it does not matter much if he is on windows or on Linux. So in a way, these easy languages will continually win people that use them.
April 2nd, 2008 at 10:04 am
In the future, we’ll all be coding to abstractions on top of abstractions on top of another pile of abstractions forming a technology stack so high up, no-one really understands how or why it works. When that day comes, debugging will become really, really difficult.
April 2nd, 2008 at 11:16 am
Bobo, you can dig a hole with a spoon if you like, but I would rather use a shovel.
April 2nd, 2008 at 11:53 am
When I was in Undergraduate Calc II, we had to buy as a requirement the TI-92. This calculator was great… not only did it graph, but it could do matrix algebra, equation solving and some derivatives and integrals.
Of course, some professors had a nutty about people running around with these calculators, up to the point of forbidding them in class. They argued that students weren’t learning how to solve equations or do integrals by hand since the calculator was doing it for them.
This was perfectly true. The point of the calculator was to allow us to do much more complicated problems with very interesting solutions without getting hung up on the final integral needed to get the answer.
My advisor put it perfectly: “When calculators first came out, math professors were outraged because students no longer bothered to learn how to calculate a sin or a tan by hand. Of course, no one does this now because it’s a waste of time that is better spent doing more complicated problems”.
Just because you can code in a low level language doesn’t mean it’s better to do so. I know it’s a painful ego hip-check to the die hard coders out there, but using high level languages saves time, and time is money. If you are still holding on to C++ with a death grip because you feel superior, you’re just dating your skills and making yourself less marketable.
April 2nd, 2008 at 12:06 pm
I think there needs to be a word to describe those whose smug attitude stems from the fact that they work at a higher level of abstraction, like the Ruby developers who think Java developers should envy them because it takes fewer keystrokes to write a for loop in Ruby.
April 2nd, 2008 at 12:24 pm
I love my ASM. All those C++ guys are just posers.
Seriously though, I love PHP too and when it comes down to it a language is just a language. Everyone needs to get off their high horses and realize that most of development is theory. If you have the theory any language is just syntax. Even ASM.
April 2nd, 2008 at 12:32 pm
I was definitely one of those elitist snobs in the past. I used to despise low barrier of entry languages such as VB. They seem to be enablers for unskilled, untrained hobby programmers; people that normally wouldn’t be a programmer. The effect being that higher levels of garbage software gets created. And the martket for skilled programmers becomes devalued.
I used to joke with my friends that software development should be unionized and regulated. Each programmer would have to go through required training and certifications. A programmer would be rated for what types of projects they can competently work on. This would help weed out or identify the bad programmers.
As we progress technically as a society, we come to rely more and more on software everyday. A union would help safegaurd mission critical software systems.
In any case, I digress. These days the object of my ire has shifted to outsourcing of software development to offshore 3rd world countries…
April 2nd, 2008 at 2:27 pm
I just resent the idea of not understanding or even being aware of what is happening when your code is ran, whatever the language.
April 2nd, 2008 at 2:36 pm
Bobo, when’s the last time you fixed a bug in your compiler? It will always pay to understand the level of abstraction right below you, but beyond that, just file a bug report. Every layer of abstraction will always be actively maintained and improved by somebody, but it doesn’t have to be you.
April 2nd, 2008 at 2:39 pm
But who does entirely know what’s happening outside the code they write? If you program in C++, how often do you read the code for STL or even step into it? Do you step into the kernel when you make OS level calls? Of course not! 99% of programmers from the ground up rely on massive leaps of faith that the the functions they call just work. That means that to some degree, everyone is working on a high level.
April 2nd, 2008 at 2:53 pm
Good article. It sums up points I’ve been making about the “garbage collection is bad and I still believe Java is slow” crowd in a very succinct manner.
I got into software development because ever since I was a kid I thought programming was fun. I still think it’s fun, but I’ve come to realize that programming is just a means to an end. What I want to do is create software that people can actually use.
Again, good article.
April 2nd, 2008 at 2:59 pm
Great Post Scott. There are many languages out there, compiled, interpreted, bytecode based, dynamic, static, imperative, OOP, functional, declarative. Learn as many as you can. Learn where certain languages are best used and where another choice may be better. And don’t pick on the VB/Ruby/whatever programmers because they are getting work done. Now, if they are choosing VB6 as a choice for an enterprise wide, needs to be highly scalable, distributed, multi-threaded application, you should have some questions ready.
April 2nd, 2008 at 3:00 pm
I agree. I’m looking at *you*, Linus Torvalds, and all you other C weenies who think programming in C makes you better programmers. C has a set of tasks that it’s good at, and a set that it’s bad at.
April 2nd, 2008 at 7:43 pm
From my experience lots of programmers that only used high level languages write horrible code that sadly “works”. If you suck in C/C++/asm it will show up way faster, but that’s not a reason to distrust other programmers or despise high level languages.
April 2nd, 2008 at 8:33 pm
You make a great point Scott
April 2nd, 2008 at 9:34 pm
I program in C# and hate it. I liken it to using a language as complicated as C++ with the speed of BASIC.
It’s not because I did things the “hard way”, it’s because I’m trying to look at the big picture. In my line of work, all the customer cares about is that your application works well, runs fast, plays well with other apps, supports the features they need, and comes out on time. They don’t give a damn what language you write it in, and no language can give you all of those. Why not?
I’ve seen brilliance in all languages, but I’ve yet to see one that’s balanced enough to sit squarely in the middle of the user’s requirements, or is flexible enough to extend along any of the vectors you desire.
What bothers me most is rehashed languages, and lately it seems to me that the industry has just been stagnant and programming is no longer fun because we’re no longer actually programming so much as we are gluing disparate pieces of other people’s code together.
Sometimes I feel RAD is the assembly line of programming, and a good deal of the creative aspect of programming is gone. This is not limited to just RAD. All programmers do it to an extent, almost like they want to do everything they can to avoid programming at all. Sure it makes you deliver on time, barring any bugs that are in other people’s software, but you never really learn anything from it either. That’s my take.
April 2nd, 2008 at 9:59 pm
It is good to read this post as getting stuck as the “____ guy” when I wanted to do something else has happened to me. It is helpful to me to know that it has happened to others.
A bit of it is ego, but it is also anger at having wanted to pursue a particular kind of work, having been promised it and then having that promise broken.
It is like being a plumber, going out on a service call, and having someone hand you a pushbroom to clean up their house.
Those situations wouldn’t be so bad if you could work your way out of them, but that possibility is not always there.
I agree for personal happiness it is better to put your anger aside. It is better to go find another job where you can do the kind of work you want and not fester at your current spot.
April 3rd, 2008 at 10:07 am
I disagree.
I think a lot of the perceived snobbery that shadows those proficient in C/C++/ASM/[insert non-garbage-collected language here] is ill-placed. Personally, I consider myself knowledgeable in a broad spectrum of languages ranging across a slew of scripting languages and others including Java, C#, etc. However, I was weaned into programming as an undergraduate by learning how to program in C++, and I think it’s a damn shame that the curriculums have since changed to teach Java instead.
It is a pure and simple fact that most people who are proficient in C or C++ are also knowledgeable in optimization – to some degree. And I think this is where a lot of other languages are a let-down, in this regard. C++ is built, from the ground-up, for speed. And, to use it well, you need to know all about memory issues (possible fragmentation, leaks, utilizing block pools, etc) and, as a consequence, you learn some of the intricacies of how the language interacts with the system beneath it. And since Java, C#, and most new languages hide this under a layer of abstraction, most programmers using these languages will put their faith in the garbage collector and continue doing what they wish.
All I’m saying is, it’s perfectly legitimate for those unindoctrinated in plumbing the mysterious depths of C/C++ to get the stink-eye. Odds are, they deserve it.
April 3rd, 2008 at 10:23 am
@d3r1v3d: You make a good point. I’ll definitely admit that the garbage collector in Java and C# gives most programmers a flase sense of security that everything’s going to be cleaned up automatically for them. Not so for a lot of what C# and Java call “disposable” objects… objects of classes that implement IDisposable. Fonts, bitmaps, pens, brushes, all kinds of things, especially in graphics, all wrap a system resource that must be explicitly freed by calling Dispose. So you have this case where sometimes you do have to clean up after objects and sometimes you don’t, and that can easily lead to confusion and potentially missed cases. Having that background of carefully inspecting for unfreed objects makes you a lot more vigilant about not letting that happen.
April 3rd, 2008 at 12:12 pm
@Scott Hackett:
I’ve also seen much head-scratching occur when a Java OutOfMemory exception is thrown in response to a ‘heavy’ object being instantiated consistently within the confines of a loop. Sometimes, if these objects internally utilize resources which require explicit disposal (databases, files, etc), the garbage collector won’t deallocate them and you end up overflowing the stack with even a modest amount of object instantiations.
Sure, these cases tend to be few and far between, but oftentimes I find having a C++ background helpful in forming a bridge when debugging between what’s broken and why.
November 24th, 2009 at 6:08 pm
Thanks for your final words, I’m trying to master C#.
But all programmers must know the basics and how things work deeper/inside.