The Coding Monkey

Monday, October 31, 2005

Update: Cube Goodies

Those of you who've started to regularly read this blog, might remember the question I asked at the end of this post:

Recently a friend turned me onto this site, called Despair which is just hilarious. Being a consultant, I was thinking of getting a small version of this to put in my cube. My question is... is that going over the line? Would it be unprofessional to have something so blatantly cynical in my cube, no matter how true?

Well... after some careful deliberation (like us engineering types tend to do), I decided against the "Consulting" one. Instead I went with this one on "Inspiration" which is hard to take in anything but a funny light... I hope. It's sitting on my desk right now.

Friday, October 28, 2005

So What Do You Wear to Work?

Overheard the following conversation today:

Developer 1: That's his presentation outfit.
Developer 2: Not to be confused with his funeral outfit, or his interview outfit.
Developer 3: What's wrong with interviewing in my funeral outfit?

It's funny when you work in a software group... the way people dress is almost so standard, that any deviation is quickly noticed. If you dress up one day... you invariably hear the comment... "So, you have an interview somewhere later?"

My last client actually had a uniform that employees wore... from the people who worked on the factory floor, to the engineers, even up to the executives. It was the ugliest blue polyester getup you ever saw in your life. I never would have taken a full time position there, if only because of that uniform. People either loved it, or they hated it. The common thing I heard was, "It's nice to wake up in the morning and not think about what you're going to wear. You just go into the closet and pick out the next clean uniform and go." For me, I actually like to have the choice in the morning, and to maybe stand out a bit from my coworkers. Not only that, but what I wear is not only a reflection on me, but also how I feel that day.

I actually tended to dress a bit down at that particular client. Part of it was laziness... and part of it was that there wasn't much competition for the dressing nice contest when most everyone else is wearing blue poly blends. Now that I'm working for a new consulting firm, I tend to dress a bit better, and I like to think that I stand out a bit. I think its also important because it reflects on my company. That's not to say that I don't enjoy jeans on Friday, nor am I anywhere near being a metrosexual... but still... clothes do make the man don't they?

Release the Hounds

Visual Studio 2005 has officially shipped! If you're an MSDN Universal Subscriber, and you have more bandwidth than God, then you should be able to download it right now. If you're an unlucky sap like me, you'll have to wait a few weeks before the boxed sets become available. I'll be going to a launch event here in Milwaukee early December where they're giving away copies of VS2005 to all attendees... so if you can make one, I highly suggest you go.

For those of you who installed Beta editions of VS2005, you'll have to go through a 23 step uninstall procedure before installing the official version. If that seems mind numbingly awful to you, I would suggest this tool (thanks Chris).

Wednesday, October 26, 2005

Microsoft Mind Rot

Charles Petzold recently gave a very interesting, and rare, talk to a User's Group... and asks whether Visual Studio Rots the Mind:

Visual Studio can be one of the programmer's best friends, but over the years it has become increasingly pushy, domineering, and suffering from unsettling control issues. Should we just surrender to Visual Studio's insistence on writing our code for us? Or is Visual Studio sapping our programming intelligence rather than augmenting it? This talk dissects the code generated by Visual Studio; analyzes the appalling programming practices it perpetuates; rhapsodizes about the joys, frustrations, and satisfactions of unassisted coding; and speculates about the radical changes that Avalon will bring.

I've talked about these sorts of issues at various times, both on this blog, and on my normal blog before I created this one. In my very first month of blogging in fact, I wrote about Why I Hate Wizards. The problem is that not only do Wizards write sometimes bad code, but even if it writes good code, you still need to know what it is! As the developer, and someone who will have to debug that program, you are still responsible for it. Your boss won't accept the excuse of, "Well, the wizard really wrote that code, not me." Personally, I find it very cool that I share so many opinions with Charles Petzold in this regard. I also wonder what Petzold thinks of the new implicit variable feature in C# 3.0?

Petzold also talked about Intellisense quite a bit. My problem with Intellisense is that those who use it a lot, tend to lean on it so much, that it effects everything they do, right down to sloppy variable naming. For me, as a person who prints out code, this is a problem. Unfortunately, Microsoft has yet to develop Intellisense popup tooltips that work on paper. But Petzold brings up a much better point:

