Improving developers

Scott Hanselman posts a number of great tips for  improving development teams.  The technical brown bag idea is one we’ve been following at work since the spring.  We call them “learning lunches”, and they’ve proven to be an excellent vehicle for knowledge transfer, as well as connecting different offices of the company.

At my current employer and the previous one, I’ve tried to promote conferences, off-site training, and .NET user groups.  Getting the staff to attend them has been more of a challenge here than at my last job.  They’re all excellent ways of keeping technical skills sharp as well as networking opportunities.

Now that we have a new CIO at work, it will be interesting to see to what degree he’d buy in to some of these ideas.

To rewrite, or not to rewrite?

This question comes up rather often in my job, and this post by Adam Turoff answers the question by including “when” as a variable.  In short, the sooner a project needs to succeed, the less likely it is that a rewrite will succeed.

Whenever I come across an application that isn’t designed or implemented as well as it should be, I’m biased in favor of rewriting the application.  That approach tends to meet resistance because the “when” is usually very short.  Refactoring is a good fallback option, but only if the application is relatively current.  My desire to refactor single-tier classic ASP is nil.

Leading by example

I found this post on technical leadership particularly useful because it’s my role at work. Humility, discretion, tact, and willingness to “walk the walk” are necessary to succeed as a leader. The only thing I would add to the author’s list is the importance of patience in leading development staff. You can follow all the advice and still not see changes for awhile. I’ve been in that situation before, and always found it frustrating.

The comments on the post were enlightening as well, particularly this one by Greg Askew:

“Individuals are responsible for fixing themselves. Leading by example is a noble concept, but at the end of the day everyone is accountable for their own performance.”

The quote is a great reminder that as managers, we can only influence–not control–employees. Askew makes two other strong arguments about hiring and motivation. His latter point is echoed by Steven McConnell’s summary of classic mistakes and by Jim Collins in Good to Great. Undermining people’s motivation (and/or hiring people who aren’t self-motivated) can be counted on to yield a substandard result in the end.

The full article that inspired Jeff Atwood’s post is an excellent read as well.

No parameterless constructor defined for this object.

This error message started showing up during testing of some code changes I made to an application.  It took me awhile to figure out precisely what the problem was because the top of the stack trace referred to this:

System.Activator.CreateInstance[T]()

As looked further down the stack trace, it ultimately pointed out which class was the culprit, so I added an empty public constructor to and redeployed the result.

I found this post rather useful in diagnosing the problem.

Die patent troll, die!

Thanks to Judge Dale Kimball, we may finally be rid of SCO.  Since he ruled that they never owned UNIX patents, they owe Novell 95% of the money they got from Microsoft and Sun for the license rights they sold.  It’s doubtful they have the money, so they’ll probably have to declare bankruptcy.  It couldn’t happen to a more deserving company.

Refactoring

An excellent post by Julian Bucknall of Developer Express on refactoring–more specifically the eight refactorings he uses most.  Of the ones he names, I use the 8th one (use string.format) the most.  As you might expect with inherited code, there are plenty of places where strings are concatenated with plus signs.  I root them out of every piece of code I rewrite, and highlight them in code reviews.

SQL Server Table Properties

I needed a T-SQL statement to get the created date of a couple of tables as part of a project. One of my colleagues came up with this query:

SELECT create_date FROM sys.objects WHERE type = ‘U’ AND name = ‘<tablename>’

It works in SQL Server 2005.

The SQL Server 2000 equivalent is:

SELECT crdate FROM sysobjects WHERE xtype = ‘U’ and name = ‘<tablename>’

Jeremy D. Miller on Software Teams

His top three preferences in brief:

  • internalized discipline over externally-enforced discipline
  • coaching over enforcement
  • collaboration over direction

It’s easy to agree with these preferences, but whether or not they can be put into practice depends very heavily on the members of the team. Unless you’re in a startup environment, you inherit people and culture as well as code.  While he makes a brief nod to hiring in the first section of his post, having the right people in the right places makes for much better results.

Miller does the best job of explaining his third preference.  Providing the rationale and context for a course of action gives a developer input and an opportunity to buy into an idea.  The success of this approach still depends on the having the right people.  I follow it with my own employees as much as possible.

Implementing IDisposable

One of the FxCop rule violations I found in one of my projects had to do with IDisposable not being implemented.  My search for examples of how to resolve this yielded a lot of helpful links, including these: