I’ve been writing code since 1998. From 2001-2005, my skills at Perl, C/C++/C#, Tcl and Verilog are what put food on my table. That being said, I will freely admit to not being the world’s best programmer. It doesn’t take long for code to get complex enough for me to struggle with it, especially in tough algorithms or using too many external libraries. I’m decent enough at it to make it part of my Ph.D. studies. So what?
In my Master’s degree studies, I spent a lot of time on Human-Computer Interaction and User Interfaces. I get really frustrated when I see a bad interface and there are a lot of them. Most of the time, it is because a clash between expectations of the programmer and the user. “I expected you to do things in this order,” says the programmer. “But I don’t want to do it that way!” replies the user. “Everybody will look for that button here,” says the programmer. “Why did they put it there?,” exclaims the exasperated user. “Silence means everything worked okay; we only report errors,” says the Unix developer. “Uh oh. Didn’t work. Better do it again,” says the user. “Let’s organize it as a tree structure,” says the programmer. “Trees are green and outside,” says the user.
In other words, programmers write software for other programmers and don’t realize that they don’t think like normal people anymore. And when software ships, users get frustrated. So people hate computers and the people that program them. The programmer shakes his head at the user who just doesn’t get it. The user shakes his head at the programmer who just doesn’t get it. I’m convinced the user is right.
This really came to the fore this week for me. In my Ph.D. work, I was writing some code for a parallel C application using a runtime out of the University of California – Berkeley. Despite Michigan Tech having its own UPC runtime, Berkeley’s is the best. I was running into a problem where some of my code wasn’t working as expected. (For those who might care, I had forgotten to allocate memory for a shared data structure. The runtime let me modify that unallocated memory.) I thought this was illegal behavior, but it turns out that it falls under the classification of behavior with “undefined” results. Because of that, my bug report was mostly brushed aside. Basically, there was a reasonable explanation (and the reasonable excuse of “undefined behavior”) and my expectations were out of line.
In other words, it’s the same old story. I’m not thinking like the developer, so I’m wrong. My only consolation is that they at least understand that this is inconsistent behavior and might get around to changing it someday.
The moral of the story? If Master Shakespeare will allow me the honor of adapting him, “The first thing we do, let’s kill all the lawyers. The computer programmers are next.”