Career

The Big Swinging Developer Test – Part 3

See Part 1 and Part 2 to catch up, but the short version is that this test is similar to The Joel Test: 12 Steps to Better Code except for developers rather than companies.

The Joel Test:
3. Do you make daily builds?

The Big Swinging Developer Test:
3. Can you recommend at least 2 pieces of software for your team to create an automated daily build?

As mentioned in the previous post, the less code you write for your infrastructure, the more valuable you are.  Any time you can use off the shelf or open source software, it means that you have more time to focus on your specialty.  Automated build software is a great example of this because it’s one of those problems where the first 80% or so is really easy: It’s a scheduler, some configuration, and a way to notify you about how things went.  The last 20% – things like variables, macros, conditionals, monitoring, and the million other things that we’ve come to expect – can eat up an incredible amount of time an effort.

The good news is that there are a lot of great build systems out there.  The challenge is in knowing which to choose and then implementing it quickly and correctly.  This is where experience really starts to pay off.  If you’ve had to implement one of these systems in the past, you’re ahead of the game.  Even if you’ve used one that you really like, you’re in pretty good shape.

The better news is that getting experience with a build system is really easy: automate your current project.  Try a couple of different systems for bonus points.  Not only will this put you in the valuable position of being able to improve everyone’s productivity, it’ll also teach you a lot about your project’s structure (or lack thereof).  The types of problems that you encounter when automating a build will cause you to think differently about all of your future projects.  As you’ve probably figured out by now, thinking differently is one of the cornerstone’s of being a Big Swinging Developer.

The Big Swinging Developer Test – Part 2

In the previous post I started talking about The Joel Test: 12 Steps to Better Code, which gives you a quick measure of software development organizations.  The Big Swinging Developer Test is similar, but instead of sizing up organizations, it’s used to get a quick read on a developer.  Now, on to step 2.

The Joel Test:
2. Can you make a build in one step?

The Big Swinging Developer Test:
2. Can you create a one step build from scratch?

At first glance, this seems to be one of the easiest development tasks ever.  Build in one step?  Sure, just click the green triangle in Visual Studio (or the equivalent step in Eclipse, Sun Studio, etc.)  That’s not one step since you’d have to open the project in one of those tools to begin with.  In addition, what about getting the latest code from version control?  Not to mention the likelihood that the program you’re working on will be spread across multiple projects.

Like all things Big Swinging Developer, creating a one step build is less about technology and more about process.  This one in particular requires a large dose of empathy because "it builds on my box" just doesn’t cut it when you’re working in a team, especially if you’re getting a monster bill rate to do so.  There are three audiences for a one step build and if you can meet the needs of all three then your life will be easier on just about any project you join.

Audience 1: The New Guy
Have you ever joined a project and spent the first couple of days just trying to get your development system set up?  One of the most frustrating parts of the on-boarding process for any developer is getting to the point where you can start debugging, writing, and testing code.  A successful one step build for The New Guy is a single command from a logical place (like the root folder of version control) that requires either zero parameters, or gives him the list of parameters when none are passed in.  There should be no need to train him to build other than, "Run this command from this directory.  Catch you later."

Audience 2: The Team
The second audience is the rest of your team, or the teams that you work with in the case of a large project.  Since team members have different needs, this is where options, parameters, and structure come into play.  Maybe team members don’t want to build the whole system, so you break the build into sub-builds that can be run independently which are then all aggregated into the top-level master build.  Maybe the team wants to run some tests, but not others.  I was on a project once where there were more than 250 .NET assemblies built as part of the system.  Compile time was about 7 minutes.  Test time was nearly 3 hours.  Even though I was paid hourly, I didn’t need to run all the tests all the time.

Audience 3: The Build/Release Team
The final audience may or may not exist on your project.  Sometimes you have dedicated release managers and sometimes you just have someone appointed to produce release builds.  Either way, this audience has their own special needs.  In particular, the ability to do things like build in Release/Optimized mode, the ability to synchronize version numbers across files, the ability to deploy to new directories, and more.  A one step build that compiles, tests, packages, deploys to a timestamped directory, and emails everyone who cares is a thing of beauty.

NOTE: The less code you write, the more valuable it is.
You may be thinking, "No, problem.  Some Perl here, some DOS batch files there, throw in that hand rolled FTP client I wrote awhile back and I can build everything listed."  Not so fast.  A good build system is built on technologies that folks can understand, use quickly, and Google for help.  Think Ant, NAnt, MSBuild, CruiseControl, WiX, even Make.  Remember: Build something that people can use and improve even when you’re not around and you’re on your way to becoming a Big Swinging Developer.

