Newsletters - Winter 2008

The search is on... 

Where Have All the Programmers Gone?
by John Stout

If you are anywhere near a technology business, you’ve heard this over and over: there just don’t seem to be enough computer professionals to fill the open jobs. Since much of Stout Systems’ business depends on networking with and attracting technical talent for our clients and projects, we are faced with this issue daily.

Are there really fewer programmers? Well, yes and no:

1) Yes, the number of people in the profession has declined. This is largely due to a reduced number of college students choosing computer related majors. It’s a national problem created partly by the false idea that "the software jobs were going overseas." (I was heartened recently when the chair of a college computer science department told me enrollment at his school is up for 2007-08.) The problem is inflamed in our geographic area—Detroit in particular and the Midwest in general. Unemployment numbers have given the impression that all jobs are scarce; so some professionals have relocated to other cities that seem to have more promising career prospects. The reality in Michigan is that computer professionals are in short supply.

2) No, many programmers are still out there, but not as visible. One interesting trend I have observed: when the economy is perceived to be "bad," industry professionals tend to hunker down in their current jobs. They do not circulate their resumes, which creates an impression that there are "fewer programmers." I suspect many people are happy to at least have a job in a tough economy and are unwilling to give up what security they feel they have.

Despite this, you can find and attract the talent you need to get your projects done and grow your business.

To find the talent, you have to put more work into it. Placing a job description on monster.com and expecting hordes of qualified, unemployed candidates to apply is unrealistic. It’s a buyer’s market and the qualified candidates are mostly either employed or have multiple employment options.

Here are my suggestions to you, based on years of successful recruiting:

1) Better connect with and support the technology community. Get more visible to the people you want to attract. No one will have stronger credibility with other "techies" than your own programmers, so have your people attend user group and technical society meetings. One company I know rewards their "spokespeople" with Starbucks cards for attending such meetings.

2) Sponsorship also goes a long way to creating industry credibility. Stout Systems sponsors user groups. We also sponsor industry conferences which give great exposure and the opportunity to personally meet hundreds of technical people.

3) Improve your job ads. Write the ad as if you were trying to market the job. Describe the exciting aspects of the projects and technologies and how progressive your company is technologically. Emphasize the quality of the work environment and location. Talk about the great benefits. The technology and location points are key according to our surveys.

4) Do everything possible to make your work environment and compensation as attractive as possible. This draws new employees and motivates your current employees to stay and to recruit for you. Suggestions:

• Offer compensation packages that include benefits software developers consider desirable. Matching the compensation in salary surveys isn’t always enough. Understand that top talent will often command more than a salary survey suggests.

• Offer bonuses to your employees if they successfully refer programmers to you who are hired.

• Institute employee training/certification programs on new technologies. This can be done as in-house training or by offering financial support for after-hours training..

• Where applicable, migrate to new technologies and update your methodologies. Software developers do not like to work on outdated technologies or to use practices that impede quality.

5) Hire senior personnel with outdated skills and retrain them. They know about the software development life cycle and can produce quality code. Many of them would accept a reasonable salary if they knew they could be retrained and advanced.

John W. Stout is the founder and president of Stout Systems Development. He has nearly thirty years' experience in the software industry. He is also sought after as a technology speaker, presenting sessions at developer conferences and user groups. Email .


Monkey Wrenches for Developers
by Jim Holmes

We software developers are a quirky lot. Our craft is an odd mix of engineering skills, creativity, improvisation, and the ability to create solutions for difficult problems often while in stressful situations. As with many other disciplines in life, using the right tool for the right job can greatly improve the quality of that solution. (My father, after decades of watching me drive nails with shoes, rocks, or whatever else was at hand, will happily tell you this viewpoint came to me extremely late in life.)

Tools for developers span a broad spectrum. You can reach out to freeware, open source, or commercial tools for help. Need a framework to help you with your testing? Look to open source tools like Rhino.Mocks, JUnit, or Watir. Stumped with creating diff files for XML? Look to XmlDiffPatch. Pining for the days when you were writing bash scripts utilizing sed, awk and grep on Linux? Grab the latest distribution of Cygwin and rediscover the goodness of those tools but on the Windows platform.

The great benefits of free or open source tools for developers on the Windows platform was one reason I co-authored "Windows Developer Power Tools" with my friend James Avery. I’ve always looked to use tools to boost my development productivity and code quality, and I’ve been a long-time proponent (addict?) of rounding up any number of frameworks, utilities, or widgets to help me get my tasks done.

Using Mock Objects for Testing

Good testing is a critical piece of any development effort. Regardless of whether or not you’re a proponent of Test Driven Development (TDD) or its variants, the importance of solid acceptance and unit tests is vital to the health and flexibility of any system you’re working on.

By now many developers have become familiar with the xUnit family of unit test frameworks (JUnit, NUnit, CSUnit, etc.). These frameworks enable developers to write tests around individual methods, classes, or components ensuring their correct functionality.

Unfortunately, often these unit tests exercise parts of a system which rely on other components. Think of a payroll system which computes wages for an employee. The payroll system might look up information on employees such as their hourly rates and whether or not they’re salaried employees. The employee information might be encapsulated in a business object which is persisted in a database.

You want to write a test around the payroll method, but you need the database tier to get you an employee object to work with. What happens if the database tier is not yet finished? Alternatively, how can you develop against the system if you’re using a laptop and are working offsite at an airport or writing a bit of code while at your local coffee shop or watering hole?

Mock object frameworks help you solve this problem by giving you a framework to simulate the behavior of such components. Using the example above, you could mock out the database layer and use the mocked database to provide your payroll system its employee object.

There are a number of different implementations of open source or free mocking frameworks available for nearly every platform and language. Java has JMock; .NET has Rhino.Mock, NMock, and TypeMock; Ruby has FlexMock. All provide the same general approach to mocking objects: Create a mocked object, define its behavior, execute the test, and finally verify that the defined behavior was met.

A pseudo-code implementation for testing the payroll system might look something like this:

Create a real employee object, set its EmployeeID to 1, set its rate to 55

Create a mock database access object

Define expected behavior for the mock data access object

When GetEmployeeById is called with ID of 1, return the real employee object we created above

Create a payroll system object, passing in the mock data access object

Call Payroll.ComputeObject with the EmployeeID of 1 and hours worked of 20

Check that the returned value is equal to rate (55) times hours (20)

Verify that the mock data access object had its GetEmployeeById method called

Using the mock framework here enables us to create our payroll system while avoiding reliance on the database access layer or the database behind it. We’re also doing something a bit more subtle in that we’re testing the behavior of the payroll system. This behavioral, or interaction, testing is important in that its verifying you’re properly dealing with execution of the system under test, not just simple return values.

Mocks are a powerful tool you can use to help increase the quality of code you write. For more information on mocks check out Martin Fowler’s article "Mocks Aren’t Stubs". You should also read the mock objects blog at www.MockObjects.com.

Tweaking your Environment

Stock environments such as Java or .NET always have gaps in their feature set. You may also find that you’re unable to take advantage of the feature set of the latest release of an environment due to restrictions in your target environment. In these situations you can often find help by turning to third party libraries, frameworks, or utilities.

For example, a project I’m currently working on is a Windows form application combining a technical content viewer with a schematics viewer and parts database browser. These three viewers have several other subpanels which enable features common between the viewers like search, history, favorites, etc. These multiple windows and panels are a perfect target for the DockPanel family of features found in the .NET 3.0 Framework. The only problem is that my client is restricted to the 2.0 Framework which doesn’t have that particular feature set.

I could have turned to a commercial toolkit like Telerik’s set of WinForms controls; however, the open source DockPanel Suite gives me similar features in a free, redistributable package.

Your Integrated Development Environment (IDE) is another great target for using tools to enhance their behavior and fill gaps in features. Those of us who have worked in any variant of Emacs or IntelliJ know the tremendous wealth of tools, plugins, and add-ins available to tweak those environments. My work these days is wrapped up in Visual Studio, but I’ve not slacked off in my quest for tools to help me get my work done.

One of my favorites add-ins is Gaston Milano’s CoolCommands which adds a group of highly useful commands to context menus in the solutions explorer and coding windows. Now I can right-click on my code editor and quickly toggle to a demo font, or right-click on a project in the solutions explorer and open an Explorer window to the folder on the file system.

Another great tool is Roland Weigelt’s GhostDoc which automatically generates XML comments for methods. I simply put the cursor on a method, press Ctrl-Shift-D, and Weigelt’s tool will create comments by looking at comments from base classes, interfaces, and even the name of the method and its parameters.

Summary

The tools I’ve briefly covered in this article range from small utilities to substantial testing frameworks. All fill various needs or gaps for developers, and all help you focus on solving tough problems instead of wasting time writing infrastructure code or fiddling with your environment.

If you’re interested in finding more tools to help ease your development tasks, then I encourage you to pick up a copy of my book "Windows Developer Power Tools." The book is chock-full of articles discussing over 170 free or open source frameworks, utilities, libraries, and systems to help developers working on the Windows platform – and not just .NET developers!

Jim Holmes has a checkered career running the gamut from repairing radar systems in flight on E-3 AWACs aircraft to selling wine in Anchorage, Alaska. Jim graduated Cum Laude from Chapman University despite frequent deployments with the military and dropping a number of classes in order to play more volleyball. He has gathered up a couple decades in odds and ends corners of the IT industry and is currently the head of the Information Worker Studio at Quick Solutions in Columbus, Ohio. Jim is the co-author of "Windows Developer Power Tools." He can be reached via his frazzleddad blog or you can email


Recent News

Computer business veteran Genevieve Skory has joined Stout Systems to work on new business development and industry relations.

Job Openings

Check out current permanent and contract openings and on our new mobile site StoutSystems.MOBI.


 


Current Job Opportunities

View Our Candidates

Subscribe to Our Newsletter

Stout Systems, P.O. Box 2934, Ann Arbor, MI 48106 · Voice 734-663-0877 · Fax 734-663-7659 ·
Copyright © 1995-2008 Stout Systems Development Inc. All Rights Reserved. Trademark & Legal Notice. Site Map Design by Fast Forward