For example, for many years programmers have debated whether it's best to code in a top-down manner, where you basically start with the overall structure of the program and then eventually code the more detailed routines at the bottom; or, alternatively, the bottom-up approach, where you start with the low-level functions and then proceed upwards. Some languages, such as classical Pascal, basically impose a bottom-up approach, but other languages do not.

Well, the debate is now over. In order to get IntelliSense to work correctly, bottom-up programming is best. IntelliSense wants every class, every method, every property, every field, every method parameter, every local variable properly defined before you refer to it. If that's not the case, then IntelliSense will try to correct what you're typing by using something that has been defined, and which is probably just plain wrong.

For example, suppose you're typing some code and you decide you need a variable named id, and instead of defining it first, you start typing a statement that begins with id and a space. I always type a space between my variable and the equals sign. Because id is not defined anywhere, IntelliSense will find something that begins with those two letters that is syntactically correct in accordance with the references, namespaces, and context of your code. In my particular case, IntelliSense decided that I really wanted to define a variable of interface type IDataGridColumnStyleEditingNotificationService, an interface I've never had occasion to use.
But the implication here is staggering. To get IntelliSense to work right, not only must you code in a bottom-up structure, but within each method or property, you must also write you code linearly from beginning to end - just as if you were using that old DOS line editor, EDLIN. You must define all variables before you use them. No more skipping around in your code.

It's not that IntelliSense is teaching us to program like a machine; it's just that IntelliSense would be much happier if we did.

And I think it's making us dumber. Instead of finding out exactly the method I need, or instead of trying to remember an elusive property name, I find myself scrolling through the possibilities that IntelliSense provides, looking for a familiar name, or at least something that seems like it might do the job.

Because you end up writing your code bottom up instead of top down, you end up doing a much poorer job of architecting it, leading to spaghettified code much earlier in the lifecycle of the program. Until now, I'd never really connected the dots between Intellisense and Spaghetti Code... but I think it's there to see if you look for it.

Anyway, just read the whole thing.

Monday, October 24, 2005

How Do You Like My Flair?

No post about flair would be complete without an Office Space quote:

Joanna: You know what, Stan, if you want me to wear 37 pieces of flair, like your pretty boy over there Bryan, why don't you make the minimum 37 pieces of flair?
Stan, Chotchkie's Manager: Well, I thought I remembered you saying that you wanted to express yourself.
Joanna: You know what, I do want to express myself, okay. And I don't need 37 pieces of flair to do it.

If you'll notice on the right hand side, there is a neat little graphic with a scrolling list of my most recent posts. And if you click on it, you'll find that it links to the site feed for The Coding Monkey. Many thanks to Duncan Mackenzie for modifying his flair generator, which originally came from Coding 4 Fun, to work with ATOM.

Friday, October 21, 2005

Now That You've Read This Email...

We'd like to tell you that you read it by mistake, and that you're criminally liable for what you just read. You are ordered to forget everything you just read, delete it from every one of your systems, then scrub your brain of all neurons that may have been imprinted with the memory of this message.

Sound familiar? That's about what the typical email footer looks like that gets automatically attached to outgoing messages by many corporate email systems. Here is the actual text of one. I won't say what company it's from... who knows... they may send a huge guy named Tiny to break my knee caps:

This e-mail message and all attachments transmitted with it may contain legally privileged and/or confidential information intended solely for the use of the addressee(s). If the reader of this message is not the intended recipient, you are hereby notified that any reading, dissemination, distribution, copying, forwarding or other use of this message or its attachments is strictly prohibited. If you have received this message in error, please notify the sender immediately and delete this message and all copies and backups thereof.

Thank you.

From an honest to goodness legal perspective... how is this even workable? As I read into this message carefully, I find that it's actually a no-op. It means absolutely nothing. Not only is it unenforceable... but the circumstances under which it might be enforced can never realistically occur.