The Big Swinging Developer Test – Part 1

Back in Y2K, Joel Spolsky posted The Joel Test: 12 Steps to Better Code.  After reading it for the millionth time, I still think it’s a great list that can be used to quickly judge a software organization.  Even better, the list can be used for gap analysis in looking for ways to improve.

I wanted a similar list for individual developers and the closest I found was Read Write Web’s Top 10 Traits of a Rockstar Software Engineer.  Their list is great for identifying rock star programmers, but it doesn’t really lend itself to coaching good programmers into being great developers.  To fill the gap, I decided to look for ways in which a developer can help an organization improve their Joel Test score and get more value out of what they’re doing.

The Joel Test:
1. Do you use source control?

The Big Swinging Developer Test:

1. Can you teach developers to branch,  merge, and reproduce releases in your source control system?

There’s "using source control" and then there’s "using source control effectively".  Plenty of teams use source control as a way to backup their source code.  The thought is "if it’s in source control, it’s safe".  That’s all fine and good, but it’s really only the tip of the iceberg.  The real advantages of source control are parallel development and release sets.

Parallel development is the ability for each developer to work on any part of the system without preventing other developers from working on the same part.  If you’re using branching in your source control system effectively then all of the developers on your team should be able to work full speed all of the time.  As they develop features or fix bugs they should be able to build and test based on their version of the code base.  Once they’re happy with their changes, these changes should be safely merged back in to the public code base.  If you’re a Big Swinging Developer, you should be able to go to the whiteboard and draw a branching strategy that supports parallel development.  You should also be able to teach those with limited source control knowledge how (and why) to branch and merge.  Given a source control system that you’ve never seen before, it should be less than a day’s work to learn how to perform these functions since the theory is the same regardless of the technology used.

Release sets are the ability to reproduce the code base at any important point in time.  An important point may be a release to the testing team, a beta release, a version that shipped, or any other milestone.  Release sets are usually handled by labeling or tagging within a source control system.  Once again, regardless of how the technology handles the function, you should know how to reproduce the code base for a given release.  For bonus points, you’ll champion ways in which to interrogate a system in order to determine its version.  Things like assembly versioning,  file versioning, versioning in config files, or a database table that knows the version of its schema are critical when someone reports a problem and you need to determine what version of the code to recreate.  Of course knowing the version of the system that’s having the problem isn’t particularly valuable if you don’t know what code went into that build which is why having your release sets in place first is so important.

Knowledge of version control theory and branching strategies is important, yet often overlooked.  I worked at a place that wrote .NET code and the developers used Windows, Visual Studio, and their version control system all day every day.  Everyone knew Windows pretty well.  Everyone knew Visual Studio very well.  Almost no one knew how to use the version control system well and their development speed suffered from it.  If you learn the theory, you can learn the tools and you’ll be one step closer to being a Big Swinging Developer.

Say Less and Mean More

If you work with a group of people, chances are there’s a peer whose words seem to carry extra weight due in large part to their scarcity.  There’s an air of, "If Bob’s talking, it must be important" or "When Bob speaks, it’s worth listening".  People value Bob’s words.

There are probably several people whose words seem to carry less weight due in large part to their abundance.  "There goes Sam rattling on again" or "When Sam stops talking we can get back to the real discussion".  People discount Sam’s words.

The Sams of the world seem to always be talking to anyone who will listen.  Even to those who won’t.  It’s not that they never say anything valuable, it’s just that so much of what they say is noise that their peers build up a filter that defaults to "ignore".  The Bobs of the world, however, seem to speak only when they have something to contribute: data, analysis, examples, solutions, etc.  If something Bob was going to say gets said by someone else, Bob checks it off his list and remains quiet.

In more concrete terms, think of it like this:  If you say 20 things in a meeting and 5 are meaningful and 15 are noise, then only 25% of what you say is meaningful.  If you cut out half of what you say (all noise) and only say 10 things, where 5 are meaningful and 5 are noise, you’ve now doubled your ratio and 50% of what you say is meaningful.  Guys like Bob may only say 5 or 6 things, but the value is between 80% and 100%.  With those kinds of odds, it pays to listen to Bob.