The Fundamentals
First, you need to make sure your programmers have the essential skills, the
fundamentals. Some do; some don't. (Just because they survived an undergrad
program in computer science doesn't meant they do.)
Now this is going to sound obvious, but at the very least, every software
developer must be a master of writing good lines of code. You've seen those who
aren't, the programmers who sit there for hours, staring at 10 lines of code,
trying to figure out what's wrong and can't. This kind of thing can happen to
all of us programmers occasionally. But the problem is the programmer who does
that on a regular basis.
I've worked with these programmers and you've probably had some working for you. They would come to me all the time, interrupting my work, and drag me to their cube to debug their code.
And this is going to sound rough, but the reality is some people just aren't
cut out for programming. I'm talking about a very small percentage of people
here, fortunately. But they're out there. If you have such a programmer on your
staff, it might be time for a meeting with HR and a talk about other
opportunities, perhaps in sales, customer support, testing (QA) or some other
area of the company. He or she may excel in these areas. But you probably don't
want him or her dragging the whole team down.
Fortunately, that's just a small percentage. Let's talk about the huge
population that are in the middle, those who are good but not amazing. These
are the ones you can help.
In fact, many of them are future experts but are, right now, just younger
and less experienced. Such people don't always know about all the issues that
can arise in software development. This isn't a problem with their ability;
it's really just a problem of inexperience, something they'll overcome with
time.
Probably the single biggest issue that younger programmers overlook is the hidden
complexity in today's software systems. This is true especially for today's
Web-based systems that can serve multiple Web users simultaneously.
In the old days, we would run what was called "stress testing" on
our desktop applications. This involved running a program that would put our
computer into a low-memory, low-disk-space state, allowing us to see whether
our software could function. But with today's multiuser Web sites, the biggest
problems aren't so much stress on memory and disk space, since typically the
software will be running on large servers with a team of IT people making sure
there's plenty of both. Instead, today the problems come more from multiple
users trying to do the same thing simultaneously. And that's where the less
experienced programmers might fall short in their coding.
Here's an example: Suppose your team is developing an ASP.NET
application that will be storing data in an XML file. Ask your team what it takes to write data to the file.
If they're inexperienced, they might express the answer very simply, as in:
??Ç
You open the file.
??Ç
You write to it.
??Ç
You close the file.
Or, you ask them how to read a file:
??Ç
You open the file.
??Ç
You read the data you need.
??Ç
You close the file.
Seems simple and straightforward enough. But it's not. There are actually
far more complex issues that can come up, issues that experienced programmers
are well aware of but less experienced programmers might overlook, causing
major problems when the software is running in a production environment. For
example, what if two people are visiting the site simultaneously? Both are
entering data into a Web form that needs to be saved. Your server is handling
both people at the same time. Remember, the servers can run multiple
"threads" at once (that is, the program is running the same parts of
the code simultaneously). A separate thread is used to handle each user.
And that's where things get messy. The programmers might have written the
code to open the file, read the whole thing into memory and close the file.
Then the program would add on the user's new data to the data in memory, and
write the whole thing back to the file, effectively replacing the entire file.
This is common practice and it works well.
The problem is that if there are two users accessing the system, both
threads might open the file, read the data in and close it at roughly the same
time. Then simultaneously each thread might modify its own private version of
the data. The first thread will write the data to the file and close it. Then
the second thread will do the same, perhaps a tiny moment later, overwriting
the first thread's version, losing the first user's data.
Or, one thread might open the file for writing, and then the second thread
might try to do the same but not be able to (because the operating system
locked the file when the first thread opened it), and this thread might not handle
the situation appropriately and could crash the whole site, causing error
messages to show up in the browsers of all the people visiting the site.
I've worked with these programmers and you've probably had some working for you. They would come to me all the time, interrupting my work, and drag me to their cube to debug their code.