It says... "If the reader is not the intended recipient"... but the only way to know who the intended recipient is, is by looking at the address it was sent to. After all, as a reader, I have no way of really knowing what the intent of the sender is. I've been using email for probably 15 years now. I've yet to receive an email where my name wasn't in the To field. The way that email works... the reader is always the addressee.

The warning then says that reading the message is prohibited. Well that's a neat little catch 22 now isn't it? After all, in order to see the warning (which is at the bottom of the email mind you), you have to have already read the email. Maybe they could make a case if they stuck that ugly nasty warning at the top of the email, but that wouldn't be very business like now would it?

From a contract law perspective (and I did take one class in business law in college), this is completely unenforceable. They're trying to bind you to a contract after the fact. You have already read the message, and they're saying that now that you've read the message, you now have to accept their contract which comes after the message. Because you've already fulfilled their reading clause, you have no way to not accept their contract. It is really unenforceable on its face. In contract law, there is no such thing as a contract that you can't refuse.

So while it's an interesting request that they make... you don't actually have to abide by it. Reading, dissemination, distribution, copying, forwarding or other use of this message or its attachments is not strictly prohibited... it is in fact your right as the recipient of the message, intended or not.

Makes you want to share all sorts of secrets you get by email doesn't it? You know... just to spite a stupid lawyer and his idle threats.

Thursday, October 20, 2005

A Wish

In case you haven't noticed... I use quite a bit. I have a growing list of links, and I also maintain my blog rolls using link rolls. For those of you that have never used, it allows to you add web links, and mark them with tags. You can then show different lists of your links using single tags, or multiple tags. Really, is based around sets.

When you add a link to, you say what sets (called tags) that link belongs to. You can then list all your sets, or alternatively you can list the intersection of different sets to narrow down your links. Realizing that is really just a website for managing sets, I wonder why they don't have ability to display a tag's complement.

Using a basic numeric example, I might have two sets:

A = {0, 1, 2, 3, 4}
B = {3, 4, 5, 6, 7}

