Archive for April, 2007

Staying Productive

Monday, April 30th, 2007

I ran across an interesting article last month in the NY Times about people’s inability to multitask well, the impact of disruptions during the work day (such as email) and techniques for improving productivity. The beginning of the article addresses the fact that people aren’t very good multitaskers. This is old news to me because I learned about this a decade ago in psychology class. The article starts to get interesting by the third paragraph on the first page:

“In a recent study, a group of Microsoft workers took, on average, 15 minutes to return to serious mental tasks, like writing reports or computer code, after responding to incoming e-mail or instant messages.”

Over the past month I’ve been experimenting with keeping my email program closed and working at off hours and on weekends. I’ve found my productivity is higher when I keep my email closed and it’s higher still on weekends and evenings when there are no IMs or phone calls coming in either. Now when I’m trying to really kick out some software code, I keep my email program closed and check email only once an hour or so.

I’ve also found that, just as the article suggests, listening to music without lyrics helps boost productivity. The music helps keep me focused on my work and also shields me from minor distractions like beeping household appliances.

You Had Me at Softlinks

Wednesday, April 25th, 2007

Last week Ubuntu 7.04 was released. I thought I’d contribute to the hype by talking about why I love Linux. Before I do though, I just want to say I am not a zealot. I believe in the right tool for the right job — and I’m even forgiving of not-quite-so-right-but-comfortable tool for the right job. I use Windows all the time, but when it comes to development, I prefer Linux hands down.

I’m relatively new to the party. A couple years ago I had been hired at a Linux-only development shop. Fortunately, even two years ago, it was relatively easy to transition from Windows to Linux. Which isn’t to say there isn’t much to learn — but even with a shallow knowledge of Linux it was easy for me to get around. Like many programmers though, I need more than shallow knowledge, and began delving into the OS’s nuances.

Its through this exploration that I began to appreciate Linux. These short, terse commands I entered at the command-line — these aren’t just tools, they are the collective wisdom of the ancients. My handy bash-scripting reference talks about the evolution of the “echo” command for two pages! Clearly, most of the basic concepts of Linux have been honed and polished for two decades, and truly I feel as if I’m standing on the shoulder of giants with each “sed” or “cat” invocation.

Granted, you don’t need to know how a car works to drive it, and Linux was the same for me. Indeed, I had been piping commands to each other for years before appreciating the holy trifecta of stdout, stdin, and stderr.

For those who want to get their feet wet, you can run Ubuntu entirely from CD. There are even instructions for running Ubuntu as a virtual machine using VMWare. But doing a full-on, dual-boot installation isn’t difficult (though disk partitioning is always harrowing for me), and I’d encourage anyone to give it a shot.

Here are some reasons, in no particular order, why I prefer to do development work on Linux:

  • Command-line Console. Slowly I’m becoming a command-line ninja, and find it much easier to navigate my filesystem, and perform other operations, by typing.
  • Warm fuzzies when using open source software.
  • Softlinks. Besides being a very handy way to organize my filesystem, it never fails to make me giggle when I compare it to window’s *.lnk (“Shortcut to…”) equivalent.
  • Appropriate Verbosity. Most unix commands (cp, mv, chmod) don’t provide any output upon completion. Type “man cp” though, and you have a couple pages of describing the simple command’s functionality.
  • Easy Package installation. How do I install MySQL? “sudo apt-get install mysql”
  • Multiple Desktops. One for my mail reader, one for log-viewing (via Chainsaw), and one for my IDE.

Undoubtedly there are dozens of other reasons, and I look forward to finding even more.

..in the problem-solving business.

Wednesday, April 25th, 2007

Recently I learned that our development manager is having all of our developers read Repeat After Me: I Am Not In The Software Business. I hadn’t read that blog post so I went to it and read it.

Some days the sun shines even when it is raining. Reading that post made this such a day. When we started Spider Strategies, the four of us spent a long time writing our Mission and Vision. In particular, it was very important that we make ourselves different in one particular way:

“Our key distinguisher is, and will always be, our customers.

In today’s world of corporate performance management software, we see the customer left out of this equation all too often. The common formula seems to be simply codifying industry theory and delivering that template via outdated technology.”

Over the past four years, we haven’t changed either our Mission or our Vision. Nor, over the past four years, have we made it a particular point to stress them with our employees. Yet, today, I find that our development manager is passing on the spirit of our Mission and Vision through things like Repeat After Me: I Am Not In The Software Business.

When we say that “Our key distinguisher is, and will always be, our customers.”, we are saying to our employees exactly what Christopher Hawkins says to the software developer community:

“You are not an artiste.
You are not even in the software business.
You are in the problem-solving business.
More to the point, you are in the business-problem-solving business.
The technology problems you solve should always be in the context of solving a business problem.
If the solution to a particular business problem offers less benefit than the effort required to solve it, you should be working to solve a different problem.”

It may be a cloudy, dreary April day in Minnesota today, but for me the sun is shining.

Sneak Peek : Reporting

Tuesday, April 24th, 2007

This is an exciting time for Spider Strategies, over the next few weeks we’ll be giving sneak peeks into new functionality we’re developing. In this feature we’ll take a brief look at reporting, what it currently is, and how we’re going to improve it.

One of the reasons why all software is built is because there exists a need to have a problem solved that is either too time consuming or complex to have people solve them manually. However, building software to run these long and complex processes are only half of what makes an application useful, the other half is reporting the data to users in a format they can understand and find useful. Our Corporate Management Suite application has always excelled in its ability to solve the problem of grading and tracking performance, however its reporting capabilities has needed some improvement in order to make it easier for users to get the information they need from the application.

