Skip to content
December 17, 2007 / Bob Black


Someone just sent me a link to this new offering, from Microsoft Labs, called Volta. I haven’t actually tried it out, but if it does what it says it does, it could add a new twist to AJAX-based web development.

What it purports to do is to allow you to design a web app as a .Net client application, slice it up into different tiers, and spit out cross-browser JavaScript for the client tier, web services for the server tier, and all the boilerplate code to tie everything together.

At first glance I got all giddy and thought that this could convert any .Net client application to a web-based app, but a closer look seems to show that to not be the case. You have to use the Volta libraries and mix and match traditional HTML with your .Net code.

Might be worth a look. 

November 7, 2007 / Bob Black

Wonderful Utilities

Here are a couple of utilities I use regularly that I consider indispensable and most definitely worth the money.


If you have a multi-monitor setup, you must run out and purchase this tool right now.

This tool has changed my life!

OK, maybe not really changed my life, but it has drastically improved my satisfaction level when working across multiple monitors. The price is reasonable at only $39.

Just buy it. Or at least download the trial. You’ll thank me later.

Enso – link puts out some interesting products; I’ve only tried Enso, and it is truly a beautiful thing. It’s a little hard to explain without actually giving it a whirl, but, in a nutshell, you can teach it to do things when you type short commands, like “open my documents”, or “open intranet”, or “define heuristic”.

If you’re a developer such as myself, your first thought when you take a look at Enso will probably be something like, “I could have done that. This isn’t that hard.” But after using it for a bit, I’ve come to think that it’s too simple and elegant to have been easy to put together. I can open a file, URL, folder, or run a program anywhere on my computer, without searching for it, just by typing a simple intuitive command.

And the price is super reasonable at only $19.99.

Just buy it. Or at least download the trial. You’ll thank me later.

November 6, 2007 / Bob Black

Automagical Update

I’m becoming more and more convinced that the best application installer out there is WiX. No, it doesn’t have a fancy GUI, and yes, it has a crazy nasty learning curve, but once you get into it’s innards it is awesomely powerful.

I’m doing some work on the next minor version of Code Toaster, which (hopefully) will include an automatic update feature. After reading (again, for the ka-jillionth time) this tutorial on creating an update msi with WiX, methinks it should be fairly straightforward. The process will go something like this:

  1. When Code Toaster launches, it will download an XML file containing version information.
  2. If there is a new version (as noted in the XML file) Code Toaster will download the msi installer for that update.
  3. Code Toaster will launch the msi and exit.

One problem I’ll have to resolve is how to install an update while Code Toaster is running. The most oft-used and recommended solution for doing auto-updates is to launch your application via a proxy that does the update work, and then launches the application later if no updates are available (or after the update process is complete). But I don’t like that for a couple of reasons. 

  1. If there are two executables, CodeToasterProxy.exe and CodeToaster.exe (or whatever), that might confuse a user as to which one to run (users would run CodeToasterProxy to get the update capabilities, not CodeToaster.exe).
  2. Since CodeToaster.exe can be run as a command-line application (to compile/run templates in batch mode, for example), it should be intuitive which exe to run in that scenario. In this case, the user would run CodeToaster.exe, not CodeToasterProxy.exe.

I bet you’re looking at this post cross-eyed after that wonderful explanation, huh? Maybe I should have boiled it down into one reason: confusion. And we sure don’t want Code Toaster to be confusing.

There is another option : to have Code Toaster check for and download updates, and then launch a separate application to run the msi update. That would keep things intuitive – you would always launch CodeToaster.exe rather from the command-line or from the Windows GUI, and CodeToaster.exe would remain in control of the update process. The only problem, and a minor one at that, would be the installer app would need to wait until the Code Toaster process had successfully exited before beginning the install. So step-by-step, it would work like this…

  1. CodeToaster.exe launches and downloads an XML file containing information about available updates.
  2. If an update is available, CodeToaster.exe asks the user if they want to go ahead and download and install the update.
  3. If the user wants to install the update, CodeToaster.exe initiates the download.
  4. Once the download is complete, CodeToaster.exe launches the installer application, and then exits.
  5. At this point the installer must wait until CodeToaster.exe has finished exiting, and then launch the update .msi file that was downloaded earlier by CodeToaster.exe.
  6. Once the msiexec process has exited, the installer app can re-launch (the now updated and bodacious than ever) CodeToaster.exe, and way the user goes!