Currently, delicious allows me to execute the intersection of A n B (I'm using n instead of the intersection symbol which is an upside down U):

A n B = {3, 4}

This is great as it allows me to create link rolls like blog+Microsoft for my right hand sidebar. But what about the complement? Sometimes I want to see all items that have a specific tag, but don't have another tag. I can't do that right now.

B - A = {5, 6, 7}

That way I can look through all my links and see all developer links that aren't articles, or blogs. That would be cool.

Yet Another Anders Interview

Scott Wiltamuth points to a new fresh interview with Anders Hejlsberg at It's Part 1 of a two parter... but Part 2 is not up yet. I complained a while ago here about another Anders interview... and my complaints I think are still valid on this one.

Interviews with him are always really generic (not to be confused with templatized), and tend to always cover the same bland topics. Compare C# to Java... again. Is C++ going to completely go away... honestly... are you sure it won't? Can you compare C# to Java for us? Oh... did we already ask that? Do it again... please. I will give some credit here... they actually do start hitting some new features like LINQ. However, it seemed like the interviewer had to be dragged kicking and screaming there... then tries to go back to really dull generic stuff again, only to have Anders drag him back to new language features.

From that perspective the whole thing is rather amusing. I suppose I should cut these guys some slack. Trying to "talk code" is actually rather difficult... especially if its code that hasn't been written yet using features of a language that aren't even solidified.

Friday, October 14, 2005

When Non Technical People Try to Sound Technical

I was recently reviewing a use case for a project I'm working on written by a person in the business group who is really non-technical. The use case said:

When the user tabs off of the [xxxxx] field, and the [xxxxx] is valid, add a pop-up window (non-Modal) to validate the number that was just entered.

Non-modal? I've been writing Windows applications for approaching 10 years now. I've never heard of a "Non-modal" window. I've heard of a modal window, and a modeless window... but never a non-modal one. Did he mean modeless? A modeless dialog to force verification of information is definitely the wrong way to go.

So I sent an email out. It was a long email, explaining the difference between modal and modeless, and what the implications were. For those of you who are unaware, here are the basic difference.

Modal: A modal window is a window that keeps the focus, and doesn't allow you to continue until you dismiss the window. A good example is a standard Message Box with an OK or Cancel button. You can't do anything else in the application until you click either OK or Cancel.

Modeless: A modeless window is a window that stays on top, but can have the focus taken away from it. A good example is the find window in Word. You can find a word, then make changes to the document while keeping the dialog open, and click Find again. Usually you end up dragging the modeless window into the corner and out of the way while it's open so you can still work on the main document.

So as it turns out, he meant modal, not modeless... but in his reply email he confused the two again at one point, which was just... well... confusing. I really wish that non-technical people would not try to use terminology they don't understand. In an attempt to look really smart, he ended up looking kinda stupid.

Cube Goodies

Forgive me for such a long post. When I first got the idea to write this, I didn't intend for it to go so long. Great plans of mice and men and all that. If you stick through the entire post, I do have a question for you at the end.

You spend at least 8 hours in the office (at least those of us that work)... so it's natural that you want to fill your work environment with a part of you... something that you will enjoy. There are certain things that I always have in my cube that I never can seem to do without.

First there are those certain books that I never crack open any more, yet I seem to need to have in sight to feel complete. They're what I call the Programming Testaments. If you are a book learner like I am, then you know these titles in one form or another. They all have various editions, but are so well known that they're often simply referred to by their author's name now. I'd love to write a book some day that was so well known that people would say "Hey, can I borrow your copy of Schweitzer?"

Programming Windows: This is the bible of Win32 API programming. Every now and then people still ask to borrow my copy of Petzold. He even has a blog now. Even today with managed code and object oriented programming, having an understanding of the basic Win32 API is valuable. All the layers that have been built since then still eventually call here.

Advanced Windows: This is the bible of memory management and threading for the WinNT platform (which whether you realize it or not is what Windows XP is). Things change, and .NET has made this somewhat obsolete... but if you do interop with .NET like I still do... than Richter is still a good reference to have. Remember... the OS isn't managed.

The C++ Programming Language: I don't program C++ any more, yet I still consider this to be my first language. I have the newer edition of Stroustrup in my cube, and an older edition at home that was given to me by my brother-in-law Shannon. That older edition is special to me. It's highlighted, coffee stained, worn, and well read. He gave it to me early in my career and said "Read this and you'll know everything you need to." He lied. I had to read it several times.

The C# Programming Language: This is what I consider my primary language now, even though I actually write VB.NET at work. I hate VB.NET for reasons I share from time to time on this blog. Keeping this book in my cube reminds me that not all languages are trite, wordy, silly, and hamstrung. Anders (I refer to him by his first name when I reference the book for some reason) isn't as well written as Stroustrup though. Stroustrup can be read like a real book, even if it is incredibly difficult. Anders is written purely as a language reference.

Code Complete: This is not considered to be any sort of testament by many people, but it ought to be. McConnell is one of those books you keep in your cube to see who looks at it and says, hey you have a copy of Code Complete, can I borrow that sometime? It's a litmus test of developers to see whether they simply hack out code or design software. If you don't think there is a difference between the two, then get away from me.

But besides the books, there are other more superfluous things that I like to keep in my cube, that hopefully reflect more on my personality. They're just some fun things I've collected over the years.

The Scream: Its by Edvard Munch, and one of my favorite paintings. I have a blow up doll version that I keep on a shelf.

Dilbert Mint Tins: The tins are empty now, but every cube has to have some sort of reference to Dilbert in it. It's a law you know.

The Binary Clock: My mom gave it to me for Christmas one year. I thought it was silly at the time, but now it's kind of interesting. Every now and then someone will walk in my cube and just stare at it... and then eventually say "I give up. What is that?" After some clues, some people eventually figure it out, usually by guessing. Mind you, these are all software developers that I work with. When I tell the ones who can't guess that it's a binary clock, they eventually say something like, "Oh, OK" and then walk away. It always makes me a little sad when that happens.

Acrobots: This is just a fun little guy that I occasionally pose in different ways to see if anyone notices the change. Nobody has yet. Maybe that's because nobody comes to my cube that often... hmmm... I won't ponder that thought.

I have a few other miscellaneous things, but you get the idea. Recently a friend turned me onto this site, called Despair which is just hilarious. Being a consultant, I was thinking of getting a small version of this to put in my cube. My question is... is that going over the line? Would it be unprofessional to have something so blatantly cynical in my cube, no matter how true?

Thursday, October 13, 2005

Microchip Easter Eggs?

Via Engaget is this fascinating article on CNET about chip designers who design in art onto the physical circuits:

More than 10 years ago, Michael Davidson went looking to capture the beauty of microchip circuitry in photographs. In among the transistors and wire traces, he found something unexpected: Waldo.

"When I first saw him, he was upside-down, and I didn't recognize his face," the Florida-based cell biology researcher said.

Davidson suspected at first that the tiny design he saw was circular patterns added to the chip to thwart attempts by reverse-engineers to deduce its inner workings. But a second inspection showed it to be the characteristically hard-to-find character from the children's book series. "I realized, 'This is a doodle of some kind.' Then I started looking over the whole chip. I discovered Daffy Duck and other things on that chip," Davidson said.

That was just the start of a catalog that now holds more than 100 images of extremely small automobiles, dinosaurs, birds of prey, cartoon characters and even a wedding announcement silhouette--all tucked away among microchip circuits. Davidson calls the collection the Silicon Zoo.

You can see a small gallery of the images here. The photographer's site is here.

Tuesday, October 11, 2005

Code You Must

The dark side clouds everything. Impossible to see the future is. Is Matt right? Will we all be programming like this soon?

(args of string many are they) Main is what they seek yet return they do not.

Brace you must
     Written it is, the Console. "Hello World"

And I thought VB.NET was bad. I really stopped reading the Wayward Weblog a while ago after it seemed that he just stopped posting. Well it seems like he's back, and as good as ever. Be sure to check out his musings regularly.

Monday, October 10, 2005

Making the Switch

Recently there was an "Ask Slashdot" on Moving from a Permanent Position to Contract Work?

"I'm sure many developers in salaried, permanent positions have been tempted by the self-management, flexibility and higher pay that are the perks of being a contractor, while at the same time looking nervously at the uncertainty and irregular income. So, to all those in the Slashdot crowd who've made the change - what was it like, was it worth it, and what advice can you share?"

I did the whole contract thing... mostly during the "bad time" when I had been laid off my permanent job, and software work in the area was scarce. I did it for less than a year, before I found my current position at a consulting company. From my short "contracting" time, I didn't find the uncertainty to be a big deal. I went and got a individual emergency medical plan, and then forked in the dough. Being the age that I am, an emergency plan was plenty since I really don't go to the doctor anyway.

What I've since found out is that consulting is the real place to be. For me, the allure wasn't necessarily the money, but the ability to switch jobs without actually switching jobs. Looking back on my employment history, I found that I ended up switching permanent jobs about every one or two years anyway. I'd get sick of what I was doing, and would want something new. The problem is that you get knocked to the bottom of the totem poll of benefits every time you make the switch, unless you can wrangle extra benefits into your offer, which is a pain in the butt to do.

The benefit now of my consulting job is that I can switch clients when I get sick of what I'm doing, and I just move to a different client, but my pay and benefits still scale with me. Plus, I get the added benefit of being salaried, and getting paid overtime... and great vacation benefits. It's hard to beat that combination.

What I've never understood, are the consultants or contractors who end up staying a client for many years. Some of the folks at my consulting company have been at the same client for more than 5 years, and some more than 10! When you've been at a client for that long, with no signs of leaving, why wouldn't you make the switch to permanent at that point? I'd think that the benefits of being a permanent employee would outweigh contracting at that point in time, but maybe I'm wrong.

For me... after two years... I really have to start wondering what I'm still doing at a place. What can I say, I get bored easily.

Thursday, October 06, 2005

You Know You're a Geek When...

You think the following conversation is funny. Of course it wasn't a real conversation... it was an email conversation... but anyway:

Coworker: I'll be OOO - EAD Monday.
Coworker: Out of office - Essential Absence Day. It's the terminology that [Client Name] uses for personal days.
Me: Great... another TLA.
Coworker: Alright - what does TLA mean?
Me: Three Letter Acronym.