One of the key enhancements we’re implementing for reporting is the ability for users to generate customized reports. The biggest benefit of this enhancement lies in the flexibility users will have in defining these reports. Previous reporting capabilities forced users to defined search terms against a limited set of filters and also limited what type of data should be shown in the results of the report.

This screenshot above shows one of the reports currently available in CMS. It is an owner/updater report, and it highlights the rigidness of our current reporting capabilities. The user is restricted in what they can search for as well as in specifying what should be contained in the results. While this created some specific reports that were useful, it was too limited to provide all the type of reports that we saw organizations both needed and wanted. Our new custom reporting aims to solve this inflexibility by allowing user to add any number of filters as they see fit. It also allows them to choose what part of the data they would like to see returned in the report. The screenshot below shows off some of our new custom reporting interface, note the ability to add filters and choose what should be shown in the results

In addition to generating these reports, users will have to ability to bookmark their report to their dashboard for convenience, as well as print and export their results to Microsoft Word and Excel documents. As a side benefit to the implementation of our new custom reports, we’ll be also including many more pre-define standard reports that users can choose from. We hope by being able to offer users the power and flexibility to define their own reports they will find it much easier to find the data they are looking for.

Windows Media Player for Firefox

Wednesday, April 18th, 2007

Are you sick of visiting sites like CNN.com with your Firefox browser and not being able to view video clips because they require Windows Media Player? Microsoft has just released a media player plug-in that should solve this problem.

Brownies

Tuesday, April 17th, 2007

Last night I went to the convenience store and they were selling brownies by the cash register. They were advertised as 75% organic, which made me wonder: what’s the other 25%? Pesticides?

Networking with Virtual PC 2007

Sunday, April 15th, 2007

I wrote a post last month about how impressed I was with Virtual PC 2007 and how it has changed the way I work. This is a follow-up about a networking problem that I didn’t discover until it was almost too late, as well as how to fix it.

I decided to install Vista Business on my laptop a few months ago, and aside from a few application compatibility issues, I’ve been pretty happy with it so far. One of the main problems is that Oracle 9i doesn’t work with Vista, and that’s a database we need to develop against. So, I fired up my Windows XP virtual machine, installed Oracle, and then connected to Oracle on the virtual machine just like I would if it were installed on another server. Everything was working smoothly… or so I thought.

A little background: The default networking option for your virtual PC is “Shared Networking.” This allows the virtual PC to share your host PC’s internet connection, but doesn’t allow the host PC to talk to the virtual PC. So, instead of using shared networking, I set the virtual machine to directly use my wireless network. Both the host PC and the virtual PC got separate IP addresses from the router, and could therefore talk to each other. The only thing I didn’t think about was that the second my laptop lost its connection to my router, I couldn’t communicate with the virtual PC.

So, there I was, minutes before a demo with an important client, and my application server couldn’t talk to my database, even though they were both on the same laptop.

The solution was relatively simple, but for some reason the information was really hard to find. First install Microsoft’s Loopback Adapter on the host PC, and then tell the virtual PC to use it for its network access. The process is explained very well here.

Version Labeling and Continuous Frustration

Wednesday, April 11th, 2007

I approach continuous integration (CI) servers in the same way I do my IDE — as a tool of convenience for performing tasks I could choose to perform manually. I would no more have a build system reliant upon a specific CI server than I would write code that was only recognized by a specific IDE. Thankfully the CI servers with which I’ve worked conform to my philosophy. They do not seek to replace your build system as much as provide much needed automation. There is one area, though, where I feel CI servers violate this ideal, and that’s creating a unique build/version label.

Out-of-the-box, most CI servers provide a simple numbering scheme in order to produce a unique label for each build. Generating a build/version label is a task I prefer to happen within the build itself, so that the build is truly self-contained. Take our builds, for example. I’ve made use of the ant task buildnumber, so, upon a build, ant reads and increments a build-number property file and appends it to the project’s “base version,” the result being a label like “1.9.0.6″, where “6″ would be the build number. I imagine this is a common scenerio — indeed its why the <buildnumber> ant task exists. Once I launch an official build via command-line, label generation happens automatically, and the repository is tagged “Build 1.9.0.6″.

Introduce the CI server, though, and suddenly I’m having to jump through hoops to accommodate this setup. At the crux of the problem is this: from the CI server’s perspective, a build starts upon checkout or update of a project, and therefore wants to know the build label prior to actually running the build. That’s putting the cart before the horse, in my opinion, although I do understand the reasoning. Should access to the repository fail, for example, the CI server is able to report “1.9.0.6 Build failed due to VCS unavailability”.

What I’ve done is create a small script whose sole duty is to fetch the next build label for the CI server — fortunately the CI servers with which I’ve worked allow for pre-build script execution in some manner or another. With CruiseControl, I use an “antbootstrapper” to invoke a small ant build named “get-next-version.xml”. CruiseControl passes the value generated from that to the official build, so ant is invoked like so: “ant package -Dbuild.label=1.9.0.6″.

However, my work isn’t done. I still must ensure that my build-number property file is accurate, even if the build.label is being provided instead of being generated. So, in addition to configuring CruiseControl in the manner described, I also must have my build.xml extract the build number from the passed label (in this case, “6″), and update the build-number file appropriately.

Granted, I imagine most folks don’t rely on ant to generate build numbers, and therefore the CI server provided functionality is a convenient mechanism. The minority of us who do, though, ought to be able to supply build labels to the server in an easier fashion.