Whudya think? I think I like it. That’s the route I will probably take – there are a lot of steps but I think it’s more elegant than having a proxy app between the user and your application. Howsomever, there may be someone out there who knows better – if so let me know.

On another note, I’ve noticed that Windows Installer packages are quite difficult to update. You can’t just run an msi containing a minor (version) update, because you’ll get an error message that says “Another version of this product is already installed.”

Well, duh! I want to update the version that is already installed!!

So you have to run your msi using the following command:

msiexec /i MsiFileName.msi REINSTALL=ALL REINSTALLMODE=vomus

Don’t ask what “vomus” stands for. I couldn’t find an adequate definition/explanation on Google within my 5-second attention span. But this is another reason to use an automatic update design instead of asking the user to run an update msi manually. Ask a user to do that to update your software and they’ll hate your guts and call you names.

This, too, is documented in the WiX tutorial, lesson 4, if you’re interested in some late night fireside reading while your hunting dog naps beside your overstuffed armchair.

So, looks like I have some work to do.


October 26, 2007 / Bob Black

Software Success (an essay on true love)

…and how to get the love back.

Over the last 12 years I’ve worked with a lot of software developers that would fit this description. Totally bored with their job and willing only to do the bare minimum: just enough to get by.

I think I know the explanation for most of these cases, if not all. They don’t love what they do. I got into programming because I loved doing it. After I wrote my first computer program, in QBasic over 15 years ago, I was thrilled that I could control what my computer did. I felt empowered, partially because I found myself capable of doing something that previously seemed beyond my grasp, but also because I saw the possibilities: given enough time it would be conceivable to do practically anything! The first thing I did was write a program to help my teacher parents record grades. A few years later I wrote a WYSIWYG editor in Borland Delphi for creating JAVA user interfaces, which helped me get my first job. This stuff was fun!

But that was 15 years ago.

What about today, when LEGO is selling programmable robot toys! And Microsoft has an entire framework for interfacing with robots and other electronic devices. Given enough time, it’s conceivable to build practically anything! How can you not love this wonderful craft? There’s always something new to build, a new problem to solve, a new way to impress your family and friends and be called “that super geeky whiz kid” for the thousandth time.

I believe this is a craft that must be loved before it can be done well. If you love what you do, you’ll try to do it better this time than you did last time, every time (and you can quote me on that). A developer that throws himself into his craft will probably know about design patterns and whether a Hash Table is better than a Linked List in this particular scenario, or whether this database query result needs to be cached, and on and on.

Joel Spoelsky’s 5-step list to software failure unfortunately (but I think correctly) lists bad programmers as the number one reason for software project failure. I totally agree. But I think we could expand on that a tad, by saying software developers that don’t love what they’re doing, that aren’t motivated by an insatiable desire to solve problems, or that don’t care anymore, are the number one reason for project failure.

Because if you love software development, you will be a good software developer. And if you don’t love software development, you can still fall back in love. Yes my friend, there’s still hope. Read some blogs, buy some books, but most of all (I think), start an interesting side project that you can do at home for a few hours a week that will bring the love back.

Here are some “feel the love” suggestions:

  • Build a robotic CD burner using LEGO Mindstorms that will pick up a CD from a stack of CDs and insert it into a CD burner. Program it to burn copies of various CDs stored in a database (or whatever).
  • Write a home document management system application that will scan, OCR, and store in a searchable format all of your personal documents, like Mortgage, Tax, and other stuff. How cool would it be if you could search your computer for that stuff instead of having to root through a file cabinet?
  • Grab a 15-inch LCD touch-screen, an old (or cheap) Windows XP PC, and hook it up to some of those X10 home automation components. Build a spiffy looking user interface for automating your home, and hang it on a wall somewhere for walk-up convenience.
  • Write an application for a friend or family member. Maybe your church or other organization needs an application to send emails, parse data from files, or whatever. Who knows – if you do something well for someone else, it could lead to other, perhaps paid opportunities.
  • Teach your kid how to program. My 7 year-old son just wrote his first “Hello World” QBasic application, and I was so proud. Passing on the joy of watching something you made just work is a great way to bring some of the fun back into programming.

