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 |