If you’ve lost the love, get up and do something about it. It’ll make you a better programmer.

October 23, 2007 / Bob Black

Code Toaster 0.8 Released

There are still a few outstanding bugs, but since this release is infinitely more stable and usable than previous versions, I decided to go ahead and release it as is (and also since interest in Code Toaster seems to be picking up lately).

I plan to release an update in a few weeks with more improvements, as well as bevy of useful template projects and hopefully some video tutorials.

Be forewarned, there is a learning curve, but so far everyone that has climbed the mountain has fallen in love with what this little tool can do.

Please leave any feedback as a comment, or feel free to email me at rmblack at gmail.

October 23, 2007 / Bob Black

Buggy Software

Jeff Atwood makes an interesting point over at his Coding Horror blog, that often times features are more important (from a financial standpoint) than fixing bugs. That people are more willing to pay for an impressive feature matrix than a laundry list of bug fixes that may or may not directly impact their work.

I agree.

In fact, in some cases not fixing bugs can play a bug part in the overall financial strategy. For example, I used to work at a software company (which shall remain nameless) which happened to have a monopoly in their market. There was literally nowhere else to buy similar software. Their software was horribly buggy, and so they encouraged customers to purchase a rather highly priced support contract entitling them to, more or less, call support.

In their defense, I don’t think this strategy was intentional – it was an (un?)fortunate side effect of what Jeff blogged about – to sell a product, new features are often more important than bug fixes. And boy did they have an impressive feature matrix. It was ginormous. Anyone comparing products would be silly to even consider a product with a lesser feature matrix, despite the fact that you might be able to save your data without risk of the application blowing up in your face.

I disagree.

On the other hand, in some cases, particularly for small startups, lots of bugs can mean instant death. I later worked as the Webmaster (back when it was still cool to be a Webmaster) for a popular web-based practice test provider. The entire staff was comprised of about 10 people, most of whom authored practice tests. The development staff consisted of me, my boss, and a contractor in another state that would occasionally do new development. With thousands of people using our site every hour, we didn’t have the resources to field calls about usability  or technical issues. The site had to always work – or else.

Balance and Counterbalance

Fixing a bug vs. just leaving it to fester has to be weighed against the time it will take, and the expected benefit(s), among other things. For example, when working in IT, we come across the occasional bizarre problem that only happens when a particular user right-clicks on a Tuesday under a full moon while winking her left eye. We could spend a week setting up a virtual environment and tinkering with different combinations of environment variables, installing and uninstalling different combinations of applications that may be the culprit, but is it really worth the time involved? Is the benefit there?

That depends too – if I worked for a hospital and the software in question monitored respiration or some such, it would most probably be worth the effort and time. But if it’s a Word template malfunctioning, let’s just reimage the user’s machine and move along.

The Feature Matrix

So, I think ultimately the feature matrix counts only towards influencing the initial purchase. If you have an impressive feature matrix but lots of bugs (like that company I used to work for), you can bet lots of users will start to think strongly about migrating to another product as soon as possible. And they’ll probably tell their friends not to even consider your product. And you’ll have a hard time getting positive product testimonies to plaster all over your web site.

Unless, that is, there isn’t another product for them to go to. In which case, you’re home free you nasty scoundrel, and you should offer a hefty support contract and start raking in the dough.

October 19, 2007 / Bob Black

Funky Design

I was just browsing the web sites of a few design firms we’ve hired in the past, and was quite surprised at how bad this one is. That web site looks like Cousin Junie wanted to give “this HTML thing” a try.

This one here, on the other hand, seems a lot more “safe”. They probably won’t give me a site design that employes creative use of cockroach antennae, or weird swirly black and white backgrounds.

Oddly, the former (weird site) would probably be considered the “better” of the two firms. More creative, with more high profile clients. And a weirder web site.

Go figure.